[vlc-devel] commit: Added support for * to RGBA/YUVA conversions (close #1844). ( Laurent Aimar )

git version control git at videolan.org
Mon Aug 18 19:39:23 CEST 2008


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Mon Aug 18 13:27:15 2008 +0200| [97e41e4de997ec0d390daadf1174f82a0c6421ee] | committer: Laurent Aimar 

Added support for * to RGBA/YUVA conversions (close #1844).

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=97e41e4de997ec0d390daadf1174f82a0c6421ee
---

 modules/video_filter/swscale.c |   56 +++++++++++++++++++++++++++++++--------
 1 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/modules/video_filter/swscale.c b/modules/video_filter/swscale.c
index e4411d1..a3d62f9 100644
--- a/modules/video_filter/swscale.c
+++ b/modules/video_filter/swscale.c
@@ -96,13 +96,14 @@ struct filter_sys_t
     int i_extend_factor;
     picture_t *p_src_e;
     picture_t *p_dst_e;
+    bool b_add_a;
 };
 
 static picture_t *Filter( filter_t *, picture_t * );
 static int  Init( filter_t * );
 static void Clean( filter_t * );
 
-static int GetParameters( int *pi_fmti, int *pi_fmto, bool *pb_has_a, int *pi_sws_flags,
+static int GetParameters( int *pi_fmti, int *pi_fmto, bool *pb_has_a, bool *pb_add_a, int *pi_sws_flags,
                           const video_format_t *p_fmti, 
                           const video_format_t *p_fmto,
                           int i_sws_flags_default );
@@ -115,6 +116,9 @@ static int GetSwsCpuMask(void);
 /* SwScaler does not like too small picture */
 #define MINIMUM_WIDTH (16)
 
+/* XXX is it always 3 even for BIG_ENDIAN (blend.c seems to think so) ? */
+#define OFFSET_A (3)
+
 /*****************************************************************************
  * OpenScaler: probe the filter and return score
  *****************************************************************************/
@@ -129,7 +133,7 @@ static int OpenScaler( vlc_object_t *p_this )
     int sws_chr_vshift = 0, sws_chr_hshift = 0;
     float sws_chr_sharpen = 0.0, sws_lum_sharpen = 0.0;
 
-    if( GetParameters( NULL, NULL, NULL, NULL,
+    if( GetParameters( NULL, NULL, NULL, NULL, NULL,
                        &p_filter->fmt_in.video,
                        &p_filter->fmt_out.video, 0 ) )
     {
@@ -243,20 +247,16 @@ static bool IsFmtSimilar( const video_format_t *p_fmt1, const video_format_t *p_
            p_fmt1->i_height == p_fmt2->i_height;
 }
 
-static int GetParameters( int *pi_fmti, int *pi_fmto, bool *pb_has_a, int *pi_sws_flags,
+static int GetParameters( int *pi_fmti, int *pi_fmto, bool *pb_has_a, bool *pb_add_a, int *pi_sws_flags,
                           const video_format_t *p_fmti, 
                           const video_format_t *p_fmto,
                           int i_sws_flags_default )
 {
-    /* Supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR24,
-     * BGR16, BGR15, RGB32, RGB24, Y8/Y800, YVU9/IF09 */
     int i_fmti = GetFfmpegChroma( p_fmti->i_chroma );
-
-    /* Supported output formats: YV12, I420/IYUV, YUY2, UYVY,
-     * {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09 */
     int i_fmto = GetFfmpegChroma( p_fmto->i_chroma );
 
     bool b_has_a = false;
+    bool b_add_a = false;
     int i_sws_flags = i_sws_flags_default;
 
     if( p_fmti->i_chroma == p_fmto->i_chroma )
@@ -277,6 +277,23 @@ static int GetParameters( int *pi_fmti, int *pi_fmto, bool *pb_has_a, int *pi_sw
             b_has_a = true;
         }
     }
+    if( i_fmti >= 0 && i_fmto < 0 )
+    {
+        /* Special case: injecting dummy alpha plane */
+        switch( p_fmto->i_chroma )
+        {
+        case VLC_FOURCC( 'Y', 'U', 'V', 'A' ):
+            i_fmto = PIX_FMT_YUV444P;
+            b_add_a = true;
+            break;
+        case VLC_FOURCC( 'R', 'G', 'B', 'A' ):
+            i_fmto = PIX_FMT_RGBA32;
+            b_add_a = true;
+            break;
+        default:
+            break;
+        }
+    }
 
     if( pi_fmti )
         *pi_fmti = i_fmti;
@@ -284,6 +301,8 @@ static int GetParameters( int *pi_fmti, int *pi_fmto, bool *pb_has_a, int *pi_sw
         *pi_fmto = i_fmto;
     if( pb_has_a )
         *pb_has_a = b_has_a;
+    if( pb_add_a )
+        *pb_add_a = b_add_a;
     if( pi_sws_flags )
         *pi_sws_flags = i_sws_flags;
 
@@ -310,8 +329,9 @@ static int Init( filter_t *p_filter )
     /* Init with new parameters */
     int i_fmt_in, i_fmt_out;
     bool b_has_a;
+    bool b_add_a;
     int i_sws_flags;
-    if( GetParameters( &i_fmt_in, &i_fmt_out, &b_has_a, &i_sws_flags,
+    if( GetParameters( &i_fmt_in, &i_fmt_out, &b_has_a, &b_add_a, &i_sws_flags,
                        p_fmti, p_fmto, p_sys->i_sws_flags ) )
     {
         msg_Err( p_filter, "format not supported" );
@@ -368,6 +388,7 @@ static int Init( filter_t *p_filter )
         return VLC_EGENERIC;
     }
 
+    p_sys->b_add_a = b_add_a;
     p_sys->fmt_in  = *p_fmti;
     p_sys->fmt_out = *p_fmto;
 
@@ -425,8 +446,6 @@ static void GetPixels( uint8_t *pp_pixel[3], int pi_pitch[3],
     }
 }
 
-/* XXX is it always 3 even for BIG_ENDIAN (blend.c seems to think so) ? */
-#define OFFSET_A (3)
 static void ExtractA( picture_t *p_dst, const picture_t *p_src, unsigned i_width, unsigned i_height )
 {
     plane_t *d = &p_dst->p[0];
@@ -445,7 +464,12 @@ static void InjectA( picture_t *p_dst, const picture_t *p_src, unsigned i_width,
         for( unsigned x = 0; x < i_width; x++ )
             d->p_pixels[y*d->i_pitch+4*x+OFFSET_A] = s->p_pixels[y*s->i_pitch+x];
 }
-#undef OFFSET_A
+static void FillA( plane_t *d, int i_offset )
+{
+    for( int y = 0; y < d->i_visible_lines; y++ )
+        for( int x = 0; x < d->i_visible_pitch; x += d->i_pixel_pitch )
+            d->p_pixels[y*d->i_pitch+x+i_offset] = 0xff;
+}
 
 static void CopyPad( picture_t *p_dst, const picture_t *p_src )
 {
@@ -536,6 +560,14 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic )
             Convert( p_sys->ctxA, p_dst, p_src, p_fmti->i_height, 3, 1 );
         }
     }
+    if( p_sys->b_add_a )
+    {
+        /* We inject a complete opaque alpha plane */
+        if( p_fmto->i_chroma == VLC_FOURCC( 'R', 'G', 'B', 'A' ) )
+            FillA( &p_dst->p[0], OFFSET_A );
+        else
+            FillA( &p_dst->p[A_PLANE], 0 );
+    }
 
     if( p_sys->i_extend_factor != 1 )
     {




More information about the vlc-devel mailing list