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 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]

Definition at line 356 of file MatroskaFile.cpp.

References fSubTree.

00356                     {
00357   delete fSubTree[0]; delete fSubTree[1];
00358 }


Member Function Documentation

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]

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 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 }


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 Thu May 17 07:15:10 2012 for live by  doxygen 1.5.2