diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/DefaultVideoFrameProcessorTextureOutputPixelTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/DefaultVideoFrameProcessorTextureOutputPixelTest.java index d8afa0a52c..17b2e43ea5 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/DefaultVideoFrameProcessorTextureOutputPixelTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/DefaultVideoFrameProcessorTextureOutputPixelTest.java @@ -26,7 +26,7 @@ import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECO import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10_FORMAT; import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT; import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped; -import static androidx.media3.transformer.EncoderUtil.getSupportedEncodersForHdrEditing; +import static androidx.media3.transformer.mh.HdrCapabilitiesUtil.assumeDeviceSupportsHdrEditing; import static androidx.media3.transformer.mh.UnoptimizedGlEffect.NO_OP_EFFECT; import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static com.google.common.truth.Truth.assertThat; @@ -230,7 +230,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { public void noEffects_hlg10Input_matchesGoldenFile() throws Exception { Context context = getApplicationContext(); Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT; - assumeDeviceSupportsHdrEditing(format); + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { return; @@ -258,7 +258,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { public void noEffects_hlg10TextureInput_matchesGoldenFile() throws Exception { Context context = getApplicationContext(); Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT; - assumeDeviceSupportsHdrEditing(format); + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { return; @@ -288,7 +288,10 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { @Test public void noEffects_hlg10UltraHDRImageInput_matchesGoldenFile() throws Exception { - assumeDeviceSupportsHdrEditing(MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT); + assumeDeviceSupportsHdrEditing( + testId, + MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT.sampleMimeType, + MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT.colorInfo); assumeDeviceSupportsUltraHdrEditing(); ColorInfo outputColorInfo = new ColorInfo.Builder() @@ -323,7 +326,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { public void noEffects_hdr10Input_matchesGoldenFile() throws Exception { Context context = getApplicationContext(); Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT; - assumeDeviceSupportsHdrEditing(format); + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { return; @@ -351,7 +354,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { public void noEffects_hdr10TextureInput_matchesGoldenFile() throws Exception { Context context = getApplicationContext(); Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT; - assumeDeviceSupportsHdrEditing(format); + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { return; @@ -381,7 +384,10 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { @Test public void noEffects_hdr10UltraHDRImageInput_matchesGoldenFile() throws Exception { - assumeDeviceSupportsHdrEditing(MP4_ASSET_720P_4_SECOND_HDR10_FORMAT); + assumeDeviceSupportsHdrEditing( + testId, + MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.sampleMimeType, + MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.colorInfo); assumeDeviceSupportsUltraHdrEditing(); ColorInfo outputColorInfo = new ColorInfo.Builder() @@ -416,7 +422,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { public void noOpEffect_hlg10Input_matchesGoldenFile() throws Exception { Context context = getApplicationContext(); Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT; - assumeDeviceSupportsHdrEditing(format); + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { return; @@ -445,7 +451,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { public void noOpEffect_hlg10TextureInput_matchesGoldenFile() throws Exception { Context context = getApplicationContext(); Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT; - assumeDeviceSupportsHdrEditing(format); + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { return; @@ -475,7 +481,10 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { @Test public void noOpEffect_hlg10UltraHDRImageInput_matchesGoldenFile() throws Exception { - assumeDeviceSupportsHdrEditing(MP4_ASSET_720P_4_SECOND_HDR10_FORMAT); + assumeDeviceSupportsHdrEditing( + testId, + MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.sampleMimeType, + MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.colorInfo); assumeDeviceSupportsUltraHdrEditing(); ColorInfo outputColorInfo = new ColorInfo.Builder() @@ -511,7 +520,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { public void noOpEffect_hdr10Input_matchesGoldenFile() throws Exception { Context context = getApplicationContext(); Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT; - assumeDeviceSupportsHdrEditing(format); + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { return; @@ -540,7 +549,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { public void noOpEffect_hdr10TextureInput_matchesGoldenFile() throws Exception { Context context = getApplicationContext(); Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT; - assumeDeviceSupportsHdrEditing(format); + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { return; @@ -570,7 +579,10 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { @Test public void noOpEffect_hdr10UltraHDRImageInput_matchesGoldenFile() throws Exception { - assumeDeviceSupportsHdrEditing(MP4_ASSET_720P_4_SECOND_HDR10_FORMAT); + assumeDeviceSupportsHdrEditing( + testId, + MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.sampleMimeType, + MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.colorInfo); assumeDeviceSupportsUltraHdrEditing(); ColorInfo outputColorInfo = new ColorInfo.Builder() @@ -694,17 +706,6 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest { .setBitmapReader(textureBitmapReader); } - private void assumeDeviceSupportsHdrEditing(Format format) throws JSONException, IOException { - if (getSupportedEncodersForHdrEditing(format.sampleMimeType, format.colorInfo).isEmpty()) { - String skipReason = - format.colorInfo.colorTransfer == C.COLOR_TRANSFER_HLG - ? "No HLG editing support." - : "No PQ editing support."; - recordTestSkipped(getApplicationContext(), testId, skipReason); - throw new AssumptionViolatedException(skipReason); - } - } - private void assumeDeviceSupportsUltraHdrEditing() throws JSONException, IOException { if (Util.SDK_INT < 34) { recordTestSkipped( diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrCapabilitiesUtil.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrCapabilitiesUtil.java index c506599d3a..6abbd437cc 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrCapabilitiesUtil.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrCapabilitiesUtil.java @@ -15,17 +15,21 @@ */ package androidx.media3.transformer.mh; +import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped; import static androidx.media3.transformer.AndroidTestUtil.skipAndLogIfFormatsUnsupported; import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import android.content.Context; +import androidx.media3.common.ColorInfo; import androidx.media3.common.Format; import androidx.media3.common.util.GlUtil; import androidx.media3.common.util.Util; import androidx.media3.exoplayer.mediacodec.MediaCodecUtil; +import androidx.media3.transformer.EncoderUtil; import java.io.IOException; import org.json.JSONException; +import org.junit.AssumptionViolatedException; /** Utility class for checking HDR capabilities. */ public final class HdrCapabilitiesUtil { @@ -56,5 +60,20 @@ public final class HdrCapabilitiesUtil { return false; } + /** + * Assumes that the device supports HDR editing for the given {@code colorInfo}. + * + * @throws AssumptionViolatedException if the device does not support HDR editing. + */ + public static void assumeDeviceSupportsHdrEditing( + String testId, String mimeType, ColorInfo colorInfo) throws JSONException, IOException { + checkState(ColorInfo.isTransferHdr(colorInfo)); + if (EncoderUtil.getSupportedEncodersForHdrEditing(mimeType, colorInfo).isEmpty()) { + String skipReason = "No HDR editing support for " + colorInfo; + recordTestSkipped(getApplicationContext(), testId, skipReason); + throw new AssumptionViolatedException(skipReason); + } + } + private HdrCapabilitiesUtil() {} } diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java index 908cf0ec7e..23e6977b49 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/HdrEditingTest.java @@ -15,8 +15,6 @@ */ package androidx.media3.transformer.mh; -import static androidx.media3.common.MimeTypes.VIDEO_H265; -import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat; import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS; import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10; @@ -28,19 +26,18 @@ import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped; import static androidx.media3.transformer.Composition.HDR_MODE_KEEP_HDR; import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL; +import static androidx.media3.transformer.mh.HdrCapabilitiesUtil.assumeDeviceSupportsHdrEditing; import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.net.Uri; import androidx.media3.common.C; -import androidx.media3.common.ColorInfo; import androidx.media3.common.Format; import androidx.media3.common.MediaItem; import androidx.media3.common.util.Util; import androidx.media3.transformer.AndroidTestUtil; import androidx.media3.transformer.Composition; import androidx.media3.transformer.EditedMediaItem; -import androidx.media3.transformer.EncoderUtil; import androidx.media3.transformer.ExportException; import androidx.media3.transformer.ExportTestResult; import androidx.media3.transformer.TransformationRequest; @@ -143,10 +140,7 @@ public final class HdrEditingTest { public void exportAndTranscode_hdr10File_whenHdrEditingIsSupported() throws Exception { Context context = ApplicationProvider.getApplicationContext(); Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT; - if (!deviceSupportsHdrEditing(VIDEO_H265, format.colorInfo)) { - recordTestSkipped(context, testId, /* reason= */ "Device lacks HDR10 editing support."); - return; - } + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ format)) { @@ -174,10 +168,7 @@ public final class HdrEditingTest { public void exportAndTranscode_hlg10File_whenHdrEditingIsSupported() throws Exception { Context context = ApplicationProvider.getApplicationContext(); Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT; - if (!deviceSupportsHdrEditing(VIDEO_H265, format.colorInfo)) { - recordTestSkipped(context, testId, /* reason= */ "Device lacks HLG10 editing support."); - return; - } + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ format)) { @@ -205,10 +196,7 @@ public final class HdrEditingTest { public void exportAndTranscode_dolbyVisionFile_whenHdrEditingIsSupported() throws Exception { Context context = ApplicationProvider.getApplicationContext(); Format format = MP4_ASSET_DOLBY_VISION_HDR_FORMAT; - if (!deviceSupportsHdrEditing(VIDEO_H265, format.colorInfo)) { - recordTestSkipped(context, testId, /* reason= */ "Device lacks HLG10 editing support."); - return; - } + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ format)) { @@ -237,10 +225,7 @@ public final class HdrEditingTest { throws Exception { Context context = ApplicationProvider.getApplicationContext(); Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT; - if (deviceSupportsHdrEditing(VIDEO_H265, format.colorInfo)) { - recordTestSkipped(context, testId, /* reason= */ "Device supports HDR10 editing."); - return; - } + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { @@ -302,10 +287,7 @@ public final class HdrEditingTest { throws Exception { Context context = ApplicationProvider.getApplicationContext(); Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT; - if (deviceSupportsHdrEditing(VIDEO_H265, format.colorInfo)) { - recordTestSkipped(context, testId, /* reason= */ "Device supports HLG10 editing."); - return; - } + assumeDeviceSupportsHdrEditing(testId, format.sampleMimeType, format.colorInfo); if (AndroidTestUtil.skipAndLogIfFormatsUnsupported( context, testId, /* inputFormat= */ format, /* outputFormat= */ null)) { @@ -359,9 +341,4 @@ public final class HdrEditingTest { throw exception; } } - - private static boolean deviceSupportsHdrEditing(String mimeType, ColorInfo colorInfo) { - checkState(ColorInfo.isTransferHdr(colorInfo)); - return !EncoderUtil.getSupportedEncodersForHdrEditing(mimeType, colorInfo).isEmpty(); - } } diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformerSequenceEffectTestWithHdr.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformerSequenceEffectTestWithHdr.java index c1f91dbd78..928189256d 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformerSequenceEffectTestWithHdr.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/TransformerSequenceEffectTestWithHdr.java @@ -28,14 +28,13 @@ import static androidx.media3.transformer.SequenceEffectTestUtil.SINGLE_30_FPS_V import static androidx.media3.transformer.SequenceEffectTestUtil.assertBitmapsMatchExpectedAndSave; import static androidx.media3.transformer.SequenceEffectTestUtil.clippedVideo; import static androidx.media3.transformer.SequenceEffectTestUtil.createComposition; +import static androidx.media3.transformer.mh.HdrCapabilitiesUtil.assumeDeviceSupportsHdrEditing; import static androidx.media3.transformer.mh.HdrCapabilitiesUtil.skipAndLogIfOpenGlToneMappingUnsupported; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assume.assumeFalse; -import static org.junit.Assume.assumeTrue; import android.content.Context; import androidx.annotation.Nullable; -import androidx.media3.common.ColorInfo; import androidx.media3.common.Effect; import androidx.media3.common.MediaItem; import androidx.media3.effect.Presentation; @@ -43,7 +42,6 @@ import androidx.media3.effect.RgbFilter; import androidx.media3.effect.ScaleAndRotateTransformation; import androidx.media3.transformer.Composition; import androidx.media3.transformer.EditedMediaItemSequence; -import androidx.media3.transformer.EncoderUtil; import androidx.media3.transformer.ExportException; import androidx.media3.transformer.ExportTestResult; import androidx.media3.transformer.Transformer; @@ -119,10 +117,8 @@ public final class TransformerSequenceEffectTestWithHdr { @Test @RequiresNonNull("testId") public void export_withHdrThenSdr_throws_whenHdrEditingSupported() throws Exception { - assumeTrue( - "Device does not support HDR10 editing.", - deviceSupportsHdrEditing( - VIDEO_H265, checkNotNull(MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.colorInfo))); + assumeDeviceSupportsHdrEditing( + testId, VIDEO_H265, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.colorInfo); assumeFalse( skipAndLogIfFormatsUnsupported( context, @@ -162,10 +158,8 @@ public final class TransformerSequenceEffectTestWithHdr { @Test @RequiresNonNull("testId") public void export_withHdrThenSdr_whenHdrEditingUnsupported() throws Exception { - assumeFalse( - "Device supports HDR10 editing.", - deviceSupportsHdrEditing( - VIDEO_H265, checkNotNull(MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.colorInfo))); + assumeDeviceSupportsHdrEditing( + testId, VIDEO_H265, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT.colorInfo); assumeFalse( skipAndLogIfOpenGlToneMappingUnsupported( testId, /* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT)); @@ -199,8 +193,4 @@ public final class TransformerSequenceEffectTestWithHdr { assertBitmapsMatchExpectedAndSave( extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); } - - private static boolean deviceSupportsHdrEditing(String mimeType, ColorInfo colorInfo) { - return !EncoderUtil.getSupportedEncodersForHdrEditing(mimeType, colorInfo).isEmpty(); - } }