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