[FFmpeg-devel] [PATCH] avdevice/decklink_dec: Extract NTSC VANC

Marton Balint cus at passwd.hu
Mon Feb 5 20:13:50 EET 2018



On Mon, 5 Feb 2018, Ray Tiley wrote:

> On Sun, Jan 28, 2018 at 9:40 PM Ray Tiley <raytiley at gmail.com> wrote:
>
>> 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 <raytiley at gmail.com>
>> ---
>>  libavdevice/decklink_dec.cpp | 30 +++++++++++++++++++++++++++++-
>>  1 file changed, 29 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp
>> index 94dae26..c7811eb 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;
>> @@ -741,7 +765,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);
>>                          }
>> --
>> 2.7.4
>>
>>
>
> Anything else I need to do for this patch?

I thought you are working on an updated patch, or I just missed the new 
one? The email you replied to here definitely contains the old, without 
interleaved VANC autodetection or proper width for get_metadata.

Regards,
Marton


More information about the ffmpeg-devel mailing list