diff options
author | Lukasz Marek <lukasz.m.luki2@gmail.com> | 2014-11-16 21:53:59 +0100 |
---|---|---|
committer | Lukasz Marek <lukasz.m.luki2@gmail.com> | 2014-11-27 23:19:20 +0100 |
commit | 568853b8f533c7bf04b75dee8383224db35471e7 (patch) | |
tree | c7ccdf2b89f13635728ac4677d21ed71719a1fe6 /libavformat/ffmdec.c | |
parent | 4760278007213bafadb231451f79f763a5a4b07a (diff) | |
download | ffmpeg-568853b8f533c7bf04b75dee8383224db35471e7.tar.gz |
lavf/ffmdec: add common options to recommended encoder configuration
Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com>
Diffstat (limited to 'libavformat/ffmdec.c')
-rw-r--r-- | libavformat/ffmdec.c | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/libavformat/ffmdec.c b/libavformat/ffmdec.c index 7ae906be4b..987f419c96 100644 --- a/libavformat/ffmdec.c +++ b/libavformat/ffmdec.c @@ -24,6 +24,8 @@ #include "libavutil/intreadwrite.h" #include "libavutil/intfloat.h" #include "libavutil/opt.h" +#include "libavutil/avassert.h" +#include "libavutil/avstring.h" #include "avformat.h" #include "internal.h" #include "ffm.h" @@ -231,6 +233,27 @@ static int ffm_close(AVFormatContext *s) return 0; } +static int ffm_append_recommended_configuration(AVStream *st, char **conf) +{ + int ret; + size_t newsize; + av_assert0(conf && st); + if (!*conf) + return 0; + if (!st->recommended_encoder_configuration) { + st->recommended_encoder_configuration = *conf; + *conf = 0; + return 0; + } + newsize = strlen(*conf) + strlen(st->recommended_encoder_configuration) + 2; + if ((ret = av_reallocp(&st->recommended_encoder_configuration, newsize)) < 0) + return ret; + av_strlcat(st->recommended_encoder_configuration, ",", newsize); + av_strlcat(st->recommended_encoder_configuration, *conf, newsize); + av_freep(conf); + return 0; +} + static int ffm2_read_header(AVFormatContext *s) { FFMContext *ffm = s->priv_data; @@ -367,12 +390,14 @@ static int ffm2_read_header(AVFormatContext *s) } enc = avcodec_find_encoder(codec->codec_id); if (enc && enc->priv_data_size && enc->priv_class) { - st->recommended_encoder_configuration = av_malloc(size + 1); - if (!st->recommended_encoder_configuration) { + buffer = av_malloc(size + 1); + if (!buffer) { ret = AVERROR(ENOMEM); goto fail; } - avio_get_str(pb, size, st->recommended_encoder_configuration, size + 1); + avio_get_str(pb, size, buffer, size + 1); + if ((ret = ffm_append_recommended_configuration(st, &buffer)) < 0) + goto fail; } break; case MKBETAG('S', '2', 'V', 'I'): @@ -387,7 +412,8 @@ static int ffm2_read_header(AVFormatContext *s) } avio_get_str(pb, INT_MAX, buffer, size); av_set_options_string(codec, buffer, "=", ","); - av_freep(&buffer); + if ((ret = ffm_append_recommended_configuration(st, &buffer)) < 0) + goto fail; break; case MKBETAG('S', '2', 'A', 'U'): if (f_stau++) { @@ -401,7 +427,7 @@ static int ffm2_read_header(AVFormatContext *s) } avio_get_str(pb, INT_MAX, buffer, size); av_set_options_string(codec, buffer, "=", ","); - av_freep(&buffer); + ffm_append_recommended_configuration(st, &buffer); break; } avio_seek(pb, next, SEEK_SET); |