summaryrefslogtreecommitdiff
path: root/fftools/ffmpeg.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2022-09-04 17:30:27 +0200
committerAnton Khirnov <anton@khirnov.net>2022-10-04 11:55:03 +0200
commit044d70736ec106da3878123b9b61749769723dd9 (patch)
tree53dcbf4ebf068f08154c91f54d2cc318f4e73a13 /fftools/ffmpeg.c
parent29188f9c62558d24d4ca6667c0018a15165129e1 (diff)
fftools/ffmpeg: move some code from init_output_stream() to init_output_stream_encode()
The code is subtitle-encoding-specific, so this is a more appropriate place for it.
Diffstat (limited to 'fftools/ffmpeg.c')
-rw-r--r--fftools/ffmpeg.c58
1 files changed, 29 insertions, 29 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 6deca8bfbf..754172e568 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -3129,6 +3129,34 @@ static int init_output_stream_encode(OutputStream *ost, AVFrame *frame)
enc_ctx->width = input_streams[ost->source_index]->par->width;
enc_ctx->height = input_streams[ost->source_index]->par->height;
}
+ if (dec_ctx && dec_ctx->subtitle_header) {
+ /* ASS code assumes this buffer is null terminated so add extra byte. */
+ ost->enc_ctx->subtitle_header = av_mallocz(dec_ctx->subtitle_header_size + 1);
+ if (!ost->enc_ctx->subtitle_header)
+ return AVERROR(ENOMEM);
+ memcpy(ost->enc_ctx->subtitle_header, dec_ctx->subtitle_header,
+ dec_ctx->subtitle_header_size);
+ ost->enc_ctx->subtitle_header_size = dec_ctx->subtitle_header_size;
+ }
+ if (ist && ist->dec->type == AVMEDIA_TYPE_SUBTITLE &&
+ enc_ctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
+ int input_props = 0, output_props = 0;
+ AVCodecDescriptor const *input_descriptor =
+ avcodec_descriptor_get(ist->dec->id);
+ AVCodecDescriptor const *output_descriptor =
+ avcodec_descriptor_get(ost->enc_ctx->codec_id);
+ if (input_descriptor)
+ input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
+ if (output_descriptor)
+ output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
+ if (input_props && output_props && input_props != output_props) {
+ av_log(NULL, AV_LOG_ERROR,
+ "Subtitle encoding currently only possible from text to text "
+ "or bitmap to bitmap");
+ return AVERROR_INVALIDDATA;
+ }
+ }
+
break;
case AVMEDIA_TYPE_DATA:
break;
@@ -3156,23 +3184,13 @@ static int init_output_stream(OutputStream *ost, AVFrame *frame,
if (ost->enc_ctx) {
const AVCodec *codec = ost->enc_ctx->codec;
- AVCodecContext *dec = NULL;
InputStream *ist;
ret = init_output_stream_encode(ost, frame);
if (ret < 0)
return ret;
- if ((ist = get_input_stream(ost)))
- dec = ist->dec_ctx;
- if (dec && dec->subtitle_header) {
- /* ASS code assumes this buffer is null terminated so add extra byte. */
- ost->enc_ctx->subtitle_header = av_mallocz(dec->subtitle_header_size + 1);
- if (!ost->enc_ctx->subtitle_header)
- return AVERROR(ENOMEM);
- memcpy(ost->enc_ctx->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
- ost->enc_ctx->subtitle_header_size = dec->subtitle_header_size;
- }
+ ist = get_input_stream(ost);
if (!av_dict_get(ost->encoder_opts, "threads", NULL, 0))
av_dict_set(&ost->encoder_opts, "threads", "auto", 0);
@@ -3184,24 +3202,6 @@ static int init_output_stream(OutputStream *ost, AVFrame *frame,
return ret;
}
- if (ist && ist->dec->type == AVMEDIA_TYPE_SUBTITLE && codec->type == AVMEDIA_TYPE_SUBTITLE) {
- int input_props = 0, output_props = 0;
- AVCodecDescriptor const *input_descriptor =
- avcodec_descriptor_get(dec->codec_id);
- AVCodecDescriptor const *output_descriptor =
- avcodec_descriptor_get(ost->enc_ctx->codec_id);
- if (input_descriptor)
- input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
- if (output_descriptor)
- output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
- if (input_props && output_props && input_props != output_props) {
- snprintf(error, error_len,
- "Subtitle encoding currently only possible from text to text "
- "or bitmap to bitmap");
- return AVERROR_INVALIDDATA;
- }
- }
-
if ((ret = avcodec_open2(ost->enc_ctx, codec, &ost->encoder_opts)) < 0) {
if (ret == AVERROR_EXPERIMENTAL)
abort_codec_experimental(codec, 1);