diff mbox series

[FFmpeg-devel,06/31] fftools/ffmpeg_dec: pass decoder options as an argument to dec_open()

Message ID 20240124081702.4759-6-anton@khirnov.net
State Accepted
Commit 5b0e4f945eadb0c416180c0e20f5622062cc16f4
Headers show
Series [FFmpeg-devel,01/31] fftools/ffmpeg_dec: split Decoder into a private and public part | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov Jan. 24, 2024, 8:16 a.m. UTC
Rather than access the dictionary in InputStream.

This is a step towards decoupling Decoder and InputStream.
---
 fftools/ffmpeg.h       |  7 ++++++-
 fftools/ffmpeg_dec.c   | 17 +++++++++--------
 fftools/ffmpeg_demux.c |  3 ++-
 3 files changed, 17 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 9e29ae1785..227929b022 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -731,7 +731,12 @@  AVBufferRef *hw_device_for_filter(void);
 
 int hwaccel_retrieve_data(AVCodecContext *avctx, AVFrame *input);
 
-int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx);
+/**
+ * @param dec_opts Dictionary filled with decoder options. Its ownership
+ *                 is transferred to the decoder.
+ */
+int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx,
+             AVDictionary **dec_opts);
 void dec_free(Decoder **pdec);
 
 int dec_add_filter(Decoder *dec, InputFilter *ifilter);
diff --git a/fftools/ffmpeg_dec.c b/fftools/ffmpeg_dec.c
index 6dca730e51..15d49d0d69 100644
--- a/fftools/ffmpeg_dec.c
+++ b/fftools/ffmpeg_dec.c
@@ -918,7 +918,8 @@  static const AVClass dec_class = {
     .item_name                 = dec_item_name,
 };
 
-int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx)
+int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx,
+             AVDictionary **dec_opts)
 {
     DecoderPriv *dp;
     const AVCodec *codec = ist->dec;
@@ -970,7 +971,7 @@  int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx)
 
     if (dp->dec_ctx->codec_id == AV_CODEC_ID_DVB_SUBTITLE &&
        (ist->decoding_needed & DECODING_FOR_OST)) {
-        av_dict_set(&ist->decoder_opts, "compute_edt", "1", AV_DICT_DONT_OVERWRITE);
+        av_dict_set(dec_opts, "compute_edt", "1", AV_DICT_DONT_OVERWRITE);
         if (ist->decoding_needed & DECODING_FOR_FILTER)
             av_log(dp, AV_LOG_WARNING,
                    "Warning using DVB subtitles for filtering and output at the "
@@ -981,13 +982,13 @@  int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx)
      * audio, and video decoders such as cuvid or mediacodec */
     dp->dec_ctx->pkt_timebase = ist->st->time_base;
 
-    if (!av_dict_get(ist->decoder_opts, "threads", NULL, 0))
-        av_dict_set(&ist->decoder_opts, "threads", "auto", 0);
+    if (!av_dict_get(*dec_opts, "threads", NULL, 0))
+        av_dict_set(dec_opts, "threads", "auto", 0);
     /* Attached pics are sparse, therefore we would not want to delay their decoding till EOF. */
     if (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC)
-        av_dict_set(&ist->decoder_opts, "threads", "1", 0);
+        av_dict_set(dec_opts, "threads", "1", 0);
 
-    av_dict_set(&ist->decoder_opts, "flags", "+copy_opaque", AV_DICT_MULTIKEY);
+    av_dict_set(dec_opts, "flags", "+copy_opaque", AV_DICT_MULTIKEY);
 
     ret = hw_device_setup_for_decode(ist, dp);
     if (ret < 0) {
@@ -997,13 +998,13 @@  int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx)
         return ret;
     }
 
-    if ((ret = avcodec_open2(dp->dec_ctx, codec, &ist->decoder_opts)) < 0) {
+    if ((ret = avcodec_open2(dp->dec_ctx, codec, dec_opts)) < 0) {
         av_log(dp, AV_LOG_ERROR, "Error while opening decoder: %s\n",
                av_err2str(ret));
         return ret;
     }
 
-    ret = check_avoptions(ist->decoder_opts);
+    ret = check_avoptions(*dec_opts);
     if (ret < 0)
         return ret;
 
diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c
index 8e904d2150..b2cbde2aa5 100644
--- a/fftools/ffmpeg_demux.c
+++ b/fftools/ffmpeg_demux.c
@@ -895,7 +895,8 @@  static int ist_use(InputStream *ist, int decoding_needed)
         if (ret < 0)
             return ret;
 
-        ret = dec_open(ist, d->sch, ds->sch_idx_dec);
+        ret = dec_open(ist, d->sch, ds->sch_idx_dec,
+                       &ist->decoder_opts);
         if (ret < 0)
             return ret;