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 <jamr...@gmail.com>
---
 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
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to