aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2013-10-23 20:55:24 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-10-27 23:12:41 +0100
commitdbe6f9f2c2330e7c230ddd61af1cc2069af1cf04 (patch)
tree914cb81b534725368160c8994b9f11f733526435 /libavcodec
parentb387a24cb4ad14f567ae2643a7959fe61b82f95a (diff)
downloadffmpeg-dbe6f9f2c2330e7c230ddd61af1cc2069af1cf04.tar.gz
lavc: add support for CODEC_CAP_DELAY in subtitles
This patch adds CODEC_CAP_DELAY support to avcodec_decode_subtitle2. For DVB teletext decoding, a single teletext packet can contain multiple teletext pages. In order to support that, the teletext decoder may buffer some pages. Signed-off-by: Marton Balint <cus@passwd.hu> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/avcodec.h8
-rw-r--r--libavcodec/utils.c4
-rw-r--r--libavcodec/version.h4
3 files changed, 12 insertions, 4 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 01a1be2f2f..fe64b38986 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3894,6 +3894,14 @@ int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
* and reusing a get_buffer written for video codecs would probably perform badly
* due to a potentially very different allocation pattern.
*
+ * Some decoders (those marked with CODEC_CAP_DELAY) have a delay between input
+ * and output. This means that for some packets they will not immediately
+ * produce decoded output and need to be flushed at the end of decoding to get
+ * all the decoded data. Flushing is done by calling this function with packets
+ * with avpkt->data set to NULL and avpkt->size set to 0 until it stops
+ * returning subtitles. It is safe to flush even those decoders that are not
+ * marked with CODEC_CAP_DELAY, then no subtitles will be returned.
+ *
* @param avctx the codec context
* @param[out] sub The AVSubtitle in which the decoded subtitle will be stored, must be
freed with avsubtitle_free if *got_sub_ptr is set.
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index c1625a216b..186993dc02 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -2322,7 +2322,7 @@ static int recode_subtitle(AVCodecContext *avctx,
AVPacket tmp;
#endif
- if (avctx->sub_charenc_mode != FF_SUB_CHARENC_MODE_PRE_DECODER)
+ if (avctx->sub_charenc_mode != FF_SUB_CHARENC_MODE_PRE_DECODER || inpkt->size == 0)
return 0;
#if CONFIG_ICONV
@@ -2407,7 +2407,7 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
*got_sub_ptr = 0;
avcodec_get_subtitle_defaults(sub);
- if (avpkt->size) {
+ if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size) {
AVPacket pkt_recoded;
AVPacket tmp = *avpkt;
int did_split = av_packet_split_side_data(&tmp);
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 40159d8586..75283627f8 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,8 +29,8 @@
#include "libavutil/avutil.h"
#define LIBAVCODEC_VERSION_MAJOR 55
-#define LIBAVCODEC_VERSION_MINOR 38
-#define LIBAVCODEC_VERSION_MICRO 101
+#define LIBAVCODEC_VERSION_MINOR 39
+#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \