⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 panoramix.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -