[FFmpeg-cvslog] fftools/ffmpeg_filter: keep track of the real filter input type

Anton Khirnov git at videolan.org
Mon May 22 18:11:52 EEST 2023


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sat May 13 19:59:45 2023 +0200| [dcfbfb417c3cc0473d887da70552026d07540232] | committer: Anton Khirnov

fftools/ffmpeg_filter: keep track of the real filter input type

Avoid extracting it from various remote sources.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=dcfbfb417c3cc0473d887da70552026d07540232
---

 fftools/ffmpeg_filter.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 5656fa87df..c699431831 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -60,8 +60,11 @@ typedef struct InputFilterPriv {
     // used to hold submitted input
     AVFrame *frame;
 
-    // AVMEDIA_TYPE_SUBTITLE for sub2video
+    // filter data type
     enum AVMediaType type;
+    // source data type: AVMEDIA_TYPE_SUBTITLE for sub2video,
+    // same as type otherwise
+    enum AVMediaType type_src;
 
     int eof;
 
@@ -267,7 +270,9 @@ static InputFilter *ifilter_alloc(FilterGraph *fg, InputStream *ist)
     ifp->format          = -1;
     ifp->fallback.format = -1;
     ifp->ist             = ist;
-    ifp->type            = ist->st->codecpar->codec_type;
+    ifp->type_src        = ist->st->codecpar->codec_type;
+    ifp->type            = ifp->type_src == AVMEDIA_TYPE_SUBTITLE ?
+                           AVMEDIA_TYPE_VIDEO : ifp->type_src;
 
     ifp->frame_queue = av_fifo_alloc2(8, sizeof(AVFrame*), AV_FIFO_FLAG_AUTO_GROW);
     if (!ifp->frame_queue)
@@ -1205,7 +1210,7 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
 static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
                                   AVFilterInOut *in)
 {
-    switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
+    switch (ifp_from_ifilter(ifilter)->type) {
     case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
     case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
     default: av_assert0(0); return 0;
@@ -1459,8 +1464,8 @@ int ifilter_has_all_input_formats(FilterGraph *fg)
     int i;
     for (i = 0; i < fg->nb_inputs; i++) {
         InputFilterPriv *ifp = ifp_from_ifilter(fg->inputs[i]);
-        if (ifp->format < 0 && (ifp->type == AVMEDIA_TYPE_AUDIO ||
-                                ifp->type == AVMEDIA_TYPE_VIDEO))
+        if (ifp->format < 0 && (ifp->type_src == AVMEDIA_TYPE_AUDIO ||
+                                ifp->type_src == AVMEDIA_TYPE_VIDEO))
             return 0;
     }
     return 1;
@@ -1564,7 +1569,9 @@ int ifilter_send_eof(InputFilter *ifilter, int64_t pts, AVRational tb)
             }
         }
 
-        if (ifp->format < 0 && (ifp->type == AVMEDIA_TYPE_AUDIO || ifp->type == AVMEDIA_TYPE_VIDEO)) {
+        if (ifp->format < 0 &&
+            (ifp->type_src == AVMEDIA_TYPE_AUDIO ||
+             ifp->type_src == AVMEDIA_TYPE_VIDEO)) {
             av_log(NULL, AV_LOG_ERROR,
                    "Cannot determine format of input stream %d:%d after EOF\n",
                    ifp->ist->file_index, ifp->ist->st->index);
@@ -1585,7 +1592,7 @@ int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame, int keep_reference)
     /* determine if the parameters for this input changed */
     need_reinit = ifp->format != frame->format;
 
-    switch (ifp->ist->par->codec_type) {
+    switch (ifp->type) {
     case AVMEDIA_TYPE_AUDIO:
         need_reinit |= ifp->sample_rate    != frame->sample_rate ||
                        av_channel_layout_compare(&ifp->ch_layout, &frame->ch_layout);



More information about the ffmpeg-cvslog mailing list