From: Dan Dennedy Date: Sat, 12 Nov 2011 20:06:12 +0000 (-0800) Subject: improve support for 480 line NTSC in decklink consumer X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=c83a24359f54055cf5c2c08bfe77b26bc6418d8c;p=mlt improve support for 480 line NTSC in decklink consumer --- diff --git a/src/modules/decklink/consumer_decklink.cpp b/src/modules/decklink/consumer_decklink.cpp index 995697e0..bbb0e4e0 100644 --- a/src/modules/decklink/consumer_decklink.cpp +++ b/src/modules/decklink/consumer_decklink.cpp @@ -77,8 +77,9 @@ private: int p = mode->GetFieldDominance() == bmdProgressiveFrame; mlt_log_verbose( getConsumer(), "BMD mode %dx%d %.3f fps prog %d\n", m_width, m_height, m_fps, p ); - if ( m_width == profile->width && m_height == profile->height && p == profile->progressive - && m_fps == mlt_profile_fps( profile ) ) + if ( m_width == profile->width && p == profile->progressive + && m_fps == mlt_profile_fps( profile ) + && ( m_height == profile->height || ( m_height == 486 && profile->height == 480 ) ) ) result = mode; } } @@ -351,8 +352,9 @@ public: mlt_image_format format = m_isKeyer? mlt_image_rgb24a : mlt_image_yuv422; uint8_t* image = 0; int rendered = mlt_properties_get_int( MLT_FRAME_PROPERTIES(frame), "rendered"); + int height = m_height; - if ( rendered && !mlt_frame_get_image( frame, &image, &format, &m_width, &m_height, 0 ) ) + if ( rendered && !mlt_frame_get_image( frame, &image, &format, &m_width, &height, 0 ) ) { uint8_t* buffer = 0; int stride = m_width * ( m_isKeyer? 4 : 2 ); @@ -366,26 +368,41 @@ public: { int progressive = mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "progressive" ); + // NTSC SDI is always 486 lines + if ( m_height == 486 && height == 480 ) + { + // blank first 6 lines + if ( m_isKeyer ) + { + memset( buffer, 0, stride * 6 ); + buffer += stride * 6; + } + else for ( int i = 0; i < m_width * 6; i++ ) + { + *buffer++ = 128; + *buffer++ = 16; + } + } if ( !m_isKeyer ) { // Normal non-keyer playout - needs byte swapping if ( !progressive && m_displayMode->GetFieldDominance() == bmdUpperFieldFirst ) // convert lower field first to top field first - swab( (char*) image, (char*) buffer + stride, stride * ( m_height - 1 ) ); + swab( (char*) image, (char*) buffer + stride, stride * ( height - 1 ) ); else - swab( (char*) image, (char*) buffer, stride * m_height ); + swab( (char*) image, (char*) buffer, stride * height ); } else if ( !mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "test_image" ) ) { // Normal keyer output - int y = m_height + 1; + int y = height + 1; uint32_t* s = (uint32_t*) image; uint32_t* d = (uint32_t*) buffer; if ( !progressive && m_displayMode->GetFieldDominance() == bmdUpperFieldFirst ) { // Correct field order - m_height--; + height--; y--; d += m_width; } @@ -404,7 +421,7 @@ public: else { // Keying blank frames - nullify alpha - memset( buffer, 0, stride * m_height ); + memset( buffer, 0, stride * height ); } } }