X-Git-Url: https://git.sesse.net/?p=vlc;a=blobdiff_plain;f=modules%2Faccess%2Fsdi.cpp;h=9d42eae79aec9faac93f216cb0ac5ab270d55ac2;hp=b9329e84fccd2d5e64abc254dbd51fb39fd8115e;hb=354bf997e0392b175aa791bb74245d9a6e007ab4;hpb=b93670e1dce5ba4bebc66db8d78864d865672b68 diff --git a/modules/access/sdi.cpp b/modules/access/sdi.cpp index b9329e84fc..9d42eae79a 100644 --- a/modules/access/sdi.cpp +++ b/modules/access/sdi.cpp @@ -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 * ); @@ -270,7 +270,7 @@ static int Open( vlc_object_t *p_this ) vlc_mutex_init( &p_sys->frame_lock ); vlc_cond_init( &p_sys->has_frame ); - p_sys->p_video_frame = NULL; + p_sys->b_first_frame = true; IDeckLinkIterator *decklink_iterator = CreateDeckLinkIteratorInstance(); if( !decklink_iterator ) @@ -286,6 +286,8 @@ static int Open( vlc_object_t *p_this ) int i_card_index = var_CreateGetInteger( p_demux, "sdi-card-index" ); for( int i = 0; i <= i_card_index; ++i ) { + if( p_sys->p_card ) + p_sys->p_card->Release(); result = decklink_iterator->Next( &p_sys->p_card ); if( result != S_OK ) break; @@ -380,6 +382,8 @@ static int Open( vlc_object_t *p_this ) { msg_Err( p_demux, "Invalid --sdi-audio-connection specified; choose one of " \ "embedded, aesebu, or analog." ); + free( psz_tmp ); + p_config->Release(); Close( p_this ); return VLC_EGENERIC; } @@ -412,6 +416,7 @@ static int Open( vlc_object_t *p_this ) 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" ); + free( psz_display_mode ); p_display_iterator->Release(); Close( p_this ); return VLC_EGENERIC; @@ -425,6 +430,8 @@ 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) ); @@ -436,9 +443,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; - } char sz_mode_id_text[5] = {0}; BMDDisplayMode mode_id = ntohl( p_display_mode->GetDisplayMode() ); @@ -449,6 +454,7 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Failed to get display mode name" ); + p_display_mode->Release(); p_display_iterator->Release(); Close( p_this ); return VLC_EGENERIC; @@ -459,6 +465,7 @@ static int Open( vlc_object_t *p_this ) if( result != S_OK ) { msg_Err( p_demux, "Failed to get frame rate" ); + p_display_mode->Release(); p_display_iterator->Release(); Close( p_this ); return VLC_EGENERIC; @@ -502,6 +509,8 @@ static int Open( vlc_object_t *p_this ) p_sys->i_fps_den = frame_duration; p_sys->i_dominance_flags = i_dominance_flags; } + + p_display_mode->Release(); } p_display_iterator->Release(); @@ -588,8 +597,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 ); - p_sys->b_first_frame = true; - /* Update default_pts to a suitable value for access */ var_Create( p_demux, "sdi-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); @@ -612,6 +619,12 @@ 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 ); free( p_sys ); }