/***************************************************************************** * Open: *****************************************************************************/ static int Open( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys; char *psz_name; char *psz_dvdcss_env; dvd_reader_t *p_dvdread; ifo_handle_t *p_vmg_file; vlc_value_t val; if( !p_demux->psz_path || !*p_demux->psz_path ) { /* Only when selected */ if( !p_this->b_force ) return VLC_EGENERIC; psz_name = var_CreateGetString( p_this, "dvd" ); if( !psz_name ) { psz_name = strdup(""); } } else psz_name = strdup( p_demux->psz_path ); #ifdef WIN32 if( psz_name[0] && psz_name[1] == ':' && psz_name[2] == '\\' && psz_name[3] == '\0' ) psz_name[2] = '\0'; #endif /* Override environment variable DVDCSS_METHOD with config option * (FIXME: this creates a small memory leak) */ psz_dvdcss_env = config_GetPsz( p_demux, "dvdread-css-method" ); if( psz_dvdcss_env && *psz_dvdcss_env ) { char *psz_env; psz_env = malloc( strlen("DVDCSS_METHOD=") + strlen( psz_dvdcss_env ) + 1 ); if( !psz_env ) { free( psz_dvdcss_env ); return VLC_ENOMEM; } sprintf( psz_env, "%s%s", "DVDCSS_METHOD=", psz_dvdcss_env ); putenv( psz_env ); } if( psz_dvdcss_env ) free( psz_dvdcss_env ); /* Open dvdread */ if( !(p_dvdread = DVDOpen( psz_name )) ) { msg_Err( p_demux, "DVDRead cannot open source: %s", psz_name ); free( psz_name ); return VLC_EGENERIC; } free( psz_name ); /* Ifo allocation & initialisation */ if( !( p_vmg_file = ifoOpen( p_dvdread, 0 ) ) ) { msg_Warn( p_demux, "cannot open VMG info" ); return VLC_EGENERIC; } msg_Dbg( p_demux, "VMG opened" ); /* Fill p_demux field */ p_demux->pf_demux = Demux; p_demux->pf_control = Control; p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); memset( p_sys, 0, sizeof( demux_sys_t ) ); ps_track_init( p_sys->tk ); p_sys->i_aspect = -1; p_sys->i_title_cur_time = (mtime_t) 0; p_sys->i_cell_cur_time = (mtime_t) 0; p_sys->i_cell_duration = (mtime_t) 0; p_sys->p_dvdread = p_dvdread; p_sys->p_vmg_file = p_vmg_file; p_sys->p_title = NULL; p_sys->p_vts_file = NULL; p_sys->i_title = p_sys->i_chapter = -1; p_sys->i_mux_rate = 0; var_Create( p_demux, "dvdread-angle", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); var_Get( p_demux, "dvdread-angle", &val ); p_sys->i_angle = val.i_int > 0 ? val.i_int : 1; DemuxTitles( p_demux, &p_sys->i_angle ); if( DvdReadSetArea( p_demux, 0, 0, p_sys->i_angle ) != VLC_SUCCESS ) { Close( p_this ); msg_Err( p_demux, "DvdReadSetArea(0,0,%i) failed (can't decrypt DVD?)", p_sys->i_angle ); return VLC_EGENERIC; } /* Update default_pts to a suitable value for dvdread access */ var_Create( p_demux, "dvdread-caching", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); return VLC_SUCCESS; }
/* This function will add or remove a a module from a string list (colon * separated). It will return true if there is a modification * In case p_aout is NULL, we will use configuration instead of variable */ bool aout_ChangeFilterString( vlc_object_t *p_obj, vlc_object_t *p_aout, const char *psz_variable, const char *psz_name, bool b_add ) { if( *psz_name == '\0' ) return false; char *psz_list; if( p_aout ) { psz_list = var_GetString( p_aout, psz_variable ); } else { psz_list = var_CreateGetString( p_obj->p_libvlc, psz_variable ); var_Destroy( p_obj->p_libvlc, psz_variable ); } /* Split the string into an array of filters */ int i_count = 1; for( char *p = psz_list; p && *p; p++ ) i_count += *p == ':'; i_count += b_add; const char **ppsz_filter = calloc( i_count, sizeof(*ppsz_filter) ); if( !ppsz_filter ) { free( psz_list ); return false; } bool b_present = false; i_count = 0; for( char *p = psz_list; p && *p; ) { char *psz_end = strchr(p, ':'); if( psz_end ) *psz_end++ = '\0'; else psz_end = p + strlen(p); if( *p ) { b_present |= !strcmp( p, psz_name ); ppsz_filter[i_count++] = p; } p = psz_end; } if( b_present == b_add ) { free( ppsz_filter ); free( psz_list ); return false; } if( b_add ) { int i_order = FilterOrder( psz_name ); int i; for( i = 0; i < i_count; i++ ) { if( FilterOrder( ppsz_filter[i] ) > i_order ) break; } if( i < i_count ) memmove( &ppsz_filter[i+1], &ppsz_filter[i], (i_count - i) * sizeof(*ppsz_filter) ); ppsz_filter[i] = psz_name; i_count++; } else { for( int i = 0; i < i_count; i++ ) { if( !strcmp( ppsz_filter[i], psz_name ) ) ppsz_filter[i] = ""; } } size_t i_length = 0; for( int i = 0; i < i_count; i++ ) i_length += 1 + strlen( ppsz_filter[i] ); char *psz_new = malloc( i_length + 1 ); *psz_new = '\0'; for( int i = 0; i < i_count; i++ ) { if( *ppsz_filter[i] == '\0' ) continue; if( *psz_new ) strcat( psz_new, ":" ); strcat( psz_new, ppsz_filter[i] ); } free( ppsz_filter ); free( psz_list ); if( p_aout ) var_SetString( p_aout, psz_variable, psz_new ); else config_PutPsz( p_obj, psz_variable, psz_new ); free( psz_new ); return true; }
/***************************************************************************** * Open: *****************************************************************************/ static int Open( vlc_object_t *p_this ) { sout_stream_t *p_stream = (sout_stream_t*)p_this; sout_stream_sys_t *p_sys; char *psz_string; if( !p_stream->p_next ) { msg_Err( p_stream, "cannot create chain" ); return VLC_EGENERIC; } p_sys = calloc( 1, sizeof( *p_sys ) ); p_sys->i_master_drift = 0; config_ChainParse( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg ); /* Audio transcoding parameters */ psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "aenc" ); p_sys->psz_aenc = NULL; p_sys->p_audio_cfg = NULL; if( psz_string && *psz_string ) { char *psz_next; psz_next = config_ChainCreate( &p_sys->psz_aenc, &p_sys->p_audio_cfg, psz_string ); free( psz_next ); } free( psz_string ); psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "acodec" ); p_sys->i_acodec = 0; if( psz_string && *psz_string ) { char fcc[5] = " \0"; memcpy( fcc, psz_string, __MIN( strlen( psz_string ), 4 ) ); p_sys->i_acodec = vlc_fourcc_GetCodecFromString( AUDIO_ES, fcc ); msg_Dbg( p_stream, "Checking codec mapping for %s got %4.4s ", fcc, (char*)&p_sys->i_acodec); } free( psz_string ); p_sys->psz_alang = var_GetNonEmptyString( p_stream, SOUT_CFG_PREFIX "alang" ); p_sys->i_abitrate = var_GetInteger( p_stream, SOUT_CFG_PREFIX "ab" ); if( p_sys->i_abitrate < 4000 ) p_sys->i_abitrate *= 1000; p_sys->i_sample_rate = var_GetInteger( p_stream, SOUT_CFG_PREFIX "samplerate" ); p_sys->i_channels = var_GetInteger( p_stream, SOUT_CFG_PREFIX "channels" ); if( p_sys->i_acodec ) { if( ( p_sys->i_acodec == VLC_CODEC_MP3 || p_sys->i_acodec == VLC_CODEC_MP2 || p_sys->i_acodec == VLC_CODEC_MPGA ) && p_sys->i_channels > 2 ) { msg_Warn( p_stream, "%d channels invalid for mp2/mp3, forcing to 2", p_sys->i_channels ); p_sys->i_channels = 2; } msg_Dbg( p_stream, "codec audio=%4.4s %dHz %d channels %dKb/s", (char *)&p_sys->i_acodec, p_sys->i_sample_rate, p_sys->i_channels, p_sys->i_abitrate / 1000 ); } psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "afilter" ); if( psz_string && *psz_string ) p_sys->psz_af = strdup( psz_string ); else p_sys->psz_af = NULL; free( psz_string ); /* Video transcoding parameters */ psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "venc" ); p_sys->psz_venc = NULL; p_sys->p_video_cfg = NULL; if( psz_string && *psz_string ) { char *psz_next; psz_next = config_ChainCreate( &p_sys->psz_venc, &p_sys->p_video_cfg, psz_string ); free( psz_next ); } free( psz_string ); psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "vcodec" ); p_sys->i_vcodec = 0; if( psz_string && *psz_string ) { char fcc[5] = " \0"; memcpy( fcc, psz_string, __MIN( strlen( psz_string ), 4 ) ); p_sys->i_vcodec = vlc_fourcc_GetCodecFromString( VIDEO_ES, fcc ); msg_Dbg( p_stream, "Checking video codec mapping for %s got %4.4s ", fcc, (char*)&p_sys->i_vcodec); } free( psz_string ); p_sys->i_vbitrate = var_GetInteger( p_stream, SOUT_CFG_PREFIX "vb" ); if( p_sys->i_vbitrate < 16000 ) p_sys->i_vbitrate *= 1000; p_sys->f_scale = var_GetFloat( p_stream, SOUT_CFG_PREFIX "scale" ); p_sys->b_master_sync = var_InheritURational( p_stream, &p_sys->fps_num, &p_sys->fps_den, SOUT_CFG_PREFIX "fps" ) == VLC_SUCCESS; p_sys->i_width = var_GetInteger( p_stream, SOUT_CFG_PREFIX "width" ); p_sys->i_height = var_GetInteger( p_stream, SOUT_CFG_PREFIX "height" ); p_sys->i_maxwidth = var_GetInteger( p_stream, SOUT_CFG_PREFIX "maxwidth" ); p_sys->i_maxheight = var_GetInteger( p_stream, SOUT_CFG_PREFIX "maxheight" ); psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "vfilter" ); if( psz_string && *psz_string ) p_sys->psz_vf2 = strdup(psz_string ); else p_sys->psz_vf2 = NULL; free( psz_string ); p_sys->b_deinterlace = var_GetBool( p_stream, SOUT_CFG_PREFIX "deinterlace" ); psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "deinterlace-module" ); p_sys->psz_deinterlace = NULL; p_sys->p_deinterlace_cfg = NULL; if( psz_string && *psz_string ) { char *psz_next; psz_next = config_ChainCreate( &p_sys->psz_deinterlace, &p_sys->p_deinterlace_cfg, psz_string ); free( psz_next ); } free( psz_string ); p_sys->i_threads = var_GetInteger( p_stream, SOUT_CFG_PREFIX "threads" ); p_sys->b_high_priority = var_GetBool( p_stream, SOUT_CFG_PREFIX "high-priority" ); if( p_sys->i_vcodec ) { msg_Dbg( p_stream, "codec video=%4.4s %dx%d scaling: %f %dkb/s", (char *)&p_sys->i_vcodec, p_sys->i_width, p_sys->i_height, p_sys->f_scale, p_sys->i_vbitrate / 1000 ); } /* Disable hardware decoding by default (unlike normal playback) */ psz_string = var_CreateGetString( p_stream, "avcodec-hw" ); if( !strcasecmp( "any", psz_string ) ) var_SetString( p_stream, "avcodec-hw", "none" ); free( psz_string ); /* Subpictures transcoding parameters */ p_sys->p_spu = NULL; p_sys->p_spu_blend = NULL; p_sys->psz_senc = NULL; p_sys->p_spu_cfg = NULL; p_sys->i_scodec = 0; psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "senc" ); if( psz_string && *psz_string ) { char *psz_next; psz_next = config_ChainCreate( &p_sys->psz_senc, &p_sys->p_spu_cfg, psz_string ); free( psz_next ); } free( psz_string ); psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "scodec" ); if( psz_string && *psz_string ) { char fcc[5] = " \0"; memcpy( fcc, psz_string, __MIN( strlen( psz_string ), 4 ) ); p_sys->i_scodec = vlc_fourcc_GetCodecFromString( SPU_ES, fcc ); msg_Dbg( p_stream, "Checking spu codec mapping for %s got %4.4s ", fcc, (char*)&p_sys->i_scodec); } free( psz_string ); if( p_sys->i_scodec ) { msg_Dbg( p_stream, "codec spu=%4.4s", (char *)&p_sys->i_scodec ); } p_sys->b_soverlay = var_GetBool( p_stream, SOUT_CFG_PREFIX "soverlay" ); psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "sfilter" ); if( psz_string && *psz_string ) { p_sys->p_spu = spu_Create( p_stream ); if( p_sys->p_spu ) spu_ChangeSources( p_sys->p_spu, psz_string ); } free( psz_string ); /* OSD menu transcoding parameters */ p_sys->psz_osdenc = NULL; p_sys->p_osd_cfg = NULL; p_sys->i_osdcodec = 0; p_sys->b_osd = var_GetBool( p_stream, SOUT_CFG_PREFIX "osd" ); if( p_sys->b_osd ) { char *psz_next; psz_next = config_ChainCreate( &p_sys->psz_osdenc, &p_sys->p_osd_cfg, "dvbsub" ); free( psz_next ); p_sys->i_osdcodec = VLC_CODEC_YUVP; msg_Dbg( p_stream, "codec osd=%4.4s", (char *)&p_sys->i_osdcodec ); if( !p_sys->p_spu ) { p_sys->p_spu = spu_Create( p_stream ); if( p_sys->p_spu ) spu_ChangeSources( p_sys->p_spu, "osdmenu" ); } else { spu_ChangeSources( p_sys->p_spu, "osdmenu" ); } } p_stream->pf_add = Add; p_stream->pf_del = Del; p_stream->pf_send = Send; p_stream->p_sys = p_sys; return VLC_SUCCESS; }
int Open_LuaIntf( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t*)p_this; intf_sys_t *p_sys; lua_State *L; config_ChainParse( p_intf, "lua-", ppsz_intf_options, p_intf->p_cfg ); char *psz_name = GetModuleName( p_intf ); const char *psz_config; bool b_config_set = false; if( !psz_name ) psz_name = strdup( "dummy" ); p_intf->p_sys = (intf_sys_t*)malloc( sizeof(intf_sys_t) ); if( !p_intf->p_sys ) { free( psz_name ); return VLC_ENOMEM; } p_sys = p_intf->p_sys; p_sys->psz_filename = FindFile( psz_name ); if( !p_sys->psz_filename ) { msg_Err( p_intf, "Couldn't find lua interface script \"%s\".", psz_name ); free( psz_name ); free( p_sys ); return VLC_EGENERIC; } msg_Dbg( p_intf, "Found lua interface script: %s", p_sys->psz_filename ); L = luaL_newstate(); if( !L ) { msg_Err( p_intf, "Could not create new Lua State" ); free( psz_name ); free( p_sys ); return VLC_EGENERIC; } luaL_openlibs( L ); /* register our functions */ luaL_register( L, "vlc", p_reg ); /* store a pointer to p_intf (FIXME: user could overwrite this) */ lua_pushlightuserdata( L, p_intf ); lua_setfield( L, -2, "private" ); /* register submodules */ luaopen_acl( L ); luaopen_config( L ); luaopen_volume( L ); luaopen_httpd( L ); luaopen_input( L ); luaopen_msg( L ); luaopen_misc( L ); luaopen_net( L ); luaopen_object( L ); luaopen_osd( L ); luaopen_playlist( L ); luaopen_sd( L ); luaopen_stream( L ); luaopen_strings( L ); luaopen_variables( L ); luaopen_video( L ); luaopen_vlm( L ); luaopen_volume( L ); /* clean up */ lua_pop( L, 1 ); /* <gruik> */ /* Setup the module search path */ { char *psz_command; char *psz_char = strrchr(p_sys->psz_filename,DIR_SEP_CHAR); *psz_char = '\0'; /* FIXME: don't use luaL_dostring */ if( asprintf( &psz_command, "package.path = \"%s"DIR_SEP"modules"DIR_SEP"?.lua;\"..package.path", p_sys->psz_filename ) < 0 ) { free( psz_name ); free( p_sys ); return VLC_EGENERIC; } *psz_char = DIR_SEP_CHAR; if( luaL_dostring( L, psz_command ) ) { free( psz_name ); free( p_sys ); return VLC_EGENERIC; } } /* </gruik> */ psz_config = var_CreateGetString( p_intf, "lua-config" ); if( psz_config && *psz_config ) { char *psz_buffer; if( asprintf( &psz_buffer, "config={%s}", psz_config ) != -1 ) { printf("%s\n", psz_buffer); if( luaL_dostring( L, psz_buffer ) == 1 ) msg_Err( p_intf, "Error while parsing \"lua-config\"." ); free( psz_buffer ); lua_getglobal( L, "config" ); if( lua_istable( L, -1 ) ) { lua_getfield( L, -1, psz_name ); if( lua_istable( L, -1 ) ) { lua_setglobal( L, "config" ); b_config_set = true; } } } } if( b_config_set == false ) { lua_newtable( L ); lua_setglobal( L, "config" ); } p_sys->L = L; p_intf->psz_header = psz_name; /* ^^ Do I need to clean that up myself in Close_LuaIntf? */ vlc_mutex_init( &p_sys->lock ); vlc_cond_init( &p_sys->wait ); p_sys->exiting = false; if( vlc_clone( &p_sys->thread, Run, p_intf, VLC_THREAD_PRIORITY_LOW ) ) { p_sys->exiting = true; Close_LuaIntf( p_this ); return VLC_ENOMEM; } return VLC_SUCCESS; }
/***************************************************************************** * InitVideo: initialize the video decoder ***************************************************************************** * the ffmpeg codec will be opened, some memory allocated. The vout is not yet * opened (done after the first decoded frame). *****************************************************************************/ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context, AVCodec *p_codec, int i_codec_id, const char *psz_namecodec ) { decoder_sys_t *p_sys; int i_val; /* Allocate the memory needed to store the decoder's structure */ if( ( p_dec->p_sys = p_sys = calloc( 1, sizeof(decoder_sys_t) ) ) == NULL ) return VLC_ENOMEM; p_codec->type = AVMEDIA_TYPE_VIDEO; p_context->codec_type = AVMEDIA_TYPE_VIDEO; p_context->codec_id = i_codec_id; p_sys->p_context = p_context; p_sys->p_codec = p_codec; p_sys->i_codec_id = i_codec_id; p_sys->psz_namecodec = psz_namecodec; p_sys->p_ff_pic = avcodec_alloc_frame(); p_sys->b_delayed_open = true; p_sys->p_va = NULL; vlc_sem_init( &p_sys->sem_mt, 0 ); /* ***** Fill p_context with init values ***** */ p_sys->p_context->codec_tag = ffmpeg_CodecTag( p_dec->fmt_in.i_original_fourcc ?: p_dec->fmt_in.i_codec ); /* ***** Get configuration of ffmpeg plugin ***** */ p_sys->p_context->workaround_bugs = var_InheritInteger( p_dec, "avcodec-workaround-bugs" ); p_sys->p_context->err_recognition = var_InheritInteger( p_dec, "avcodec-error-resilience" ); if( var_CreateGetBool( p_dec, "grayscale" ) ) p_sys->p_context->flags |= CODEC_FLAG_GRAY; i_val = var_CreateGetInteger( p_dec, "avcodec-vismv" ); if( i_val ) p_sys->p_context->debug_mv = i_val; i_val = var_CreateGetInteger( p_dec, "avcodec-skiploopfilter" ); if( i_val >= 4 ) p_sys->p_context->skip_loop_filter = AVDISCARD_ALL; else if( i_val == 3 ) p_sys->p_context->skip_loop_filter = AVDISCARD_NONKEY; else if( i_val == 2 ) p_sys->p_context->skip_loop_filter = AVDISCARD_BIDIR; else if( i_val == 1 ) p_sys->p_context->skip_loop_filter = AVDISCARD_NONREF; if( var_CreateGetBool( p_dec, "avcodec-fast" ) ) p_sys->p_context->flags2 |= CODEC_FLAG2_FAST; #if LIBAVCODEC_VERSION_CHECK( 54, 41, 0, 91, 100 ) if( var_InheritBool( p_dec, "avcodec-ignorecrop" ) ) p_sys->p_context->flags2 |= CODEC_FLAG2_IGNORE_CROP; #endif /* ***** libavcodec frame skipping ***** */ p_sys->b_hurry_up = var_CreateGetBool( p_dec, "avcodec-hurry-up" ); switch( var_CreateGetInteger( p_dec, "avcodec-skip-frame" ) ) { case -1: p_sys->p_context->skip_frame = AVDISCARD_NONE; break; case 0: p_sys->p_context->skip_frame = AVDISCARD_DEFAULT; break; case 1: p_sys->p_context->skip_frame = AVDISCARD_NONREF; break; case 2: p_sys->p_context->skip_frame = AVDISCARD_NONKEY; break; case 3: p_sys->p_context->skip_frame = AVDISCARD_ALL; break; default: p_sys->p_context->skip_frame = AVDISCARD_NONE; break; } p_sys->i_skip_frame = p_sys->p_context->skip_frame; switch( var_CreateGetInteger( p_dec, "avcodec-skip-idct" ) ) { case -1: p_sys->p_context->skip_idct = AVDISCARD_NONE; break; case 0: p_sys->p_context->skip_idct = AVDISCARD_DEFAULT; break; case 1: p_sys->p_context->skip_idct = AVDISCARD_NONREF; break; case 2: p_sys->p_context->skip_idct = AVDISCARD_NONKEY; break; case 3: p_sys->p_context->skip_idct = AVDISCARD_ALL; break; default: p_sys->p_context->skip_idct = AVDISCARD_NONE; break; } p_sys->i_skip_idct = p_sys->p_context->skip_idct; /* ***** libavcodec direct rendering ***** */ p_sys->b_direct_rendering = false; p_sys->i_direct_rendering_used = -1; if( var_CreateGetBool( p_dec, "avcodec-dr" ) && (p_sys->p_codec->capabilities & CODEC_CAP_DR1) && /* No idea why ... but this fixes flickering on some TSCC streams */ p_sys->i_codec_id != AV_CODEC_ID_TSCC && p_sys->i_codec_id != AV_CODEC_ID_CSCD && p_sys->i_codec_id != AV_CODEC_ID_CINEPAK && !p_sys->p_context->debug_mv ) { /* Some codecs set pix_fmt only after the 1st frame has been decoded, * so we need to do another check in ffmpeg_GetFrameBuf() */ p_sys->b_direct_rendering = true; } /* libavcodec doesn't properly release old pictures when frames are skipped */ //if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = false; if( p_sys->b_direct_rendering ) { msg_Dbg( p_dec, "trying to use direct rendering" ); p_sys->p_context->flags |= CODEC_FLAG_EMU_EDGE; } else { msg_Dbg( p_dec, "direct rendering is disabled" ); } /* Always use our get_buffer wrapper so we can calculate the * PTS correctly */ p_sys->p_context->get_buffer = ffmpeg_GetFrameBuf; p_sys->p_context->reget_buffer = avcodec_default_reget_buffer; p_sys->p_context->release_buffer = ffmpeg_ReleaseFrameBuf; p_sys->p_context->opaque = p_dec; #ifdef HAVE_AVCODEC_MT int i_thread_count = var_InheritInteger( p_dec, "avcodec-threads" ); if( i_thread_count <= 0 ) { i_thread_count = vlc_GetCPUCount(); if( i_thread_count > 1 ) i_thread_count++; //FIXME: take in count the decoding time i_thread_count = __MIN( i_thread_count, 4 ); } i_thread_count = __MIN( i_thread_count, 16 ); msg_Dbg( p_dec, "allowing %d thread(s) for decoding", i_thread_count ); p_sys->p_context->thread_count = i_thread_count; if( i_codec_id == AV_CODEC_ID_MPEG4 ) p_sys->p_context->thread_count = 1; p_sys->p_context->thread_safe_callbacks = true; #endif char *hw = var_CreateGetString( p_dec, "avcodec-hw" ); /* FIXME */ if( (hw == NULL || strcasecmp( hw, "none" )) && (i_codec_id == AV_CODEC_ID_MPEG1VIDEO || i_codec_id == AV_CODEC_ID_MPEG2VIDEO || i_codec_id == AV_CODEC_ID_MPEG4 || i_codec_id == AV_CODEC_ID_H263 || i_codec_id == AV_CODEC_ID_H264 || i_codec_id == AV_CODEC_ID_VC1 || i_codec_id == AV_CODEC_ID_WMV3) ) { #if defined(HAVE_AVCODEC_MT) //&& LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 1, 0) if( p_sys->p_context->thread_type & FF_THREAD_FRAME ) { msg_Warn( p_dec, "threaded frame decoding is not compatible with avcodec-hw, disabled" ); p_sys->p_context->thread_type &= ~FF_THREAD_FRAME; } if( ( p_sys->p_context->thread_type & FF_THREAD_SLICE ) && ( i_codec_id == AV_CODEC_ID_MPEG1VIDEO || i_codec_id == AV_CODEC_ID_MPEG2VIDEO ) ) { msg_Warn( p_dec, "threaded slice decoding is not compatible with avcodec-hw, disabled" ); p_sys->p_context->thread_type &= ~FF_THREAD_SLICE; } #endif p_sys->p_context->get_format = ffmpeg_GetFormat; } free( hw ); #ifdef HAVE_AVCODEC_MT if( p_sys->p_context->thread_type & FF_THREAD_FRAME ) p_dec->i_extra_picture_buffers = 2 * p_sys->p_context->thread_count; #endif /* ***** misc init ***** */ p_sys->i_pts = VLC_TS_INVALID; p_sys->b_has_b_frames = false; p_sys->b_first_frame = true; p_sys->b_flush = false; p_sys->i_late_frames = 0; /* Set output properties */ p_dec->fmt_out.i_cat = VIDEO_ES; if( GetVlcChroma( &p_dec->fmt_out.video, p_context->pix_fmt ) != VLC_SUCCESS ) { /* we are doomed. but not really, because most codecs set their pix_fmt later on */ p_dec->fmt_out.i_codec = VLC_CODEC_I420; } p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma; #if LIBAVCODEC_VERSION_MAJOR < 54 /* Setup palette */ memset( &p_sys->palette, 0, sizeof(p_sys->palette) ); if( p_dec->fmt_in.video.p_palette ) { p_sys->palette.palette_changed = 1; for( int i = 0; i < __MIN( AVPALETTE_COUNT, p_dec->fmt_in.video.p_palette->i_entries ); i++ ) { union { uint32_t u; uint8_t a[4]; } c; c.a[0] = p_dec->fmt_in.video.p_palette->palette[i][0]; c.a[1] = p_dec->fmt_in.video.p_palette->palette[i][1]; c.a[2] = p_dec->fmt_in.video.p_palette->palette[i][2]; c.a[3] = p_dec->fmt_in.video.p_palette->palette[i][3]; p_sys->palette.palette[i] = c.u; } p_sys->p_context->palctrl = &p_sys->palette; p_dec->fmt_out.video.p_palette = malloc( sizeof(video_palette_t) ); if( p_dec->fmt_out.video.p_palette ) *p_dec->fmt_out.video.p_palette = *p_dec->fmt_in.video.p_palette; } else if( p_sys->i_codec_id != CODEC_ID_MSVIDEO1 && p_sys->i_codec_id != CODEC_ID_CINEPAK ) { p_sys->p_context->palctrl = &p_sys->palette; } #else # warning FIXME #endif /* ***** init this codec with special data ***** */ ffmpeg_InitCodec( p_dec ); /* ***** Open the codec ***** */ if( ffmpeg_OpenCodec( p_dec ) < 0 ) { msg_Err( p_dec, "cannot open codec (%s)", p_sys->psz_namecodec ); av_free( p_sys->p_ff_pic ); vlc_sem_destroy( &p_sys->sem_mt ); free( p_sys ); return VLC_EGENERIC; } return VLC_SUCCESS; }
/***************************************************************************** * Open *****************************************************************************/ static int Open( vlc_object_t *p_this ) { sout_stream_t *p_stream = (sout_stream_t *)p_this; sout_stream_sys_t *p_sys; vlc_value_t val; config_ChainParse( p_stream, CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg ); p_sys = malloc( sizeof( sout_stream_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; p_stream->p_sys = p_sys; p_sys->b_inited = false; p_sys->psz_id = var_CreateGetString( p_stream, CFG_PREFIX "id" ); p_sys->i_height = var_CreateGetIntegerCommand( p_stream, CFG_PREFIX "height" ); var_AddCallback( p_stream, CFG_PREFIX "height", HeightCallback, p_stream ); p_sys->i_width = var_CreateGetIntegerCommand( p_stream, CFG_PREFIX "width" ); var_AddCallback( p_stream, CFG_PREFIX "width", WidthCallback, p_stream ); var_Get( p_stream, CFG_PREFIX "sar", &val ); if( val.psz_string ) { char *psz_parser = strchr( val.psz_string, ':' ); if( psz_parser ) { *psz_parser++ = '\0'; p_sys->i_sar_num = atoi( val.psz_string ); p_sys->i_sar_den = atoi( psz_parser ); vlc_ureduce( &p_sys->i_sar_num, &p_sys->i_sar_den, p_sys->i_sar_num, p_sys->i_sar_den, 0 ); } else { msg_Warn( p_stream, "bad aspect ratio %s", val.psz_string ); p_sys->i_sar_num = p_sys->i_sar_den = 1; } free( val.psz_string ); } else { p_sys->i_sar_num = p_sys->i_sar_den = 1; } p_sys->i_chroma = 0; val.psz_string = var_GetNonEmptyString( p_stream, CFG_PREFIX "chroma" ); if( val.psz_string && strlen( val.psz_string ) >= 4 ) { memcpy( &p_sys->i_chroma, val.psz_string, 4 ); msg_Dbg( p_stream, "Forcing image chroma to 0x%.8x (%4.4s)", p_sys->i_chroma, (char*)&p_sys->i_chroma ); } free( val.psz_string ); #define INT_COMMAND( a ) do { \ var_Create( p_stream, CFG_PREFIX #a, \ VLC_VAR_INTEGER | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND ); \ var_AddCallback( p_stream, CFG_PREFIX #a, a ## Callback, \ p_stream ); } while(0) INT_COMMAND( alpha ); INT_COMMAND( x ); INT_COMMAND( y ); #undef INT_COMMAND p_stream->pf_add = Add; p_stream->pf_del = Del; p_stream->pf_send = Send; p_stream->pace_nocontrol = true; return VLC_SUCCESS; }
/***************************************************************************** * CreateFiler: allocate mosaic video filter *****************************************************************************/ static int CreateFilter( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys; libvlc_t *p_libvlc = p_filter->p_libvlc; char *psz_order; int i_index; vlc_value_t val; /* The mosaic thread is more important than the decoder threads */ vlc_thread_set_priority( p_this, VLC_THREAD_PRIORITY_OUTPUT ); /* Allocate structure */ p_sys = p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); if( p_sys == NULL ) { msg_Err( p_filter, "out of memory" ); return VLC_ENOMEM; } p_filter->pf_sub_filter = Filter; p_sys->p_pic = NULL; vlc_mutex_init( p_filter, &p_sys->lock ); vlc_mutex_lock( &p_sys->lock ); var_Get( p_libvlc, "mosaic-lock", &val ); p_sys->p_lock = val.p_address; #define GET_VAR( name, min, max ) \ p_sys->i_##name = __MIN( max, __MAX( min, \ var_CreateGetInteger( p_filter, "mosaic-" #name ) ) ); \ var_Destroy( p_filter, "mosaic-" #name ); \ var_Create( p_libvlc, "mosaic-" #name, VLC_VAR_INTEGER ); \ var_SetInteger( p_libvlc, "mosaic-" #name, p_sys->i_##name ); \ var_AddCallback( p_libvlc, "mosaic-" #name, MosaicCallback, p_sys ); GET_VAR( width, 0, INT_MAX ); GET_VAR( height, 0, INT_MAX ); GET_VAR( xoffset, 0, INT_MAX ); GET_VAR( yoffset, 0, INT_MAX ); p_sys->i_align = __MIN( 10, __MAX( 0, var_CreateGetInteger( p_filter, "mosaic-align" ) ) ); if( p_sys->i_align == 3 || p_sys->i_align == 7 ) p_sys->i_align = 5; var_Destroy( p_filter, "mosaic-align" ); var_Create( p_libvlc, "mosaic-align", VLC_VAR_INTEGER ); var_SetInteger( p_libvlc, "mosaic-align", p_sys->i_align ); var_AddCallback( p_libvlc, "mosaic-align", MosaicCallback, p_sys ); GET_VAR( borderw, 0, INT_MAX ); GET_VAR( borderh, 0, INT_MAX ); GET_VAR( rows, 1, INT_MAX ); GET_VAR( cols, 1, INT_MAX ); GET_VAR( alpha, 0, 255 ); GET_VAR( position, 0, 1 ); GET_VAR( delay, 100, INT_MAX ); p_sys->i_delay *= 1000; p_sys->b_ar = var_CreateGetBool( p_filter, "mosaic-keep-aspect-ratio" ); var_Destroy( p_filter, "mosaic-keep-aspect-ratio" ); var_Create( p_libvlc, "mosaic-keep-aspect-ratio", VLC_VAR_INTEGER ); var_SetBool( p_libvlc, "mosaic-keep-aspect-ratio", p_sys->b_ar ); var_AddCallback( p_libvlc, "mosaic-keep-aspect-ratio", MosaicCallback, p_sys ); p_sys->b_keep = var_CreateGetBool( p_filter, "mosaic-keep-picture" ); if ( !p_sys->b_keep ) { p_sys->p_image = image_HandlerCreate( p_filter ); } p_sys->i_order_length = 0; p_sys->ppsz_order = NULL; psz_order = var_CreateGetString( p_filter, "mosaic-order" ); if( psz_order[0] != 0 ) { char *psz_end = NULL; i_index = 0; do { psz_end = strchr( psz_order, ',' ); i_index++; p_sys->ppsz_order = realloc( p_sys->ppsz_order, i_index * sizeof(char *) ); p_sys->ppsz_order[i_index - 1] = strndup( psz_order, psz_end - psz_order ); psz_order = psz_end+1; } while( NULL != psz_end ); p_sys->i_order_length = i_index; } /* Bluescreen specific stuff */ GET_VAR( bsu, 0x00, 0xff ); GET_VAR( bsv, 0x00, 0xff ); GET_VAR( bsut, 0x00, 0xff ); GET_VAR( bsvt, 0x00, 0xff ); p_sys->b_bs = var_CreateGetBool( p_filter, "mosaic-bs" ); var_Destroy( p_filter, "mosaic-bs" ); var_Create( p_libvlc, "mosaic-bs", VLC_VAR_INTEGER ); var_SetBool( p_libvlc, "mosaic-bs", p_sys->b_bs ); var_AddCallback( p_libvlc, "mosaic-bs", MosaicCallback, p_sys ); if( p_sys->b_bs && p_sys->b_keep ) { msg_Warn( p_filter, "mosaic-keep-picture needs to be disabled for" " bluescreen to work" ); } vlc_mutex_unlock( &p_sys->lock ); return VLC_SUCCESS; }
/** * Create and start an interface. * * @param p_this the calling vlc_object_t * @param chain configuration chain string * @return VLC_SUCCESS or an error code */ int intf_Create( vlc_object_t *p_this, const char *chain ) { libvlc_int_t *p_libvlc = p_this->p_libvlc; intf_thread_t * p_intf; /* Allocate structure */ p_intf = vlc_custom_create( p_libvlc, sizeof( *p_intf ), "interface" ); if( !p_intf ) return VLC_ENOMEM; /* Variable used for interface spawning */ vlc_value_t val, text; var_Create( p_intf, "intf-add", VLC_VAR_STRING | VLC_VAR_HASCHOICE | VLC_VAR_ISCOMMAND ); text.psz_string = _("Add Interface"); var_Change( p_intf, "intf-add", VLC_VAR_SETTEXT, &text, NULL ); #if !defined(WIN32) && defined(HAVE_ISATTY) if( isatty( 0 ) ) #endif { val.psz_string = (char *)"rc"; text.psz_string = (char *)_("Console"); var_Change( p_intf, "intf-add", VLC_VAR_ADDCHOICE, &val, &text ); } val.psz_string = (char *)"telnet"; text.psz_string = (char *)_("Telnet"); var_Change( p_intf, "intf-add", VLC_VAR_ADDCHOICE, &val, &text ); val.psz_string = (char *)"http"; text.psz_string = (char *)_("Web"); var_Change( p_intf, "intf-add", VLC_VAR_ADDCHOICE, &val, &text ); val.psz_string = (char *)"logger"; text.psz_string = (char *)_("Debug logging"); var_Change( p_intf, "intf-add", VLC_VAR_ADDCHOICE, &val, &text ); val.psz_string = (char *)"gestures"; text.psz_string = (char *)_("Mouse Gestures"); var_Change( p_intf, "intf-add", VLC_VAR_ADDCHOICE, &val, &text ); var_AddCallback( p_intf, "intf-add", AddIntfCallback, NULL ); /* Attach interface to LibVLC */ #if defined( __APPLE__ ) p_intf->b_should_run_on_first_thread = false; #endif /* Choose the best module */ p_intf->p_cfg = NULL; char *psz_parser = *chain == '$' ? var_CreateGetString(p_intf, chain+1) : strdup( chain ); char *module; char *psz_tmp = config_ChainCreate( &module, &p_intf->p_cfg, psz_parser ); free( psz_tmp ); free( psz_parser ); p_intf->p_module = module_need( p_intf, "interface", module, true ); free(module); if( p_intf->p_module == NULL ) { msg_Err( p_intf, "no suitable interface module" ); goto error; } vlc_mutex_lock( &lock ); #if defined( __APPLE__ ) /* Hack to get Mac OS X Cocoa runtime running * (it needs access to the main thread) */ if( p_intf->b_should_run_on_first_thread ) { if( vlc_clone( &p_intf->thread, MonitorLibVLCDeath, p_intf, VLC_THREAD_PRIORITY_LOW ) ) { msg_Err( p_intf, "cannot spawn libvlc death monitoring thread" ); vlc_mutex_unlock( &lock ); goto error; } assert( p_intf->pf_run ); p_intf->pf_run( p_intf ); /* It is monitoring libvlc, not the p_intf */ vlc_object_kill( p_intf->p_libvlc ); vlc_join( p_intf->thread, NULL ); } else #endif /* Run the interface in a separate thread */ if( p_intf->pf_run && vlc_clone( &p_intf->thread, RunInterface, p_intf, VLC_THREAD_PRIORITY_LOW ) ) { msg_Err( p_intf, "cannot spawn interface thread" ); vlc_mutex_unlock( &lock ); goto error; } p_intf->p_next = libvlc_priv( p_libvlc )->p_intf; libvlc_priv( p_libvlc )->p_intf = p_intf; vlc_mutex_unlock( &lock ); return VLC_SUCCESS; error: if( p_intf->p_module ) module_unneed( p_intf, p_intf->p_module ); config_ChainDestroy( p_intf->p_cfg ); vlc_object_release( p_intf ); return VLC_EGENERIC; }
/***************************************************************************** * Open: initialize and create stuff *****************************************************************************/ static int Open( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; intf_sys_t *p_sys; char *psz_mode; CONSOLE_INTRO_MSG; msg_Info( p_intf, "using logger." ); /* Allocate instance and initialize some members */ p_sys = p_intf->p_sys = (intf_sys_t *)malloc( sizeof( intf_sys_t ) ); if( p_sys == NULL ) return VLC_ENOMEM; p_sys->msg.p_intf = p_intf; p_sys->msg.i_mode = MODE_TEXT; psz_mode = var_CreateGetString( p_intf, "logmode" ); if( psz_mode ) { if( !strcmp( psz_mode, "text" ) ) ; else if( !strcmp( psz_mode, "html" ) ) { p_sys->msg.i_mode = MODE_HTML; } #ifdef HAVE_SYSLOG_H else if( !strcmp( psz_mode, "syslog" ) ) { p_sys->msg.i_mode = MODE_SYSLOG; } #endif else { msg_Warn( p_intf, "invalid log mode `%s', using `text'", psz_mode ); p_sys->msg.i_mode = MODE_TEXT; } free( psz_mode ); } else { msg_Warn( p_intf, "no log mode specified, using `text'" ); } if( p_sys->msg.i_mode != MODE_SYSLOG ) { char *psz_file = config_GetPsz( p_intf, "logfile" ); if( !psz_file ) { #ifdef __APPLE__ char *home = config_GetUserDir(VLC_DOCUMENTS_DIR); if( home == NULL || asprintf( &psz_file, "%s/"LOG_DIR"/%s", home, (p_sys->msg.i_mode == MODE_HTML) ? LOG_FILE_HTML : LOG_FILE_TEXT ) == -1 ) psz_file = NULL; free(home); #else switch( p_sys->msg.i_mode ) { case MODE_HTML: psz_file = strdup( LOG_FILE_HTML ); break; case MODE_TEXT: default: psz_file = strdup( LOG_FILE_TEXT ); break; } #endif msg_Warn( p_intf, "no log filename provided, using `%s'", psz_file ); } /* Open the log file and remove any buffering for the stream */ msg_Dbg( p_intf, "opening logfile `%s'", psz_file ); p_sys->msg.p_file = utf8_fopen( psz_file, "at" ); if( p_sys->msg.p_file == NULL ) { msg_Err( p_intf, "error opening logfile `%s'", psz_file ); free( p_sys ); free( psz_file ); return -1; } setvbuf( p_sys->msg.p_file, NULL, _IONBF, 0 ); free( psz_file ); switch( p_sys->msg.i_mode ) { case MODE_HTML: fputs( HTML_HEADER, p_sys->msg.p_file ); break; case MODE_TEXT: default: fputs( TEXT_HEADER, p_sys->msg.p_file ); break; } } else { p_sys->msg.p_file = NULL; #ifdef HAVE_SYSLOG_H int i_facility; char *psz_facility = var_CreateGetString( p_intf, "syslog-facility" ); if( psz_facility ) { bool b_valid = 0; for( size_t i = 0; i < fac_entries; ++i ) { if( !strcmp( psz_facility, fac_name[i] ) ) { i_facility = fac_number[i]; b_valid = 1; break; } } if( !b_valid ) { msg_Warn( p_intf, "invalid syslog facility `%s', using `%s'", psz_facility, fac_name[0] ); i_facility = fac_number[0]; } free( psz_facility ); } else { msg_Warn( p_intf, "no syslog facility specified, using `%s'", fac_name[0] ); i_facility = fac_number[0]; } openlog( "vlc", LOG_PID|LOG_NDELAY, i_facility ); #endif } p_sys->p_sub = msg_Subscribe( p_intf->p_libvlc, Overflow, &p_sys->msg ); return 0; }
/***************************************************************************** * Open: initialize and create stuff *****************************************************************************/ int Open_LuaSD( vlc_object_t *p_this ) { services_discovery_t *p_sd = ( services_discovery_t * )p_this; services_discovery_sys_t *p_sys; lua_State *L = NULL; char *psz_name = NULL; if( !strcmp(p_sd->psz_name, "lua")) { // We want to load the module name "lua" // This module can be used to load lua script not registered // as builtin lua SD modules. config_ChainParse( p_sd, "lua-", ppsz_sd_options, p_sd->p_cfg ); psz_name = var_CreateGetString( p_sd, "lua-sd" ); } else { // We are loading a builtin lua sd module. psz_name = strdup(p_sd->psz_name); } if( !( p_sys = malloc( sizeof( services_discovery_sys_t ) ) ) ) { free( psz_name ); return VLC_ENOMEM; } p_sd->p_sys = p_sys; p_sys->psz_filename = vlclua_find_file( p_this, "sd", psz_name ); if( !p_sys->psz_filename ) { msg_Err( p_sd, "Couldn't find lua services discovery script \"%s\".", psz_name ); free( psz_name ); goto error; } free( psz_name ); L = luaL_newstate(); if( !L ) { msg_Err( p_sd, "Could not create new Lua State" ); goto error; } vlclua_set_this( L, p_sd ); luaL_openlibs( L ); luaL_register( L, "vlc", p_reg ); luaopen_input( L ); luaopen_msg( L ); luaopen_misc( L ); luaopen_net( L ); luaopen_object( L ); luaopen_sd( L ); luaopen_strings( L ); luaopen_variables( L ); luaopen_stream( L ); luaopen_gettext( L ); luaopen_xml( L ); luaopen_md5( L ); lua_pop( L, 1 ); if( vlclua_add_modules_path( p_sd, L, p_sys->psz_filename ) ) { msg_Warn( p_sd, "Error while setting the module search path for %s", p_sys->psz_filename ); goto error; } if( luaL_dofile( L, p_sys->psz_filename ) ) { msg_Err( p_sd, "Error loading script %s: %s", p_sys->psz_filename, lua_tostring( L, lua_gettop( L ) ) ); lua_pop( L, 1 ); goto error; } p_sys->L = L; if( vlc_clone (&p_sd->p_sys->thread, Run, p_sd, VLC_THREAD_PRIORITY_LOW) ) { goto error; } return VLC_SUCCESS; error: if( L ) lua_close( L ); free( p_sys->psz_filename ); free( p_sys ); return VLC_EGENERIC; }
/***************************************************************************** * Open: initializes raw audio demuxer *****************************************************************************/ static int Open( vlc_object_t * p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys; p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; char *psz_fourcc = var_CreateGetString( p_demux, "rawaud-fourcc" ); es_format_Init( &p_sys->fmt, AUDIO_ES, vlc_fourcc_GetCodecFromString( AUDIO_ES, psz_fourcc ) ); free( psz_fourcc ); if( !p_sys->fmt.i_codec ) { msg_Err( p_demux, "rawaud-fourcc must be a 4 character string"); es_format_Clean( &p_sys->fmt ); free( p_sys ); return VLC_EGENERIC; } // get the bits per sample ratio based on codec switch( p_sys->fmt.i_codec ) { case VLC_CODEC_FL64: p_sys->fmt.audio.i_bitspersample = 64; break; case VLC_CODEC_FL32: case VLC_CODEC_S32L: case VLC_CODEC_S32B: p_sys->fmt.audio.i_bitspersample = 32; break; case VLC_CODEC_S24L: case VLC_CODEC_S24B: p_sys->fmt.audio.i_bitspersample = 24; break; case VLC_CODEC_S16L: case VLC_CODEC_S16B: p_sys->fmt.audio.i_bitspersample = 16; break; case VLC_CODEC_S8: case VLC_CODEC_U8: p_sys->fmt.audio.i_bitspersample = 8; break; default: msg_Err( p_demux, "unknown fourcc format %4.4s", (char *)&p_sys->fmt.i_codec); es_format_Clean( &p_sys->fmt ); free( p_sys ); return VLC_EGENERIC; } p_sys->fmt.psz_language = var_CreateGetString( p_demux, "rawaud-lang" ); p_sys->fmt.audio.i_channels = var_CreateGetInteger( p_demux, "rawaud-channels" ); p_sys->fmt.audio.i_rate = var_CreateGetInteger( p_demux, "rawaud-samplerate" ); if( p_sys->fmt.audio.i_rate == 0 || p_sys->fmt.audio.i_rate > 384000 ) { msg_Err( p_demux, "invalid sample rate"); es_format_Clean( &p_sys->fmt ); free( p_sys ); return VLC_EGENERIC; } if( p_sys->fmt.audio.i_channels == 0 || p_sys->fmt.audio.i_channels > 32 ) { msg_Err( p_demux, "invalid number of channels"); es_format_Clean( &p_sys->fmt ); free( p_sys ); return VLC_EGENERIC; } p_sys->fmt.i_bitrate = p_sys->fmt.audio.i_rate * p_sys->fmt.audio.i_channels * p_sys->fmt.audio.i_bitspersample; if( p_sys->fmt.i_bitrate > 50000000) { msg_Err( p_demux, "invalid bitrate"); es_format_Clean( &p_sys->fmt ); free( p_sys ); return VLC_EGENERIC; } msg_Dbg( p_demux, "format initialized: channels=%d , samplerate=%d Hz, fourcc=%4.4s, bits per sample = %d, bitrate = %d bit/s", p_sys->fmt.audio.i_channels, p_sys->fmt.audio.i_rate, (char*)&p_sys->fmt.i_codec, p_sys->fmt.audio.i_bitspersample, p_sys->fmt.i_bitrate); /* add the es */ p_sys->p_es = es_out_Add( p_demux->out, &p_sys->fmt ); msg_Dbg( p_demux, "elementary stream added"); /* initialize timing */ date_Init( &p_sys->pts, p_sys->fmt.audio.i_rate, 1 ); date_Set( &p_sys->pts, VLC_TICK_0 ); /* calculate 50ms frame size/time */ p_sys->i_frame_samples = __MAX( p_sys->fmt.audio.i_rate / 20, 1 ); p_sys->i_seek_step = p_sys->fmt.audio.i_channels * ( (p_sys->fmt.audio.i_bitspersample + 7) / 8 ); p_sys->i_frame_size = p_sys->i_frame_samples * p_sys->i_seek_step; msg_Dbg( p_demux, "frame size is %d bytes ", p_sys->i_frame_size); p_demux->pf_demux = Demux; p_demux->pf_control = Control; return VLC_SUCCESS; }
/***************************************************************************** * OpenDecoder: probe the decoder and return score *****************************************************************************/ static int OpenDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t*) p_this; unsigned i_codec_id; int i_cat, i_result; const char *psz_namecodec; AVCodecContext *p_context = NULL; AVCodec *p_codec = NULL; /* *** determine codec type *** */ if( !GetFfmpegCodec( p_dec->fmt_in.i_codec, &i_cat, &i_codec_id, &psz_namecodec ) || i_cat == UNKNOWN_ES ) { return VLC_EGENERIC; } /* Initialization must be done before avcodec_find_decoder() */ vlc_init_avcodec(p_this); /* *** ask ffmpeg for a decoder *** */ char *psz_decoder = var_CreateGetString( p_this, "avcodec-codec" ); if( psz_decoder && *psz_decoder ) { p_codec = avcodec_find_decoder_by_name( psz_decoder ); if( !p_codec ) msg_Err( p_this, "Decoder `%s' not found", psz_decoder ); else if( p_codec->id != i_codec_id ) { msg_Err( p_this, "Decoder `%s' can't handle %4.4s", psz_decoder, (char*)&p_dec->fmt_in.i_codec ); p_codec = NULL; } } free( psz_decoder ); if( !p_codec ) p_codec = avcodec_find_decoder( i_codec_id ); if( !p_codec ) { msg_Dbg( p_dec, "codec not found (%s)", psz_namecodec ); return VLC_EGENERIC; } /* *** get a p_context *** */ p_context = avcodec_alloc_context3(p_codec); if( !p_context ) return VLC_ENOMEM; p_context->debug = var_InheritInteger( p_dec, "avcodec-debug" ); p_context->opaque = (void *)p_this; p_dec->b_need_packetized = true; switch( i_cat ) { case VIDEO_ES: p_dec->pf_decode_video = DecodeVideo; i_result = InitVideoDec ( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; case AUDIO_ES: p_dec->pf_decode_audio = DecodeAudio; i_result = InitAudioDec ( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; case SPU_ES: p_dec->pf_decode_sub = DecodeSubtitle; i_result = InitSubtitleDec( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; default: i_result = VLC_EGENERIC; } if( i_result == VLC_SUCCESS ) { p_dec->p_sys->i_cat = i_cat; if( p_context->profile != FF_PROFILE_UNKNOWN) p_dec->fmt_in.i_profile = p_context->profile; if( p_context->level != FF_LEVEL_UNKNOWN) p_dec->fmt_in.i_level = p_context->level; } return i_result; }
/***************************************************************************** * Open: *****************************************************************************/ static int Open( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys; char *psz_name; dvd_reader_t *p_dvdread; ifo_handle_t *p_vmg_file; if( !p_demux->psz_file || !*p_demux->psz_file ) { /* Only when selected */ if( !p_demux->psz_access || !*p_demux->psz_access ) return VLC_EGENERIC; psz_name = var_CreateGetString( p_this, "dvd" ); if( !psz_name ) { psz_name = strdup(""); } } else psz_name = ToLocaleDup( p_demux->psz_file ); #ifdef WIN32 if( psz_name[0] && psz_name[1] == ':' && psz_name[2] == '\\' && psz_name[3] == '\0' ) psz_name[2] = '\0'; #endif /* Open dvdread */ if( !(p_dvdread = DVDOpen( psz_name )) ) { msg_Err( p_demux, "DVDRead cannot open source: %s", psz_name ); dialog_Fatal( p_demux, _("Playback failure"), _("DVDRead could not open the disc \"%s\"."), psz_name ); free( psz_name ); return VLC_EGENERIC; } free( psz_name ); /* Ifo allocation & initialisation */ if( !( p_vmg_file = ifoOpen( p_dvdread, 0 ) ) ) { msg_Warn( p_demux, "cannot open VMG info" ); return VLC_EGENERIC; } msg_Dbg( p_demux, "VMG opened" ); /* Fill p_demux field */ DEMUX_INIT_COMMON(); p_sys = p_demux->p_sys; ps_track_init( p_sys->tk ); p_sys->i_sar_num = 0; p_sys->i_sar_den = 0; p_sys->i_title_cur_time = (mtime_t) 0; p_sys->i_cell_cur_time = (mtime_t) 0; p_sys->i_cell_duration = (mtime_t) 0; p_sys->p_dvdread = p_dvdread; p_sys->p_vmg_file = p_vmg_file; p_sys->p_title = NULL; p_sys->p_vts_file = NULL; p_sys->i_title = p_sys->i_chapter = -1; p_sys->i_mux_rate = 0; p_sys->i_angle = var_CreateGetInteger( p_demux, "dvdread-angle" ); if( p_sys->i_angle <= 0 ) p_sys->i_angle = 1; DemuxTitles( p_demux, &p_sys->i_angle ); if( DvdReadSetArea( p_demux, 0, 0, p_sys->i_angle ) != VLC_SUCCESS ) { Close( p_this ); msg_Err( p_demux, "DvdReadSetArea(0,0,%i) failed (can't decrypt DVD?)", p_sys->i_angle ); return VLC_EGENERIC; } /* Update default_pts to a suitable value for dvdread access */ var_Create( p_demux, "dvdread-caching", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); return VLC_SUCCESS; }
int Open_LuaIntf( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t*)p_this; intf_sys_t *p_sys; lua_State *L; config_ChainParse( p_intf, "lua-", ppsz_intf_options, p_intf->p_cfg ); char *psz_name = NULL; if( !p_intf->psz_intf || !*p_intf->psz_intf ) psz_name = strdup( "rc" ); else psz_name = GetModuleName( p_intf ); if( !psz_name ) psz_name = strdup( "dummy" ); char *psz_config; bool b_config_set = false; p_intf->p_sys = (intf_sys_t*)malloc( sizeof(intf_sys_t) ); if( !p_intf->p_sys ) { free( psz_name ); return VLC_ENOMEM; } p_sys = p_intf->p_sys; p_sys->psz_filename = vlclua_find_file( p_this, "intf", psz_name ); if( !p_sys->psz_filename ) { msg_Err( p_intf, "Couldn't find lua interface script \"%s\".", psz_name ); goto error; } msg_Dbg( p_intf, "Found lua interface script: %s", p_sys->psz_filename ); L = luaL_newstate(); if( !L ) { msg_Err( p_intf, "Could not create new Lua State" ); goto error; } vlclua_set_this( L, p_intf ); vlclua_set_intf( L, p_sys ); luaL_openlibs( L ); /* register our functions */ luaL_register( L, "vlc", p_reg ); /* register submodules */ luaopen_acl( L ); luaopen_config( L ); luaopen_volume( L ); luaopen_httpd( L ); luaopen_input( L ); luaopen_msg( L ); luaopen_misc( L ); luaopen_net( L ); luaopen_object( L ); luaopen_osd( L ); luaopen_playlist( L ); luaopen_sd( L ); luaopen_stream( L ); luaopen_strings( L ); luaopen_variables( L ); luaopen_video( L ); luaopen_vlm( L ); luaopen_volume( L ); luaopen_gettext( L ); luaopen_xml( L ); luaopen_md5( L ); /* clean up */ lua_pop( L, 1 ); /* Setup the module search path */ if( vlclua_add_modules_path( p_intf, L, p_sys->psz_filename ) ) { msg_Warn( p_intf, "Error while setting the module search path for %s", p_sys->psz_filename ); lua_close( L ); goto error; } /* * Get the lua-config string. * If the string is empty, try with the old http-* or telnet-* options * and build the right configuration line */ psz_config = var_CreateGetNonEmptyString( p_intf, "lua-config" ); if( !psz_config ) { if( !strcmp( psz_name, "http" ) ) { char *psz_http_host = var_CreateGetNonEmptyString( p_intf, "http-host" ); char *psz_http_src = var_CreateGetNonEmptyString( p_intf, "http-src" ); bool b_http_index = var_CreateGetBool( p_intf, "http-index" ); if( psz_http_host ) { char *psz_esc = config_StringEscape( psz_http_host ); asprintf( &psz_config, "http={host='%s'", psz_esc ); free( psz_esc ); free( psz_http_host ); } if( psz_http_src ) { char *psz_esc = config_StringEscape( psz_http_src ); if( psz_config ) { char *psz_tmp; asprintf( &psz_tmp, "%s,dir='%s'", psz_config, psz_esc ); free( psz_config ); psz_config = psz_tmp; } else asprintf( &psz_config, "http={dir='%s'", psz_esc ); free( psz_esc ); free( psz_http_src ); } if( psz_config ) { char *psz_tmp; asprintf( &psz_tmp, "%s,no_index=%s}", psz_config, b_http_index ? "true" : "false" ); free( psz_config ); psz_config = psz_tmp; } else asprintf( &psz_config, "http={no_index=%s}", b_http_index ? "true" : "false" ); } else if( !strcmp( psz_name, "telnet" ) ) { char *psz_telnet_host = var_CreateGetString( p_intf, "telnet-host" ); int i_telnet_port = var_CreateGetInteger( p_intf, "telnet-port" ); char *psz_telnet_passwd = var_CreateGetString( p_intf, "telnet-password" ); char *psz_esc_host = config_StringEscape( psz_telnet_host ); char *psz_esc_passwd = config_StringEscape( psz_telnet_passwd ); asprintf( &psz_config, "telnet={host='%s:%d',password='******'}", psz_esc_host ? psz_esc_host : "", i_telnet_port, psz_esc_passwd ); free( psz_esc_host ); free( psz_esc_passwd ); free( psz_telnet_passwd ); free( psz_telnet_host ); } } if( psz_config ) { char *psz_buffer; if( asprintf( &psz_buffer, "config={%s}", psz_config ) != -1 ) { msg_Dbg( p_intf, "Setting config variable: %s", psz_buffer ); if( luaL_dostring( L, psz_buffer ) == 1 ) msg_Err( p_intf, "Error while parsing \"lua-config\"." ); free( psz_buffer ); lua_getglobal( L, "config" ); if( lua_istable( L, -1 ) ) { lua_getfield( L, -1, psz_name ); if( lua_istable( L, -1 ) ) { lua_setglobal( L, "config" ); b_config_set = true; } } } free( psz_config ); } if( b_config_set == false ) { lua_newtable( L ); lua_setglobal( L, "config" ); } p_sys->L = L; p_intf->psz_header = psz_name; /* ^^ Do I need to clean that up myself in Close_LuaIntf? */ vlc_mutex_init( &p_sys->lock ); vlc_cond_init( &p_sys->wait ); p_sys->exiting = false; if( vlc_clone( &p_sys->thread, Run, p_intf, VLC_THREAD_PRIORITY_LOW ) ) { p_intf->psz_header = NULL; vlc_cond_destroy( &p_sys->wait ); vlc_mutex_destroy( &p_sys->lock ); lua_close( p_sys->L ); goto error; } return VLC_SUCCESS; error: free( p_sys->psz_filename ); free( p_sys ); free( psz_name ); return VLC_EGENERIC; }
/***************************************************************************** * OpenDecoder: probe the decoder and return score *****************************************************************************/ static int OpenDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t*) p_this; int i_cat, i_codec_id, i_result; const char *psz_namecodec; AVCodecContext *p_context = NULL; AVCodec *p_codec = NULL; /* *** determine codec type *** */ if( !GetFfmpegCodec( p_dec->fmt_in.i_codec, &i_cat, &i_codec_id, &psz_namecodec ) ) { return VLC_EGENERIC; } /* Initialization must be done before avcodec_find_decoder() */ vlc_init_avcodec(); /* *** ask ffmpeg for a decoder *** */ char *psz_decoder = var_CreateGetString( p_this, "avcodec-codec" ); if( psz_decoder && *psz_decoder ) { p_codec = avcodec_find_decoder_by_name( psz_decoder ); if( !p_codec ) msg_Err( p_this, "Decoder `%s' not found", psz_decoder ); else if( p_codec->id != i_codec_id ) { msg_Err( p_this, "Decoder `%s' can't handle %4.4s", psz_decoder, (char*)&p_dec->fmt_in.i_codec ); p_codec = NULL; } } free( psz_decoder ); if( !p_codec ) p_codec = avcodec_find_decoder( i_codec_id ); if( !p_codec ) { msg_Dbg( p_dec, "codec not found (%s)", psz_namecodec ); return VLC_EGENERIC; } /* *** get a p_context *** */ #if LIBAVCODEC_VERSION_MAJOR >= 54 p_context = avcodec_alloc_context3(p_codec); #else p_context = avcodec_alloc_context(); #endif if( !p_context ) return VLC_ENOMEM; p_context->debug = var_InheritInteger( p_dec, "avcodec-debug" ); p_context->opaque = (void *)p_this; /* Set CPU capabilities */ unsigned i_cpu = vlc_CPU(); p_context->dsp_mask = 0; if( !(i_cpu & CPU_CAPABILITY_MMX) ) { p_context->dsp_mask |= AV_CPU_FLAG_MMX; } if( !(i_cpu & CPU_CAPABILITY_MMXEXT) ) { p_context->dsp_mask |= AV_CPU_FLAG_MMX2; } if( !(i_cpu & CPU_CAPABILITY_3DNOW) ) { p_context->dsp_mask |= AV_CPU_FLAG_3DNOW; } if( !(i_cpu & CPU_CAPABILITY_SSE) ) { p_context->dsp_mask |= AV_CPU_FLAG_SSE; } if( !(i_cpu & CPU_CAPABILITY_SSE2) ) { p_context->dsp_mask |= AV_CPU_FLAG_SSE2; } #ifdef AV_CPU_FLAG_SSE3 if( !(i_cpu & CPU_CAPABILITY_SSE3) ) p_context->dsp_mask |= AV_CPU_FLAG_SSE3; #endif #ifdef AV_CPU_FLAG_SSSE3 if( !(i_cpu & CPU_CAPABILITY_SSSE3) ) p_context->dsp_mask |= AV_CPU_FLAG_SSSE3; #endif #ifdef AV_CPU_FLAG_SSE4 if( !(i_cpu & CPU_CAPABILITY_SSE4_1) ) p_context->dsp_mask |= AV_CPU_FLAG_SSE4; #endif #ifdef AV_CPU_FLAG_SSE42 if( !(i_cpu & CPU_CAPABILITY_SSE4_2) ) p_context->dsp_mask |= AV_CPU_FLAG_SSE42; #endif p_dec->b_need_packetized = true; switch( i_cat ) { case VIDEO_ES: p_dec->pf_decode_video = DecodeVideo; i_result = InitVideoDec ( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; case AUDIO_ES: p_dec->pf_decode_audio = DecodeAudio; i_result = InitAudioDec ( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; case SPU_ES: p_dec->pf_decode_sub = DecodeSubtitle; i_result = InitSubtitleDec( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; default: i_result = VLC_EGENERIC; } if( i_result == VLC_SUCCESS ) { p_dec->p_sys->i_cat = i_cat; if( p_context->profile != FF_PROFILE_UNKNOWN) p_dec->fmt_in.i_profile = p_context->profile; if( p_context->level != FF_LEVEL_UNKNOWN) p_dec->fmt_in.i_level = p_context->level; } return i_result; }
/***************************************************************************** * CreateFilter: Create the filter and open the definition file *****************************************************************************/ static int CreateFilter ( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys = NULL; msg_Dbg( p_filter, "Creating vnc osd filter..." ); p_filter->p_sys = p_sys = calloc( 1, sizeof(*p_sys) ); if( !p_filter->p_sys ) return VLC_ENOMEM; /* Populating struct */ vlc_mutex_init( &p_sys->lock ); p_sys->b_continue = true; p_sys->i_socket = -1; p_sys->p_pic = NULL; p_sys->psz_host = var_CreateGetString( p_this, RMTOSD_CFG "host" ); if( EMPTY_STR(p_sys->psz_host) ) { msg_Err( p_filter, "unable to get vnc host" ); goto error; } p_sys->psz_passwd = var_CreateGetString( p_this, RMTOSD_CFG "password" ); if( !p_sys->psz_passwd ) { msg_Err( p_filter, "unable to get vnc password" ); goto error; } p_sys->i_port = var_CreateGetIntegerCommand( p_this, RMTOSD_CFG "port" ); p_sys->i_alpha = var_CreateGetIntegerCommand( p_this, RMTOSD_CFG "alpha" ); /* in milliseconds, 0 disables polling, should not be lower than 100 */ p_sys->i_vnc_poll_interval = var_CreateGetIntegerCommand( p_this, RMTOSD_CFG "update" ); if ( p_sys->i_vnc_poll_interval < 100) { p_sys->i_vnc_poll_interval = 100; } for ( int i = 0; i < 256; i++ ) { p_sys->ar_color_table_yuv[i][0] = 255; p_sys->ar_color_table_yuv[i][1] = 255; p_sys->ar_color_table_yuv[i][2] = 255; p_sys->ar_color_table_yuv[i][3] = 255; } p_sys->b_vnc_poll = var_CreateGetBoolCommand( p_this, RMTOSD_CFG "vnc-polling" ); p_sys->b_vnc_mouse_events = var_CreateGetBoolCommand( p_this, RMTOSD_CFG "mouse-events" ); p_sys->b_vnc_key_events = var_CreateGetBoolCommand( p_this, RMTOSD_CFG "key-events" ); /* Keep track of OSD Events */ p_sys->b_need_update = false; /* Attach subpicture source callback */ p_filter->pf_sub_source = Filter; p_filter->pf_sub_mouse = MouseEvent; var_AddCallback( p_filter->p_libvlc, "key-pressed", KeyEvent, p_this ); es_format_Init( &p_filter->fmt_out, SPU_ES, VLC_CODEC_SPU ); p_filter->fmt_out.i_priority = 0; vlc_gcrypt_init(); /* create the vnc worker thread */ p_sys->p_worker_thread = vlc_object_create( p_this, sizeof( vlc_object_t ) ); vlc_object_attach( p_sys->p_worker_thread, p_this ); if( vlc_thread_create( p_sys->p_worker_thread, vnc_worker_thread, VLC_THREAD_PRIORITY_LOW ) ) { vlc_object_release( p_sys->p_worker_thread ); msg_Err( p_filter, "cannot spawn vnc message reader thread" ); goto error; } msg_Dbg( p_filter, "osdvnc filter started" ); return VLC_SUCCESS; error: msg_Err( p_filter, "osdvnc filter discarded" ); stop_osdvnc( p_filter ); vlc_mutex_destroy( &p_sys->lock ); free( p_sys->psz_host ); free( p_sys->psz_passwd ); free( p_sys ); return VLC_EGENERIC; }
/***************************************************************************** * OpenDecoder: probe the decoder and return score *****************************************************************************/ static int OpenDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t*)p_this; vlc_value_t val; image_handler_t *p_handler; video_format_t fmt_in, fmt_out; picture_t *p_image; char *psz_file, *psz_chroma; bool b_keep_ar; int i_aspect = 0; if( p_dec->fmt_in.i_codec != VLC_FOURCC('f','a','k','e') ) { return VLC_EGENERIC; } p_dec->p_sys = calloc( 1, sizeof( *p_dec->p_sys ) ); if( !p_dec->p_sys ) return VLC_ENOMEM; psz_file = var_CreateGetNonEmptyStringCommand( p_dec, "fake-file" ); if( !psz_file ) { msg_Err( p_dec, "specify a file with --fake-file=..." ); free( p_dec->p_sys ); return VLC_EGENERIC; } var_AddCallback( p_dec, "fake-file", FakeCallback, p_dec ); memset( &fmt_in, 0, sizeof(fmt_in) ); memset( &fmt_out, 0, sizeof(fmt_out) ); val.i_int = var_CreateGetIntegerCommand( p_dec, "fake-file-reload" ); if( val.i_int > 0) { p_dec->p_sys->b_reload = true; p_dec->p_sys->i_reload = (mtime_t)(val.i_int * 1000000); p_dec->p_sys->i_next = (mtime_t)(p_dec->p_sys->i_reload + mdate()); } var_AddCallback( p_dec, "fake-file-reload", FakeCallback , p_dec ); psz_chroma = var_CreateGetString( p_dec, "fake-chroma" ); fmt_out.i_chroma = vlc_fourcc_GetCodecFromString( VIDEO_ES, psz_chroma ); if( !fmt_out.i_chroma ) { msg_Warn( p_dec, "Invalid chroma (%s). Using I420.", psz_chroma ); fmt_out.i_chroma = VLC_CODEC_I420; } free( psz_chroma ); var_Create( p_dec, "fake-keep-ar", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); var_Get( p_dec, "fake-keep-ar", &val ); b_keep_ar = val.b_bool; var_Create( p_dec, "fake-width", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Create( p_dec, "fake-height", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Create( p_dec, "fake-aspect-ratio", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); var_Get( p_dec, "fake-aspect-ratio", &val ); if ( val.psz_string ) { char *psz_parser = strchr( val.psz_string, ':' ); if( psz_parser ) { *psz_parser++ = '\0'; i_aspect = atoi( val.psz_string ) * VOUT_ASPECT_FACTOR / atoi( psz_parser ); } free( val.psz_string ); } if ( !b_keep_ar ) { var_Get( p_dec, "fake-width", &val ); fmt_out.i_width = val.i_int; var_Get( p_dec, "fake-height", &val ); fmt_out.i_height = val.i_int; } p_handler = image_HandlerCreate( p_dec ); p_image = image_ReadUrl( p_handler, psz_file, &fmt_in, &fmt_out ); image_HandlerDelete( p_handler ); if ( p_image == NULL ) { msg_Err( p_dec, "unable to read image file %s", psz_file ); free( psz_file ); free( p_dec->p_sys ); return VLC_EGENERIC; } msg_Dbg( p_dec, "file %s loaded successfully", psz_file ); free( psz_file ); if ( b_keep_ar ) { picture_t *p_old = p_image; int i_width, i_height; var_Get( p_dec, "fake-width", &val ); i_width = val.i_int; var_Get( p_dec, "fake-height", &val ); i_height = val.i_int; if ( i_width && i_height ) { int i_image_ar = fmt_out.i_width * VOUT_ASPECT_FACTOR / fmt_out.i_height; int i_region_ar = i_width * VOUT_ASPECT_FACTOR / i_height; fmt_in = fmt_out; if ( i_aspect == i_image_ar ) { fmt_out.i_width = i_width; fmt_out.i_height = i_height; } else if ( i_image_ar > i_region_ar ) { fmt_out.i_width = i_width; fmt_out.i_height = i_width * VOUT_ASPECT_FACTOR / i_image_ar; i_aspect = i_image_ar; } else { fmt_out.i_height = i_height; fmt_out.i_width = i_height * i_image_ar / VOUT_ASPECT_FACTOR; i_aspect = i_image_ar; } p_handler = image_HandlerCreate( p_dec ); p_image = image_Convert( p_handler, p_old, &fmt_in, &fmt_out ); image_HandlerDelete( p_handler ); if ( p_image == NULL ) { msg_Warn( p_dec, "couldn't load resizing module" ); p_image = p_old; fmt_out = fmt_in; } else { picture_Release( p_old ); } } } if ( i_aspect ) { fmt_out.i_aspect = i_aspect; } else { fmt_out.i_aspect = fmt_out.i_width * VOUT_ASPECT_FACTOR / fmt_out.i_height; } var_Create( p_dec, "fake-deinterlace", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); var_Get( p_dec, "fake-deinterlace", &val ); if ( val.b_bool ) { picture_t *p_old = p_image; var_Create( p_dec, "fake-deinterlace-module", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); var_Get( p_dec, "fake-deinterlace-module", &val ); p_handler = image_HandlerCreate( p_dec ); p_image = image_Filter( p_handler, p_old, &fmt_out, val.psz_string ); image_HandlerDelete( p_handler ); free( val.psz_string ); if ( p_image == NULL ) { msg_Warn( p_dec, "couldn't load deinterlace module" ); p_image = p_old; } else { picture_Release( p_old ); } } /* Set output properties */ p_dec->fmt_out.i_cat = VIDEO_ES; p_dec->fmt_out.i_codec = fmt_out.i_chroma; p_dec->fmt_out.video = fmt_out; /* Set callbacks */ p_dec->pf_decode_video = DecodeBlock; p_dec->p_sys->p_image = p_image; vlc_mutex_init( &p_dec->p_sys->lock ); return VLC_SUCCESS; }
/***************************************************************************** * Open: open a dummy audio device *****************************************************************************/ static int Open( vlc_object_t * p_this ) { audio_output_t * p_aout = (audio_output_t *)p_this; char * psz_name, * psz_format; const char * const * ppsz_compare = format_list; int i_channels, i = 0; psz_name = var_CreateGetString( p_this, "audiofile-file" ); if( !psz_name || !*psz_name ) { msg_Err( p_aout, "you need to specify an output file name" ); free( psz_name ); return VLC_EGENERIC; } /* Allocate structure */ p_aout->sys = malloc( sizeof( aout_sys_t ) ); if( p_aout->sys == NULL ) return VLC_ENOMEM; if( !strcmp( psz_name, "-" ) ) p_aout->sys->p_file = stdout; else p_aout->sys->p_file = vlc_fopen( psz_name, "wb" ); free( psz_name ); if ( p_aout->sys->p_file == NULL ) { free( p_aout->sys ); return VLC_EGENERIC; } p_aout->pf_play = Play; p_aout->pf_pause = NULL; p_aout->pf_flush = NULL; /* Audio format */ psz_format = var_CreateGetString( p_this, "audiofile-format" ); while ( *ppsz_compare != NULL ) { if ( !strncmp( *ppsz_compare, psz_format, strlen(*ppsz_compare) ) ) { break; } ppsz_compare++; i++; } if ( *ppsz_compare == NULL ) { msg_Err( p_aout, "cannot understand the format string (%s)", psz_format ); if( p_aout->sys->p_file != stdout ) fclose( p_aout->sys->p_file ); free( p_aout->sys ); free( psz_format ); return VLC_EGENERIC; } free( psz_format ); p_aout->format.i_format = format_int[i]; if ( AOUT_FMT_SPDIF( &p_aout->format ) ) { p_aout->format.i_bytes_per_frame = AOUT_SPDIF_SIZE; p_aout->format.i_frame_length = A52_FRAME_NB; } p_aout->volume_set = NULL; p_aout->mute_set = NULL; /* Channels number */ i_channels = var_CreateGetInteger( p_this, "audiofile-channels" ); if( i_channels > 0 && i_channels <= CHANNELS_MAX ) { p_aout->format.i_physical_channels = pi_channels_maps[i_channels]; } /* WAV header */ p_aout->sys->b_add_wav_header = var_CreateGetBool( p_this, "audiofile-wav" ); if( p_aout->sys->b_add_wav_header ) { /* Write wave header */ WAVEHEADER *wh = &p_aout->sys->waveh; memset( wh, 0, sizeof(*wh) ); switch( p_aout->format.i_format ) { case VLC_CODEC_FL32: wh->Format = WAVE_FORMAT_IEEE_FLOAT; wh->BitsPerSample = sizeof(float) * 8; break; case VLC_CODEC_U8: wh->Format = WAVE_FORMAT_PCM; wh->BitsPerSample = 8; break; case VLC_CODEC_S16L: default: wh->Format = WAVE_FORMAT_PCM; wh->BitsPerSample = 16; break; } wh->MainChunkID = VLC_FOURCC('R', 'I', 'F', 'F'); wh->Length = 0; /* temp, to be filled in as we go */ wh->ChunkTypeID = VLC_FOURCC('W', 'A', 'V', 'E'); wh->SubChunkID = VLC_FOURCC('f', 'm', 't', ' '); wh->SubChunkLength = 16; wh->Modus = aout_FormatNbChannels( &p_aout->format ); wh->SampleFreq = p_aout->format.i_rate; wh->BytesPerSample = wh->Modus * ( wh->BitsPerSample / 8 ); wh->BytesPerSec = wh->BytesPerSample * wh->SampleFreq; wh->DataChunkID = VLC_FOURCC('d', 'a', 't', 'a'); wh->DataLength = 0; /* temp, to be filled in as we go */ /* Header -> little endian format */ SetWLE( &wh->Format, wh->Format ); SetWLE( &wh->BitsPerSample, wh->BitsPerSample ); SetDWLE( &wh->SubChunkLength, wh->SubChunkLength ); SetWLE( &wh->Modus, wh->Modus ); SetDWLE( &wh->SampleFreq, wh->SampleFreq ); SetWLE( &wh->BytesPerSample, wh->BytesPerSample ); SetDWLE( &wh->BytesPerSec, wh->BytesPerSec ); if( fwrite( wh, sizeof(WAVEHEADER), 1, p_aout->sys->p_file ) != 1 ) { msg_Err( p_aout, "write error (%m)" ); } } return 0; }
/***************************************************************************** * VCDOpen: open vcd *****************************************************************************/ static int Open( vlc_object_t *p_this ) { access_t *p_access = (access_t *)p_this; access_sys_t *p_sys; if( p_access->psz_filepath == NULL ) return VLC_EGENERIC; char *psz_dup = ToLocaleDup( p_access->psz_filepath ); char *psz; int i_title = 0; int i_chapter = 0; vcddev_t *vcddev; /* Command line: vcd://[dev_path][#title[,chapter]] */ if( ( psz = strchr( psz_dup, '#' ) ) ) { *psz++ = '\0'; i_title = strtol( psz, &psz, 0 ); if( *psz ) i_chapter = strtol( psz+1, &psz, 0 ); } if( *psz_dup == '\0' ) { free( psz_dup ); /* Only when selected */ if( strcmp( p_access->psz_access, "vcd" ) && strcmp( p_access->psz_access, "svcd" ) ) return VLC_EGENERIC; psz_dup = var_CreateGetString( p_access, "vcd" ); if( *psz_dup == '\0' ) { free( psz_dup ); return VLC_EGENERIC; } } #if defined( _WIN32 ) || defined( __OS2__ ) if( psz_dup[0] && psz_dup[1] == ':' && psz_dup[2] == '\\' && psz_dup[3] == '\0' ) psz_dup[2] = '\0'; #endif /* Open VCD */ vcddev = ioctl_Open( p_this, psz_dup ); free( psz_dup ); if( !vcddev ) return VLC_EGENERIC; /* Set up p_access */ p_access->p_sys = p_sys = calloc( 1, sizeof( access_sys_t ) ); if( unlikely(!p_sys )) goto error; p_sys->vcddev = vcddev; p_sys->offset = 0; /* We read the Table Of Content information */ p_sys->i_titles = ioctl_GetTracksMap( VLC_OBJECT(p_access), p_sys->vcddev, &p_sys->p_sectors ); if( p_sys->i_titles < 0 ) { msg_Err( p_access, "unable to count tracks" ); goto error; } else if( p_sys->i_titles <= 1 ) { msg_Err( p_access, "no movie tracks found" ); goto error; } /* The first title isn't usable */ p_sys->i_titles--; /* Build title table */ for( int i = 0; i < p_sys->i_titles; i++ ) { input_title_t *t = p_sys->title[i] = vlc_input_title_New(); msg_Dbg( p_access, "title[%d] start=%d", i, p_sys->p_sectors[1+i] ); msg_Dbg( p_access, "title[%d] end=%d", i, p_sys->p_sectors[i+2] ); t->i_size = ( p_sys->p_sectors[i+2] - p_sys->p_sectors[i+1] ) * (int64_t)VCD_DATA_SIZE; } /* Map entry points into chapters */ if( EntryPoints( p_access ) ) { msg_Warn( p_access, "could not read entry points, will not use them" ); } /* Starting title/chapter and sector */ if( i_title >= p_sys->i_titles ) i_title = 0; if( i_chapter >= p_sys->title[i_title]->i_seekpoint ) i_chapter = 0; p_sys->i_sector = p_sys->p_sectors[1+i_title]; if( i_chapter > 0 ) { p_sys->i_sector += ( p_sys->title[i_title]->seekpoint[i_chapter]->i_byte_offset / VCD_DATA_SIZE ); } /* p_access */ p_access->pf_read = NULL; p_access->pf_block = Block; p_access->pf_control = Control; p_access->pf_seek = Seek; p_access->info.b_eof = false; p_sys->i_current_title = i_title; p_sys->i_current_seekpoint = i_chapter; p_sys->offset = (uint64_t)(p_sys->i_sector - p_sys->p_sectors[1+i_title]) * VCD_DATA_SIZE; return VLC_SUCCESS; error: ioctl_Close( VLC_OBJECT(p_access), vcddev ); free( p_sys ); return VLC_EGENERIC; }
/***************************************************************************** * Open: open the visualizer *****************************************************************************/ static int Open( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys; char *psz_effects, *psz_parser; video_format_t fmt; if( ( p_filter->fmt_in.audio.i_format != VLC_CODEC_FL32 && p_filter->fmt_in.audio.i_format != VLC_CODEC_FI32 ) ) { return VLC_EGENERIC; } p_sys = p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); if( unlikely (p_sys == NULL ) ) return VLC_EGENERIC; p_sys->i_height = var_InheritInteger( p_filter , "effect-height"); p_sys->i_width = var_InheritInteger( p_filter , "effect-width"); /* No resolution under 400x532 */ if( p_sys->i_height < 400 ) p_sys->i_height = 400; if( p_sys->i_width < 532 ) p_sys->i_width = 532; /* Work on even dimensions */ if( (p_sys->i_height % 2 ) != 0 ) p_sys->i_height--; if( (p_sys->i_width % 2 ) != 0 ) p_sys->i_width--; p_sys->i_effect = 0; p_sys->effect = NULL; /* Parse the effect list */ psz_parser = psz_effects = var_CreateGetString( p_filter, "effect-list" ); while( psz_parser && *psz_parser != '\0' ) { visual_effect_t *p_effect; p_effect = malloc( sizeof( visual_effect_t ) ); if( !p_effect ) break; p_effect->i_width = p_sys->i_width; p_effect->i_height = p_sys->i_height; p_effect->i_nb_chans = aout_FormatNbChannels( &p_filter->fmt_in.audio); p_effect->i_idx_left = 0; p_effect->i_idx_right = __MIN( 1, p_effect->i_nb_chans-1 ); p_effect->psz_args = NULL; p_effect->p_data = NULL; p_effect->pf_run = NULL; p_effect->psz_name = NULL; for( int i = 0; pf_effect_run[i].psz_name != NULL; i++ ) { if( !strncasecmp( psz_parser, pf_effect_run[i].psz_name, strlen( pf_effect_run[i].psz_name ) ) ) { p_effect->pf_run = pf_effect_run[i].pf_run; p_effect->psz_name = pf_effect_run[i].psz_name; break; } } if( p_effect->psz_name ) { psz_parser += strlen( p_effect->psz_name ); if( *psz_parser == '{' ) { char *psz_eoa; psz_parser++; if( ( psz_eoa = strchr( psz_parser, '}') ) == NULL ) { msg_Err( p_filter, "unable to parse effect list. Aborting"); free( p_effect ); break; } p_effect->psz_args = strndup( psz_parser, psz_eoa - psz_parser); } TAB_APPEND( p_sys->i_effect, p_sys->effect, p_effect ); } else { msg_Err( p_filter, "unknown visual effect: %s", psz_parser ); free( p_effect ); } if( strchr( psz_parser, ',' ) ) { psz_parser = strchr( psz_parser, ',' ) + 1; } else if( strchr( psz_parser, ':' ) ) { psz_parser = strchr( psz_parser, ':' ) + 1; } else { break; } } free( psz_effects ); if( !p_sys->i_effect ) { msg_Err( p_filter, "no effects found" ); free( p_sys ); return VLC_EGENERIC; } /* Open the video output */ memset( &fmt, 0, sizeof(video_format_t) ); fmt.i_width = fmt.i_visible_width = p_sys->i_width; fmt.i_height = fmt.i_visible_height = p_sys->i_height; fmt.i_chroma = VLC_CODEC_I420; fmt.i_sar_num = fmt.i_sar_den = 1; p_sys->p_vout = aout_filter_RequestVout( p_filter, NULL, &fmt ); if( p_sys->p_vout == NULL ) { msg_Err( p_filter, "no suitable vout module" ); for( int i = 0; i < p_sys->i_effect; i++ ) { free( p_sys->effect[i]->psz_args ); free( p_sys->effect[i] ); } free( p_sys->effect ); free( p_sys ); return VLC_EGENERIC; } p_filter->pf_audio_filter = DoWork; return VLC_SUCCESS; }
***************************************************************************** * This function opens and setups Direct Sound. *****************************************************************************/ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt ) { char * psz_speaker; int i = 0; const char * const * ppsz_compare = speaker_list; msg_Dbg( p_aout, "Opening DirectSound Audio Output" ); /* Retrieve config values */ var_Create( p_aout, "directx-audio-float32", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); psz_speaker = var_CreateGetString( p_aout, "directx-audio-speaker" ); while ( *ppsz_compare != NULL ) { if ( !strncmp( *ppsz_compare, psz_speaker, strlen(*ppsz_compare) ) ) { break; } ppsz_compare++; i++; } if ( *ppsz_compare == NULL ) { msg_Err( p_aout, "(%s) isn't valid speaker setup option", psz_speaker ); msg_Err( p_aout, "Defaulting to Windows default speaker config"); i = 0;
static void PMThread( void *arg ) { vout_display_t *vd = ( vout_display_t * )arg; vout_display_sys_t * sys = vd->sys; ULONG i_frame_flags; QMSG qm; char *psz_mode; ULONG i_kva_mode; /* */ video_format_t fmt; video_format_ApplyRotation(&fmt, &vd->fmt); /* */ vout_display_info_t info = vd->info; info.is_slow = false; info.has_double_click = true; info.needs_hide_mouse = true; info.has_pictures_invalid = false; MorphToPM(); sys->hab = WinInitialize( 0 ); sys->hmq = WinCreateMsgQueue( sys->hab, 0); WinRegisterClass( sys->hab, WC_VLC_KVA, WndProc, CS_SIZEREDRAW | CS_MOVENOTIFY, sizeof( PVOID )); sys->b_fixt23 = var_CreateGetBool( vd, "kva-fixt23"); if( !sys->b_fixt23 ) /* If an external window was specified, we'll draw in it. */ sys->parent_window = vout_display_NewWindow( vd, VOUT_WINDOW_TYPE_HWND ); if( sys->parent_window ) { sys->parent = ( HWND )sys->parent_window->handle.hwnd; ULONG i_style = WinQueryWindowULong( sys->parent, QWL_STYLE ); WinSetWindowULong( sys->parent, QWL_STYLE, i_style | WS_CLIPCHILDREN ); i_frame_flags = FCF_TITLEBAR; } else { sys->parent = HWND_DESKTOP; i_frame_flags = FCF_SYSMENU | FCF_TITLEBAR | FCF_MINMAX | FCF_SIZEBORDER | FCF_TASKLIST; } sys->frame = WinCreateStdWindow( sys->parent, /* parent window handle */ WS_VISIBLE, /* frame window style */ &i_frame_flags, /* window style */ WC_VLC_KVA, /* class name */ "", /* window title */ 0L, /* default client style */ NULLHANDLE, /* resource in exe file */ 1, /* frame window id */ &sys->client ); /* client window handle */ if( sys->frame == NULLHANDLE ) { msg_Err( vd, "cannot create a frame window"); goto exit_frame; } WinSetWindowPtr( sys->client, 0, vd ); if( !sys->parent_window ) { WinSetWindowPtr( sys->frame, 0, vd ); sys->p_old_frame = WinSubclassWindow( sys->frame, MyFrameWndProc ); } psz_mode = var_CreateGetString( vd, "kva-video-mode" ); i_kva_mode = KVAM_AUTO; if( strcmp( psz_mode, "snap" ) == 0 ) i_kva_mode = KVAM_SNAP; else if( strcmp( psz_mode, "wo" ) == 0 ) i_kva_mode = KVAM_WO; else if( strcmp( psz_mode, "vman" ) == 0 ) i_kva_mode = KVAM_VMAN; else if( strcmp( psz_mode, "dive" ) == 0 ) i_kva_mode = KVAM_DIVE; free( psz_mode ); if( kvaInit( i_kva_mode, sys->client, COLOR_KEY )) { msg_Err( vd, "cannot initialize KVA"); goto exit_kva_init; } kvaCaps( &sys->kvac ); msg_Dbg( vd, "selected video mode = %s", psz_video_mode[ sys->kvac.ulMode - 1 ]); if( OpenDisplay( vd, &fmt ) ) { msg_Err( vd, "cannot open display"); goto exit_open_display; } if( vd->cfg->is_fullscreen && !sys->parent_window ) WinPostMsg( sys->client, WM_VLC_FULLSCREEN_CHANGE, MPFROMLONG( true ), 0 ); kvaDisableScreenSaver(); /* Setup vout_display now that everything is fine */ vd->fmt = fmt; vd->info = info; vd->pool = Pool; vd->prepare = NULL; vd->display = Display; vd->control = Control; vd->manage = Manage; /* Prevent SIG_FPE */ _control87(MCW_EM, MCW_EM); sys->i_result = VLC_SUCCESS; DosPostEventSem( sys->ack_event ); if( !sys->parent_window ) WinSetVisibleRegionNotify( sys->frame, TRUE ); while( WinGetMsg( sys->hab, &qm, NULLHANDLE, 0, 0 )) WinDispatchMsg( sys->hab, &qm ); if( !sys->parent_window ) WinSetVisibleRegionNotify( sys->frame, FALSE ); kvaEnableScreenSaver(); CloseDisplay( vd ); /* fall through */ exit_open_display : kvaDone(); exit_kva_init : if( !sys->parent_window ) WinSubclassWindow( sys->frame, sys->p_old_frame ); WinDestroyWindow( sys->frame ); exit_frame : vout_display_DeleteWindow( vd, sys->parent_window ); if( sys->is_mouse_hidden ) WinShowPointer( HWND_DESKTOP, TRUE ); WinDestroyMsgQueue( sys->hmq ); WinTerminate( sys->hab ); sys->i_result = VLC_EGENERIC; DosPostEventSem( sys->ack_event ); }