Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
@ 2023-05-18 10:22 Paul B Mahol
  2023-05-18 17:31 ` James Almer
  2023-05-22 14:48 ` Anton Khirnov
  0 siblings, 2 replies; 9+ messages in thread
From: Paul B Mahol @ 2023-05-18 10:22 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

[-- Attachment #1: Type: text/plain, Size: 10 bytes --]

Attached.

[-- Attachment #2: 0027-avfilter-src_movie-switch-to-activate.patch --]
[-- Type: text/x-patch, Size: 14398 bytes --]

From 7ea5d96228d25d18b56dfe9fd91296ef1e29fa0a Mon Sep 17 00:00:00 2001
From: Paul B Mahol <onemda@gmail.com>
Date: Thu, 18 May 2023 00:59:31 +0200
Subject: [PATCH 27/27] avfilter/src_movie: switch to activate

Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
 libavfilter/src_movie.c | 265 ++++++++++++++++++----------------------
 1 file changed, 122 insertions(+), 143 deletions(-)

diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
index a2ecc5a625..9bbc0d969e 100644
--- a/libavfilter/src_movie.c
+++ b/libavfilter/src_movie.c
@@ -45,6 +45,7 @@
 
 #include "audio.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
@@ -54,6 +55,8 @@ typedef struct MovieStream {
     AVCodecContext *codec_ctx;
     int64_t discontinuity_threshold;
     int64_t last_pts;
+    AVFrame *frame;
+    int eof;
 } MovieStream;
 
 typedef struct MovieContext {
@@ -70,8 +73,10 @@ typedef struct MovieContext {
     int64_t ts_offset;
     int dec_threads;
 
+    AVPacket *pkt;
     AVFormatContext *format_ctx;
 
+    int eof;
     int max_stream_index; /**< max stream # actually used for output */
     MovieStream *st; /**< array of all streams, one per output */
     int *out_index; /**< stream number -> output number map, or -1 */
@@ -99,7 +104,6 @@ static const AVOption movie_options[]= {
 };
 
 static int movie_config_output_props(AVFilterLink *outlink);
-static int movie_request_frame(AVFilterLink *outlink);
 
 static AVStream *find_stream(void *log, AVFormatContext *avf, const char *spec)
 {
@@ -317,6 +321,9 @@ static av_cold int movie_common_init(AVFilterContext *ctx)
     for (i = 0; i < movie->format_ctx->nb_streams; i++)
         movie->format_ctx->streams[i]->discard = AVDISCARD_ALL;
 
+    movie->pkt = av_packet_alloc();
+    if (!movie->pkt)
+        return AVERROR(ENOMEM);
     movie->st = av_calloc(nb_streams, sizeof(*movie->st));
     if (!movie->st)
         return AVERROR(ENOMEM);
@@ -334,6 +341,10 @@ static av_cold int movie_common_init(AVFilterContext *ctx)
         movie->max_stream_index = FFMAX(movie->max_stream_index, st->index);
         movie->st[i].discontinuity_threshold =
             av_rescale_q(movie->discontinuity_threshold, AV_TIME_BASE_Q, st->time_base);
+
+        movie->st[i].frame = av_frame_alloc();
+        if (!movie->st[i].frame)
+            return AVERROR(ENOMEM);
     }
     if (av_strtok(NULL, "+", &cursor))
         return AVERROR_BUG;
@@ -352,7 +363,6 @@ static av_cold int movie_common_init(AVFilterContext *ctx)
         if (!pad.name)
             return AVERROR(ENOMEM);
         pad.config_props  = movie_config_output_props;
-        pad.request_frame = movie_request_frame;
         if ((ret = ff_append_outpad_free_name(ctx, &pad)) < 0)
             return ret;
         if ( movie->st[i].st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
@@ -381,7 +391,9 @@ static av_cold void movie_uninit(AVFilterContext *ctx)
     for (i = 0; i < ctx->nb_outputs; i++) {
         if (movie->st[i].st)
             avcodec_free_context(&movie->st[i].codec_ctx);
+        av_frame_free(&movie->st[i].frame);
     }
+    av_packet_free(&movie->pkt);
     av_freep(&movie->st);
     av_freep(&movie->out_index);
     if (movie->format_ctx)
@@ -447,32 +459,6 @@ static int movie_config_output_props(AVFilterLink *outlink)
     return 0;
 }
 
-static char *describe_frame_to_str(char *dst, size_t dst_size,
-                                   AVFrame *frame, enum AVMediaType frame_type,
-                                   AVFilterLink *link)
-{
-    switch (frame_type) {
-    case AVMEDIA_TYPE_VIDEO:
-        snprintf(dst, dst_size,
-                 "video pts:%s time:%s size:%dx%d aspect:%d/%d",
-                 av_ts2str(frame->pts), av_ts2timestr(frame->pts, &link->time_base),
-                 frame->width, frame->height,
-                 frame->sample_aspect_ratio.num,
-                 frame->sample_aspect_ratio.den);
-                 break;
-    case AVMEDIA_TYPE_AUDIO:
-        snprintf(dst, dst_size,
-                 "audio pts:%s time:%s samples:%d",
-                 av_ts2str(frame->pts), av_ts2timestr(frame->pts, &link->time_base),
-                 frame->nb_samples);
-                 break;
-    default:
-        snprintf(dst, dst_size, "%s BUG", av_get_media_type_string(frame_type));
-        break;
-    }
-    return dst;
-}
-
 static int rewind_file(AVFilterContext *ctx)
 {
     MovieContext *movie = ctx->priv;
@@ -494,147 +480,138 @@ static int rewind_file(AVFilterContext *ctx)
     return 0;
 }
 
-static int movie_decode_packet(AVFilterContext *ctx)
+static int flush_decoder(AVFilterContext *ctx, int i)
 {
     MovieContext *movie = ctx->priv;
-    AVPacket pkt = { 0 };
-    int pkt_out_id, ret;
-
-    /* read a new packet from input stream */
-    ret = av_read_frame(movie->format_ctx, &pkt);
-    if (ret == AVERROR_EOF) {
-        /* EOF -> set all decoders for flushing */
-        for (int i = 0; i < ctx->nb_outputs; i++) {
-            ret = avcodec_send_packet(movie->st[i].codec_ctx, NULL);
-            if (ret < 0 && ret != AVERROR_EOF)
-                return ret;
-        }
-
-        return 0;
-    } else if (ret < 0)
-        return ret;
+    AVCodecContext *dec = movie->st[i].codec_ctx;
 
-    /* send the packet to its decoder, if any */
-    pkt_out_id = pkt.stream_index > movie->max_stream_index ? -1 :
-                 movie->out_index[pkt.stream_index];
-    if (pkt_out_id >= 0) {
-        pkt.opaque = ctx->outputs[pkt_out_id];
-        ret = avcodec_send_packet(movie->st[pkt_out_id].codec_ctx, &pkt);
-    }
-    av_packet_unref(&pkt);
-
-    return ret;
+    return avcodec_send_packet(dec, NULL);
 }
 
-/**
- * Try to push a frame to the requested output.
- *
- * @param ctx     filter context
- * @param out_id  number of output where a frame is wanted;
- * @return  0 if a frame was pushed on the requested output,
- *         AVERROR(EAGAIN) if the decoder requires more input
- *         AVERROR(EOF) if the decoder has been completely flushed
- *         <0 AVERROR code
- */
-static int movie_push_frame(AVFilterContext *ctx, unsigned out_id)
+static int decode_packet(AVFilterContext *ctx, int i)
 {
-    MovieContext   *movie = ctx->priv;
-    MovieStream       *st = &movie->st[out_id];
-    AVFilterLink *outlink = ctx->outputs[out_id];
-    AVFrame *frame;
-    int ret;
-
-    frame = av_frame_alloc();
-    if (!frame)
-        return AVERROR(ENOMEM);
-
-    ret = avcodec_receive_frame(st->codec_ctx, frame);
-    if (ret < 0) {
-        if (ret != AVERROR_EOF && ret != AVERROR(EAGAIN))
-            av_log(ctx, AV_LOG_WARNING, "Decode error: %s\n", av_err2str(ret));
-
-        av_frame_free(&frame);
-        return ret;
+    AVFilterLink *outlink = ctx->outputs[i];
+    MovieContext *movie = ctx->priv;
+    MovieStream *st = &movie->st[i];
+    AVCodecContext *dec = movie->st[i].codec_ctx;
+    AVFrame *frame = movie->st[i].frame;
+    AVPacket *pkt = movie->pkt;
+    int ret = 0;
+
+    // submit the packet to the decoder
+    if (!movie->eof) {
+        ret = avcodec_send_packet(dec, pkt);
+        if (ret < 0)
+            return ret;
     }
 
-    frame->pts = frame->best_effort_timestamp;
-    if (frame->pts != AV_NOPTS_VALUE) {
-        if (movie->ts_offset)
-            frame->pts += av_rescale_q_rnd(movie->ts_offset, AV_TIME_BASE_Q, outlink->time_base, AV_ROUND_UP);
-        if (st->discontinuity_threshold) {
-            if (st->last_pts != AV_NOPTS_VALUE) {
-                int64_t diff = frame->pts - st->last_pts;
-                if (diff < 0 || diff > st->discontinuity_threshold) {
-                    av_log(ctx, AV_LOG_VERBOSE, "Discontinuity in stream:%d diff:%"PRId64"\n", out_id, diff);
-                    movie->ts_offset += av_rescale_q_rnd(-diff, outlink->time_base, AV_TIME_BASE_Q, AV_ROUND_UP);
-                    frame->pts -= diff;
+    // get all the available frames from the decoder
+    if (ret >= 0) {
+        ret = avcodec_receive_frame(dec, frame);
+        if (ret < 0) {
+            // those two return values are special and mean there is no output
+            // frame available, but there were no errors during decoding
+            if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN))
+                return 0;
+            return ret;
+        }
+
+        frame->pts = frame->best_effort_timestamp;
+        if (frame->pts != AV_NOPTS_VALUE) {
+            if (movie->ts_offset)
+                frame->pts += av_rescale_q_rnd(movie->ts_offset, AV_TIME_BASE_Q, outlink->time_base, AV_ROUND_UP);
+            if (st->discontinuity_threshold) {
+                if (st->last_pts != AV_NOPTS_VALUE) {
+                    int64_t diff = frame->pts - st->last_pts;
+                    if (diff < 0 || diff > st->discontinuity_threshold) {
+                        av_log(ctx, AV_LOG_VERBOSE, "Discontinuity in stream:%d diff:%"PRId64"\n", i, diff);
+                        movie->ts_offset += av_rescale_q_rnd(-diff, outlink->time_base, AV_TIME_BASE_Q, AV_ROUND_UP);
+                        frame->pts -= diff;
+                    }
                 }
             }
+            st->last_pts = frame->pts;
         }
-        st->last_pts = frame->pts;
-    }
-    ff_dlog(ctx, "movie_push_frame(): file:'%s' %s\n", movie->file_name,
-            describe_frame_to_str((char[1024]){0}, 1024, frame,
-                                  st->st->codecpar->codec_type, outlink));
-
-    if (st->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
-        if (frame->format != outlink->format) {
-            av_log(ctx, AV_LOG_ERROR, "Format changed %s -> %s, discarding frame\n",
-                av_get_pix_fmt_name(outlink->format),
-                av_get_pix_fmt_name(frame->format)
-                );
-            av_frame_free(&frame);
-            return 0;
-        }
+        ret = ff_filter_frame(outlink, av_frame_clone(frame));
+        if (ret < 0)
+            return ret;
+        if (ret == 0)
+            return 1;
     }
-    ret = ff_filter_frame(outlink, frame);
 
-    if (ret < 0)
-        return ret;
     return 0;
 }
 
-static int movie_request_frame(AVFilterLink *outlink)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = outlink->src;
-    MovieContext  *movie = ctx->priv;
-    unsigned out_id = FF_OUTLINK_IDX(outlink);
+    MovieContext *movie = ctx->priv;
+    int wanted = 0, ret;
 
-    while (1) {
-        int got_eagain = 0, got_eof = 0;
-        int ret = 0;
+    for (int i = 0; i < ctx->nb_outputs; i++) {
+        if (ff_outlink_frame_wanted(ctx->outputs[i]))
+            wanted++;
+    }
 
-        /* check all decoders for available output */
-        for (int i = 0; i < ctx->nb_outputs; i++) {
-            ret = movie_push_frame(ctx, i);
-            if (ret == AVERROR(EAGAIN))
-                got_eagain++;
-            else if (ret == AVERROR_EOF)
-                got_eof++;
-            else if (ret < 0)
-                return ret;
-            else if (i == out_id)
-                return 0;
+    if (wanted == 0)
+        return FFERROR_NOT_READY;
+
+    if (!movie->eof) {
+        ret = av_read_frame(movie->format_ctx, movie->pkt);
+        if (ret < 0) {
+            movie->eof = 1;
+            for (int i = 0; i < ctx->nb_outputs; i++)
+                flush_decoder(ctx, i);
+            ff_filter_set_ready(ctx, 100);
+            return 0;
+        } else {
+            int pkt_out_id = movie->pkt->stream_index > movie->max_stream_index ? -1 :
+                             movie->out_index[movie->pkt->stream_index];
+
+            if (pkt_out_id >= 0) {
+                movie->pkt->opaque = ctx->outputs[pkt_out_id];
+                ret = decode_packet(ctx, pkt_out_id);
+            }
+            av_packet_unref(movie->pkt);
+            ff_filter_set_ready(ctx, 100);
+            return (ret <= 0) ? ret : 0;
         }
+    } else {
+        int nb_eofs = 0;
 
-        if (got_eagain) {
-            /* all decoders require more input -> read a new packet */
-            ret = movie_decode_packet(ctx);
+        for (int i = 0; i < ctx->nb_outputs; i++) {
+            if (!movie->st[i].eof) {
+                ret = decode_packet(ctx, i);
+                if (ret <= 0)
+                    movie->st[i].eof = 1;
+            }
+            nb_eofs += movie->st[i].eof == 1;
+        }
+        if (nb_eofs == ctx->nb_outputs && movie->loop_count != 1) {
+            ret = rewind_file(ctx);
             if (ret < 0)
                 return ret;
-        } else if (got_eof) {
-            /* all decoders flushed */
-            if (movie->loop_count != 1) {
-                ret = rewind_file(ctx);
-                if (ret < 0)
-                    return ret;
-                movie->loop_count -= movie->loop_count > 1;
-                av_log(ctx, AV_LOG_VERBOSE, "Stream finished, looping.\n");
-                continue;
+            movie->loop_count -= movie->loop_count > 1;
+            av_log(ctx, AV_LOG_VERBOSE, "Stream finished, looping.\n");
+            ff_filter_set_ready(ctx, 100);
+            for (int i = 0; i < ctx->nb_outputs; i++)
+                movie->st[i].eof = 0;
+            movie->eof = 0;
+            return 0;
+        } else {
+            for (int i = 0; i < ctx->nb_outputs; i++) {
+                if (movie->st[i].eof) {
+                    ff_outlink_set_status(ctx->outputs[i], AVERROR_EOF, movie->st[i].last_pts);
+                    nb_eofs++;
+                }
             }
-            return AVERROR_EOF;
         }
+
+        if (nb_eofs < ctx->nb_outputs)
+            ff_filter_set_ready(ctx, 100);
+        return 0;
     }
+
+    return FFERROR_NOT_READY;
 }
 
 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
@@ -689,6 +666,7 @@ const AVFilter ff_avsrc_movie = {
     .priv_size     = sizeof(MovieContext),
     .priv_class    = &movie_class,
     .init          = movie_common_init,
+    .activate      = activate,
     .uninit        = movie_uninit,
     FILTER_QUERY_FUNC(movie_query_formats),
 
@@ -708,6 +686,7 @@ const AVFilter ff_avsrc_amovie = {
     .priv_class    = &movie_class,
     .priv_size     = sizeof(MovieContext),
     .init          = movie_common_init,
+    .activate      = activate,
     .uninit        = movie_uninit,
     FILTER_QUERY_FUNC(movie_query_formats),
 
-- 
2.39.1


[-- Attachment #3: 0026-avfilter-src_movie-dr-support.patch --]
[-- Type: text/x-patch, Size: 2799 bytes --]

From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00 2001
From: Paul B Mahol <onemda@gmail.com>
Date: Mon, 15 May 2023 21:54:25 +0200
Subject: [PATCH 26/27] avfilter/src_movie: dr support

Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
 libavfilter/src_movie.c | 44 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
index 5937613d13..a2ecc5a625 100644
--- a/libavfilter/src_movie.c
+++ b/libavfilter/src_movie.c
@@ -23,7 +23,6 @@
  * @file
  * movie video source
  *
- * @todo use direct rendering (no allocation of a new frame)
  * @todo support a PTS correction mechanism
  */
 
@@ -156,6 +155,43 @@ static AVStream *find_stream(void *log, AVFormatContext *avf, const char *spec)
     return found;
 }
 
+static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
+{
+    int linesize_align[AV_NUM_DATA_POINTERS];
+    AVFilterLink *outlink = frame->opaque;
+    int w, h, ow, oh;
+    AVFrame *new;
+
+    h = oh = frame->height;
+    w = ow = frame->width;
+
+    if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1))
+        return avcodec_default_get_buffer2(avctx, frame, flags);
+
+    switch (avctx->codec_type) {
+    case AVMEDIA_TYPE_VIDEO:
+        avcodec_align_dimensions2(avctx, &w, &h, linesize_align);
+        new = ff_default_get_video_buffer(outlink, w, h);
+        break;
+    case AVMEDIA_TYPE_AUDIO:
+        new = ff_default_get_audio_buffer(outlink, frame->nb_samples);
+        break;
+    default:
+        return -1;
+    }
+
+    av_frame_copy_props(new, frame);
+    av_frame_unref(frame);
+    av_frame_move_ref(frame, new);
+    av_frame_free(&new);
+
+    frame->opaque = outlink;
+    frame->width  = ow;
+    frame->height = oh;
+
+    return 0;
+}
+
 static int open_stream(AVFilterContext *ctx, MovieStream *st, int dec_threads)
 {
     const AVCodec *codec;
@@ -171,6 +207,8 @@ static int open_stream(AVFilterContext *ctx, MovieStream *st, int dec_threads)
     if (!st->codec_ctx)
         return AVERROR(ENOMEM);
 
+    st->codec_ctx->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
+    st->codec_ctx->get_buffer2 = get_buffer;
     ret = avcodec_parameters_to_context(st->codec_ctx, st->st->codecpar);
     if (ret < 0)
         return ret;
@@ -479,8 +517,10 @@ static int movie_decode_packet(AVFilterContext *ctx)
     /* send the packet to its decoder, if any */
     pkt_out_id = pkt.stream_index > movie->max_stream_index ? -1 :
                  movie->out_index[pkt.stream_index];
-    if (pkt_out_id >= 0)
+    if (pkt_out_id >= 0) {
+        pkt.opaque = ctx->outputs[pkt_out_id];
         ret = avcodec_send_packet(movie->st[pkt_out_id].codec_ctx, &pkt);
+    }
     av_packet_unref(&pkt);
 
     return ret;
-- 
2.39.1


[-- Attachment #4: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
  2023-05-18 10:22 [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr Paul B Mahol
@ 2023-05-18 17:31 ` James Almer
  2023-05-18 17:44   ` Paul B Mahol
  2023-05-22 14:48 ` Anton Khirnov
  1 sibling, 1 reply; 9+ messages in thread
From: James Almer @ 2023-05-18 17:31 UTC (permalink / raw)
  To: ffmpeg-devel

On 5/18/2023 7:22 AM, Paul B Mahol wrote:
> From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00 2001
> From: Paul B Mahol <onemda@gmail.com>
> Date: Mon, 15 May 2023 21:54:25 +0200
> Subject: [PATCH 26/27] avfilter/src_movie: dr support
> 
> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> ---
>  libavfilter/src_movie.c | 44 +++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 42 insertions(+), 2 deletions(-)
> 
> diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
> index 5937613d13..a2ecc5a625 100644
> --- a/libavfilter/src_movie.c
> +++ b/libavfilter/src_movie.c
> @@ -23,7 +23,6 @@
>   * @file
>   * movie video source
>   *
> - * @todo use direct rendering (no allocation of a new frame)
>   * @todo support a PTS correction mechanism
>   */
>  
> @@ -156,6 +155,43 @@ static AVStream *find_stream(void *log, AVFormatContext *avf, const char *spec)
>      return found;
>  }
>  
> +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
> +{
> +    int linesize_align[AV_NUM_DATA_POINTERS];
> +    AVFilterLink *outlink = frame->opaque;
> +    int w, h, ow, oh;
> +    AVFrame *new;
> +
> +    h = oh = frame->height;
> +    w = ow = frame->width;
> +
> +    if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1))
> +        return avcodec_default_get_buffer2(avctx, frame, flags);
> +
> +    switch (avctx->codec_type) {
> +    case AVMEDIA_TYPE_VIDEO:
> +        avcodec_align_dimensions2(avctx, &w, &h, linesize_align);
> +        new = ff_default_get_video_buffer(outlink, w, h);
> +        break;
> +    case AVMEDIA_TYPE_AUDIO:
> +        new = ff_default_get_audio_buffer(outlink, frame->nb_samples);

I wonder, are these two functions thread safe?
AVCodecContext.get_buffer2() no longer supports non-thread safe 
callbacks, and these seem to allocate and replace the pool inside 
outlink as required. If called from more than one thread with different 
frame parameters, wouldn't there be a race?

> +        break;
> +    default:
> +        return -1;
> +    }
> +
> +    av_frame_copy_props(new, frame);
> +    av_frame_unref(frame);
> +    av_frame_move_ref(frame, new);
> +    av_frame_free(&new);
> +
> +    frame->opaque = outlink;
> +    frame->width  = ow;
> +    frame->height = oh;
> +
> +    return 0;
> +}
> +
>  static int open_stream(AVFilterContext *ctx, MovieStream *st, int dec_threads)
>  {
>      const AVCodec *codec;
> @@ -171,6 +207,8 @@ static int open_stream(AVFilterContext *ctx, MovieStream *st, int dec_threads)
>      if (!st->codec_ctx)
>          return AVERROR(ENOMEM);
>  
> +    st->codec_ctx->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
> +    st->codec_ctx->get_buffer2 = get_buffer;
>      ret = avcodec_parameters_to_context(st->codec_ctx, st->st->codecpar);
>      if (ret < 0)
>          return ret;
> @@ -479,8 +517,10 @@ static int movie_decode_packet(AVFilterContext *ctx)
>      /* send the packet to its decoder, if any */
>      pkt_out_id = pkt.stream_index > movie->max_stream_index ? -1 :
>                   movie->out_index[pkt.stream_index];
> -    if (pkt_out_id >= 0)
> +    if (pkt_out_id >= 0) {
> +        pkt.opaque = ctx->outputs[pkt_out_id];
>          ret = avcodec_send_packet(movie->st[pkt_out_id].codec_ctx, &pkt);
> +    }
>      av_packet_unref(&pkt);
>  
>      return ret;
> -- 
> 2.39.1
> 
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
  2023-05-18 17:31 ` James Almer
@ 2023-05-18 17:44   ` Paul B Mahol
  2023-05-18 18:01     ` James Almer
  0 siblings, 1 reply; 9+ messages in thread
From: Paul B Mahol @ 2023-05-18 17:44 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On Thu, May 18, 2023 at 7:31 PM James Almer <jamrial@gmail.com> wrote:

> On 5/18/2023 7:22 AM, Paul B Mahol wrote:
> > From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00 2001
> > From: Paul B Mahol <onemda@gmail.com>
> > Date: Mon, 15 May 2023 21:54:25 +0200
> > Subject: [PATCH 26/27] avfilter/src_movie: dr support
> >
> > Signed-off-by: Paul B Mahol <onemda@gmail.com>
> > ---
> >  libavfilter/src_movie.c | 44 +++++++++++++++++++++++++++++++++++++++--
> >  1 file changed, 42 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
> > index 5937613d13..a2ecc5a625 100644
> > --- a/libavfilter/src_movie.c
> > +++ b/libavfilter/src_movie.c
> > @@ -23,7 +23,6 @@
> >   * @file
> >   * movie video source
> >   *
> > - * @todo use direct rendering (no allocation of a new frame)
> >   * @todo support a PTS correction mechanism
> >   */
> >
> > @@ -156,6 +155,43 @@ static AVStream *find_stream(void *log,
> AVFormatContext *avf, const char *spec)
> >      return found;
> >  }
> >
> > +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
> > +{
> > +    int linesize_align[AV_NUM_DATA_POINTERS];
> > +    AVFilterLink *outlink = frame->opaque;
> > +    int w, h, ow, oh;
> > +    AVFrame *new;
> > +
> > +    h = oh = frame->height;
> > +    w = ow = frame->width;
> > +
> > +    if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1))
> > +        return avcodec_default_get_buffer2(avctx, frame, flags);
> > +
> > +    switch (avctx->codec_type) {
> > +    case AVMEDIA_TYPE_VIDEO:
> > +        avcodec_align_dimensions2(avctx, &w, &h, linesize_align);
> > +        new = ff_default_get_video_buffer(outlink, w, h);
> > +        break;
> > +    case AVMEDIA_TYPE_AUDIO:
> > +        new = ff_default_get_audio_buffer(outlink, frame->nb_samples);
>
> I wonder, are these two functions thread safe?
> AVCodecContext.get_buffer2() no longer supports non-thread safe
> callbacks, and these seem to allocate and replace the pool inside
> outlink as required. If called from more than one thread with different
> frame parameters, wouldn't there be a race?
>

I encountered no issues in my testing.


>
> > +        break;
> > +    default:
> > +        return -1;
> > +    }
> > +
> > +    av_frame_copy_props(new, frame);
> > +    av_frame_unref(frame);
> > +    av_frame_move_ref(frame, new);
> > +    av_frame_free(&new);
> > +
> > +    frame->opaque = outlink;
> > +    frame->width  = ow;
> > +    frame->height = oh;
> > +
> > +    return 0;
> > +}
> > +
> >  static int open_stream(AVFilterContext *ctx, MovieStream *st, int
> dec_threads)
> >  {
> >      const AVCodec *codec;
> > @@ -171,6 +207,8 @@ static int open_stream(AVFilterContext *ctx,
> MovieStream *st, int dec_threads)
> >      if (!st->codec_ctx)
> >          return AVERROR(ENOMEM);
> >
> > +    st->codec_ctx->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
> > +    st->codec_ctx->get_buffer2 = get_buffer;
> >      ret = avcodec_parameters_to_context(st->codec_ctx,
> st->st->codecpar);
> >      if (ret < 0)
> >          return ret;
> > @@ -479,8 +517,10 @@ static int movie_decode_packet(AVFilterContext *ctx)
> >      /* send the packet to its decoder, if any */
> >      pkt_out_id = pkt.stream_index > movie->max_stream_index ? -1 :
> >                   movie->out_index[pkt.stream_index];
> > -    if (pkt_out_id >= 0)
> > +    if (pkt_out_id >= 0) {
> > +        pkt.opaque = ctx->outputs[pkt_out_id];
> >          ret = avcodec_send_packet(movie->st[pkt_out_id].codec_ctx,
> &pkt);
> > +    }
> >      av_packet_unref(&pkt);
> >
> >      return ret;
> > --
> > 2.39.1
> >
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
  2023-05-18 17:44   ` Paul B Mahol
@ 2023-05-18 18:01     ` James Almer
  2023-05-19  7:52       ` Paul B Mahol
  0 siblings, 1 reply; 9+ messages in thread
From: James Almer @ 2023-05-18 18:01 UTC (permalink / raw)
  To: ffmpeg-devel

On 5/18/2023 2:44 PM, Paul B Mahol wrote:
> On Thu, May 18, 2023 at 7:31 PM James Almer <jamrial@gmail.com> wrote:
> 
>> On 5/18/2023 7:22 AM, Paul B Mahol wrote:
>>>  From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00 2001
>>> From: Paul B Mahol <onemda@gmail.com>
>>> Date: Mon, 15 May 2023 21:54:25 +0200
>>> Subject: [PATCH 26/27] avfilter/src_movie: dr support
>>>
>>> Signed-off-by: Paul B Mahol <onemda@gmail.com>
>>> ---
>>>   libavfilter/src_movie.c | 44 +++++++++++++++++++++++++++++++++++++++--
>>>   1 file changed, 42 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
>>> index 5937613d13..a2ecc5a625 100644
>>> --- a/libavfilter/src_movie.c
>>> +++ b/libavfilter/src_movie.c
>>> @@ -23,7 +23,6 @@
>>>    * @file
>>>    * movie video source
>>>    *
>>> - * @todo use direct rendering (no allocation of a new frame)
>>>    * @todo support a PTS correction mechanism
>>>    */
>>>
>>> @@ -156,6 +155,43 @@ static AVStream *find_stream(void *log,
>> AVFormatContext *avf, const char *spec)
>>>       return found;
>>>   }
>>>
>>> +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
>>> +{
>>> +    int linesize_align[AV_NUM_DATA_POINTERS];
>>> +    AVFilterLink *outlink = frame->opaque;
>>> +    int w, h, ow, oh;
>>> +    AVFrame *new;
>>> +
>>> +    h = oh = frame->height;
>>> +    w = ow = frame->width;
>>> +
>>> +    if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1))
>>> +        return avcodec_default_get_buffer2(avctx, frame, flags);
>>> +
>>> +    switch (avctx->codec_type) {
>>> +    case AVMEDIA_TYPE_VIDEO:
>>> +        avcodec_align_dimensions2(avctx, &w, &h, linesize_align);
>>> +        new = ff_default_get_video_buffer(outlink, w, h);
>>> +        break;
>>> +    case AVMEDIA_TYPE_AUDIO:
>>> +        new = ff_default_get_audio_buffer(outlink, frame->nb_samples);
>>
>> I wonder, are these two functions thread safe?
>> AVCodecContext.get_buffer2() no longer supports non-thread safe
>> callbacks, and these seem to allocate and replace the pool inside
>> outlink as required. If called from more than one thread with different
>> frame parameters, wouldn't there be a race?
>>
> 
> I encountered no issues in my testing.

Try a sample that changes dimensions every other frame, like 
vp9-test-vectors/vp90-2-05-resize.ivf, and make sure to set filter 
threads so it's propagated to the src_movie internal decoder, to some 
value like 4 or higher. Run it under tsan.

> 
> 
>>
>>> +        break;
>>> +    default:
>>> +        return -1;
>>> +    }
>>> +
>>> +    av_frame_copy_props(new, frame);
>>> +    av_frame_unref(frame);
>>> +    av_frame_move_ref(frame, new);
>>> +    av_frame_free(&new);
>>> +
>>> +    frame->opaque = outlink;
>>> +    frame->width  = ow;
>>> +    frame->height = oh;
>>> +
>>> +    return 0;
>>> +}
>>> +
>>>   static int open_stream(AVFilterContext *ctx, MovieStream *st, int
>> dec_threads)
>>>   {
>>>       const AVCodec *codec;
>>> @@ -171,6 +207,8 @@ static int open_stream(AVFilterContext *ctx,
>> MovieStream *st, int dec_threads)
>>>       if (!st->codec_ctx)
>>>           return AVERROR(ENOMEM);
>>>
>>> +    st->codec_ctx->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
>>> +    st->codec_ctx->get_buffer2 = get_buffer;
>>>       ret = avcodec_parameters_to_context(st->codec_ctx,
>> st->st->codecpar);
>>>       if (ret < 0)
>>>           return ret;
>>> @@ -479,8 +517,10 @@ static int movie_decode_packet(AVFilterContext *ctx)
>>>       /* send the packet to its decoder, if any */
>>>       pkt_out_id = pkt.stream_index > movie->max_stream_index ? -1 :
>>>                    movie->out_index[pkt.stream_index];
>>> -    if (pkt_out_id >= 0)
>>> +    if (pkt_out_id >= 0) {
>>> +        pkt.opaque = ctx->outputs[pkt_out_id];
>>>           ret = avcodec_send_packet(movie->st[pkt_out_id].codec_ctx,
>> &pkt);
>>> +    }
>>>       av_packet_unref(&pkt);
>>>
>>>       return ret;
>>> --
>>> 2.39.1
>>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
  2023-05-18 18:01     ` James Almer
@ 2023-05-19  7:52       ` Paul B Mahol
  2023-05-19  8:07         ` Paul B Mahol
  0 siblings, 1 reply; 9+ messages in thread
From: Paul B Mahol @ 2023-05-19  7:52 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On Thu, May 18, 2023 at 8:01 PM James Almer <jamrial@gmail.com> wrote:

> On 5/18/2023 2:44 PM, Paul B Mahol wrote:
> > On Thu, May 18, 2023 at 7:31 PM James Almer <jamrial@gmail.com> wrote:
> >
> >> On 5/18/2023 7:22 AM, Paul B Mahol wrote:
> >>>  From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00 2001
> >>> From: Paul B Mahol <onemda@gmail.com>
> >>> Date: Mon, 15 May 2023 21:54:25 +0200
> >>> Subject: [PATCH 26/27] avfilter/src_movie: dr support
> >>>
> >>> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> >>> ---
> >>>   libavfilter/src_movie.c | 44
> +++++++++++++++++++++++++++++++++++++++--
> >>>   1 file changed, 42 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
> >>> index 5937613d13..a2ecc5a625 100644
> >>> --- a/libavfilter/src_movie.c
> >>> +++ b/libavfilter/src_movie.c
> >>> @@ -23,7 +23,6 @@
> >>>    * @file
> >>>    * movie video source
> >>>    *
> >>> - * @todo use direct rendering (no allocation of a new frame)
> >>>    * @todo support a PTS correction mechanism
> >>>    */
> >>>
> >>> @@ -156,6 +155,43 @@ static AVStream *find_stream(void *log,
> >> AVFormatContext *avf, const char *spec)
> >>>       return found;
> >>>   }
> >>>
> >>> +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int
> flags)
> >>> +{
> >>> +    int linesize_align[AV_NUM_DATA_POINTERS];
> >>> +    AVFilterLink *outlink = frame->opaque;
> >>> +    int w, h, ow, oh;
> >>> +    AVFrame *new;
> >>> +
> >>> +    h = oh = frame->height;
> >>> +    w = ow = frame->width;
> >>> +
> >>> +    if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1))
> >>> +        return avcodec_default_get_buffer2(avctx, frame, flags);
> >>> +
> >>> +    switch (avctx->codec_type) {
> >>> +    case AVMEDIA_TYPE_VIDEO:
> >>> +        avcodec_align_dimensions2(avctx, &w, &h, linesize_align);
> >>> +        new = ff_default_get_video_buffer(outlink, w, h);
> >>> +        break;
> >>> +    case AVMEDIA_TYPE_AUDIO:
> >>> +        new = ff_default_get_audio_buffer(outlink, frame->nb_samples);
> >>
> >> I wonder, are these two functions thread safe?
> >> AVCodecContext.get_buffer2() no longer supports non-thread safe
> >> callbacks, and these seem to allocate and replace the pool inside
> >> outlink as required. If called from more than one thread with different
> >> frame parameters, wouldn't there be a race?
> >>
> >
> > I encountered no issues in my testing.
>
> Try a sample that changes dimensions every other frame, like
> vp9-test-vectors/vp90-2-05-resize.ivf, and make sure to set filter
> threads so it's propagated to the src_movie internal decoder, to some
> value like 4 or higher. Run it under tsan.
>
>
I tried that, and also own .h264 file hash decoding is always same.
tsan shows warnings for both without and with this filter and frame
threading.


> >
> >
> >>
> >>> +        break;
> >>> +    default:
> >>> +        return -1;
> >>> +    }
> >>> +
> >>> +    av_frame_copy_props(new, frame);
> >>> +    av_frame_unref(frame);
> >>> +    av_frame_move_ref(frame, new);
> >>> +    av_frame_free(&new);
> >>> +
> >>> +    frame->opaque = outlink;
> >>> +    frame->width  = ow;
> >>> +    frame->height = oh;
> >>> +
> >>> +    return 0;
> >>> +}
> >>> +
> >>>   static int open_stream(AVFilterContext *ctx, MovieStream *st, int
> >> dec_threads)
> >>>   {
> >>>       const AVCodec *codec;
> >>> @@ -171,6 +207,8 @@ static int open_stream(AVFilterContext *ctx,
> >> MovieStream *st, int dec_threads)
> >>>       if (!st->codec_ctx)
> >>>           return AVERROR(ENOMEM);
> >>>
> >>> +    st->codec_ctx->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
> >>> +    st->codec_ctx->get_buffer2 = get_buffer;
> >>>       ret = avcodec_parameters_to_context(st->codec_ctx,
> >> st->st->codecpar);
> >>>       if (ret < 0)
> >>>           return ret;
> >>> @@ -479,8 +517,10 @@ static int movie_decode_packet(AVFilterContext
> *ctx)
> >>>       /* send the packet to its decoder, if any */
> >>>       pkt_out_id = pkt.stream_index > movie->max_stream_index ? -1 :
> >>>                    movie->out_index[pkt.stream_index];
> >>> -    if (pkt_out_id >= 0)
> >>> +    if (pkt_out_id >= 0) {
> >>> +        pkt.opaque = ctx->outputs[pkt_out_id];
> >>>           ret = avcodec_send_packet(movie->st[pkt_out_id].codec_ctx,
> >> &pkt);
> >>> +    }
> >>>       av_packet_unref(&pkt);
> >>>
> >>>       return ret;
> >>> --
> >>> 2.39.1
> >>>
> >> _______________________________________________
> >> ffmpeg-devel mailing list
> >> ffmpeg-devel@ffmpeg.org
> >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>
> >> To unsubscribe, visit link above, or email
> >> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> >>
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
  2023-05-19  7:52       ` Paul B Mahol
@ 2023-05-19  8:07         ` Paul B Mahol
  0 siblings, 0 replies; 9+ messages in thread
From: Paul B Mahol @ 2023-05-19  8:07 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On Fri, May 19, 2023 at 9:52 AM Paul B Mahol <onemda@gmail.com> wrote:

>
>
> On Thu, May 18, 2023 at 8:01 PM James Almer <jamrial@gmail.com> wrote:
>
>> On 5/18/2023 2:44 PM, Paul B Mahol wrote:
>> > On Thu, May 18, 2023 at 7:31 PM James Almer <jamrial@gmail.com> wrote:
>> >
>> >> On 5/18/2023 7:22 AM, Paul B Mahol wrote:
>> >>>  From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00
>> 2001
>> >>> From: Paul B Mahol <onemda@gmail.com>
>> >>> Date: Mon, 15 May 2023 21:54:25 +0200
>> >>> Subject: [PATCH 26/27] avfilter/src_movie: dr support
>> >>>
>> >>> Signed-off-by: Paul B Mahol <onemda@gmail.com>
>> >>> ---
>> >>>   libavfilter/src_movie.c | 44
>> +++++++++++++++++++++++++++++++++++++++--
>> >>>   1 file changed, 42 insertions(+), 2 deletions(-)
>> >>>
>> >>> diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
>> >>> index 5937613d13..a2ecc5a625 100644
>> >>> --- a/libavfilter/src_movie.c
>> >>> +++ b/libavfilter/src_movie.c
>> >>> @@ -23,7 +23,6 @@
>> >>>    * @file
>> >>>    * movie video source
>> >>>    *
>> >>> - * @todo use direct rendering (no allocation of a new frame)
>> >>>    * @todo support a PTS correction mechanism
>> >>>    */
>> >>>
>> >>> @@ -156,6 +155,43 @@ static AVStream *find_stream(void *log,
>> >> AVFormatContext *avf, const char *spec)
>> >>>       return found;
>> >>>   }
>> >>>
>> >>> +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int
>> flags)
>> >>> +{
>> >>> +    int linesize_align[AV_NUM_DATA_POINTERS];
>> >>> +    AVFilterLink *outlink = frame->opaque;
>> >>> +    int w, h, ow, oh;
>> >>> +    AVFrame *new;
>> >>> +
>> >>> +    h = oh = frame->height;
>> >>> +    w = ow = frame->width;
>> >>> +
>> >>> +    if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1))
>> >>> +        return avcodec_default_get_buffer2(avctx, frame, flags);
>> >>> +
>> >>> +    switch (avctx->codec_type) {
>> >>> +    case AVMEDIA_TYPE_VIDEO:
>> >>> +        avcodec_align_dimensions2(avctx, &w, &h, linesize_align);
>> >>> +        new = ff_default_get_video_buffer(outlink, w, h);
>> >>> +        break;
>> >>> +    case AVMEDIA_TYPE_AUDIO:
>> >>> +        new = ff_default_get_audio_buffer(outlink,
>> frame->nb_samples);
>> >>
>> >> I wonder, are these two functions thread safe?
>> >> AVCodecContext.get_buffer2() no longer supports non-thread safe
>> >> callbacks, and these seem to allocate and replace the pool inside
>> >> outlink as required. If called from more than one thread with different
>> >> frame parameters, wouldn't there be a race?
>> >>
>> >
>> > I encountered no issues in my testing.
>>
>> Try a sample that changes dimensions every other frame, like
>> vp9-test-vectors/vp90-2-05-resize.ivf, and make sure to set filter
>> threads so it's propagated to the src_movie internal decoder, to some
>> value like 4 or higher. Run it under tsan.
>>
>>
> I tried that, and also own .h264 file hash decoding is always same.
> tsan shows warnings for both without and with this filter and frame
> threading.
>

Only issue I found is if you use tmix filter after: ffmpeg -f lavfi -i
movie=resolution_change_name.file,tmix
It will produce invalid output with MD5 hash different each time, same as
with threads=1
But exact same issue is without this 2 patches, and present in current
version of FFmpeg.

Nice workaround is just inserting scale filter between movie and tmix.


>
>> >
>> >
>> >>
>> >>> +        break;
>> >>> +    default:
>> >>> +        return -1;
>> >>> +    }
>> >>> +
>> >>> +    av_frame_copy_props(new, frame);
>> >>> +    av_frame_unref(frame);
>> >>> +    av_frame_move_ref(frame, new);
>> >>> +    av_frame_free(&new);
>> >>> +
>> >>> +    frame->opaque = outlink;
>> >>> +    frame->width  = ow;
>> >>> +    frame->height = oh;
>> >>> +
>> >>> +    return 0;
>> >>> +}
>> >>> +
>> >>>   static int open_stream(AVFilterContext *ctx, MovieStream *st, int
>> >> dec_threads)
>> >>>   {
>> >>>       const AVCodec *codec;
>> >>> @@ -171,6 +207,8 @@ static int open_stream(AVFilterContext *ctx,
>> >> MovieStream *st, int dec_threads)
>> >>>       if (!st->codec_ctx)
>> >>>           return AVERROR(ENOMEM);
>> >>>
>> >>> +    st->codec_ctx->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
>> >>> +    st->codec_ctx->get_buffer2 = get_buffer;
>> >>>       ret = avcodec_parameters_to_context(st->codec_ctx,
>> >> st->st->codecpar);
>> >>>       if (ret < 0)
>> >>>           return ret;
>> >>> @@ -479,8 +517,10 @@ static int movie_decode_packet(AVFilterContext
>> *ctx)
>> >>>       /* send the packet to its decoder, if any */
>> >>>       pkt_out_id = pkt.stream_index > movie->max_stream_index ? -1 :
>> >>>                    movie->out_index[pkt.stream_index];
>> >>> -    if (pkt_out_id >= 0)
>> >>> +    if (pkt_out_id >= 0) {
>> >>> +        pkt.opaque = ctx->outputs[pkt_out_id];
>> >>>           ret = avcodec_send_packet(movie->st[pkt_out_id].codec_ctx,
>> >> &pkt);
>> >>> +    }
>> >>>       av_packet_unref(&pkt);
>> >>>
>> >>>       return ret;
>> >>> --
>> >>> 2.39.1
>> >>>
>> >> _______________________________________________
>> >> ffmpeg-devel mailing list
>> >> ffmpeg-devel@ffmpeg.org
>> >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> >>
>> >> To unsubscribe, visit link above, or email
>> >> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>> >>
>> > _______________________________________________
>> > ffmpeg-devel mailing list
>> > ffmpeg-devel@ffmpeg.org
>> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> >
>> > To unsubscribe, visit link above, or email
>> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>>
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
  2023-05-18 10:22 [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr Paul B Mahol
  2023-05-18 17:31 ` James Almer
@ 2023-05-22 14:48 ` Anton Khirnov
  2023-05-22 14:55   ` James Almer
  1 sibling, 1 reply; 9+ messages in thread
From: Anton Khirnov @ 2023-05-22 14:48 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Quoting Paul B Mahol (2023-05-18 12:22:07)
> From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00 2001
> From: Paul B Mahol <onemda@gmail.com>
> Date: Mon, 15 May 2023 21:54:25 +0200
> Subject: [PATCH 26/27] avfilter/src_movie: dr support
> 
> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> ---
>  libavfilter/src_movie.c | 44 +++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 42 insertions(+), 2 deletions(-)
> 
> diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
> index 5937613d13..a2ecc5a625 100644
> --- a/libavfilter/src_movie.c
> +++ b/libavfilter/src_movie.c
> @@ -23,7 +23,6 @@
>   * @file
>   * movie video source
>   *
> - * @todo use direct rendering (no allocation of a new frame)
>   * @todo support a PTS correction mechanism
>   */
>  
> @@ -156,6 +155,43 @@ static AVStream *find_stream(void *log, AVFormatContext *avf, const char *spec)
>      return found;
>  }
>  
> +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
> +{
> +    int linesize_align[AV_NUM_DATA_POINTERS];
> +    AVFilterLink *outlink = frame->opaque;

This is not guaranteed to be set. Use AVCodecContext.opaque instead.

> +    int w, h, ow, oh;
> +    AVFrame *new;
> +
> +    h = oh = frame->height;
> +    w = ow = frame->width;
> +
> +    if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1))
> +        return avcodec_default_get_buffer2(avctx, frame, flags);
> +
> +    switch (avctx->codec_type) {
> +    case AVMEDIA_TYPE_VIDEO:
> +        avcodec_align_dimensions2(avctx, &w, &h, linesize_align);
> +        new = ff_default_get_video_buffer(outlink, w, h);
> +        break;
> +    case AVMEDIA_TYPE_AUDIO:
> +        new = ff_default_get_audio_buffer(outlink, frame->nb_samples);
> +        break;
> +    default:
> +        return -1;
> +    }
> +
> +    av_frame_copy_props(new, frame);
> +    av_frame_unref(frame);
> +    av_frame_move_ref(frame, new);
> +    av_frame_free(&new);
> +
> +    frame->opaque = outlink;

For what purpose?

-- 
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
  2023-05-22 14:48 ` Anton Khirnov
@ 2023-05-22 14:55   ` James Almer
  2023-05-22 15:00     ` James Almer
  0 siblings, 1 reply; 9+ messages in thread
From: James Almer @ 2023-05-22 14:55 UTC (permalink / raw)
  To: ffmpeg-devel

On 5/22/2023 11:48 AM, Anton Khirnov wrote:
> Quoting Paul B Mahol (2023-05-18 12:22:07)
>>  From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00 2001
>> From: Paul B Mahol <onemda@gmail.com>
>> Date: Mon, 15 May 2023 21:54:25 +0200
>> Subject: [PATCH 26/27] avfilter/src_movie: dr support
>>
>> Signed-off-by: Paul B Mahol <onemda@gmail.com>
>> ---
>>   libavfilter/src_movie.c | 44 +++++++++++++++++++++++++++++++++++++++--
>>   1 file changed, 42 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
>> index 5937613d13..a2ecc5a625 100644
>> --- a/libavfilter/src_movie.c
>> +++ b/libavfilter/src_movie.c
>> @@ -23,7 +23,6 @@
>>    * @file
>>    * movie video source
>>    *
>> - * @todo use direct rendering (no allocation of a new frame)
>>    * @todo support a PTS correction mechanism
>>    */
>>   
>> @@ -156,6 +155,43 @@ static AVStream *find_stream(void *log, AVFormatContext *avf, const char *spec)
>>       return found;
>>   }
>>   
>> +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
>> +{
>> +    int linesize_align[AV_NUM_DATA_POINTERS];
>> +    AVFilterLink *outlink = frame->opaque;
> 
> This is not guaranteed to be set. Use AVCodecContext.opaque instead.

How so? He set the AV_CODEC_FLAG_COPY_OPAQUE flag and the pkt.opaque 
field before calling avcodec_send_packet().

Also, this version is out of date. He pushed a more complete one (that 
could have sent to the list, admittedly).

> 
>> +    int w, h, ow, oh;
>> +    AVFrame *new;
>> +
>> +    h = oh = frame->height;
>> +    w = ow = frame->width;
>> +
>> +    if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1))
>> +        return avcodec_default_get_buffer2(avctx, frame, flags);
>> +
>> +    switch (avctx->codec_type) {
>> +    case AVMEDIA_TYPE_VIDEO:
>> +        avcodec_align_dimensions2(avctx, &w, &h, linesize_align);
>> +        new = ff_default_get_video_buffer(outlink, w, h);
>> +        break;
>> +    case AVMEDIA_TYPE_AUDIO:
>> +        new = ff_default_get_audio_buffer(outlink, frame->nb_samples);
>> +        break;
>> +    default:
>> +        return -1;
>> +    }
>> +
>> +    av_frame_copy_props(new, frame);
>> +    av_frame_unref(frame);
>> +    av_frame_move_ref(frame, new);
>> +    av_frame_free(&new);
>> +
>> +    frame->opaque = outlink;
> 
> For what purpose?
> 
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr
  2023-05-22 14:55   ` James Almer
@ 2023-05-22 15:00     ` James Almer
  0 siblings, 0 replies; 9+ messages in thread
From: James Almer @ 2023-05-22 15:00 UTC (permalink / raw)
  To: ffmpeg-devel

On 5/22/2023 11:55 AM, James Almer wrote:
> On 5/22/2023 11:48 AM, Anton Khirnov wrote:
>> Quoting Paul B Mahol (2023-05-18 12:22:07)
>>>  From af73b69a0be9033fddf222b6e9ac60799de85691 Mon Sep 17 00:00:00 2001
>>> From: Paul B Mahol <onemda@gmail.com>
>>> Date: Mon, 15 May 2023 21:54:25 +0200
>>> Subject: [PATCH 26/27] avfilter/src_movie: dr support
>>>
>>> Signed-off-by: Paul B Mahol <onemda@gmail.com>
>>> ---
>>>   libavfilter/src_movie.c | 44 +++++++++++++++++++++++++++++++++++++++--
>>>   1 file changed, 42 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
>>> index 5937613d13..a2ecc5a625 100644
>>> --- a/libavfilter/src_movie.c
>>> +++ b/libavfilter/src_movie.c
>>> @@ -23,7 +23,6 @@
>>>    * @file
>>>    * movie video source
>>>    *
>>> - * @todo use direct rendering (no allocation of a new frame)
>>>    * @todo support a PTS correction mechanism
>>>    */
>>> @@ -156,6 +155,43 @@ static AVStream *find_stream(void *log, 
>>> AVFormatContext *avf, const char *spec)
>>>       return found;
>>>   }
>>> +static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
>>> +{
>>> +    int linesize_align[AV_NUM_DATA_POINTERS];
>>> +    AVFilterLink *outlink = frame->opaque;
>>
>> This is not guaranteed to be set. Use AVCodecContext.opaque instead.
> 
> How so? He set the AV_CODEC_FLAG_COPY_OPAQUE flag and the pkt.opaque 
> field before calling avcodec_send_packet().

Oh, i see now reading the doxy for the flag.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-05-22 15:00 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-18 10:22 [FFmpeg-devel] [PATCH] avfilter/src_movie: activate & dr Paul B Mahol
2023-05-18 17:31 ` James Almer
2023-05-18 17:44   ` Paul B Mahol
2023-05-18 18:01     ` James Almer
2023-05-19  7:52       ` Paul B Mahol
2023-05-19  8:07         ` Paul B Mahol
2023-05-22 14:48 ` Anton Khirnov
2023-05-22 14:55   ` James Almer
2023-05-22 15:00     ` James Almer

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git