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