[SCM] libav/experimental: pixdesc: use 8-bit accesses when possible in av_read/write_image_line()

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 17:15:44 UTC 2013


The following commit has been merged in the experimental branch:
commit 9525243f59f0a13e099612b66f7ba5d5d5293c70
Author: Måns Rullgård <mans at mansr.com>
Date:   Sun Sep 12 21:39:54 2010 +0000

    pixdesc: use 8-bit accesses when possible in av_read/write_image_line()
    
    This fixes out of bounds accesses for big endian formats and should be
    a little faster.
    
    Originally committed as revision 25110 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 98f5a9b..6d618f3 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -53,9 +53,15 @@ void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesiz
         }
     } else {
         const uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1;
+        int is_8bit = 0;
 
+        if (shift + depth <= 8) {
+            p += !!(flags & PIX_FMT_BE);
+            is_8bit = 1;
+        }
         while(w--){
-            int val = flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
+            int val = is_8bit ? *p :
+                flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
             val = (val>>shift) & mask;
             if(read_pal_component)
                 val= data[1][4*val + c];
@@ -89,6 +95,13 @@ void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesi
         int shift = comp.shift;
         uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1;
 
+        if (shift + depth <= 8) {
+            p += !!(flags & PIX_FMT_BE);
+            while (w--) {
+                *p |= (*src++<<shift);
+                p += step;
+            }
+        } else {
         while (w--) {
             if (flags & PIX_FMT_BE) {
                 uint16_t val = AV_RB16(p) | (*src++<<shift);
@@ -99,6 +112,7 @@ void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesi
             }
             p+= step;
         }
+        }
     }
 }
 

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list