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
This commit is contained in:
Måns Rullgård 2010-09-12 21:39:54 +00:00
parent 4b9ac6dedc
commit 9525243f59
1 changed files with 15 additions and 1 deletions

View File

@ -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;
}
}
}
}