📄 panoramix.c
字号:
int i_vout; /* Allocate structure */ p_vout->p_sys = malloc( sizeof( vout_sys_t ) ); if( p_vout->p_sys == NULL ) return VLC_ENOMEM; p_vout->pf_init = Init; p_vout->pf_end = End; p_vout->pf_manage = NULL;/* Color Format not supported// Planar Y, packed UVcase VLC_FOURCC('Y','M','G','A'):// Packed YUV 4:2:2, U:Y:V:Y, interlacedcase VLC_FOURCC('I','U','Y','V'): // packed by 2// Packed YUV 2:1:1, Y:U:Y:Vcase VLC_FOURCC('Y','2','1','1'): // packed by 4// Packed YUV Revertedcase VLC_FOURCC('c','y','u','v'): // packed by 2*/ switch (p_vout->render.i_chroma) { // planar YUV case VLC_FOURCC('I','4','4','4'): case VLC_FOURCC('I','4','2','2'): case VLC_FOURCC('I','4','2','0'): case VLC_FOURCC('Y','V','1','2'): case VLC_FOURCC('I','Y','U','V'): case VLC_FOURCC('I','4','1','1'): case VLC_FOURCC('I','4','1','0'): case VLC_FOURCC('Y','V','U','9'): case VLC_FOURCC('Y','U','V','A'): p_vout->pf_render = RenderPlanarYUV; break; // packed RGB case VLC_FOURCC('R','G','B','2'): // packed by 1 case VLC_FOURCC('R','V','1','5'): // packed by 2 case VLC_FOURCC('R','V','1','6'): // packed by 2 case VLC_FOURCC('R','V','2','4'): // packed by 3 case VLC_FOURCC('R','V','3','2'): // packed by 4 p_vout->pf_render = RenderPackedRGB; break;#ifdef PACKED_YUV // packed YUV case VLC_FOURCC('Y','U','Y','2'): // packed by 2 case VLC_FOURCC('Y','U','N','V'): // packed by 2 case VLC_FOURCC('U','Y','V','Y'): // packed by 2 case VLC_FOURCC('U','Y','N','V'): // packed by 2 case VLC_FOURCC('Y','4','2','2'): // packed by 2 p_vout->pf_render = RenderPackedYUV; break;#endif default: msg_Err( p_vout, "colorspace not supported by plug-in !!!"); free( p_vout->p_sys ); return VLC_ENOMEM; } p_vout->pf_display = NULL; p_vout->pf_control = Control; config_ChainParse( p_vout, CFG_PREFIX, ppsz_filter_options, p_vout->p_cfg ); /* Look what method was requested */ p_vout->p_sys->i_col = var_CreateGetInteger( p_vout, CFG_PREFIX "cols" ); p_vout->p_sys->i_row = var_CreateGetInteger( p_vout, CFG_PREFIX "rows" );// OS dependent code : Autodetect number of displays in wall#ifdef SYS_MINGW32 if ((p_vout->p_sys->i_col < 0) || (p_vout->p_sys->i_row < 0) ) { int nbMonitors = GetSystemMetrics(SM_CMONITORS); if (nbMonitors == 1) { nbMonitors = 5; // 1 display => 5x1 simulation p_vout->p_sys->i_col = nbMonitors; p_vout->p_sys->i_row = 1; } else { p_vout->p_sys->i_col = GetSystemMetrics( SM_CXVIRTUALSCREEN ) / GetSystemMetrics( SM_CXSCREEN ); p_vout->p_sys->i_row = GetSystemMetrics( SM_CYVIRTUALSCREEN ) / GetSystemMetrics( SM_CYSCREEN ); if (p_vout->p_sys->i_col * p_vout->p_sys->i_row != nbMonitors) { p_vout->p_sys->i_col = nbMonitors; p_vout->p_sys->i_row = 1; } } var_SetInteger( p_vout, CFG_PREFIX "cols", p_vout->p_sys->i_col); var_SetInteger( p_vout, CFG_PREFIX "rows", p_vout->p_sys->i_row); }#endif#ifdef OVERLAP p_vout->p_sys->i_offset_x = var_CreateGetBool( p_vout, CFG_PREFIX "offset-x" ); if (p_vout->p_sys->i_col > 2) p_vout->p_sys->i_offset_x = 0; // offset-x is used in case of 2x1 wall & autocrop p_vout->p_sys->b_autocrop = !(var_CreateGetInteger( p_vout, "crop-ratio" ) == 0); if (!p_vout->p_sys->b_autocrop) p_vout->p_sys->b_autocrop = var_CreateGetInteger( p_vout, "autocrop" ); p_vout->p_sys->b_attenuate = var_CreateGetBool( p_vout, CFG_PREFIX "attenuate"); p_vout->p_sys->bz_length = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-length" ); if (p_vout->p_sys->i_row > 1) p_vout->p_sys->bz_height = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-height" ); else p_vout->p_sys->bz_height = 100; p_vout->p_sys->bz_begin = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-begin" ); p_vout->p_sys->bz_middle = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-middle" ); p_vout->p_sys->bz_end = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-end" ); p_vout->p_sys->bz_middle_pos = var_CreateGetInteger( p_vout, CFG_PREFIX "bz-middle-pos" ); double d_p = 100.0 / p_vout->p_sys->bz_middle_pos; p_vout->p_sys->i_ratio_max = var_CreateGetInteger( p_vout, "autocrop-ratio-max" ); // in crop module with autocrop ... p_vout->p_sys->i_ratio = var_CreateGetInteger( p_vout, "crop-ratio" ); // in crop module with manual ratio ... p_vout->p_sys->a_2 = d_p * p_vout->p_sys->bz_begin - (double)(d_p * d_p / (d_p - 1)) * p_vout->p_sys->bz_middle + (double)(d_p / (d_p - 1)) * p_vout->p_sys->bz_end; p_vout->p_sys->a_1 = -(d_p + 1) * p_vout->p_sys->bz_begin + (double)(d_p * d_p / (d_p - 1)) * p_vout->p_sys->bz_middle - (double)(1 / (d_p - 1)) * p_vout->p_sys->bz_end; p_vout->p_sys->a_0 = p_vout->p_sys->bz_begin;#ifdef GAMMA p_vout->p_sys->f_gamma_red = var_CreateGetFloat( p_vout, CFG_PREFIX "bz-gamma-red" ); p_vout->p_sys->f_gamma_green = var_CreateGetFloat( p_vout, CFG_PREFIX "bz-gamma-green" ); p_vout->p_sys->f_gamma_blue = var_CreateGetFloat( p_vout, CFG_PREFIX "bz-gamma-blue" );#endif#ifndef SYS_MINGW32 p_vout->p_sys->b_xinerama = var_CreateGetBool( p_vout, CFG_PREFIX "xinerama" );#endif#else p_vout->p_sys->i_col = __MAX( 1, __MIN( 15, p_vout->p_sys->i_col ) ); p_vout->p_sys->i_row = __MAX( 1, __MIN( 15, p_vout->p_sys->i_row ) );#endif msg_Dbg( p_vout, "opening a %i x %i wall", p_vout->p_sys->i_col, p_vout->p_sys->i_row ); p_vout->p_sys->pp_vout = calloc( p_vout->p_sys->i_row * p_vout->p_sys->i_col, sizeof(struct vout_list_t) ); if( p_vout->p_sys->pp_vout == NULL ) { free( p_vout->p_sys ); return VLC_ENOMEM; } psz_method_tmp = psz_method = var_CreateGetNonEmptyString( p_vout, CFG_PREFIX "active" ); /* If no trailing vout are specified, take them all */ if( psz_method == NULL ) { for( i_vout = p_vout->p_sys->i_row * p_vout->p_sys->i_col; i_vout--; ) { p_vout->p_sys->pp_vout[i_vout].b_active = 1; } } /* If trailing vout are specified, activate only the requested ones */ else { for( i_vout = p_vout->p_sys->i_row * p_vout->p_sys->i_col; i_vout--; ) { p_vout->p_sys->pp_vout[i_vout].b_active = 0; } while( *psz_method ) { psz_tmp = psz_method; while( *psz_tmp && *psz_tmp != ',' ) { psz_tmp++; } if( *psz_tmp ) { *psz_tmp = '\0'; i_vout = atoi( psz_method ); psz_method = psz_tmp + 1; } else { i_vout = atoi( psz_method ); psz_method = psz_tmp; } if( i_vout >= 0 && i_vout < p_vout->p_sys->i_row * p_vout->p_sys->i_col ) { p_vout->p_sys->pp_vout[i_vout].b_active = 1; } } } free( psz_method_tmp ); return VLC_SUCCESS;}#ifdef OVERLAP/***************************************************************************** * CLIP_0A: clip between 0 and ACCURACY *****************************************************************************/inline static int CLIP_0A( int a ){ return (a > ACCURACY) ? ACCURACY : (a < 0) ? 0 : a;}#ifdef GAMMA/***************************************************************************** * Gamma: Gamma correction *****************************************************************************/static double Gamma_Correction(int i_plane, float f_component, float f_BlackCrush[VOUT_MAX_PLANES], float f_WhiteCrush[VOUT_MAX_PLANES], float f_BlackLevel[VOUT_MAX_PLANES], float f_WhiteLevel[VOUT_MAX_PLANES], float f_Gamma[VOUT_MAX_PLANES]){ float f_Input; f_Input = (f_component * f_BlackLevel[i_plane]) / (f_BlackCrush[i_plane]) + (1.0 - f_BlackLevel[i_plane]); if (f_component <= f_BlackCrush[i_plane]) { return pow(f_Input, 1.0 / f_Gamma[i_plane]); } else if (f_component >= f_WhiteCrush[i_plane]) { f_Input = (f_component * (1.0 - (f_WhiteLevel[i_plane] + 1.0)) + (f_WhiteLevel[i_plane] + 1.0) * f_WhiteCrush[i_plane] - 1.0) / (f_WhiteCrush[i_plane] - 1.0); return pow(f_Input, 1.0 / f_Gamma[i_plane]); } else { return 1.0; }}#ifdef PACKED_YUV/***************************************************************************** * F: Function to calculate Gamma correction *****************************************************************************/static uint8_t F(uint8_t i, float gamma){ double input = (double) i / 255.0; // return clip(255 * pow(input, 1.0 / gamma)); if (input < 0.5) return clip_uint8((255 * pow(2 * input, gamma)) / 2); else return clip_uint8(255 * (1 - pow(2 * (1 - input), gamma) / 2));}#endif#endif/***************************************************************************** * AdjustHeight: ajust p_sys->i_height to have same BZ width for any ratio *****************************************************************************/static int AdjustHeight( vout_thread_t *p_vout ){ bool b_fullscreen = p_vout->b_fullscreen; int i_window_width = p_vout->i_window_width; int i_window_height = p_vout->i_window_height; double d_halfLength = 0; double d_halfLength_crop; double d_halfLength_calculated; int i_offset = 0; // OS DEPENDENT CODE to get display dimensions if (b_fullscreen ) {#ifdef SYS_MINGW32 i_window_width = GetSystemMetrics(SM_CXSCREEN); i_window_height = GetSystemMetrics(SM_CYSCREEN);#else Display *p_display = XOpenDisplay( "" ); if (p_vout->p_sys->b_xinerama) { i_window_width = DisplayWidth(p_display, 0) / p_vout->p_sys->i_col; i_window_height = DisplayHeight(p_display, 0) / p_vout->p_sys->i_row; } else { i_window_width = DisplayWidth(p_display, 0); i_window_height = DisplayHeight(p_display, 0); } XCloseDisplay( p_display );#endif var_SetInteger( p_vout, "width", i_window_width); var_SetInteger( p_vout, "height", i_window_height); p_vout->i_window_width = i_window_width; p_vout->i_window_height = i_window_height; } if( p_vout->p_sys->bz_length) if ((!p_vout->p_sys->b_autocrop) && (!p_vout->p_sys->i_ratio)) { if ((p_vout->p_sys->i_row > 1) || (p_vout->p_sys->i_col > 1)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -