int dst;
int dst_stride;
- int eob;
+ char *eob;
union b_mode_info bmi;
} BLOCKD;
void vp8_inverse_transform_b(const vp8_idct_rtcd_vtable_t *rtcd, BLOCKD *b,
int pitch)
{
- if (b->eob > 1)
+ if (*b->eob > 1)
{
IDCT_INVOKE(rtcd, idct16)(b->dqcoeff, b->predictor, pitch,
*(b->base_dst) + b->dst, b->dst_stride);
}
}
-
-
-
{
x->block[r].qcoeff = x->qcoeff + r * 16;
x->block[r].dqcoeff = x->dqcoeff + r * 16;
+ x->block[r].eob = x->eobs + r;
}
}
bne loop
; PART 2: check position for eob...
+ ldr r11, [sp, #0] ; restore BLOCKD pointer
mov lr, #0 ; init eob
cmp r1, #0 ; coeffs after quantization?
- ldr r11, [sp, #0] ; restore BLOCKD pointer
+ ldr r12, [r11, #vp8_blockd_eob]
beq end ; skip eob calculations if all zero
ldr r0, [r11, #vp8_blockd_qcoeff]
mov lr, #1 ; rc=0, i=0
end
- str lr, [r11, #vp8_blockd_eob]
+ strb lr, [r12]
ldmfd sp!, {r1, r4-r11, pc}
ENDP
vmovl.u16 q0, d0
vmovl.u16 q10, d20
-
vmax.u32 d0, d0, d1
vmax.u32 d20, d20, d21
vpmax.u32 d0, d0, d0
vpmax.u32 d20, d20, d20
- add r4, r2, #vp8_blockd_eob
- add r5, r3, #vp8_blockd_eob
+ ldr r4, [r2, #vp8_blockd_eob]
+ ldr r5, [r3, #vp8_blockd_eob]
- vst1.32 {d0[0]}, [r4@32]
- vst1.32 {d20[0]}, [r5@32]
+ vst1.8 {d0[0]}, [r4] ; store eob
+ vst1.8 {d20[0]}, [r5] ; store eob
vldmia sp!, {q4-q7}
ldmfd sp!, {r4-r9}
vshr.s16 q12, #1 ; right shift 1 after vqdmulh
vshr.s16 q13, #1
+ ldr r5, [r1, #vp8_blockd_eob]
+
orr r2, r2, r3 ; check if all zero (step 4)
cmp r2, #0 ; check if all zero (step 5)
beq zero_output ; check if all zero (step 6)
vst1.s16 {q2, q3}, [r7@128] ; store dqcoeff = x * Dequant
- add r4, r1, #vp8_blockd_eob
- vst1.32 {d0[0]}, [r4@32]
+ vst1.8 {d0[0]}, [r5] ; store eob
ldmfd sp!, {r4-r7}
bx lr
zero_output
- str r2, [r1, #vp8_blockd_eob]
+ strb r2, [r5] ; store eob
vst1.s16 {q0, q1}, [r6@128] ; qcoeff = 0
vst1.s16 {q0, q1}, [r7@128] ; dqcoeff = 0
&x->e_mbd.block[i], &x->e_mbd.block[i+1]);
if (has_2nd_order)
- x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
+ x->quantize_b(&x->block[24], &x->e_mbd.block[24]);
}
qcoeff_ptr = d->qcoeff;
dqcoeff_ptr = d->dqcoeff;
i0 = !type;
- eob = d->eob;
+ eob = *d->eob;
/* Now set up a Viterbi trellis to evaluate alternative roundings. */
rdmult = mb->rdmult * err_mult;
}
final_eob++;
- d->eob = final_eob;
- *a = *l = (d->eob != !type);
+ *a = *l = (final_eob != !type);
+ *d->eob = (char)final_eob;
}
static void optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
{
BLOCKD *b = &x->block[i];
- if (b->eob > 1)
+ if (*b->eob > 1)
{
IDCT_INVOKE(rtcd, idct16)(b->dqcoeff, b->predictor, 16,
*(b->base_dst) + b->dst, b->dst_stride);
{
BLOCKD *b = &x->block[i];
- if (b->eob > 1)
+ if (*b->eob > 1)
{
IDCT_INVOKE(rtcd, idct16)(b->dqcoeff, b->predictor, 8,
*(b->base_dst) + b->dst, b->dst_stride);
}
}
}
- d->eob = eob + 1;
+ *d->eob = (char)(eob + 1);
}
#else
eob = i; // last nonzero coeffs
}
}
- d->eob = eob + 1;
+ *d->eob = (char)(eob + 1);
}
#endif
}
}
- d->eob = eob + 1;
+ *d->eob = (char)(eob + 1);
}
/* Perform regular quantization, with unbiased rounding and no zero bin. */
}
}
- d->eob = eob + 1;
+ *d->eob = (char)(eob + 1);
}
#else
}
}
- d->eob = eob + 1;
+ *d->eob = (char)(eob + 1);
}
#endif
vp8cx_init_quantizer(cpi);
}
-
static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l)
{
int c = !type; /* start at coef 0, unless Y with Y2 */
- int eob = b->eob;
+ int eob = (int)(*b->eob);
int pt ; /* surrounding block/prev coef predictor */
int cost = 0;
short *qcoeff_ptr = b->qcoeff;
// store everything needed to come back to this!!
for (i = 0; i < 16; i++)
{
- BLOCKD *bd = &x->e_mbd.block[i];
-
bsi->mvs[i].as_mv = x->partition_info->bmi[i].mv.as_mv;
bsi->modes[i] = x->partition_info->bmi[i].mode;
- bsi->eobs[i] = bd->eob;
+ bsi->eobs[i] = x->e_mbd.eobs[i];
}
}
}
BLOCKD *bd = &x->e_mbd.block[i];
bd->bmi.mv.as_int = bsi.mvs[i].as_int;
- bd->eob = bsi.eobs[i];
+ *bd->eob = bsi.eobs[i];
}
*returntotrate = bsi.r;
for (i = 0; i <= 24; i++)
{
- tteob += x->e_mbd.block[i].eob;
+ tteob += x->e_mbd.eobs[i];
}
if (tteob == 0)
ENTROPY_CONTEXT * a;
ENTROPY_CONTEXT * l;
int band, rc, v, token;
+ int eob;
b = x->block + 24;
qcoeff_ptr = b->qcoeff;
a = (ENTROPY_CONTEXT *)x->above_context + 8;
l = (ENTROPY_CONTEXT *)x->left_context + 8;
-
+ eob = x->eobs[24];
VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
- if(!b->eob)
+ if(!eob)
{
/* c = band for this case */
t->Token = DCT_EOB_TOKEN;
t++;
c = 1;
- for (; c < b->eob; c++)
+ for (; c < eob; c++)
{
rc = vp8_default_zig_zag1d[c];
band = vp8_coef_bands[c];
c = type ? 0 : 1;
- if(c >= b->eob)
+ if(c >= *b->eob)
{
/* c = band for this case */
t->Token = DCT_EOB_TOKEN;
t++;
c++;
- for (; c < b->eob; c++)
+ for (; c < *b->eob; c++)
{
rc = vp8_default_zig_zag1d[c];
band = vp8_coef_bands[c];
VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
- if(!b->eob)
+ if(!(*b->eob))
{
/* c = band for this case */
t->Token = DCT_EOB_TOKEN;
t++;
c = 1;
- for (; c < b->eob; c++)
+ for (; c < *b->eob; c++)
{
rc = vp8_default_zig_zag1d[c];
band = vp8_coef_bands[c];
if (has_y2_block)
{
for (i = 0; i < 16; i++)
- skip &= (x->block[i].eob < 2);
+ skip &= (x->eobs[i] < 2);
}
for (; i < 24 + has_y2_block; i++)
- skip &= (!x->block[i].eob);
+ skip &= (!x->eobs[i]);
return skip;
}
movdqa [rdi], xmm0 ; store dqcoeff
movdqa [rdi + 16], xmm1
+ mov rcx, [rsi + vp8_blockd_eob]
+
; select the last value (in zig_zag order) for EOB
pcmpeqw xmm2, xmm6
pcmpeqw xmm3, xmm6
pmaxsw xmm2, xmm3
movd eax, xmm2
and eax, 0xff
- mov [rsi + vp8_blockd_eob], eax
+
+ mov BYTE PTR [rcx], al ; store eob
; begin epilog
add rsp, stack_size
pmaxsw xmm1, xmm5
+ mov rcx, [rsi + vp8_blockd_eob]
+
; now down to 8
pshufd xmm5, xmm1, 00001110b
movd eax, xmm1
and eax, 0xff
- mov [rsi + vp8_blockd_eob], eax
+
+ mov BYTE PTR [rcx], al ; store eob
; begin epilog
%if ABI_IS_32BIT
movdqa [rdi], xmm0
movdqa [rdi + 16], xmm1
+ mov rcx, [rsi + vp8_blockd_eob]
+
; select the last value (in zig_zag order) for EOB
pxor xmm6, xmm6
pcmpeqw xmm4, xmm6
add eax, 1
and eax, edi
- mov [rsi + vp8_blockd_eob], eax
+ mov BYTE PTR [rcx], al ; store eob
; begin epilog
%if ABI_IS_32BIT
movdqa [rcx], xmm2 ;store dqcoeff
movdqa [rcx + 16], xmm3 ;store dqcoeff
+ mov rcx, [rsi + vp8_blockd_eob]
+
sub edi, edx ;check for all zeros in bit mask
sar edi, 31 ;0 or -1
add eax, 1
and eax, edi ;if the bit mask was all zero,
;then eob = 0
- mov [rsi + vp8_blockd_eob], eax
+ mov BYTE PTR [rcx], al ;store eob
; begin epilog
%if ABI_IS_32BIT
short *dqcoeff_ptr = d->dqcoeff;
short *dequant_ptr = d->dequant;
- d->eob = vp8_fast_quantize_b_impl_mmx(
- coeff_ptr,
- zbin_ptr,
- qcoeff_ptr,
- dequant_ptr,
- scan_mask,
-
- round_ptr,
- quant_ptr,
- dqcoeff_ptr
- );
+ *d->eob = (char)vp8_fast_quantize_b_impl_mmx(
+ coeff_ptr,
+ zbin_ptr,
+ qcoeff_ptr,
+ dequant_ptr,
+ scan_mask,
+
+ round_ptr,
+ quant_ptr,
+ dqcoeff_ptr
+ );
}
int vp8_mbblock_error_mmx_impl(short *coeff_ptr, short *dcoef_ptr, int dc);