]> git.sesse.net Git - vlc/blobdiff - modules/access/decklink.cpp
Add a predefined string list for --decklink-video-connection.
[vlc] / modules / access / decklink.cpp
index e99bc20cf0550105899df6b7c919440173123dea..6685c5364f7765524d0efa51bff207b5ed45c670 100644 (file)
@@ -79,6 +79,13 @@ static void Close( vlc_object_t * );
     "composite, svideo. " \
     "Leave blank for card default." )
 
+static const char *const ppsz_videoconns[] = {
+    "sdi", "hdmi", "opticalsdi", "component", "composite", "svideo"
+};
+static const char *const ppsz_videoconns_text[] = {
+    N_("SDI"), N_("HDMI"), N_("Optical SDI"), N_("Component"), N_("Composite"), N_("S-video")
+};
+        
 #define ASPECT_RATIO_TEXT N_("Aspect ratio")
 #define ASPECT_RATIO_LONGTEXT N_( \
     "Aspect ratio (4:3, 16:9). Default assumes square pixels." )
@@ -103,6 +110,7 @@ vlc_module_begin ()
                  CHANNELS_TEXT, CHANNELS_LONGTEXT, true )
     add_string( "decklink-video-connection", 0, NULL,
                  VIDEO_CONNECTION_TEXT, VIDEO_CONNECTION_LONGTEXT, true )
+        change_string_list( ppsz_videoconns, ppsz_videoconns_text, 0 )
     add_string( "decklink-aspect-ratio", NULL, NULL,
                 ASPECT_RATIO_TEXT, ASPECT_RATIO_LONGTEXT, true )
 
@@ -270,6 +278,7 @@ static int Open( vlc_object_t *p_this )
     int         i_card_index;
     int         i_width, i_height, i_fps_num, i_fps_den;
     int         i_rate;
+    unsigned    u_aspect_num, u_aspect_den;
 
     /* Only when selected */
     if( *p_demux->psz_access == '\0' )
@@ -299,6 +308,12 @@ static int Open( vlc_object_t *p_this )
     HRESULT result;
 
     i_card_index = var_InheritInteger( p_demux, "decklink-card-index" );
+    if( i_card_index < 0 )
+    {
+        msg_Err( p_demux, "Invalid card index %d", i_card_index );
+        goto finish;
+    }
+
     for( int i = 0; i <= i_card_index; ++i )
     {
         if( p_sys->p_card )
@@ -406,8 +421,8 @@ static int Open( vlc_object_t *p_this )
         goto finish;
     }
 
-    psz_display_mode = var_InheritString( p_demux, "decklink-mode" );
-    if( !psz_display_mode || strlen( psz_display_mode ) == 0 || strlen( psz_display_mode ) > 4 ) {
+    psz_display_mode = var_CreateGetNonEmptyString( p_demux, "decklink-mode" );
+    if( !psz_display_mode || strlen( psz_display_mode ) > 4 ) {
         msg_Err( p_demux, "Missing or invalid --decklink-mode string" );
         goto finish;
     }
@@ -547,17 +562,10 @@ static int Open( vlc_object_t *p_this )
     video_fmt.video.i_frame_rate_base = i_fps_den;
     video_fmt.i_bitrate = video_fmt.video.i_width * video_fmt.video.i_height * video_fmt.video.i_frame_rate * 2 * 8;
 
-    psz_aspect = var_CreateGetNonEmptyString( p_demux, "decklink-aspect-ratio" );
-    if( psz_aspect )
-    {
-        char *psz_denominator = strchr( psz_aspect, ':' );
-        if( psz_denominator )
-        {
-            *psz_denominator++ = '\0';
-            video_fmt.video.i_sar_num = atoi( psz_aspect )      * video_fmt.video.i_height;
-            video_fmt.video.i_sar_den = atoi( psz_denominator ) * video_fmt.video.i_width;
-        }
-        free( psz_aspect );
+    if ( !var_InheritURational( p_demux, &u_aspect_num, &u_aspect_den, "decklink-aspect-ratio" ) &&
+         u_aspect_num > 0 && u_aspect_den > 0 ) {
+        video_fmt.video.i_sar_num = u_aspect_num * video_fmt.video.i_height;
+        video_fmt.video.i_sar_den = u_aspect_den * video_fmt.video.i_width;
     }
 
     msg_Dbg( p_demux, "added new video es %4.4s %dx%d",
@@ -576,9 +584,6 @@ static int Open( vlc_object_t *p_this )
              (char*)&audio_fmt.i_codec, audio_fmt.audio.i_rate, audio_fmt.audio.i_bitspersample, audio_fmt.audio.i_channels);
     p_sys->p_audio_es = es_out_Add( p_demux->out, &audio_fmt );
 
-    /* Update default_pts to a suitable value for access */
-    var_Create( p_demux, "decklink-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
-
     ret = VLC_SUCCESS;
 
 finish:
@@ -645,7 +650,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
 
         case DEMUX_GET_PTS_DELAY:
             pi64 = (int64_t*)va_arg( args, int64_t * );
-            *pi64 = var_GetInteger( p_demux, "decklink-caching" ) * 1000;
+            *pi64 = var_InheritInteger( p_demux, "decklink-caching" ) * 1000;
             return VLC_SUCCESS;
 
         case DEMUX_GET_TIME: