Mercurial > libavcodec.hg
changeset 1208:0f37976aa436 libavcodec
added img_get_alpha_info()
author | bellard |
---|---|
date | Mon, 21 Apr 2003 21:20:46 +0000 |
parents | 162be12df86a |
children | 0aa744ab1c07 |
files | avcodec.h imgconvert.c imgconvert_template.h |
diffstat | 3 files changed, 93 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/avcodec.h Mon Apr 21 15:15:59 2003 +0000 +++ b/avcodec.h Mon Apr 21 21:20:46 2003 +0000 @@ -15,8 +15,8 @@ #define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION "0.4.6" -#define LIBAVCODEC_BUILD 4665 -#define LIBAVCODEC_BUILD_STR "4665" +#define LIBAVCODEC_BUILD 4666 +#define LIBAVCODEC_BUILD_STR "4666" #define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR @@ -1276,6 +1276,10 @@ int avcodec_find_best_pix_fmt(int pix_fmt_mask, int src_pix_fmt, 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 */ int img_convert(AVPicture *dst, int dst_pix_fmt, AVPicture *src, int pix_fmt,
--- a/imgconvert.c Mon Apr 21 15:15:59 2003 +0000 +++ b/imgconvert.c Mon Apr 21 21:20:46 2003 +0000 @@ -475,7 +475,9 @@ } } -/* copy image 'src' to 'dst' */ +/** + * Copy image 'src' to 'dst'. + */ void img_copy(AVPicture *dst, AVPicture *src, int pix_fmt, int width, int height) { @@ -1808,6 +1810,62 @@ 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 #define DEINT_INPLACE_LINE_LUM \
--- a/imgconvert_template.h Mon Apr 21 15:15:59 2003 +0000 +++ b/imgconvert_template.h Mon Apr 21 21:20:46 2003 +0000 @@ -814,6 +814,34 @@ #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 RGBA_IN #undef RGB_OUT