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