Allow customizing VideoFrameProcessor input and output colors in MCVR.

PiperOrigin-RevId: 526081541
This commit is contained in:
claincly 2023-04-21 18:49:53 +01:00 committed by Rohit Singh
parent bb0c4a468a
commit a0fe3b29c2

View File

@ -1509,6 +1509,28 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
videoFrameProcessingOffsetCount++; videoFrameProcessingOffsetCount++;
} }
/**
* Returns a {@link Pair} of {@linkplain ColorInfo input color} and {@linkplain ColorInfo output
* color} to configure the {@code VideoFrameProcessor}.
*/
protected Pair<ColorInfo, ColorInfo> experimentalGetVideoFrameProcessorColorConfiguration(
@Nullable ColorInfo inputColorInfo) {
// TODO(b/279163661) Remove this method after VideoFrameProcessor supports texture ID
// input/output.
if (!ColorInfo.isTransferHdr(inputColorInfo)) {
return Pair.create(ColorInfo.SDR_BT709_LIMITED, ColorInfo.SDR_BT709_LIMITED);
}
if (inputColorInfo.colorTransfer == C.COLOR_TRANSFER_HLG) {
// SurfaceView only supports BT2020 PQ input, converting HLG to PQ.
return Pair.create(
inputColorInfo,
inputColorInfo.buildUpon().setColorTransfer(C.COLOR_TRANSFER_ST2084).build());
}
return Pair.create(inputColorInfo, inputColorInfo);
}
/** /**
* Renders the output buffer with the specified index now. * Renders the output buffer with the specified index now.
* *
@ -1982,22 +2004,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
return false; return false;
} }
ColorInfo inputColorInfo;
ColorInfo outputColorInfo;
if (inputFormat.colorInfo != null) {
inputColorInfo = inputFormat.colorInfo;
outputColorInfo =
inputColorInfo.colorTransfer == C.COLOR_TRANSFER_HLG
// SurfaceView only supports BT2020 PQ input, converting HLG to PQ.
? inputColorInfo.buildUpon().setColorTransfer(C.COLOR_TRANSFER_ST2084).build()
: inputColorInfo;
} else {
inputColorInfo = ColorInfo.SDR_BT709_LIMITED;
outputColorInfo = ColorInfo.SDR_BT709_LIMITED;
}
// Playback thread handler. // Playback thread handler.
handler = Util.createHandlerForCurrentLooper(); handler = Util.createHandlerForCurrentLooper();
Pair<ColorInfo, ColorInfo> inputAndOutputColorInfos =
renderer.experimentalGetVideoFrameProcessorColorConfiguration(inputFormat.colorInfo);
try { try {
// TODO(b/243036513): Set rotation in setInputFormat() after supporting changing effects. // TODO(b/243036513): Set rotation in setInputFormat() after supporting changing effects.
if (!codecAppliesRotation() && inputFormat.rotationDegrees != 0) { if (!codecAppliesRotation() && inputFormat.rotationDegrees != 0) {
@ -2013,8 +2024,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
renderer.context, renderer.context,
checkNotNull(videoEffects), checkNotNull(videoEffects),
DebugViewProvider.NONE, DebugViewProvider.NONE,
inputColorInfo, inputAndOutputColorInfos.first,
outputColorInfo, inputAndOutputColorInfos.second,
INPUT_TYPE_SURFACE, INPUT_TYPE_SURFACE,
/* releaseFramesAutomatically= */ false, /* releaseFramesAutomatically= */ false,
/* executor= */ handler::post, /* executor= */ handler::post,