📄 transform.c
字号:
/***************************************************************************** * 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 + -