added img_get_alpha_info()
Originally committed as revision 1809 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
a059da1227
commit
0469baf14f
@ -15,8 +15,8 @@ extern "C" {
|
|||||||
|
|
||||||
#define LIBAVCODEC_VERSION_INT 0x000406
|
#define LIBAVCODEC_VERSION_INT 0x000406
|
||||||
#define LIBAVCODEC_VERSION "0.4.6"
|
#define LIBAVCODEC_VERSION "0.4.6"
|
||||||
#define LIBAVCODEC_BUILD 4665
|
#define LIBAVCODEC_BUILD 4666
|
||||||
#define LIBAVCODEC_BUILD_STR "4665"
|
#define LIBAVCODEC_BUILD_STR "4666"
|
||||||
|
|
||||||
#define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR
|
#define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR
|
||||||
|
|
||||||
@ -1276,6 +1276,10 @@ int avcodec_get_pix_fmt_loss(int dst_pix_fmt, int src_pix_fmt,
|
|||||||
int avcodec_find_best_pix_fmt(int pix_fmt_mask, int src_pix_fmt,
|
int avcodec_find_best_pix_fmt(int pix_fmt_mask, int src_pix_fmt,
|
||||||
int has_alpha, int *loss_ptr);
|
int has_alpha, int *loss_ptr);
|
||||||
|
|
||||||
|
#define FF_ALPHA_TRANSP 0x0001 /* image has some totally transparent pixels */
|
||||||
|
#define FF_ALPHA_SEMI_TRANSP 0x0002 /* image has some transparent pixels */
|
||||||
|
int img_get_alpha_info(AVPicture *src, int pix_fmt, int width, int height);
|
||||||
|
|
||||||
/* convert among pixel formats */
|
/* convert among pixel formats */
|
||||||
int img_convert(AVPicture *dst, int dst_pix_fmt,
|
int img_convert(AVPicture *dst, int dst_pix_fmt,
|
||||||
AVPicture *src, int pix_fmt,
|
AVPicture *src, int pix_fmt,
|
||||||
|
@ -475,7 +475,9 @@ static void img_copy_plane(uint8_t *dst, int dst_wrap,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy image 'src' to 'dst' */
|
/**
|
||||||
|
* Copy image 'src' to 'dst'.
|
||||||
|
*/
|
||||||
void img_copy(AVPicture *dst, AVPicture *src,
|
void img_copy(AVPicture *dst, AVPicture *src,
|
||||||
int pix_fmt, int width, int height)
|
int pix_fmt, int width, int height)
|
||||||
{
|
{
|
||||||
@ -1808,6 +1810,62 @@ int img_convert(AVPicture *dst, int dst_pix_fmt,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* NOTE: we scan all the pixels to have an exact information */
|
||||||
|
static int get_alpha_info_pal8(AVPicture *src, int width, int height)
|
||||||
|
{
|
||||||
|
const unsigned char *p;
|
||||||
|
int src_wrap, ret, x, y;
|
||||||
|
unsigned int a;
|
||||||
|
uint32_t *palette = (uint32_t *)src->data[1];
|
||||||
|
|
||||||
|
p = src->data[0];
|
||||||
|
src_wrap = src->linesize[0] - width;
|
||||||
|
ret = 0;
|
||||||
|
for(y=0;y<height;y++) {
|
||||||
|
for(x=0;x<width;x++) {
|
||||||
|
a = palette[p[0]] >> 24;
|
||||||
|
if (a == 0x00) {
|
||||||
|
ret |= FF_ALPHA_TRANSP;
|
||||||
|
} else if (a != 0xff) {
|
||||||
|
ret |= FF_ALPHA_SEMI_TRANSP;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
p += src_wrap;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if an image really has transparent alpha values.
|
||||||
|
* @return ored mask of FF_ALPHA_xxx constants
|
||||||
|
*/
|
||||||
|
int img_get_alpha_info(AVPicture *src, int pix_fmt, int width, int height)
|
||||||
|
{
|
||||||
|
PixFmtInfo *pf = &pix_fmt_info[pix_fmt];
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
pf = &pix_fmt_info[pix_fmt];
|
||||||
|
/* no alpha can be represented in format */
|
||||||
|
if (!pf->is_alpha)
|
||||||
|
return 0;
|
||||||
|
switch(pix_fmt) {
|
||||||
|
case PIX_FMT_RGBA32:
|
||||||
|
ret = get_alpha_info_rgba32(src, width, height);
|
||||||
|
break;
|
||||||
|
case PIX_FMT_RGB555:
|
||||||
|
ret = get_alpha_info_rgb555(src, width, height);
|
||||||
|
break;
|
||||||
|
case PIX_FMT_PAL8:
|
||||||
|
ret = get_alpha_info_pal8(src, width, height);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* we do not know, so everything is indicated */
|
||||||
|
ret = FF_ALPHA_TRANSP | FF_ALPHA_SEMI_TRANSP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_MMX
|
#ifdef HAVE_MMX
|
||||||
#define DEINT_INPLACE_LINE_LUM \
|
#define DEINT_INPLACE_LINE_LUM \
|
||||||
|
@ -814,6 +814,34 @@ static void glue(RGB_NAME, _to_pal8)(AVPicture *dst, AVPicture *src,
|
|||||||
|
|
||||||
#endif /* defined(FMT_RGB24) || defined(FMT_RGBA32) */
|
#endif /* defined(FMT_RGB24) || defined(FMT_RGBA32) */
|
||||||
|
|
||||||
|
#ifdef RGBA_IN
|
||||||
|
|
||||||
|
static int glue(get_alpha_info_, RGB_NAME)(AVPicture *src, int width, int height)
|
||||||
|
{
|
||||||
|
const unsigned char *p;
|
||||||
|
int src_wrap, ret, x, y;
|
||||||
|
unsigned int r, g, b, a;
|
||||||
|
|
||||||
|
p = src->data[0];
|
||||||
|
src_wrap = src->linesize[0] - BPP * width;
|
||||||
|
ret = 0;
|
||||||
|
for(y=0;y<height;y++) {
|
||||||
|
for(x=0;x<width;x++) {
|
||||||
|
RGBA_IN(r, g, b, a, p);
|
||||||
|
if (a == 0x00) {
|
||||||
|
ret |= FF_ALPHA_TRANSP;
|
||||||
|
} else if (a != 0xff) {
|
||||||
|
ret |= FF_ALPHA_SEMI_TRANSP;
|
||||||
|
}
|
||||||
|
p += BPP;
|
||||||
|
}
|
||||||
|
p += src_wrap;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* RGBA_IN */
|
||||||
|
|
||||||
#undef RGB_IN
|
#undef RGB_IN
|
||||||
#undef RGBA_IN
|
#undef RGBA_IN
|
||||||
#undef RGB_OUT
|
#undef RGB_OUT
|
||||||
|
Loading…
x
Reference in New Issue
Block a user