[vlc-commits] demux: avi: handle bitfield RGB masks

Francois Cartegnie git at videolan.org
Tue Mar 6 19:48:50 CET 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Mar  6 19:44:22 2018 +0100| [3274eb71594d55419631243f547025d88a06bc68] | committer: Francois Cartegnie

demux: avi: handle bitfield RGB masks

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

 modules/demux/avi/avi.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c
index 290c8c49af..575bc96826 100644
--- a/modules/demux/avi/avi.c
+++ b/modules/demux/avi/avi.c
@@ -589,7 +589,8 @@ static int Open( vlc_object_t * p_this )
                 else
                     i_bihextra = 0;
 
-                if( p_vids->p_bih->biCompression == BI_RGB )
+                if( p_vids->p_bih->biCompression == BI_RGB ||
+                    p_vids->p_bih->biCompression == BI_BITFIELDS )
                 {
                     switch( p_vids->p_bih->biBitCount )
                     {
@@ -627,7 +628,22 @@ static int Open( vlc_object_t * p_this )
                             break;
                     }
 
-                    if( tk->fmt.i_codec == VLC_CODEC_RGBP )
+                    if( p_vids->p_bih->biCompression == BI_BITFIELDS ) /* Only 16 & 32 */
+                    {
+                        if( i_bihextra >= 3 * sizeof(uint32_t) )
+                        {
+                            tk->fmt.video.i_rmask = GetDWLE( &p_bihextra[0] );
+                            tk->fmt.video.i_gmask = GetDWLE( &p_bihextra[4] );
+                            tk->fmt.video.i_bmask = GetDWLE( &p_bihextra[8] );
+                            if( i_bihextra >= 4 * sizeof(uint32_t) ) /* Alpha channel ? */
+                            {
+                                uint32_t i_alpha = GetDWLE( &p_bihextra[8] );
+                                if( tk->fmt.i_codec == VLC_CODEC_RGB32 && i_alpha == 0xFF )
+                                    tk->fmt.i_codec = VLC_CODEC_BGRA;
+                            }
+                        }
+                    }
+                    else if( tk->fmt.i_codec == VLC_CODEC_RGBP )
                     {
                         /* The palette should not be included in biSize, but come
                          * directly after BITMAPINFORHEADER in the BITMAPINFO structure */



More information about the vlc-commits mailing list