h264: don't mess with packet length

This commit is contained in:
martii
2013-07-19 10:30:04 +02:00
committed by Stefan Seyfried
parent b59343cf69
commit 852d4e69ea
2 changed files with 42 additions and 50 deletions

View File

@@ -148,8 +148,8 @@ static int writeData(void* _call)
return 0; return 0;
} }
// This seems to make playback unreliable. Disabled for now. --martii
if((call->len > 3) && ((call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x00 && call->data[3] == 0x01) || if((call->len > 3) && ((call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x00 && call->data[3] == 0x01) ||
// This seems to make playback unreliable. Disabled for now. --martii
//(call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x01 && NoOtherBeginningFound) || //(call->data[0] == 0x00 && call->data[1] == 0x00 && call->data[2] == 0x01 && NoOtherBeginningFound) ||
(call->data[0] == 0xff && call->data[1] == 0xff && call->data[2] == 0xff && call->data[3] == 0xff))) (call->data[0] == 0xff && call->data[1] == 0xff && call->data[2] == 0xff && call->data[3] == 0xff)))
{ {
@@ -292,61 +292,53 @@ static int writeData(void* _call)
unsigned int NalStart = 0; unsigned int NalStart = 0;
unsigned int VideoPosition = 0; unsigned int VideoPosition = 0;
ic = 0;
do { do {
unsigned int NalLength; unsigned int NalLength;
unsigned char NalData[4]; unsigned char NalData[4];
int NalPresent = 1; int NalPresent = 1;
memcpy (NalData, call->data + VideoPosition, NalLengthBytes); memcpy (NalData, call->data + VideoPosition, NalLengthBytes);
VideoPosition += NalLengthBytes; VideoPosition += NalLengthBytes;
NalStart += NalLengthBytes; NalStart += NalLengthBytes;
switch(NalLengthBytes) { switch(NalLengthBytes) {
case 1: NalLength = (NalData[0]); break; case 1: NalLength = (NalData[0]); break;
case 2: NalLength = (NalData[0] << 8) | (NalData[1]); break; case 2: NalLength = (NalData[0] << 8) | (NalData[1]); break;
case 3: NalLength = (NalData[0] << 16) | (NalData[1] << 8) | (NalData[2]); break; case 3: NalLength = (NalData[0] << 16) | (NalData[1] << 8) | (NalData[2]); break;
default: NalLength = (NalData[0] << 24) | (NalData[1] << 16) | (NalData[2] << 8) | (NalData[3]); break; default: NalLength = (NalData[0] << 24) | (NalData[1] << 16) | (NalData[2] << 8) | (NalData[3]); break;
}
h264_printf(20, "NalStart = %u + NalLength = %u > SampleSize = %u\n", NalStart, NalLength, SampleSize);
if (NalStart + NalLength > SampleSize) {
h264_printf(20, "nal length past end of buffer - size %u frame offset %u left %u\n",
NalLength, NalStart , SampleSize - NalStart );
NalStart = SampleSize;
} else {
NalStart += NalLength;
while (NalLength > 0) {
unsigned int PacketLength = (NalLength < BUFFER_SIZE) ? NalLength : BUFFER_SIZE;
NalLength -= PacketLength;
ic = 0;
iov[ic++].iov_base = PesHeader;
if (NalPresent) {
NalPresent = 0;
iov[ic].iov_base = (char *)Head;
iov[ic++].iov_len = sizeof(Head);
PacketLength += sizeof(Head);
} }
iov[ic].iov_base = call->data + VideoPosition; h264_printf(20, "NalStart = %u + NalLength = %u > SampleSize = %u\n", NalStart, NalLength, SampleSize);
iov[ic++].iov_len = PacketLength;
VideoPosition += PacketLength;
h264_printf (20, " pts=%llu\n", VideoPts); if (NalStart + NalLength > SampleSize) {
h264_printf(20, "nal length past end of buffer - size %u frame offset %u left %u\n",
NalLength, NalStart , SampleSize - NalStart );
iov[0].iov_len = InsertPesHeader (PesHeader, PacketLength, MPEG_VIDEO_PES_START_CODE, VideoPts, 0); NalStart = SampleSize;
ssize_t l = writev(call->fd, iov, ic); } else {
if (l < 0) NalStart += NalLength;
return l; ic = 0;
len += l; iov[ic++].iov_base = PesHeader;
VideoPts = INVALID_PTS_VALUE; if (NalPresent) {
} NalPresent = 0;
} iov[ic].iov_base = (char *)Head;
iov[ic++].iov_len = sizeof(Head);
}
iov[ic].iov_base = call->data + VideoPosition;
iov[ic++].iov_len = NalLength;
VideoPosition += NalLength;
h264_printf (20, " pts=%llu\n", VideoPts);
iov[0].iov_len = InsertPesHeader (PesHeader, NalLength, MPEG_VIDEO_PES_START_CODE, VideoPts, 0);
ssize_t l = writev(call->fd, iov, ic);
if (l < 0)
return l;
len += l;
VideoPts = INVALID_PTS_VALUE;
}
} while (NalStart < SampleSize); } while (NalStart < SampleSize);
if (len < 0) if (len < 0)

View File

@@ -310,7 +310,7 @@ static int PlaybackOpen(Context_t *context, char * uri) {
} /* upnp */ } /* upnp */
else { else {
playback_err("Unknown stream!\n"); playback_err("Unknown stream (%s)\n", uri);
return cERR_PLAYBACK_ERROR; return cERR_PLAYBACK_ERROR;
} }
} }