Mercurial > libavformat.hg
changeset 841:ba7631ba33a7 libavformat
support fixing missing pts by parsing future frames
author | michael |
---|---|
date | Mon, 15 Aug 2005 14:22:43 +0000 |
parents | 8834d33b7ca1 |
children | 43210d766412 |
files | avformat.h utils.c |
diffstat | 2 files changed, 63 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/avformat.h Sun Aug 14 16:37:29 2005 +0000 +++ b/avformat.h Mon Aug 15 14:22:43 2005 +0000 @@ -5,8 +5,8 @@ extern "C" { #endif -#define LIBAVFORMAT_VERSION_INT ((49<<16)+(0<<8)+0) -#define LIBAVFORMAT_VERSION 49.0.0 +#define LIBAVFORMAT_VERSION_INT ((49<<16)+(1<<8)+0) +#define LIBAVFORMAT_VERSION 49.1.0 #define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) @@ -332,6 +332,8 @@ /* number of times to loop output in formats that support it */ int loop_output; + int flags; +#define AVFMT_FLAG_GENPTS 0x0001 ///< generate pts if missing even if it requires parsing future frames } AVFormatContext; typedef struct AVPacketList {
--- a/utils.c Sun Aug 14 16:37:29 2005 +0000 +++ b/utils.c Mon Aug 15 14:22:43 2005 +0000 @@ -955,16 +955,66 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) { AVPacketList *pktl; + int eof=0; + const int genpts= s->flags & AVFMT_FLAG_GENPTS; - pktl = s->packet_buffer; - if (pktl) { - /* read packet from packet buffer, if there is data */ - *pkt = pktl->pkt; - s->packet_buffer = pktl->next; - av_free(pktl); - return 0; - } else { - return av_read_frame_internal(s, pkt); + for(;;){ + pktl = s->packet_buffer; + if (pktl) { + AVPacket *next_pkt= &pktl->pkt; + AVStream *st= s->streams[ next_pkt->stream_index ]; + + if(genpts && next_pkt->dts != AV_NOPTS_VALUE){ + while(pktl && next_pkt->pts == AV_NOPTS_VALUE){ + if( pktl->pkt.stream_index == next_pkt->stream_index + && next_pkt->dts < pktl->pkt.dts + && pktl->pkt.pts != pktl->pkt.dts //not b frame + /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){ + next_pkt->pts= pktl->pkt.dts; + } + pktl= pktl->next; + } + 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; + } + } + if(genpts){ + AVPacketList **plast_pktl= &s->packet_buffer; + int ret= av_read_frame_internal(s, pkt); + if(ret<0){ + if(pktl && ret != -EAGAIN){ + eof=1; + continue; + }else + return ret; + } + + /* duplicate the packet */ + if (av_dup_packet(pkt) < 0) + return AVERROR_NOMEM; + + while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last? + + pktl = av_mallocz(sizeof(AVPacketList)); + if (!pktl) + return AVERROR_NOMEM; + + /* add the packet in the buffered packet list */ + *plast_pktl = pktl; + pktl->pkt= *pkt; + }else{ + assert(!s->packet_buffer); + return av_read_frame_internal(s, pkt); + } } }