OSDN Git Service

Track IDs are huge in particular mp4 clip causing crash
authorGarret Pick <pickgr@pv.com>
Mon, 31 Aug 2009 18:39:18 +0000 (11:39 -0700)
committerGarret Pick <pickgr@pv.com>
Mon, 31 Aug 2009 18:39:18 +0000 (11:39 -0700)
engines/2way/src/pv_2way_sdkinfo.h
engines/author/src/pv_author_sdkinfo.h
engines/player/src/pv_player_sdkinfo.h
fileformats/mp4/parser/include/mpeg4file.h
fileformats/mp4/parser/src/mpeg4file.cpp

index 55028ce..b415488 100644 (file)
@@ -21,7 +21,7 @@
 // This header file is automatically generated at build-time
 // *** OFFICIAL RELEASE INFO -- Will not auto update
 
-#define PV2WAY_ENGINE_SDKINFO_LABEL "911832"
+#define PV2WAY_ENGINE_SDKINFO_LABEL "911883"
 #define PV2WAY_ENGINE_SDKINFO_DATE 0x20090813
 
 #endif //PV_2WAY_SDKINFO_H_INCLUDED
index 06b7d5f..2d2f7ad 100644 (file)
@@ -21,7 +21,7 @@
 // This header file is automatically generated at build-time
 // *** OFFICIAL RELEASE INFO -- Will not auto update
 
-#define PVAUTHOR_ENGINE_SDKINFO_LABEL "911832"
+#define PVAUTHOR_ENGINE_SDKINFO_LABEL "911883"
 #define PVAUTHOR_ENGINE_SDKINFO_DATE 0x20090813
 
 #endif //PV_AUTHOR_SDKINFO_H_INCLUDED
index efd64cf..1025f0c 100644 (file)
@@ -21,7 +21,7 @@
 // This header file is automatically generated at build-time
 // *** OFFICIAL RELEASE INFO -- Will not auto update
 
-#define PVPLAYER_ENGINE_SDKINFO_LABEL "911832"
+#define PVPLAYER_ENGINE_SDKINFO_LABEL "911883"
 #define PVPLAYER_ENGINE_SDKINFO_DATE 0x20090813
 
 #endif //PV_PLAYER_SDKINFO_H_INCLUDED
index b9d65e3..36ff4e9 100644 (file)
 
 class AVCSampleEntry;
 
+struct TrackIndex
+{
+    uint32 _trackID;
+    uint32 _Index;
+};
+
+typedef Oscl_Vector<TrackIndex*, OsclMemAllocator> TrackIndexVecType;
+
 class Mpeg4File : public IMpeg4File, public Parentable
 {
 
@@ -1284,6 +1292,17 @@ class Mpeg4File : public IMpeg4File, public Parentable
 
         MP4_FF_FILE * _fp;
     private:
+        uint32 getIndexForTrackID(uint32 aTrackID)
+        {
+            for (uint32 i = 0; i < _moofFragmentIdx->size(); i++)
+            {
+                if ((*_moofFragmentIdx)[i]->_trackID == aTrackID)
+                {
+                    return i;
+                }
+            }
+            return 0;
+        }
         void ReserveMemoryForLangCodeVector(Oscl_Vector<uint16, OsclMemAllocator> &iLangCode, int32 capacity, int32 &leavecode);
         void ReserveMemoryForValuesVector(Oscl_Vector<OSCL_wHeapString<OsclMemAllocator>, OsclMemAllocator> &iValues, int32 capacity, int32 &leavecode);
         OSCL_wHeapString<OsclMemAllocator> _emptyString;
@@ -1314,6 +1333,7 @@ class Mpeg4File : public IMpeg4File, public Parentable
         MfraOffsetAtom *_pMfraOffsetAtom;
         uint32 _ptrMoofEnds;
         uint32 _parsing_mode;
+        TrackIndexVecType *_moofFragmentIdx;
         uint32 _movieFragmentIdx[256];
         uint32 _peekMovieFragmentIdx[256];
         TrackDurationContainer *_pTrackDurationContainer;
index 11a0e57..27f7d64 100644 (file)
@@ -79,6 +79,7 @@ Mpeg4File::Mpeg4File(MP4_FF_FILE *fp,
     _oVideoTrackPresent = false;
     parseMoofCompletely = true;
     isResetPlayBackCalled = false;
+    _moofFragmentIdx = NULL;
 
     parseMoofCompletely = true;
     moofParsingCompleted = true;
@@ -361,6 +362,10 @@ Mpeg4File::Mpeg4File(MP4_FF_FILE *fp,
                     break;
                 }
                 _isMovieFragmentsPresent = _pmovieAtom->IsMovieFragmentPresent();
+
+                PV_MP4_FF_NEW(fp->auditCB, TrackIndexVecType, (), _moofFragmentIdx);
+
+
                 populateTrackDurationVec();
                 _pTrackExtendsAtomVec = _pmovieAtom->getTrackExtendsAtomVec();
 
@@ -1616,6 +1621,18 @@ Mpeg4File::~Mpeg4File()
     // Delete the vectors themselves
     PV_MP4_FF_TEMPLATED_DELETE(NULL, trackAtomVecType, Oscl_Vector, _pTrackAtomVec);
 
+    if (_moofFragmentIdx != NULL)
+    {
+        for (i = 0; i < _moofFragmentIdx->size(); i++)
+        {
+            PV_MP4_FF_DELETE(NULL, MOOFIndex , (*_moofFragmentIdx)[i]);
+            (*_moofFragmentIdx)[i] = NULL;
+
+        }
+        PV_MP4_FF_TEMPLATED_DELETE(NULL, TrackIndexVecType, Oscl_Vector, _moofFragmentIdx);
+
+        _moofFragmentIdx = NULL;
+    }
 
     titleValues.destroy();
     iTitleLangCode.destroy();
@@ -2492,6 +2509,7 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
     {
         return -1;
     }
+    uint32 moofIdx = getIndexForTrackID(trackID);
 
     if (_pmovieAtom != NULL)
     {
@@ -2516,13 +2534,13 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                     return ret;
 
                 int32 return1 = 0;
-                while (_movieFragmentIdx[trackID] < _pMovieFragmentAtomVec->size())
+                while (_movieFragmentIdx[moofIdx] < _pMovieFragmentAtomVec->size())
                 {
-                    uint32 movieFragmentIdx = _movieFragmentIdx[trackID];
+                    uint32 movieFragmentIdx = _movieFragmentIdx[moofIdx];
                     MovieFragmentAtom *pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[movieFragmentIdx];
                     if (pMovieFragmentAtom != NULL)
                     {
-                        if ((uint32)pMovieFragmentAtom->getSequenceNumber() == _movieFragmentSeqIdx[trackID])
+                        if ((uint32)pMovieFragmentAtom->getSequenceNumber() == _movieFragmentSeqIdx[moofIdx])
                         {
                             TrackFragmentAtom *trackfragment = pMovieFragmentAtom->getTrackFragmentforID(trackID);
                             if (trackfragment != NULL)
@@ -2538,7 +2556,7 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                                     }
                                     else
                                     {
-                                        _movieFragmentSeqIdx[trackID]++;
+                                        _movieFragmentSeqIdx[moofIdx]++;
                                         if (samplesTobeRead >= *n)
                                         {
                                             samplesTobeRead = samplesTobeRead - *n;
@@ -2549,12 +2567,12 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                             }
                         }
                     }
-                    _movieFragmentIdx[trackID]++;
+                    _movieFragmentIdx[moofIdx]++;
                 }
                 if (return1 == END_OF_TRACK)
                 {
                     *n = totalSampleRead;
-                    _movieFragmentIdx[trackID] = 0;
+                    _movieFragmentIdx[moofIdx] = 0;
                     return return1;
                 }
             }
@@ -2563,7 +2581,7 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                 int32 return1 = 0;
                 while (!oAllMoofExhausted)
                 {
-                    if (oAllMoofParsed && (_pMovieFragmentAtomVec->size() < _movieFragmentIdx[trackID]))
+                    if (oAllMoofParsed && (_pMovieFragmentAtomVec->size() < _movieFragmentIdx[moofIdx]))
                     {
                         oAllMoofExhausted = true;
                         *n = 0;
@@ -2576,16 +2594,16 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                         {
                             uint32 moofIndex = 0;
                             bool moofToBeParsed = false;
-                            if (_pMovieFragmentAtomVec->size() > _movieFragmentIdx[trackID])
+                            if (_pMovieFragmentAtomVec->size() > _movieFragmentIdx[moofIdx])
                             {
                                 MovieFragmentAtom *pMovieFragmentAtom = NULL;
-                                uint32 idx = _movieFragmentIdx[trackID];
-                                pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[_movieFragmentIdx[trackID]];
+                                uint32 idx = _movieFragmentIdx[moofIdx];
+                                pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[_movieFragmentIdx[moofIdx]];
                                 if (pMovieFragmentAtom == NULL)
                                 {
                                     isResetPlayBackCalled = true;
                                     moofToBeParsed = true;
-                                    moofIndex = _movieFragmentIdx[trackID];
+                                    moofIndex = _movieFragmentIdx[moofIdx];
                                 }
                                 else if (isResetPlayBackCalled)
                                 {
@@ -2673,7 +2691,7 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                                 if ((currPos + atomSize) > fileSize)
                                 {
                                     AtomUtils::seekFromStart(_movieFragmentFilePtr, currPos);
-                                    if (_movieFragmentIdx[trackID] < _pMovieFragmentAtomVec->size())
+                                    if (_movieFragmentIdx[moofIdx] < _pMovieFragmentAtomVec->size())
                                     {
                                         // dont report insufficient data as we still have a moof/moofs to
                                         // retrieve data. So just go and retrieve the data.
@@ -2844,7 +2862,7 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                             *n = samplesTobeRead - *n;
                     }
 
-                    uint32 movieFragmentIdx = _movieFragmentIdx[trackID];
+                    uint32 movieFragmentIdx = _movieFragmentIdx[moofIdx];
                     MovieFragmentAtom *pMovieFragmentAtom = NULL;
 
                     if (movieFragmentIdx < _pMovieFragmentAtomVec->size())
@@ -2853,7 +2871,7 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                     if (pMovieFragmentAtom != NULL)
                     {
                         uint32 seqNum = pMovieFragmentAtom->getSequenceNumber();
-                        if (seqNum == _movieFragmentSeqIdx[trackID])
+                        if (seqNum == _movieFragmentSeqIdx[moofIdx])
                         {
                             TrackFragmentAtom *trackfragment = pMovieFragmentAtom->getTrackFragmentforID(trackID);
                             if (trackfragment != NULL)
@@ -2870,14 +2888,14 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                                     }
                                     else
                                     {
-                                        _movieFragmentSeqIdx[trackID]++;
+                                        _movieFragmentSeqIdx[moofIdx]++;
                                         if (samplesTobeRead >= *n)
                                         {
                                             samplesTobeRead = samplesTobeRead - *n;
                                             *n = samplesTobeRead;
                                             if (movieFragmentIdx < _pMovieFragmentAtomVec->size())
                                             {
-                                                _movieFragmentIdx[trackID]++;
+                                                _movieFragmentIdx[moofIdx]++;
                                             }
                                         }
                                     }
@@ -2885,15 +2903,15 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                             }
                             else
                             {
-                                uint32 movieFragmentIdx2 = _movieFragmentIdx[trackID];
+                                uint32 movieFragmentIdx2 = _movieFragmentIdx[moofIdx];
 
                                 if (oAllMoofParsed)
                                 {
                                     // look for all moofs
                                     if (movieFragmentIdx2 < _pMovieFragmentAtomVec->size())
                                     {
-                                        _movieFragmentIdx[trackID]++;
-                                        _movieFragmentSeqIdx[trackID]++;
+                                        _movieFragmentIdx[moofIdx]++;
+                                        _movieFragmentSeqIdx[moofIdx]++;
                                     }
                                     else
                                     {
@@ -2907,13 +2925,13 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                                     {
                                         if ((movieFragmentIdx2 == (_pMovieFragmentAtomVec->size() - 1)) && moofParsingCompleted)
                                         {
-                                            _movieFragmentIdx[trackID]++;
-                                            _movieFragmentSeqIdx[trackID]++;
+                                            _movieFragmentIdx[moofIdx]++;
+                                            _movieFragmentSeqIdx[moofIdx]++;
                                         }
                                         else if (movieFragmentIdx2 < (_pMovieFragmentAtomVec->size() - 1))
                                         {
-                                            _movieFragmentIdx[trackID]++;
-                                            _movieFragmentSeqIdx[trackID]++;
+                                            _movieFragmentIdx[moofIdx]++;
+                                            _movieFragmentSeqIdx[moofIdx]++;
                                             *n = 0;
                                             return NO_SAMPLE_IN_CURRENT_MOOF;
                                         }
@@ -2923,15 +2941,15 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                         }
                         else
                         {
-                            uint32 movieFragmentIdx2 = _movieFragmentIdx[trackID];
+                            uint32 movieFragmentIdx2 = _movieFragmentIdx[moofIdx];
 
                             if (oAllMoofParsed)
                             {
                                 // look for all moofs
                                 if (movieFragmentIdx2 < _pMovieFragmentAtomVec->size())
                                 {
-                                    _movieFragmentIdx[trackID]++;
-                                    _movieFragmentSeqIdx[trackID]++;
+                                    _movieFragmentIdx[moofIdx]++;
+                                    _movieFragmentSeqIdx[moofIdx]++;
                                 }
                                 else
                                 {
@@ -2945,13 +2963,13 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                                 {
                                     if ((movieFragmentIdx2 == (_pMovieFragmentAtomVec->size() - 1)) && moofParsingCompleted)
                                     {
-                                        _movieFragmentIdx[trackID]++;
-                                        _movieFragmentSeqIdx[trackID]++;
+                                        _movieFragmentIdx[moofIdx]++;
+                                        _movieFragmentSeqIdx[moofIdx]++;
                                     }
                                     else if (movieFragmentIdx2 < (_pMovieFragmentAtomVec->size() - 1))
                                     {
-                                        _movieFragmentIdx[trackID]++;
-                                        _movieFragmentSeqIdx[trackID]++;
+                                        _movieFragmentIdx[moofIdx]++;
+                                        _movieFragmentSeqIdx[moofIdx]++;
                                         *n = 0;
                                         return NO_SAMPLE_IN_CURRENT_MOOF;
                                     }
@@ -2963,13 +2981,13 @@ int32 Mpeg4File::getNextBundledAccessUnits(const uint32 trackID,
                     {
                         if (movieFragmentIdx < _pMovieFragmentAtomVec->size())
                         {
-                            _movieFragmentIdx[trackID]++;
-                            _movieFragmentSeqIdx[trackID]++;
+                            _movieFragmentIdx[moofIdx]++;
+                            _movieFragmentSeqIdx[moofIdx]++;
                         }
                         else if (oAllMoofParsed)
                         {
-                            _movieFragmentIdx[trackID]++;
-                            _movieFragmentSeqIdx[trackID]++;
+                            _movieFragmentIdx[moofIdx]++;
+                            _movieFragmentSeqIdx[moofIdx]++;
                         }
 
                     }
@@ -3026,10 +3044,19 @@ void Mpeg4File::populateTrackDurationVec()
             trackDuration = Oscl_Int64_Utils::get_uint64_lower32(_pmovieAtom->getTrackMediaDuration(trackID));
             PV_MP4_FF_NEW(fp->auditCB, TrackDurationInfo, (trackDuration, trackID), trackinfo);
             (*_pTrackDurationContainer->_pTrackdurationInfoVec).push_back(trackinfo);
-            _movieFragmentIdx[trackID] = 0;
-            _peekMovieFragmentIdx[trackID] = 0;
-            _movieFragmentSeqIdx[trackID] = 1;
-            _peekMovieFragmentSeqIdx[trackID] = 1;
+
+            TrackIndex *trackindx;
+            PV_MP4_FF_NEW(fp->auditCB, TrackIndex , (), trackindx);
+            trackindx->_trackID = trackID;
+            trackindx->_Index = i;
+            _moofFragmentIdx->push_back(trackindx);
+
+            uint32 moofIdx = getIndexForTrackID(trackID);
+
+            _movieFragmentIdx[moofIdx] = 0;
+            _peekMovieFragmentIdx[moofIdx] = 0;
+            _movieFragmentSeqIdx[moofIdx] = 1;
+            _peekMovieFragmentSeqIdx[moofIdx] = 1;
         }
     }
 }
@@ -3114,7 +3141,7 @@ MP4_ERROR_CODE Mpeg4File::getKeyMediaSampleNumAt(uint32 aTrackId,
         if (_isMovieFragmentsPresent)
         {
             uint32 n = 1;
-            uint32 movieFragmentIdx = _movieFragmentIdx[aTrackId];
+            uint32 movieFragmentIdx = _movieFragmentIdx[getIndexForTrackID(aTrackId)];
             MovieFragmentAtom *pMovieFragmentAtom = NULL;
 
             if (movieFragmentIdx < _pMovieFragmentAtomVec->size())
@@ -3123,7 +3150,7 @@ MP4_ERROR_CODE Mpeg4File::getKeyMediaSampleNumAt(uint32 aTrackId,
             if (pMovieFragmentAtom != NULL)
             {
                 uint32 seqNum = pMovieFragmentAtom->getSequenceNumber();
-                if (seqNum == _movieFragmentSeqIdx[aTrackId])
+                if (seqNum == _movieFragmentSeqIdx[getIndexForTrackID(aTrackId)])
                 {
                     TrackFragmentAtom *trackfragment = pMovieFragmentAtom->getTrackFragmentforID(aTrackId);
                     if (trackfragment != NULL)
@@ -3504,10 +3531,11 @@ void Mpeg4File::resetAllMovieFragments()
             for (int32 i = 0; i < numTracks; i++)
             {
                 uint32 trackID = trackList[i];
-                _movieFragmentIdx[trackID] = 0;
-                _peekMovieFragmentIdx[trackID] = 0;
-                _movieFragmentSeqIdx[trackID] = 1;
-                _peekMovieFragmentSeqIdx[trackID] = 1;
+                uint32 moofIdx = getIndexForTrackID(trackID);
+                _movieFragmentIdx[moofIdx] = 0;
+                _peekMovieFragmentIdx[moofIdx] = 0;
+                _movieFragmentSeqIdx[moofIdx] = 1;
+                _peekMovieFragmentSeqIdx[moofIdx] = 1;
                 TrackDurationInfo *trackinfo = NULL;
                 if (_pTrackDurationContainer != NULL)
                 {
@@ -3551,6 +3579,7 @@ uint32 Mpeg4File::resetPlayback(uint32 time, uint16 numTracks, uint32 *trackList
     uint32 moof_offset = 0, traf_number = 0, trun_number = 0, sample_num = 0;
 
     trackID = *trackList; //  numTracks is the track index in trackList
+    uint32 moofIdx = getIndexForTrackID(trackID);
     if (getTrackMediaType(trackID) == MEDIA_TYPE_VISUAL)
     {
         _oVideoTrackPresent = true;
@@ -3609,10 +3638,10 @@ uint32 Mpeg4File::resetPlayback(uint32 time, uint16 numTracks, uint32 *trackList
                             uint32 moof_start_offset = (*_pMoofOffsetVec)[idx];
                             if (moof_start_offset == moof_offset)
                             {
-                                _movieFragmentIdx[trackID] = idx;
-                                _peekMovieFragmentIdx[trackID] = idx;
-                                _movieFragmentSeqIdx[trackID] = (*_pMovieFragmentAtomVec)[idx]->getSequenceNumber();
-                                _peekMovieFragmentSeqIdx[trackID] = _movieFragmentSeqIdx[trackID];
+                                _movieFragmentIdx[moofIdx] = idx;
+                                _peekMovieFragmentIdx[moofIdx] = idx;
+                                _movieFragmentSeqIdx[moofIdx] = (*_pMovieFragmentAtomVec)[idx]->getSequenceNumber();
+                                _peekMovieFragmentSeqIdx[moofIdx] = _movieFragmentSeqIdx[moofIdx];
                                 _pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[idx];
                                 currMoofNum = _pMovieFragmentAtom->getSequenceNumber();
                                 oMoofFound = true;
@@ -3721,10 +3750,10 @@ uint32 Mpeg4File::resetPlayback(uint32 time, uint16 numTracks, uint32 *trackList
                                             break;
 
                                         }
-                                        _movieFragmentSeqIdx[trackID] = currMoofNum;
-                                        _movieFragmentIdx[trackID] = currMoofNum - 1;
-                                        _peekMovieFragmentIdx[trackID] = currMoofNum - 1;
-                                        _peekMovieFragmentSeqIdx[trackID] = currMoofNum;
+                                        _movieFragmentSeqIdx[moofIdx] = currMoofNum;
+                                        _movieFragmentIdx[moofIdx] = currMoofNum - 1;
+                                        _peekMovieFragmentIdx[moofIdx] = currMoofNum - 1;
+                                        _peekMovieFragmentSeqIdx[moofIdx] = currMoofNum;
 
                                         oMoofFound = true;
 
@@ -3887,10 +3916,10 @@ uint32 Mpeg4File::resetPlayback(uint32 time, uint16 numTracks, uint32 *trackList
                             uint32 moof_start_offset = (*_pMoofOffsetVec)[idx];
                             if (moof_start_offset == moof_offset)
                             {
-                                _movieFragmentIdx[trackID] = idx;
-                                _peekMovieFragmentIdx[trackID] = idx;
-                                _movieFragmentSeqIdx[trackID] = (*_pMovieFragmentAtomVec)[idx]->getSequenceNumber();
-                                _peekMovieFragmentSeqIdx[trackID] = _movieFragmentSeqIdx[trackID];
+                                _movieFragmentIdx[moofIdx] = idx;
+                                _peekMovieFragmentIdx[moofIdx] = idx;
+                                _movieFragmentSeqIdx[moofIdx] = (*_pMovieFragmentAtomVec)[idx]->getSequenceNumber();
+                                _peekMovieFragmentSeqIdx[moofIdx] = _movieFragmentSeqIdx[moofIdx];
                                 _pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[idx];
                                 currMoofNum = _pMovieFragmentAtom->getSequenceNumber();
                                 oMoofFound = true;
@@ -4008,10 +4037,10 @@ uint32 Mpeg4File::resetPlayback(uint32 time, uint16 numTracks, uint32 *trackList
                                 if (oMfraFound)
                                 {
                                     currMoofNum = _pMovieFragmentAtom->getSequenceNumber();
-                                    _movieFragmentIdx[trackID] = currMoofNum - 1 ;
-                                    _peekMovieFragmentIdx[trackID] = currMoofNum - 1;
-                                    _movieFragmentSeqIdx[trackID] = currMoofNum;
-                                    _peekMovieFragmentSeqIdx[trackID] = _movieFragmentSeqIdx[trackID];
+                                    _movieFragmentIdx[moofIdx] = currMoofNum - 1 ;
+                                    _peekMovieFragmentIdx[moofIdx] = currMoofNum - 1;
+                                    _movieFragmentSeqIdx[moofIdx] = currMoofNum;
+                                    _peekMovieFragmentSeqIdx[moofIdx] = _movieFragmentSeqIdx[moofIdx];
                                     oMoofFound = true;
                                     if (!_oVideoTrackPresent)
                                     {
@@ -4023,10 +4052,10 @@ uint32 Mpeg4File::resetPlayback(uint32 time, uint16 numTracks, uint32 *trackList
                                 if (currTrafDuration >= modifiedTimeStamp)
                                 {
                                     currMoofNum = _pMovieFragmentAtom->getSequenceNumber();
-                                    _movieFragmentIdx[trackID] = currMoofNum - 1;
-                                    _peekMovieFragmentIdx[trackID] = currMoofNum - 1;
-                                    _movieFragmentSeqIdx[trackID] = currMoofNum;
-                                    _peekMovieFragmentSeqIdx[trackID] = _movieFragmentSeqIdx[trackID];
+                                    _movieFragmentIdx[moofIdx] = currMoofNum - 1;
+                                    _peekMovieFragmentIdx[moofIdx] = currMoofNum - 1;
+                                    _movieFragmentSeqIdx[moofIdx] = currMoofNum;
+                                    _peekMovieFragmentSeqIdx[moofIdx] = _movieFragmentSeqIdx[moofIdx];
                                     oMoofFound = true;
                                     if (!_oVideoTrackPresent)
                                     {
@@ -4385,6 +4414,7 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
     uint32 samplesTobeRead;
     samplesTobeRead = *n;
     uint32 totalSampleRead = 0;
+    uint32 moofIdx = getIndexForTrackID(trackID);
     if (getNumTracks() == 0)
     {
         return -1;
@@ -4422,11 +4452,11 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
                 int32 return1 = 0;
                 while (_peekMovieFragmentIdx[trackID] < _pMovieFragmentAtomVec->size())
                 {
-                    uint32 peekMovieFragmentIdx = _peekMovieFragmentIdx[trackID];
+                    uint32 peekMovieFragmentIdx = _peekMovieFragmentIdx[moofIdx];
                     MovieFragmentAtom *pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[peekMovieFragmentIdx];
                     if (pMovieFragmentAtom != NULL)
                     {
-                        if ((uint32)pMovieFragmentAtom->getSequenceNumber() == _peekMovieFragmentSeqIdx[trackID])
+                        if ((uint32)pMovieFragmentAtom->getSequenceNumber() == _peekMovieFragmentSeqIdx[moofIdx])
                         {
                             TrackFragmentAtom *trackfragment = pMovieFragmentAtom->getTrackFragmentforID(trackID);
                             if (trackfragment != NULL)
@@ -4442,7 +4472,7 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
                                     }
                                     else
                                     {
-                                        _peekMovieFragmentSeqIdx[trackID]++;
+                                        _peekMovieFragmentSeqIdx[moofIdx]++;
                                         if (samplesTobeRead >= *n)
                                         {
                                             samplesTobeRead = samplesTobeRead - *n;
@@ -4453,13 +4483,13 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
                             }
                         }
                     }
-                    _peekMovieFragmentIdx[trackID]++;
+                    _peekMovieFragmentIdx[moofIdx]++;
                 }
                 if (return1 == END_OF_TRACK)
                 {
                     *n = totalSampleRead;
-                    _peekMovieFragmentIdx[trackID] = 0;
-                    _peekMovieFragmentSeqIdx[trackID] = 1;
+                    _peekMovieFragmentIdx[moofIdx] = 0;
+                    _peekMovieFragmentSeqIdx[moofIdx] = 1;
                     return return1;
                 }
             }
@@ -4471,17 +4501,17 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
                     uint32 moofIndex = 0;
                     bool moofToBeParsed = false;
 
-                    if (_pMovieFragmentAtomVec->size() > _peekMovieFragmentIdx[trackID])
+                    if (_pMovieFragmentAtomVec->size() > _peekMovieFragmentIdx[moofIdx])
                     {
                         MovieFragmentAtom *pMovieFragmentAtom = NULL;
-                        pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[_peekMovieFragmentIdx[trackID]];
+                        pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[_peekMovieFragmentIdx[moofIdx]];
                         if (pMovieFragmentAtom == NULL)
                         {
                             moofToBeParsed = true;
-                            moofIndex = _peekMovieFragmentIdx[trackID];
+                            moofIndex = _peekMovieFragmentIdx[moofIdx];
                         }
                     }
-                    if ((_pMovieFragmentAtomVec->size() <= _peekMovieFragmentIdx[trackID]) || moofToBeParsed)
+                    if ((_pMovieFragmentAtomVec->size() <= _peekMovieFragmentIdx[moofIdx]) || moofToBeParsed)
                     {
                         uint32 fileSize = 0;
                         AtomUtils::getCurrentFileSize(_movieFragmentFilePtr, fileSize);
@@ -4583,14 +4613,14 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
                         if (count <= 0)
                         {
                             oAllMoofExhausted = true;
-                            if (_pMovieFragmentAtomVec->size() < _peekMovieFragmentIdx[trackID])
+                            if (_pMovieFragmentAtomVec->size() < _peekMovieFragmentIdx[moofIdx])
                                 break;
                         }
                     }
 
                     int32 return1 = 0;
                     MovieFragmentAtom *pMovieFragmentAtom = NULL;
-                    uint32 movieFragmentIdx = _peekMovieFragmentIdx[trackID];
+                    uint32 movieFragmentIdx = _peekMovieFragmentIdx[moofIdx];
 
                     if (movieFragmentIdx < _pMovieFragmentAtomVec->size())
                         pMovieFragmentAtom = (*_pMovieFragmentAtomVec)[movieFragmentIdx];
@@ -4598,7 +4628,7 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
                     if (pMovieFragmentAtom != NULL)
                     {
                         uint32 seqNum = pMovieFragmentAtom->getSequenceNumber();
-                        if (seqNum == _peekMovieFragmentSeqIdx[trackID])
+                        if (seqNum == _peekMovieFragmentSeqIdx[moofIdx])
                         {
                             TrackFragmentAtom *trackfragment = pMovieFragmentAtom->getTrackFragmentforID(trackID);
                             if (trackfragment != NULL)
@@ -4614,7 +4644,7 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
                                     }
                                     else
                                     {
-                                        _peekMovieFragmentSeqIdx[trackID]++;
+                                        _peekMovieFragmentSeqIdx[moofIdx]++;
                                         if (samplesTobeRead >= *n)
                                         {
                                             samplesTobeRead = samplesTobeRead - *n;
@@ -4625,14 +4655,14 @@ int32 Mpeg4File::peekNextBundledAccessUnits(const uint32 trackID,
                             }
                             else
                             {
-                                _peekMovieFragmentIdx[trackID]++;
-                                _peekMovieFragmentSeqIdx[trackID]++;
+                                _peekMovieFragmentIdx[moofIdx]++;
+                                _peekMovieFragmentSeqIdx[moofIdx]++;
                                 *n = 0;
                                 return NO_SAMPLE_IN_CURRENT_MOOF;
                             }
                         }
                     }
-                    _peekMovieFragmentIdx[trackID]++;
+                    _peekMovieFragmentIdx[moofIdx]++;
 
                 }
             }
@@ -4787,10 +4817,11 @@ void Mpeg4File::resetPlayback()
             for (int i = 0; i < numTracks; i++)
             {
                 uint32 trackID = trackList[i];
-                _peekMovieFragmentIdx[trackID] = 0;
-                _movieFragmentIdx[trackID] = 0;
-                _movieFragmentSeqIdx[trackID] = 1;
-                _peekMovieFragmentSeqIdx[trackID] = 1;
+                uint32 moofIdx = getIndexForTrackID(trackID);
+                _peekMovieFragmentIdx[moofIdx] = 0;
+                _movieFragmentIdx[moofIdx] = 0;
+                _movieFragmentSeqIdx[moofIdx] = 1;
+                _peekMovieFragmentSeqIdx[moofIdx] = 1;
             }
             oscl_free(trackList);
             for (uint32 idx = 0; idx < _pMovieFragmentAtomVec->size(); idx++)