summaryrefslogtreecommitdiff
path: root/src/video_out/yuv2rgb.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_out/yuv2rgb.h')
-rw-r--r--src/video_out/yuv2rgb.h166
1 files changed, 102 insertions, 64 deletions
diff --git a/src/video_out/yuv2rgb.h b/src/video_out/yuv2rgb.h
index 493481260..6efa64f28 100644
--- a/src/video_out/yuv2rgb.h
+++ b/src/video_out/yuv2rgb.h
@@ -4,113 +4,151 @@
#include <inttypes.h>
+typedef struct yuv2rgb_s yuv2rgb_t;
+
+typedef struct yuv2rgb_factory_s yuv2rgb_factory_t;
+
+/*
+ * function types for functions which can be replaced
+ * by hardware-accelerated versions
+ */
/* internal function use to scale yuv data */
typedef void (*scale_line_func_t) (uint8_t *source, uint8_t *dest,
int width, int step);
+typedef void (*yuv2rgb_fun_t) (yuv2rgb_t *this, uint8_t * image, uint8_t * py,
+ uint8_t * pu, uint8_t * pv) ;
+
+typedef void (*yuy22rgb_fun_t) (yuv2rgb_t *this, uint8_t * image, uint8_t * p);
+
+typedef uint32_t (*yuv2rgb_single_pixel_fun_t) (yuv2rgb_t *this, uint8_t y,
+ uint8_t u, uint8_t v);
+
/*
* modes supported - feel free to implement yours
*/
-#define MODE_8_RGB 1
-#define MODE_8_BGR 2
-#define MODE_15_RGB 3
-#define MODE_15_BGR 4
-#define MODE_16_RGB 5
-#define MODE_16_BGR 6
-#define MODE_24_RGB 7
-#define MODE_24_BGR 8
-#define MODE_32_RGB 9
-#define MODE_32_BGR 10
-#define MODE_8_GRAY 11
+#define MODE_8_RGB 1
+#define MODE_8_BGR 2
+#define MODE_15_RGB 3
+#define MODE_15_BGR 4
+#define MODE_16_RGB 5
+#define MODE_16_BGR 6
+#define MODE_24_RGB 7
+#define MODE_24_BGR 8
+#define MODE_32_RGB 9
+#define MODE_32_BGR 10
+#define MODE_8_GRAY 11
#define MODE_PALETTE 12
-typedef struct yuv2rgb_s yuv2rgb_t;
-
struct yuv2rgb_s {
/*
+ * configure converter for scaling factors
+ */
+ int (*configure) (yuv2rgb_t *this,
+ int source_width, int source_height,
+ int y_stride, int uv_stride,
+ int dest_width, int dest_height,
+ int rgb_stride);
+
+ /*
* this is the function to call for the yuv2rgb and scaling process
*/
- void (*yuv2rgb_fun) (yuv2rgb_t *this, uint8_t * image, uint8_t * py,
- uint8_t * pu, uint8_t * pv) ;
+ yuv2rgb_fun_t yuv2rgb_fun;
/*
* this is the function to call for the yuy2->rgb and scaling process
*/
- void (*yuy22rgb_fun) (yuv2rgb_t *this, uint8_t * image, uint8_t * p);
+ yuy22rgb_fun_t yuy22rgb_fun;
/*
* this is the function to call for the yuv2rgb for a single pixel
* (used for converting clut colors)
*/
- uint32_t (*yuv2rgb_single_pixel_fun) (yuv2rgb_t *this, uint8_t y,
- uint8_t u, uint8_t v);
+
+ yuv2rgb_single_pixel_fun_t yuv2rgb_single_pixel_fun;
/* private stuff below */
- uint32_t matrix_coefficients;
- int source_width, source_height;
- int y_stride, uv_stride;
- int dest_width, dest_height;
- int rgb_stride;
- int step_dx, step_dy;
- int do_scale;
- uint8_t *y_buffer;
- uint8_t *u_buffer;
- uint8_t *v_buffer;
- void *y_chunk;
- void *u_chunk;
- void *v_chunk;
-
- void *table_rV[256];
- void *table_gU[256];
- int table_gV[256];
- void *table_bU[256];
-
- uint8_t *fast_rgb;
+ int source_width, source_height;
+ int y_stride, uv_stride;
+ int dest_width, dest_height;
+ int rgb_stride;
+ int step_dx, step_dy;
+ int do_scale;
+
+ uint8_t *y_buffer;
+ uint8_t *u_buffer;
+ uint8_t *v_buffer;
+ void *y_chunk;
+ void *u_chunk;
+ void *v_chunk;
+
+ void **table_rV;
+ void **table_gU;
+ int *table_gV;
+ void **table_bU;
+
+ uint8_t *cmap;
scale_line_func_t scale_line;
- int gamma;
- int entry_size;
} ;
-
-/* call once on startup */
-yuv2rgb_t *yuv2rgb_init (int mode, int swapped, uint8_t *colormap);
-
/*
- * set up yuv2rgb function, determine scaling parameters if necessary
- * returns 0 on failure, 1 otherwise
+ * convenience class to easily create a lot of converters
*/
-int yuv2rgb_setup (yuv2rgb_t *this,
- int source_width, int source_height,
- int y_stride, int uv_stride,
- int dest_width, int dest_height,
- int rgb_stride);
-/* adjust gamma (-100 to 100 looks fine) */
-void yuv2rgb_set_gamma (yuv2rgb_t *this, int gamma);
+struct yuv2rgb_factory_s {
+
+ yuv2rgb_t* (*create_converter) (yuv2rgb_factory_t *this);
+
+ /*
+ * adjust gamma (-100 to 100 looks fine)
+ * for all converters produced by this factory
+ */
+ void (*set_gamma) (yuv2rgb_factory_t *this, int gamma);
-/* get gamma value */
-int yuv2rgb_get_gamma (yuv2rgb_t *this);
+ /*
+ * get gamma value
+ */
+ int (*get_gamma) (yuv2rgb_factory_t *this);
+ /* private data */
+
+ int mode;
+ int swapped;
+ uint8_t *cmap;
+
+ int gamma;
+ int entry_size;
+
+ uint32_t matrix_coefficients;
+
+ void *table_rV[256];
+ void *table_gU[256];
+ int table_gV[256];
+ void *table_bU[256];
+
+ /* preselected functions for mode/swap/hardware */
+ yuv2rgb_fun_t *yuv2rgb_fun;
+ yuy22rgb_fun_t *yuy22rgb_fun;
+ yuv2rgb_single_pixel_fun_t *yuv2rgb_single_pixel_fun;
+
+};
+
+yuv2rgb_factory_t *yuv2rgb_factory_init (int mode, int swapped, uint8_t *colormap);
+
/*
* internal stuff below this line
*/
void mmx_yuv2rgb_set_gamma(int gamma);
-void yuv2rgb_init_mmxext (yuv2rgb_t *this, int mode, int swapped);
-void yuv2rgb_init_mmx (yuv2rgb_t *this, int mode, int swapped);
-void yuv2rgb_init_mlib (yuv2rgb_t *this, int mode, int swapped);
-
-/*
-void Color565DitherYV12MMX1X(unsigned char *lum, unsigned char *cr,
- unsigned char *cb, unsigned char *out,
- int rows, int cols, int mod );
-*/
+void yuv2rgb_init_mmxext (yuv2rgb_factory_t *this);
+void yuv2rgb_init_mmx (yuv2rgb_factory_t *this);
+void yuv2rgb_init_mlib (yuv2rgb_factory_t *this);
#endif