Index: libs/libavformat/mpeg.c =================================================================== --- libs/libavformat/mpeg.c (revision 12673) +++ libs/libavformat/mpeg.c (working copy) @@ -1440,15 +1440,18 @@ { MpegDemuxContext *m = s->priv_data; int len, size, startcode, c, flags, header_len; - int64_t pts, dts, last_pos; + int64_t pts, dts; + int64_t last_sync= url_ftell(&s->pb); - last_pos = -1; + error_redo: + url_fseek(&s->pb, last_sync, SEEK_SET); redo: /* next start code (should be immediately after) */ m->header_state = 0xff; size = MAX_SYNC_SIZE; startcode = find_next_start_code(&s->pb, &size, &m->header_state); - //printf("startcode=%x pos=0x%Lx\n", startcode, url_ftell(&s->pb)); + last_sync = url_ftell(&s->pb); + //printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(&s->pb)); if (startcode < 0) return AVERROR_IO; if (startcode == PACK_START_CODE) @@ -1481,7 +1484,7 @@ /* stuffing */ for(;;) { if (len < 1) - goto redo; + goto error_redo; c = get_byte(&s->pb); len--; /* XXX: for mpeg1, should test only bit 7 */ @@ -1490,23 +1493,17 @@ } if ((c & 0xc0) == 0x40) { /* buffer scale & size */ - if (len < 2) - goto redo; get_byte(&s->pb); c = get_byte(&s->pb); len -= 2; } - if ((c & 0xf0) == 0x20) { - if (len < 4) - goto redo; + if ((c & 0xe0) == 0x20) { dts = pts = get_pts(&s->pb, c); len -= 4; - } else if ((c & 0xf0) == 0x30) { - if (len < 9) - goto redo; - pts = get_pts(&s->pb, c); - dts = get_pts(&s->pb, -1); - len -= 9; + if (c & 0x10){ + dts = get_pts(&s->pb, -1); + len -= 5; + } } else if ((c & 0xc0) == 0x80) { /* mpeg 2 PES */ #if 0 /* some streams have this field set for no apparent reason */ @@ -1519,45 +1516,36 @@ header_len = get_byte(&s->pb); len -= 2; if (header_len > len) - goto redo; - if ((flags & 0xc0) == 0x80) { + goto error_redo; + len -= header_len; + if (flags & 0x80) { dts = pts = get_pts(&s->pb, -1); - if (header_len < 5) - goto redo; header_len -= 5; - len -= 5; - } if ((flags & 0xc0) == 0xc0) { - pts = get_pts(&s->pb, -1); - dts = get_pts(&s->pb, -1); - if (header_len < 10) - goto redo; - header_len -= 10; - len -= 10; + if (flags & 0x40) { + dts = get_pts(&s->pb, -1); + header_len -= 5; + } } - len -= header_len; - while (header_len > 0) { - get_byte(&s->pb); - header_len--; - } + if(header_len < 0) + goto error_redo; + url_fskip(&s->pb, header_len); } else if( c!= 0xf ) goto redo; if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) { - if (len < 1) - goto redo; startcode = get_byte(&s->pb); len--; if (startcode >= 0x80 && startcode <= 0xbf) { /* audio: skip header */ - if (len < 3) - goto redo; get_byte(&s->pb); get_byte(&s->pb); get_byte(&s->pb); len -= 3; } } + if(len<0) + goto error_redo; if(dts != AV_NOPTS_VALUE && ppos && s->build_index){ int i; for(i=0; inb_streams; i++){ Index: libs/libmythtv/avformatdecoder.cpp =================================================================== --- libs/libmythtv/avformatdecoder.cpp (revision 12673) +++ libs/libmythtv/avformatdecoder.cpp (working copy) @@ -341,7 +341,7 @@ { if (ic) { - for (int i = 0; i < ic->nb_streams; i++) + for (unsigned int i = 0; i < ic->nb_streams; i++) { QMutexLocker locker(&avcodeclock); AVStream *st = ic->streams[i]; @@ -403,7 +403,7 @@ getrawframes = false; AVStream *st = NULL; - int i; + unsigned int i; for (i = 0; i < ic->nb_streams; i++) { AVStream *st1 = ic->streams[i]; @@ -508,7 +508,7 @@ // Flush the avcodec buffers VERBOSE(VB_PLAYBACK, LOC + "SeekReset() flushing"); - for (int i = 0; i < ic->nb_streams; i++) + for (unsigned int i = 0; i < ic->nb_streams; i++) { AVCodecContext *enc = ic->streams[i]->codec; if (enc->codec) @@ -661,7 +661,10 @@ ic->pb.pos = 0; ic->pb.must_flush = 0; ic->pb.eof_reached = 0; - ic->pb.is_streamed = 0; + if (ringBuffer->isDVD()) + ic->pb.is_streamed = 1; + else + ic->pb.is_streamed = 0; ic->pb.max_packet_size = 0; } @@ -1276,7 +1279,7 @@ map lang_sub_cnt; map lang_aud_cnt; - for (int i = 0; i < ic->nb_streams; i++) + for (unsigned int i = 0; i < ic->nb_streams; i++) { AVCodecContext *enc = ic->streams[i]->codec; VERBOSE(VB_PLAYBACK, LOC + @@ -1381,7 +1384,7 @@ selectedVideoIndex = i; } - InitVideoCodec(ic->streams[i], enc, selectedVideoIndex == i); + InitVideoCodec(ic->streams[i], enc, selectedVideoIndex == (int)i); ScanATSCCaptionStreams(i); @@ -2396,7 +2399,7 @@ bool AvFormatDecoder::SetVideoByComponentTag(int tag) { - for (int i = 0; i < ic->nb_streams; i++) + for (unsigned int i = 0; i < ic->nb_streams; i++) { AVStream *s = ic->streams[i]; if (s) @@ -2778,7 +2781,6 @@ delete pkt; return false; } - if (waitingForChange && pkt->pos >= readAdjust) FileChanged(); @@ -2786,7 +2788,7 @@ pkt->pos -= readAdjust; } - if (pkt->stream_index > ic->nb_streams) + if (pkt->stream_index > (int)ic->nb_streams) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Bad stream"); av_free_packet(pkt); @@ -3419,7 +3421,7 @@ AudioInfo old_out = audioOut; if ((currentTrack[kTrackTypeAudio] >= 0) && - (selectedTrack[kTrackTypeAudio].av_stream_index <= ic->nb_streams) && + (selectedTrack[kTrackTypeAudio].av_stream_index <= (int)ic->nb_streams) && (curstream = ic->streams[selectedTrack[kTrackTypeAudio] .av_stream_index])) {