-
-/*****************************************************************************
- * End: terminate Transform video thread output method
- *****************************************************************************/
-static void End( vout_thread_t *p_vout )
-{
- vout_sys_t *p_sys = p_vout->p_sys;
-
- vout_filter_DelChild( p_vout, p_sys->p_vout, MouseEvent );
- vout_CloseAndRelease( p_sys->p_vout );
-
- vout_filter_ReleaseDirectBuffers( p_vout );
-}
-
-/*****************************************************************************
- * 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 );
- }
-
- p_outpic->date = 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 );
-}
-
-/**
- * Forward mouse event with proper conversion.
- */
-static int MouseEvent( vlc_object_t *p_this, char const *psz_var,
- vlc_value_t oldval, vlc_value_t newval, void *p_data )
-{
- vout_thread_t *p_vout = p_data;
- VLC_UNUSED(p_this); VLC_UNUSED(oldval);
-
- /* Translate the mouse coordinates
- * FIXME missing lock */
- if( !strcmp( psz_var, "mouse-x" ) )
- {
- switch( p_vout->p_sys->i_mode )
- {
- case TRANSFORM_MODE_270:
- newval.i_int = p_vout->p_sys->p_vout->output.i_width
- - newval.i_int;
- case TRANSFORM_MODE_90:
- psz_var = "mouse-y";
- break;
-
- case TRANSFORM_MODE_180:
- case TRANSFORM_MODE_HFLIP:
- newval.i_int = p_vout->p_sys->p_vout->output.i_width
- - newval.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:
- newval.i_int = p_vout->p_sys->p_vout->output.i_height
- - newval.i_int;
- case TRANSFORM_MODE_270:
- psz_var = "mouse-x";
- break;
-
- case TRANSFORM_MODE_180:
- case TRANSFORM_MODE_VFLIP:
- newval.i_int = p_vout->p_sys->p_vout->output.i_height
- - newval.i_int;
- break;
-
- case TRANSFORM_MODE_HFLIP:
- default:
- break;
- }
- }
-
- return var_Set( p_vout, psz_var, newval );
-}
-
-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;
- }
-}
-