diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorImageFrameOutputTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorImageFrameOutputTest.java index 21b80b1908..729627941c 100644 --- a/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorImageFrameOutputTest.java +++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorImageFrameOutputTest.java @@ -38,8 +38,8 @@ import org.junit.runner.RunWith; public class DefaultVideoFrameProcessorImageFrameOutputTest { public static final String ORIGINAL_PNG_ASSET_PATH = "media/bitmap/sample_mp4_first_frame/electrical_colors/original.png"; - public static final String WRAPPED_CROP_PNG_ASSET_PATH = - "media/bitmap/sample_mp4_first_frame/electrical_colors/image_input_with_wrapped_crop.png"; + public static final String SCALE_WIDE_PNG_ASSET_PATH = + "media/bitmap/sample_mp4_first_frame/electrical_colors/scale_wide.png"; public static final String BITMAP_OVERLAY_PNG_ASSET_PATH = "media/bitmap/sample_mp4_first_frame/electrical_colors/overlay_bitmap_FrameProcessor.png"; @@ -66,7 +66,7 @@ public class DefaultVideoFrameProcessorImageFrameOutputTest { videoFrameProcessorTestRunner.queueInputBitmap( readBitmap(ORIGINAL_PNG_ASSET_PATH), C.MICROS_PER_SECOND, /* frameRate= */ 2); videoFrameProcessorTestRunner.queueInputBitmap( - readBitmap(WRAPPED_CROP_PNG_ASSET_PATH), 2 * C.MICROS_PER_SECOND, /* frameRate= */ 3); + readBitmap(SCALE_WIDE_PNG_ASSET_PATH), 2 * C.MICROS_PER_SECOND, /* frameRate= */ 3); videoFrameProcessorTestRunner.queueInputBitmap( readBitmap(BITMAP_OVERLAY_PNG_ASSET_PATH), 3 * C.MICROS_PER_SECOND, /* frameRate= */ 4); videoFrameProcessorTestRunner.endFrameProcessingAndGetImage(); diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorPixelTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorPixelTest.java index b793fa7979..5f5ad4f03c 100644 --- a/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorPixelTest.java +++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorPixelTest.java @@ -54,8 +54,11 @@ import org.junit.runner.RunWith; public final class DefaultVideoFrameProcessorPixelTest { public static final String ORIGINAL_PNG_ASSET_PATH = "media/bitmap/sample_mp4_first_frame/electrical_colors/original.png"; - public static final String WRAPPED_CROP_PNG_ASSET_PATH = - "media/bitmap/sample_mp4_first_frame/electrical_colors/image_input_with_wrapped_crop.png"; + public static final String IMAGE_PNG_ASSET_PATH = "media/bitmap/input_images/london.jpg"; + public static final String IMAGE_TO_VIDEO_PNG_ASSET_PATH = + "media/bitmap/sample_mp4_first_frame/electrical_colors/london_image_to_video.png"; + public static final String IMAGE_TO_CROPPED_VIDEO_PNG_ASSET_PATH = + "media/bitmap/sample_mp4_first_frame/electrical_colors/london_image_to_video_with_crop.png"; public static final String BITMAP_OVERLAY_PNG_ASSET_PATH = "media/bitmap/sample_mp4_first_frame/electrical_colors/overlay_bitmap_FrameProcessor.png"; public static final String SCALE_WIDE_PNG_ASSET_PATH = @@ -108,10 +111,11 @@ public final class DefaultVideoFrameProcessorPixelTest { String testId = "noEffects_withImageInput_matchesGoldenFile"; videoFrameProcessorTestRunner = getDefaultFrameProcessorTestRunnerBuilder(testId).setIsInputTextureExternal(false).build(); - Bitmap expectedBitmap = readBitmap(ORIGINAL_PNG_ASSET_PATH); + Bitmap originalBitmap = readBitmap(IMAGE_PNG_ASSET_PATH); + Bitmap expectedBitmap = readBitmap(IMAGE_TO_VIDEO_PNG_ASSET_PATH); videoFrameProcessorTestRunner.queueInputBitmap( - expectedBitmap, C.MICROS_PER_SECOND, /* frameRate= */ 1); + originalBitmap, C.MICROS_PER_SECOND, /* frameRate= */ 1); Bitmap actualBitmap = videoFrameProcessorTestRunner.endFrameProcessingAndGetImage(); // TODO(b/207848601): Switch to using proper tooling for testing against golden data. @@ -134,8 +138,8 @@ public final class DefaultVideoFrameProcessorPixelTest { /* bottom= */ -0.5f, /* top= */ 0.5f))) .build(); - Bitmap originalBitmap = readBitmap(ORIGINAL_PNG_ASSET_PATH); - Bitmap expectedBitmap = readBitmap(WRAPPED_CROP_PNG_ASSET_PATH); + Bitmap originalBitmap = readBitmap(IMAGE_PNG_ASSET_PATH); + Bitmap expectedBitmap = readBitmap(IMAGE_TO_CROPPED_VIDEO_PNG_ASSET_PATH); videoFrameProcessorTestRunner.queueInputBitmap( originalBitmap, C.MICROS_PER_SECOND, /* frameRate= */ 1); diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/OverlayShaderProgramPixelTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/OverlayShaderProgramPixelTest.java index d55ebe4093..5ea2692f81 100644 --- a/libraries/effect/src/androidTest/java/androidx/media3/effect/OverlayShaderProgramPixelTest.java +++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/OverlayShaderProgramPixelTest.java @@ -58,7 +58,7 @@ import org.junit.runner.RunWith; */ @RunWith(AndroidJUnit4.class) public class OverlayShaderProgramPixelTest { - public static final String OVERLAY_PNG_ASSET_PATH = "media/bitmap/overlay/media3test.png"; + public static final String OVERLAY_PNG_ASSET_PATH = "media/bitmap/input_images/media3test.png"; public static final String ORIGINAL_PNG_ASSET_PATH = "media/bitmap/sample_mp4_first_frame/electrical_colors/original.png"; public static final String OVERLAY_BITMAP_DEFAULT = diff --git a/libraries/effect/src/main/assets/shaders/fragment_shader_transformation_sdr_internal_es2.glsl b/libraries/effect/src/main/assets/shaders/fragment_shader_transformation_sdr_internal_es2.glsl index 5681862133..ae85eff689 100644 --- a/libraries/effect/src/main/assets/shaders/fragment_shader_transformation_sdr_internal_es2.glsl +++ b/libraries/effect/src/main/assets/shaders/fragment_shader_transformation_sdr_internal_es2.glsl @@ -36,22 +36,23 @@ uniform int uOutputColorTransfer; const float inverseGamma = 0.4500; const float gamma = 1.0 / inverseGamma; -// Transforms a single channel from electrical to optical SDR using the SMPTE -// 170M OETF. -float smpte170mEotfSingleChannel(float electricalChannel) { +// Transforms a single channel from electrical to optical SDR using the sRGB +// EOTF. +float srgbEotfSingleChannel(float electricalChannel) { // Specification: - // https://www.itu.int/rec/R-REC-BT.1700-0-200502-I/en - return electricalChannel < 0.0812 - ? electricalChannel / 4.500 - : pow((electricalChannel + 0.099) / 1.099, gamma); + // https://developer.android.com/ndk/reference/group/a-data-space#group___a_data_space_1gga2759ad19cae46646cc5f7002758c4a1cac1bef6aa3a72abbf4a651a0bfb117f96 + return electricalChannel <= 0.04045 + ? electricalChannel / 12.92 + : pow((electricalChannel + 0.055) / 1.055, 2.4); } -// Transforms electrical to optical SDR using the SMPTE 170M EOTF. -vec3 smpte170mEotf(vec3 electricalColor) { +// Transforms electrical to optical SDR using the sRGB EOTF. +vec3 srgbEotf(const vec3 electricalColor) { return vec3( - smpte170mEotfSingleChannel(electricalColor.r), - smpte170mEotfSingleChannel(electricalColor.g), - smpte170mEotfSingleChannel(electricalColor.b)); + srgbEotfSingleChannel(electricalColor.r), + srgbEotfSingleChannel(electricalColor.g), + srgbEotfSingleChannel(electricalColor.b) + ); } // Transforms a single channel from optical to electrical SDR. @@ -95,7 +96,7 @@ void main() { // texture gets flipped. We flip the texture vertically to ensure the // orientation of the output is correct. vec4 inputColor = texture2D(uTexSampler, vTexSamplingCoordFlipped); - vec3 linearInputColor = smpte170mEotf(inputColor.rgb); + vec3 linearInputColor = srgbEotf(inputColor.rgb); vec4 transformedColors = uRgbMatrix * vec4(linearInputColor, 1); diff --git a/libraries/test_data/src/test/assets/media/bitmap/input_images/README.md b/libraries/test_data/src/test/assets/media/bitmap/input_images/README.md new file mode 100644 index 0000000000..834e09d881 --- /dev/null +++ b/libraries/test_data/src/test/assets/media/bitmap/input_images/README.md @@ -0,0 +1,2 @@ +All the files are in the *sRGB color space* specified in IEC 61966-2-1 following the colorspace +model that is supported by [android.graphics.Bitmap](https://developer.android.com/reference/android/graphics/BitmapFactory.Options#inPreferredColorSpace). diff --git a/libraries/test_data/src/test/assets/media/bitmap/input_images/london.jpg b/libraries/test_data/src/test/assets/media/bitmap/input_images/london.jpg new file mode 100644 index 0000000000..bae040f73d Binary files /dev/null and b/libraries/test_data/src/test/assets/media/bitmap/input_images/london.jpg differ diff --git a/libraries/test_data/src/test/assets/media/bitmap/overlay/media3test.png b/libraries/test_data/src/test/assets/media/bitmap/input_images/media3test.png similarity index 100% rename from libraries/test_data/src/test/assets/media/bitmap/overlay/media3test.png rename to libraries/test_data/src/test/assets/media/bitmap/input_images/media3test.png diff --git a/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/image_input_with_wrapped_crop.png b/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/image_input_with_wrapped_crop.png deleted file mode 100644 index cbc2a47a6c..0000000000 Binary files a/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/image_input_with_wrapped_crop.png and /dev/null differ diff --git a/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/london_image_to_video.png b/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/london_image_to_video.png new file mode 100644 index 0000000000..017c26c601 Binary files /dev/null and b/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/london_image_to_video.png differ diff --git a/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/london_image_to_video_with_crop.png b/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/london_image_to_video_with_crop.png new file mode 100644 index 0000000000..5b3327afed Binary files /dev/null and b/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/london_image_to_video_with_crop.png differ