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:
tofunmi 2024-03-28 05:52:57 -07:00 committed by Copybara-Service
parent b60cd2c033
commit 272fada10e
3 changed files with 5 additions and 40 deletions

View File

@ -48,7 +48,7 @@ import org.junit.runner.RunWith;
/**
* 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)
public final class TransformerUltraHdrTest {

View File

@ -17,29 +17,21 @@
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.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.ULTRA_HDR_URI_STRING;
import static androidx.media3.transformer.AndroidTestUtil.extractBitmapsFromVideo;
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.SequenceEffectTestUtil.NO_EFFECT;
import static androidx.media3.transformer.SequenceEffectTestUtil.clippedVideo;
import static androidx.media3.transformer.SequenceEffectTestUtil.createComposition;
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 com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
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.ColorInfo;
import androidx.media3.common.util.Util;
@ -54,7 +46,6 @@ import androidx.media3.transformer.TransformerAndroidTestRunner;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.io.IOException;
import java.util.List;
import org.json.JSONException;
import org.junit.AssumptionViolatedException;
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. */
@RunWith(AndroidJUnit4.class)
public final class TransformerMhUltraHdrPixelTest {
public final class TransformerMhUltraHdrTest {
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();
private final Context context = ApplicationProvider.getApplicationContext();
@ -99,8 +88,6 @@ public final class TransformerMhUltraHdrPixelTest {
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
assertThat(colorInfo.colorTransfer).isEqualTo(C.COLOR_TRANSFER_HLG);
assertFp16BitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, result.filePath, Config.RGBA_F16), testId);
}
@Test
@ -122,8 +109,6 @@ public final class TransformerMhUltraHdrPixelTest {
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
assertThat(colorInfo.colorTransfer).isEqualTo(C.COLOR_TRANSFER_HLG);
assertFp16BitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, result.filePath, Config.RGBA_F16), testId);
}
@Test
@ -149,6 +134,7 @@ public final class TransformerMhUltraHdrPixelTest {
@Test
public void exportTonemappedHdrVideoThenUltraHdrImage_exportsSdr() throws Exception {
assumeDeviceSupportsOpenGlToneMapping(testId, MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
Composition composition =
createUltraHdrComposition(
/* tonemap= */ true,
@ -167,27 +153,6 @@ public final class TransformerMhUltraHdrPixelTest {
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(
boolean tonemap, EditedMediaItem editedMediaItem, EditedMediaItem... editedMediaItems) {
Composition.Builder builder =

View File

@ -703,7 +703,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
firstAssetLoaderInputFormat.buildUpon().setColorInfo(decoderOutputColor).build();
} else if (MimeTypes.isImage(assetLoaderOutputFormat.sampleMimeType)) {
firstFormat =
firstAssetLoaderInputFormat
assetLoaderOutputFormat
.buildUpon()
.setColorInfo(getValidColor(assetLoaderOutputFormat.colorInfo))
.build();