X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fdecklink.cpp;h=a8f3a71dc12b3bb6627135c629385e5fa10af9bf;hb=c60652e38ac6afd74bd8225e9dae5406f13aaa4f;hp=e99bc20cf0550105899df6b7c919440173123dea;hpb=8ab209b51d1255d305659af4ffa281c2c68a8b48;p=vlc diff --git a/modules/access/decklink.cpp b/modules/access/decklink.cpp index e99bc20cf0..a8f3a71dc1 100644 --- a/modules/access/decklink.cpp +++ b/modules/access/decklink.cpp @@ -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 ) @@ -339,7 +354,7 @@ static int Open( vlc_object_t *p_this ) goto finish; } - psz_video_connection = var_CreateGetNonEmptyString( p_demux, "decklink-video-connection" ); + psz_video_connection = var_InheritString( p_demux, "decklink-video-connection" ); if( psz_video_connection ) { BMDVideoConnection conn; @@ -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: