From: Steinar Gunderson Date: Mon, 27 Sep 2010 21:36:38 +0000 (+0200) Subject: Merge branch 'master' into lpcm_encoder X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=0da47fcb60fe41d5f67dd359841e8d89c78c9428;hp=da91cb11404e06b9eeedc8eecbc322511631982d;p=vlc Merge branch 'master' into lpcm_encoder --- diff --git a/NEWS b/NEWS index a5390ef0a0..4fab873c7f 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ Access * DShow: support for freq and video standard selection * Support for VDR recordings * Blu-Ray integration with libbluray + * Blackmagic DeckLink SDI card input support (Linux only currently) Codecs * You can now use ffmpeg-mt in conjunction with vlc diff --git a/configure.ac b/configure.ac index 28f9d0d924..f0db14862a 100644 --- a/configure.ac +++ b/configure.ac @@ -2134,14 +2134,14 @@ then fi dnl -dnl special access module for BlackMagic SDI cards +dnl special access module for Blackmagic SDI cards dnl AC_ARG_ENABLE(sdi, - [ --enable-sdi BlackMagic SDI access module (default disabled)]) + [ --enable-sdi Blackmagic SDI access module (default disabled)]) if test "${enable_sdi}" = "yes" then AC_ARG_WITH(sdi_sdk, - [ --with-sdi-sdk=DIR Location of BlackMagic SDI SDK],[],[]) + [ --with-sdi-sdk=DIR Location of Blackmagic SDI SDK],[],[]) if test "${with_sdi_sdk}" != "no" -a -n "${with_sdi_sdk}" then VLC_ADD_CPPFLAGS([sdi],[-I${with_sdi_sdk}/include]) @@ -2150,7 +2150,7 @@ then AC_LANG_PUSH(C++) AC_CHECK_HEADERS(DeckLinkAPIDispatch.cpp, [ VLC_ADD_PLUGIN([sdi]) - ],[AC_MSG_WARN(BlackMagic SDI include files not found, sdi disabled)]) + ],[AC_MSG_WARN(Blackmagic SDI include files not found, sdi disabled)]) AC_LANG_POP(C++) CPPFLAGS="${CPPFLAGS_save}" fi diff --git a/modules/LIST b/modules/LIST index 6ceb6efe9a..8a0314e0d1 100644 --- a/modules/LIST +++ b/modules/LIST @@ -264,6 +264,7 @@ $Id$ * schroedinger: Schroedinger video decoder * screen: a input module that takes screenshots of the primary monitor * sdl_image: SDL-based image decoder + * sdi: input module to read from a Blackmagic SDI card * sharpen: Sharpen video filter * shine: MP3 encoder using Shine, a fixed point implementation * simple_channel_mixer: channel mixer diff --git a/modules/access/sdi.cpp b/modules/access/sdi.cpp index 4e8988e075..ec93c27cf6 100644 --- a/modules/access/sdi.cpp +++ b/modules/access/sdi.cpp @@ -1,4 +1,4 @@ -/* BlackMagic SDI driver */ +/* Blackmagic SDI driver */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -19,8 +19,8 @@ #include -#include "DeckLinkAPI.h" -#include "DeckLinkAPIDispatch.cpp" +#include +#include static int Open ( vlc_object_t * ); static void Close( vlc_object_t * ); @@ -70,10 +70,10 @@ static void Close( vlc_object_t * ); vlc_module_begin () set_shortname( N_("SDI") ) - set_description( N_("BlackMagic SDI input") ) + set_description( N_("Blackmagic SDI input") ) set_category( CAT_INPUT ) set_subcategory( SUBCAT_INPUT_ACCESS ) - + add_integer( "sdi-card-index", 0, NULL, CARD_INDEX_TEXT, CARD_INDEX_LONGTEXT, true ) add_string( "sdi-mode", "pal ", NULL, @@ -157,7 +157,7 @@ private: HRESULT DeckLinkCaptureDelegate::VideoInputFormatChanged(BMDVideoInputFormatChangedEvents events, IDeckLinkDisplayMode *mode, BMDDetectedVideoInputFormatFlags) { - msg_Dbg( p_demux_, "Video input format changed" ); + msg_Dbg( p_demux_, "Video input format changed" ); return S_OK; } @@ -206,7 +206,7 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame } p_video_frame->i_pts = p_video_frame->i_dts = VLC_TS_0 + stream_time; } - + if( audioFrame ) { const int i_bytes = audioFrame->GetSampleFrameCount() * sizeof(int16_t) * p_sys->i_channels; @@ -215,6 +215,8 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame if( !p_audio_frame ) { msg_Err( p_demux_, "Could not allocate memory for audio frame" ); + if( p_video_frame ) + block_Release( p_video_frame ); return S_OK; } @@ -304,7 +306,7 @@ static int Open( vlc_object_t *p_this ) const char *psz_model_name; result = p_sys->p_card->GetModelName( &psz_model_name ); - + if( result != S_OK ) { msg_Err( p_demux, "Could not get model name" ); @@ -320,7 +322,7 @@ static int Open( vlc_object_t *p_this ) Close( p_this ); return VLC_EGENERIC; } - + /* Set up the video and audio sources. */ IDeckLinkConfiguration *p_config; if( p_sys->p_card->QueryInterface( IID_IDeckLinkConfiguration, (void**)&p_config) != S_OK ) @@ -329,7 +331,7 @@ static int Open( vlc_object_t *p_this ) Close( p_this ); return VLC_EGENERIC; } - + char *psz_tmp = var_CreateGetNonEmptyString( p_demux, "sdi-video-connection" ); if( psz_tmp ) { @@ -366,7 +368,7 @@ static int Open( vlc_object_t *p_this ) Close( p_this ); return VLC_EGENERIC; } - } + } psz_tmp = var_CreateGetNonEmptyString( p_demux, "sdi-audio-connection" ); if( psz_tmp ) @@ -412,7 +414,7 @@ static int Open( vlc_object_t *p_this ) Close( p_this ); return VLC_EGENERIC; } - + char *psz_display_mode = var_CreateGetString( p_demux, "sdi-mode" ); if( !psz_display_mode || strlen( psz_display_mode ) == 0 || strlen( psz_display_mode ) > 4 ) { msg_Err( p_demux, "Missing or invalid --sdi-mode string" ); @@ -430,12 +432,12 @@ static int Open( vlc_object_t *p_this ) strcpy(sz_display_mode_padded, " "); for( int i = 0; i < strlen( psz_display_mode ); ++i ) sz_display_mode_padded[i] = psz_display_mode[i]; - + free( psz_display_mode ); BMDDisplayMode wanted_mode_id; memcpy( &wanted_mode_id, &sz_display_mode_padded, sizeof(wanted_mode_id) ); - + bool b_found_mode = false; for (;;) @@ -443,7 +445,7 @@ static int Open( vlc_object_t *p_this ) IDeckLinkDisplayMode *p_display_mode; result = p_display_iterator->Next( &p_display_mode ); if( result != S_OK || !p_display_mode ) - break; + break; char sz_mode_id_text[5] = {0}; BMDDisplayMode mode_id = ntohl( p_display_mode->GetDisplayMode() ); @@ -531,7 +533,7 @@ static int Open( vlc_object_t *p_this ) Close( p_this ); return VLC_EGENERIC; } - + /* Set up audio. */ p_sys->i_rate = var_CreateGetInteger( p_demux, "sdi-audio-rate" ); p_sys->i_channels = var_CreateGetInteger( p_demux, "sdi-audio-channels" ); @@ -545,7 +547,7 @@ static int Open( vlc_object_t *p_this ) return VLC_EGENERIC; } } - + p_sys->p_delegate = new DeckLinkCaptureDelegate( p_demux ); p_sys->p_input->SetCallback( p_sys->p_delegate ); @@ -567,7 +569,7 @@ static int Open( vlc_object_t *p_this ) video_fmt.video.i_frame_rate = p_sys->i_fps_num; video_fmt.video.i_frame_rate_base = p_sys->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_tmp = var_CreateGetNonEmptyString( p_demux, "sdi-aspect-ratio" ); if( psz_tmp ) { @@ -584,7 +586,7 @@ static int Open( vlc_object_t *p_this ) msg_Dbg( p_demux, "added new video es %4.4s %dx%d", (char*)&video_fmt.i_codec, video_fmt.video.i_width, video_fmt.video.i_height ); p_sys->p_video_es = es_out_Add( p_demux->out, &video_fmt ); - + es_format_t audio_fmt; es_format_Init( &audio_fmt, AUDIO_ES, VLC_CODEC_S16N ); audio_fmt.audio.i_channels = p_sys->i_channels; @@ -619,10 +621,10 @@ static void Close( vlc_object_t *p_this ) if( p_sys->p_delegate ) p_sys->p_delegate->Release(); - + if( p_sys->p_video_frame ) block_Release( p_sys->p_video_frame ); - + if( p_sys->p_audio_frame ) block_Release( p_sys->p_audio_frame ); @@ -689,7 +691,7 @@ static int Demux( demux_t *p_demux ) es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_video_block->i_pts ); es_out_Send( p_demux->out, p_sys->p_video_es, p_video_block ); } - + if( p_audio_block ) { if( p_audio_block->i_pts > p_sys->i_last_pts ) diff --git a/po/POTFILES.in b/po/POTFILES.in index a45b25b9dc..747dd50ca2 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -271,6 +271,7 @@ modules/access/screen/screen.c modules/access/screen/screen.h modules/access/screen/win32.c modules/access/screen/xcb.c +modules/access/sdi.cpp modules/access/sftp.c modules/access/smb.c modules/access/tcp.c