Commit c837cd3d authored by Ray Tiley's avatar Ray Tiley Committed by Marton Balint

avdevice/decklink_dec: extract NTSC VANC

This changes how NTSC VANC is extracted from the buffer. In NTSC the vanc data
is interleaved between luma and chroma, 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 reviews from Devin Heitmueller and Marton Balint.
Signed-off-by: 's avatarRay Tiley <raytiley@gmail.com>
Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
parent ce6ce595
...@@ -149,6 +149,17 @@ static void extract_luma_from_v210(uint16_t *dst, const uint8_t *src, int width) ...@@ -149,6 +149,17 @@ 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 * 2 / 3; i++) {
*dst++ = src[0] + ((src[1] & 3) << 8);
*dst++ = (src[1] >> 2) + ((src[2] & 15) << 6);
*dst++ = (src[2] >> 4) + ((src[3] & 63) << 4);
src += 4;
}
}
static uint8_t calc_parity_and_line_offset(int line) static uint8_t calc_parity_and_line_offset(int line)
{ {
uint8_t ret = (line < 313) << 5; uint8_t ret = (line < 313) << 5;
...@@ -752,9 +763,15 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( ...@@ -752,9 +763,15 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
for (i = vanc_line_numbers[idx].vanc_start; i <= vanc_line_numbers[idx].vanc_end; i++) { for (i = vanc_line_numbers[idx].vanc_start; i <= vanc_line_numbers[idx].vanc_end; i++) {
uint8_t *buf; uint8_t *buf;
if (vanc->GetBufferForVerticalBlankingLine(i, (void**)&buf) == S_OK) { if (vanc->GetBufferForVerticalBlankingLine(i, (void**)&buf) == S_OK) {
uint16_t luma_vanc[MAX_WIDTH_VANC]; uint16_t vanc[MAX_WIDTH_VANC];
extract_luma_from_v210(luma_vanc, buf, videoFrame->GetWidth()); size_t vanc_size = videoFrame->GetWidth();
txt_buf = get_metadata(avctx, luma_vanc, 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); txt_buf, sizeof(txt_buf0) - (txt_buf - txt_buf0), &pkt);
} }
if (i == vanc_line_numbers[idx].field0_vanc_end) if (i == vanc_line_numbers[idx].field0_vanc_end)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment