diff options
author | jstebbins <[email protected]> | 2010-03-13 17:15:20 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2010-03-13 17:15:20 +0000 |
commit | 739144a299157a8e92ef9caeedfde29eac33cbcd (patch) | |
tree | b1e9e48bc4769ed4b0080176d0332205a5da2569 | |
parent | b1f84aa2f21e9a775ad186c24527141ba4aae1b0 (diff) |
extend search range for TS re-sync
we were only checking approx the next 16K bytes when sync was lost in
a transport stream. now we will continues searching to the end of the file.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3165 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r-- | libhb/stream.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/libhb/stream.c b/libhb/stream.c index 998aac4c6..e30bcb326 100644 --- a/libhb/stream.c +++ b/libhb/stream.c @@ -1659,35 +1659,45 @@ static void hb_ts_stream_init(hb_stream_t *stream) static off_t align_to_next_packet(hb_stream_t *stream) { uint8_t buf[MAX_HOLE]; - off_t pos = 0; + off_t pos = 0; off_t start = ftello(stream->file_handle); + off_t orig; if ( start >= stream->packetsize ) { start -= stream->packetsize; fseeko(stream->file_handle, start, SEEK_SET); } + orig = start; - if (fread(buf, sizeof(buf), 1, stream->file_handle) == 1) - { - const uint8_t *bp = buf; - int i; - - for ( i = sizeof(buf); --i >= 0; ++bp ) + while (1) + { + if (fread(buf, sizeof(buf), 1, stream->file_handle) == 1) { - if ( have_ts_sync( bp, stream->packetsize ) ) + const uint8_t *bp = buf; + int i; + + for ( i = sizeof(buf) - 8 * stream->packetsize; --i >= 0; ++bp ) + { + if ( have_ts_sync( bp, stream->packetsize ) ) + { + break; + } + } + if ( i >= 0 ) { + pos = ( bp - buf ) - stream->packetsize + 188; break; } + fseeko(stream->file_handle, -8 * stream->packetsize, SEEK_CUR); + start = ftello(stream->file_handle); } - if ( i >= 0 ) + else { - pos = ( bp - buf ) - stream->packetsize + 188; - if ( pos < 0 ) - pos = 0; + return 0; } - } + } fseeko(stream->file_handle, start+pos, SEEK_SET); - return pos; + return start - orig + pos; } |