[FFmpeg-cvslog] lavf/ffmenc: do not fail on missing codec

Lukasz Marek git at videolan.org
Sat Feb 21 00:23:59 CET 2015


ffmpeg | branch: master | Lukasz Marek <lukasz.m.luki2 at gmail.com> | Thu Feb 19 23:50:04 2015 +0100| [e19d1840da3a3969420f2ce2794086dca3a0dfa0] | committer: Lukasz Marek

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 at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e19d1840da3a3969420f2ce2794086dca3a0dfa0
---

 libavformat/ffmenc.c |   13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/libavformat/ffmenc.c b/libavformat/ffmenc.c
index 10acfbe..adb5019 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:



More information about the ffmpeg-cvslog mailing list