From b1fa4942056e8f09b5d19d913f7353245875b7a9 Mon Sep 17 00:00:00 2001
From: Ivan Schreter <schreter@gmx.net>
Date: Thu, 19 Feb 2009 23:35:59 +0000
Subject: [PATCH] Add convergence_duration to AVCodecParserContext.

Patch by Ivan Schreter, schreter gmx net

Originally committed as revision 17468 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavcodec/avcodec.h   | 19 ++++++++++++++++++-
 libavcodec/parser.c    |  1 +
 libavformat/avformat.h |  2 +-
 libavformat/utils.c    |  2 ++
 4 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index e4f1831c85b..b0ec18a49ca 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -30,7 +30,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVCODEC_VERSION_MAJOR 52
-#define LIBAVCODEC_VERSION_MINOR 17
+#define LIBAVCODEC_VERSION_MINOR 18
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
@@ -3033,6 +3033,23 @@ typedef struct AVCodecParserContext {
      * will be used.
      */
     int key_frame;
+
+    /**
+     * Time difference in stream time base units from the pts of this
+     * packet to the point at which the output from the decoder has converged
+     * independent from the availability of previous frames. That is, the
+     * frames are virtually identical no matter if decoding started from
+     * the very first frame or from this keyframe.
+     * Is AV_NOPTS_VALUE if unknown.
+     * This field is not the display duration of the current frame.
+     *
+     * The purpose of this field is to allow seeking in streams that have no
+     * keyframes in the conventional sense. It corresponds to the
+     * recovery point SEI in H.264 and match_time_delta in NUT. It is also
+     * essential for some types of subtitle streams to ensure that all
+     * subtitles are correctly displayed after seeking.
+     */
+    int64_t convergence_duration;
 } AVCodecParserContext;
 
 typedef struct AVCodecParser {
diff --git a/libavcodec/parser.c b/libavcodec/parser.c
index db9b2363fe9..a0d604dabe9 100644
--- a/libavcodec/parser.c
+++ b/libavcodec/parser.c
@@ -74,6 +74,7 @@ AVCodecParserContext *av_parser_init(int codec_id)
     s->fetch_timestamp=1;
     s->pict_type = FF_I_TYPE;
     s->key_frame = -1;
+    s->convergence_duration = AV_NOPTS_VALUE;
     return s;
 }
 
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 561e367a315..2427f840771 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -23,7 +23,7 @@
 
 #define LIBAVFORMAT_VERSION_MAJOR 52
 #define LIBAVFORMAT_VERSION_MINOR 29
-#define LIBAVFORMAT_VERSION_MICRO  1
+#define LIBAVFORMAT_VERSION_MICRO  2
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 2d66dced355..6fcca6ffbf2 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -909,6 +909,8 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
         else if (pc->key_frame == -1 && pc->pict_type == FF_I_TYPE)
             pkt->flags |= PKT_FLAG_KEY;
     }
+    if (pc)
+        pkt->convergence_duration = pc->convergence_duration;
 }
 
 void av_destruct_packet_nofree(AVPacket *pkt)
-- 
GitLab