提交 cf543c65 编写于 作者: J Janne Grunau

iv8: assemble packets to return complete frames

上级 c4b97fbd
...@@ -55,33 +55,56 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -55,33 +55,56 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap)
static int read_packet(AVFormatContext *s, AVPacket *pkt) static int read_packet(AVFormatContext *s, AVPacket *pkt)
{ {
int ret, size, pts, type; int ret, size, pts, type, flags;
retry: int first_pkt = 0;
type= avio_rb16(s->pb); // 257 or 258 int frame_complete = 0;
size= avio_rb16(s->pb);
while (!frame_complete) {
avio_rb16(s->pb); //some flags, 0x80 indicates end of frame
avio_rb16(s->pb); //packet number type = avio_rb16(s->pb); // 257 or 258
pts=avio_rb32(s->pb); size = avio_rb16(s->pb);
avio_rb32(s->pb); //6A 13 E3 88 flags = avio_rb16(s->pb); //some flags, 0x80 indicates end of frame
avio_rb16(s->pb); //packet number
size -= 12; pts = avio_rb32(s->pb);
if(size<1) avio_rb32(s->pb); //6A 13 E3 88
return -1;
frame_complete = flags & 0x80;
if(type==258){
avio_skip(s->pb, size); size -= 12;
goto retry; 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; pkt->stream_index = 0;
return ret; return 0;
} }
AVInputFormat ff_iv8_demuxer = { AVInputFormat ff_iv8_demuxer = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册