Commit 79cc8a59 by huangdarwin Committed by microkatz

HDR: Use HdrMode IntDef to select HDR output mode.

This is a simpler API to use than the prior tone mapping, HDR editing, and
forceInterpretHdrAsSdr options

PiperOrigin-RevId: 488742391
parent 8438daca
Showing with 106 additions and 112 deletions
...@@ -40,10 +40,12 @@ import androidx.appcompat.app.AlertDialog; ...@@ -40,10 +40,12 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.transformer.TransformationRequest;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import com.google.android.material.slider.RangeSlider; import com.google.android.material.slider.RangeSlider;
import com.google.android.material.slider.Slider; import com.google.android.material.slider.Slider;
import com.google.common.collect.ImmutableMap;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
...@@ -67,8 +69,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -67,8 +69,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
public static final String TRIM_END_MS = "trim_end_ms"; public static final String TRIM_END_MS = "trim_end_ms";
public static final String ENABLE_FALLBACK = "enable_fallback"; public static final String ENABLE_FALLBACK = "enable_fallback";
public static final String ENABLE_DEBUG_PREVIEW = "enable_debug_preview"; public static final String ENABLE_DEBUG_PREVIEW = "enable_debug_preview";
public static final String ENABLE_REQUEST_SDR_TONE_MAPPING = "enable_request_sdr_tone_mapping"; public static final String HDR_MODE = "hdr_mode";
public static final String FORCE_INTERPRET_HDR_VIDEO_AS_SDR = "force_interpret_hdr_video_as_sdr";
public static final String DEMO_EFFECTS_SELECTIONS = "demo_effects_selections"; public static final String DEMO_EFFECTS_SELECTIONS = "demo_effects_selections";
public static final String PERIODIC_VIGNETTE_CENTER_X = "periodic_vignette_center_x"; public static final String PERIODIC_VIGNETTE_CENTER_X = "periodic_vignette_center_x";
public static final String PERIODIC_VIGNETTE_CENTER_Y = "periodic_vignette_center_y"; public static final String PERIODIC_VIGNETTE_CENTER_Y = "periodic_vignette_center_y";
...@@ -131,12 +132,21 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -131,12 +132,21 @@ public final class ConfigurationActivity extends AppCompatActivity {
"Overlay logo & timer", "Overlay logo & timer",
"Zoom in start", "Zoom in start",
}; };
private static final ImmutableMap<String, @TransformationRequest.HdrMode Integer>
HDR_MODE_DESCRIPTIONS =
new ImmutableMap.Builder<String, @TransformationRequest.HdrMode Integer>()
.put("Keep HDR", TransformationRequest.HDR_MODE_KEEP_HDR)
.put("Tone-map HDR to SDR", TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
.put(
"Force Interpret HDR as SDR",
TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR)
.build();
private static final String SAME_AS_INPUT_OPTION = "same as input";
private static final int COLOR_FILTERS_INDEX = 2; private static final int COLOR_FILTERS_INDEX = 2;
private static final int RGB_ADJUSTMENTS_INDEX = 4; private static final int RGB_ADJUSTMENTS_INDEX = 4;
private static final int HSL_ADJUSTMENT_INDEX = 5; private static final int HSL_ADJUSTMENT_INDEX = 5;
private static final int CONTRAST_INDEX = 6; private static final int CONTRAST_INDEX = 6;
private static final int PERIODIC_VIGNETTE_INDEX = 7; private static final int PERIODIC_VIGNETTE_INDEX = 7;
private static final String SAME_AS_INPUT_OPTION = "same as input";
private static final float HALF_DIAGONAL = 1f / (float) Math.sqrt(2); private static final float HALF_DIAGONAL = 1f / (float) Math.sqrt(2);
private @MonotonicNonNull ActivityResultLauncher<Intent> localFilePickerLauncher; private @MonotonicNonNull ActivityResultLauncher<Intent> localFilePickerLauncher;
...@@ -154,8 +164,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -154,8 +164,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
private @MonotonicNonNull CheckBox trimCheckBox; private @MonotonicNonNull CheckBox trimCheckBox;
private @MonotonicNonNull CheckBox enableFallbackCheckBox; private @MonotonicNonNull CheckBox enableFallbackCheckBox;
private @MonotonicNonNull CheckBox enableDebugPreviewCheckBox; private @MonotonicNonNull CheckBox enableDebugPreviewCheckBox;
private @MonotonicNonNull CheckBox enableRequestSdrToneMappingCheckBox; private @MonotonicNonNull Spinner hdrModeSpinner;
private @MonotonicNonNull CheckBox forceInterpretHdrVideoAsSdrCheckBox;
private @MonotonicNonNull Button selectDemoEffectsButton; private @MonotonicNonNull Button selectDemoEffectsButton;
private boolean @MonotonicNonNull [] demoEffectsSelections; private boolean @MonotonicNonNull [] demoEffectsSelections;
private @Nullable Uri localFileUri; private @Nullable Uri localFileUri;
...@@ -247,11 +256,13 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -247,11 +256,13 @@ public final class ConfigurationActivity extends AppCompatActivity {
enableFallbackCheckBox = findViewById(R.id.enable_fallback_checkbox); enableFallbackCheckBox = findViewById(R.id.enable_fallback_checkbox);
enableDebugPreviewCheckBox = findViewById(R.id.enable_debug_preview_checkbox); enableDebugPreviewCheckBox = findViewById(R.id.enable_debug_preview_checkbox);
enableRequestSdrToneMappingCheckBox = findViewById(R.id.request_sdr_tone_mapping_checkbox);
enableRequestSdrToneMappingCheckBox.setEnabled(isRequestSdrToneMappingSupported()); ArrayAdapter<String> hdrModeAdapter =
findViewById(R.id.request_sdr_tone_mapping).setEnabled(isRequestSdrToneMappingSupported()); new ArrayAdapter<>(/* context= */ this, R.layout.spinner_item);
forceInterpretHdrVideoAsSdrCheckBox = hdrModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
findViewById(R.id.force_interpret_hdr_video_as_sdr_checkbox); hdrModeSpinner = findViewById(R.id.hdr_mode_spinner);
hdrModeSpinner.setAdapter(hdrModeAdapter);
hdrModeAdapter.addAll(HDR_MODE_DESCRIPTIONS.keySet());
demoEffectsSelections = new boolean[DEMO_EFFECTS.length]; demoEffectsSelections = new boolean[DEMO_EFFECTS.length];
selectDemoEffectsButton = findViewById(R.id.select_demo_effects_button); selectDemoEffectsButton = findViewById(R.id.select_demo_effects_button);
...@@ -308,8 +319,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -308,8 +319,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
"trimCheckBox", "trimCheckBox",
"enableFallbackCheckBox", "enableFallbackCheckBox",
"enableDebugPreviewCheckBox", "enableDebugPreviewCheckBox",
"enableRequestSdrToneMappingCheckBox", "hdrModeSpinner",
"forceInterpretHdrVideoAsSdrCheckBox",
"demoEffectsSelections" "demoEffectsSelections"
}) })
private void startTransformation(View view) { private void startTransformation(View view) {
...@@ -347,10 +357,8 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -347,10 +357,8 @@ public final class ConfigurationActivity extends AppCompatActivity {
} }
bundle.putBoolean(ENABLE_FALLBACK, enableFallbackCheckBox.isChecked()); bundle.putBoolean(ENABLE_FALLBACK, enableFallbackCheckBox.isChecked());
bundle.putBoolean(ENABLE_DEBUG_PREVIEW, enableDebugPreviewCheckBox.isChecked()); bundle.putBoolean(ENABLE_DEBUG_PREVIEW, enableDebugPreviewCheckBox.isChecked());
bundle.putBoolean( String selectedhdrMode = String.valueOf(hdrModeSpinner.getSelectedItem());
ENABLE_REQUEST_SDR_TONE_MAPPING, enableRequestSdrToneMappingCheckBox.isChecked()); bundle.putInt(HDR_MODE, checkNotNull(HDR_MODE_DESCRIPTIONS.get(selectedhdrMode)));
bundle.putBoolean(
FORCE_INTERPRET_HDR_VIDEO_AS_SDR, forceInterpretHdrVideoAsSdrCheckBox.isChecked());
bundle.putBooleanArray(DEMO_EFFECTS_SELECTIONS, demoEffectsSelections); bundle.putBooleanArray(DEMO_EFFECTS_SELECTIONS, demoEffectsSelections);
bundle.putInt(COLOR_FILTER_SELECTION, colorFilterSelection); bundle.putInt(COLOR_FILTER_SELECTION, colorFilterSelection);
bundle.putFloat(CONTRAST_VALUE, contrastValue); bundle.putFloat(CONTRAST_VALUE, contrastValue);
...@@ -588,8 +596,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -588,8 +596,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
"scaleSpinner", "scaleSpinner",
"rotateSpinner", "rotateSpinner",
"enableDebugPreviewCheckBox", "enableDebugPreviewCheckBox",
"enableRequestSdrToneMappingCheckBox", "hdrModeSpinner",
"forceInterpretHdrVideoAsSdrCheckBox",
"selectDemoEffectsButton" "selectDemoEffectsButton"
}) })
private void onRemoveAudio(View view) { private void onRemoveAudio(View view) {
...@@ -609,8 +616,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -609,8 +616,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
"scaleSpinner", "scaleSpinner",
"rotateSpinner", "rotateSpinner",
"enableDebugPreviewCheckBox", "enableDebugPreviewCheckBox",
"enableRequestSdrToneMappingCheckBox", "hdrModeSpinner",
"forceInterpretHdrVideoAsSdrCheckBox",
"selectDemoEffectsButton" "selectDemoEffectsButton"
}) })
private void onRemoveVideo(View view) { private void onRemoveVideo(View view) {
...@@ -629,8 +635,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -629,8 +635,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
"scaleSpinner", "scaleSpinner",
"rotateSpinner", "rotateSpinner",
"enableDebugPreviewCheckBox", "enableDebugPreviewCheckBox",
"enableRequestSdrToneMappingCheckBox", "hdrModeSpinner",
"forceInterpretHdrVideoAsSdrCheckBox",
"selectDemoEffectsButton" "selectDemoEffectsButton"
}) })
private void enableTrackSpecificOptions(boolean isAudioEnabled, boolean isVideoEnabled) { private void enableTrackSpecificOptions(boolean isAudioEnabled, boolean isVideoEnabled) {
...@@ -640,9 +645,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -640,9 +645,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
scaleSpinner.setEnabled(isVideoEnabled); scaleSpinner.setEnabled(isVideoEnabled);
rotateSpinner.setEnabled(isVideoEnabled); rotateSpinner.setEnabled(isVideoEnabled);
enableDebugPreviewCheckBox.setEnabled(isVideoEnabled); enableDebugPreviewCheckBox.setEnabled(isVideoEnabled);
enableRequestSdrToneMappingCheckBox.setEnabled( hdrModeSpinner.setEnabled(isVideoEnabled);
isRequestSdrToneMappingSupported() && isVideoEnabled);
forceInterpretHdrVideoAsSdrCheckBox.setEnabled(isVideoEnabled);
selectDemoEffectsButton.setEnabled(isVideoEnabled); selectDemoEffectsButton.setEnabled(isVideoEnabled);
findViewById(R.id.audio_mime_text_view).setEnabled(isAudioEnabled); findViewById(R.id.audio_mime_text_view).setEnabled(isAudioEnabled);
...@@ -650,12 +653,6 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -650,12 +653,6 @@ public final class ConfigurationActivity extends AppCompatActivity {
findViewById(R.id.resolution_height_text_view).setEnabled(isVideoEnabled); findViewById(R.id.resolution_height_text_view).setEnabled(isVideoEnabled);
findViewById(R.id.scale).setEnabled(isVideoEnabled); findViewById(R.id.scale).setEnabled(isVideoEnabled);
findViewById(R.id.rotate).setEnabled(isVideoEnabled); findViewById(R.id.rotate).setEnabled(isVideoEnabled);
findViewById(R.id.request_sdr_tone_mapping) findViewById(R.id.hdr_mode).setEnabled(isVideoEnabled);
.setEnabled(isRequestSdrToneMappingSupported() && isVideoEnabled);
findViewById(R.id.force_interpret_hdr_video_as_sdr).setEnabled(isVideoEnabled);
}
private static boolean isRequestSdrToneMappingSupported() {
return Util.SDK_INT >= 31;
} }
} }
...@@ -269,11 +269,7 @@ public final class TransformerActivity extends AppCompatActivity { ...@@ -269,11 +269,7 @@ public final class TransformerActivity extends AppCompatActivity {
float rotateDegrees = float rotateDegrees =
bundle.getFloat(ConfigurationActivity.ROTATE_DEGREES, /* defaultValue= */ 0); bundle.getFloat(ConfigurationActivity.ROTATE_DEGREES, /* defaultValue= */ 0);
requestBuilder.setRotationDegrees(rotateDegrees); requestBuilder.setRotationDegrees(rotateDegrees);
requestBuilder.setHdrMode(bundle.getInt(ConfigurationActivity.HDR_MODE));
requestBuilder.setEnableRequestSdrToneMapping(
bundle.getBoolean(ConfigurationActivity.ENABLE_REQUEST_SDR_TONE_MAPPING));
requestBuilder.experimental_setForceInterpretHdrVideoAsSdr(
bundle.getBoolean(ConfigurationActivity.FORCE_INTERPRET_HDR_VIDEO_AS_SDR));
transformerBuilder transformerBuilder
.setTransformationRequest(requestBuilder.build()) .setTransformationRequest(requestBuilder.build())
.setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO)) .setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO))
......
...@@ -198,24 +198,15 @@ ...@@ -198,24 +198,15 @@
android:checked="true"/> android:checked="true"/>
</TableRow> </TableRow>
<TableRow <TableRow
android:layout_weight="1"> android:layout_weight="1"
<TextView android:gravity="center_vertical" >
android:layout_gravity="center_vertical"
android:id="@+id/request_sdr_tone_mapping"
android:text="@string/request_sdr_tone_mapping" />
<CheckBox
android:id="@+id/request_sdr_tone_mapping_checkbox"
android:layout_gravity="end" />
</TableRow>
<TableRow
android:layout_weight="1">
<TextView <TextView
android:layout_gravity="center_vertical" android:id="@+id/hdr_mode"
android:id="@+id/force_interpret_hdr_video_as_sdr" android:text="@string/hdr_mode"/>
android:text="@string/force_interpret_hdr_video_as_sdr" /> <Spinner
<CheckBox android:id="@+id/hdr_mode_spinner"
android:id="@+id/force_interpret_hdr_video_as_sdr_checkbox" android:layout_gravity="right|center_vertical"
android:layout_gravity="end" /> android:gravity="right" />
</TableRow> </TableRow>
</TableLayout> </TableLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
......
...@@ -30,8 +30,7 @@ ...@@ -30,8 +30,7 @@
<string name="enable_fallback" translatable="false">Enable fallback</string> <string name="enable_fallback" translatable="false">Enable fallback</string>
<string name="enable_debug_preview" translatable="false">Enable debug preview</string> <string name="enable_debug_preview" translatable="false">Enable debug preview</string>
<string name="trim" translatable="false">Trim</string> <string name="trim" translatable="false">Trim</string>
<string name="request_sdr_tone_mapping" translatable="false">Request SDR tone-mapping (API 31+)</string> <string name="hdr_mode" translatable="false">HDR mode</string>
<string name="force_interpret_hdr_video_as_sdr" translatable="false">[Experimental] Force interpret HDR video as SDR (API 29+)</string>
<string name="select_demo_effects" translatable="false">Add demo effects</string> <string name="select_demo_effects" translatable="false">Add demo effects</string>
<string name="periodic_vignette_options" translatable="false">Periodic vignette options</string> <string name="periodic_vignette_options" translatable="false">Periodic vignette options</string>
<string name="no_media_pipe_error" translatable="false">Failed to load MediaPipe processor. Check the README for instructions.</string> <string name="no_media_pipe_error" translatable="false">Failed to load MediaPipe processor. Check the README for instructions.</string>
......
...@@ -397,10 +397,10 @@ public class TransformerAndroidTestRunner { ...@@ -397,10 +397,10 @@ public class TransformerAndroidTestRunner {
@Override @Override
public Codec createForVideoDecoding( public Codec createForVideoDecoding(
Format format, Surface outputSurface, boolean enableRequestSdrToneMapping) Format format, Surface outputSurface, boolean requestSdrToneMapping)
throws TransformationException { throws TransformationException {
Codec videoDecoder = Codec videoDecoder =
decoderFactory.createForVideoDecoding(format, outputSurface, enableRequestSdrToneMapping); decoderFactory.createForVideoDecoding(format, outputSurface, requestSdrToneMapping);
videoDecoderName = videoDecoder.getName(); videoDecoderName = videoDecoder.getName();
return videoDecoder; return videoDecoder;
} }
......
...@@ -39,11 +39,12 @@ import org.junit.runner.RunWith; ...@@ -39,11 +39,12 @@ import org.junit.runner.RunWith;
/** /**
* {@link Transformer} instrumentation test for {@linkplain * {@link Transformer} instrumentation test for {@linkplain
* TransformationRequest#forceInterpretHdrVideoAsSdr forcing HDR contents to be interpreted as SDR}. * TransformationRequest#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR forcing HDR contents to be
* interpreted as SDR}.
*/ */
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class SetForceInterpretHdrVideoAsSdrTest { public class ForceInterpretHdrVideoAsSdrTest {
public static final String TAG = "SetForceInterpretHdrVideoAsSdrTest"; public static final String TAG = "ForceInterpretHdrVideoAsSdrTest";
@Test @Test
public void forceInterpretHdrVideoAsSdrTest_hdr10File_transformsOrThrows() throws Exception { public void forceInterpretHdrVideoAsSdrTest_hdr10File_transformsOrThrows() throws Exception {
...@@ -62,7 +63,8 @@ public class SetForceInterpretHdrVideoAsSdrTest { ...@@ -62,7 +63,8 @@ public class SetForceInterpretHdrVideoAsSdrTest {
new Transformer.Builder(context) new Transformer.Builder(context)
.setTransformationRequest( .setTransformationRequest(
new TransformationRequest.Builder() new TransformationRequest.Builder()
.experimental_setForceInterpretHdrVideoAsSdr(true) .setHdrMode(
TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR)
.build()) .build())
.build(); .build();
try { try {
...@@ -97,7 +99,8 @@ public class SetForceInterpretHdrVideoAsSdrTest { ...@@ -97,7 +99,8 @@ public class SetForceInterpretHdrVideoAsSdrTest {
new Transformer.Builder(context) new Transformer.Builder(context)
.setTransformationRequest( .setTransformationRequest(
new TransformationRequest.Builder() new TransformationRequest.Builder()
.experimental_setForceInterpretHdrVideoAsSdr(true) .setHdrMode(
TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR)
.build()) .build())
.build(); .build();
try { try {
......
...@@ -43,10 +43,13 @@ import java.util.concurrent.atomic.AtomicBoolean; ...@@ -43,10 +43,13 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
/** {@link Transformer} instrumentation test for applying an HDR frame edit. */ /**
* {@link Transformer} instrumentation test for applying an {@linkplain
* TransformationRequest#HDR_MODE_KEEP_HDR HDR frame edit}.
*/
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class SetHdrEditingTest { public class HdrEditingTest {
public static final String TAG = "SetHdrEditingTest"; public static final String TAG = "HdrEditingTest";
private static final ColorInfo HDR10_DEFAULT_COLOR_INFO = private static final ColorInfo HDR10_DEFAULT_COLOR_INFO =
new ColorInfo( new ColorInfo(
C.COLOR_SPACE_BT2020, C.COLOR_SPACE_BT2020,
...@@ -176,9 +179,11 @@ public class SetHdrEditingTest { ...@@ -176,9 +179,11 @@ public class SetHdrEditingTest {
TransformationRequest originalTransformationRequest, TransformationRequest originalTransformationRequest,
TransformationRequest fallbackTransformationRequest) { TransformationRequest fallbackTransformationRequest) {
isFallbackListenerInvoked.set(true); isFallbackListenerInvoked.set(true);
assertThat(originalTransformationRequest.enableRequestSdrToneMapping).isFalse(); assertThat(originalTransformationRequest.hdrMode)
.isEqualTo(TransformationRequest.HDR_MODE_KEEP_HDR);
isToneMappingFallbackApplied.set( isToneMappingFallbackApplied.set(
fallbackTransformationRequest.enableRequestSdrToneMapping); fallbackTransformationRequest.hdrMode
== TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR);
} }
}) })
.build(); .build();
...@@ -227,9 +232,11 @@ public class SetHdrEditingTest { ...@@ -227,9 +232,11 @@ public class SetHdrEditingTest {
TransformationRequest originalTransformationRequest, TransformationRequest originalTransformationRequest,
TransformationRequest fallbackTransformationRequest) { TransformationRequest fallbackTransformationRequest) {
isFallbackListenerInvoked.set(true); isFallbackListenerInvoked.set(true);
assertThat(originalTransformationRequest.enableRequestSdrToneMapping).isFalse(); assertThat(originalTransformationRequest.hdrMode)
.isEqualTo(TransformationRequest.HDR_MODE_KEEP_HDR);
isToneMappingFallbackApplied.set( isToneMappingFallbackApplied.set(
fallbackTransformationRequest.enableRequestSdrToneMapping); fallbackTransformationRequest.hdrMode
== TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR);
} }
}) })
.build(); .build();
......
...@@ -38,11 +38,11 @@ import org.junit.runner.RunWith; ...@@ -38,11 +38,11 @@ import org.junit.runner.RunWith;
/** /**
* {@link Transformer} instrumentation test for applying an {@linkplain * {@link Transformer} instrumentation test for applying an {@linkplain
* TransformationRequest.Builder#setEnableRequestSdrToneMapping HDR to SDR tone mapping edit}. * TransformationRequest#HDR_MODE_TONE_MAP_HDR_TO_SDR HDR to SDR tone mapping edit}.
*/ */
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class SetHdrToSdrToneMapTest { public class HdrToSdrToneMapTest {
public static final String TAG = "SetHdrToSdrToneMapTest"; public static final String TAG = "HdrToSdrToneMapTest";
@Test @Test
public void transform_toneMapNoRequestedTranscode_hdr10File_toneMapsOrThrows() throws Exception { public void transform_toneMapNoRequestedTranscode_hdr10File_toneMapsOrThrows() throws Exception {
...@@ -52,7 +52,9 @@ public class SetHdrToSdrToneMapTest { ...@@ -52,7 +52,9 @@ public class SetHdrToSdrToneMapTest {
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
.setTransformationRequest( .setTransformationRequest(
new TransformationRequest.Builder().setEnableRequestSdrToneMapping(true).build()) new TransformationRequest.Builder()
.setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
.build())
.addListener( .addListener(
new Transformer.Listener() { new Transformer.Listener() {
@Override @Override
...@@ -62,8 +64,8 @@ public class SetHdrToSdrToneMapTest { ...@@ -62,8 +64,8 @@ public class SetHdrToSdrToneMapTest {
TransformationRequest fallbackTransformationRequest) { TransformationRequest fallbackTransformationRequest) {
// Tone mapping flag shouldn't change in fallback when tone mapping is // Tone mapping flag shouldn't change in fallback when tone mapping is
// requested. // requested.
assertThat(originalTransformationRequest.enableRequestSdrToneMapping) assertThat(originalTransformationRequest.hdrMode)
.isEqualTo(fallbackTransformationRequest.enableRequestSdrToneMapping); .isEqualTo(fallbackTransformationRequest.hdrMode);
} }
}) })
.build(); .build();
...@@ -95,7 +97,9 @@ public class SetHdrToSdrToneMapTest { ...@@ -95,7 +97,9 @@ public class SetHdrToSdrToneMapTest {
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
.setTransformationRequest( .setTransformationRequest(
new TransformationRequest.Builder().setEnableRequestSdrToneMapping(true).build()) new TransformationRequest.Builder()
.setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
.build())
.addListener( .addListener(
new Transformer.Listener() { new Transformer.Listener() {
@Override @Override
...@@ -105,8 +109,8 @@ public class SetHdrToSdrToneMapTest { ...@@ -105,8 +109,8 @@ public class SetHdrToSdrToneMapTest {
TransformationRequest fallbackTransformationRequest) { TransformationRequest fallbackTransformationRequest) {
// Tone mapping flag shouldn't change in fallback when tone mapping is // Tone mapping flag shouldn't change in fallback when tone mapping is
// requested. // requested.
assertThat(originalTransformationRequest.enableRequestSdrToneMapping) assertThat(originalTransformationRequest.hdrMode)
.isEqualTo(fallbackTransformationRequest.enableRequestSdrToneMapping); .isEqualTo(fallbackTransformationRequest.hdrMode);
} }
}) })
.build(); .build();
...@@ -139,7 +143,7 @@ public class SetHdrToSdrToneMapTest { ...@@ -139,7 +143,7 @@ public class SetHdrToSdrToneMapTest {
new Transformer.Builder(context) new Transformer.Builder(context)
.setTransformationRequest( .setTransformationRequest(
new TransformationRequest.Builder() new TransformationRequest.Builder()
.setEnableRequestSdrToneMapping(true) .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
.setRotationDegrees(180) .setRotationDegrees(180)
.build()) .build())
.addListener( .addListener(
...@@ -151,8 +155,8 @@ public class SetHdrToSdrToneMapTest { ...@@ -151,8 +155,8 @@ public class SetHdrToSdrToneMapTest {
TransformationRequest fallbackTransformationRequest) { TransformationRequest fallbackTransformationRequest) {
// Tone mapping flag shouldn't change in fallback when tone mapping is // Tone mapping flag shouldn't change in fallback when tone mapping is
// requested. // requested.
assertThat(originalTransformationRequest.enableRequestSdrToneMapping) assertThat(originalTransformationRequest.hdrMode)
.isEqualTo(fallbackTransformationRequest.enableRequestSdrToneMapping); .isEqualTo(fallbackTransformationRequest.hdrMode);
} }
}) })
.build(); .build();
...@@ -185,7 +189,7 @@ public class SetHdrToSdrToneMapTest { ...@@ -185,7 +189,7 @@ public class SetHdrToSdrToneMapTest {
new Transformer.Builder(context) new Transformer.Builder(context)
.setTransformationRequest( .setTransformationRequest(
new TransformationRequest.Builder() new TransformationRequest.Builder()
.setEnableRequestSdrToneMapping(true) .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
.setRotationDegrees(180) .setRotationDegrees(180)
.build()) .build())
.addListener( .addListener(
...@@ -197,8 +201,8 @@ public class SetHdrToSdrToneMapTest { ...@@ -197,8 +201,8 @@ public class SetHdrToSdrToneMapTest {
TransformationRequest fallbackTransformationRequest) { TransformationRequest fallbackTransformationRequest) {
// Tone mapping flag shouldn't change in fallback when tone mapping is // Tone mapping flag shouldn't change in fallback when tone mapping is
// requested. // requested.
assertThat(originalTransformationRequest.enableRequestSdrToneMapping) assertThat(originalTransformationRequest.hdrMode)
.isEqualTo(fallbackTransformationRequest.enableRequestSdrToneMapping); .isEqualTo(fallbackTransformationRequest.hdrMode);
} }
}) })
.build(); .build();
......
...@@ -55,12 +55,12 @@ public interface Codec { ...@@ -55,12 +55,12 @@ public interface Codec {
* @param format The {@link Format} (of the input data) used to determine the underlying decoder * @param format The {@link Format} (of the input data) used to determine the underlying decoder
* and its configuration values. * and its configuration values.
* @param outputSurface The {@link Surface} to which the decoder output is rendered. * @param outputSurface The {@link Surface} to which the decoder output is rendered.
* @param enableRequestSdrToneMapping Whether to request tone-mapping to SDR. * @param requestSdrToneMapping Whether to request tone-mapping to SDR.
* @return A {@link Codec} for video decoding. * @return A {@link Codec} for video decoding.
* @throws TransformationException If no suitable {@link Codec} can be created. * @throws TransformationException If no suitable {@link Codec} can be created.
*/ */
Codec createForVideoDecoding( Codec createForVideoDecoding(
Format format, Surface outputSurface, boolean enableRequestSdrToneMapping) Format format, Surface outputSurface, boolean requestSdrToneMapping)
throws TransformationException; throws TransformationException;
} }
......
...@@ -72,7 +72,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -72,7 +72,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@SuppressLint("InlinedApi") @SuppressLint("InlinedApi")
@Override @Override
public Codec createForVideoDecoding( public Codec createForVideoDecoding(
Format format, Surface outputSurface, boolean enableRequestSdrToneMapping) Format format, Surface outputSurface, boolean requestSdrToneMapping)
throws TransformationException { throws TransformationException {
MediaFormat mediaFormat = MediaFormat mediaFormat =
MediaFormat.createVideoFormat( MediaFormat.createVideoFormat(
...@@ -87,7 +87,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -87,7 +87,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
// transformer to decode as many frames as possible in one render cycle. // transformer to decode as many frames as possible in one render cycle.
mediaFormat.setInteger(MediaFormat.KEY_ALLOW_FRAME_DROP, 0); mediaFormat.setInteger(MediaFormat.KEY_ALLOW_FRAME_DROP, 0);
} }
if (SDK_INT >= 31 && enableRequestSdrToneMapping) { if (SDK_INT >= 31 && requestSdrToneMapping) {
mediaFormat.setInteger( mediaFormat.setInteger(
MediaFormat.KEY_COLOR_TRANSFER_REQUEST, MediaFormat.COLOR_TRANSFER_SDR_VIDEO); MediaFormat.KEY_COLOR_TRANSFER_REQUEST, MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
} }
......
...@@ -95,10 +95,8 @@ import com.google.android.exoplayer2.util.Util; ...@@ -95,10 +95,8 @@ import com.google.android.exoplayer2.util.Util;
if (transformationRequest.outputHeight != originalTransformationRequest.outputHeight) { if (transformationRequest.outputHeight != originalTransformationRequest.outputHeight) {
fallbackRequestBuilder.setResolution(transformationRequest.outputHeight); fallbackRequestBuilder.setResolution(transformationRequest.outputHeight);
} }
if (transformationRequest.enableRequestSdrToneMapping if (transformationRequest.hdrMode != originalTransformationRequest.hdrMode) {
!= originalTransformationRequest.enableRequestSdrToneMapping) { fallbackRequestBuilder.setHdrMode(transformationRequest.hdrMode);
fallbackRequestBuilder.setEnableRequestSdrToneMapping(
transformationRequest.enableRequestSdrToneMapping);
} }
fallbackTransformationRequest = fallbackRequestBuilder.build(); fallbackTransformationRequest = fallbackRequestBuilder.build();
......
...@@ -512,7 +512,7 @@ public final class Transformer { ...@@ -512,7 +512,7 @@ public final class Transformer {
* @param fallbackTransformationRequest The alternative {@link TransformationRequest}, with * @param fallbackTransformationRequest The alternative {@link TransformationRequest}, with
* supported {@link TransformationRequest#audioMimeType}, {@link * supported {@link TransformationRequest#audioMimeType}, {@link
* TransformationRequest#videoMimeType}, {@link TransformationRequest#outputHeight}, and * TransformationRequest#videoMimeType}, {@link TransformationRequest#outputHeight}, and
* {@link TransformationRequest#enableRequestSdrToneMapping} values set. * {@link TransformationRequest#hdrMode} values set.
*/ */
default void onFallbackApplied( default void onFallbackApplied(
MediaItem inputMediaItem, MediaItem inputMediaItem,
......
...@@ -289,10 +289,7 @@ import java.util.List; ...@@ -289,10 +289,7 @@ import java.util.List;
if (encoderFactory.videoNeedsEncoding()) { if (encoderFactory.videoNeedsEncoding()) {
return true; return true;
} }
if (transformationRequest.enableRequestSdrToneMapping) { if (transformationRequest.hdrMode != TransformationRequest.HDR_MODE_KEEP_HDR) {
return true;
}
if (transformationRequest.forceInterpretHdrVideoAsSdr) {
return true; return true;
} }
if (transformationRequest.videoMimeType != null if (transformationRequest.videoMimeType != null
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
package com.google.android.exoplayer2.transformer; package com.google.android.exoplayer2.transformer;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import static com.google.android.exoplayer2.util.Assertions.checkState;
import static com.google.android.exoplayer2.util.Util.SDK_INT; import static com.google.android.exoplayer2.util.Util.SDK_INT;
import android.content.Context; import android.content.Context;
...@@ -87,7 +86,8 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -87,7 +86,8 @@ import org.checkerframework.dataflow.qual.Pure;
muxerWrapper); muxerWrapper);
if (ColorInfo.isTransferHdr(inputFormat.colorInfo)) { if (ColorInfo.isTransferHdr(inputFormat.colorInfo)) {
if (transformationRequest.forceInterpretHdrVideoAsSdr) { if (transformationRequest.hdrMode
== TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR) {
if (SDK_INT < 29) { if (SDK_INT < 29) {
throw TransformationException.createForCodec( throw TransformationException.createForCodec(
new IllegalArgumentException("Interpreting HDR video as SDR is not supported."), new IllegalArgumentException("Interpreting HDR video as SDR is not supported."),
...@@ -281,7 +281,7 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -281,7 +281,7 @@ import org.checkerframework.dataflow.qual.Pure;
* processing, with {@link Format#rotationDegrees} of 90 added to the output format. * processing, with {@link Format#rotationDegrees} of 90 added to the output format.
* @param requestedFormat The requested format. * @param requestedFormat The requested format.
* @param supportedFormat A format supported by the device. * @param supportedFormat A format supported by the device.
* @param isToneMappedToSdr Whether tone mapping to SDR will be applied. * @param supportedHdrMode A {@link TransformationRequest.HdrMode} supported by the device.
* @return The created instance. * @return The created instance.
*/ */
@Pure @Pure
...@@ -290,24 +290,21 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -290,24 +290,21 @@ import org.checkerframework.dataflow.qual.Pure;
boolean hasOutputFormatRotation, boolean hasOutputFormatRotation,
Format requestedFormat, Format requestedFormat,
Format supportedFormat, Format supportedFormat,
boolean isToneMappedToSdr) { @TransformationRequest.HdrMode int supportedHdrMode) {
// TODO(b/210591626): Also update bitrate etc. once encoder configuration and fallback are // TODO(b/210591626): Also update bitrate etc. once encoder configuration and fallback are
// implemented. // implemented.
if (transformationRequest.enableRequestSdrToneMapping == isToneMappedToSdr if (transformationRequest.hdrMode == supportedHdrMode
&& Util.areEqual(requestedFormat.sampleMimeType, supportedFormat.sampleMimeType) && Util.areEqual(requestedFormat.sampleMimeType, supportedFormat.sampleMimeType)
&& (hasOutputFormatRotation && (hasOutputFormatRotation
? requestedFormat.width == supportedFormat.width ? requestedFormat.width == supportedFormat.width
: requestedFormat.height == supportedFormat.height)) { : requestedFormat.height == supportedFormat.height)) {
return transformationRequest; return transformationRequest;
} }
TransformationRequest.Builder transformationRequestBuilder = transformationRequest.buildUpon(); return transformationRequest
if (transformationRequest.enableRequestSdrToneMapping != isToneMappedToSdr) { .buildUpon()
checkState(isToneMappedToSdr);
transformationRequestBuilder.setEnableRequestSdrToneMapping(true);
}
return transformationRequestBuilder
.setVideoMimeType(supportedFormat.sampleMimeType) .setVideoMimeType(supportedFormat.sampleMimeType)
.setResolution(hasOutputFormatRotation ? requestedFormat.width : requestedFormat.height) .setResolution(hasOutputFormatRotation ? requestedFormat.width : requestedFormat.height)
.setHdrMode(supportedHdrMode)
.build(); .build();
} }
...@@ -408,8 +405,7 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -408,8 +405,7 @@ import org.checkerframework.dataflow.qual.Pure;
/** Returns the {@link ColorInfo} expected from the input surface. */ /** Returns the {@link ColorInfo} expected from the input surface. */
public ColorInfo getSupportedInputColor() { public ColorInfo getSupportedInputColor() {
boolean isHdrEditingEnabled = boolean isHdrEditingEnabled =
transformationRequest.enableHdrEditing transformationRequest.hdrMode == TransformationRequest.HDR_MODE_KEEP_HDR
&& !transformationRequest.enableRequestSdrToneMapping
&& !supportedEncoderNamesForHdrEditing.isEmpty(); && !supportedEncoderNamesForHdrEditing.isEmpty();
boolean isInputToneMapped = boolean isInputToneMapped =
!isHdrEditingEnabled && ColorInfo.isTransferHdr(inputFormat.colorInfo); !isHdrEditingEnabled && ColorInfo.isTransferHdr(inputFormat.colorInfo);
...@@ -476,13 +472,19 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -476,13 +472,19 @@ import org.checkerframework.dataflow.qual.Pure;
boolean isInputToneMapped = boolean isInputToneMapped =
ColorInfo.isTransferHdr(inputFormat.colorInfo) ColorInfo.isTransferHdr(inputFormat.colorInfo)
&& !ColorInfo.isTransferHdr(requestedEncoderFormat.colorInfo); && !ColorInfo.isTransferHdr(requestedEncoderFormat.colorInfo);
@TransformationRequest.HdrMode
int hdrMode =
isInputToneMapped
? TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR
: transformationRequest.hdrMode;
fallbackListener.onTransformationRequestFinalized( fallbackListener.onTransformationRequestFinalized(
createSupportedTransformationRequest( createSupportedTransformationRequest(
transformationRequest, transformationRequest,
/* hasOutputFormatRotation= */ flipOrientation, /* hasOutputFormatRotation= */ flipOrientation,
requestedEncoderFormat, requestedEncoderFormat,
encoderSupportedFormat, encoderSupportedFormat,
isInputToneMapped)); hdrMode));
encoderSurfaceInfo = encoderSurfaceInfo =
new SurfaceInfo( new SurfaceInfo(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment