Allow the caller to pass a dictionary with key/value pairs to set encoder private options for reinitialization. AVCodecContext global options are not affected. For that, specific AVSideDataParamChangeFlags should be used, as is currently the case for dimensions and sample rate.
Signed-off-by: James Almer <[email protected]> --- libavcodec/encode.c | 21 +++++++++++++++++++++ libavutil/defs.h | 1 + 2 files changed, 22 insertions(+) diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 187b4015f1..c14ab65509 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -20,12 +20,14 @@ #include "libavutil/attributes.h" #include "libavutil/avassert.h" +#include "libavutil/avstring.h" #include "libavutil/channel_layout.h" #include "libavutil/emms.h" #include "libavutil/frame.h" #include "libavutil/imgutils.h" #include "libavutil/internal.h" #include "libavutil/mem.h" +#include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/samplefmt.h" @@ -101,6 +103,25 @@ static int apply_param_change(AVCodecContext *avctx, const AVFrame *frame) avctx->width = frame->width; avctx->height = frame->height; } + if (flags & AV_SIDE_DATA_PARAM_CHANGE_DICT) { + AVDictionary *dict = NULL; + int left = av_strnlen(gbc.buffer, bytestream2_get_bytes_left(&gbc)); + if (!left) + goto fail; + ret = av_dict_parse_string(&dict, gbc.buffer, "=", ":", 0); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid string"); + goto fail2; + } + bytestream2_skip(&gbc, left + 1); + + if (avctx->codec->priv_class) { + ret = av_opt_set_dict(avctx->priv_data, &dict); + if (ret < 0) + goto fail2; + } + av_dict_free(&dict); + } if (flags) { ret = 0; diff --git a/libavutil/defs.h b/libavutil/defs.h index f09fb5efd2..e1de680f2f 100644 --- a/libavutil/defs.h +++ b/libavutil/defs.h @@ -125,6 +125,7 @@ enum AVMediaType { enum AVSideDataParamChangeFlags { AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE = 0x0004, AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS = 0x0008, + AV_SIDE_DATA_PARAM_CHANGE_DICT = 0x0016, }; /** -- 2.48.1 _______________________________________________ ffmpeg-devel mailing list [email protected] https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
