*/ static REBSER *Init_Loop(const REBVAL *spec, REBVAL *body_blk, REBSER **fram) /* ** Initialize standard for loops (copy block, make frame, bind). ** Spec: WORD or [WORD ...] ** ***********************************************************************/ { REBSER *frame; REBINT len; REBVAL *word; REBVAL *vals; REBSER *body; // For :WORD format, get the var's value: if (IS_GET_WORD(spec)) spec = GET_VAR(spec); // Hand-make a FRAME (done for for speed): len = IS_BLOCK(spec) ? VAL_LEN(spec) : 1; if (len == 0) raise Error_Invalid_Arg(spec); frame = Make_Frame(len, FALSE); SERIES_TAIL(frame) = len+1; SERIES_TAIL(FRM_WORD_SERIES(frame)) = len+1; // Setup for loop: word = FRM_WORD(frame, 1); // skip SELF vals = BLK_SKIP(frame, 1); if (IS_BLOCK(spec)) spec = VAL_BLK_DATA(spec); // Optimally create the FOREACH frame: while (len-- > 0) { if (!IS_WORD(spec) && !IS_SET_WORD(spec)) { // Prevent inconsistent GC state: Free_Series(FRM_WORD_SERIES(frame)); Free_Series(frame); raise Error_Invalid_Arg(spec); } Val_Init_Word_Typed(word, VAL_TYPE(spec), VAL_WORD_SYM(spec), ALL_64); word++; SET_NONE(vals); vals++; spec++; } SET_END(word); SET_END(vals); body = Copy_Array_At_Deep_Managed( VAL_SERIES(body_blk), VAL_INDEX(body_blk) ); Bind_Values_Deep(BLK_HEAD(body), frame); *fram = frame; return body; }
static int Create( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys; if( p_filter->fmt_in.video.i_chroma != VLC_CODEC_YUVA ) { msg_Err( p_filter, "Unsupported input chroma \"%4.4s\". " "Bluescreen can only use \"YUVA\".", (char*)&p_filter->fmt_in.video.i_chroma ); return VLC_EGENERIC; } /* Allocate structure */ p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); if( p_filter->p_sys == NULL ) return VLC_ENOMEM; p_sys = p_filter->p_sys; config_ChainParse( p_filter, CFG_PREFIX, ppsz_filter_options, p_filter->p_cfg ); int val; vlc_mutex_init( &p_sys->lock ); #define GET_VAR( name, min, max ) \ val = var_CreateGetIntegerCommand( p_filter, CFG_PREFIX #name ); \ p_sys->i_##name = __MIN( max, __MAX( min, val ) ); \ var_AddCallback( p_filter, CFG_PREFIX #name, BluescreenCallback, p_sys ); GET_VAR( u, 0x00, 0xff ); GET_VAR( v, 0x00, 0xff ); GET_VAR( ut, 0x00, 0xff ); GET_VAR( vt, 0x00, 0xff ); p_sys->p_at = NULL; #undef GET_VAR p_filter->pf_video_filter = Filter; return VLC_SUCCESS; }
*/ REBFLG Make_Typeset(REBVAL *block, REBVAL *value, REBFLG load) /* ** block - block of datatypes (datatype words ok too) ** value - value to hold result (can be word-spec type too) ** ***********************************************************************/ { const REBVAL *val; REBCNT sym; REBSER *types = VAL_SERIES(ROOT_TYPESETS); VAL_TYPESET(value) = 0; for (; NOT_END(block); block++) { val = NULL; if (IS_WORD(block)) { //Print("word: %s", Get_Word_Name(block)); sym = VAL_WORD_SYM(block); if (VAL_WORD_FRAME(block)) { // Get word value val = GET_VAR(block); } else if (sym < REB_MAX) { // Accept datatype word TYPE_SET(value, VAL_WORD_SYM(block)-1); continue; } // Special typeset symbols: else if (sym >= SYM_ANY_TYPEX && sym <= SYM_ANY_BLOCKX) val = BLK_SKIP(types, sym - SYM_ANY_TYPEX + 1); } if (!val) val = block; if (IS_DATATYPE(val)) { TYPE_SET(value, VAL_DATATYPE(val)); } else if (IS_TYPESET(val)) { VAL_TYPESET(value) |= VAL_TYPESET(val); } else { if (load) return FALSE; Trap_Arg_DEAD_END(block); } } return TRUE; }
/***************************************************************************** * 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; vlc_object_t *p_libvlc = VLC_OBJECT( p_filter->p_libvlc ); char *psz_order, *_psz_order; char *psz_offsets; int i_index; vlc_value_t val; int i_command; /* Allocate structure */ p_sys = p_filter->p_sys = malloc( sizeof( filter_sys_t ) ); if( p_sys == NULL ) return VLC_ENOMEM; p_filter->pf_sub_source = Filter; vlc_mutex_init( &p_sys->lock ); vlc_mutex_lock( &p_sys->lock ); config_ChainParse( p_filter, CFG_PREFIX, ppsz_filter_options, p_filter->p_cfg ); #define GET_VAR( name, min, max ) \ i_command = var_CreateGetIntegerCommand( p_filter, CFG_PREFIX #name ); \ p_sys->i_##name = __MIN( max, __MAX( min, i_command ) ); \ var_AddCallback( p_filter, CFG_PREFIX #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 ); GET_VAR( align, 0, 10 ); if( p_sys->i_align == 3 || p_sys->i_align == 7 ) p_sys->i_align = 5; 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, 2 ); GET_VAR( delay, 100, INT_MAX ); #undef GET_VAR p_sys->i_delay *= 1000; p_sys->b_ar = var_CreateGetBoolCommand( p_filter, CFG_PREFIX "keep-aspect-ratio" ); var_AddCallback( p_filter, CFG_PREFIX "keep-aspect-ratio", MosaicCallback, p_sys ); p_sys->b_keep = var_CreateGetBoolCommand( p_filter, CFG_PREFIX "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_CreateGetStringCommand( p_filter, CFG_PREFIX "order" ); _psz_order = psz_order; var_AddCallback( p_filter, CFG_PREFIX "order", MosaicCallback, p_sys ); if( *psz_order ) { char *psz_end = NULL; i_index = 0; do { psz_end = strchr( psz_order, ',' ); i_index++; p_sys->ppsz_order = xrealloc( 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( psz_end ); p_sys->i_order_length = i_index; } free( _psz_order ); /* Manage specific offsets for substreams */ psz_offsets = var_CreateGetStringCommand( p_filter, CFG_PREFIX "offsets" ); p_sys->i_offsets_length = 0; p_sys->pi_x_offsets = NULL; p_sys->pi_y_offsets = NULL; mosaic_ParseSetOffsets( p_filter, p_sys, psz_offsets ); free( psz_offsets ); var_AddCallback( p_filter, CFG_PREFIX "offsets", MosaicCallback, p_sys ); vlc_mutex_unlock( &p_sys->lock ); 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; }