Skip to content

Commit 7721f38

Browse files
icbakerSheenaChhabra
authored andcommitted
Check sampleMimeType rather than containerMimeType for images
These are often the same for image tracks, since we usually drop the whole image file (both the container and actual encoded image bytes) into a single sample, but there are cases where we emit a track with `containerMimeType=image/jpeg` but **no** samples (from `JpegMotionPhotoExtractor`, to carry some metadata about the image + video byte offsets). It's therefore more correct to implement the `supportsFormat` check based on `sampleMimeType`, so that these 'empty' image tracks are not considered 'supported' by `ImageRenderer`. #minor-release PiperOrigin-RevId: 604672331 (cherry picked from commit eabba49)
1 parent dc8d3ea commit 7721f38

16 files changed

+27
-28
lines changed

‎libraries/exoplayer/src/main/java/androidx/media3/exoplayer/image/BitmapFactoryImageDecoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ public Factory(BitmapDecoder bitmapDecoder) {
8989

9090
@Override
9191
public @RendererCapabilities.Capabilities int supportsFormat(Format format) {
92-
if (format.containerMimeType == null || !MimeTypes.isImage(format.containerMimeType)) {
92+
if (format.sampleMimeType == null || !MimeTypes.isImage(format.sampleMimeType)) {
9393
return RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE);
9494
}
95-
return isBitmapFactorySupportedMimeType(format.containerMimeType)
95+
return isBitmapFactorySupportedMimeType(format.sampleMimeType)
9696
? RendererCapabilities.create(C.FORMAT_HANDLED)
9797
: RendererCapabilities.create(C.FORMAT_UNSUPPORTED_SUBTYPE);
9898
}

‎libraries/exoplayer/src/test/java/androidx/media3/exoplayer/image/BitmapFactoryImageDecoderFactoryTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class BitmapFactoryImageDecoderFactoryTest {
3535

3636
@Test
3737
public void supportsFormat_validFormat_returnsFormatSupported() throws Exception {
38-
Format.Builder format = new Format.Builder().setContainerMimeType(MimeTypes.IMAGE_JPEG);
38+
Format.Builder format = new Format.Builder().setSampleMimeType(MimeTypes.IMAGE_JPEG);
3939

4040
assertThat(imageDecoderFactory.supportsFormat(format.build()))
4141
.isEqualTo(RendererCapabilities.create(C.FORMAT_HANDLED));
@@ -53,7 +53,7 @@ public void supportsFormat_noContainerMimeType_returnsUnsupportedType() throws E
5353
public void supportsFormat_nonImageMimeType_returnsUnsupportedType() throws Exception {
5454
Format.Builder format = new Format.Builder();
5555

56-
format.setContainerMimeType(MimeTypes.VIDEO_AV1);
56+
format.setSampleMimeType(MimeTypes.VIDEO_AV1);
5757

5858
assertThat(imageDecoderFactory.supportsFormat(format.build()))
5959
.isEqualTo(RendererCapabilities.create(C.FORMAT_UNSUPPORTED_TYPE));
@@ -63,7 +63,7 @@ public void supportsFormat_nonImageMimeType_returnsUnsupportedType() throws Exce
6363
public void supportsFormat_unsupportedImageMimeType_returnsUnsupportedSubType() throws Exception {
6464
Format.Builder format = new Format.Builder();
6565

66-
format.setContainerMimeType("image/custom");
66+
format.setSampleMimeType("image/custom");
6767

6868
assertThat(imageDecoderFactory.supportsFormat(format.build()))
6969
.isEqualTo(RendererCapabilities.create(C.FORMAT_UNSUPPORTED_SUBTYPE));

‎libraries/exoplayer/src/test/java/androidx/media3/exoplayer/image/ImageRendererTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,19 @@ public class ImageRendererTest {
5656
"Renderer has not read stream to end after " + DEFAULT_LOOP_TIMEOUT_MS + " milliseconds.";
5757
private static final Format PNG_FORMAT =
5858
new Format.Builder()
59-
.setContainerMimeType(MimeTypes.IMAGE_PNG)
59+
.setSampleMimeType(MimeTypes.IMAGE_PNG)
6060
.setTileCountVertical(1)
6161
.setTileCountHorizontal(1)
6262
.build();
6363
private static final Format JPEG_FORMAT =
6464
new Format.Builder()
65-
.setContainerMimeType(MimeTypes.IMAGE_JPEG)
65+
.setSampleMimeType(MimeTypes.IMAGE_JPEG)
6666
.setTileCountVertical(1)
6767
.setTileCountHorizontal(1)
6868
.build();
6969
private static final Format JPEG_FORMAT_WITH_FOUR_TILES =
7070
new Format.Builder()
71-
.setContainerMimeType(MimeTypes.IMAGE_JPEG)
71+
.setSampleMimeType(MimeTypes.IMAGE_JPEG)
7272
.setTileCountVertical(2)
7373
.setTileCountHorizontal(2)
7474
.build();

‎libraries/extractor/src/main/java/androidx/media3/extractor/SingleSampleExtractor.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public final class SingleSampleExtractor implements Extractor {
4040

4141
private final int fileSignature;
4242
private final int fileSignatureLength;
43-
private final String containerMimeType;
43+
private final String sampleMimeType;
4444

4545
/** Parser states. */
4646
@Documented
@@ -72,13 +72,12 @@ public final class SingleSampleExtractor implements Extractor {
7272
* method won't be used.
7373
* @param fileSignatureLength The length of file signature, or {@link C#LENGTH_UNSET} if the
7474
* {@link #sniff} method won't be used.
75-
* @param containerMimeType The mime type of the format being extracted.
75+
* @param sampleMimeType The mime type of the sample.
7676
*/
77-
public SingleSampleExtractor(
78-
int fileSignature, int fileSignatureLength, String containerMimeType) {
77+
public SingleSampleExtractor(int fileSignature, int fileSignatureLength, String sampleMimeType) {
7978
this.fileSignature = fileSignature;
8079
this.fileSignatureLength = fileSignatureLength;
81-
this.containerMimeType = containerMimeType;
80+
this.sampleMimeType = sampleMimeType;
8281
}
8382

8483
@Override
@@ -92,7 +91,7 @@ public boolean sniff(ExtractorInput input) throws IOException {
9291
@Override
9392
public void init(ExtractorOutput output) {
9493
extractorOutput = output;
95-
outputImageTrackAndSeekMap(containerMimeType);
94+
outputImageTrackAndSeekMap(sampleMimeType);
9695
}
9796

9897
@Override
@@ -137,9 +136,9 @@ private void readSegment(ExtractorInput input) throws IOException {
137136
}
138137

139138
@RequiresNonNull("this.extractorOutput")
140-
private void outputImageTrackAndSeekMap(String containerMimeType) {
139+
private void outputImageTrackAndSeekMap(String sampleMimeType) {
141140
trackOutput = extractorOutput.track(IMAGE_TRACK_ID, C.TRACK_TYPE_IMAGE);
142-
trackOutput.format(new Format.Builder().setContainerMimeType(containerMimeType).build());
141+
trackOutput.format(new Format.Builder().setSampleMimeType(sampleMimeType).build());
143142
extractorOutput.endTracks();
144143
extractorOutput.seekMap(new SingleSampleSeekMap(/* durationUs= */ C.TIME_UNSET));
145144
state = STATE_READING;

‎libraries/test_data/src/test/assets/extractordumps/bmp/non-motion-photo-shortened-cropped.bmp.0.dump

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ track 1024:
88
total output bytes = 69130
99
sample count = 1
1010
format 0:
11-
containerMimeType = image/bmp
11+
sampleMimeType = image/bmp
1212
sample 0:
1313
time = 0
1414
flags = 1

‎libraries/test_data/src/test/assets/extractordumps/bmp/non-motion-photo-shortened-cropped.bmp.unknown_length.dump

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ track 1024:
88
total output bytes = 69130
99
sample count = 1
1010
format 0:
11-
containerMimeType = image/bmp
11+
sampleMimeType = image/bmp
1212
sample 0:
1313
time = 0
1414
flags = 1

‎libraries/test_data/src/test/assets/extractordumps/heif/sample_MP.heic.0.dump

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ track 1024:
88
total output bytes = 57672
99
sample count = 1
1010
format 0:
11-
containerMimeType = image/heif
11+
sampleMimeType = image/heif
1212
sample 0:
1313
time = 0
1414
flags = 1

‎libraries/test_data/src/test/assets/extractordumps/heif/sample_MP.heic.unknown_length.dump

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ track 1024:
88
total output bytes = 57672
99
sample count = 1
1010
format 0:
11-
containerMimeType = image/heif
11+
sampleMimeType = image/heif
1212
sample 0:
1313
time = 0
1414
flags = 1

‎libraries/test_data/src/test/assets/extractordumps/jpeg/non-motion-photo-shortened.jpg_JpegExtractor.FLAG_READ_IMAGE.0.dump

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ track 1024:
88
total output bytes = 30000
99
sample count = 1
1010
format 0:
11-
containerMimeType = image/jpeg
11+
sampleMimeType = image/jpeg
1212
sample 0:
1313
time = 0
1414
flags = 1

‎libraries/test_data/src/test/assets/extractordumps/jpeg/non-motion-photo-shortened.jpg_JpegExtractor.FLAG_READ_IMAGE.unknown_length.dump

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ track 1024:
88
total output bytes = 30000
99
sample count = 1
1010
format 0:
11-
containerMimeType = image/jpeg
11+
sampleMimeType = image/jpeg
1212
sample 0:
1313
time = 0
1414
flags = 1

0 commit comments

Comments
 (0)