From: "Xiang, Haihao" <haihao.xiang-at-intel.com@ffmpeg.org>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Cc: Mark Thompson <sw@jkqxz.net>, "Fu, Linjie" <linjie.fu@intel.com>
Subject: Re: [FFmpeg-devel] [PATCH, v2] lavf/vf_deinterlace_vaapi: flush queued frame for field in DeinterlacingBob
Date: Wed, 29 Dec 2021 03:45:03 +0000
Message-ID: <BN9PR11MB5515A40D0D12773204A0909A9E449@BN9PR11MB5515.namprd11.prod.outlook.com> (raw)
In-Reply-To: <1568794798-6615-1-git-send-email-linjie.fu@intel.com>
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Linjie
> Fu
> Sent: Wednesday, September 18, 2019 16:20
> To: ffmpeg-devel@ffmpeg.org
> Cc: Fu, Linjie <linjie.fu@intel.com>
> Subject: [FFmpeg-devel] [PATCH, v2] lavf/vf_deinterlace_vaapi: flush queued
> frame for field in DeinterlacingBob
>
> For DeinterlacingBob mode with rate=field, the frame number of output
> should equal 2x input total since only intra deinterlace is used.
>
> Currently for "backward_ref = 0, rate = field", extra_delay is
> introduced. Due to the async without flush, frame number of output is
> [expected_number - 2].
>
> Specifically, if the input only has 1 frame, the output will be empty.
>
> Add deint_vaapi_request_frame for deinterlace_vaapi, send NULL frame
> to flush the queued frame.
>
> For 1 frame input in Bob mode with rate=field,
> before patch: 0 frame;
> after patch: 2 frames;
>
> ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128
> -hwaccel_output_format vaapi -i input.h264 -an -vf
> deinterlace_vaapi=mode=bob:rate=field -f null -
Sorry for picking up the old thread.
Hi Mark,
Is your issue mentioned in http://ffmpeg.org/pipermail/ffmpeg-devel/2019-September/250080.html
fixed by this patch version ? I'd like to apply this patch if it may work for you.
Thanks
Haihao
>
> Signed-off-by: Linjie Fu <linjie.fu@intel.com>
> ---
> libavfilter/vf_deinterlace_vaapi.c | 44
> ++++++++++++++++++++++++++++++++------
> 1 file changed, 38 insertions(+), 6 deletions(-)
>
> diff --git a/libavfilter/vf_deinterlace_vaapi.c
> b/libavfilter/vf_deinterlace_vaapi.c
> index 72d0349..fe77118 100644
> --- a/libavfilter/vf_deinterlace_vaapi.c
> +++ b/libavfilter/vf_deinterlace_vaapi.c
> @@ -48,6 +48,9 @@ typedef struct DeintVAAPIContext {
> int queue_count;
> AVFrame *frame_queue[MAX_REFERENCES];
> int extra_delay_for_timestamps;
> +
> + int eof;
> + int prev_pts;
> } DeintVAAPIContext;
>
> static const char *deint_vaapi_mode_name(int mode)
> @@ -190,9 +193,11 @@ static int deint_vaapi_filter_frame(AVFilterLink *inlink,
> AVFrame *input_frame)
> void *filter_params_addr = NULL;
> int err, i, field, current_frame_index;
>
> - av_log(avctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
> - av_get_pix_fmt_name(input_frame->format),
> - input_frame->width, input_frame->height, input_frame->pts);
> + // NULL frame is used to flush the queue in field mode
> + if (input_frame)
> + av_log(avctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
> + av_get_pix_fmt_name(input_frame->format),
> + input_frame->width, input_frame->height, input_frame->pts);
>
> if (ctx->queue_count < ctx->queue_depth) {
> ctx->frame_queue[ctx->queue_count++] = input_frame;
> @@ -210,6 +215,9 @@ static int deint_vaapi_filter_frame(AVFilterLink *inlink,
> AVFrame *input_frame)
> current_frame_index = ctx->pipeline_caps.num_forward_references;
>
> input_frame = ctx->frame_queue[current_frame_index];
> + if (!input_frame)
> + return 0;
> +
> input_surface = (VASurfaceID)(uintptr_t)input_frame->data[3];
> for (i = 0; i < ctx->pipeline_caps.num_forward_references; i++)
> forward_references[i] = (VASurfaceID)(uintptr_t)
> @@ -291,6 +299,8 @@ static int deint_vaapi_filter_frame(AVFilterLink *inlink,
> AVFrame *input_frame)
> if (ctx->field_rate == 2) {
> if (field == 0)
> output_frame->pts = 2 * input_frame->pts;
> + else if (ctx->eof)
> + output_frame->pts = 3 * input_frame->pts - ctx->prev_pts;
> else
> output_frame->pts = input_frame->pts +
> ctx->frame_queue[current_frame_index + 1]->pts;
> @@ -306,6 +316,8 @@ static int deint_vaapi_filter_frame(AVFilterLink *inlink,
> AVFrame *input_frame)
> break;
> }
>
> + ctx->prev_pts = input_frame->pts;
> +
> return err;
>
> fail:
> @@ -315,6 +327,25 @@ fail:
> return err;
> }
>
> +static int deint_vaapi_request_frame(AVFilterLink *link)
> +{
> + AVFilterContext *avctx = link->src;
> + DeintVAAPIContext *ctx = avctx->priv;
> + int ret;
> +
> + if (ctx->eof)
> + return AVERROR_EOF;
> +
> + ret = ff_request_frame(link->src->inputs[0]);
> + if (ret == AVERROR_EOF && ctx->extra_delay_for_timestamps) {
> + ctx->eof = 1;
> + deint_vaapi_filter_frame(link->src->inputs[0], NULL);
> + } else if (ret < 0)
> + return ret;
> +
> + return 0;
> +}
> +
> static av_cold int deint_vaapi_init(AVFilterContext *avctx)
> {
> VAAPIVPPContext *vpp_ctx = avctx->priv;
> @@ -376,9 +407,10 @@ static const AVFilterPad deint_vaapi_inputs[] = {
>
> static const AVFilterPad deint_vaapi_outputs[] = {
> {
> - .name = "default",
> - .type = AVMEDIA_TYPE_VIDEO,
> - .config_props = &deint_vaapi_config_output,
> + .name = "default",
> + .type = AVMEDIA_TYPE_VIDEO,
> + .request_frame = &deint_vaapi_request_frame,
> + .config_props = &deint_vaapi_config_output,
> },
> { NULL }
> };
> --
> 2.7.4
>
> _______________________________________________
> 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".
next parent reply other threads:[~2021-12-29 3:45 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1568794798-6615-1-git-send-email-linjie.fu@intel.com>
2021-12-29 3:45 ` Xiang, Haihao [this message]
2022-01-09 18:32 ` Mark Thompson
2022-01-10 6:58 ` Xiang, Haihao
2022-01-12 3:03 ` Xiang, Haihao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BN9PR11MB5515A40D0D12773204A0909A9E449@BN9PR11MB5515.namprd11.prod.outlook.com \
--to=haihao.xiang-at-intel.com@ffmpeg.org \
--cc=ffmpeg-devel@ffmpeg.org \
--cc=linjie.fu@intel.com \
--cc=sw@jkqxz.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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