summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2024-01-17 10:44:52 +0100
committerAnton Khirnov <anton@khirnov.net>2024-01-30 09:52:00 +0100
commit474ca6c71e84b283fe72760ef368d5d730888dab (patch)
tree0072b167983989e3450d207c8148844bbae43050
parent924a6f3cc7788e2d258348b1547a49805091ea2d (diff)
fftools/ffmpeg_dec: stop accesing InputStream.fix_sub_duration
Pass this information to dec_open() instead. This is a step towards decoupling Decoder and InputStream.
-rw-r--r--fftools/ffmpeg.h6
-rw-r--r--fftools/ffmpeg_dec.c13
-rw-r--r--fftools/ffmpeg_demux.c3
3 files changed, 16 insertions, 6 deletions
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 2fb9e45529..52d966008e 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;