diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-10-28 02:53:33 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-10-28 03:05:16 +0200 |
commit | 8d4e44993a87a9b230c5c87cf892dd58adcebcc4 (patch) | |
tree | d21f2d4bbcbe37b7876356b60b11f3f8eddb33f5 /libavformat/iv8.c | |
parent | aa638b4600e1fa7a1b64323b8228c459af644a47 (diff) | |
parent | 15946eb8a940416d9792c65900273d674f9c152a (diff) | |
download | ffmpeg-8d4e44993a87a9b230c5c87cf892dd58adcebcc4.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
lavc: remove "legacy" mpegvideo decoder.
iv8: assemble packets to return complete frames
pulse: documentation
pulse: introduce pulseaudio input
remove the zork pcm seek test
Conflicts:
configure
libavdevice/Makefile
libavdevice/alldevices.c
libavdevice/avdevice.h
libavdevice/pulse.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/iv8.c')
-rw-r--r-- | libavformat/iv8.c | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/libavformat/iv8.c b/libavformat/iv8.c index 03593982bf..1db4c0325a 100644 --- a/libavformat/iv8.c +++ b/libavformat/iv8.c @@ -55,33 +55,56 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap) static int read_packet(AVFormatContext *s, AVPacket *pkt) { - int ret, size, pts, type; -retry: - type= avio_rb16(s->pb); // 257 or 258 - size= avio_rb16(s->pb); - - avio_rb16(s->pb); //some flags, 0x80 indicates end of frame - avio_rb16(s->pb); //packet number - pts=avio_rb32(s->pb); - avio_rb32(s->pb); //6A 13 E3 88 - - size -= 12; - if(size<1) - return -1; - - if(type==258){ - avio_skip(s->pb, size); - goto retry; + int ret, size, pts, type, flags; + int first_pkt = 0; + int frame_complete = 0; + + while (!frame_complete) { + + type = avio_rb16(s->pb); // 257 or 258 + size = avio_rb16(s->pb); + flags = avio_rb16(s->pb); //some flags, 0x80 indicates end of frame + avio_rb16(s->pb); //packet number + pts = avio_rb32(s->pb); + avio_rb32(s->pb); //6A 13 E3 88 + + frame_complete = flags & 0x80; + + size -= 12; + if (size < 1) + return -1; + + if (type == 258) { + avio_skip(s->pb, size); + frame_complete = 0; + continue; + } + + if (!first_pkt) { + ret = av_get_packet(s->pb, pkt, size); + if (ret < 0) + return ret; + first_pkt = 1; + pkt->pts = pts; + pkt->pos -= 16; + } else { + ret = av_append_packet(s->pb, pkt, size); + if (ret < 0) { + av_log(s, AV_LOG_ERROR, "failed to grow packet\n"); + av_free_packet(pkt); + return ret; + } + } + if (ret < size) { + av_log(s, AV_LOG_ERROR, "Truncated packet! Read %d of %d bytes\n", + ret, size); + pkt->flags |= AV_PKT_FLAG_CORRUPT; + break; + } } - - ret= av_get_packet(s->pb, pkt, size); - - pkt->pts= pts; - pkt->pos-=16; - pkt->stream_index = 0; - return ret; + return 0; } AVInputFormat ff_iv8_demuxer = { |