
Public Member Functions | |
| CuePoint (double cueTime, u_int64_t clusterOffsetInFile, unsigned blockNumWithinCluster) | |
| virtual | ~CuePoint () |
| Boolean | lookup (double &cueTime, u_int64_t &resultClusterOffsetInFile, unsigned &resultBlockNumWithinCluster) |
Static Public Member Functions | |
| static void | addCuePoint (CuePoint *&root, double cueTime, u_int64_t clusterOffsetInFile, unsigned blockNumWithinCluster, Boolean &needToReviseBalanceOfParent) |
| static void | fprintf (FILE *fid, CuePoint *cuePoint) |
Private Member Functions | |
| CuePoint * | left () const |
| CuePoint * | right () const |
Static Private Member Functions | |
| static void | rotate (unsigned direction, CuePoint *&root) |
Private Attributes | |
| CuePoint * | fSubTree [2] |
| char | fBalance |
| double | fCueTime |
| u_int64_t | fClusterOffsetInFile |
| unsigned | fBlockNumWithinCluster |
Definition at line 27 of file MatroskaFile.cpp.
| CuePoint::CuePoint | ( | double | cueTime, | |
| u_int64_t | clusterOffsetInFile, | |||
| unsigned | blockNumWithinCluster | |||
| ) |
Definition at line 355 of file MatroskaFile.cpp.
References fSubTree, and NULL.
Referenced by addCuePoint().
00356 : fBalance(0), 00357 fCueTime(cueTime), fClusterOffsetInFile(clusterOffsetInFile), fBlockNumWithinCluster(blockNumWithinCluster - 1) { 00358 fSubTree[0] = fSubTree[1] = NULL; 00359 }
| CuePoint::~CuePoint | ( | ) | [virtual] |
| void CuePoint::addCuePoint | ( | CuePoint *& | root, | |
| double | cueTime, | |||
| u_int64_t | clusterOffsetInFile, | |||
| unsigned | blockNumWithinCluster, | |||
| Boolean & | needToReviseBalanceOfParent | |||
| ) | [static] |
Definition at line 369 of file MatroskaFile.cpp.
References CuePoint(), False, fBalance, fBlockNumWithinCluster, fClusterOffsetInFile, fCueTime, fSubTree, NULL, rotate(), and True.
Referenced by MatroskaFile::addCuePoint().
00370 { 00371 needToReviseBalanceOfParent = False; // by default; may get changed below 00372 00373 if (root == NULL) { 00374 root = new CuePoint(cueTime, clusterOffsetInFile, blockNumWithinCluster); 00375 needToReviseBalanceOfParent = True; 00376 } else if (cueTime == root->fCueTime) { 00377 // Replace existing data: 00378 root->fClusterOffsetInFile = clusterOffsetInFile; 00379 root->fBlockNumWithinCluster = blockNumWithinCluster - 1; 00380 } else { 00381 // Add to our left or right subtree: 00382 int direction = cueTime > root->fCueTime; // 0 (left) or 1 (right) 00383 Boolean needToReviseOurBalance = False; 00384 addCuePoint(root->fSubTree[direction], cueTime, clusterOffsetInFile, blockNumWithinCluster, needToReviseOurBalance); 00385 00386 if (needToReviseOurBalance) { 00387 // We need to change our 'balance' number, perhaps while also performing a rotation to bring ourself back into balance: 00388 if (root->fBalance == 0) { 00389 // We were balanced before, but now we're unbalanced (by 1) on the "direction" side: 00390 root->fBalance = -1 + 2*direction; // -1 for "direction" 0; 1 for "direction" 1 00391 needToReviseBalanceOfParent = True; 00392 } else if (root->fBalance == 1 - 2*direction) { // 1 for "direction" 0; -1 for "direction" 1 00393 // We were unbalanced (by 1) on the side opposite to where we added an entry, so now we're balanced: 00394 root->fBalance = 0; 00395 } else { 00396 // We were unbalanced (by 1) on the side where we added an entry, so now we're unbalanced by 2, and have to rebalance: 00397 if (root->fSubTree[direction]->fBalance == -1 + 2*direction) { // -1 for "direction" 0; 1 for "direction" 1 00398 // We're 'doubly-unbalanced' on this side, so perform a single rotation in the opposite direction: 00399 root->fBalance = root->fSubTree[direction]->fBalance = 0; 00400 rotate(1-direction, root); 00401 } else { 00402 // This is the Left-Right case (for "direction" 0) or the Right-Left case (for "direction" 1); perform two rotations: 00403 char newParentCurBalance = root->fSubTree[direction]->fSubTree[1-direction]->fBalance; 00404 if (newParentCurBalance == 1 - 2*direction) { // 1 for "direction" 0; -1 for "direction" 1 00405 root->fBalance = 0; 00406 root->fSubTree[direction]->fBalance = -1 + 2*direction; // -1 for "direction" 0; 1 for "direction" 1 00407 } else if (newParentCurBalance == 0) { 00408 root->fBalance = 0; 00409 root->fSubTree[direction]->fBalance = 0; 00410 } else { 00411 root->fBalance = 1 - 2*direction; // 1 for "direction" 0; -1 for "direction" 1 00412 root->fSubTree[direction]->fBalance = 0; 00413 } 00414 rotate(direction, root->fSubTree[direction]); 00415 00416 root->fSubTree[direction]->fBalance = 0; // the new root will be balanced 00417 rotate(1-direction, root); 00418 } 00419 } 00420 } 00421 } 00422 }
| Boolean CuePoint::lookup | ( | double & | cueTime, | |
| u_int64_t & | resultClusterOffsetInFile, | |||
| unsigned & | resultBlockNumWithinCluster | |||
| ) |
Definition at line 424 of file MatroskaFile.cpp.
References False, fBlockNumWithinCluster, fClusterOffsetInFile, fCueTime, left(), lookup(), NULL, right(), and True.
Referenced by lookup(), and MatroskaFile::lookupCuePoint().
00424 { 00425 if (cueTime < fCueTime) { 00426 if (left() == NULL) { 00427 resultClusterOffsetInFile = 0; 00428 resultBlockNumWithinCluster = 0; 00429 return False; 00430 } else { 00431 return left()->lookup(cueTime, resultClusterOffsetInFile, resultBlockNumWithinCluster); 00432 } 00433 } else { 00434 if (right() == NULL || !right()->lookup(cueTime, resultClusterOffsetInFile, resultBlockNumWithinCluster)) { 00435 // Use this record: 00436 cueTime = fCueTime; 00437 resultClusterOffsetInFile = fClusterOffsetInFile; 00438 resultBlockNumWithinCluster = fBlockNumWithinCluster; 00439 } 00440 return True; 00441 } 00442 }
| void CuePoint::fprintf | ( | FILE * | fid, | |
| CuePoint * | cuePoint | |||
| ) | [static] |
Definition at line 444 of file MatroskaFile.cpp.
References fBalance, fCueTime, left(), NULL, and right().
Referenced by MatroskaFile::printCuePoints().
00444 { 00445 if (cuePoint != NULL) { 00446 ::fprintf(fid, "["); 00447 fprintf(fid, cuePoint->left()); 00448 00449 ::fprintf(fid, ",%.1f{%d},", cuePoint->fCueTime, cuePoint->fBalance); 00450 00451 fprintf(fid, cuePoint->right()); 00452 ::fprintf(fid, "]"); 00453 } 00454 }
| CuePoint* CuePoint::left | ( | ) | const [inline, private] |
| CuePoint* CuePoint::right | ( | ) | const [inline, private] |
| void CuePoint::rotate | ( | unsigned | direction, | |
| CuePoint *& | root | |||
| ) | [static, private] |
Definition at line 456 of file MatroskaFile.cpp.
References fSubTree.
Referenced by addCuePoint().
00456 { 00457 CuePoint* pivot = root->fSubTree[1-direction]; // ASSERT: pivot != NULL 00458 root->fSubTree[1-direction] = pivot->fSubTree[direction]; 00459 pivot->fSubTree[direction] = root; 00460 root = pivot; 00461 }
CuePoint* CuePoint::fSubTree[2] [private] |
Definition at line 43 of file MatroskaFile.cpp.
Referenced by addCuePoint(), CuePoint(), left(), right(), rotate(), and ~CuePoint().
char CuePoint::fBalance [private] |
double CuePoint::fCueTime [private] |
Definition at line 50 of file MatroskaFile.cpp.
Referenced by addCuePoint(), fprintf(), and lookup().
u_int64_t CuePoint::fClusterOffsetInFile [private] |
unsigned CuePoint::fBlockNumWithinCluster [private] |
1.5.2