From: Marton Balint <cus@passwd.hu> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Subject: Re: [FFmpeg-devel] [PATCH v2 1/3] decklink: Don't take for granted that first frame to decklink output will be PTS 0 Date: Wed, 8 Mar 2023 23:51:39 +0100 (CET) Message-ID: <c51c52e7-b7e6-04b-b47-6d549674c8bb@passwd.hu> (raw) In-Reply-To: <20230303210815.23692-1-dheitmueller@ltnglobal.com> On Fri, 3 Mar 2023, Devin Heitmueller wrote: > The existing code assumed that the first frame received by the decklink > output would always be PTS zero. However if running in other timing > modes than the default of CBR, items such as frame dropping at the > beginning may result in starting at a non-zero PTS. > > For example, in our setup because we discard probing data and run > with "-vsync 2" the first video frame scheduled to the decklink > output will have a PTS around 170. Scheduling frames too far into > the future will either fail or cause a backlog of frames scheduled > far enough into the future that the entire pipeline will stall. > > Issue can be reproduced with the following command-line: > > ./ffmpeg -copyts -i foo.ts -f decklink -vcodec v210 -ac 2 'DeckLink Duo (4)' > > Keep track of the PTS of the first frame received, so that when > we enable start playback we can provide that value to the decklink > driver. > > Thanks to Marton Balint for review and suggestion to use > AV_NOPTS_VALUE rather than zero for the initial value. > > Signed-off-by: Devin Heitmueller <dheitmueller@ltnglobal.com> > --- > libavdevice/decklink_common.h | 1 + > libavdevice/decklink_enc.cpp | 8 ++++++-- > 2 files changed, 7 insertions(+), 2 deletions(-) Thanks, will apply the series. Regards, Marton > > diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h > index 79d6ac5b38..088e165ee7 100644 > --- a/libavdevice/decklink_common.h > +++ b/libavdevice/decklink_common.h > @@ -118,6 +118,7 @@ struct decklink_ctx { > > /* Status */ > int playback_started; > + int64_t first_pts; > int64_t last_pts; > unsigned long frameCount; > unsigned int dropped; > diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp > index fb686b9032..5a435ddc78 100644 > --- a/libavdevice/decklink_enc.cpp > +++ b/libavdevice/decklink_enc.cpp > @@ -486,6 +486,9 @@ static int decklink_write_video_packet(AVFormatContext *avctx, AVPacket *pkt) > ctx->frames_buffer_available_spots--; > pthread_mutex_unlock(&ctx->mutex); > > + if (ctx->first_pts == AV_NOPTS_VALUE) > + ctx->first_pts = pkt->pts; > + > /* Schedule frame for playback. */ > hr = ctx->dlo->ScheduleVideoFrame((class IDeckLinkVideoFrame *) frame, > pkt->pts * ctx->bmd_tb_num, > @@ -505,14 +508,14 @@ static int decklink_write_video_packet(AVFormatContext *avctx, AVPacket *pkt) > " Video may misbehave!\n"); > > /* Preroll video frames. */ > - if (!ctx->playback_started && pkt->pts > ctx->frames_preroll) { > + if (!ctx->playback_started && pkt->pts > (ctx->first_pts + ctx->frames_preroll)) { > av_log(avctx, AV_LOG_DEBUG, "Ending audio preroll.\n"); > if (ctx->audio && ctx->dlo->EndAudioPreroll() != S_OK) { > av_log(avctx, AV_LOG_ERROR, "Could not end audio preroll!\n"); > return AVERROR(EIO); > } > av_log(avctx, AV_LOG_DEBUG, "Starting scheduled playback.\n"); > - if (ctx->dlo->StartScheduledPlayback(0, ctx->bmd_tb_den, 1.0) != S_OK) { > + if (ctx->dlo->StartScheduledPlayback(ctx->first_pts * ctx->bmd_tb_num, ctx->bmd_tb_den, 1.0) != S_OK) { > av_log(avctx, AV_LOG_ERROR, "Could not start scheduled playback!\n"); > return AVERROR(EIO); > } > @@ -559,6 +562,7 @@ av_cold int ff_decklink_write_header(AVFormatContext *avctx) > ctx->list_formats = cctx->list_formats; > ctx->preroll = cctx->preroll; > ctx->duplex_mode = cctx->duplex_mode; > + ctx->first_pts = AV_NOPTS_VALUE; > if (cctx->link > 0 && (unsigned int)cctx->link < FF_ARRAY_ELEMS(decklink_link_conf_map)) > ctx->link = decklink_link_conf_map[cctx->link]; > cctx->ctx = ctx; > -- > 2.35.1.655.ga68dfadae5 > > _______________________________________________ > 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".
prev parent reply other threads:[~2023-03-08 22:51 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-03-03 21:08 Devin Heitmueller 2023-03-03 21:08 ` [FFmpeg-devel] [PATCH v2 2/3] decklink: Fix setting of last_pts to only be set for video Devin Heitmueller 2023-03-03 21:08 ` [FFmpeg-devel] [PATCH v2 3/3] decklink: Fix unused variable compiler warnings Devin Heitmueller 2023-03-08 22:51 ` Marton Balint [this message]
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=c51c52e7-b7e6-04b-b47-6d549674c8bb@passwd.hu \ --to=cus@passwd.hu \ --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