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

📄 transform.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************** * Destroy: destroy Transform video thread output method ***************************************************************************** * Terminate an output method created by TransformCreateOutputMethod *****************************************************************************/static void Destroy( vlc_object_t *p_this ){    vout_thread_t *p_vout = (vout_thread_t *)p_this;    free( p_vout->p_sys );}/***************************************************************************** * Render: displays previously rendered output ***************************************************************************** * This function send the currently rendered image to Transform image, waits * until it is displayed and switch the two rendering buffers, preparing next * frame. *****************************************************************************/static void Render( vout_thread_t *p_vout, picture_t *p_pic ){    picture_t *p_outpic;    /* This is a new frame. Get a structure from the video_output. */    while( ( p_outpic = vout_CreatePicture( p_vout->p_sys->p_vout, 0, 0, 0 ) )              == NULL )    {        if( !vlc_object_alive (p_vout) || p_vout->b_error )        {            return;        }        msleep( VOUT_OUTMEM_SLEEP );    }    vout_DatePicture( p_vout->p_sys->p_vout, p_outpic, p_pic->date );    vout_LinkPicture( p_vout->p_sys->p_vout, p_outpic );    p_vout->p_sys->pf_filter( p_vout, p_pic, p_outpic );    vout_UnlinkPicture( p_vout->p_sys->p_vout, p_outpic );    vout_DisplayPicture( p_vout->p_sys->p_vout, p_outpic );}/***************************************************************************** * SendEvents: forward mouse and keyboard events to the parent p_vout *****************************************************************************/static int SendEvents( vlc_object_t *p_this, char const *psz_var,                       vlc_value_t oldval, vlc_value_t newval, void *_p_vout ){    VLC_UNUSED(p_this); VLC_UNUSED(oldval);    vout_thread_t *p_vout = (vout_thread_t *)_p_vout;    vlc_value_t sentval = newval;    /* Translate the mouse coordinates */    if( !strcmp( psz_var, "mouse-x" ) )    {        switch( p_vout->p_sys->i_mode )        {        case TRANSFORM_MODE_270:            sentval.i_int = p_vout->p_sys->p_vout->output.i_width                             - sentval.i_int;        case TRANSFORM_MODE_90:            var_Set( p_vout, "mouse-y", sentval );            return VLC_SUCCESS;        case TRANSFORM_MODE_180:        case TRANSFORM_MODE_HFLIP:            sentval.i_int = p_vout->p_sys->p_vout->output.i_width                             - sentval.i_int;            break;        case TRANSFORM_MODE_VFLIP:        default:            break;        }    }    else if( !strcmp( psz_var, "mouse-y" ) )    {        switch( p_vout->p_sys->i_mode )        {        case TRANSFORM_MODE_90:            sentval.i_int = p_vout->p_sys->p_vout->output.i_height                             - sentval.i_int;        case TRANSFORM_MODE_270:            var_Set( p_vout, "mouse-x", sentval );            return VLC_SUCCESS;        case TRANSFORM_MODE_180:        case TRANSFORM_MODE_VFLIP:            sentval.i_int = p_vout->p_sys->p_vout->output.i_height                             - sentval.i_int;            break;        case TRANSFORM_MODE_HFLIP:        default:            break;        }    }    var_Set( p_vout, psz_var, sentval );    return VLC_SUCCESS;}/***************************************************************************** * SendEventsToChild: forward events to the child/children vout *****************************************************************************/static int SendEventsToChild( vlc_object_t *p_this, char const *psz_var,                       vlc_value_t oldval, vlc_value_t newval, void *p_data ){    VLC_UNUSED(p_data); VLC_UNUSED(oldval);    vout_thread_t *p_vout = (vout_thread_t *)p_this;    var_Set( p_vout->p_sys->p_vout, psz_var, newval );    return VLC_SUCCESS;}static void FilterPlanar( vout_thread_t *p_vout,                          const picture_t *p_pic, picture_t *p_outpic ){    int i_index;    switch( p_vout->p_sys->i_mode )    {        case TRANSFORM_MODE_90:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                int i_pitch = p_pic->p[i_index].i_pitch;                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                uint8_t *p_out_end = p_out +                    p_outpic->p[i_index].i_visible_lines *                    p_outpic->p[i_index].i_pitch;                for( ; p_out < p_out_end ; )                {                    uint8_t *p_line_end;                    p_out_end -= p_outpic->p[i_index].i_pitch                                  - p_outpic->p[i_index].i_visible_pitch;                    p_line_end = p_in + p_pic->p[i_index].i_visible_lines *                        i_pitch;                    for( ; p_in < p_line_end ; )                    {                        p_line_end -= i_pitch;                        *(--p_out_end) = *p_line_end;                    }                    p_in++;                }            }            break;        case TRANSFORM_MODE_180:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines                                            * p_pic->p[i_index].i_pitch;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                for( ; p_in < p_in_end ; )                {                    uint8_t *p_line_start = p_in_end                                             - p_pic->p[i_index].i_pitch;                    p_in_end -= p_pic->p[i_index].i_pitch                                 - p_pic->p[i_index].i_visible_pitch;                    for( ; p_line_start < p_in_end ; )                    {                        *p_out++ = *(--p_in_end);                    }                    p_out += p_outpic->p[i_index].i_pitch                              - p_outpic->p[i_index].i_visible_pitch;                }            }            break;        case TRANSFORM_MODE_270:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                int i_pitch = p_pic->p[i_index].i_pitch;                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                uint8_t *p_out_end = p_out +                    p_outpic->p[i_index].i_visible_lines *                    p_outpic->p[i_index].i_pitch;                for( ; p_out < p_out_end ; )                {                    uint8_t *p_in_end;                    p_in_end = p_in + p_pic->p[i_index].i_visible_lines *                        i_pitch;                    for( ; p_in < p_in_end ; )                    {                        p_in_end -= i_pitch;                        *p_out++ = *p_in_end;                    }                    p_out += p_outpic->p[i_index].i_pitch                              - p_outpic->p[i_index].i_visible_pitch;                    p_in++;                }            }            break;        case TRANSFORM_MODE_HFLIP:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines                                            * p_pic->p[i_index].i_pitch;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                for( ; p_in < p_in_end ; )                {                    p_in_end -= p_pic->p[i_index].i_pitch;                    vlc_memcpy( p_out, p_in_end,                                p_pic->p[i_index].i_visible_pitch );                    p_out += p_pic->p[i_index].i_pitch;                }            }            break;        case TRANSFORM_MODE_VFLIP:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_in_end = p_in + p_pic->p[i_index].i_visible_lines                                         * p_pic->p[i_index].i_pitch;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                for( ; p_in < p_in_end ; )                {                    uint8_t *p_line_end = p_in                                        + p_pic->p[i_index].i_visible_pitch;                    for( ; p_in < p_line_end ; )                    {                        *p_out++ = *(--p_line_end);                    }                    p_in += p_pic->p[i_index].i_pitch;                }            }            break;        default:            break;    }}static void FilterI422( vout_thread_t *p_vout,                        const picture_t *p_pic, picture_t *p_outpic ){    int i_index;    switch( p_vout->p_sys->i_mode )    {        case TRANSFORM_MODE_180:        case TRANSFORM_MODE_HFLIP:        case TRANSFORM_MODE_VFLIP:            /* Fall back on the default implementation */            FilterPlanar( p_vout, p_pic, p_outpic );            return;        case TRANSFORM_MODE_90:            for( i_index = 0 ; i_index < p_pic->i_planes ; i_index++ )            {                int i_pitch = p_pic->p[i_index].i_pitch;                uint8_t *p_in = p_pic->p[i_index].p_pixels;                uint8_t *p_out = p_outpic->p[i_index].p_pixels;                uint8_t *p_out_end = p_out +                    p_outpic->p[i_index].i_visible_lines *                    p_outpic->p[i_index].i_pitch;                if( i_index == 0 )                {                    for( ; p_out < p_out_end ; )                    {                        uint8_t *p_line_end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -