Update colr
box values to be overridden by bitstream boxes
#minor-release PiperOrigin-RevId: 523983688
This commit is contained in:
parent
c71e4bf1ff
commit
596a7c7033
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user