# HG changeset patch # User reimar # Date 1152386606 0 # Node ID 9f1bbc70c773df144cb1a20d0fcf761e67c8fac2 # Parent 3aaed991e8cd9ca4d08d5f71ca7f0dde86733828 Support for 16 bit ppms diff -r 3aaed991e8cd -r 9f1bbc70c773 libvo/gl_common.c --- a/libvo/gl_common.c Sat Jul 08 19:22:36 2006 +0000 +++ b/libvo/gl_common.c Sat Jul 08 19:23:26 2006 +0000 @@ -67,6 +67,8 @@ //! \defgroup glconversion OpenGL conversion helper functions +static GLint hqtexfmt; + /** * \brief adjusts the GL_UNPACK_ALIGNMENT to fit the stride. * \param stride number of bytes per line for which alignment should fit. @@ -314,6 +316,12 @@ } *(dsc->funcptr) = ptr; } + if (strstr(allexts, "_texture_float")) + hqtexfmt = GL_RGB32F; + else if (strstr(allexts, "NV_float_buffer")) + hqtexfmt = GL_FLOAT_RGB32_NV; + else + hqtexfmt = GL_RGB16; free(allexts); } @@ -370,7 +378,7 @@ /** * \brief creates a texture from a PPM file * \param target texture taget, usually GL_TEXTURE_2D - * \param fmt internal texture format + * \param fmt internal texture format, 0 for default * \param filter filter used for scaling, e.g. GL_LINEAR * \param f file to read PPM from * \param width [out] width of texture @@ -381,7 +389,7 @@ */ int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter, FILE *f, int *width, int *height, int *maxval) { - unsigned w, h, m, val; + unsigned w, h, m, val, bpp; char *data; ppm_skip(f); if (fgetc(f) != 'P' || fgetc(f) != '6') @@ -400,11 +408,18 @@ return 0; if (w > MAXDIM || h > MAXDIM) return 0; - data = malloc(w * h * 3); - if (fread(data, w * 3, h, f) != h) + bpp = (m > 255) ? 6 : 3; + data = malloc(w * h * bpp); + if (fread(data, w * bpp, h, f) != h) return 0; + if (!fmt) { + fmt = (m > 255) ? hqtexfmt : 3; + if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE) + fmt = GL_RGB16; + } glCreateClearTex(target, fmt, filter, w, h, 0); - glUploadTex(target, GL_RGB, GL_UNSIGNED_BYTE, data, w * 3, 0, 0, w, h, 0); + glUploadTex(target, GL_RGB, (m > 255) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE, + data, w * bpp, 0, 0, w, h, 0); free(data); if (width) *width = w; if (height) *height = h; @@ -422,6 +437,7 @@ * Does not handle all possible variants, just those used by MPlayer */ int glFmt2bpp(GLenum format, GLenum type) { + int component_size = 0; switch (type) { case GL_UNSIGNED_BYTE_3_3_2: case GL_UNSIGNED_BYTE_2_3_3_REV: @@ -431,19 +447,23 @@ case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5_REV: return 2; + case GL_UNSIGNED_BYTE: + component_size = 1; + break; + case GL_UNSIGNED_SHORT: + component_size = 2; + break; } - if (type != GL_UNSIGNED_BYTE) - return 0; //not implemented switch (format) { case GL_LUMINANCE: case GL_ALPHA: - return 1; + return component_size; case GL_RGB: case GL_BGR: - return 3; + return 3 * component_size; case GL_RGBA: case GL_BGRA: - return 4; + return 4 * component_size; } return 0; // unknown } diff -r 3aaed991e8cd -r 9f1bbc70c773 libvo/gl_common.h --- a/libvo/gl_common.h Sat Jul 08 19:22:36 2006 +0000 +++ b/libvo/gl_common.h Sat Jul 08 19:23:26 2006 +0000 @@ -180,6 +180,12 @@ #ifndef GL_UNSIGNED_SHORT_1_5_5_5_REV #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #endif +#ifndef GL_RGB32F +#define GL_RGB32F 0x8815 +#endif +#ifndef GL_FLOAT_RGB32_NV +#define GL_FLOAT_RGB32_NV 0x8889 +#endif #ifndef GL_FRAGMENT_PROGRAM #define GL_FRAGMENT_PROGRAM 0x8804 #endif