diff options
author | jstebbins <[email protected]> | 2010-01-31 00:13:03 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2010-01-31 00:13:03 +0000 |
commit | 0581eb1fc14c8f1c3e5b74865ae3b7d0734e062e (patch) | |
tree | 4a532c74fadd000a0e9640e07de1973b128af47d /libhb/stream.c | |
parent | 377768a2a90f5b470a1c047a02f4c998a8b348b4 (diff) |
fix problem with reading program streams
audio PES packets can have sequences that look like start codes in the data
so parse PES enough to get the length and skip the data.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3089 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/stream.c')
-rw-r--r-- | libhb/stream.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/libhb/stream.c b/libhb/stream.c index fc51b1b23..09334a48b 100644 --- a/libhb/stream.c +++ b/libhb/stream.c @@ -1192,6 +1192,37 @@ int hb_stream_read( hb_stream_t * src_stream, hb_buffer_t * b ) ep = b->data + b->alloc; } *cp++ = c; + // Non-video streams can emulate start codes, so we need + // to inspect PES packets and skip over their data + // sections to avoid mis-detection of the next pack header. + if ( ( strt_code >> 8 ) == 0x000001 && + ( strt_code & 0xff ) >= 0xbb ) + { + int len = 0; + c = getc_unlocked( src_stream->file_handle ); + if ( c == EOF ) + break; + len = c << 8; + c = getc_unlocked( src_stream->file_handle ); + if ( c == EOF ) + break; + len |= c; + if ( cp+len+2 > ep ) + { + // need to expand the buffer + int curSize = cp - b->data; + if ( curSize * 2 > curSize+len+2 ) + hb_buffer_realloc( b, curSize * 2 ); + else + hb_buffer_realloc( b, curSize + len + 2 ); + cp = b->data + curSize; + ep = b->data + b->alloc; + } + *cp++ = len >> 8; + *cp++ = len & 0xff; + fread_unlocked( cp, 1, len, src_stream->file_handle ); + cp += len; + } } funlockfile( src_stream->file_handle ); @@ -1201,7 +1232,8 @@ int hb_stream_read( hb_stream_t * src_stream, hb_buffer_t * b ) if ( c != EOF ) { fseeko( src_stream->file_handle, -4, SEEK_CUR ); - b->size -= 4; + // Only 3 of the 4 bytes read were added to the buffer. + b->size -= 3; } return 1; } |