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;
}
}
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 );
{
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;
}
else
{
// Keying blank frames - nullify alpha
- memset( buffer, 0, stride * m_height );
+ memset( buffer, 0, stride * height );
}
}
}