Support Jpeg image track extraction in exoplayer
PiperOrigin-RevId: 563818198
This commit is contained in:
parent
be5fa6d130
commit
23665090ed
@ -48,6 +48,7 @@ import androidx.media3.extractor.ExtractorsFactory;
|
||||
import androidx.media3.extractor.PositionHolder;
|
||||
import androidx.media3.extractor.SeekMap;
|
||||
import androidx.media3.extractor.TrackOutput;
|
||||
import androidx.media3.extractor.jpeg.JpegExtractor;
|
||||
import androidx.media3.extractor.text.DefaultSubtitleParserFactory;
|
||||
import androidx.media3.extractor.text.SubtitleExtractor;
|
||||
import com.google.common.base.Supplier;
|
||||
@ -438,6 +439,9 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
|
||||
int type =
|
||||
Util.inferContentTypeForUriAndMimeType(
|
||||
mediaItem.localConfiguration.uri, mediaItem.localConfiguration.mimeType);
|
||||
if (mediaItem.localConfiguration.imageDurationMs != C.TIME_UNSET) {
|
||||
delegateFactoryLoader.setJpegExtractorFlags(JpegExtractor.FLAG_READ_IMAGE);
|
||||
}
|
||||
@Nullable
|
||||
MediaSource.Factory mediaSourceFactory = delegateFactoryLoader.getMediaSourceFactory(type);
|
||||
checkStateNotNull(
|
||||
@ -650,6 +654,12 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory {
|
||||
}
|
||||
}
|
||||
|
||||
public void setJpegExtractorFlags(@JpegExtractor.Flags int flags) {
|
||||
if (this.extractorsFactory instanceof DefaultExtractorsFactory) {
|
||||
((DefaultExtractorsFactory) this.extractorsFactory).setJpegExtractorFlags(flags);
|
||||
}
|
||||
}
|
||||
|
||||
private void ensureAllSuppliersAreLoaded() {
|
||||
maybeLoadSupplier(C.CONTENT_TYPE_DASH);
|
||||
maybeLoadSupplier(C.CONTENT_TYPE_SS);
|
||||
|
@ -50,8 +50,9 @@ public class ImagePlaybackTest {
|
||||
// TODO(b/289989736): When extraction for other types of images is implemented, add those image
|
||||
// types to this list.
|
||||
// Robolectric's NativeShadowBitmapFactory doesn't support decoding HEIF format, so we don't
|
||||
// test that here.
|
||||
return ImmutableList.of("png/non-motion-photo-shortened.png");
|
||||
// test that format here.
|
||||
return ImmutableList.of(
|
||||
"png/non-motion-photo-shortened.png", "jpeg/non-motion-photo-shortened.jpg");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -153,6 +153,7 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
|
||||
private int tsTimestampSearchBytes;
|
||||
private boolean textTrackTranscodingEnabled;
|
||||
private SubtitleParser.Factory subtitleParserFactory;
|
||||
private @JpegExtractor.Flags int jpegFlags;
|
||||
|
||||
public DefaultExtractorsFactory() {
|
||||
tsMode = TsExtractor.MODE_SINGLE_PMT;
|
||||
@ -391,6 +392,20 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets flags for {@link JpegExtractor} instances created by the factory.
|
||||
*
|
||||
* @see JpegExtractor#JpegExtractor(int)
|
||||
* @param flags The flags to use.
|
||||
* @return The factory, for convenience.
|
||||
*/
|
||||
@CanIgnoreReturnValue
|
||||
public synchronized DefaultExtractorsFactory setJpegExtractorFlags(
|
||||
@JpegExtractor.Flags int flags) {
|
||||
this.jpegFlags = flags;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Extractor[] createExtractors() {
|
||||
return createExtractors(Uri.EMPTY, new HashMap<>());
|
||||
@ -509,7 +524,7 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
|
||||
extractors.add(new WavExtractor());
|
||||
break;
|
||||
case FileTypes.JPEG:
|
||||
extractors.add(new JpegExtractor());
|
||||
extractors.add(new JpegExtractor(jpegFlags));
|
||||
break;
|
||||
case FileTypes.MIDI:
|
||||
@Nullable Extractor midiExtractor = MIDI_EXTENSION_LOADER.getExtractor();
|
||||
|
@ -0,0 +1,5 @@
|
||||
ImageOutput:
|
||||
rendered image count = 1
|
||||
image output #1:
|
||||
presentationTimeUs = 0
|
||||
bitmap hash = 1655078913
|
Loading…
x
Reference in New Issue
Block a user