Remove HDR modes from TransformationRequest
PiperOrigin-RevId: 545352306
This commit is contained in:
parent
de4575da28
commit
81c83e4213
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user