From c977dab4562f5ee1324a971d396a997baf341383 Mon Sep 17 00:00:00 2001 From: reimar Date: Wed, 1 Dec 2004 17:05:58 +0000 Subject: [PATCH] More similar code from gl and gl2 moved to gl_common git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14079 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/gl_common.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++ libvo/gl_common.h | 5 ++ libvo/vo_gl.c | 86 ++----------------------- libvo/vo_gl2.c | 84 ++---------------------- 4 files changed, 177 insertions(+), 159 deletions(-) diff --git a/libvo/gl_common.c b/libvo/gl_common.c index 7c82c74076..3526195618 100644 --- a/libvo/gl_common.c +++ b/libvo/gl_common.c @@ -17,6 +17,167 @@ void glAdjustAlignment(int stride) { glPixelStorei (GL_UNPACK_ALIGNMENT, gl_alignment); } +#include "img_format.h" + +struct gl_name_map_struct { + GLint value; + char *name; +}; + +#undef MAP +#define MAP(a) {a, #a} +static const struct gl_name_map_struct gl_name_map[] = { + // internal format + MAP(GL_R3_G3_B2), MAP(GL_RGB4), MAP(GL_RGB5), MAP(GL_RGB8), + MAP(GL_RGB10), MAP(GL_RGB12), MAP(GL_RGB16), MAP(GL_RGBA2), + MAP(GL_RGBA4), MAP(GL_RGB5_A1), MAP(GL_RGBA8), MAP(GL_RGB10_A2), + MAP(GL_RGBA12), MAP(GL_RGBA16), MAP(GL_LUMINANCE8), + + // format + MAP(GL_RGB), MAP(GL_RGBA), MAP(GL_RED), MAP(GL_GREEN), MAP(GL_BLUE), + MAP(GL_ALPHA), MAP(GL_LUMINANCE), MAP(GL_LUMINANCE_ALPHA), + MAP(GL_COLOR_INDEX), + // rest 1.2 only +#ifdef GL_VERSION_1_2 + MAP(GL_BGR), MAP(GL_BGRA), +#endif + + //type + MAP(GL_BYTE), MAP(GL_UNSIGNED_BYTE), MAP(GL_SHORT), MAP(GL_UNSIGNED_SHORT), + MAP(GL_INT), MAP(GL_UNSIGNED_INT), MAP(GL_FLOAT), MAP(GL_DOUBLE), + MAP(GL_2_BYTES), MAP(GL_3_BYTES), MAP(GL_4_BYTES), + // rest 1.2 only +#ifdef GL_VERSION_1_2 + MAP(GL_UNSIGNED_BYTE_3_3_2), MAP(GL_UNSIGNED_BYTE_2_3_3_REV), + MAP(GL_UNSIGNED_SHORT_5_6_5), MAP(GL_UNSIGNED_SHORT_5_6_5_REV), + MAP(GL_UNSIGNED_SHORT_4_4_4_4), MAP(GL_UNSIGNED_SHORT_4_4_4_4_REV), + MAP(GL_UNSIGNED_SHORT_5_5_5_1), MAP(GL_UNSIGNED_SHORT_1_5_5_5_REV), + MAP(GL_UNSIGNED_INT_8_8_8_8), MAP(GL_UNSIGNED_INT_8_8_8_8_REV), + MAP(GL_UNSIGNED_INT_10_10_10_2), MAP(GL_UNSIGNED_INT_2_10_10_10_REV), +#endif + {0, 0} +}; +#undef MAP + +/** + * \brief return the name of an OpenGL constant + * \param value the constant + * \return name of the constant or "Unknown format!" + */ +const char *glValName(GLint value) +{ + int i = 0; + + while (gl_name_map[i].name) { + if (gl_name_map[i].value == value) + return gl_name_map[i].name; + i++; + } + return "Unknown format!"; +} + +#undef TEXTUREFORMAT_ALWAYS +//! always return this format as internal texture format in glFindFormat +#define TEXTUREFORMAT_ALWAYS GL_RGB8 + +/** + * \brief find the OpenGL settings coresponding to format. + * + * All parameters may be NULL. + * \param fmt MPlayer format to analyze. + * \param bpp [OUT] bits per pixel of that format. + * \param gl_texfmt [OUT] internal texture format that fits the + * image format, not necessarily the best for performance. + * \param gl_format [OUT] OpenGL format for this image format. + * \param gl_type [OUT] OpenGL type for this image format. + * \return 1 if format is supported by OpenGL, 0 if not. + */ +int glFindFormat(uint32_t fmt, uint32_t *bpp, GLenum *gl_texfmt, + GLenum *gl_format, GLenum *gl_type) +{ + int dummy1; + GLenum dummy2; + if (bpp == NULL) bpp = &dummy1; + if (gl_texfmt == NULL) gl_texfmt = &dummy2; + if (gl_format == NULL) gl_format = &dummy2; + if (gl_type == NULL) gl_type = &dummy2; + + *bpp = IMGFMT_IS_BGR(fmt)?IMGFMT_BGR_DEPTH(fmt):IMGFMT_RGB_DEPTH(fmt); + *gl_texfmt = 3; + switch (fmt) { + case IMGFMT_RGB24: + *gl_format = GL_RGB; + *gl_type = GL_UNSIGNED_BYTE; + break; + case IMGFMT_RGBA: + *gl_texfmt = 4; + *gl_format = GL_RGBA; + *gl_type = GL_UNSIGNED_BYTE; + break; + case IMGFMT_Y800: + case IMGFMT_Y8: + *gl_texfmt = 1; + *bpp = 8; + *gl_format = GL_LUMINANCE; + *gl_type = GL_UNSIGNED_BYTE; + break; +#ifdef GL_VERSION_1_2 +#if 0 + // we do not support palettized formats, although the format the + // swscale produces works + case IMGFMT_RGB8: + gl_format = GL_RGB; + gl_type = GL_UNSIGNED_BYTE_2_3_3_REV; + break; +#endif + case IMGFMT_RGB15: + *gl_format = GL_RGBA; + *gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV; + break; + case IMGFMT_RGB16: + *gl_format = GL_RGB; + *gl_type = GL_UNSIGNED_SHORT_5_6_5_REV; + break; +#if 0 + case IMGFMT_BGR8: + // special case as red and blue have a differen number of bits. + // GL_BGR and GL_UNSIGNED_BYTE_3_3_2 isn't supported at least + // by nVidia drivers, and in addition would give more bits to + // blue than to red, which isn't wanted + gl_format = GL_RGB; + gl_type = GL_UNSIGNED_BYTE_3_3_2; + break; +#endif + case IMGFMT_BGR15: + *gl_format = GL_BGRA; + *gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV; + break; + case IMGFMT_BGR16: + *gl_format = GL_RGB; + *gl_type = GL_UNSIGNED_SHORT_5_6_5; + break; + case IMGFMT_BGR24: + *gl_format = GL_BGR; + *gl_type = GL_UNSIGNED_BYTE; + break; + case IMGFMT_BGRA: + *gl_texfmt = 4; + *gl_format = GL_BGRA; + *gl_type = GL_UNSIGNED_BYTE; + break; +#endif + default: + *gl_texfmt = 4; + *gl_format = GL_RGBA; + *gl_type = GL_UNSIGNED_BYTE; + return 0; + } +#ifdef TEXTUREFORMAT_ALWAYS + *gl_texfmt = TEXTUREFORMAT_ALWAYS; +#endif + return 1; +} + #ifndef GL_WIN32 /** * Returns the XVisualInfo associated with Window win. diff --git a/libvo/gl_common.h b/libvo/gl_common.h index 944f500cd3..2a02643483 100644 --- a/libvo/gl_common.h +++ b/libvo/gl_common.h @@ -15,6 +15,11 @@ void glAdjustAlignment(int stride); +const char *glValName(GLint value); + +int glFindFormat(uint32_t format, uint32_t *bpp, GLenum *gl_texfmt, + GLenum *gl_format, GLenum *gl_type); + //! could not set new window, will continue drawing into the old one. #define SET_WINDOW_FAILED -1 //! new window is set, could even transfer the OpenGL context. diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index 458ca4189d..079d3f1be0 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -1,5 +1,3 @@ -#define TEXTUREFORMAT_ALWAYS GL_RGB8 - #include #include #include @@ -104,84 +102,6 @@ static void resize(int x,int y){ } } -static int find_gl_format (uint32_t format) -{ - image_bytes = (IMGFMT_RGB_DEPTH(format)+7)/8; - gl_texfmt = 3; - switch (format) { - case IMGFMT_RGB24: - gl_format = GL_RGB; - gl_type = GL_UNSIGNED_BYTE; - break; - case IMGFMT_RGBA: - gl_texfmt = 4; - gl_format = GL_RGBA; - gl_type = GL_UNSIGNED_BYTE; - break; - case IMGFMT_Y800: - case IMGFMT_Y8: - gl_texfmt = 1; - image_bytes = 1; - gl_format = GL_LUMINANCE; - gl_type = GL_UNSIGNED_BYTE; - break; -#ifdef GL_VERSION_1_2 -#if 0 - // we do not support palettized formats, although the format the - // swscale produces works - case IMGFMT_RGB8: - gl_format = GL_RGB; - gl_type = GL_UNSIGNED_BYTE_2_3_3_REV; - break; -#endif - case IMGFMT_RGB15: - gl_format = GL_RGBA; - gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV; - break; - case IMGFMT_RGB16: - gl_format = GL_RGB; - gl_type = GL_UNSIGNED_SHORT_5_6_5_REV; - break; -#if 0 - case IMGFMT_BGR8: - // special case as red and blue have a differen number of bits. - // GL_BGR and GL_UNSIGNED_BYTE_3_3_2 isn't supported at least - // by nVidia drivers, and in addition would give more bits to - // blue than to red, which isn't wanted - gl_format = GL_RGB; - gl_type = GL_UNSIGNED_BYTE_3_3_2; - break; -#endif - case IMGFMT_BGR15: - gl_format = GL_BGRA; - gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV; - break; - case IMGFMT_BGR16: - gl_format = GL_RGB; - gl_type = GL_UNSIGNED_SHORT_5_6_5; - break; - case IMGFMT_BGR24: - gl_format = GL_BGR; - gl_type = GL_UNSIGNED_BYTE; - break; - case IMGFMT_BGRA: - gl_texfmt = 4; - gl_format = GL_BGRA; - gl_type = GL_UNSIGNED_BYTE; - break; -#endif - default: - gl_texfmt = 4; - gl_format = GL_RGBA; - gl_type = GL_UNSIGNED_BYTE; - return 0; - } -#ifdef TEXTUREFORMAT_ALWAYS - gl_texfmt = TEXTUREFORMAT_ALWAYS; -#endif - return 1; -} - /** * \brief Initialize a (new or reused) OpenGL context. */ @@ -230,7 +150,8 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin { image_height = height; image_width = width; - find_gl_format (format); + glFindFormat(format, &image_bytes, &gl_texfmt, &gl_format, &gl_type); + image_bytes = (image_bytes + 7) / 8; sub_bg_alpha = 255; // We need alpha = 255 for invisible part of the OSD int_pause = 0; @@ -529,7 +450,8 @@ query_format(uint32_t format) caps |= VFCAP_OSD; if ((format == IMGFMT_RGB24) || (format == IMGFMT_RGBA)) return caps; - if (many_fmts && find_gl_format(format)) + if (many_fmts && + glFindFormat(format, NULL, NULL, NULL, NULL)) return caps; return 0; } diff --git a/libvo/vo_gl2.c b/libvo/vo_gl2.c index fe3815b48e..d8fc69c206 100644 --- a/libvo/vo_gl2.c +++ b/libvo/vo_gl2.c @@ -43,10 +43,8 @@ //#undef NDEBUG #undef TEXTUREFORMAT_ALWAYS -#undef TEXTUREFORMAT_ALWAYS_S #ifdef SYS_DARWIN #define TEXTUREFORMAT_ALWAYS GL_RGBA8 -#define TEXTUREFORMAT_ALWAYS_S "GL_RGBA8" #endif static vo_info_t info = @@ -81,7 +79,6 @@ static uint32_t image_width; static uint32_t image_height; static uint32_t image_format; static uint32_t image_bpp; -static int image_mode; static uint32_t image_bytes; static int int_pause; @@ -92,12 +89,9 @@ static int texnumx, texnumy, raw_line_len; static GLfloat texpercx, texpercy; static struct TexSquare * texgrid = NULL; static GLint gl_internal_format; -static char * gl_internal_format_s; static int rgb_sz, r_sz, g_sz, b_sz, a_sz; static GLint gl_bitmap_format; -static char * gl_bitmap_format_s; static GLint gl_bitmap_type; -static char * gl_bitmap_type_s; static int isGL12 = GL_FALSE; static int gl_bilinear=1; @@ -794,10 +788,10 @@ static int initGl(uint32_t d_width, uint32_t d_height) gl_set_antialias(0); gl_set_bilinear(1); - mp_msg(MSGT_VO, MSGL_V, "[gl2] Using image_bpp=%d, image_bytes=%d, isBGR=%d, \n\tgl_bitmap_format=%s, gl_bitmap_type=%s, \n\trgb_size=%d (%d,%d,%d), a_sz=%d, \n\tgl_internal_format=%s\n", - image_bpp, image_bytes, image_mode==MODE_BGR, - gl_bitmap_format_s, gl_bitmap_type_s, - rgb_sz, r_sz, g_sz, b_sz, a_sz, gl_internal_format_s); + mp_msg(MSGT_VO, MSGL_V, "[gl2] Using image_bpp=%d, image_bytes=%d, \n\tgl_bitmap_format=%s, gl_bitmap_type=%s, \n\trgb_size=%d (%d,%d,%d), a_sz=%d, \n\tgl_internal_format=%s\n", + image_bpp, image_bytes, + glValName(gl_bitmap_format), glValName(gl_bitmap_type), + rgb_sz, r_sz, g_sz, b_sz, a_sz, glValName(gl_internal_format)); resize(&d_width, &d_height); @@ -871,54 +865,33 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin if(r_sz==3 && g_sz==3 && b_sz==2 && a_sz==0) { gl_internal_format=GL_R3_G3_B2; - gl_internal_format_s="GL_R3_G3_B2"; } else if(r_sz==4 && g_sz==4 && b_sz==4 && a_sz==0) { gl_internal_format=GL_RGB4; - gl_internal_format_s="GL_RGB4"; } else if(r_sz==5 && g_sz==5 && b_sz==5 && a_sz==0) { gl_internal_format=GL_RGB5; - gl_internal_format_s="GL_RGB5"; } else if(r_sz==8 && g_sz==8 && b_sz==8 && a_sz==0) { gl_internal_format=GL_RGB8; - gl_internal_format_s="GL_RGB8"; } else if(r_sz==10 && g_sz==10 && b_sz==10 && a_sz==0) { gl_internal_format=GL_RGB10; - gl_internal_format_s="GL_RGB10"; } else if(r_sz==2 && g_sz==2 && b_sz==2 && a_sz==2) { gl_internal_format=GL_RGBA2; - gl_internal_format_s="GL_RGBA2"; } else if(r_sz==4 && g_sz==4 && b_sz==4 && a_sz==4) { gl_internal_format=GL_RGBA4; - gl_internal_format_s="GL_RGBA4"; } else if(r_sz==5 && g_sz==5 && b_sz==5 && a_sz==1) { gl_internal_format=GL_RGB5_A1; - gl_internal_format_s="GL_RGB5_A1"; } else if(r_sz==8 && g_sz==8 && b_sz==8 && a_sz==8) { gl_internal_format=GL_RGBA8; - gl_internal_format_s="GL_RGBA8"; } else if(r_sz==10 && g_sz==10 && b_sz==10 && a_sz==2) { gl_internal_format=GL_RGB10_A2; - gl_internal_format_s="GL_RGB10_A2"; } else { gl_internal_format=GL_RGB; - gl_internal_format_s="GL_RGB"; } #ifdef TEXTUREFORMAT_ALWAYS gl_internal_format=TEXTUREFORMAT_ALWAYS; - gl_internal_format_s=TEXTUREFORMAT_ALWAYS_S; #endif - if (IMGFMT_IS_BGR(format)) - { - image_mode=MODE_BGR; - image_bpp=IMGFMT_BGR_DEPTH(format); - } - else - { - image_mode=MODE_RGB; - image_bpp=IMGFMT_RGB_DEPTH(format); - } + glFindFormat(format, &image_bpp, NULL, &gl_bitmap_format, &gl_bitmap_type); image_bytes=(image_bpp+7)/8; @@ -927,58 +900,15 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin switch(image_bpp) { case 15: - case 16: - if(image_mode!=MODE_BGR) - { - gl_bitmap_format = GL_RGB; - gl_bitmap_format_s ="GL_RGB"; - gl_bitmap_type = GL_UNSIGNED_SHORT_5_6_5; - gl_bitmap_type_s ="GL_UNSIGNED_SHORT_5_6_5"; - } else { - gl_bitmap_format = GL_BGR; - gl_bitmap_format_s ="GL_BGR"; - gl_bitmap_type = GL_UNSIGNED_SHORT_5_6_5; - gl_bitmap_type_s ="GL_UNSIGNED_SHORT_5_6_5"; - } - - if (image_bpp==15) draw_alpha_fnc=draw_alpha_15; - else + break; + case 16: draw_alpha_fnc=draw_alpha_16; - break; case 24: - if(image_mode!=MODE_BGR) - { - /* RGB888 */ - gl_bitmap_format = GL_RGB; - gl_bitmap_format_s ="GL_RGB"; - } else { - /* BGR888 */ - gl_bitmap_format = GL_BGR; - gl_bitmap_format_s ="GL_BGR"; - } - gl_bitmap_type = GL_UNSIGNED_BYTE; - gl_bitmap_type_s ="GL_UNSIGNED_BYTE"; - draw_alpha_fnc=draw_alpha_24; break; - break; case 32: - /* RGBA8888 */ - gl_bitmap_format = GL_BGRA; - gl_bitmap_format_s ="GL_BGRA"; - - if(image_mode!=MODE_BGR) - { - gl_bitmap_type = GL_UNSIGNED_INT_8_8_8_8_REV; - gl_bitmap_type_s ="GL_UNSIGNED_INT_8_8_8_8_REV"; - } else { - gl_bitmap_type = GL_UNSIGNED_INT_8_8_8_8; - gl_bitmap_type_s ="GL_UNSIGNED_INT_8_8_8_8"; - } - draw_alpha_fnc=draw_alpha_32; break; - break; } if (initGl(d_width, d_height) == -1)