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 --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; -- 2.42.0 _______________________________________________ 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".