Keep the input data constant in consume method

Earlier, the consume method of RtpH263Reader was changing the bytes of the
input bitstream during header parse. This commit copies the input into
local context and changes the local variable as per the specifications
thus keeping the input constant.
This commit is contained in:
Manisha Jajoo 2022-07-18 10:43:41 +05:30
parent da47771d10
commit 3bacb1646c

View File

@ -104,7 +104,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
// | RR |P|V| PLEN |PEBIT| // | RR |P|V| PLEN |PEBIT|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
int currentPosition = data.getPosition(); int currentPosition = data.getPosition();
int header = data.readUnsignedShort(); ParsableByteArray bitstreamData = new ParsableByteArray(data.getData().clone());
int header = bitstreamData.readUnsignedShort();
boolean pBitIsSet = (header & 0x400) > 0; boolean pBitIsSet = (header & 0x400) > 0;
// Check if optional V (Video Redundancy Coding), PLEN or PEBIT is present, RFC4629 Section 5.1. // Check if optional V (Video Redundancy Coding), PLEN or PEBIT is present, RFC4629 Section 5.1.
@ -123,16 +124,16 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
} }
gotFirstPacketOfH263Frame = true; gotFirstPacketOfH263Frame = true;
int payloadStartCode = data.peekUnsignedByte() & 0xFC; int payloadStartCode = bitstreamData.peekUnsignedByte() & 0xFC;
// Packets that begin with a Picture Start Code(100000). Refer RFC4629 Section 6.1. // Packets that begin with a Picture Start Code(100000). Refer RFC4629 Section 6.1.
if (payloadStartCode < PICTURE_START_CODE) { if (payloadStartCode < PICTURE_START_CODE) {
Log.w(TAG, "Picture start Code (PSC) missing, dropping packet."); Log.w(TAG, "Picture start Code (PSC) missing, dropping packet.");
return; return;
} }
// Setting first two bytes of the start code. Refer RFC4629 Section 6.1.1. // Setting first two bytes of the start code. Refer RFC4629 Section 6.1.1.
data.getData()[currentPosition] = 0; bitstreamData.getData()[currentPosition] = 0;
data.getData()[currentPosition + 1] = 0; bitstreamData.getData()[currentPosition + 1] = 0;
data.setPosition(currentPosition); bitstreamData.setPosition(currentPosition);
} else if (gotFirstPacketOfH263Frame) { } else if (gotFirstPacketOfH263Frame) {
// Check that this packet is in the sequence of the previous packet. // Check that this packet is in the sequence of the previous packet.
int expectedSequenceNumber = RtpPacket.getNextSequenceNumber(previousSequenceNumber); int expectedSequenceNumber = RtpPacket.getNextSequenceNumber(previousSequenceNumber);
@ -154,7 +155,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
} }
if (fragmentedSampleSizeBytes == 0) { if (fragmentedSampleSizeBytes == 0) {
parseVopHeader(data, isOutputFormatSet); parseVopHeader(bitstreamData, isOutputFormatSet);
if (!isOutputFormatSet && isKeyFrame) { if (!isOutputFormatSet && isKeyFrame) {
if (width != payloadFormat.format.width || height != payloadFormat.format.height) { if (width != payloadFormat.format.width || height != payloadFormat.format.height) {
trackOutput.format( trackOutput.format(
@ -163,9 +164,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
isOutputFormatSet = true; isOutputFormatSet = true;
} }
} }
int fragmentSize = data.bytesLeft(); int fragmentSize = bitstreamData.bytesLeft();
// Write the video sample. // Write the video sample.
trackOutput.sampleData(data, fragmentSize); trackOutput.sampleData(bitstreamData, fragmentSize);
fragmentedSampleSizeBytes += fragmentSize; fragmentedSampleSizeBytes += fragmentSize;
sampleTimeUsOfFragmentedSample = sampleTimeUsOfFragmentedSample =
toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp); toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp);