+ /* RGB picture */
+ if( p_vout->p_sys->i_surfaces )
+ {
+ /* We already allocated this surface, return */
+ return -1;
+ }
+
+ p_pic->p_sys = malloc( sizeof( picture_sys_t ) );
+
+ if( p_pic->p_sys == NULL )
+ {
+ return -1;
+ }
+
+ switch( p_vout->p_sys->p_display->format->BitsPerPixel )
+ {
+ case 8:
+ p_pic->p->i_pixel_bytes = 1;
+ break;
+ case 15:
+ case 16:
+ p_pic->p->i_pixel_bytes = 2;
+ break;
+ case 24:
+ case 32:
+ p_pic->p->i_pixel_bytes = 4;
+ break;
+ default:
+ return( -1 );
+ }
+
+ p_pic->p->p_pixels = p_vout->p_sys->p_display->pixels;
+ p_pic->p->i_lines = p_vout->p_sys->p_display->h;
+ p_pic->p->i_pitch = p_vout->p_sys->p_display->pitch;
+
+ if( p_pic->p->i_pitch ==
+ p_pic->p->i_pixel_bytes * p_vout->p_sys->p_display->w )
+ {
+ p_pic->p->b_margin = 0;
+ }
+ else
+ {
+ p_pic->p->b_margin = 1;
+ p_pic->p->b_hidden = 1;
+ p_pic->p->i_visible_bytes =
+ p_pic->p->i_pixel_bytes * p_vout->p_sys->p_display->w;
+ }
+
+ p_vout->p_sys->i_surfaces++;
+
+ p_pic->i_planes = 1;
+ }
+ else
+ {
+ p_pic->p_sys = malloc( sizeof( picture_sys_t ) );
+
+ if( p_pic->p_sys == NULL )
+ {
+ return -1;
+ }
+
+ p_pic->p_sys->p_overlay =
+ SDL_CreateYUVOverlay( i_width, i_height,
+ p_vout->output.i_chroma,
+ p_vout->p_sys->p_display );
+
+ if( p_pic->p_sys->p_overlay == NULL )
+ {
+ free( p_pic->p_sys );
+ return -1;
+ }
+
+ SDL_LockYUVOverlay( p_pic->p_sys->p_overlay );
+
+ p_pic->Y_PIXELS = p_pic->p_sys->p_overlay->pixels[0];
+ p_pic->p[Y_PLANE].i_lines = p_pic->p_sys->p_overlay->h;
+ p_pic->p[Y_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[0];
+
+ switch( p_vout->output.i_chroma )
+ {
+ case SDL_YV12_OVERLAY:
+ p_pic->p[Y_PLANE].i_pixel_bytes = 1;
+ p_pic->p[Y_PLANE].b_margin = 0;
+
+ p_pic->U_PIXELS = p_pic->p_sys->p_overlay->pixels[2];
+ p_pic->p[U_PLANE].i_lines = p_pic->p_sys->p_overlay->h / 2;
+ p_pic->p[U_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[2];
+ p_pic->p[U_PLANE].i_pixel_bytes = 1;
+ p_pic->p[U_PLANE].b_margin = 0;
+
+ p_pic->V_PIXELS = p_pic->p_sys->p_overlay->pixels[1];
+ p_pic->p[V_PLANE].i_lines = p_pic->p_sys->p_overlay->h / 2;
+ p_pic->p[V_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[1];
+ p_pic->p[V_PLANE].i_pixel_bytes = 1;
+ p_pic->p[V_PLANE].b_margin = 0;
+
+ p_pic->i_planes = 3;
+ break;
+
+ case SDL_IYUV_OVERLAY:
+ p_pic->p[Y_PLANE].i_pixel_bytes = 1;
+ p_pic->p[Y_PLANE].b_margin = 0;
+
+ p_pic->U_PIXELS = p_pic->p_sys->p_overlay->pixels[1];
+ p_pic->p[U_PLANE].i_lines = p_pic->p_sys->p_overlay->h / 2;
+ p_pic->p[U_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[1];
+ p_pic->p[U_PLANE].i_pixel_bytes = 1;
+ p_pic->p[U_PLANE].b_margin = 0;
+
+ p_pic->V_PIXELS = p_pic->p_sys->p_overlay->pixels[2];
+ p_pic->p[V_PLANE].i_lines = p_pic->p_sys->p_overlay->h / 2;
+ p_pic->p[V_PLANE].i_pitch = p_pic->p_sys->p_overlay->pitches[2];
+ p_pic->p[V_PLANE].i_pixel_bytes = 1;
+ p_pic->p[V_PLANE].b_margin = 0;
+
+ p_pic->i_planes = 3;
+ break;
+
+ default:
+ p_pic->p[Y_PLANE].i_pixel_bytes = 2;
+ p_pic->p[Y_PLANE].b_margin = 0;
+
+ p_pic->i_planes = 1;
+ break;