[FFmpeg-cvslog] lavf: refactor av_read_frame() to make it easier to understand.
Anton Khirnov
git at videolan.org
Fri Jan 6 02:53:07 CET 2012
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Thu Jan 5 10:14:07 2012 +0100| [6450599e224164d51a90b1be38598cbc3093bad6] | committer: Anton Khirnov
lavf: refactor av_read_frame() to make it easier to understand.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6450599e224164d51a90b1be38598cbc3093bad6
---
libavformat/utils.c | 58 +++++++++++++++++++++++++++++----------------------
1 files changed, 33 insertions(+), 25 deletions(-)
diff --git a/libavformat/utils.c b/libavformat/utils.c
index db02878..0332927 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -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);
}
}
More information about the ffmpeg-cvslog
mailing list