forked from enlightenment/efl
yuv pixel import api (well arbitary pixel format import api) for doing media
sreams (video) via image objects SVN revision: 8068
This commit is contained in:
parent
2bd12227d7
commit
58d0647f41
|
@ -51,6 +51,7 @@
|
||||||
#undef BUILD_CONVERT_32_RGB_ROT0
|
#undef BUILD_CONVERT_32_RGB_ROT0
|
||||||
#undef BUILD_CONVERT_32_RGB_ROT270
|
#undef BUILD_CONVERT_32_RGB_ROT270
|
||||||
#undef BUILD_CONVERT_32_RGB_ROT90
|
#undef BUILD_CONVERT_32_RGB_ROT90
|
||||||
|
#undef BUILD_CONVERT_YUV
|
||||||
#undef BUILD_SCALE_SAMPLE
|
#undef BUILD_SCALE_SAMPLE
|
||||||
#undef BUILD_SCALE_SMOOTH
|
#undef BUILD_SCALE_SMOOTH
|
||||||
#undef BUILD_SCALE_TRILINEAR
|
#undef BUILD_SCALE_TRILINEAR
|
||||||
|
|
|
@ -33,4 +33,5 @@ rm config.cache
|
||||||
--enable-convert-32-rgb-rot-0 \
|
--enable-convert-32-rgb-rot-0 \
|
||||||
--enable-convert-32-rgb-rot-90 \
|
--enable-convert-32-rgb-rot-90 \
|
||||||
--enable-convert-32-rgb-rot-270 \
|
--enable-convert-32-rgb-rot-270 \
|
||||||
|
--enable-convert-yuv \
|
||||||
$@
|
$@
|
||||||
|
|
|
@ -737,6 +737,19 @@ AC_ARG_ENABLE(convert-32-rgb-rot-90,
|
||||||
], AC_MSG_RESULT(no)
|
], AC_MSG_RESULT(no)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(whether to build yuv converter code)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(convert-yuv,
|
||||||
|
[ --enable-convert-yuv enable yuv converter code], [
|
||||||
|
if [ test "$enableval" = "yes" ]; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(BUILD_CONVERT_YUV)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
], AC_MSG_RESULT(no)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AC_SUBST(freetype_cflags)
|
AC_SUBST(freetype_cflags)
|
||||||
|
|
|
@ -92,6 +92,7 @@ struct _Evas_Smart_Class /** a smart object class */
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct _Evas_Pixel_Import_Source Evas_Pixel_Import_Source; /**< A source description of pixels for importing pixels */
|
||||||
typedef struct _Evas_Engine_Info Evas_Engine_Info; /**< A generic Evas Engine information structure */
|
typedef struct _Evas_Engine_Info Evas_Engine_Info; /**< A generic Evas Engine information structure */
|
||||||
typedef struct _Evas_Event_Mouse_Down Evas_Event_Mouse_Down; /**< Event structure for #EVAS_CALLBACK_MOUSE_DOWN event callbacks */
|
typedef struct _Evas_Event_Mouse_Down Evas_Event_Mouse_Down; /**< Event structure for #EVAS_CALLBACK_MOUSE_DOWN event callbacks */
|
||||||
typedef struct _Evas_Event_Mouse_Up Evas_Event_Mouse_Up; /**< Event structure for #EVAS_CALLBACK_MOUSE_UP event callbacks */
|
typedef struct _Evas_Event_Mouse_Up Evas_Event_Mouse_Up; /**< Event structure for #EVAS_CALLBACK_MOUSE_UP event callbacks */
|
||||||
|
@ -114,6 +115,17 @@ typedef struct _Evas_Event_Key_Up Evas_Event_Key_Up; /**< Event structure fo
|
||||||
#define EVAS_ALLOC_ERROR_FATAL 1 /**< Allocation failed despite attempts to free up memory */
|
#define EVAS_ALLOC_ERROR_FATAL 1 /**< Allocation failed despite attempts to free up memory */
|
||||||
#define EVAS_ALLOC_ERROR_RECOVERED 2 /**< Allocation succeeded, but extra memory had to be found by freeing up speculative resources */
|
#define EVAS_ALLOC_ERROR_RECOVERED 2 /**< Allocation succeeded, but extra memory had to be found by freeing up speculative resources */
|
||||||
|
|
||||||
|
struct _Evas_Pixel_Import_Source
|
||||||
|
{
|
||||||
|
int format; /**< pixel format type ie ARGB32, YUV420P_601 etc. */
|
||||||
|
int w, h; /**< width and height of source in pixels */
|
||||||
|
void **rows; /**< an array of pointers (size depends on format) pointing to left edge of each scanline */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define EVAS_PIXEL_FORMAT_NONE 0 /**< No pixel format */
|
||||||
|
#define EVAS_PIXEL_FORMAT_ARGB32 1 /**< ARGB 32bit pixel format with A in the high byte per 32bit pixel word */
|
||||||
|
#define EVAS_PIXEL_FORMAT_YUV420P_601 2 /**< YUV 420 Planar format with CCIR 601 color encoding wuth contiguous planes in the order Y, U and V */
|
||||||
|
|
||||||
struct _Evas_Engine_Info /** Generic engine information. Generic info is useless */
|
struct _Evas_Engine_Info /** Generic engine information. Generic info is useless */
|
||||||
{
|
{
|
||||||
int magic; /**< Magic number */
|
int magic; /**< Magic number */
|
||||||
|
@ -334,6 +346,10 @@ extern "C" {
|
||||||
void evas_object_image_smooth_scale_set(Evas_Object *obj, Evas_Bool smooth_scale);
|
void evas_object_image_smooth_scale_set(Evas_Object *obj, Evas_Bool smooth_scale);
|
||||||
Evas_Bool evas_object_image_smooth_scale_get(Evas_Object *obj);
|
Evas_Bool evas_object_image_smooth_scale_get(Evas_Object *obj);
|
||||||
void evas_object_image_reload (Evas_Object *obj);
|
void evas_object_image_reload (Evas_Object *obj);
|
||||||
|
Evas_Bool evas_object_image_pixels_import (Evas_Object *obj, Evas_Pixel_Import_Source *pixels);
|
||||||
|
void evas_object_image_pixels_get_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *o), void *data);
|
||||||
|
void evas_object_image_pixels_dirty_set (Evas_Object *obj, Evas_Bool dirty);
|
||||||
|
Evas_Bool evas_object_image_pixels_dirty_get (Evas_Object *obj);
|
||||||
|
|
||||||
void evas_image_cache_flush (Evas *e);
|
void evas_image_cache_flush (Evas *e);
|
||||||
void evas_image_cache_reload (Evas *e);
|
void evas_image_cache_reload (Evas *e);
|
||||||
|
|
|
@ -31,10 +31,16 @@ struct _Evas_Object_Image
|
||||||
} cur, prev;
|
} cur, prev;
|
||||||
|
|
||||||
char changed : 1;
|
char changed : 1;
|
||||||
|
char dirty_pixels : 1;
|
||||||
|
|
||||||
int load_error;
|
int load_error;
|
||||||
Evas_List *pixel_updates;
|
Evas_List *pixel_updates;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
void (*get_pixels) (void *data, Evas_Object *o);
|
||||||
|
void *get_pixels_data;
|
||||||
|
} func;
|
||||||
|
|
||||||
void *engine_data;
|
void *engine_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -654,8 +660,166 @@ evas_object_image_reload(Evas_Object *obj)
|
||||||
o->changed = 1;
|
o->changed = 1;
|
||||||
evas_object_change(obj);
|
evas_object_change(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To be documented.
|
||||||
|
*
|
||||||
|
* FIXME: To be fixed.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
Evas_Bool
|
||||||
|
evas_object_image_pixels_import(Evas_Object *obj, Evas_Pixel_Import_Source *pixels)
|
||||||
|
{
|
||||||
|
Evas_Object_Image *o;
|
||||||
|
|
||||||
|
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
||||||
|
return 0;
|
||||||
|
MAGIC_CHECK_END();
|
||||||
|
o = (Evas_Object_Image *)(obj->object_data);
|
||||||
|
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
|
||||||
|
return 0;
|
||||||
|
MAGIC_CHECK_END();
|
||||||
|
|
||||||
|
if ((pixels->w != o->cur.image.w) || (pixels->h != o->cur.image.h)) return 0;
|
||||||
|
switch (pixels->format)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
case EVAS_PIXEL_FORMAT_ARGB32:
|
||||||
|
{
|
||||||
|
if (o->engine_data)
|
||||||
|
{
|
||||||
|
DATA32 *image_pixels = NULL;
|
||||||
|
|
||||||
|
o->engine_data =
|
||||||
|
obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
|
||||||
|
o->engine_data,
|
||||||
|
1,
|
||||||
|
&image_pixels);
|
||||||
|
/* FIXME: need to actualyl support this */
|
||||||
|
/* memcpy(image_pixels, pixels->rows, o->cur.image.w * o->cur.image.h * 4);*/
|
||||||
|
if (o->engine_data)
|
||||||
|
o->engine_data =
|
||||||
|
obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output,
|
||||||
|
o->engine_data,
|
||||||
|
image_pixels);
|
||||||
|
if (o->engine_data)
|
||||||
|
o->engine_data =
|
||||||
|
obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
|
||||||
|
o->engine_data,
|
||||||
|
o->cur.has_alpha);
|
||||||
|
o->changed = 1;
|
||||||
|
evas_object_change(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef BUILD_CONVERT_YUV
|
||||||
|
case EVAS_PIXEL_FORMAT_YUV420P_601:
|
||||||
|
{
|
||||||
|
if (o->engine_data)
|
||||||
|
{
|
||||||
|
DATA32 *image_pixels = NULL;
|
||||||
|
|
||||||
|
o->engine_data =
|
||||||
|
obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
|
||||||
|
o->engine_data,
|
||||||
|
1,
|
||||||
|
&image_pixels);
|
||||||
|
if (image_pixels)
|
||||||
|
evas_common_convert_yuv_420p_601_rgba(pixels->rows,
|
||||||
|
image_pixels,
|
||||||
|
o->cur.image.w,
|
||||||
|
o->cur.image.h);
|
||||||
|
if (o->engine_data)
|
||||||
|
o->engine_data =
|
||||||
|
obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output,
|
||||||
|
o->engine_data,
|
||||||
|
image_pixels);
|
||||||
|
if (o->engine_data)
|
||||||
|
o->engine_data =
|
||||||
|
obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output,
|
||||||
|
o->engine_data,
|
||||||
|
o->cur.has_alpha);
|
||||||
|
o->changed = 1;
|
||||||
|
evas_object_change(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To be documented.
|
||||||
|
*
|
||||||
|
* FIXME: To be fixed.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
evas_object_image_pixels_get_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *o), void *data)
|
||||||
|
{
|
||||||
|
Evas_Object_Image *o;
|
||||||
|
|
||||||
|
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
||||||
|
return;
|
||||||
|
MAGIC_CHECK_END();
|
||||||
|
o = (Evas_Object_Image *)(obj->object_data);
|
||||||
|
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
|
||||||
|
return;
|
||||||
|
MAGIC_CHECK_END();
|
||||||
|
o->func.get_pixels = func;
|
||||||
|
o->func.get_pixels_data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To be documented.
|
||||||
|
*
|
||||||
|
* FIXME: To be fixed.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
evas_object_image_pixels_dirty_set(Evas_Object *obj, Evas_Bool dirty)
|
||||||
|
{
|
||||||
|
Evas_Object_Image *o;
|
||||||
|
|
||||||
|
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
||||||
|
return;
|
||||||
|
MAGIC_CHECK_END();
|
||||||
|
o = (Evas_Object_Image *)(obj->object_data);
|
||||||
|
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
|
||||||
|
return;
|
||||||
|
MAGIC_CHECK_END();
|
||||||
|
if (dirty) o->dirty_pixels = 1;
|
||||||
|
else o->dirty_pixels = 0;
|
||||||
|
o->changed = 1;
|
||||||
|
evas_object_change(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To be documented.
|
||||||
|
*
|
||||||
|
* FIXME: To be fixed.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
Evas_Bool
|
||||||
|
evas_object_image_pixels_dirty_get(Evas_Object *obj)
|
||||||
|
{
|
||||||
|
Evas_Object_Image *o;
|
||||||
|
|
||||||
|
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
||||||
|
return 0;
|
||||||
|
MAGIC_CHECK_END();
|
||||||
|
o = (Evas_Object_Image *)(obj->object_data);
|
||||||
|
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
|
||||||
|
return 0;
|
||||||
|
MAGIC_CHECK_END();
|
||||||
|
if (o->dirty_pixels) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To be documented.
|
* To be documented.
|
||||||
|
@ -964,7 +1128,13 @@ evas_object_image_render(Evas_Object *obj, void *output, void *context, void *su
|
||||||
{
|
{
|
||||||
Evas_Coord idw, idh, idx, idy;
|
Evas_Coord idw, idh, idx, idy;
|
||||||
int ix, iy, iw, ih;
|
int ix, iy, iw, ih;
|
||||||
|
|
||||||
|
if (o->dirty_pixels)
|
||||||
|
{
|
||||||
|
if (o->func.get_pixels)
|
||||||
|
o->func.get_pixels(o->func.get_pixels_data, obj);
|
||||||
|
o->dirty_pixels = 0;
|
||||||
|
}
|
||||||
idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw);
|
idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw);
|
||||||
idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh);
|
idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh);
|
||||||
if (idw < 1.0) idw = 1.0;
|
if (idw < 1.0) idw = 1.0;
|
||||||
|
@ -1186,6 +1356,11 @@ evas_object_image_render_pre(Evas_Object *obj)
|
||||||
updates = evas_object_render_pre_prev_cur_add(updates, obj);
|
updates = evas_object_render_pre_prev_cur_add(updates, obj);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
if (o->dirty_pixels)
|
||||||
|
{
|
||||||
|
updates = evas_object_render_pre_prev_cur_add(updates, obj);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* if it changed geometry - and obviously not visibility or color */
|
/* if it changed geometry - and obviously not visibility or color */
|
||||||
/* caluclate differences since we have a constant color fill */
|
/* caluclate differences since we have a constant color fill */
|
||||||
|
|
|
@ -31,6 +31,7 @@ evas_convert_rgb_16.c \
|
||||||
evas_convert_rgb_24.c \
|
evas_convert_rgb_24.c \
|
||||||
evas_convert_rgb_32.c \
|
evas_convert_rgb_32.c \
|
||||||
evas_convert_rgb_8.c \
|
evas_convert_rgb_8.c \
|
||||||
|
evas_convert_yuv.c \
|
||||||
evas_cpu.c \
|
evas_cpu.c \
|
||||||
evas_draw_main.c \
|
evas_draw_main.c \
|
||||||
evas_font_draw.c \
|
evas_font_draw.c \
|
||||||
|
|
|
@ -15,7 +15,12 @@ evas_common_cpu_catch_ill(int sig)
|
||||||
longjmp(detect_buf, 1);
|
longjmp(detect_buf, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __i386__
|
#if ( \
|
||||||
|
defined __i386__ || \
|
||||||
|
defined __386__ || \
|
||||||
|
defined __X86__ || \
|
||||||
|
defined _M_IX86 || \
|
||||||
|
defined i386)
|
||||||
void
|
void
|
||||||
evas_common_cpu_mmx_test(void)
|
evas_common_cpu_mmx_test(void)
|
||||||
{
|
{
|
||||||
|
@ -93,7 +98,12 @@ evas_common_cpu_init(void)
|
||||||
|
|
||||||
if (called) return;
|
if (called) return;
|
||||||
called = 1;
|
called = 1;
|
||||||
#ifdef __i386__
|
#if ( \
|
||||||
|
defined __i386__ || \
|
||||||
|
defined __386__ || \
|
||||||
|
defined __X86__ || \
|
||||||
|
defined _M_IX86 || \
|
||||||
|
defined i386)
|
||||||
#ifdef BUILD_MMX
|
#ifdef BUILD_MMX
|
||||||
cpu_feature_mask |= CPU_FEATURE_MMX *
|
cpu_feature_mask |= CPU_FEATURE_MMX *
|
||||||
evas_common_cpu_feature_test(evas_common_cpu_mmx_test);
|
evas_common_cpu_feature_test(evas_common_cpu_mmx_test);
|
||||||
|
|
|
@ -7,7 +7,13 @@
|
||||||
|
|
||||||
#include "evas_options.h"
|
#include "evas_options.h"
|
||||||
|
|
||||||
#ifndef __i386__
|
#if ( \
|
||||||
|
defined __i386__ || \
|
||||||
|
defined __386__ || \
|
||||||
|
defined __X86__ || \
|
||||||
|
defined _M_IX86 || \
|
||||||
|
defined i386)
|
||||||
|
#else
|
||||||
# undef BUILD_MMX
|
# undef BUILD_MMX
|
||||||
# undef BUILD_SSE
|
# undef BUILD_SSE
|
||||||
# ifndef BUILD_C
|
# ifndef BUILD_C
|
||||||
|
@ -705,6 +711,8 @@ void evas_common_convert_rgba_to_4bpp_gry_1_dith (DATA32 *src, DAT
|
||||||
|
|
||||||
void evas_common_convert_rgba_to_1bpp_gry_1_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
|
void evas_common_convert_rgba_to_1bpp_gry_1_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
|
||||||
|
|
||||||
|
void evas_common_convert_yuv_420p_601_rgba (DATA8 **src, DATA8 *dst, int w, int h);
|
||||||
|
|
||||||
/****/
|
/****/
|
||||||
void evas_common_scale_init (void);
|
void evas_common_scale_init (void);
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ typedef union {
|
||||||
char b[8]; /* 8 Byte (8-bit) values */
|
char b[8]; /* 8 Byte (8-bit) values */
|
||||||
unsigned char ub[8]; /* 8 Unsigned Byte */
|
unsigned char ub[8]; /* 8 Unsigned Byte */
|
||||||
float s[2]; /* Single-precision (32-bit) value */
|
float s[2]; /* Single-precision (32-bit) value */
|
||||||
} mmx_t;
|
} __attribute__ ((aligned (8))) mmx_t;
|
||||||
|
|
||||||
/* Helper functions for the instruction macros that follow...
|
/* Helper functions for the instruction macros that follow...
|
||||||
(note that memory-to-register, m2r, instructions are nearly
|
(note that memory-to-register, m2r, instructions are nearly
|
||||||
|
@ -128,7 +128,6 @@ typedef union {
|
||||||
: "=X" (memd) \
|
: "=X" (memd) \
|
||||||
: "X" (mems))
|
: "X" (mems))
|
||||||
|
|
||||||
|
|
||||||
/* 1x64 MOVe Quadword
|
/* 1x64 MOVe Quadword
|
||||||
(this is both a load and a store...
|
(this is both a load and a store...
|
||||||
in fact, it is the only way to store)
|
in fact, it is the only way to store)
|
||||||
|
@ -141,6 +140,7 @@ typedef union {
|
||||||
"movq %%mm0, %0" \
|
"movq %%mm0, %0" \
|
||||||
: "=X" (vard) \
|
: "=X" (vard) \
|
||||||
: "X" (vars))
|
: "X" (vars))
|
||||||
|
#define movntq_r2m(reg, var) mmx_r2m(movntq, reg, var)
|
||||||
|
|
||||||
|
|
||||||
/* 1x32 MOVe Doubleword
|
/* 1x32 MOVe Doubleword
|
||||||
|
|
Loading…
Reference in New Issue