diff options
author | Marton Balint <cus@passwd.hu> | 2013-10-23 20:55:24 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-10-27 23:12:41 +0100 |
commit | dbe6f9f2c2330e7c230ddd61af1cc2069af1cf04 (patch) | |
tree | 914cb81b534725368160c8994b9f11f733526435 | |
parent | b387a24cb4ad14f567ae2643a7959fe61b82f95a (diff) | |
download | ffmpeg-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>
-rw-r--r-- | doc/APIchanges | 3 | ||||
-rw-r--r-- | libavcodec/avcodec.h | 8 | ||||
-rw-r--r-- | libavcodec/utils.c | 4 | ||||
-rw-r--r-- | libavcodec/version.h | 4 |
4 files changed, 15 insertions, 4 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index 35940dbe48..50ed751875 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2012-10-22 API changes, most recent first: +2013-10-27 - xxxxxxx - lavc 55.39.100 - avcodec.h + Add CODEC_CAP_DELAY support to avcodec_decode_subtitle2. + 2013-10-27 - xxxxxxx - lavu 52.48.100 - parseutils.h Add av_get_known_color_name(). 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, \ |