From 7c8f6d5d69652f756c8aa4301d442b9be3890192 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 1 Feb 2022 10:24:43 +0000 Subject: [PATCH] Add support for experimenting with HDR - Add a checkbox in the demo app to enable experimental HDR editing. - Add an `experimental_` method to `TransformationRequest` to enable HDR editing. - Add fragment/vertex shaders for the experimental HDR pipeline. The main difference compared to the existing shaders is that we sample from the decoder in YUV rather than RGB (because the YUV -> RGB conversion in the graphics driver is not precisely defined, so we need to do this to get consistent results), which requires the use of ES 3, and then do a crude YUV -> RGB conversion in the shader (ignoring the input color primaries for now). - When HDR editing is enabled, we force using `FrameEditor` (no passthrough) to avoid the need to select another edit operation, and use the new shaders. The `EGLContext` and `EGLSurface` also need to be set up differently for this path. PiperOrigin-RevId: 425570639 --- .../ConfigurationActivity.java | 21 +++- .../transformerdemo/TransformerActivity.java | 2 + .../res/layout/configuration_activity.xml | 10 ++ .../src/main/res/values/strings.xml | 1 + .../android/exoplayer2/util/GlUtil.java | 112 ++++++++++++++---- .../FrameEditorDataProcessingTest.java | 1 + .../transformer/FrameEditorTest.java | 4 +- ...lsl => fragment_shader_copy_external.glsl} | 0 ...fragment_shader_copy_external_yuv_es3.glsl | 29 +++++ ...glsl => vertex_shader_transformation.glsl} | 0 .../vertex_shader_transformation_es3.glsl | 23 ++++ .../exoplayer2/transformer/FrameEditor.java | 71 +++++++++-- .../transformer/TransformationRequest.java | 40 ++++++- .../transformer/TransformerVideoRenderer.java | 3 + .../VideoTranscodingSamplePipeline.java | 4 +- 15 files changed, 274 insertions(+), 47 deletions(-) rename library/transformer/src/main/assets/shaders/{fragment_shader.glsl => fragment_shader_copy_external.glsl} (100%) create mode 100644 library/transformer/src/main/assets/shaders/fragment_shader_copy_external_yuv_es3.glsl rename library/transformer/src/main/assets/shaders/{vertex_shader.glsl => vertex_shader_transformation.glsl} (100%) create mode 100644 library/transformer/src/main/assets/shaders/vertex_shader_transformation_es3.glsl diff --git a/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/ConfigurationActivity.java b/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/ConfigurationActivity.java index a0f96d8b69..3381935df4 100644 --- a/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/ConfigurationActivity.java +++ b/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/ConfigurationActivity.java @@ -54,6 +54,7 @@ public final class ConfigurationActivity extends AppCompatActivity { public static final String SCALE_X = "scale_x"; public static final String SCALE_Y = "scale_y"; public static final String ROTATE_DEGREES = "rotate_degrees"; + public static final String ENABLE_HDR_EDITING = "enable_hdr_editing"; private static final String[] INPUT_URIS = { "https://html5demos.com/assets/dizzy.mp4", "https://storage.googleapis.com/exoplayer-test-media-0/android-block-1080-hevc.mp4", @@ -69,6 +70,7 @@ public final class ConfigurationActivity extends AppCompatActivity { private static final String SAME_AS_INPUT_OPTION = "same as input"; private @MonotonicNonNull Button chooseFileButton; + private @MonotonicNonNull TextView chosenFileTextView; private @MonotonicNonNull CheckBox removeAudioCheckbox; private @MonotonicNonNull CheckBox removeVideoCheckbox; private @MonotonicNonNull CheckBox flattenForSlowMotionCheckbox; @@ -78,7 +80,7 @@ public final class ConfigurationActivity extends AppCompatActivity { private @MonotonicNonNull Spinner translateSpinner; private @MonotonicNonNull Spinner scaleSpinner; private @MonotonicNonNull Spinner rotateSpinner; - private @MonotonicNonNull TextView chosenFileTextView; + private @MonotonicNonNull CheckBox enableHdrEditingCheckBox; private int inputUriPosition; @Override @@ -151,6 +153,8 @@ public final class ConfigurationActivity extends AppCompatActivity { rotateSpinner = findViewById(R.id.rotate_spinner); rotateSpinner.setAdapter(rotateAdapter); rotateAdapter.addAll(SAME_AS_INPUT_OPTION, "0", "10", "45", "90", "180"); + + enableHdrEditingCheckBox = findViewById(R.id.hdr_editing_checkbox); } @Override @@ -178,7 +182,8 @@ public final class ConfigurationActivity extends AppCompatActivity { "resolutionHeightSpinner", "translateSpinner", "scaleSpinner", - "rotateSpinner" + "rotateSpinner", + "enableHdrEditingCheckBox" }) private void startTransformation(View view) { Intent transformerIntent = new Intent(this, TransformerActivity.class); @@ -216,6 +221,7 @@ public final class ConfigurationActivity extends AppCompatActivity { if (!SAME_AS_INPUT_OPTION.equals(selectedRotate)) { bundle.putFloat(ROTATE_DEGREES, Float.parseFloat(selectedRotate)); } + bundle.putBoolean(ENABLE_HDR_EDITING, enableHdrEditingCheckBox.isChecked()); transformerIntent.putExtras(bundle); @Nullable Uri intentUri = getIntent().getData(); @@ -247,7 +253,8 @@ public final class ConfigurationActivity extends AppCompatActivity { "resolutionHeightSpinner", "translateSpinner", "scaleSpinner", - "rotateSpinner" + "rotateSpinner", + "enableHdrEditingCheckBox" }) private void onRemoveAudio(View view) { if (((CheckBox) view).isChecked()) { @@ -265,7 +272,8 @@ public final class ConfigurationActivity extends AppCompatActivity { "resolutionHeightSpinner", "translateSpinner", "scaleSpinner", - "rotateSpinner" + "rotateSpinner", + "enableHdrEditingCheckBox" }) private void onRemoveVideo(View view) { if (((CheckBox) view).isChecked()) { @@ -282,7 +290,8 @@ public final class ConfigurationActivity extends AppCompatActivity { "resolutionHeightSpinner", "translateSpinner", "scaleSpinner", - "rotateSpinner" + "rotateSpinner", + "enableHdrEditingCheckBox" }) private void enableTrackSpecificOptions(boolean isAudioEnabled, boolean isVideoEnabled) { audioMimeSpinner.setEnabled(isAudioEnabled); @@ -291,6 +300,7 @@ public final class ConfigurationActivity extends AppCompatActivity { translateSpinner.setEnabled(isVideoEnabled); scaleSpinner.setEnabled(isVideoEnabled); rotateSpinner.setEnabled(isVideoEnabled); + enableHdrEditingCheckBox.setEnabled(isVideoEnabled); findViewById(R.id.audio_mime_text_view).setEnabled(isAudioEnabled); findViewById(R.id.video_mime_text_view).setEnabled(isVideoEnabled); @@ -298,5 +308,6 @@ public final class ConfigurationActivity extends AppCompatActivity { findViewById(R.id.translate).setEnabled(isVideoEnabled); findViewById(R.id.scale).setEnabled(isVideoEnabled); findViewById(R.id.rotate).setEnabled(isVideoEnabled); + findViewById(R.id.hdr_editing).setEnabled(isVideoEnabled); } } diff --git a/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/TransformerActivity.java b/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/TransformerActivity.java index 888ddd3edc..8220bfe498 100644 --- a/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/TransformerActivity.java +++ b/demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/TransformerActivity.java @@ -213,6 +213,8 @@ public final class TransformerActivity extends AppCompatActivity { if (!transformationMatrix.isIdentity()) { requestBuilder.setTransformationMatrix(transformationMatrix); } + requestBuilder.experimental_setEnableHdrEditing( + bundle.getBoolean(ConfigurationActivity.ENABLE_HDR_EDITING)); transformerBuilder .setTransformationRequest(requestBuilder.build()) .setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO)) diff --git a/demos/transformer/src/main/res/layout/configuration_activity.xml b/demos/transformer/src/main/res/layout/configuration_activity.xml index a9a9410a35..c3403a6269 100644 --- a/demos/transformer/src/main/res/layout/configuration_activity.xml +++ b/demos/transformer/src/main/res/layout/configuration_activity.xml @@ -164,6 +164,16 @@ android:layout_gravity="right|center_vertical" android:gravity="right" /> + + + +