@@ -43,6 +43,7 @@ public abstract class DefaultDataSource implements DataSource {
4343
4444 @ Override
4545 public void initialize () {
46+ LOG .i ("initialize(): initializing..." );
4647 mExtractor = new MediaExtractor ();
4748 try {
4849 initializeExtractor (mExtractor );
@@ -67,13 +68,27 @@ public void initialize() {
6768 // This is very important to have a timebase e.g. for seeks that happen before any read.
6869 for (int i = 0 ; i < mExtractor .getTrackCount (); i ++) mExtractor .selectTrack (i );
6970 mOriginUs = mExtractor .getSampleTime ();
71+ LOG .v ("initialize(): found origin=" + mOriginUs );
7072 for (int i = 0 ; i < mExtractor .getTrackCount (); i ++) mExtractor .unselectTrack (i );
7173 mInitialized = true ;
74+
75+ // Debugging mOriginUs issues.
76+ /* LOG.v("initialize(): origin after unselect is" + mExtractor.getSampleTime());
77+ if (getTrackFormat(TrackType.VIDEO) != null) {
78+ mExtractor.selectTrack(mIndex.getVideo());
79+ LOG.v("initialize(): video only origin is" + mExtractor.getSampleTime());
80+ mExtractor.unselectTrack(mIndex.getVideo());
81+ }
82+ if (getTrackFormat(TrackType.AUDIO) != null) {
83+ mExtractor.selectTrack(mIndex.getAudio());
84+ LOG.v("initialize(): audio only origin is" + mExtractor.getSampleTime());
85+ mExtractor.unselectTrack(mIndex.getAudio());
86+ } */
7287 }
7388
7489 @ Override
7590 public void deinitialize () {
76- LOG .i ("deinitialize(): releasing ..." );
91+ LOG .i ("deinitialize(): deinitializing ..." );
7792 try {
7893 mExtractor .release ();
7994 } catch (Exception e ) {
@@ -124,6 +139,7 @@ public long seekTo(long desiredPositionUs) {
124139 boolean hasAudio = mSelectedTracks .contains (TrackType .AUDIO );
125140 LOG .i ("seekTo(): seeking to " + (mOriginUs + desiredPositionUs )
126141 + " originUs=" + mOriginUs
142+ + " extractorUs=" + mExtractor .getSampleTime ()
127143 + " externalUs=" + desiredPositionUs
128144 + " hasVideo=" + hasVideo
129145 + " hasAudio=" + hasAudio );
@@ -140,17 +156,18 @@ public long seekTo(long desiredPositionUs) {
140156 }
141157 mDontRenderRangeStart = mExtractor .getSampleTime ();
142158 mDontRenderRangeEnd = mOriginUs + desiredPositionUs ;
143-
144159 if (mDontRenderRangeStart > mDontRenderRangeEnd ) {
145- throw new IllegalStateException ("The dontRenderRange has unexpected values! " +
146- "start=" + mDontRenderRangeStart + ", " +
147- "end=" + mDontRenderRangeEnd );
148- } else {
149- LOG .i ("seekTo(): dontRenderRange=" +
150- mDontRenderRangeStart + ".." +
151- mDontRenderRangeEnd + " (" +
152- (mDontRenderRangeEnd - mDontRenderRangeStart ) + "us)" );
160+ // Extractor jumped beyond the requested point!
161+ // This can happen in edge cases because we compute mOriginUs with both tracks selected,
162+ // while source can later be used with a single track. E.g. audio track starts at 0,
163+ // video track starts at 20000, mOriginUs is 0. A seekTo(0) will give range=20000..0.
164+ // In this case, range should just be empty.
165+ mDontRenderRangeStart = mDontRenderRangeEnd ; // 0..0
153166 }
167+ LOG .i ("seekTo(): dontRenderRange=" +
168+ mDontRenderRangeStart + ".." +
169+ mDontRenderRangeEnd + " (" +
170+ (mDontRenderRangeEnd - mDontRenderRangeStart ) + "us)" );
154171 return mExtractor .getSampleTime () - mOriginUs ;
155172 }
156173
0 commit comments