From 2940b38ef2488f3ad84421cab0f7dc1c13f043fb Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Sat, 7 Jun 2008 00:49:03 +0000 Subject: [PATCH] fix pts handling in ffm Originally committed as revision 13683 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/ffm.h | 5 +---- libavformat/ffmdec.c | 6 ------ libavformat/ffmenc.c | 27 ++++++++------------------- tests/libav.regression.ref | 2 +- 4 files changed, 10 insertions(+), 30 deletions(-) diff --git a/libavformat/ffm.h b/libavformat/ffm.h index 83cfdb600d..ebbf992480 100644 --- a/libavformat/ffm.h +++ b/libavformat/ffm.h @@ -32,10 +32,6 @@ #define FRAME_HEADER_SIZE 8 #define FLAG_KEY_FRAME 0x01 -typedef struct FFMStream { - int64_t pts; -} FFMStream; - enum { READ_HEADER, READ_DATA, @@ -55,6 +51,7 @@ typedef struct FFMContext { int64_t pts; uint8_t *packet_ptr, *packet_end; uint8_t packet[FFM_PACKET_SIZE]; + int64_t start_time; } FFMContext; #endif /* FFMPEG_FFM_H */ diff --git a/libavformat/ffmdec.c b/libavformat/ffmdec.c index 9e1d57f3d2..9c0ea89eb4 100644 --- a/libavformat/ffmdec.c +++ b/libavformat/ffmdec.c @@ -232,7 +232,6 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) { FFMContext *ffm = s->priv_data; AVStream *st; - FFMStream *fst; ByteIOContext *pb = s->pb; AVCodecContext *codec; int i, nb_streams; @@ -263,15 +262,10 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap) st = av_new_stream(s, 0); if (!st) goto fail; - fst = av_mallocz(sizeof(FFMStream)); - if (!fst) - goto fail; s->streams[i] = st; av_set_pts_info(st, 64, 1, 1000000); - st->priv_data = fst; - codec = st->codec; /* generic info */ codec->codec_id = get_be32(pb); diff --git a/libavformat/ffmenc.c b/libavformat/ffmenc.c index e4f7adf540..c07beb989d 100644 --- a/libavformat/ffmenc.c +++ b/libavformat/ffmenc.c @@ -92,7 +92,6 @@ static int ffm_write_header(AVFormatContext *s) { FFMContext *ffm = s->priv_data; AVStream *st; - FFMStream *fst; ByteIOContext *pb = s->pb; AVCodecContext *codec; int bit_rate, i; @@ -116,11 +115,7 @@ static int ffm_write_header(AVFormatContext *s) /* list of streams */ for(i=0;inb_streams;i++) { st = s->streams[i]; - fst = av_mallocz(sizeof(FFMStream)); - if (!fst) - goto fail; av_set_pts_info(st, 64, 1, 1000000); - st->priv_data = fst; codec = st->codec; /* generic info */ @@ -176,13 +171,14 @@ static int ffm_write_header(AVFormatContext *s) default: return -1; } - /* hack to have real time */ - if (ffm_nopts) - fst->pts = 0; - else - fst->pts = av_gettime(); } + /* hack to have real time */ + if (ffm_nopts) + ffm->start_time = 0; + else + ffm->start_time = av_gettime(); + /* flush until end of block reached */ while ((url_ftell(pb) % ffm->packet_size) != 0) put_byte(pb, 0); @@ -198,22 +194,16 @@ static int ffm_write_header(AVFormatContext *s) ffm->first_packet = 1; return 0; - fail: - for(i=0;inb_streams;i++) { - st = s->streams[i]; - av_freep(&st->priv_data); - } - return -1; } static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt) { + FFMContext *ffm = s->priv_data; AVStream *st = s->streams[pkt->stream_index]; - FFMStream *fst = st->priv_data; int64_t pts; uint8_t header[FRAME_HEADER_SIZE]; - pts = fst->pts; + pts = ffm->start_time + pkt->pts; /* packet size & key_frame */ header[0] = pkt->stream_index; header[1] = 0; @@ -224,7 +214,6 @@ static int ffm_write_packet(AVFormatContext *s, AVPacket *pkt) ffm_write_data(s, header, FRAME_HEADER_SIZE, pts, 1); ffm_write_data(s, pkt->data, pkt->size, pts, 0); - fst->pts += pkt->duration; return 0; } diff --git a/tests/libav.regression.ref b/tests/libav.regression.ref index 33f2b819a1..bac56bcccf 100644 --- a/tests/libav.regression.ref +++ b/tests/libav.regression.ref @@ -15,7 +15,7 @@ bdb7484c68db722f66ba1630cf79844c *./tests/data/b-libav.mpg d6fdeb9f7083cc827f9510c6c4517dc0 *./tests/data/b-libav.swf 335771 ./tests/data/b-libav.swf ./tests/data/b-libav.swf CRC=0xe14e8847 -745e811e246f3727dc80a7504a18b129 *./tests/data/b-libav.ffm +bf28235fdc3bdd77faf251a239b6bc58 *./tests/data/b-libav.ffm 380928 ./tests/data/b-libav.ffm ./tests/data/b-libav.ffm CRC=0xca8f6870 f8ad5bd78f4d012a8ce9570aa395ac54 *./tests/data/b-libav.flv