[FFmpeg-devel] [PATCH] Use RGB555LE/RGB565LE pixfmts instead of byte swapping in bmpenc

Daniel Verkamp daniel
Tue Mar 24 22:56:30 CET 2009


On Tue, Mar 24, 2009 at 3:19 PM, Daniel Verkamp <daniel at drv.nu> wrote:
> Hi,
>
> The recent addition of LE/BE pixfmts for 15/16-bit RGB allows some
> simplification in the bmp encoder.
>
> Thanks,
> -- Daniel Verkamp
>

Similar patch for bmp decoder; also consolidates almost-identical
cases for 8, 16, and 24bpp.

Thanks,
-- Daniel Verkamp
-------------- next part --------------
>From 30c006f15a596fa867552081bd8a3cfc21a530ee Mon Sep 17 00:00:00 2001
From: Daniel Verkamp <daniel at drv.nu>
Date: Tue, 24 Mar 2009 16:56:41 -0500
Subject: [PATCH] bmp decoder: consolidate 8, 16, 24bpp line copying and use new LE 16-bpp pixfmts

---
 libavcodec/bmp.c |   28 +++++++---------------------
 1 files changed, 7 insertions(+), 21 deletions(-)

diff --git a/libavcodec/bmp.c b/libavcodec/bmp.c
index 14c070d..ff1b344 100644
--- a/libavcodec/bmp.c
+++ b/libavcodec/bmp.c
@@ -159,9 +159,9 @@ static int bmp_decode_frame(AVCodecContext *avctx,
         break;
     case 16:
         if(comp == BMP_RGB)
-            avctx->pix_fmt = PIX_FMT_RGB555;
+            avctx->pix_fmt = PIX_FMT_RGB555LE;
         if(comp == BMP_BITFIELDS)
-            avctx->pix_fmt = rgb[1] == 0x07E0 ? PIX_FMT_RGB565 : PIX_FMT_RGB555;
+            avctx->pix_fmt = rgb[1] == 0x07E0 ? PIX_FMT_RGB565LE : PIX_FMT_RGB555LE;
         break;
     case 8:
         if(hsize - ihsize - 14 > 0)
@@ -262,31 +262,17 @@ static int bmp_decode_frame(AVCodecContext *avctx,
             }
             break;
         case 8:
-            for(i = 0; i < avctx->height; i++){
-                memcpy(ptr, buf, avctx->width);
-                buf += n;
-                ptr += linesize;
-            }
-            break;
-        case 24:
-            for(i = 0; i < avctx->height; i++){
-                memcpy(ptr, buf, avctx->width*(depth>>3));
-                buf += n;
-                ptr += linesize;
-            }
-            break;
         case 16:
+        case 24:
+        {
+            int in_linesize = avctx->width * (depth >> 3);
             for(i = 0; i < avctx->height; i++){
-                const uint16_t *src = (const uint16_t *) buf;
-                uint16_t *dst = (uint16_t *) ptr;
-
-                for(j = 0; j < avctx->width; j++)
-                    *dst++ = le2me_16(*src++);
-
+                memcpy(ptr, buf, in_linesize);
                 buf += n;
                 ptr += linesize;
             }
             break;
+        }
         case 32:
             for(i = 0; i < avctx->height; i++){
                 const uint8_t *src = buf;
-- 
1.6.2



More information about the ffmpeg-devel mailing list