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