From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 0846048FE8 for ; Wed, 31 Jan 2024 02:42:57 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DB77F68CE1C; Wed, 31 Jan 2024 04:42:54 +0200 (EET) Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 569C968CD88 for ; Wed, 31 Jan 2024 04:42:48 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id F2EFFE9E71 for ; Wed, 31 Jan 2024 03:42:47 +0100 (CET) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 36n1kwp7eMJ8 for ; Wed, 31 Jan 2024 03:42:46 +0100 (CET) Received: from iq (iq [217.27.212.140]) by iq.passwd.hu (Postfix) with ESMTPS id 340B4E960E for ; Wed, 31 Jan 2024 03:42:46 +0100 (CET) Date: Wed, 31 Jan 2024 03:42:46 +0100 (CET) From: Marton Balint To: FFmpeg development discussions and patches In-Reply-To: <20240131000541.GP6420@pb2> Message-ID: <32ff862c-93f6-7c61-7168-801868f2f41d@passwd.hu> References: <20240128030136.5585-1-cus@passwd.hu> <20240128030136.5585-3-cus@passwd.hu> <20240131000541.GP6420@pb2> MIME-Version: 1.0 Subject: Re: [FFmpeg-devel] [PATCH 3/3] avfilter/yadif_common: fix timestamps with very small timebases X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On Wed, 31 Jan 2024, Michael Niedermayer wrote: > On Sun, Jan 28, 2024 at 04:01:36AM +0100, Marton Balint wrote: >> Yadif filter assumed that the output timebase is always half of the input >> timebase. This is not true if halving the input time base is not representable >> as an AVRational causing the output timestamps to be invalidly scaled in such a >> case. >> >> So let's use av_reduce instead of av_mul_q when calculating the output time >> base and if the conversion is inexact then let's fall back to the original >> timebase which probably makes more parctical sense than using x/INT_MAX. >> >> Fixes invalidly scaled pts_time values in this command line: >> ffmpeg -f lavfi -i testsrc -vf settb=tb=1/2000000000,yadif,showinfo -f null none >> >> Signed-off-by: Marton Balint >> --- >> libavfilter/yadif.h | 2 ++ >> libavfilter/yadif_common.c | 20 ++++++++++++++------ >> 2 files changed, 16 insertions(+), 6 deletions(-) >> >> diff --git a/libavfilter/yadif.h b/libavfilter/yadif.h >> index 2c4fed62d2..c144568242 100644 >> --- a/libavfilter/yadif.h >> +++ b/libavfilter/yadif.h >> @@ -86,6 +86,8 @@ typedef struct YADIFContext { >> * the first field. >> */ >> int current_field; ///< YADIFCurrentField >> + >> + int pts_divisor; >> } YADIFContext; >> >> void ff_yadif_init_x86(YADIFContext *yadif); >> diff --git a/libavfilter/yadif_common.c b/libavfilter/yadif_common.c >> index 933372529e..90a5cffc2d 100644 >> --- a/libavfilter/yadif_common.c >> +++ b/libavfilter/yadif_common.c >> @@ -61,7 +61,7 @@ FF_ENABLE_DEPRECATION_WARNINGS >> int64_t next_pts = yadif->next->pts; >> >> if (next_pts != AV_NOPTS_VALUE && cur_pts != AV_NOPTS_VALUE) { >> - yadif->out->pts = cur_pts + next_pts; >> + yadif->out->pts = (cur_pts + next_pts) / yadif->pts_divisor; >> } else { >> yadif->out->pts = AV_NOPTS_VALUE; >> } >> @@ -150,8 +150,8 @@ int ff_yadif_filter_frame(AVFilterLink *link, AVFrame *frame) >> ff_ccfifo_inject(&yadif->cc_fifo, yadif->out); >> av_frame_free(&yadif->prev); >> if (yadif->out->pts != AV_NOPTS_VALUE) >> - yadif->out->pts *= 2; >> - yadif->out->duration *= 2; >> + yadif->out->pts *= 2 / yadif->pts_divisor; >> + yadif->out->duration *= 2 / yadif->pts_divisor; >> return ff_filter_frame(ctx->outputs[0], yadif->out); >> } >> >> @@ -168,9 +168,9 @@ FF_ENABLE_DEPRECATION_WARNINGS >> yadif->out->flags &= ~AV_FRAME_FLAG_INTERLACED; >> >> if (yadif->out->pts != AV_NOPTS_VALUE) >> - yadif->out->pts *= 2; >> + yadif->out->pts *= 2 / yadif->pts_divisor; >> if (!(yadif->mode & 1)) >> - yadif->out->duration *= 2; >> + yadif->out->duration *= 2 / yadif->pts_divisor; > > you can use >> instead of division for all above Even for the first case? Because the right shift would be implementation defined for negative timestamps. Thanks, Marton _______________________________________________ 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".