From dc722c11cd46ae863f756ef47bcf57bf77479163 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Tue, 23 Oct 2007 04:44:52 +0000 Subject: [PATCH] Support all the YUV modes that SDL supports. Try to find a hardware accelerated one if possible. --- src/conio/sdl_con.c | 120 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 99 insertions(+), 21 deletions(-) diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index b1b541e4ce..28a13fc6e5 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -273,30 +273,91 @@ void RGBtoYUV(Uint8 r, Uint8 g, Uint8 b, Uint8 *yuv_array, int monochrome, int l void yuv_fillrect(SDL_Overlay *overlay, SDL_Rect *r, int dac_entry) { - int x,y; - Uint8 *Y,*U,*V; - int odd_line; - int uvlen=(r->w)>>1; - int uvoffset=overlay->pitches[1]*((r->y+1)>>1)+((r->x+1)>>1); - - odd_line=(r->y)&1; - Y=overlay->pixels[0]+overlay->pitches[0]*(r->y)+(r->x); - U=overlay->pixels[2]+uvoffset; - V=overlay->pixels[1]+uvoffset; - for(y=0; y<r->h; y++) + int uplane,vplane; /* Planar formats */ + int y0pack, y1pack, u0pack, v0pack; /* Packed formats */ + + yuv.changed=1; + switch(overlay->format) { + case SDL_IYUV_OVERLAY: + /* Swap planes */ + uplane=1; + vplane=2; + goto planar; + case SDL_YV12_OVERLAY: + uplane=2; + vplane=1; + goto planar; + case SDL_YUY2_OVERLAY: + y0pack=0; + y1pack=2; + u0pack=1; + v0pack=3; + goto packed; + case SDL_UYVY_OVERLAY: + y0pack=1; + y1pack=3; + u0pack=0; + v0pack=2; + goto packed; + case SDL_YVYU_OVERLAY: + y0pack=0; + y1pack=2; + u0pack=3; + v0pack=1; + goto packed; + break; + } + return; + +planar: { - memset(Y, yuv.colours[dac_entry][0], r->w); - Y+=overlay->pitches[0]; - if(odd_line) { - U+=overlay->pitches[2]; - V+=overlay->pitches[1]; + int x,y; + Uint8 *Y,*U,*V; + int odd_line; + int uvlen=(r->w)>>1; + int uvoffset=overlay->pitches[1]*((r->y+1)>>1)+((r->x+1)>>1); + + odd_line=(r->y)&1; + Y=overlay->pixels[0]+overlay->pitches[0]*(r->y)+(r->x); + U=overlay->pixels[uplane]+uvoffset; + V=overlay->pixels[vplane]+uvoffset; + for(y=0; y<r->h; y++) + { + memset(Y, yuv.colours[dac_entry][0], r->w); + Y+=overlay->pitches[0]; + if(odd_line) { + U+=overlay->pitches[uplane]; + V+=overlay->pitches[vplane]; + } + else { + memset(U, yuv.colours[dac_entry][1], uvlen); + memset(V, yuv.colours[dac_entry][2], uvlen); + } } - else { - memset(U, yuv.colours[dac_entry][1], uvlen); - memset(V, yuv.colours[dac_entry][2], uvlen); + } + return; +packed: + { + int x,y; + Uint32 colour; + Uint8 *colour_array=&colour; + Uint32 *offset; + int uvlen=(r->w)>>1; + int uvoffset=overlay->pitches[1]*((r->y+1)>>1)+((r->x+1)>>1); + + colour_array[y0pack]=yuv.colours[dac_entry][0]; + colour_array[y1pack]=yuv.colours[dac_entry][0]; + colour_array[u0pack]=yuv.colours[dac_entry][1]; + colour_array[v0pack]=yuv.colours[dac_entry][2]; + offset=(Uint32 *)(overlay->pixels[0]+overlay->pitches[0]*(r->y)); + offset+=r->x; + for(y=0; y<r->h; y++) + { + for(x=0; x<r->w; x+=2) + *offset[x>>1]=colour; } } - yuv.changed=1; + return; } void sdl_user_func(int func, ...) @@ -1191,7 +1252,24 @@ void setup_surfaces(void) sdl.mutexV(yuv.mutex); sdl.FreeYUVOverlay(yuv.overlay); } - yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YV12_OVERLAY, win); + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YUY2_OVERLAY, win); + if(!yuv.overlay->hw_overlay) { + sdl.FreeYUVOverlay(yuv.overlay); + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_UYVY_OVERLAY, win); + if(!yuv.overlay->hw_overlay) { + sdl.FreeYUVOverlay(yuv.overlay); + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YVYU_OVERLAY, win); + if(!yuv.overlay->hw_overlay) { + sdl.FreeYUVOverlay(yuv.overlay); + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YV12_OVERLAY, win); + if(!yuv.overlay->hw_overlay) { + sdl.FreeYUVOverlay(yuv.overlay); + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_IYUV_OVERLAY, win); + } + } + } + } +//fprintf(stderr,"Mode: %d (%d)\n",yuv.overlay->format,yuv.overlay->hw_overlay); sdl.mutexP(yuv.mutex); sdl.LockYUVOverlay(yuv.overlay); sdl_setup_yuv_colours(); -- GitLab