CuePoint Class Reference

Collaboration diagram for CuePoint:

Collaboration graph
[legend]

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

CuePointleft () const
CuePointright () const

Static Private Member Functions

static void rotate (unsigned direction, CuePoint *&root)

Private Attributes

CuePointfSubTree [2]
char fBalance
double fCueTime
u_int64_t fClusterOffsetInFile
unsigned fBlockNumWithinCluster

Detailed Description

Definition at line 27 of file MatroskaFile.cpp.


Constructor & Destructor Documentation

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]

Definition at line 361 of file MatroskaFile.cpp.

References fSubTree.

00361                     {
00362   delete fSubTree[0]; delete fSubTree[1];
00363 }


Member Function Documentation

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]

Definition at line 44 of file MatroskaFile.cpp.

References fSubTree.

Referenced by fprintf(), and lookup().

00044 { return fSubTree[0]; }

CuePoint* CuePoint::right (  )  const [inline, private]

Definition at line 45 of file MatroskaFile.cpp.

References fSubTree.

Referenced by fprintf(), and lookup().

00045 { return fSubTree[1]; }

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 }


Field Documentation

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]

Definition at line 46 of file MatroskaFile.cpp.

Referenced by addCuePoint(), and fprintf().

double CuePoint::fCueTime [private]

Definition at line 50 of file MatroskaFile.cpp.

Referenced by addCuePoint(), fprintf(), and lookup().

u_int64_t CuePoint::fClusterOffsetInFile [private]

Definition at line 51 of file MatroskaFile.cpp.

Referenced by addCuePoint(), and lookup().

unsigned CuePoint::fBlockNumWithinCluster [private]

Definition at line 52 of file MatroskaFile.cpp.

Referenced by addCuePoint(), and lookup().


The documentation for this class was generated from the following file:
Generated on Tue Jun 18 13:20:10 2013 for live by  doxygen 1.5.2