Update colr box values to be overridden by bitstream boxes

#minor-release

PiperOrigin-RevId: 523983688
This commit is contained in:
rohks 2023-04-13 14:25:27 +01:00 committed by Rohit Singh
parent c71e4bf1ff
commit 596a7c7033

View File

@ -1208,15 +1208,9 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
pixelWidthHeightRatio = hevcConfig.pixelWidthHeightRatio; pixelWidthHeightRatio = hevcConfig.pixelWidthHeightRatio;
} }
codecs = hevcConfig.codecs; codecs = hevcConfig.codecs;
// Modify these values only if they have not already been set. If 'Atom.TYPE_colr' atom is colorSpace = hevcConfig.colorSpace;
// present, these values may be overridden. colorRange = hevcConfig.colorRange;
if (colorSpace == Format.NO_VALUE colorTransfer = hevcConfig.colorTransfer;
&& colorRange == Format.NO_VALUE
&& colorTransfer == Format.NO_VALUE) {
colorSpace = hevcConfig.colorSpace;
colorRange = hevcConfig.colorRange;
colorTransfer = hevcConfig.colorTransfer;
}
} else if (childAtomType == Atom.TYPE_dvcC || childAtomType == Atom.TYPE_dvvC) { } else if (childAtomType == Atom.TYPE_dvcC || childAtomType == Atom.TYPE_dvvC) {
@Nullable DolbyVisionConfig dolbyVisionConfig = DolbyVisionConfig.parse(parent); @Nullable DolbyVisionConfig dolbyVisionConfig = DolbyVisionConfig.parse(parent);
if (dolbyVisionConfig != null) { if (dolbyVisionConfig != null) {
@ -1232,16 +1226,10 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
boolean fullRangeFlag = (parent.readUnsignedByte() & 1) != 0; boolean fullRangeFlag = (parent.readUnsignedByte() & 1) != 0;
int colorPrimaries = parent.readUnsignedByte(); int colorPrimaries = parent.readUnsignedByte();
int transferCharacteristics = parent.readUnsignedByte(); int transferCharacteristics = parent.readUnsignedByte();
// Modify these values only if they have not already been set. If 'Atom.TYPE_colr' atom is colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries);
// present, these values may be overridden. colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED;
if (colorSpace == Format.NO_VALUE colorTransfer =
&& colorRange == Format.NO_VALUE ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics);
&& colorTransfer == Format.NO_VALUE) {
colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries);
colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED;
colorTransfer =
ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics);
}
} else if (childAtomType == Atom.TYPE_av1C) { } else if (childAtomType == Atom.TYPE_av1C) {
ExtractorUtil.checkContainerInput(mimeType == null, /* message= */ null); ExtractorUtil.checkContainerInput(mimeType == null, /* message= */ null);
mimeType = MimeTypes.VIDEO_AV1; mimeType = MimeTypes.VIDEO_AV1;
@ -1321,26 +1309,33 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
} }
} }
} else if (childAtomType == Atom.TYPE_colr) { } else if (childAtomType == Atom.TYPE_colr) {
int colorType = parent.readInt(); // Only modify these values if they have not been previously established by the bitstream.
if (colorType == TYPE_nclx || colorType == TYPE_nclc) { // If 'Atom.TYPE_hvcC' atom or 'Atom.TYPE_vpcC' is available, they will take precedence and
// For more info on syntax, see Section 8.5.2.2 in ISO/IEC 14496-12:2012(E) and // overwrite any existing values.
// https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html. if (colorSpace == Format.NO_VALUE
int colorPrimaries = parent.readUnsignedShort(); && colorRange == Format.NO_VALUE
int transferCharacteristics = parent.readUnsignedShort(); && colorTransfer == Format.NO_VALUE) {
parent.skipBytes(2); // matrix_coefficients. int colorType = parent.readInt();
if (colorType == TYPE_nclx || colorType == TYPE_nclc) {
// For more info on syntax, see Section 8.5.2.2 in ISO/IEC 14496-12:2012(E) and
// https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html.
int colorPrimaries = parent.readUnsignedShort();
int transferCharacteristics = parent.readUnsignedShort();
parent.skipBytes(2); // matrix_coefficients.
// Only try and read full_range_flag if the box is long enough. It should be present in // Only try and read full_range_flag if the box is long enough. It should be present in
// all colr boxes with type=nclx (Section 8.5.2.2 in ISO/IEC 14496-12:2012(E)) but some // all colr boxes with type=nclx (Section 8.5.2.2 in ISO/IEC 14496-12:2012(E)) but some
// device cameras record videos with type=nclx without this final flag (and therefore // device cameras record videos with type=nclx without this final flag (and therefore
// size=18): https://github.com/google/ExoPlayer/issues/9332 // size=18): https://github.com/google/ExoPlayer/issues/9332
boolean fullRangeFlag = boolean fullRangeFlag =
childAtomSize == 19 && (parent.readUnsignedByte() & 0b10000000) != 0; childAtomSize == 19 && (parent.readUnsignedByte() & 0b10000000) != 0;
colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries); colorSpace = ColorInfo.isoColorPrimariesToColorSpace(colorPrimaries);
colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED; colorRange = fullRangeFlag ? C.COLOR_RANGE_FULL : C.COLOR_RANGE_LIMITED;
colorTransfer = colorTransfer =
ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics); ColorInfo.isoTransferCharacteristicsToColorTransfer(transferCharacteristics);
} else { } else {
Log.w(TAG, "Unsupported color type: " + Atom.getAtomTypeString(colorType)); Log.w(TAG, "Unsupported color type: " + Atom.getAtomTypeString(colorType));
}
} }
} }
childPosition += childAtomSize; childPosition += childAtomSize;