Commit a7e2b719 by Oliver Woodman

Call init() on the extractor only once for each chunk.

On retrying loading a chunk, the state of the extractor was reset due to a call
to seek(). Prevent this call by only calling init() if no bytes were loaded.

Also make the DefaultExtractorInput use the loading position not the original
stream position so that its getPosition() method returns offsets relative to
the start of the stream, which fixes a bug where the chunk index offsets would
be relative to the wrong position if there was a retry while loading the chunk.
parent 21e69f31
...@@ -19,7 +19,6 @@ import com.google.android.exoplayer.MediaFormat; ...@@ -19,7 +19,6 @@ import com.google.android.exoplayer.MediaFormat;
import com.google.android.exoplayer.chunk.ChunkExtractorWrapper.SingleTrackOutput; import com.google.android.exoplayer.chunk.ChunkExtractorWrapper.SingleTrackOutput;
import com.google.android.exoplayer.drm.DrmInitData; import com.google.android.exoplayer.drm.DrmInitData;
import com.google.android.exoplayer.extractor.DefaultExtractorInput; import com.google.android.exoplayer.extractor.DefaultExtractorInput;
import com.google.android.exoplayer.extractor.DefaultTrackOutput;
import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.Extractor;
import com.google.android.exoplayer.extractor.ExtractorInput; import com.google.android.exoplayer.extractor.ExtractorInput;
import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.extractor.SeekMap;
...@@ -84,12 +83,6 @@ public class ContainerMediaChunk extends BaseMediaChunk implements SingleTrackOu ...@@ -84,12 +83,6 @@ public class ContainerMediaChunk extends BaseMediaChunk implements SingleTrackOu
} }
@Override @Override
public void init(DefaultTrackOutput output) {
super.init(output);
extractorWrapper.init(this);
}
@Override
public MediaFormat getMediaFormat() { public MediaFormat getMediaFormat() {
return mediaFormat; return mediaFormat;
} }
...@@ -149,10 +142,12 @@ public class ContainerMediaChunk extends BaseMediaChunk implements SingleTrackOu ...@@ -149,10 +142,12 @@ public class ContainerMediaChunk extends BaseMediaChunk implements SingleTrackOu
DataSpec loadDataSpec = Util.getRemainderDataSpec(dataSpec, bytesLoaded); DataSpec loadDataSpec = Util.getRemainderDataSpec(dataSpec, bytesLoaded);
try { try {
// Create and open the input. // Create and open the input.
ExtractorInput input = new DefaultExtractorInput(dataSource, dataSpec.absoluteStreamPosition, ExtractorInput input = new DefaultExtractorInput(dataSource,
dataSource.open(loadDataSpec)); loadDataSpec.absoluteStreamPosition, dataSource.open(loadDataSpec));
// Set the target to ourselves. if (bytesLoaded == 0) {
extractorWrapper.init(this); // Set the target to ourselves.
extractorWrapper.init(this);
}
// Load and parse the initialization data. // Load and parse the initialization data.
try { try {
int result = Extractor.RESULT_CONTINUE; int result = Extractor.RESULT_CONTINUE;
...@@ -160,7 +155,7 @@ public class ContainerMediaChunk extends BaseMediaChunk implements SingleTrackOu ...@@ -160,7 +155,7 @@ public class ContainerMediaChunk extends BaseMediaChunk implements SingleTrackOu
result = extractorWrapper.read(input); result = extractorWrapper.read(input);
} }
} finally { } finally {
bytesLoaded += (int) (input.getPosition() - dataSpec.absoluteStreamPosition); bytesLoaded = (int) (input.getPosition() - dataSpec.absoluteStreamPosition);
} }
} finally { } finally {
dataSource.close(); dataSource.close();
......
...@@ -170,10 +170,12 @@ public final class InitializationChunk extends Chunk implements SingleTrackOutpu ...@@ -170,10 +170,12 @@ public final class InitializationChunk extends Chunk implements SingleTrackOutpu
DataSpec loadDataSpec = Util.getRemainderDataSpec(dataSpec, bytesLoaded); DataSpec loadDataSpec = Util.getRemainderDataSpec(dataSpec, bytesLoaded);
try { try {
// Create and open the input. // Create and open the input.
ExtractorInput input = new DefaultExtractorInput(dataSource, dataSpec.absoluteStreamPosition, ExtractorInput input = new DefaultExtractorInput(dataSource,
dataSource.open(loadDataSpec)); loadDataSpec.absoluteStreamPosition, dataSource.open(loadDataSpec));
// Set the target to ourselves. if (bytesLoaded == 0) {
extractorWrapper.init(this); // Set the target to ourselves.
extractorWrapper.init(this);
}
// Load and parse the initialization data. // Load and parse the initialization data.
try { try {
int result = Extractor.RESULT_CONTINUE; int result = Extractor.RESULT_CONTINUE;
...@@ -181,7 +183,7 @@ public final class InitializationChunk extends Chunk implements SingleTrackOutpu ...@@ -181,7 +183,7 @@ public final class InitializationChunk extends Chunk implements SingleTrackOutpu
result = extractorWrapper.read(input); result = extractorWrapper.read(input);
} }
} finally { } finally {
bytesLoaded += (int) (input.getPosition() - dataSpec.absoluteStreamPosition); bytesLoaded = (int) (input.getPosition() - dataSpec.absoluteStreamPosition);
} }
} finally { } finally {
dataSource.close(); dataSource.close();
......
...@@ -99,8 +99,8 @@ public final class TsChunk extends MediaChunk { ...@@ -99,8 +99,8 @@ public final class TsChunk extends MediaChunk {
} }
try { try {
ExtractorInput input = new DefaultExtractorInput(dataSource, dataSpec.absoluteStreamPosition, ExtractorInput input = new DefaultExtractorInput(dataSource,
dataSource.open(loadDataSpec)); loadDataSpec.absoluteStreamPosition, dataSource.open(loadDataSpec));
if (skipLoadedBytes) { if (skipLoadedBytes) {
input.skipFully(bytesLoaded); input.skipFully(bytesLoaded);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment