]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/ffmenc.c
Merge commit '9c9b0218e85fcd969308632f75af48a4ce229541'
[ffmpeg] / libavformat / ffmenc.c
index 10acfbe7a1a28f276f6c988a28492eaf4c1836e9..3abbfdd08f42b2db530455cbfb5b29ae06177516 100644 (file)
@@ -25,6 +25,7 @@
 #include "libavutil/parseutils.h"
 #include "libavutil/opt.h"
 #include "avformat.h"
+#include "avio_internal.h"
 #include "internal.h"
 #include "ffm.h"
 
@@ -94,15 +95,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)
@@ -124,7 +128,6 @@ static int ffm_write_header_codec_ctx(AVIOContext *pb, AVCodecContext *ctx, unsi
 {
     AVIOContext *tmp;
     char *buf = NULL;
-    uint8_t *p = NULL;
     int ret, need_coma = 0;
 
 #define SKIP_DEFAULTS   AV_OPT_SERIALIZE_SKIP_DEFAULTS
@@ -153,8 +156,7 @@ static int ffm_write_header_codec_ctx(AVIOContext *pb, AVCodecContext *ctx, unsi
     return 0;
   fail:
     av_free(buf);
-    avio_close_dyn_buf(tmp, &p);
-    av_free(p);
+    ffio_free_dyn_buf(&tmp);
     return ret;
 
 #undef SKIP_DEFAULTS
@@ -281,7 +283,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 +294,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: