diff options
author | Clément Bœsch <ubitux@gmail.com> | 2012-10-21 00:16:11 +0200 |
---|---|---|
committer | Clément Bœsch <ubitux@gmail.com> | 2012-10-24 23:56:43 +0200 |
commit | 60d9ee1b75b37e9d188cf7321d0d74d8714da696 (patch) | |
tree | e1e3b524151a565a7e0fdfdf6e95183f1561d444 | |
parent | a96b39de622592cb595bf20ae009ed415b98cde9 (diff) | |
download | ffmpeg-60d9ee1b75b37e9d188cf7321d0d74d8714da696.tar.gz |
lavc/utils: make sub decode consistent with A/V.
This allows side data to be transmitted properly with subtitles.
-rw-r--r-- | libavcodec/utils.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/libavcodec/utils.c b/libavcodec/utils.c index d7c3ecbf11..2029b53106 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -1852,22 +1852,39 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { - int ret; + int ret = 0; if (avctx->codec->type != AVMEDIA_TYPE_SUBTITLE) { av_log(avctx, AV_LOG_ERROR, "Invalid media type for subtitles\n"); return AVERROR(EINVAL); } - avctx->pkt = avpkt; *got_sub_ptr = 0; avcodec_get_subtitle_defaults(sub); + + if (avpkt->size) { + AVPacket tmp = *avpkt; + int did_split = av_packet_split_side_data(&tmp); + //apply_param_change(avctx, &tmp); + + avctx->pkt = &tmp; + if (avctx->pkt_timebase.den && avpkt->pts != AV_NOPTS_VALUE) sub->pts = av_rescale_q(avpkt->pts, avctx->pkt_timebase, AV_TIME_BASE_Q); - ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt); + ret = avctx->codec->decode(avctx, sub, got_sub_ptr, &tmp); + + avctx->pkt = NULL; + if (did_split) { + ff_packet_free_side_data(&tmp); + if(ret == tmp.size) + ret = avpkt->size; + } + if (*got_sub_ptr) avctx->frame_number++; + } + return ret; } |