|
|
|
@@ -276,10 +276,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) |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
@@ -338,7 +338,7 @@ if (*data_ptr >= last_ptr) \ |
|
|
|
ctx->hdsp.put_pixels_tab[2][0](dst, ref, 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);\ |
|
|
|
@@ -350,7 +350,7 @@ if (*data_ptr >= last_ptr) \ |
|
|
|
ctx->hdsp.put_pixels_tab[2][0](dst, ref, 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);\ |
|
|
|
@@ -360,12 +360,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);\ |
|
|
|
}\ |
|
|
|
@@ -375,20 +375,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); |
|
|
|
|
|
|
|
@@ -396,22 +396,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);\ |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|