Signal assetloader output format in image case
the output format conatins key information about the output of the assetloader being hdr, so we must signal the output format, not the input format to the sample exporter fixes mh ultraHdr test failures. Also discovered images created are very device specfic so got rid of the pixel tests, we have pixel tests in the effects library that cover the same case. PiperOrigin-RevId: 619899249
This commit is contained in:
parent
b60cd2c033
commit
272fada10e
@ -48,7 +48,7 @@ import org.junit.runner.RunWith;
|
|||||||
/**
|
/**
|
||||||
* Tests for Ultra HDR support in Transformer that can run on an emulator.
|
* Tests for Ultra HDR support in Transformer that can run on an emulator.
|
||||||
*
|
*
|
||||||
* <p>See {@code TransformerMhUltraHdrPixelTest} for other UltraHdr tests.
|
* <p>See {@code TransformerMhUltraHdrTest} for other UltraHdr tests.
|
||||||
*/
|
*/
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public final class TransformerUltraHdrTest {
|
public final class TransformerUltraHdrTest {
|
||||||
|
@ -17,29 +17,21 @@
|
|||||||
|
|
||||||
package androidx.media3.transformer.mh;
|
package androidx.media3.transformer.mh;
|
||||||
|
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_LUMA;
|
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.getBitmapAveragePixelAbsoluteDifferenceFp16;
|
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.maybeSaveTestBitmap;
|
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
|
||||||
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.ULTRA_HDR_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.ULTRA_HDR_URI_STRING;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.extractBitmapsFromVideo;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
||||||
import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL;
|
import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL;
|
||||||
import static androidx.media3.transformer.SequenceEffectTestUtil.NO_EFFECT;
|
import static androidx.media3.transformer.SequenceEffectTestUtil.NO_EFFECT;
|
||||||
import static androidx.media3.transformer.SequenceEffectTestUtil.clippedVideo;
|
import static androidx.media3.transformer.SequenceEffectTestUtil.clippedVideo;
|
||||||
import static androidx.media3.transformer.SequenceEffectTestUtil.createComposition;
|
import static androidx.media3.transformer.SequenceEffectTestUtil.createComposition;
|
||||||
import static androidx.media3.transformer.SequenceEffectTestUtil.oneFrameFromImage;
|
import static androidx.media3.transformer.SequenceEffectTestUtil.oneFrameFromImage;
|
||||||
|
import static androidx.media3.transformer.mh.HdrCapabilitiesUtil.assumeDeviceSupportsOpenGlToneMapping;
|
||||||
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static com.google.common.truth.Truth.assertWithMessage;
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.Bitmap.Config;
|
|
||||||
import androidx.annotation.RequiresApi;
|
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
import androidx.media3.common.ColorInfo;
|
import androidx.media3.common.ColorInfo;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
@ -54,7 +46,6 @@ import androidx.media3.transformer.TransformerAndroidTestRunner;
|
|||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.junit.AssumptionViolatedException;
|
import org.junit.AssumptionViolatedException;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@ -65,11 +56,9 @@ import org.junit.runner.RunWith;
|
|||||||
|
|
||||||
/** Tests for Ultra HDR support in Transformer that should only run in mobile harness. */
|
/** Tests for Ultra HDR support in Transformer that should only run in mobile harness. */
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public final class TransformerMhUltraHdrPixelTest {
|
public final class TransformerMhUltraHdrTest {
|
||||||
|
|
||||||
private static final int ONE_FRAME_END_POSITION_MS = 30;
|
private static final int ONE_FRAME_END_POSITION_MS = 30;
|
||||||
private static final String PNG_ASSET_BASE_PATH =
|
|
||||||
"test-generated-goldens/TransformerUltraHdrPixelTest";
|
|
||||||
|
|
||||||
@Rule public final TestName testName = new TestName();
|
@Rule public final TestName testName = new TestName();
|
||||||
private final Context context = ApplicationProvider.getApplicationContext();
|
private final Context context = ApplicationProvider.getApplicationContext();
|
||||||
@ -99,8 +88,6 @@ public final class TransformerMhUltraHdrPixelTest {
|
|||||||
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
|
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
|
||||||
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
|
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
|
||||||
assertThat(colorInfo.colorTransfer).isEqualTo(C.COLOR_TRANSFER_HLG);
|
assertThat(colorInfo.colorTransfer).isEqualTo(C.COLOR_TRANSFER_HLG);
|
||||||
assertFp16BitmapsMatchExpectedAndSave(
|
|
||||||
extractBitmapsFromVideo(context, result.filePath, Config.RGBA_F16), testId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -122,8 +109,6 @@ public final class TransformerMhUltraHdrPixelTest {
|
|||||||
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
|
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
|
||||||
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
|
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
|
||||||
assertThat(colorInfo.colorTransfer).isEqualTo(C.COLOR_TRANSFER_HLG);
|
assertThat(colorInfo.colorTransfer).isEqualTo(C.COLOR_TRANSFER_HLG);
|
||||||
assertFp16BitmapsMatchExpectedAndSave(
|
|
||||||
extractBitmapsFromVideo(context, result.filePath, Config.RGBA_F16), testId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -149,6 +134,7 @@ public final class TransformerMhUltraHdrPixelTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void exportTonemappedHdrVideoThenUltraHdrImage_exportsSdr() throws Exception {
|
public void exportTonemappedHdrVideoThenUltraHdrImage_exportsSdr() throws Exception {
|
||||||
|
assumeDeviceSupportsOpenGlToneMapping(testId, MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createUltraHdrComposition(
|
createUltraHdrComposition(
|
||||||
/* tonemap= */ true,
|
/* tonemap= */ true,
|
||||||
@ -167,27 +153,6 @@ public final class TransformerMhUltraHdrPixelTest {
|
|||||||
assertThat(colorInfo.colorTransfer).isEqualTo(C.COLOR_TRANSFER_SDR);
|
assertThat(colorInfo.colorTransfer).isEqualTo(C.COLOR_TRANSFER_SDR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiresApi(29) // getBitmapAveragePixelAbsoluteDifferenceFp16()
|
|
||||||
public static void assertFp16BitmapsMatchExpectedAndSave(
|
|
||||||
List<Bitmap> actualBitmaps, String testId) throws IOException {
|
|
||||||
for (int i = 0; i < actualBitmaps.size(); i++) {
|
|
||||||
maybeSaveTestBitmap(
|
|
||||||
testId, /* bitmapLabel= */ String.valueOf(i), actualBitmaps.get(i), /* path= */ null);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < actualBitmaps.size(); i++) {
|
|
||||||
String subTestId = testId + "_" + i;
|
|
||||||
String expectedPath = Util.formatInvariant("%s/%s.png", PNG_ASSET_BASE_PATH, subTestId);
|
|
||||||
Bitmap expectedBitmap = readBitmap(expectedPath);
|
|
||||||
|
|
||||||
float averagePixelAbsoluteDifference =
|
|
||||||
getBitmapAveragePixelAbsoluteDifferenceFp16(expectedBitmap, actualBitmaps.get(i));
|
|
||||||
assertWithMessage("For expected bitmap " + expectedPath)
|
|
||||||
.that(averagePixelAbsoluteDifference)
|
|
||||||
.isAtMost(MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_LUMA);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Composition createUltraHdrComposition(
|
private static Composition createUltraHdrComposition(
|
||||||
boolean tonemap, EditedMediaItem editedMediaItem, EditedMediaItem... editedMediaItems) {
|
boolean tonemap, EditedMediaItem editedMediaItem, EditedMediaItem... editedMediaItems) {
|
||||||
Composition.Builder builder =
|
Composition.Builder builder =
|
@ -703,7 +703,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
|||||||
firstAssetLoaderInputFormat.buildUpon().setColorInfo(decoderOutputColor).build();
|
firstAssetLoaderInputFormat.buildUpon().setColorInfo(decoderOutputColor).build();
|
||||||
} else if (MimeTypes.isImage(assetLoaderOutputFormat.sampleMimeType)) {
|
} else if (MimeTypes.isImage(assetLoaderOutputFormat.sampleMimeType)) {
|
||||||
firstFormat =
|
firstFormat =
|
||||||
firstAssetLoaderInputFormat
|
assetLoaderOutputFormat
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setColorInfo(getValidColor(assetLoaderOutputFormat.colorInfo))
|
.setColorInfo(getValidColor(assetLoaderOutputFormat.colorInfo))
|
||||||
.build();
|
.build();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user