History

avdevice/decklink_enc: don't take for granted that first frame to decklink output will be PTS 0

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.

Devin Heitmueller committed 3 years ago

Commit 8fd345f1 parent 6f1c0062 files · +7 −2Browse files

Unified · Split

2 files
  1. libavdevice/decklink_common.h +1 −0
  2. libavdevice/decklink_enc.cpp +6 −2
libavdevice/decklink_common.h+1−0
@@ -118,6 +118,7 @@ struct decklink_ctx { · 117 unmodified lines
118118
119119 /* Status */
120120 int playback_started;
121+ int64_t first_pts;
121122 int64_t last_pts;
122123 unsigned long frameCount;
123124 unsigned int dropped;
libavdevice/decklink_enc.cpp+6−2
@@ -486,6 +486,9 @@ static int decklink_write_video_packet(AVFormatContext *avctx, AVPacket *pkt) · 485 unmodified lines
486486 ctx->frames_buffer_available_spots--;
487487 pthread_mutex_unlock(&ctx->mutex);
488488
489+ if (ctx->first_pts == AV_NOPTS_VALUE)
490+ ctx->first_pts = pkt->pts;
491+
489492 /* Schedule frame for playback. */
490493 hr = ctx->dlo->ScheduleVideoFrame((class IDeckLinkVideoFrame *) frame,
491494 pkt->pts * ctx->bmd_tb_num,
@@ -505,14 +508,14 @@ static int decklink_write_video_packet(AVFormatContext *avctx, AVPacket *pkt) · 13 unmodified lines
505508 " Video may misbehave!\n");
506509
507510 /* Preroll video frames. */
508− if (!ctx->playback_started && pkt->pts > ctx->frames_preroll) {
511+ if (!ctx->playback_started && pkt->pts > (ctx->first_pts + ctx->frames_preroll)) {
509512 av_log(avctx, AV_LOG_DEBUG, "Ending audio preroll.\n");
510513 if (ctx->audio && ctx->dlo->EndAudioPreroll() != S_OK) {
511514 av_log(avctx, AV_LOG_ERROR, "Could not end audio preroll!\n");
512515 return AVERROR(EIO);
513516 }
514517 av_log(avctx, AV_LOG_DEBUG, "Starting scheduled playback.\n");
515− if (ctx->dlo->StartScheduledPlayback(0, ctx->bmd_tb_den, 1.0) != S_OK) {
518+ if (ctx->dlo->StartScheduledPlayback(ctx->first_pts * ctx->bmd_tb_num, ctx->bmd_tb_den, 1.0) != S_OK) {
516519 av_log(avctx, AV_LOG_ERROR, "Could not start scheduled playback!\n");
517520 return AVERROR(EIO);
518521 }
@@ -559,6 +562,7 @@ av_cold int ff_decklink_write_header(AVFormatContext *avctx) · 40 unmodified lines
559562 ctx->list_formats = cctx->list_formats;
560563 ctx->preroll = cctx->preroll;
561564 ctx->duplex_mode = cctx->duplex_mode;
565+ ctx->first_pts = AV_NOPTS_VALUE;
562566 if (cctx->link > 0 && (unsigned int)cctx->link < FF_ARRAY_ELEMS(decklink_link_conf_map))
563567 ctx->link = decklink_link_conf_map[cctx->link];
564568 cctx->ctx = ctx;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t