Browse Source

lavf: refactor av_read_frame() to make it easier to understand.

tags/n0.10
Anton Khirnov 13 years ago
parent
commit
6450599e22
1 changed files with 33 additions and 25 deletions
  1. +33
    -25
      libavformat/utils.c

+ 33
- 25
libavformat/utils.c View File

@@ -31,6 +31,7 @@
#include "libavutil/pixdesc.h"
#include "metadata.h"
#include "id3v2.h"
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/mathematics.h"
#include "libavutil/parseutils.h"
@@ -1248,18 +1249,34 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
return 0;
}

static int read_from_packet_buffer(AVFormatContext *s, AVPacket *pkt)
{
AVPacketList *pktl = s->packet_buffer;
av_assert0(pktl);
*pkt = pktl->pkt;
s->packet_buffer = pktl->next;
av_freep(&pktl);
return 0;
}

int av_read_frame(AVFormatContext *s, AVPacket *pkt)
{
AVPacketList *pktl;
int eof=0;
const int genpts= s->flags & AVFMT_FLAG_GENPTS;

if (!genpts)
return s->packet_buffer ? read_from_packet_buffer(s, pkt) :
read_frame_internal(s, pkt);

for(;;){
int ret;
pktl = s->packet_buffer;

if (pktl) {
AVPacket *next_pkt= &pktl->pkt;

if(genpts && next_pkt->dts != AV_NOPTS_VALUE){
if (next_pkt->dts != AV_NOPTS_VALUE) {
int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
if( pktl->pkt.stream_index == next_pkt->stream_index
@@ -1272,33 +1289,24 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt)
pktl = s->packet_buffer;
}

if( next_pkt->pts != AV_NOPTS_VALUE
|| next_pkt->dts == AV_NOPTS_VALUE
|| !genpts || eof){
/* read packet from packet buffer, if there is data */
*pkt = *next_pkt;
s->packet_buffer = pktl->next;
av_free(pktl);
return 0;
}
/* read packet from packet buffer, if there is data */
if (!(next_pkt->pts == AV_NOPTS_VALUE &&
next_pkt->dts != AV_NOPTS_VALUE && !eof))
return read_from_packet_buffer(s, pkt);
}
if(genpts){
int ret= read_frame_internal(s, pkt);
if(ret<0){
if(pktl && ret != AVERROR(EAGAIN)){
eof=1;
continue;
}else
return ret;
}

if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
&s->packet_buffer_end)) < 0)
return AVERROR(ENOMEM);
}else{
assert(!s->packet_buffer);
return read_frame_internal(s, pkt);
ret = read_frame_internal(s, pkt);
if (ret < 0) {
if (pktl && ret != AVERROR(EAGAIN)) {
eof = 1;
continue;
} else
return ret;
}

if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
&s->packet_buffer_end)) < 0)
return AVERROR(ENOMEM);
}
}



Loading…
Cancel
Save