From: Steinar H. Gunderson Date: Sun, 3 Oct 2010 12:58:06 +0000 (+0200) Subject: Merge branch 'master' into lpcm_encoder X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=refs%2Fheads%2Flpcm_encoder;hp=5a2f258ce8cd94f83fd6f0808be2154272e632f3;p=vlc Merge branch 'master' into lpcm_encoder --- diff --git a/extras/package/macosx/Resources/shuffle_embedded.png b/extras/package/macosx/Resources/shuffle_embedded.png old mode 100755 new mode 100644 diff --git a/extras/package/macosx/Resources/shuffle_embedded_blue.png b/extras/package/macosx/Resources/shuffle_embedded_blue.png old mode 100755 new mode 100644 diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h index 8541768ff5..5b8c265f51 100644 --- a/include/vlc/libvlc.h +++ b/include/vlc/libvlc.h @@ -226,6 +226,14 @@ VLC_PUBLIC_API const char * libvlc_get_compiler(void); */ VLC_PUBLIC_API const char * libvlc_get_changeset(void); +/** + * Frees an heap allocation returned by a LibVLC function. + * If you know you're using the same underlying C run-time as the LibVLC + * implementation, then you can call ANSI C free() directly instead. + * + * \param ptr the pointer + */ +VLC_PUBLIC_API void libvlc_free( void *ptr ); /** \defgroup libvlc_event LibVLC asynchronous events * LibVLC emits asynchronous events. diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h index e8fe7a7a97..105090eafc 100644 --- a/include/vlc/libvlc_media_player.h +++ b/include/vlc/libvlc_media_player.h @@ -735,7 +735,7 @@ VLC_PUBLIC_API void libvlc_video_set_scale( libvlc_media_player_t *p_mi, float f * * \param p_mi the media player * \return the video aspect ratio or NULL if unspecified - * (the result must be released with free()). + * (the result must be released with free() or libvlc_free()). */ VLC_PUBLIC_API char *libvlc_video_get_aspect_ratio( libvlc_media_player_t *p_mi ); diff --git a/modules/access/decklink.cpp b/modules/access/decklink.cpp index 60e8b831a4..99ab7c2ef2 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 ) @@ -111,7 +119,6 @@ vlc_module_begin () set_callbacks( Open, Close ) vlc_module_end () -static int Demux ( demux_t * ); static int Control( demux_t *, int, va_list ); class DeckLinkCaptureDelegate; @@ -124,16 +131,12 @@ struct demux_sys_t es_out_id_t *p_video_es; es_out_id_t *p_audio_es; - bool b_first_frame; - int i_last_pts; + + vlc_mutex_t pts_lock; + int i_last_pts; /* protected by */ uint32_t i_dominance_flags; int i_channels; - - vlc_mutex_t frame_lock; - block_t *p_video_frame; /* protected by */ - block_t *p_audio_frame; /* protected by */ - vlc_cond_t has_frame; /* related to */ }; class DeckLinkCaptureDelegate : public IDeckLinkInputCallback @@ -211,6 +214,14 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame videoFrame->GetStreamTime( &stream_time, &frame_duration, CLOCK_FREQ ); p_video_frame->i_flags = BLOCK_FLAG_TYPE_I | p_sys->i_dominance_flags; p_video_frame->i_pts = p_video_frame->i_dts = VLC_TS_0 + stream_time; + + vlc_mutex_lock( &p_sys->pts_lock ); + if( p_video_frame->i_pts > p_sys->i_last_pts ) + p_sys->i_last_pts = p_video_frame->i_pts; + vlc_mutex_unlock( &p_sys->pts_lock ); + + es_out_Control( p_demux_->out, ES_OUT_SET_PCR, p_video_frame->i_pts ); + es_out_Send( p_demux_->out, p_sys->p_video_es, p_video_frame ); } if( audioFrame ) @@ -233,25 +244,15 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame BMDTimeValue packet_time; audioFrame->GetPacketTime( &packet_time, CLOCK_FREQ ); p_audio_frame->i_pts = p_audio_frame->i_dts = VLC_TS_0 + packet_time; - } - - if( p_video_frame || p_audio_frame ) - { - vlc_mutex_lock( &p_sys->frame_lock ); - if( p_video_frame ) - { - if( p_sys->p_video_frame ) - block_Release( p_sys->p_video_frame ); - p_sys->p_video_frame = p_video_frame; - } - if( p_audio_frame ) - { - if( p_sys->p_audio_frame ) - block_Release( p_sys->p_audio_frame ); - p_sys->p_audio_frame = p_audio_frame; - } - vlc_cond_signal( &p_sys->has_frame ); - vlc_mutex_unlock( &p_sys->frame_lock ); + + vlc_mutex_lock( &p_sys->pts_lock ); + if( p_audio_frame->i_pts > p_sys->i_last_pts ) + p_sys->i_last_pts = p_audio_frame->i_pts; + vlc_mutex_unlock( &p_sys->pts_lock ); + if( p_audio_frame->i_pts > p_sys->i_last_pts ) + + es_out_Control( p_demux_->out, ES_OUT_SET_PCR, p_audio_frame->i_pts ); + es_out_Send( p_demux_->out, p_sys->p_audio_es, p_audio_frame ); } return S_OK; @@ -277,7 +278,7 @@ static int Open( vlc_object_t *p_this ) return VLC_EGENERIC; /* Set up p_demux */ - p_demux->pf_demux = Demux; + p_demux->pf_demux = NULL; p_demux->pf_control = Control; p_demux->info.i_update = 0; p_demux->info.i_title = 0; @@ -286,9 +287,7 @@ static int Open( vlc_object_t *p_this ) if( !p_sys ) return VLC_ENOMEM; - vlc_mutex_init( &p_sys->frame_lock ); - vlc_cond_init( &p_sys->has_frame ); - p_sys->b_first_frame = true; + vlc_mutex_init( &p_sys->pts_lock ); IDeckLinkIterator *decklink_iterator = CreateDeckLinkIteratorInstance(); if( !decklink_iterator ) @@ -346,7 +345,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; @@ -615,12 +614,6 @@ 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 ); } @@ -647,52 +640,14 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) case DEMUX_GET_TIME: pi64 = (int64_t*)va_arg( args, int64_t * ); + vlc_mutex_lock( &p_sys->pts_lock ); *pi64 = p_sys->i_last_pts; + vlc_mutex_unlock( &p_sys->pts_lock ); return VLC_SUCCESS; - /* TODO implement others */ default: return VLC_EGENERIC; } return VLC_EGENERIC; } - -static int Demux( demux_t *p_demux ) -{ - demux_sys_t *p_sys = p_demux->p_sys; - block_t *p_video_block = NULL; - block_t *p_audio_block = NULL; - - vlc_mutex_lock( &p_sys->frame_lock ); - - while( !p_sys->p_video_frame && !p_sys->p_audio_frame ) - vlc_cond_wait( &p_sys->has_frame, &p_sys->frame_lock ); - - p_video_block = p_sys->p_video_frame; - p_sys->p_video_frame = NULL; - - p_audio_block = p_sys->p_audio_frame; - p_sys->p_audio_frame = NULL; - - vlc_mutex_unlock( &p_sys->frame_lock ); - - if( p_video_block ) - { - if( p_video_block->i_pts > p_sys->i_last_pts ) - p_sys->i_last_pts = p_video_block->i_pts; - 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 ) - p_sys->i_last_pts = p_audio_block->i_pts; - es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_audio_block->i_pts ); - es_out_Send( p_demux->out, p_sys->p_audio_es, p_audio_block ); - } - - return 1; -} - diff --git a/modules/access/rtp/rtp.c b/modules/access/rtp/rtp.c old mode 100644 new mode 100755 index 32e13b3c10..c896270c0f --- a/modules/access/rtp/rtp.c +++ b/modules/access/rtp/rtp.c @@ -431,7 +431,6 @@ static void codec_decode (demux_t *demux, void *data, block_t *block) block_Release (block); } - static void *stream_init (demux_t *demux, const char *name) { return stream_DemuxNew (demux, name, demux->out); @@ -454,6 +453,11 @@ static void stream_decode (demux_t *demux, void *data, block_t *block) (void)demux; } +static void *demux_init (demux_t *demux) +{ + return stream_init (demux, demux->psz_demux); +} + /* * Static payload types handler */ @@ -679,7 +683,22 @@ int rtp_autodetect (demux_t *demux, rtp_session_t *session, break; default: - return -1; + /* + * If the rtp payload type is unknown then check demux if it is specified + */ + if ((strcmp(demux->psz_demux, "h264") == 0) || (strcmp(demux->psz_demux, "ts") == 0)) + { + msg_Dbg (demux, "rtp autodetect specified demux=%s", demux->psz_demux); + pt.init = demux_init; + pt.destroy = stream_destroy; + pt.decode = stream_decode; + pt.frequency = 90000; + break; + } + else + { + return -1; + } } rtp_add_type (demux, session, &pt); return 0; diff --git a/src/control/core.c b/src/control/core.c index 1411e9c082..745c85af64 100644 --- a/src/control/core.c +++ b/src/control/core.c @@ -159,3 +159,8 @@ const char * libvlc_get_changeset(void) extern const char psz_vlc_changeset[]; return psz_vlc_changeset; } + +void libvlc_free( void *ptr ) +{ + free( ptr ); +} diff --git a/src/libvlc.sym b/src/libvlc.sym index f635a689fb..363faff8dc 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -32,6 +32,7 @@ libvlc_event_manager_register_event_type libvlc_event_manager_release libvlc_event_send libvlc_event_type_name +libvlc_free libvlc_get_changeset libvlc_get_compiler libvlc_get_fullscreen diff --git a/test/samples/image.jpg b/test/samples/image.jpg old mode 100755 new mode 100644