diff --git a/libavformat/ffmenc.c b/libavformat/ffmenc.c index 10acfbe7a1..adb5019010 100644 --- a/libavformat/ffmenc.c +++ b/libavformat/ffmenc.c @@ -94,15 +94,18 @@ static void write_header_chunk(AVIOContext *pb, AVIOContext *dpb, unsigned id) av_free(dyn_buf); } -static int ffm_write_header_codec_private_ctx(AVIOContext *pb, AVCodecContext *ctx, int type) +static int ffm_write_header_codec_private_ctx(AVFormatContext *s, AVCodecContext *ctx, int type) { + AVIOContext *pb = s->pb; AVIOContext *tmp; char *buf = NULL; int ret; const AVCodec *enc = ctx->codec ? ctx->codec : avcodec_find_encoder(ctx->codec_id); - if (!enc) - return AVERROR(EINVAL); + if (!enc) { + av_log(s, AV_LOG_WARNING, "Stream codec is not found. Codec private options are not stored.\n"); + return 0; + } if (ctx->priv_data && enc->priv_class && enc->priv_data_size) { if ((ret = av_opt_serialize(ctx->priv_data, AV_OPT_FLAG_ENCODING_PARAM | type, AV_OPT_SERIALIZE_SKIP_DEFAULTS, &buf, '=', ',')) < 0) @@ -281,7 +284,7 @@ static int ffm_write_header(AVFormatContext *s) st->recommended_encoder_configuration)) < 0) return ret; } else if ((ret = ffm_write_header_codec_ctx(s->pb, codec, MKBETAG('S', '2', 'V', 'I'), AV_OPT_FLAG_VIDEO_PARAM)) < 0 || - (ret = ffm_write_header_codec_private_ctx(s->pb, codec, AV_OPT_FLAG_VIDEO_PARAM)) < 0) + (ret = ffm_write_header_codec_private_ctx(s, codec, AV_OPT_FLAG_VIDEO_PARAM)) < 0) return ret; break; case AVMEDIA_TYPE_AUDIO: @@ -292,7 +295,7 @@ static int ffm_write_header(AVFormatContext *s) st->recommended_encoder_configuration)) < 0) return ret; } else if ((ret = ffm_write_header_codec_ctx(s->pb, codec, MKBETAG('S', '2', 'A', 'U'), AV_OPT_FLAG_AUDIO_PARAM)) < 0 || - (ret = ffm_write_header_codec_private_ctx(s->pb, codec, AV_OPT_FLAG_AUDIO_PARAM)) < 0) + (ret = ffm_write_header_codec_private_ctx(s, codec, AV_OPT_FLAG_AUDIO_PARAM)) < 0) return ret; break; default: