#include "libavutil/parseutils.h"
#include "libavutil/opt.h"
#include "avformat.h"
+#include "avio_internal.h"
#include "internal.h"
#include "ffm.h"
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)
{
AVIOContext *tmp;
char *buf = NULL;
- uint8_t *p = NULL;
int ret, need_coma = 0;
#define SKIP_DEFAULTS AV_OPT_SERIALIZE_SKIP_DEFAULTS
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
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:
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: