diff mbox series

[FFmpeg-devel,12/31] fftools/ffmpeg_dec: stop accesing InputStream.fix_sub_duration

Message ID 20240124081702.4759-12-anton@khirnov.net
State Accepted
Commit 474ca6c71e84b283fe72760ef368d5d730888dab
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
Pass this information to dec_open() instead.

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

Patch

diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index db9bd8cc7a..8b7560b359 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -280,6 +280,10 @@  typedef struct FilterGraph {
     int         nb_outputs;
 } FilterGraph;
 
+enum DecoderFlags {
+    DECODER_FLAG_FIX_SUB_DURATION = (1 << 0),
+};
+
 typedef struct Decoder {
     const AVClass   *class;
 
@@ -735,7 +739,7 @@  int hwaccel_retrieve_data(AVCodecContext *avctx, AVFrame *input);
  *                 is transferred to the decoder.
  */
 int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx,
-             AVDictionary **dec_opts);
+             AVDictionary **dec_opts, int flags);
 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 b5a0ce9080..7037175a48 100644
--- a/fftools/ffmpeg_dec.c
+++ b/fftools/ffmpeg_dec.c
@@ -45,6 +45,9 @@  typedef struct DecoderPriv {
     // override output video sample aspect ratio with this value
     AVRational       sar_override;
 
+    // a combination of DECODER_FLAG_*, provided to dec_open()
+    int              flags;
+
     enum AVPixelFormat hwaccel_pix_fmt;
 
     // pts/estimated duration of the last decoded frame
@@ -326,7 +329,7 @@  static int process_subtitle(InputStream *ist, AVFrame *frame)
     const AVSubtitle *subtitle = (AVSubtitle*)frame->buf[0]->data;
     int ret = 0;
 
-    if (ist->fix_sub_duration) {
+    if (dp->flags & DECODER_FLAG_FIX_SUB_DURATION) {
         AVSubtitle *sub_prev = dp->sub_prev[0]->buf[0] ?
                                (AVSubtitle*)dp->sub_prev[0]->buf[0]->data : NULL;
         int end = 1;
@@ -372,7 +375,7 @@  static int fix_sub_duration_heartbeat(InputStream *ist, int64_t signal_pts)
         (AVSubtitle*)dp->sub_prev[0]->buf[0]->data : NULL;
     AVSubtitle *subtitle;
 
-    if (!ist->fix_sub_duration || !prev_subtitle ||
+    if (!(dp->flags & DECODER_FLAG_FIX_SUB_DURATION) || !prev_subtitle ||
         !prev_subtitle->num_rects || signal_pts <= prev_subtitle->pts)
         return 0;
 
@@ -895,7 +898,7 @@  static const AVClass dec_class = {
 };
 
 int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx,
-             AVDictionary **dec_opts)
+             AVDictionary **dec_opts, int flags)
 {
     DecoderPriv *dp;
     const AVCodec *codec = ist->dec;
@@ -909,12 +912,14 @@  int dec_open(InputStream *ist, Scheduler *sch, unsigned sch_idx,
     dp->sch     = sch;
     dp->sch_idx = sch_idx;
 
+    dp->flags      = flags;
     dp->dec.class  = &dec_class;
     dp->log_parent = ist;
 
     snprintf(dp->log_name, sizeof(dp->log_name), "dec:%s", codec->name);
 
-    if (codec->type == AVMEDIA_TYPE_SUBTITLE && ist->fix_sub_duration) {
+    if (codec->type == AVMEDIA_TYPE_SUBTITLE &&
+        (dp->flags & DECODER_FLAG_FIX_SUB_DURATION)) {
         for (int i = 0; i < FF_ARRAY_ELEMS(dp->sub_prev); i++) {
             dp->sub_prev[i] = av_frame_alloc();
             if (!dp->sub_prev[i])
diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c
index a58217223b..02add669a0 100644
--- a/fftools/ffmpeg_demux.c
+++ b/fftools/ffmpeg_demux.c
@@ -891,6 +891,7 @@  static int ist_use(InputStream *ist, int decoding_needed)
 
     if (decoding_needed && ds->sch_idx_dec < 0) {
         int is_audio = ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
+        int dec_flags = !!ist->fix_sub_duration * DECODER_FLAG_FIX_SUB_DURATION;
 
         ret = sch_add_dec(d->sch, decoder_thread, ist, d->loop && is_audio);
         if (ret < 0)
@@ -903,7 +904,7 @@  static int ist_use(InputStream *ist, int decoding_needed)
             return ret;
 
         ret = dec_open(ist, d->sch, ds->sch_idx_dec,
-                       &ist->decoder_opts);
+                       &ist->decoder_opts, dec_flags);
         if (ret < 0)
             return ret;