Remove HDR modes from TransformationRequest

PiperOrigin-RevId: 545352306
This commit is contained in:
kimvde 2023-07-04 06:31:59 +00:00 committed by microkatz
parent de4575da28
commit 81c83e4213
11 changed files with 49 additions and 79 deletions

View File

@ -26,6 +26,9 @@
created after the playlist is cleared.
* Transformer:
* Parse EXIF rotation data for image inputs.
* Remove `TransformationRequest.HdrMode` annotation type and its
associated constants. Use `Composition.HdrMode` and its associated
constants instead.
* Track Selection:
* Extractors:
* MPEG-TS: Ensure the last frame is rendered by passing the last access

View File

@ -20,6 +20,10 @@ import static android.Manifest.permission.READ_MEDIA_VIDEO;
import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Util.SDK_INT;
import static androidx.media3.transformer.Composition.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR;
import static androidx.media3.transformer.Composition.HDR_MODE_KEEP_HDR;
import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC;
import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL;
import android.app.Activity;
import android.content.DialogInterface;
@ -45,7 +49,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.media3.common.C;
import androidx.media3.common.MimeTypes;
import androidx.media3.transformer.TransformationRequest;
import androidx.media3.transformer.Composition;
import com.google.android.material.slider.RangeSlider;
import com.google.android.material.slider.Slider;
import com.google.common.collect.ImmutableMap;
@ -177,20 +181,13 @@ public final class ConfigurationActivity extends AppCompatActivity {
"Custom Bitmap Overlay",
"Custom Text Overlay",
};
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(
"MediaCodec tone-map HDR to SDR",
TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC)
.put(
"OpenGL tone-map HDR to SDR",
TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL)
.put(
"Force Interpret HDR as SDR",
TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR)
.build();
private static final ImmutableMap<String, @Composition.HdrMode Integer> HDR_MODE_DESCRIPTIONS =
new ImmutableMap.Builder<String, @Composition.HdrMode Integer>()
.put("Keep HDR", HDR_MODE_KEEP_HDR)
.put("MediaCodec tone-map HDR to SDR", HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC)
.put("OpenGL tone-map HDR to SDR", HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL)
.put("Force Interpret HDR as SDR", HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR)
.build();
private static final ImmutableMap<String, Integer> OVERLAY_COLORS =
new ImmutableMap.Builder<String, Integer>()
.put("BLACK", Color.BLACK)

View File

@ -17,7 +17,7 @@ package androidx.media3.transformer;
import androidx.annotation.Nullable;
import androidx.media3.common.C;
import androidx.media3.transformer.TransformationRequest.HdrMode;
import androidx.media3.transformer.Composition.HdrMode;
import java.util.Objects;
import org.json.JSONException;
import org.json.JSONObject;

View File

@ -24,6 +24,8 @@ import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECON
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR_FORMAT;
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_MEDIACODEC;
import static androidx.media3.transformer.mh.FileUtil.assertFileHasColorTransfer;
import static com.google.common.truth.Truth.assertThat;
@ -34,6 +36,7 @@ import androidx.media3.common.ColorInfo;
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;
@ -50,7 +53,7 @@ import org.junit.runner.RunWith;
/**
* {@link Transformer} instrumentation test for applying an {@linkplain
* TransformationRequest#HDR_MODE_KEEP_HDR HDR frame edit}.
* Composition#HDR_MODE_KEEP_HDR HDR frame edit}.
*/
@RunWith(AndroidJUnit4.class)
public final class HdrEditingTest {
@ -246,11 +249,10 @@ public final class HdrEditingTest {
TransformationRequest originalTransformationRequest,
TransformationRequest fallbackTransformationRequest) {
isFallbackListenerInvoked.set(true);
assertThat(originalTransformationRequest.hdrMode)
.isEqualTo(TransformationRequest.HDR_MODE_KEEP_HDR);
assertThat(originalTransformationRequest.hdrMode).isEqualTo(HDR_MODE_KEEP_HDR);
isToneMappingFallbackApplied.set(
fallbackTransformationRequest.hdrMode
== TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC);
== HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC);
}
})
.build();
@ -313,11 +315,10 @@ public final class HdrEditingTest {
TransformationRequest originalTransformationRequest,
TransformationRequest fallbackTransformationRequest) {
isFallbackListenerInvoked.set(true);
assertThat(originalTransformationRequest.hdrMode)
.isEqualTo(TransformationRequest.HDR_MODE_KEEP_HDR);
assertThat(originalTransformationRequest.hdrMode).isEqualTo(HDR_MODE_KEEP_HDR);
isToneMappingFallbackApplied.set(
fallbackTransformationRequest.hdrMode
== TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC);
== HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC);
}
})
.build();

View File

@ -50,7 +50,7 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory {
* @param decoderFactory The {@link Codec.DecoderFactory} to use to decode the samples (if
* necessary).
* @param forceInterpretHdrAsSdr Whether to apply {@link
* TransformationRequest#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}.
* Composition#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}.
* @param clock The {@link Clock} to use. It should always be {@link Clock#DEFAULT}, except for
* testing.
*/
@ -73,7 +73,7 @@ public final class DefaultAssetLoaderFactory implements AssetLoader.Factory {
* @param decoderFactory The {@link Codec.DecoderFactory} to use to decode the samples (if
* necessary).
* @param forceInterpretHdrAsSdr Whether to apply {@link
* TransformationRequest#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}.
* Composition#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}.
* @param clock The {@link Clock} to use. It should always be {@link Clock#DEFAULT}, except for
* testing.
* @param mediaSourceFactory The {@link MediaSource.Factory} to use to retrieve the samples to

View File

@ -75,7 +75,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
* @param decoderFactory The {@link Codec.DecoderFactory} to use to decode the samples (if
* necessary).
* @param forceInterpretHdrAsSdr Whether to apply {@link
* TransformationRequest#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}.
* Composition#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}.
* @param clock The {@link Clock} to use. It should always be {@link Clock#DEFAULT}, except for
* testing.
*/
@ -98,7 +98,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader {
* @param decoderFactory The {@link Codec.DecoderFactory} to use to decode the samples (if
* necessary).
* @param forceInterpretHdrAsSdr Whether to apply {@link
* TransformationRequest#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}.
* Composition#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}.
* @param clock The {@link Clock} to use. It should always be {@link Clock#DEFAULT}, except for
* testing.
* @param mediaSourceFactory The {@link MediaSource.Factory} to use to retrieve the samples to

View File

@ -17,58 +17,25 @@
package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkArgument;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.SOURCE;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import androidx.media3.common.C;
import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
/** A media transformation request. */
@UnstableApi
public final class TransformationRequest {
/** See {@link Composition.HdrMode}. */
@Documented
@Retention(SOURCE)
@Target(TYPE_USE)
@IntDef({
HDR_MODE_KEEP_HDR,
HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC,
HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL,
HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR,
})
public @interface HdrMode {}
/** See {@link Composition#HDR_MODE_KEEP_HDR}. */
public static final int HDR_MODE_KEEP_HDR = Composition.HDR_MODE_KEEP_HDR;
/** See {@link Composition#HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC}. */
public static final int HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC =
Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC;
/** See {@link Composition#HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL}. */
public static final int HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL =
Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL;
/** See {@link Composition#HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR}. */
public static final int HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR =
Composition.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR;
/** A builder for {@link TransformationRequest} instances. */
public static final class Builder {
private int outputHeight;
@Nullable private String audioMimeType;
@Nullable private String videoMimeType;
private @HdrMode int hdrMode;
private @Composition.HdrMode int hdrMode;
/**
* Creates a new instance with default values.
@ -141,15 +108,15 @@ public final class TransformationRequest {
}
/**
* Sets the {@link HdrMode} for HDR video input.
* Sets the {@link Composition.HdrMode} for HDR video input.
*
* <p>The default value is {@link #HDR_MODE_KEEP_HDR}.
* <p>The default value is {@link Composition#HDR_MODE_KEEP_HDR}.
*
* @param hdrMode The {@link HdrMode} used.
* @param hdrMode The {@link Composition.HdrMode} used.
* @return This builder.
*/
@CanIgnoreReturnValue
public Builder setHdrMode(@HdrMode int hdrMode) {
public Builder setHdrMode(@Composition.HdrMode int hdrMode) {
this.hdrMode = hdrMode;
return this;
}
@ -200,17 +167,17 @@ public final class TransformationRequest {
@Nullable public final String videoMimeType;
/**
* The {@link HdrMode} specifying how to handle HDR input video.
* The {@link Composition.HdrMode} specifying how to handle HDR input video.
*
* @see Builder#setHdrMode(int)
*/
public final @HdrMode int hdrMode;
public final @Composition.HdrMode int hdrMode;
private TransformationRequest(
int outputHeight,
@Nullable String audioMimeType,
@Nullable String videoMimeType,
@HdrMode int hdrMode) {
@Composition.HdrMode int hdrMode) {
this.outputHeight = outputHeight;
this.audioMimeType = audioMimeType;
this.videoMimeType = videoMimeType;

View File

@ -18,6 +18,7 @@ package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkArgument;
import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.transformer.Composition.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR;
import static java.lang.annotation.ElementType.TYPE_USE;
import android.content.Context;
@ -795,7 +796,7 @@ public final class Transformer {
context,
new DefaultDecoderFactory(context),
/* forceInterpretHdrAsSdr= */ transformationRequest.hdrMode
== TransformationRequest.HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR,
== HDR_MODE_EXPERIMENTAL_FORCE_INTERPRET_HDR_AS_SDR,
clock);
}
DebugTraceUtil.reset();

View File

@ -21,6 +21,7 @@ import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Assertions.checkStateNotNull;
import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_DECODED;
import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_ENCODED;
import static androidx.media3.transformer.Composition.HDR_MODE_KEEP_HDR;
import static androidx.media3.transformer.ExportException.ERROR_CODE_FAILED_RUNTIME_CHECK;
import static androidx.media3.transformer.ExportException.ERROR_CODE_MUXING_FAILED;
import static androidx.media3.transformer.Transformer.PROGRESS_STATE_AVAILABLE;
@ -699,7 +700,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
if (encoderFactory.videoNeedsEncoding()) {
return true;
}
if (transformationRequest.hdrMode != TransformationRequest.HDR_MODE_KEEP_HDR) {
if (transformationRequest.hdrMode != HDR_MODE_KEEP_HDR) {
return true;
}
if (transformationRequest.videoMimeType != null

View File

@ -24,10 +24,10 @@ import static androidx.media3.common.VideoFrameProcessor.INPUT_TYPE_SURFACE;
import static androidx.media3.common.VideoFrameProcessor.INPUT_TYPE_TEXTURE_ID;
import static androidx.media3.common.util.Assertions.checkArgument;
import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.transformer.Composition.HDR_MODE_KEEP_HDR;
import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC;
import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL;
import static androidx.media3.transformer.EncoderUtil.getSupportedEncodersForHdrEditing;
import static androidx.media3.transformer.TransformationRequest.HDR_MODE_KEEP_HDR;
import static androidx.media3.transformer.TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC;
import static androidx.media3.transformer.TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL;
import android.content.Context;
import android.graphics.Bitmap;
@ -361,7 +361,7 @@ import org.checkerframework.dataflow.qual.Pure;
private final TransformationRequest transformationRequest;
private final FallbackListener fallbackListener;
private final String requestedOutputMimeType;
private final @TransformationRequest.HdrMode int hdrModeAfterFallback;
private final @Composition.HdrMode int hdrModeAfterFallback;
private @MonotonicNonNull SurfaceInfo encoderSurfaceInfo;
@ -401,7 +401,7 @@ import org.checkerframework.dataflow.qual.Pure;
// HdrMode fallback is only supported from HDR_MODE_KEEP_HDR to
// HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC.
@TransformationRequest.HdrMode int hdrMode = transformationRequest.hdrMode;
@Composition.HdrMode int hdrMode = transformationRequest.hdrMode;
if (hdrMode == HDR_MODE_KEEP_HDR && isTransferHdr(inputFormat.colorInfo)) {
ImmutableList<MediaCodecInfo> hdrEncoders =
getSupportedEncodersForHdrEditing(requestedOutputMimeType, inputFormat.colorInfo);
@ -422,7 +422,7 @@ import org.checkerframework.dataflow.qual.Pure;
return Pair.create(requestedOutputMimeType, hdrMode);
}
public @TransformationRequest.HdrMode int getHdrModeAfterFallback() {
public @Composition.HdrMode int getHdrModeAfterFallback() {
return hdrModeAfterFallback;
}
@ -513,7 +513,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 supportedHdrMode A {@link TransformationRequest.HdrMode} supported by the device.
* @param supportedHdrMode A {@link Composition.HdrMode} supported by the device.
* @return The created instance.
*/
@Pure
@ -522,7 +522,7 @@ import org.checkerframework.dataflow.qual.Pure;
boolean hasOutputFormatRotation,
Format requestedFormat,
Format supportedFormat,
@TransformationRequest.HdrMode int supportedHdrMode) {
@Composition.HdrMode int supportedHdrMode) {
// TODO(b/259570024): Consider including bitrate in the revised fallback design.
TransformationRequest.Builder supportedRequestBuilder = transformationRequest.buildUpon();

View File

@ -16,7 +16,7 @@
package androidx.media3.transformer;
import static androidx.media3.transformer.TransformationRequest.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 com.google.common.truth.Truth.assertThat;
import androidx.media3.common.MimeTypes;