Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukasz Marek <lukasz.m.luki2@gmail.com>2015-02-20 01:50:04 +0300
committerLukasz Marek <lukasz.m.luki2@gmail.com>2015-02-21 02:23:37 +0300
commite19d1840da3a3969420f2ce2794086dca3a0dfa0 (patch)
treea3e76d3e2cc2e33ab401dcc40bffee104d8dcd7b
parent0a1146a59a1c0a97e879cd2683b01db59d9a5144 (diff)
lavf/ffmenc: do not fail on missing codec
ffm encoder fails when codec is not found. It may happen when stream is being copied. This commit allows to store such stream and provides backward compatibility with version prior 2.5 release. fixes #4266 Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com>
-rw-r--r--libavformat/ffmenc.c13
1 files changed, 8 insertions, 5 deletions
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: