]> git.sesse.net Git - mlt/commitdiff
improve support for 480 line NTSC in decklink consumer
authorDan Dennedy <dan@dennedy.org>
Sat, 12 Nov 2011 20:06:12 +0000 (12:06 -0800)
committerDan Dennedy <dan@dennedy.org>
Sat, 12 Nov 2011 20:06:12 +0000 (12:06 -0800)
src/modules/decklink/consumer_decklink.cpp

index 995697e01ca30962535eb67495916d11f4c7d543..bbb0e4e06472c52f3028a8c92352f708c5a43f0b 100644 (file)
@@ -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 );
                                }
                        }
                }