Trim
Request SDR tone-mapping (API 31+)
[Experimental] Force interpret HDR video as SDR (API 29+)
- [Experimental] HDR editing (API 31+)
Add demo effects
Periodic vignette options
Failed to load MediaPipe processor. Check the README for instructions.
diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/SetHdrEditingTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/SetHdrEditingTest.java
index d09c6af1ee..1213561747 100644
--- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/SetHdrEditingTest.java
+++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/SetHdrEditingTest.java
@@ -43,10 +43,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Test;
import org.junit.runner.RunWith;
-/**
- * {@link Transformer} instrumentation test for applying an {@linkplain
- * TransformationRequest.Builder#experimental_setEnableHdrEditing HDR frame edit}.
- */
+/** {@link Transformer} instrumentation test for applying an HDR frame edit. */
@RunWith(AndroidJUnit4.class)
public class SetHdrEditingTest {
public static final String TAG = "SetHdrEditingTest";
@@ -68,11 +65,7 @@ public class SetHdrEditingTest {
String testId = "transform_noRequestedTranscode_hdr10File_transformsOrThrows";
Context context = ApplicationProvider.getApplicationContext();
- Transformer transformer =
- new Transformer.Builder(context)
- .setTransformationRequest(
- new TransformationRequest.Builder().experimental_setEnableHdrEditing(true).build())
- .build();
+ Transformer transformer = new Transformer.Builder(context).build();
try {
TransformationTestResult transformationTestResult =
@@ -95,11 +88,7 @@ public class SetHdrEditingTest {
String testId = "transform_noRequestedTranscode_hlg10File_transformsOrThrows";
Context context = ApplicationProvider.getApplicationContext();
- Transformer transformer =
- new Transformer.Builder(context)
- .setTransformationRequest(
- new TransformationRequest.Builder().experimental_setEnableHdrEditing(true).build())
- .build();
+ Transformer transformer = new Transformer.Builder(context).build();
try {
TransformationTestResult transformationTestResult =
@@ -130,10 +119,7 @@ public class SetHdrEditingTest {
Transformer transformer =
new Transformer.Builder(context)
.setTransformationRequest(
- new TransformationRequest.Builder()
- .experimental_setEnableHdrEditing(true)
- .setRotationDegrees(180)
- .build())
+ new TransformationRequest.Builder().setRotationDegrees(180).build())
.build();
TransformationTestResult transformationTestResult =
@@ -156,10 +142,7 @@ public class SetHdrEditingTest {
Transformer transformer =
new Transformer.Builder(context)
.setTransformationRequest(
- new TransformationRequest.Builder()
- .experimental_setEnableHdrEditing(true)
- .setRotationDegrees(180)
- .build())
+ new TransformationRequest.Builder().setRotationDegrees(180).build())
.build();
TransformationTestResult transformationTestResult =
@@ -184,10 +167,7 @@ public class SetHdrEditingTest {
Transformer transformer =
new Transformer.Builder(context)
.setTransformationRequest(
- new TransformationRequest.Builder()
- .experimental_setEnableHdrEditing(true)
- .setRotationDegrees(180)
- .build())
+ new TransformationRequest.Builder().setRotationDegrees(180).build())
.addListener(
new Transformer.Listener() {
@Override
@@ -238,10 +218,7 @@ public class SetHdrEditingTest {
Transformer transformer =
new Transformer.Builder(context)
.setTransformationRequest(
- new TransformationRequest.Builder()
- .experimental_setEnableHdrEditing(true)
- .setRotationDegrees(180)
- .build())
+ new TransformationRequest.Builder().setRotationDegrees(180).build())
.addListener(
new Transformer.Listener() {
@Override
@@ -289,11 +266,7 @@ public class SetHdrEditingTest {
return;
}
- Transformer transformer =
- new Transformer.Builder(context)
- .setTransformationRequest(
- new TransformationRequest.Builder().experimental_setEnableHdrEditing(true).build())
- .build();
+ Transformer transformer = new Transformer.Builder(context).build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(
diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/FallbackListener.java b/libraries/transformer/src/main/java/androidx/media3/transformer/FallbackListener.java
index bd9cf63426..718cc70ec9 100644
--- a/libraries/transformer/src/main/java/androidx/media3/transformer/FallbackListener.java
+++ b/libraries/transformer/src/main/java/androidx/media3/transformer/FallbackListener.java
@@ -95,10 +95,6 @@ import androidx.media3.common.util.Util;
if (transformationRequest.outputHeight != originalTransformationRequest.outputHeight) {
fallbackRequestBuilder.setResolution(transformationRequest.outputHeight);
}
- if (transformationRequest.enableHdrEditing != originalTransformationRequest.enableHdrEditing) {
- fallbackRequestBuilder.experimental_setEnableHdrEditing(
- transformationRequest.enableHdrEditing);
- }
if (transformationRequest.enableRequestSdrToneMapping
!= originalTransformationRequest.enableRequestSdrToneMapping) {
fallbackRequestBuilder.setEnableRequestSdrToneMapping(
diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java
index ab86f78016..e77cccd7a9 100644
--- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java
+++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformationRequest.java
@@ -55,6 +55,7 @@ public final class TransformationRequest {
scaleX = 1;
scaleY = 1;
outputHeight = C.LENGTH_UNSET;
+ enableHdrEditing = true;
}
private Builder(TransformationRequest transformationRequest) {
@@ -220,13 +221,14 @@ public final class TransformationRequest {
* supported, high dynamic range (HDR) input will be tone-mapped into an SDR opto-electrical
* transfer function before processing.
*
- * The default value is {@code true}, which corresponds to tone-mapping output if possible.
+ *
The default value is {@code false}, which corresponds to editing and outputting HDR video
+ * if possible, and falling back to tone-mapping if not.
*
*
The setting has no effect if the input is already in SDR, or if tone-mapping is not
* supported. Currently tone-mapping is only guaranteed to be supported from Android T onwards.
*
- *
Setting this as {@code true} will set {@linkplain #experimental_setEnableHdrEditing} and
- * {@linkplain #forceInterpretHdrVideoAsSdr} to {@code false}.
+ *
Setting this as {@code true} will set {@linkplain #enableHdrEditing} and {@linkplain
+ * #forceInterpretHdrVideoAsSdr} to {@code false}.
*
* @param enableRequestSdrToneMapping Whether to request tone-mapping down to SDR.
* @return This builder.
@@ -235,8 +237,8 @@ public final class TransformationRequest {
public Builder setEnableRequestSdrToneMapping(boolean enableRequestSdrToneMapping) {
this.enableRequestSdrToneMapping = enableRequestSdrToneMapping;
if (enableRequestSdrToneMapping) {
- forceInterpretHdrVideoAsSdr = false;
enableHdrEditing = false;
+ forceInterpretHdrVideoAsSdr = false;
}
return this;
}
@@ -244,8 +246,8 @@ public final class TransformationRequest {
/**
* Sets whether to interpret HDR video as SDR, resulting in washed out video.
*
- *
The default value is {@code false}, with {@link #setEnableRequestSdrToneMapping} being
- * applied.
+ *
The default value is {@code false}, which corresponds to editing and outputting HDR video
+ * if possible, and falling back to tone-mapping if not.
*
*
Use of this flag may result in {@code
* TransformationException.ERROR_CODE_HDR_DECODING_UNSUPPORTED} or {@code
@@ -259,8 +261,8 @@ public final class TransformationRequest {
*
*
The setting has no effect if the input is already in SDR.
*
- *
Setting this as {@code true} will set {@linkplain #experimental_setEnableHdrEditing} and
- * {@linkplain #forceInterpretHdrVideoAsSdr} to {@code false}.
+ *
Setting this as {@code true} will set {@linkplain #enableHdrEditing} and {@linkplain
+ * #forceInterpretHdrVideoAsSdr} to {@code false}.
*
* @param forceInterpretHdrVideoAsSdr Whether to interpret HDR contents as SDR.
* @return This builder.
@@ -278,32 +280,12 @@ public final class TransformationRequest {
}
/**
- * Sets whether to allow processing high dynamic range (HDR) input video streams as HDR.
- *
- *
The default value is {@code false}, with {@link #setEnableRequestSdrToneMapping} being
- * applied.
- *
- *
This method is experimental, and will be renamed or removed in a future release. The HDR
- * editing feature is under development and is intended for developing/testing HDR support.
- *
- *
Setting this as {@code true} will set {@linkplain #experimental_setEnableHdrEditing} and
- * {@linkplain #forceInterpretHdrVideoAsSdr} to {@code false}.
- *
- *
With this flag enabled, HDR streams will correctly edit in HDR, convert via tone-mapping
- * to SDR, or throw an error, based on the device's HDR support. SDR streams will be interpreted
- * the same way regardless of this flag's state.
- *
- * @param enableHdrEditing Whether to attempt to process any input video stream as a high
- * dynamic range (HDR) signal.
- * @return This builder.
+ * @deprecated This method is now a no-op. (@code experimental_setEnableHdrEditing(true)} is now
+ * the default behavior.
*/
+ @Deprecated
@CanIgnoreReturnValue
public Builder experimental_setEnableHdrEditing(boolean enableHdrEditing) {
- this.enableHdrEditing = enableHdrEditing;
- if (enableHdrEditing) {
- enableRequestSdrToneMapping = false;
- forceInterpretHdrVideoAsSdr = false;
- }
return this;
}
@@ -375,11 +357,7 @@ public final class TransformationRequest {
/** Whether to force interpreting HDR video as SDR. */
public final boolean forceInterpretHdrVideoAsSdr;
- /**
- * Whether to attempt to process any input video stream as a high dynamic range (HDR) signal.
- *
- * @see Builder#experimental_setEnableHdrEditing(boolean)
- */
+ /** Whether to attempt to process any input video stream as a high dynamic range (HDR) signal. */
public final boolean enableHdrEditing;
private TransformationRequest(
diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoTranscodingSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoTranscodingSamplePipeline.java
index b54930b329..bd6aa0b630 100644
--- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoTranscodingSamplePipeline.java
+++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoTranscodingSamplePipeline.java
@@ -303,9 +303,7 @@ import org.checkerframework.dataflow.qual.Pure;
TransformationRequest.Builder transformationRequestBuilder = transformationRequest.buildUpon();
if (transformationRequest.enableRequestSdrToneMapping != isToneMappedToSdr) {
checkState(isToneMappedToSdr);
- transformationRequestBuilder
- .setEnableRequestSdrToneMapping(true)
- .experimental_setEnableHdrEditing(false);
+ transformationRequestBuilder.setEnableRequestSdrToneMapping(true);
}
return transformationRequestBuilder
.setVideoMimeType(supportedFormat.sampleMimeType)