diff options
author | Anton Khirnov <anton@khirnov.net> | 2013-05-04 09:51:17 +0200 |
---|---|---|
committer | Reinhard Tartler <siretart@tauware.de> | 2013-05-11 12:00:54 +0200 |
commit | 7f8b55b560bb76f84baa909cdc683eeba47c923d (patch) | |
tree | f297192e175f0afd4ab9944c68f8b011fecdafa2 /libavcodec/indeo3.c | |
parent | 1ab4578c88dc3e1407da15471bd323ba40c3ebbb (diff) | |
download | ffmpeg-7f8b55b560bb76f84baa909cdc683eeba47c923d.tar.gz |
indeo3: use unaligned reads on reference blocks.
They are not guaranteed to be aligned.
Fixes Bug 503.
CC:libav-stable@libav.org
(cherry picked from commit a97d8cc16e0da30c9ffefa1ede2a0adf3db5f3f8)
Signed-off-by: Reinhard Tartler <siretart@tauware.de>
Diffstat (limited to 'libavcodec/indeo3.c')
-rw-r--r-- | libavcodec/indeo3.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/libavcodec/indeo3.c b/libavcodec/indeo3.c index f2f7c09d98..81bf0a9e9c 100644 --- a/libavcodec/indeo3.c +++ b/libavcodec/indeo3.c @@ -277,10 +277,10 @@ static int copy_cell(Indeo3DecodeContext *ctx, Plane *plane, Cell *cell) /* Average 4/8 pixels at once without rounding using SWAR */ #define AVG_32(dst, src, ref) \ - AV_WN32A(dst, ((AV_RN32A(src) + AV_RN32A(ref)) >> 1) & 0x7F7F7F7FUL) + AV_WN32A(dst, ((AV_RN32(src) + AV_RN32(ref)) >> 1) & 0x7F7F7F7FUL) #define AVG_64(dst, src, ref) \ - AV_WN64A(dst, ((AV_RN64A(src) + AV_RN64A(ref)) >> 1) & 0x7F7F7F7F7F7F7F7FULL) + AV_WN64A(dst, ((AV_RN64(src) + AV_RN64(ref)) >> 1) & 0x7F7F7F7F7F7F7F7FULL) /* @@ -339,7 +339,7 @@ if (*data_ptr >= last_ptr) \ copy_block4(dst, ref, row_offset, row_offset, 4 << v_zoom) #define RLE_BLOCK_COPY_8 \ - pix64 = AV_RN64A(ref);\ + pix64 = AV_RN64(ref);\ if (is_first_row) {/* special prediction case: top line of a cell */\ pix64 = replicate64(pix64);\ fill_64(dst + row_offset, pix64, 7, row_offset);\ @@ -351,7 +351,7 @@ if (*data_ptr >= last_ptr) \ copy_block4(dst, ref, row_offset, row_offset, num_lines << v_zoom) #define RLE_LINES_COPY_M10 \ - pix64 = AV_RN64A(ref);\ + pix64 = AV_RN64(ref);\ if (is_top_of_cell) {\ pix64 = replicate64(pix64);\ fill_64(dst + row_offset, pix64, (num_lines << 1) - 1, row_offset);\ @@ -361,12 +361,12 @@ if (*data_ptr >= last_ptr) \ #define APPLY_DELTA_4 \ AV_WN16A(dst + line_offset ,\ - (AV_RN16A(ref ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ + (AV_RN16(ref ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ AV_WN16A(dst + line_offset + 2,\ - (AV_RN16A(ref + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\ + (AV_RN16(ref + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\ if (mode >= 3) {\ if (is_top_of_cell && !cell->ypos) {\ - AV_COPY32(dst, dst + row_offset);\ + AV_COPY32U(dst, dst + row_offset);\ } else {\ AVG_32(dst, ref, dst + row_offset);\ }\ @@ -376,20 +376,20 @@ if (*data_ptr >= last_ptr) \ /* apply two 32-bit VQ deltas to next even line */\ if (is_top_of_cell) { \ AV_WN32A(dst + row_offset , \ - (replicate32(AV_RN32A(ref )) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ + (replicate32(AV_RN32(ref )) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ AV_WN32A(dst + row_offset + 4, \ - (replicate32(AV_RN32A(ref + 4)) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ + (replicate32(AV_RN32(ref + 4)) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ } else { \ AV_WN32A(dst + row_offset , \ - (AV_RN32A(ref ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ + (AV_RN32(ref ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ AV_WN32A(dst + row_offset + 4, \ - (AV_RN32A(ref + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ + (AV_RN32(ref + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ } \ /* odd lines are not coded but rather interpolated/replicated */\ /* first line of the cell on the top of image? - replicate */\ /* otherwise - interpolate */\ if (is_top_of_cell && !cell->ypos) {\ - AV_COPY64(dst, dst + row_offset);\ + AV_COPY64U(dst, dst + row_offset);\ } else \ AVG_64(dst, ref, dst + row_offset); @@ -397,22 +397,22 @@ if (*data_ptr >= last_ptr) \ #define APPLY_DELTA_1011_INTER \ if (mode == 10) { \ AV_WN32A(dst , \ - (AV_RN32A(dst ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ + (AV_RN32(dst ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ AV_WN32A(dst + 4 , \ - (AV_RN32A(dst + 4 ) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ + (AV_RN32(dst + 4 ) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ AV_WN32A(dst + row_offset , \ - (AV_RN32A(dst + row_offset ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ + (AV_RN32(dst + row_offset ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\ AV_WN32A(dst + row_offset + 4, \ - (AV_RN32A(dst + row_offset + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ + (AV_RN32(dst + row_offset + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\ } else { \ AV_WN16A(dst , \ - (AV_RN16A(dst ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ + (AV_RN16(dst ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ AV_WN16A(dst + 2 , \ - (AV_RN16A(dst + 2 ) + delta_tab->deltas[dyad2]) & 0x7F7F);\ + (AV_RN16(dst + 2 ) + delta_tab->deltas[dyad2]) & 0x7F7F);\ AV_WN16A(dst + row_offset , \ - (AV_RN16A(dst + row_offset ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ + (AV_RN16(dst + row_offset ) + delta_tab->deltas[dyad1]) & 0x7F7F);\ AV_WN16A(dst + row_offset + 2, \ - (AV_RN16A(dst + row_offset + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\ + (AV_RN16(dst + row_offset + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\ } |