From patchwork Sat Jan 20 17:33:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ray Tiley X-Patchwork-Id: 7369 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp974936jak; Sat, 20 Jan 2018 09:39:16 -0800 (PST) X-Google-Smtp-Source: AH8x226BgGe9pV/kLj4wHYZneFHZp0s3j50166CY8s8OuZkhaJNoTiSbhQ1OzxYEqIPwdd9yR675 X-Received: by 10.223.136.110 with SMTP id e43mr1853437wre.98.1516469956214; Sat, 20 Jan 2018 09:39:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516469956; cv=none; d=google.com; s=arc-20160816; b=hWsSB7JsFVuEUSfi3wS9XYP3VdhHvXGWiVWH+5Fg7dR8Hskyzud9zmKFGcR0cQTLC0 ua9TYx6U8ZjQOk3WVoRL25aqFgl48zxStL+L2UeUPLnpHluh9+2KI81XvOldne1Or7ck 8/D7RgmAifo2eTiXbUmM+iBqaAAiQetbh6zWFQOVdiJ2+6tkMptfhQPiLVzeLJ0cfY9N 6jafVgvrd17sDHjOL0mZFp23ZbmIwdS8Xd9tdPBPrZ0VByrnRvDvmbYHGM1prmHsFFNq wI12GE7uPTKkftonjVWVFcLw8SHDS1eduIkLH1Nj3pUVvR9dLsfTOoaN0yV66rBJ+K+v FV6Q== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=zWyFo9J3+G8V05HLc1Dl/qtu9f9I2Sf5AR+4HKzyFEE=; b=x62mVZs4vSkrwpFCUVcafSJzn6Wz3TLWLkXwRDzFeF3PweGznOx2x2Ex/pjIndvCGW n88jfsvMtuvLsasxSvZ0b1JfBOG+8i2fGMPRBvqNNrcp8zLI2lyF0P1QCfpDheRq9gMV Bv+ahmxb0uzs7YeXcq/sFgSA0XYz8mFId7TupCEV+vUid1vztK5CwqhEoEYijP2T8Wm1 ZGip4zinqqlQi5CuWQRvIkwYO+m/p3/cPj+di5OKgOJMwfDG6o/zDjT2PtUUrg7MElm1 LGzr83oppWyagvk36SgDpzqfiNFZNm62OKdmdGgS9uiczYFbdaOLXjahGf/9BMUNCTrZ BA5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=l5B5sfsR; 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 w10si9152752wrg.95.2018.01.20.09.39.15; Sat, 20 Jan 2018 09:39:16 -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=l5B5sfsR; 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 12EF668A0C3; Sat, 20 Jan 2018 19:39:13 +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 CDAD8689C44 for ; Sat, 20 Jan 2018 19:39:06 +0200 (EET) Received: by mail-qt0-f194.google.com with SMTP id d54so11436290qtd.4 for ; Sat, 20 Jan 2018 09:39:08 -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; bh=1F2a/JLXPn4Q2qqHwSEL6zJXQZNDi6+r7418dT6SeVg=; b=l5B5sfsRzaBnIlgHXsGOC3p7XFnyfYpdW11ZYuhW5cnMS6Ng+PlIPAACKMETe8RxCM 9CqpXAv7smx1LcZvaMGIkmQzeugAV7746Yjgw/geF9HIOj7QviI12TBtx+kpM4O8t/k3 K3zbvnua8atFR0XmFCeSaemfri/9Ap/qznXU2q8SdOumqyykPZwbNbXa30hAOD9nfr5N 3D9yWljro/EH/8Hxc3ji3tdOXMz5SWRUyGC4agvimwZeurc6AJGEfuU0JqN/edf6xKSl 8CItrp3+nIm6pYXonWwabNWsw4IsBC3LTzdl+GexcZz0M8Hnj0eXl5ihKAlh84+U5w0i U7WA== 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; bh=1F2a/JLXPn4Q2qqHwSEL6zJXQZNDi6+r7418dT6SeVg=; b=FrxGJCk11KD+YCwNRIr3vLZON4xzJpPlTviyggbltXwWvQZzSPqm4HdhQ6cMq+8U3c 0qIe41suybMekbUm00e9U82KNXS+mbkoHdztHg9hgR+ypNFr2jhxcNemf+g4RKxA3nrC EtqFWnADJN97VynqIV4vNJk+30vDhg1aPSVY3V0LfjgRATy3/9Hfa3L+x92R/JYgRGRr x1SSX8SHn2TkxHxADeVmOhk28nAKwASEWK07hdaPhxSoaU4i05l6v65KczzFzyTHhmtx sPZYJB6P8DgI+OOulrnH5Ce6bnGYXI0knUs+y3lYFQ52I4LJGfoah1QhLRIN1ymCeZll obmg== X-Gm-Message-State: AKwxytd3Ej1grw+G2MvssrrxyFk8TgTkv3xA3IPXhmEv22N+VJdSNKIO 2YprAbUqnJKIr4uvvs5SETh3vwMk X-Received: by 10.200.81.199 with SMTP id d7mr3368523qtn.211.1516469637011; Sat, 20 Jan 2018 09:33:57 -0800 (PST) Received: from ubuntu.maine.rr.com ([2604:6000:8987:c400::f]) by smtp.gmail.com with ESMTPSA id m44sm8272143qtc.9.2018.01.20.09.33.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 20 Jan 2018 09:33:56 -0800 (PST) From: Ray Tiley To: ffmpeg-devel@ffmpeg.org Date: Sat, 20 Jan 2018 09:33:29 -0800 Message-Id: <1516469609-17820-1-git-send-email-raytiley@gmail.com> X-Mailer: git-send-email 2.7.4 Subject: [FFmpeg-devel] [PATCH] avdevice/decklink_dec: Extract 1080i and 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 the vertical blanking lines extracted for NTSC and 1080i resolutions that in personal testing were required to extract closed caption data from the decklink video frames. Additionally NTSC resolutions have 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 and 1080i closed captions to pass the caption data to the x264 encoder. Signed-off-by: Ray Tiley --- libavdevice/decklink_dec.cpp | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index 94dae26..bceced5 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -67,8 +67,7 @@ typedef struct VANCLineNumber { * another source during switching*/ static VANCLineNumber vanc_line_numbers[] = { /* SD Modes */ - - {bmdModeNTSC, 11, 19, 274, 282}, + {bmdModeNTSC, 4, 21, 24, 284}, {bmdModeNTSC2398, 11, 19, 274, 282}, {bmdModePAL, 7, 22, 320, 335}, {bmdModeNTSCp, 11, -1, -1, 39}, @@ -82,7 +81,7 @@ static VANCLineNumber vanc_line_numbers[] = { {bmdModeHD1080p2997, 8, -1, -1, 42}, {bmdModeHD1080p30, 8, -1, -1, 42}, {bmdModeHD1080i50, 8, 20, 570, 585}, - {bmdModeHD1080i5994, 8, 20, 570, 585}, + {bmdModeHD1080i5994, 6, 30, 568, 595}, {bmdModeHD1080i6000, 8, 20, 570, 585}, {bmdModeHD1080p50, 8, -1, -1, 42}, {bmdModeHD1080p5994, 8, -1, -1, 42}, @@ -92,7 +91,7 @@ static VANCLineNumber vanc_line_numbers[] = { {bmdModeHD720p50, 8, -1, -1, 26}, {bmdModeHD720p5994, 8, -1, -1, 26}, - {bmdModeHD720p60, 8, -1, -1, 26}, + {bmdModeHD720p60, 7, -1, -1, 26}, /* For all other modes, for which we don't support VANC */ {bmdModeUnknown, 0, -1, -1, -1} @@ -149,6 +148,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; @@ -741,7 +764,11 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( 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()); + if (ctx->bmd_mode == bmdModeNTSC) { + unpack_v210(luma_vanc, buf, videoFrame->GetWidth()); + } else { + extract_luma_from_v210(luma_vanc, buf, videoFrame->GetWidth()); + } txt_buf = get_metadata(avctx, luma_vanc, videoFrame->GetWidth(), txt_buf, sizeof(txt_buf0) - (txt_buf - txt_buf0), &pkt); }