[FFmpeg-cvslog] lavf: Only initialize s-> offset once when using avoid_negative_ts make_zero

Martin Storsjö git at videolan.org
Tue Nov 18 02:55:26 CET 2014


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Mon Nov 17 13:31:47 2014 +0200| [9257692ac15eff7b07540c1f61cebde0d8823fbd] | committer: Martin Storsjö

lavf: Only initialize s->offset once when using avoid_negative_ts make_zero

When given a stream starting at dts=0, it would previously consider
s->offset as uninitialized and set an offset when the second packet
was written, ending up writing two packets with dts=0. By initializing
this field to AV_NOPTS_VALUE, we make sure that we only initialize it
once, on the first packet.

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9257692ac15eff7b07540c1f61cebde0d8823fbd
---

 libavformat/mux.c     |    4 ++--
 libavformat/options.c |    1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/libavformat/mux.c b/libavformat/mux.c
index 87220ec..9aee224 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -329,12 +329,12 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
         AVRational time_base = s->streams[pkt->stream_index]->time_base;
         int64_t offset = 0;
 
-        if (!s->offset && pkt->dts != AV_NOPTS_VALUE &&
+        if (s->offset == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE &&
             (pkt->dts < 0 || s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO)) {
             s->offset = -pkt->dts;
             s->offset_timebase = time_base;
         }
-        if (s->offset)
+        if (s->offset != AV_NOPTS_VALUE)
             offset = av_rescale_q(s->offset, s->offset_timebase, time_base);
 
         if (pkt->dts != AV_NOPTS_VALUE)
diff --git a/libavformat/options.c b/libavformat/options.c
index a5646df..ad47004 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -101,6 +101,7 @@ AVFormatContext *avformat_alloc_context(void)
     ic = av_malloc(sizeof(AVFormatContext));
     if (!ic) return ic;
     avformat_get_context_defaults(ic);
+    ic->offset = AV_NOPTS_VALUE;
 
     ic->internal = av_mallocz(sizeof(*ic->internal));
     if (!ic->internal) {



More information about the ffmpeg-cvslog mailing list