Skip to content

Commit

Permalink
Keep the input data constant in consume method
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ManishaJajoo committed Jul 18, 2022
1 parent da47771 commit 3bacb16
Showing 1 changed file with 9 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ public void consume(
// | RR |P|V| PLEN |PEBIT|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
int currentPosition = data.getPosition();
int header = data.readUnsignedShort();
ParsableByteArray bitstreamData = new ParsableByteArray(data.getData().clone());
int header = bitstreamData.readUnsignedShort();
boolean pBitIsSet = (header & 0x400) > 0;

// Check if optional V (Video Redundancy Coding), PLEN or PEBIT is present, RFC4629 Section 5.1.
Expand All @@ -123,16 +124,16 @@ public void consume(
}
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.
if (payloadStartCode < PICTURE_START_CODE) {
Log.w(TAG, "Picture start Code (PSC) missing, dropping packet.");
return;
}
// Setting first two bytes of the start code. Refer RFC4629 Section 6.1.1.
data.getData()[currentPosition] = 0;
data.getData()[currentPosition + 1] = 0;
data.setPosition(currentPosition);
bitstreamData.getData()[currentPosition] = 0;
bitstreamData.getData()[currentPosition + 1] = 0;
bitstreamData.setPosition(currentPosition);
} else if (gotFirstPacketOfH263Frame) {
// Check that this packet is in the sequence of the previous packet.
int expectedSequenceNumber = RtpPacket.getNextSequenceNumber(previousSequenceNumber);
Expand All @@ -154,7 +155,7 @@ public void consume(
}

if (fragmentedSampleSizeBytes == 0) {
parseVopHeader(data, isOutputFormatSet);
parseVopHeader(bitstreamData, isOutputFormatSet);
if (!isOutputFormatSet && isKeyFrame) {
if (width != payloadFormat.format.width || height != payloadFormat.format.height) {
trackOutput.format(
Expand All @@ -163,9 +164,9 @@ public void consume(
isOutputFormatSet = true;
}
}
int fragmentSize = data.bytesLeft();
int fragmentSize = bitstreamData.bytesLeft();
// Write the video sample.
trackOutput.sampleData(data, fragmentSize);
trackOutput.sampleData(bitstreamData, fragmentSize);
fragmentedSampleSizeBytes += fragmentSize;
sampleTimeUsOfFragmentedSample =
toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp);
Expand Down

0 comments on commit 3bacb16

Please sign in to comment.