# HG changeset patch # User reimar # Date 1346622702 0 # Node ID b291f44d864afcff10332616a1e70974bd2566bc # Parent a0ff4fde7a486ccb66ee77708212d847dd4e4471 Avoid some code duplication related to drawing the OSD. This also fixes some bugs in sdl and xv when drawing OSD on uyvy frames. diff -r a0ff4fde7a48 -r b291f44d864a libvo/video_out.h --- a/libvo/video_out.h Sun Sep 02 21:17:03 2012 +0000 +++ b/libvo/video_out.h Sun Sep 02 21:51:42 2012 +0000 @@ -279,6 +279,14 @@ struct vo_rect *borders, const struct vo_rect *crop); void vo_mouse_movement(int posx, int posy); +static inline int pixel_stride(unsigned fmt) { + if (IMGFMT_IS_RGB(fmt)) + return (IMGFMT_RGB_DEPTH(fmt) + 7) / 8; + if (IMGFMT_IS_BGR(fmt)) + return (IMGFMT_BGR_DEPTH(fmt) + 7) / 8; + return IMGFMT_IS_YUVP16(fmt) ? 2 : 1; +} + static inline int aspect_scaling(void) { return vo_fs; diff -r a0ff4fde7a48 -r b291f44d864a libvo/vo_dga.c --- a/libvo/vo_dga.c Sun Sep 02 21:17:03 2012 +0000 +++ b/libvo/vo_dga.c Sun Sep 02 21:51:42 2012 +0000 @@ -245,31 +245,15 @@ char *d; unsigned int offset; int buffer_stride; + int bpp = pixel_stride(vo_dga_src_format); + vo_draw_alpha_func draw = vo_get_draw_alpha(vo_dga_src_format); offset = vo_dga_width * y0 + x0; - buffer_stride = vo_dga_width; + buffer_stride = vo_dga_width * bpp; d = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset; - - switch (HW_MODE.vdm_mplayer_depth) - { + d += bpp * offset; - case 32: - vo_draw_alpha_rgb32(w, h, src, srca, stride, d + 4 * offset, - 4 * buffer_stride); - break; - case 24: - vo_draw_alpha_rgb24(w, h, src, srca, stride, d + 3 * offset, - 3 * buffer_stride); - break; - case 15: - vo_draw_alpha_rgb15(w, h, src, srca, stride, d + 2 * offset, - 2 * buffer_stride); - break; - case 16: - vo_draw_alpha_rgb16(w, h, src, srca, stride, d + 2 * offset, - 2 * buffer_stride); - break; - } + if (draw) draw(w, h, src, srca, stride, d, buffer_stride); } diff -r a0ff4fde7a48 -r b291f44d864a libvo/vo_fbdev.c --- a/libvo/vo_fbdev.c Sun Sep 02 21:17:03 2012 +0000 +++ b/libvo/vo_fbdev.c Sun Sep 02 21:51:42 2012 +0000 @@ -848,25 +848,7 @@ mp_msg(MSGT_VO, MSGL_WARN, "requested %d bpp, got %d bpp!!!\n", fb_bpp_we_want, fb_bpp); - switch (fb_bpp) { - case 32: - draw_alpha_p = vo_draw_alpha_rgb32; - break; - case 24: - draw_alpha_p = vo_draw_alpha_rgb24; - break; - case 16: - draw_alpha_p = vo_draw_alpha_rgb16; - break; - case 15: - draw_alpha_p = vo_draw_alpha_rgb15; - break; - case 12: - draw_alpha_p = vo_draw_alpha_rgb12; - break; - default: - return 1; - } + draw_alpha_p = vo_get_draw_alpha(format); fb_xres = fb_vinfo.xres; fb_yres = fb_vinfo.yres; diff -r a0ff4fde7a48 -r b291f44d864a libvo/vo_fbdev2.c --- a/libvo/vo_fbdev2.c Sun Sep 02 21:17:03 2012 +0000 +++ b/libvo/vo_fbdev2.c Sun Sep 02 21:51:42 2012 +0000 @@ -229,14 +229,7 @@ return 1; } - switch (fb_bpp) { - case 32: draw_alpha_p = vo_draw_alpha_rgb32; break; - case 24: draw_alpha_p = vo_draw_alpha_rgb24; break; - case 16: draw_alpha_p = vo_draw_alpha_rgb16; break; - case 15: draw_alpha_p = vo_draw_alpha_rgb15; break; - case 12: draw_alpha_p = vo_draw_alpha_rgb12; break; - default: return 1; - } + draw_alpha_p = vo_get_draw_alpha(format); if (vo_config_count == 0) { if (ioctl(fb_dev_fd, FBIOGET_FSCREENINFO, &fb_finfo)) { diff -r a0ff4fde7a48 -r b291f44d864a libvo/vo_gl2.c --- a/libvo/vo_gl2.c Sun Sep 02 21:17:03 2012 +0000 +++ b/libvo/vo_gl2.c Sun Sep 02 21:51:42 2012 +0000 @@ -89,9 +89,6 @@ static int is_yuv; static int use_glFinish; -static void (*draw_alpha_fnc) - (int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride); - /* The squares that are tiled to make up the game screen polygon */ @@ -456,23 +453,11 @@ glLoadIdentity(); } -static void draw_alpha_32(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ - vo_draw_alpha_rgb32(w,h,src,srca,stride,ImageData+4*(y0*image_width+x0),4*image_width); -} - -static void draw_alpha_24(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ - vo_draw_alpha_rgb24(w,h,src,srca,stride,ImageData+3*(y0*image_width+x0),3*image_width); -} - -static void draw_alpha_16(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ - vo_draw_alpha_rgb16(w,h,src,srca,stride,ImageData+2*(y0*image_width+x0),2*image_width); -} - -static void draw_alpha_15(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ - vo_draw_alpha_rgb15(w,h,src,srca,stride,ImageData+2*(y0*image_width+x0),2*image_width); -} - -static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ +static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ + int bpp = pixel_stride(image_format); + vo_draw_alpha_func draw = vo_get_draw_alpha(image_format); + if (!draw) return; + draw(w,h,src,srca,stride,ImageData+bpp*(y0*image_width+x0),bpp*image_width); } #ifdef CONFIG_GL_WIN32 @@ -665,19 +650,6 @@ image_bytes=(image_bpp+7)/8; - draw_alpha_fnc=draw_alpha_null; - - switch(image_bpp) { - case 15: - draw_alpha_fnc=draw_alpha_15; break; - case 16: - draw_alpha_fnc=draw_alpha_16; break; - case 24: - draw_alpha_fnc=draw_alpha_24; break; - case 32: - draw_alpha_fnc=draw_alpha_32; break; - } - if (initGl(vo_dwidth, vo_dheight) == -1) return -1; @@ -730,7 +702,7 @@ static void draw_osd(void) { if (ImageData) - vo_draw_text(image_width,image_height,draw_alpha_fnc); + vo_draw_text(image_width,image_height,draw_alpha); } static void diff -r a0ff4fde7a48 -r b291f44d864a libvo/vo_sdl.c --- a/libvo/vo_sdl.c Sun Sep 02 21:17:03 2012 +0000 +++ b/libvo/vo_sdl.c Sun Sep 02 21:51:42 2012 +0000 @@ -233,6 +233,8 @@ static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ struct sdl_priv_s *priv = &sdl_priv; + vo_draw_alpha_func draw = vo_get_draw_alpha(priv->format); + if (!draw) return; if(priv->osd_has_changed) { /* OSD did change. Store a bounding box of everything drawn into the OSD */ @@ -268,67 +270,25 @@ return; } + x0 *= pixel_stride(priv->format); switch(priv->format) { + case IMGFMT_YUY2: + case IMGFMT_YVYU: + case IMGFMT_UYVY: case IMGFMT_YV12: case IMGFMT_I420: case IMGFMT_IYUV: - vo_draw_alpha_yv12(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+priv->overlay->pitches[0]*y0+x0,priv->overlay->pitches[0]); - break; - case IMGFMT_YUY2: - case IMGFMT_YVYU: - x0 *= 2; - vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+priv->overlay->pitches[0]*y0+x0,priv->overlay->pitches[0]); - break; - case IMGFMT_UYVY: - x0 *= 2; - vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+priv->overlay->pitches[0]*y0+x0,priv->overlay->pitches[0]); + draw(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+priv->overlay->pitches[0]*y0+x0,priv->overlay->pitches[0]); break; default: if(priv->dblit) { - x0 *= priv->surface->format->BytesPerPixel; - switch(priv->format) { - case IMGFMT_RGB15: - case IMGFMT_BGR15: - vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) priv->surface->pixels)+y0*priv->surface->pitch+x0,priv->surface->pitch); - break; - case IMGFMT_RGB16: - case IMGFMT_BGR16: - vo_draw_alpha_rgb16(w,h,src,srca,stride,((uint8_t *) priv->surface->pixels)+y0*priv->surface->pitch+x0,priv->surface->pitch); - break; - case IMGFMT_RGB24: - case IMGFMT_BGR24: - vo_draw_alpha_rgb24(w,h,src,srca,stride,((uint8_t *) priv->surface->pixels)+y0*priv->surface->pitch+x0,priv->surface->pitch); - break; - case IMGFMT_RGB32: - case IMGFMT_BGR32: - vo_draw_alpha_rgb32(w,h,src,srca,stride,((uint8_t *) priv->surface->pixels)+y0*priv->surface->pitch+x0,priv->surface->pitch); - break; - } + draw(w,h,src,srca,stride,((uint8_t *) priv->surface->pixels)+y0*priv->surface->pitch+x0,priv->surface->pitch); } else { - x0 *= priv->rgbsurface->format->BytesPerPixel; - switch(priv->format) { - case IMGFMT_RGB15: - case IMGFMT_BGR15: - vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+y0*priv->rgbsurface->pitch+x0,priv->rgbsurface->pitch); - break; - case IMGFMT_RGB16: - case IMGFMT_BGR16: - vo_draw_alpha_rgb16(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+y0*priv->rgbsurface->pitch+x0,priv->rgbsurface->pitch); - break; - case IMGFMT_RGB24: - case IMGFMT_BGR24: - vo_draw_alpha_rgb24(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+y0*priv->rgbsurface->pitch+x0,priv->rgbsurface->pitch); - break; - case IMGFMT_RGB32: - case IMGFMT_BGR32: - vo_draw_alpha_rgb32(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+y0*priv->rgbsurface->pitch+x0,priv->rgbsurface->pitch); - break; + draw(w,h,src,srca,stride,((uint8_t *) priv->rgbsurface->pixels)+y0*priv->rgbsurface->pitch+x0,priv->rgbsurface->pitch); } } - - } } diff -r a0ff4fde7a48 -r b291f44d864a libvo/vo_x11.c --- a/libvo/vo_x11.c Sun Sep 02 21:17:03 2012 +0000 +++ b/libvo/vo_x11.c Sun Sep 02 21:51:42 2012 +0000 @@ -66,9 +66,7 @@ const LIBVO_EXTERN(x11) /* private prototypes */ -static void (*draw_alpha_fnc) (int x0, int y0, int w, int h, - unsigned char *src, unsigned char *srca, - int stride); +vo_draw_alpha_func draw_alpha_func; /* local data */ static unsigned char *ImageData; @@ -110,42 +108,13 @@ flip_page(); } -static void draw_alpha_32(int x0, int y0, int w, int h, unsigned char *src, - unsigned char *srca, int stride) -{ - vo_draw_alpha_rgb32(w, h, src, srca, stride, - ImageData + 4 * (y0 * image_width + x0), - 4 * image_width); -} - -static void draw_alpha_24(int x0, int y0, int w, int h, unsigned char *src, - unsigned char *srca, int stride) +static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, + unsigned char *srca, int stride) { - vo_draw_alpha_rgb24(w, h, src, srca, stride, - ImageData + 3 * (y0 * image_width + x0), - 3 * image_width); -} - -static void draw_alpha_16(int x0, int y0, int w, int h, unsigned char *src, - unsigned char *srca, int stride) -{ - vo_draw_alpha_rgb16(w, h, src, srca, stride, - ImageData + 2 * (y0 * image_width + x0), - 2 * image_width); -} - -static void draw_alpha_15(int x0, int y0, int w, int h, unsigned char *src, - unsigned char *srca, int stride) -{ - vo_draw_alpha_rgb15(w, h, src, srca, stride, - ImageData + 2 * (y0 * image_width + x0), - 2 * image_width); -} - -static void draw_alpha_null(int x0, int y0, int w, int h, - unsigned char *src, unsigned char *srca, - int stride) -{ + int bpp = pixel_stride(out_format); + draw_alpha_func(w, h, src, srca, stride, + ImageData + bpp * (y0 * image_width + x0), + bpp * image_width); } static struct SwsContext *swsContext = NULL; @@ -406,24 +375,9 @@ return -1; } out_format = fmte->mpfmt; - switch ((bpp = myximage->bits_per_pixel)) - { - case 24: - draw_alpha_fnc = draw_alpha_24; - break; - case 32: - draw_alpha_fnc = draw_alpha_32; - break; - case 15: - case 16: - if (depth == 15) - draw_alpha_fnc = draw_alpha_15; - else - draw_alpha_fnc = draw_alpha_16; - break; - default: - draw_alpha_fnc = draw_alpha_null; - } + draw_alpha_func = vo_get_draw_alpha(out_format); + + bpp = myximage->bits_per_pixel; out_offset = 0; // We can easily "emulate" non-native RGB32 and BGR32 if (out_format == (IMGFMT_BGR32 | 128) || out_format == (IMGFMT_RGB32 | 128)) { @@ -482,7 +436,8 @@ static void draw_osd(void) { - vo_draw_text(image_width, image_height, draw_alpha_fnc); + if (draw_alpha_func) + vo_draw_text(image_width, image_height, draw_alpha); } static void flip_page(void) diff -r a0ff4fde7a48 -r b291f44d864a libvo/vo_xv.c --- a/libvo/vo_xv.c Sun Sep 02 21:17:03 2012 +0000 +++ b/libvo/vo_xv.c Sun Sep 02 21:51:42 2012 +0000 @@ -107,9 +107,7 @@ static struct vo_rect dst_rect; static uint32_t max_width = 0, max_height = 0; // zero means: not set -static void (*draw_alpha_fnc) (int x0, int y0, int w, int h, - unsigned char *src, unsigned char *srca, - int stride); +vo_draw_alpha_func draw_alpha_func; static void fixup_osd_position(int *x0, int *y0, int *w, int *h) { @@ -120,48 +118,20 @@ *y0 = FFMIN(*y0, image_height - *h); } -static void draw_alpha_yv12(int x0, int y0, int w, int h, +static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride) { + if (!draw_alpha_func) return; fixup_osd_position(&x0, &y0, &w, &h); - vo_draw_alpha_yv12(w, h, src, srca, stride, + x0 *= pixel_stride(xv_format); + draw_alpha_func(w, h, src, srca, stride, xvimage[current_buf]->data + xvimage[current_buf]->offsets[0] + xvimage[current_buf]->pitches[0] * y0 + x0, xvimage[current_buf]->pitches[0]); } -static void draw_alpha_yuy2(int x0, int y0, int w, int h, - unsigned char *src, unsigned char *srca, - int stride) -{ - fixup_osd_position(&x0, &y0, &w, &h); - vo_draw_alpha_yuy2(w, h, src, srca, stride, - xvimage[current_buf]->data + - xvimage[current_buf]->offsets[0] + - xvimage[current_buf]->pitches[0] * y0 + 2 * x0, - xvimage[current_buf]->pitches[0]); -} - -static void draw_alpha_uyvy(int x0, int y0, int w, int h, - unsigned char *src, unsigned char *srca, - int stride) -{ - fixup_osd_position(&x0, &y0, &w, &h); - vo_draw_alpha_yuy2(w, h, src, srca, stride, - xvimage[current_buf]->data + - xvimage[current_buf]->offsets[0] + - xvimage[current_buf]->pitches[0] * y0 + 2 * x0 + 1, - xvimage[current_buf]->pitches[0]); -} - -static void draw_alpha_null(int x0, int y0, int w, int h, - unsigned char *src, unsigned char *srca, - int stride) -{ -} - static void deallocate_xvimage(int foo); @@ -268,23 +238,7 @@ mp_msg(MSGT_VO, MSGL_V, "using Xvideo port %d for hw scaling\n", xv_port); - switch (xv_format) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - draw_alpha_fnc = draw_alpha_yv12; - break; - case IMGFMT_YUY2: - case IMGFMT_YVYU: - draw_alpha_fnc = draw_alpha_yuy2; - break; - case IMGFMT_UYVY: - draw_alpha_fnc = draw_alpha_uyvy; - break; - default: - draw_alpha_fnc = draw_alpha_null; - } + draw_alpha_func = vo_get_draw_alpha(xv_format); if (vo_config_count) for (current_buf = 0; current_buf < num_buffers; ++current_buf) @@ -407,7 +361,7 @@ { vo_draw_text(image_width - image_width * vo_panscan_x / (vo_dwidth + vo_panscan_x), - image_height, draw_alpha_fnc); + image_height, draw_alpha); } static void flip_page(void)