Mercurial > libavutil.hg
changeset 1014:3728a7291737 libavutil
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.
author | mru |
---|---|
date | Sun, 12 Sep 2010 21:39:54 +0000 |
parents | 83021885b234 |
children | f332df5d8da5 |
files | pixdesc.c |
diffstat | 1 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/pixdesc.c Sun Sep 12 21:31:39 2010 +0000 +++ b/pixdesc.c Sun Sep 12 21:39:54 2010 +0000 @@ -53,9 +53,15 @@ } } 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 @@ 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 @@ } p+= step; } + } } }