|
36 | 36 | import android.graphics.BitmapFactory; |
37 | 37 | import android.graphics.ColorSpace; |
38 | 38 | import androidx.media3.common.MediaItem; |
| 39 | +import androidx.media3.exoplayer.mediacodec.MediaCodecSelector; |
39 | 40 | import androidx.media3.inspector.FrameExtractor; |
40 | 41 | import androidx.test.core.app.ApplicationProvider; |
41 | 42 | import androidx.test.ext.junit.runners.AndroidJUnit4; |
@@ -218,4 +219,37 @@ public void extractFrame_oneFrameHlgWithHdrDisplayUnsupported_returnsSdrFrame() |
218 | 219 | assertThat(frameSecondItem.presentationTimeMs).isEqualTo(0); |
219 | 220 | assertBitmapsAreSimilar(expectedBitmapSecondItem, actualBitmapSecondItem, PSNR_THRESHOLD); |
220 | 221 | } |
| 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 | + } |
221 | 255 | } |
0 commit comments