diff options
author | Aurelien Jacobs <aurel@gnuage.org> | 2010-11-13 13:57:49 +0000 |
---|---|---|
committer | Aurelien Jacobs <aurel@gnuage.org> | 2010-11-13 13:57:49 +0000 |
commit | cb2c971d91ef166914a4982e941aa71ffd496610 (patch) | |
tree | c9be6025b40a978ff442d052a722e0b82e6862bb | |
parent | 2722dd6ebf9d93ab097c303df1d789f6074121c8 (diff) | |
download | ffmpeg-cb2c971d91ef166914a4982e941aa71ffd496610.tar.gz |
allow passing subtitles header between decoder and encoder
Originally committed as revision 25745 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | ffmpeg.c | 11 | ||||
-rw-r--r-- | libavcodec/avcodec.h | 11 | ||||
-rw-r--r-- | libavformat/utils.c | 8 |
3 files changed, 29 insertions, 1 deletions
@@ -2284,6 +2284,7 @@ static int transcode(AVFormatContext **output_files, ost = ost_table[i]; if (ost->encoding_needed) { AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL; + AVCodecContext *dec = ist_table[ost->source_index]->st->codec; if (!codec) codec = avcodec_find_encoder(ost->st->codec->codec_id); if (!codec) { @@ -2292,6 +2293,15 @@ static int transcode(AVFormatContext **output_files, ret = AVERROR(EINVAL); goto dump_format; } + if (dec->subtitle_header) { + ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size); + if (!ost->st->codec->subtitle_header) { + ret = AVERROR(ENOMEM); + goto dump_format; + } + memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size); + ost->st->codec->subtitle_header_size = dec->subtitle_header_size; + } if (avcodec_open(ost->st->codec, codec) < 0) { snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height", ost->file_index, ost->index); @@ -2690,6 +2700,7 @@ static int transcode(AVFormatContext **output_files, } av_fifo_free(ost->fifo); /* works even if fifo is not initialized but set to zero */ + av_freep(&ost->st->codec->subtitle_header); av_free(ost->pict_tmp.data[0]); av_free(ost->forced_kf_pts); if (ost->video_resample) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index b85fd24ddf..c523cd6ced 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2757,6 +2757,17 @@ typedef struct AVCodecContext { * - decoding: unused */ int slices; + + /** + * Header containing style information for text subtitles. + * For SUBTITLE_ASS subtitle type, it should contain the whole ASS + * [Script Info] and [V4+ Styles] section, plus the [Events] line and + * the Format line following. It shouldn't include any Dialogue line. + * - encoding: Set/allocated/freed by user (before avcodec_open()) + * - decoding: Set/allocated/freed by libavcodec (by avcodec_open()) + */ + uint8_t *subtitle_header; + int subtitle_header_size; } AVCodecContext; /** diff --git a/libavformat/utils.c b/libavformat/utils.c index 36e93bc215..8fcbe96eea 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2206,9 +2206,14 @@ int av_find_stream_info(AVFormatContext *ic) if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF) st->codec->channels = 0; + /* Ensure that subtitle_header is properly set. */ + if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE + && codec && !st->codec->codec) + avcodec_open(st->codec, codec); + //try to just open decoders, in case this is enough to get parameters if(!has_codec_parameters(st->codec)){ - if (codec) + if (codec && !st->codec->codec) avcodec_open(st->codec, codec); } } @@ -2471,6 +2476,7 @@ void av_close_input_stream(AVFormatContext *s) av_metadata_free(&st->metadata); av_free(st->index_entries); av_free(st->codec->extradata); + av_free(st->codec->subtitle_header); av_free(st->codec); #if FF_API_OLD_METADATA av_free(st->filename); |