You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
lavf: refactor av_read_frame() to make it easier to understand.
This commit is contained in:
@@ -31,6 +31,7 @@
|
|||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "metadata.h"
|
#include "metadata.h"
|
||||||
#include "id3v2.h"
|
#include "id3v2.h"
|
||||||
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
#include "libavutil/parseutils.h"
|
#include "libavutil/parseutils.h"
|
||||||
@@ -1248,18 +1249,34 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
|
|||||||
return 0;
|
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)
|
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
|
||||||
{
|
{
|
||||||
AVPacketList *pktl;
|
AVPacketList *pktl;
|
||||||
int eof=0;
|
int eof=0;
|
||||||
const int genpts= s->flags & AVFMT_FLAG_GENPTS;
|
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(;;){
|
for(;;){
|
||||||
|
int ret;
|
||||||
pktl = s->packet_buffer;
|
pktl = s->packet_buffer;
|
||||||
|
|
||||||
if (pktl) {
|
if (pktl) {
|
||||||
AVPacket *next_pkt= &pktl->pkt;
|
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;
|
int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
|
||||||
while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
|
while(pktl && next_pkt->pts == AV_NOPTS_VALUE){
|
||||||
if( pktl->pkt.stream_index == next_pkt->stream_index
|
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;
|
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 */
|
/* read packet from packet buffer, if there is data */
|
||||||
*pkt = *next_pkt;
|
if (!(next_pkt->pts == AV_NOPTS_VALUE &&
|
||||||
s->packet_buffer = pktl->next;
|
next_pkt->dts != AV_NOPTS_VALUE && !eof))
|
||||||
av_free(pktl);
|
return read_from_packet_buffer(s, pkt);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if(genpts){
|
ret = read_frame_internal(s, pkt);
|
||||||
int ret= read_frame_internal(s, pkt);
|
if (ret < 0) {
|
||||||
if(ret<0){
|
if (pktl && ret != AVERROR(EAGAIN)) {
|
||||||
if(pktl && ret != AVERROR(EAGAIN)){
|
eof = 1;
|
||||||
eof=1;
|
|
||||||
continue;
|
continue;
|
||||||
}else
|
} else
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
|
if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
|
||||||
&s->packet_buffer_end)) < 0)
|
&s->packet_buffer_end)) < 0)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}else{
|
|
||||||
assert(!s->packet_buffer);
|
|
||||||
return read_frame_internal(s, pkt);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user