From patchwork Tue Feb 6 01:35:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ray Tiley X-Patchwork-Id: 7515 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.150.1 with SMTP id c1csp3502770jai; Mon, 5 Feb 2018 17:35:51 -0800 (PST) X-Google-Smtp-Source: AH8x226TBkQDjdnxv5KrK1UJeAgMZtplU7vQY4DbeUE3+tV8vGuaagVIHuIFsXJDqA4HJMo0eEli X-Received: by 10.28.67.194 with SMTP id q185mr421664wma.76.1517880951645; Mon, 05 Feb 2018 17:35:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517880951; cv=none; d=google.com; s=arc-20160816; b=d2lCSVLRhD+YteDmiv2deZ1R8VGsylMk1bd9y2YJCHewL83Cr5qFWLOnAtGtixGj3n MMI+7qGR9PxmR15WqUldLrPE1c0CchIQ57rbEL7Hd4o1msFxsHwzpmqyHCDGT4xScoIz bX/OPMSyNhGNpGCOwZmdDNktjfowHnv55D3nWLqxzM1Zm/fj0vyXd9vu9oJkudMRvfO+ UWXXjBIKDzKSqls5EKwNRJntoRR7HKZj2VMs4hmbFmeTzgXimWcKe5v7Cd2oD8Qn5Bma h+kzZG6jByoGJM34433o3CgFMzMPo/L+ASlgUMd1RNCsxkBHw286E1DW57fxU0BFbhlC jKbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=u29TZAhq7hmkpgfnGlzb85gao5a+doMR6eTop3lcheA=; b=SCtskKI+ifJmJS/5ven8KxfAxuYFZf/Y5tS+c4yKIqLqJpmCkLA9L+L22uX+Vn3L0E jrDXHWdYYwQOfZwfbUkXpb5Yv8Hivfv4D38CEjiQ/1kFmW0jx6FLCiGyv2xpOHugWE44 EOLE+3PIxix+8OHO+HfaygWr+ds0GxL5+jrzGxJ2/IbOliFBengbV1uv7Mh8VJckLCgu 9T4ygIxvYceh5L6a+SOd6msTL4f7cKfbkJ/cpUCxX76c7pyOcyEZ4zlZVzn198AlIQ1o HsGBNTtDWHPboQtU/6vgkaTbEQ7iFOinme/+q9mFyXc5yfkfpMUMKk8UYXFA5E5CgyGC rxsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=A0CUUKRL; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x10si635492wmf.72.2018.02.05.17.35.50; Mon, 05 Feb 2018 17:35:51 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=A0CUUKRL; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 28778689E22; Tue, 6 Feb 2018 03:35:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 88B65689D80 for ; Tue, 6 Feb 2018 03:35:34 +0200 (EET) Received: by mail-qt0-f194.google.com with SMTP id x27so348853qtm.12 for ; Mon, 05 Feb 2018 17:35:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gb/YiZ+8Jrfj1IqhOyi3vhjRxKqvQ80BqReyMgQ6FGU=; b=A0CUUKRLyRkaY+3aJFeE/Gz7BSw7NsQM3eUkzj+t/xz/Gd7ObDD8pu59qZMrg5JVzU q1Odk/DxJ693XPMFAyQ0y4PQITIjh9b1szq+ZloSuPOybj/wrI4g8Uz/UrztTOjL9CUg CwyJ5Yg9fG0oDH+wBbHr50YXQFR0mkFf731UR/FJOci60v/cP07p5KqxAWdT/fLdCDyF dxHaRw2Piz6yC5Tu/yW/MtdEeFpO/bDeQ3MXedZYSPN5sYDmkRv6BU1/W1KMkLNUo42l 9LK0SJPFzv52f7dgULNv7Qpp9PBxNNj1zahzUkDp/SbaZfdDnRmeJk0kgDDpoS47kNJn Fl7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=gb/YiZ+8Jrfj1IqhOyi3vhjRxKqvQ80BqReyMgQ6FGU=; b=KvfIu97Ccq7z0jeqiqomd0VArB3HMKed7TgM4i4ESSSj+ZY+ZoPzr+AILn1L/XDdi2 Mo4QsVZDOdOGVjr57oRQrvn23fADDBgvKMoCwi0ie+Hlv9pimZFmWAV68o/cS2/GjdJs Ts0TbwOfn6dP8BTD+wJ+yJ4Vn4NzFvidwRVC1L1NrVHDZ8N8EweEqVQxRejRcbgz7kRF ZxKb5NWM1YWYXvec/AgbdKJcvhCRz3qmsmv/gS3lHj9Zwr3Xw0FOhQecQW90ipspkd48 J67m5p3lCK0ON5/pQty/kEr8OkrG6/ea60tvGPk8soSsuC6FK+/HNgo7/qMbhRN2yfWK 1Utg== X-Gm-Message-State: APf1xPD97mzhGYOMdNKF4dF4PSwkita1gFEc9y7tC6jiWLzCSXij0Dmo YlGLkFs1OHnYj2fIIm01EXVmitn+ X-Received: by 10.200.58.39 with SMTP id w36mr1251537qte.76.1517880941146; Mon, 05 Feb 2018 17:35:41 -0800 (PST) Received: from ubuntu.maine.rr.com (cpe-45-46-43-229.maine.res.rr.com. [45.46.43.229]) by smtp.gmail.com with ESMTPSA id x1sm6635276qkd.77.2018.02.05.17.35.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 05 Feb 2018 17:35:40 -0800 (PST) From: Ray Tiley To: ffmpeg-devel@ffmpeg.org Date: Mon, 5 Feb 2018 17:35:18 -0800 Message-Id: <1517880918-31224-1-git-send-email-raytiley@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: Subject: [FFmpeg-devel] [PATCH] avdevice/decklink_dec: Extract NTSC VANC X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 Cc: Ray Tiley MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This changes how NTSC VANC is extracted from the buffer. In NTSC the vanc data interleved between the uyvy and not just the luma as in high definition resolutions. In my testing this allows a decklink card encoding valid NTSC closed captions to pass the caption data to the x264 encoder. Updated with rewviews from Devon Heitmueller and Marton Balint. Signed-off-by: Ray Tiley --- libavdevice/decklink_dec.cpp | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index 94dae26..c3683bb 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -149,6 +149,30 @@ static void extract_luma_from_v210(uint16_t *dst, const uint8_t *src, int width) } } +static void unpack_v210(uint16_t *dst, const uint8_t *src, int width) +{ + int i; + for (i = 0; i < width / 6; i++) { + *dst++ = src[0] + ((src[1] & 3) << 8); + *dst++ = (src[1] >> 2) + ((src[2] & 15) << 6); + *dst++ = (src[2] >> 4) + ((src[3] & 63) << 4); + + *dst++ = src[4] + ((src[5] & 3) << 8); + *dst++ = (src[5] >> 2) + ((src[6] & 15) << 6); + *dst++ = (src[6] >> 4) + ((src[7] & 63) << 4); + + *dst++ = src[8] + ((src[9] & 3) << 8); + *dst++ = (src[9] >> 2) + ((src[10] & 15) << 6); + *dst++ = (src[10] >> 4) + ((src[11] & 63) << 4); + + *dst++ = src[12] + ((src[13] & 3) << 8); + *dst++ = (src[13] >> 2) + ((src[14] & 15) << 6); + *dst++ = (src[14] >> 4) + ((src[15] & 63) << 4); + + src += 16; + } +} + static uint8_t calc_parity_and_line_offset(int line) { uint8_t ret = (line < 313) << 5; @@ -740,9 +764,16 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( for (i = vanc_line_numbers[idx].vanc_start; i <= vanc_line_numbers[idx].vanc_end; i++) { uint8_t *buf; if (vanc->GetBufferForVerticalBlankingLine(i, (void**)&buf) == S_OK) { - uint16_t luma_vanc[MAX_WIDTH_VANC]; - extract_luma_from_v210(luma_vanc, buf, videoFrame->GetWidth()); - txt_buf = get_metadata(avctx, luma_vanc, videoFrame->GetWidth(), + uint16_t vanc[MAX_WIDTH_VANC]; + size_t vanc_size = videoFrame->GetWidth(); + if (ctx->bmd_mode == bmdModeNTSC && + videoFrame->GetWidth() * 2 <= MAX_WIDTH_VANC) { + vanc_size = vanc_size * 2; + unpack_v210(vanc, buf, videoFrame->GetWidth()); + } else { + extract_luma_from_v210(vanc, buf, videoFrame->GetWidth()); + } + txt_buf = get_metadata(avctx, vanc, vanc_size, txt_buf, sizeof(txt_buf0) - (txt_buf - txt_buf0), &pkt); } if (i == vanc_line_numbers[idx].field0_vanc_end)