summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2003-04-21 21:20:46 +0000
committerFabrice Bellard <fabrice@bellard.org>2003-04-21 21:20:46 +0000
commit0469baf14f0bb7aecd75474fc47aef47f723b4e3 (patch)
tree9708d0ac5147cce172fda6b07f26cec5a6e93da8
parenta059da1227aa2ae12e2d417469243629b9edd01c (diff)
added img_get_alpha_info()
Originally committed as revision 1809 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/avcodec.h8
-rw-r--r--libavcodec/imgconvert.c60
-rw-r--r--libavcodec/imgconvert_template.h28
3 files changed, 93 insertions, 3 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index ac9f554466..3fa7abfec8 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -15,8 +15,8 @@ extern "C" {
#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_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 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,
diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c
index f9cea4e57e..7bbceeff9a 100644
--- a/libavcodec/imgconvert.c
+++ b/libavcodec/imgconvert.c
@@ -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,
int pix_fmt, int width, int height)
{
@@ -1808,6 +1810,62 @@ int img_convert(AVPicture *dst, int dst_pix_fmt,
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 \
diff --git a/libavcodec/imgconvert_template.h b/libavcodec/imgconvert_template.h
index b2573b2623..015b74f1e3 100644
--- a/libavcodec/imgconvert_template.h
+++ b/libavcodec/imgconvert_template.h
@@ -814,6 +814,34 @@ static void glue(RGB_NAME, _to_pal8)(AVPicture *dst, AVPicture *src,
#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