Add validation for empty csd data
PiperOrigin-RevId: 552541399
This commit is contained in:
parent
87a020a154
commit
8c2d047b71
@ -473,8 +473,13 @@ import java.util.Locale;
|
|||||||
String fourcc = "mp4a";
|
String fourcc = "mp4a";
|
||||||
|
|
||||||
checkArgument(!format.initializationData.isEmpty(), "csd-0 not found in the format.");
|
checkArgument(!format.initializationData.isEmpty(), "csd-0 not found in the format.");
|
||||||
ByteBuffer csd0 = ByteBuffer.wrap(format.initializationData.get(0));
|
|
||||||
ByteBuffer contents = ByteBuffer.allocate(csd0.limit() + Mp4Utils.MAX_FIXED_LEAF_BOX_SIZE);
|
byte[] csd0 = format.initializationData.get(0);
|
||||||
|
checkArgument(csd0.length > 0, "csd-0 is empty.");
|
||||||
|
|
||||||
|
ByteBuffer csd0ByteBuffer = ByteBuffer.wrap(csd0);
|
||||||
|
ByteBuffer contents =
|
||||||
|
ByteBuffer.allocate(csd0ByteBuffer.limit() + Mp4Utils.MAX_FIXED_LEAF_BOX_SIZE);
|
||||||
|
|
||||||
contents.putInt(0x00); // reserved
|
contents.putInt(0x00); // reserved
|
||||||
contents.putShort((short) 0x0); // reserved
|
contents.putShort((short) 0x0); // reserved
|
||||||
@ -491,7 +496,7 @@ import java.util.Locale;
|
|||||||
int sampleRate = format.sampleRate;
|
int sampleRate = format.sampleRate;
|
||||||
contents.putInt(sampleRate << 16);
|
contents.putInt(sampleRate << 16);
|
||||||
|
|
||||||
contents.put(audioEsdsBox(format));
|
contents.put(audioEsdsBox(csd0ByteBuffer, format.peakBitrate, format.averageBitrate));
|
||||||
|
|
||||||
contents.flip();
|
contents.flip();
|
||||||
return BoxUtils.wrapIntoBox(fourcc, contents);
|
return BoxUtils.wrapIntoBox(fourcc, contents);
|
||||||
@ -837,15 +842,22 @@ import java.util.Locale;
|
|||||||
checkArgument(
|
checkArgument(
|
||||||
format.initializationData.size() >= 2, "csd-0 and/or csd-1 not found in the format.");
|
format.initializationData.size() >= 2, "csd-0 and/or csd-1 not found in the format.");
|
||||||
|
|
||||||
ByteBuffer csd0 = ByteBuffer.wrap(format.initializationData.get(0));
|
byte[] csd0 = format.initializationData.get(0);
|
||||||
ByteBuffer csd1 = ByteBuffer.wrap(format.initializationData.get(1));
|
checkArgument(csd0.length > 0, "csd-0 is empty.");
|
||||||
|
|
||||||
|
byte[] csd1 = format.initializationData.get(1);
|
||||||
|
checkArgument(csd1.length > 0, "csd-1 is empty.");
|
||||||
|
|
||||||
|
ByteBuffer csd0ByteBuffer = ByteBuffer.wrap(csd0);
|
||||||
|
ByteBuffer csd1ByteBuffer = ByteBuffer.wrap(csd1);
|
||||||
|
|
||||||
ByteBuffer contents =
|
ByteBuffer contents =
|
||||||
ByteBuffer.allocate(csd0.limit() + csd1.limit() + Mp4Utils.MAX_FIXED_LEAF_BOX_SIZE);
|
ByteBuffer.allocate(
|
||||||
|
csd0ByteBuffer.limit() + csd1ByteBuffer.limit() + Mp4Utils.MAX_FIXED_LEAF_BOX_SIZE);
|
||||||
|
|
||||||
contents.put((byte) 0x01); // configurationVersion
|
contents.put((byte) 0x01); // configurationVersion
|
||||||
|
|
||||||
ImmutableList<ByteBuffer> csd0NalUnits = AnnexBUtils.findNalUnits(csd0);
|
ImmutableList<ByteBuffer> csd0NalUnits = AnnexBUtils.findNalUnits(csd0ByteBuffer);
|
||||||
checkArgument(csd0NalUnits.size() == 1, "SPS data not found in csd0.");
|
checkArgument(csd0NalUnits.size() == 1, "SPS data not found in csd0.");
|
||||||
|
|
||||||
ByteBuffer sps = csd0NalUnits.get(0);
|
ByteBuffer sps = csd0NalUnits.get(0);
|
||||||
@ -865,7 +877,7 @@ import java.util.Locale;
|
|||||||
contents.put(sps); // sequenceParameterSetNALUnit
|
contents.put(sps); // sequenceParameterSetNALUnit
|
||||||
sps.rewind();
|
sps.rewind();
|
||||||
|
|
||||||
ImmutableList<ByteBuffer> csd1NalUnits = AnnexBUtils.findNalUnits(csd1);
|
ImmutableList<ByteBuffer> csd1NalUnits = AnnexBUtils.findNalUnits(csd1ByteBuffer);
|
||||||
checkState(csd1NalUnits.size() == 1, "PPS data not found in csd1.");
|
checkState(csd1NalUnits.size() == 1, "PPS data not found in csd1.");
|
||||||
|
|
||||||
contents.put((byte) 0x01); // numOfPictureParameterSets
|
contents.put((byte) 0x01); // numOfPictureParameterSets
|
||||||
@ -883,11 +895,17 @@ import java.util.Locale;
|
|||||||
private static ByteBuffer hvcCBox(Format format) {
|
private static ByteBuffer hvcCBox(Format format) {
|
||||||
// For H.265, all three codec-specific NALUs (VPS, SPS, PPS) are packed into csd-0.
|
// For H.265, all three codec-specific NALUs (VPS, SPS, PPS) are packed into csd-0.
|
||||||
checkArgument(!format.initializationData.isEmpty(), "csd-0 not found in the format.");
|
checkArgument(!format.initializationData.isEmpty(), "csd-0 not found in the format.");
|
||||||
ByteBuffer csd0 = ByteBuffer.wrap(format.initializationData.get(0));
|
|
||||||
|
|
||||||
ByteBuffer contents = ByteBuffer.allocate(csd0.limit() + Mp4Utils.MAX_FIXED_LEAF_BOX_SIZE);
|
byte[] csd0 = format.initializationData.get(0);
|
||||||
|
checkArgument(csd0.length > 0, "csd-0 is empty.");
|
||||||
|
|
||||||
ImmutableList<ByteBuffer> nalusWithEmulationPrevention = AnnexBUtils.findNalUnits(csd0);
|
ByteBuffer csd0ByteBuffer = ByteBuffer.wrap(csd0);
|
||||||
|
|
||||||
|
ByteBuffer contents =
|
||||||
|
ByteBuffer.allocate(csd0ByteBuffer.limit() + Mp4Utils.MAX_FIXED_LEAF_BOX_SIZE);
|
||||||
|
|
||||||
|
ImmutableList<ByteBuffer> nalusWithEmulationPrevention =
|
||||||
|
AnnexBUtils.findNalUnits(csd0ByteBuffer);
|
||||||
|
|
||||||
// Remove emulation prevention bytes to parse the actual csd-0 data.
|
// Remove emulation prevention bytes to parse the actual csd-0 data.
|
||||||
// For storing the csd-0 data into MP4 file, use original NALUs with emulation prevention bytes.
|
// For storing the csd-0 data into MP4 file, use original NALUs with emulation prevention bytes.
|
||||||
@ -971,8 +989,11 @@ import java.util.Locale;
|
|||||||
private static ByteBuffer av1CBox(Format format) {
|
private static ByteBuffer av1CBox(Format format) {
|
||||||
// For AV1, the entire codec-specific box is packed into csd-0.
|
// For AV1, the entire codec-specific box is packed into csd-0.
|
||||||
checkArgument(!format.initializationData.isEmpty(), "csd-0 is not found in the format");
|
checkArgument(!format.initializationData.isEmpty(), "csd-0 is not found in the format");
|
||||||
ByteBuffer csd0 = ByteBuffer.wrap(format.initializationData.get(0));
|
|
||||||
return BoxUtils.wrapIntoBox("av1C", csd0.duplicate());
|
byte[] csd0 = format.initializationData.get(0);
|
||||||
|
checkArgument(csd0.length > 0, "csd-0 is empty.");
|
||||||
|
|
||||||
|
return BoxUtils.wrapIntoBox("av1C", ByteBuffer.wrap(csd0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the pasp box. */
|
/** Returns the pasp box. */
|
||||||
@ -1056,10 +1077,9 @@ import java.util.Locale;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the esds box. */
|
/** Returns the esds box. */
|
||||||
private static ByteBuffer audioEsdsBox(Format format) {
|
private static ByteBuffer audioEsdsBox(
|
||||||
checkArgument(!format.initializationData.isEmpty(), "csd-0 is not found in the format.");
|
ByteBuffer csd0ByteBuffer, int peakBitrate, int averageBitrate) {
|
||||||
ByteBuffer csd0 = ByteBuffer.wrap(format.initializationData.get(0));
|
int csd0Size = csd0ByteBuffer.limit();
|
||||||
int csd0Size = csd0.limit();
|
|
||||||
|
|
||||||
ByteBuffer contents = ByteBuffer.allocate(csd0Size + Mp4Utils.MAX_FIXED_LEAF_BOX_SIZE);
|
ByteBuffer contents = ByteBuffer.allocate(csd0Size + Mp4Utils.MAX_FIXED_LEAF_BOX_SIZE);
|
||||||
contents.putInt(0x0); // version and flags.
|
contents.putInt(0x0); // version and flags.
|
||||||
@ -1085,13 +1105,13 @@ import java.util.Locale;
|
|||||||
contents.putShort((short) 0x03);
|
contents.putShort((short) 0x03);
|
||||||
contents.put((byte) 0x00); // 24-bit buffer size (0x300)
|
contents.put((byte) 0x00); // 24-bit buffer size (0x300)
|
||||||
|
|
||||||
contents.putInt(format.peakBitrate != Format.NO_VALUE ? format.peakBitrate : 0);
|
contents.putInt(peakBitrate != Format.NO_VALUE ? peakBitrate : 0);
|
||||||
contents.putInt(format.averageBitrate != Format.NO_VALUE ? format.bitrate : 0);
|
contents.putInt(averageBitrate != Format.NO_VALUE ? averageBitrate : 0);
|
||||||
|
|
||||||
contents.put((byte) 0x05); // DecoderSpecificInfoTag
|
contents.put((byte) 0x05); // DecoderSpecificInfoTag
|
||||||
contents.put((byte) csd0Size);
|
contents.put((byte) csd0Size);
|
||||||
contents.put(csd0);
|
contents.put(csd0ByteBuffer);
|
||||||
csd0.rewind();
|
csd0ByteBuffer.rewind();
|
||||||
|
|
||||||
contents.put((byte) 0x06); // SLConfigDescriptorTag
|
contents.put((byte) 0x06); // SLConfigDescriptorTag
|
||||||
contents.put((byte) 0x01);
|
contents.put((byte) 0x01);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user