diff --git a/libavcodec/aic.c b/libavcodec/aic.c index 5a7d6c74b1..70e9f3f103 100644 --- a/libavcodec/aic.c +++ b/libavcodec/aic.c @@ -196,11 +196,11 @@ static int aic_decode_header(AICContext *ctx, const uint8_t *src, int size) } while (0) static int aic_decode_coeffs(GetBitContext *gb, int16_t *dst, - int band, int slice_width) + int band, int slice_width, int force_chroma) { int has_skips, coeff_type, coeff_bits, skip_type, skip_bits; const int num_coeffs = aic_num_band_coeffs[band]; - const uint8_t *scan = aic_scan[band]; + const uint8_t *scan = aic_scan[band | force_chroma]; int mb, idx; unsigned val; @@ -322,7 +322,8 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, sizeof(*ctx->slice_data) * slice_width * AIC_BAND_COEFFS); for (i = 0; i < NUM_BANDS; i++) if ((ret = aic_decode_coeffs(&gb, ctx->data_ptr[i], - i, slice_width)) < 0) + i, slice_width, + !ctx->interlaced)) < 0) return ret; for (mb = 0; mb < slice_width; mb++) { @@ -337,7 +338,7 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, ctx->dsp.idct(ctx->block); if (!ctx->interlaced) { - dst = Y + (blk & 1) * 8 * ystride + (blk >> 1) * 8; + dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8; ctx->dsp.put_signed_pixels_clamped(ctx->block, dst, ystride); } else { diff --git a/libavcodec/cabac_functions.h b/libavcodec/cabac_functions.h index ee70fcf985..8a7275d9de 100644 --- a/libavcodec/cabac_functions.h +++ b/libavcodec/cabac_functions.h @@ -111,6 +111,7 @@ static int av_unused get_cabac(CABACContext *c, uint8_t * const state){ return get_cabac_inline(c,state); } +#ifndef get_cabac_bypass static int av_unused get_cabac_bypass(CABACContext *c){ int range; c->low += c->low; @@ -126,7 +127,7 @@ static int av_unused get_cabac_bypass(CABACContext *c){ return 1; } } - +#endif #ifndef get_cabac_bypass_sign static av_always_inline int get_cabac_bypass_sign(CABACContext *c, int val){ diff --git a/libavcodec/ivi_common.c b/libavcodec/ivi_common.c index 0084e1af9c..32da5c651e 100644 --- a/libavcodec/ivi_common.c +++ b/libavcodec/ivi_common.c @@ -41,6 +41,9 @@ extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tabl static VLC ivi_mb_vlc_tabs [8]; ///< static macroblock Huffman tables static VLC ivi_blk_vlc_tabs[8]; ///< static block Huffman tables +typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf, + uint32_t pitch, int mc_type); + /** * Reverse "nbits" bits of the value "val" and return the result * in the least significant bits. @@ -401,8 +404,7 @@ static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile uint32_t cbp, av_uninit(sym), lo, hi, quant, buf_offs, q; IVIMbInfo *mb; RVMapDesc *rvmap = band->rv_map; - void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type); - void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type); + ivi_mc_func mc_with_delta_func, mc_no_delta_func; const uint16_t *base_tab; const uint8_t *scale_tab; @@ -576,8 +578,7 @@ static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, IVIMbInfo *mb, *ref_mb; const int16_t *src; int16_t *dst; - void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, - int mc_type); + ivi_mc_func mc_no_delta_func; if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) { av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches " diff --git a/libavcodec/x86/cabac.h b/libavcodec/x86/cabac.h index 2c9f77e3ff..1b7bcee7e8 100644 --- a/libavcodec/x86/cabac.h +++ b/libavcodec/x86/cabac.h @@ -225,5 +225,45 @@ static av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val) return val; } +#define get_cabac_bypass get_cabac_bypass_x86 +static av_always_inline int get_cabac_bypass_x86(CABACContext *c) +{ + x86_reg tmp; + int res; + __asm__ volatile( + "movl %c6(%2), %k1 \n\t" + "movl %c3(%2), %%eax \n\t" + "shl $17, %k1 \n\t" + "add %%eax, %%eax \n\t" + "sub %k1, %%eax \n\t" + "cltd \n\t" + "and %%edx, %k1 \n\t" + "add %k1, %%eax \n\t" + "inc %%edx \n\t" + "test %%ax, %%ax \n\t" + "jnz 1f \n\t" + "mov %c4(%2), %1 \n\t" + "subl $0xFFFF, %%eax \n\t" + "movzwl (%1), %%ecx \n\t" + "bswap %%ecx \n\t" + "shrl $15, %%ecx \n\t" + "addl %%ecx, %%eax \n\t" + "cmp %c5(%2), %1 \n\t" + "jge 1f \n\t" + "add"OPSIZE" $2, %c4(%2) \n\t" + "1: \n\t" + "movl %%eax, %c3(%2) \n\t" + + : "=&d"(res), "=&r"(tmp) + : "r"(c), + "i"(offsetof(CABACContext, low)), + "i"(offsetof(CABACContext, bytestream)), + "i"(offsetof(CABACContext, bytestream_end)), + "i"(offsetof(CABACContext, range)) + : "%eax", "%ecx", "memory" + ); + return res; +} + #endif /* HAVE_INLINE_ASM */ #endif /* AVCODEC_X86_CABAC_H */