Skip to content

Commit f305ff1

Browse files
ychaparovcopybara-github
authored andcommitted
Do not reuse frame extractor if HDR output is enabled
The media3 effects pipeline doesn't allow changing the output color space. If we create an HDR pipeline, we cannot output SDR afterwards. PiperOrigin-RevId: 827510777
1 parent 3822790 commit f305ff1

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

libraries/inspector/src/androidTest/java/androidx/media3/inspector/mh/FrameExtractorHdrTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import android.graphics.BitmapFactory;
3737
import android.graphics.ColorSpace;
3838
import androidx.media3.common.MediaItem;
39+
import androidx.media3.exoplayer.mediacodec.MediaCodecSelector;
3940
import androidx.media3.inspector.FrameExtractor;
4041
import androidx.test.core.app.ApplicationProvider;
4142
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -218,4 +219,37 @@ public void extractFrame_oneFrameHlgWithHdrDisplayUnsupported_returnsSdrFrame()
218219
assertThat(frameSecondItem.presentationTimeMs).isEqualTo(0);
219220
assertBitmapsAreSimilar(expectedBitmapSecondItem, actualBitmapSecondItem, PSNR_THRESHOLD);
220221
}
222+
223+
@Test
224+
@SdkSuppress(minSdkVersion = 34) // HLG Bitmaps are only supported on API 34+.
225+
public void extractFrame_changeMediaItemFromHdrToSdrWithHdrOutput_succeeds() throws Exception {
226+
// TODO: b/438478509 - rename assumeDeviceSupportsOpenGlToneMapping. This check verifies
227+
// that HDR input can be sampled by the GL pipeline.
228+
assumeDeviceSupportsOpenGlToneMapping(testId, MP4_ASSET_COLOR_TEST_1080P_HLG10.videoFormat);
229+
230+
FrameExtractor.Frame frameFirstItem;
231+
try (FrameExtractor frameExtractor =
232+
new FrameExtractor.Builder(context, MediaItem.fromUri(MP4_ASSET_COLOR_TEST_1080P_HLG10.uri))
233+
.setMediaCodecSelector(MediaCodecSelector.DEFAULT)
234+
.setExtractHdrFrames(true)
235+
.build()) {
236+
ListenableFuture<FrameExtractor.Frame> frameFutureFirstItem =
237+
frameExtractor.getFrame(/* positionMs= */ 0);
238+
frameFirstItem = frameFutureFirstItem.get(TIMEOUT_SECONDS, SECONDS);
239+
}
240+
241+
FrameExtractor.Frame frameSecondItem;
242+
try (FrameExtractor frameExtractor =
243+
new FrameExtractor.Builder(context, MediaItem.fromUri(MP4_TRIM_OPTIMIZATION_270.uri))
244+
.setMediaCodecSelector(MediaCodecSelector.DEFAULT)
245+
.setExtractHdrFrames(true)
246+
.build()) {
247+
ListenableFuture<FrameExtractor.Frame> frameFutureSecondItem =
248+
frameExtractor.getFrame(/* positionMs= */ 0);
249+
frameSecondItem = frameFutureSecondItem.get(TIMEOUT_SECONDS, SECONDS);
250+
}
251+
252+
assertThat(frameFirstItem.presentationTimeMs).isEqualTo(0);
253+
assertThat(frameSecondItem.presentationTimeMs).isEqualTo(0);
254+
}
221255
}

libraries/inspector/src/main/java/androidx/media3/inspector/FrameExtractorInternal.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,11 @@ public ListenableFuture<FrameExtractor.Frame> submitTask(FrameExtractionRequest
233233
() -> {
234234
boolean needsNewPlayer =
235235
player == null
236+
// TODO: b/457376636 - reuse player when switching between HDR and SDR, after the
237+
// video processing pipeline is updated.
238+
|| currentExtractHdrFrames
239+
|| request.extractHdrFrames
236240
|| request.mediaCodecSelector != currentMediaCodecSelector
237-
|| request.extractHdrFrames != currentExtractHdrFrames
238241
|| request.glObjectsProvider != currentGlObjectsProvider;
239242

240243
boolean needsPrepare =

0 commit comments

Comments
 (0)