From: Dennis Mungai <dmngaie@gmail.com> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Cc: Devin Heitmueller <dheitmueller@ltnglobal.com> Subject: Re: [FFmpeg-devel] [RFC PATCH 3/5] yadif: Properly preserve CEA-708 closed captions Date: Sat, 18 Mar 2023 18:48:06 +0300 Message-ID: <CAKKYfmHdjn5ZCXCTzssHScs435Ab5_SYikD7guAwGngApSjz2g@mail.gmail.com> (raw) In-Reply-To: <20230317200941.3936-4-dheitmueller@ltnglobal.com> On Fri, 17 Mar 2023, 23:11 Devin Heitmueller, < devin.heitmueller@ltnglobal.com> wrote: > Various deinterlacing modes have the effect of doubling the > framerate, and we need to ensure that the caption data isn't > duplicated (or else you get double captions on-screen). > > Use the new ccfifo mechanism for yadif (and yadif_cuda and bwdif > since they use the same yadif core) so that CEA-708 data is > properly preserved through this filter. > > Signed-off-by: Devin Heitmueller <dheitmueller@ltnglobal.com> > --- > libavfilter/vf_bwdif.c | 7 +++++++ > libavfilter/vf_yadif.c | 6 ++++++ > libavfilter/vf_yadif_cuda.c | 8 ++++++++ > libavfilter/yadif.h | 2 ++ > libavfilter/yadif_common.c | 5 +++++ > 5 files changed, 28 insertions(+) > > diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c > index 65c617ebb3..de937d83cf 100644 > --- a/libavfilter/vf_bwdif.c > +++ b/libavfilter/vf_bwdif.c > @@ -297,6 +297,7 @@ static av_cold void uninit(AVFilterContext *ctx) > av_frame_free(&yadif->prev); > av_frame_free(&yadif->cur ); > av_frame_free(&yadif->next); > + av_ccfifo_freep(&yadif->cc_fifo); > } > > static const enum AVPixelFormat pix_fmts[] = { > @@ -332,6 +333,12 @@ static int config_props(AVFilterLink *link) > > if(yadif->mode&1) > link->frame_rate = av_mul_q(link->src->inputs[0]->frame_rate, > (AVRational){2,1}); > + else > + link->frame_rate = ctx->inputs[0]->frame_rate; > + > + if (!(yadif->cc_fifo = av_ccfifo_alloc(&link->frame_rate, ctx))) > + av_log(ctx, AV_LOG_VERBOSE, "Failure to setup CC FIFO queue. > Captions will be passed through\n"); > + > > if (link->w < 3 || link->h < 4) { > av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or 4 > lines is not supported\n"); > diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c > index 1be02de1a9..b51d21f6ff 100644 > --- a/libavfilter/vf_yadif.c > +++ b/libavfilter/vf_yadif.c > @@ -261,6 +261,7 @@ static av_cold void uninit(AVFilterContext *ctx) > av_frame_free(&yadif->prev); > av_frame_free(&yadif->cur ); > av_frame_free(&yadif->next); > + av_ccfifo_freep(&yadif->cc_fifo); > } > > static const enum AVPixelFormat pix_fmts[] = { > @@ -293,6 +294,11 @@ static int config_output(AVFilterLink *outlink) > if(s->mode & 1) > outlink->frame_rate = av_mul_q(ctx->inputs[0]->frame_rate, > (AVRational){2, 1}); > + else > + outlink->frame_rate = ctx->inputs[0]->frame_rate; > + > + if (!(s->cc_fifo = av_ccfifo_alloc(&outlink->frame_rate, ctx))) > + av_log(ctx, AV_LOG_VERBOSE, "Failure to setup CC FIFO queue. > Captions will be passed through\n"); > > if (outlink->w < 3 || outlink->h < 3) { > av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or lines > is not supported\n"); > diff --git a/libavfilter/vf_yadif_cuda.c b/libavfilter/vf_yadif_cuda.c > index 685b8a2035..d96ec391a0 100644 > --- a/libavfilter/vf_yadif_cuda.c > +++ b/libavfilter/vf_yadif_cuda.c > @@ -206,6 +206,9 @@ static av_cold void deint_cuda_uninit(AVFilterContext > *ctx) > av_frame_free(&y->cur); > av_frame_free(&y->next); > > + if (yadif->cc_fifo) > + av_cc_fifo_free(yadif->cc_fifo); > + > av_buffer_unref(&s->device_ref); > s->hwctx = NULL; > av_buffer_unref(&s->input_frames_ref); > @@ -291,6 +294,11 @@ static int config_output(AVFilterLink *link) > if(y->mode & 1) > link->frame_rate = av_mul_q(ctx->inputs[0]->frame_rate, > (AVRational){2, 1}); > + else > + outlink->frame_rate = ctx->inputs[0]->frame_rate; > + > + if (!(s->cc_fifo = av_cc_fifo_alloc(&outlink->frame_rate, ctx))) > + av_log(ctx, AV_LOG_VERBOSE, "Failure to setup CC FIFO queue. > Captions will be passed through\n"); > > if (link->w < 3 || link->h < 3) { > av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or lines > is not supported\n"); > diff --git a/libavfilter/yadif.h b/libavfilter/yadif.h > index c928911b35..ccd4304860 100644 > --- a/libavfilter/yadif.h > +++ b/libavfilter/yadif.h > @@ -21,6 +21,7 @@ > > #include "libavutil/opt.h" > #include "libavutil/pixdesc.h" > +#include "libavutil/ccfifo.h" > #include "avfilter.h" > > enum YADIFMode { > @@ -76,6 +77,7 @@ typedef struct YADIFContext { > int eof; > uint8_t *temp_line; > int temp_line_size; > + AVCCFifo *cc_fifo; > > /* > * An algorithm that treats first and/or last fields in a sequence > diff --git a/libavfilter/yadif_common.c b/libavfilter/yadif_common.c > index a10cf7a17f..f95b8c10d3 100644 > --- a/libavfilter/yadif_common.c > +++ b/libavfilter/yadif_common.c > @@ -43,6 +43,7 @@ static int return_frame(AVFilterContext *ctx, int > is_second) > return AVERROR(ENOMEM); > > av_frame_copy_props(yadif->out, yadif->cur); > + av_ccfifo_inject(yadif->cc_fifo, yadif->out); > yadif->out->interlaced_frame = 0; > if (yadif->current_field == YADIF_FIELD_BACK_END) > yadif->current_field = YADIF_FIELD_END; > @@ -96,6 +97,8 @@ int ff_yadif_filter_frame(AVFilterLink *link, AVFrame > *frame) > > av_assert0(frame); > > + av_ccfifo_extract(yadif->cc_fifo, frame); > + > if (yadif->frame_pending) > return_frame(ctx, 1); > > @@ -137,6 +140,7 @@ int ff_yadif_filter_frame(AVFilterLink *link, AVFrame > *frame) > if (!yadif->out) > return AVERROR(ENOMEM); > > + av_ccfifo_inject(yadif->cc_fifo, yadif->out); > av_frame_free(&yadif->prev); > if (yadif->out->pts != AV_NOPTS_VALUE) > yadif->out->pts *= 2; > @@ -148,6 +152,7 @@ int ff_yadif_filter_frame(AVFilterLink *link, AVFrame > *frame) > return AVERROR(ENOMEM); > > av_frame_copy_props(yadif->out, yadif->cur); > + av_ccfifo_inject(yadif->cc_fifo, yadif->out); > yadif->out->interlaced_frame = 0; > > if (yadif->out->pts != AV_NOPTS_VALUE) > -- > 2.35.1.655.ga68dfadae5 > Hello Devin, How would this be propagated (or replicated) in other deinterlacers, namely Intel's OneVPL based deinterlace_qsv, vpp_qsv and VAAPI's deinterlace_vaapi? > _______________________________________________ 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 prev parent reply other threads:[~2023-03-18 15:48 UTC|newest] Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-03-17 20:09 [FFmpeg-devel] [RFC PATCH 0/5] Properly handle CEA-708 caption data when transcoding Devin Heitmueller 2023-03-17 20:09 ` [FFmpeg-devel] [RFC PATCH 1/5] ccfifo: Properly handle CEA-708 captions through framerate conversion Devin Heitmueller 2023-03-17 20:09 ` [FFmpeg-devel] [RFC PATCH 2/5] vf_fps: properly preserve CEA-708 captions Devin Heitmueller 2023-03-17 20:09 ` [FFmpeg-devel] [RFC PATCH 3/5] yadif: Properly preserve CEA-708 closed captions Devin Heitmueller 2023-03-18 15:48 ` Dennis Mungai [this message] 2023-03-18 23:20 ` Devin Heitmueller 2023-03-17 20:09 ` [FFmpeg-devel] [RFC PATCH 4/5] tinterlace: " Devin Heitmueller 2023-03-18 17:12 ` Thomas Mundt 2023-03-18 23:22 ` Devin Heitmueller 2023-03-19 16:50 ` Thomas Mundt 2023-03-19 17:33 ` Devin Heitmueller 2023-03-17 20:09 ` [FFmpeg-devel] [RFC PATCH 5/5] vf_ccrepack: Add new filter to repack CEA-708 side data Devin Heitmueller 2023-03-17 23:23 ` [FFmpeg-devel] [RFC PATCH 0/5] Properly handle CEA-708 caption data when transcoding BUCCIANTINI Francesco - ADECCO 2023-03-18 23:16 ` Devin Heitmueller
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=CAKKYfmHdjn5ZCXCTzssHScs435Ab5_SYikD7guAwGngApSjz2g@mail.gmail.com \ --to=dmngaie@gmail.com \ --cc=dheitmueller@ltnglobal.com \ --cc=ffmpeg-devel@ffmpeg.org \ /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