wmv2.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,478 行 · 第 1/4 页
C
1,478 行
cbp = code & 0x3f; } else { s->mb_intra = 1; code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); if (code < 0){ av_log(s->avctx, AV_LOG_ERROR, "II-cbp illegal at %d %d\n", s->mb_x, s->mb_y); return -1; } /* predict coded block pattern */ cbp = 0; for(i=0;i<6;i++) { int val = ((code >> (5 - i)) & 1); if (i < 4) { int pred = coded_block_pred(s, i, &coded_val); val = val ^ pred; *coded_val = val; } cbp |= val << (5 - i); } } if (!s->mb_intra) { int mx, my;//printf("P at %d %d\n", s->mb_x, s->mb_y); wmv2_pred_motion(w, &mx, &my); if(cbp){ s->dsp.clear_blocks(s->block[0]); if(s->per_mb_rl_table){ s->rl_table_index = decode012(&s->gb); s->rl_chroma_table_index = s->rl_table_index; } if(w->abt_flag && w->per_mb_abt){ w->per_block_abt= get_bits1(&s->gb); if(!w->per_block_abt) w->abt_type= decode012(&s->gb); }else w->per_block_abt=0; } if (wmv2_decode_motion(w, &mx, &my) < 0) return -1; s->mv_dir = MV_DIR_FORWARD; s->mv_type = MV_TYPE_16X16; s->mv[0][0][0] = mx; s->mv[0][0][1] = my; for (i = 0; i < 6; i++) { if (wmv2_decode_inter_block(w, block[i], i, (cbp >> (5 - i)) & 1) < 0) { av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding inter block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); return -1; } } } else {//if(s->pict_type==P_TYPE)// printf("%d%d ", s->inter_intra_pred, cbp);//printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24)); s->ac_pred = get_bits1(&s->gb); if(s->inter_intra_pred){ s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); } if(s->per_mb_rl_table && cbp){ s->rl_table_index = decode012(&s->gb); s->rl_chroma_table_index = s->rl_table_index; } s->dsp.clear_blocks(s->block[0]); for (i = 0; i < 6; i++) { if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) { av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding intra block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); return -1; } } } return 0;}static int wmv2_decode_init(AVCodecContext *avctx){ Wmv2Context * const w= avctx->priv_data; if(ff_h263_decode_init(avctx) < 0) return -1; wmv2_common_init(w); return 0;}#ifdef CONFIG_WMV2_DECODERAVCodec wmv2_decoder = { "wmv2", CODEC_TYPE_VIDEO, CODEC_ID_WMV2, sizeof(Wmv2Context), wmv2_decode_init, NULL, ff_h263_decode_end, ff_h263_decode_frame, CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,};#endif#ifdef CONFIG_WMV2_ENCODERAVCodec wmv2_encoder = { "wmv2", CODEC_TYPE_VIDEO, CODEC_ID_WMV2, sizeof(Wmv2Context), wmv2_encode_init, MPV_encode_picture, MPV_encode_end, .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},};#endif#ifdef USE_16M_SDRAM#include "avcodec.h"#include "dsputil.h"#include "simple_idct.h"//#ifdef JZ4740_MXU_OPT//#include "jzmedia.h"//Q15 Constant Data//#define WM44 0x5A825A82 //(W4,W4)//#define WM26 0x764230FC //(W2,W6)//#define WM13 0x7D8A6A6E //(W1,W3)//#define WM57 0x471D18F9 //(W5,W7)#if 0#define W1 2841 /* 2048*sqrt (2)*cos (1*pi/16) */#define W2 2676 /* 2048*sqrt (2)*cos (2*pi/16) */#define W3 2408 /* 2048*sqrt (2)*cos (3*pi/16) */#define W4 2048 /* 2048*sqrt (2)*cos (4*pi/16) */#define W5 1609 /* 2048*sqrt (2)*cos (5*pi/16) */#define W6 1108 /* 2048*sqrt (2)*cos (6*pi/16) */#define W7 565 /* 2048*sqrt (2)*cos (7*pi/16) */#define ROW_SHIFT 8#define COL_SHIFT 17#else#define W1 22725 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5#define W2 21407 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5#define W3 19266 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5#define W4 16383 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5#define W5 12873 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5#define W6 8867 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5#define W7 4520 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5#define ROW_SHIFT 11#define COL_SHIFT 20 // 6#endif#if defined(ARCH_POWERPC_405)/* signed 16x16 -> 32 multiply add accumulate */#define MAC16(rt, ra, rb) \ asm ("maclhw %0, %2, %3" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb));/* signed 16x16 -> 32 multiply */#define MUL16(rt, ra, rb) \ asm ("mullhw %0, %1, %2" : "=r" (rt) : "r" (ra), "r" (rb));#else/* signed 16x16 -> 32 multiply add accumulate */#define MAC16(rt, ra, rb) rt += (ra) * (rb)/* signed 16x16 -> 32 multiply */#define MUL16(rt, ra, rb) rt = (ra) * (rb)#endifstatic inline void idctRowCondDC (DCTELEM * row){ int a0, a1, a2, a3, b0, b1, b2, b3;#ifdef HAVE_FAST_64BIT uint64_t temp;#else uint32_t temp;#endif#ifdef HAVE_FAST_64BIT#ifdef WORDS_BIGENDIAN#define ROW0_MASK 0xffff000000000000LL#else#define ROW0_MASK 0xffffLL#endif if(sizeof(DCTELEM)==2){ if ( ((((uint64_t *)row)[0] & ~ROW0_MASK) | ((uint64_t *)row)[1]) == 0) { temp = (row[0] << 3) & 0xffff; temp += temp << 16; temp += temp << 32; ((uint64_t *)row)[0] = temp; ((uint64_t *)row)[1] = temp; return; } }else{ if (!(row[1]|row[2]|row[3]|row[4]|row[5]|row[6]|row[7])) { row[0]=row[1]=row[2]=row[3]=row[4]=row[5]=row[6]=row[7]= row[0] << 3; return; } }#else if(sizeof(DCTELEM)==2){ if (!(((uint32_t*)row)[1] | ((uint32_t*)row)[2] | ((uint32_t*)row)[3] | row[1])) { temp = (row[0] << 3) & 0xffff; temp += temp << 16; ((uint32_t*)row)[0]=((uint32_t*)row)[1] = ((uint32_t*)row)[2]=((uint32_t*)row)[3] = temp; return; } }else{ if (!(row[1]|row[2]|row[3]|row[4]|row[5]|row[6]|row[7])) { row[0]=row[1]=row[2]=row[3]=row[4]=row[5]=row[6]=row[7]= row[0] << 3; return; } }#endif a0 = (W4 * row[0]) + (1 << (ROW_SHIFT - 1)); a1 = a0; a2 = a0; a3 = a0; /* no need to optimize : gcc does it */ a0 += W2 * row[2]; a1 += W6 * row[2]; a2 -= W6 * row[2]; a3 -= W2 * row[2]; MUL16(b0, W1, row[1]); MAC16(b0, W3, row[3]); MUL16(b1, W3, row[1]); MAC16(b1, -W7, row[3]); MUL16(b2, W5, row[1]); MAC16(b2, -W1, row[3]); MUL16(b3, W7, row[1]); MAC16(b3, -W5, row[3]);#ifdef HAVE_FAST_64BIT temp = ((uint64_t*)row)[1];#else temp = ((uint32_t*)row)[2] | ((uint32_t*)row)[3];#endif if (temp != 0) { a0 += W4*row[4] + W6*row[6]; a1 += - W4*row[4] - W2*row[6]; a2 += - W4*row[4] + W2*row[6]; a3 += W4*row[4] - W6*row[6]; MAC16(b0, W5, row[5]); MAC16(b0, W7, row[7]); MAC16(b1, -W1, row[5]); MAC16(b1, -W5, row[7]); MAC16(b2, W7, row[5]); MAC16(b2, W3, row[7]); MAC16(b3, W3, row[5]); MAC16(b3, -W1, row[7]); } row[0] = (a0 + b0) >> ROW_SHIFT; row[7] = (a0 - b0) >> ROW_SHIFT; row[1] = (a1 + b1) >> ROW_SHIFT; row[6] = (a1 - b1) >> ROW_SHIFT; row[2] = (a2 + b2) >> ROW_SHIFT; row[5] = (a2 - b2) >> ROW_SHIFT; row[3] = (a3 + b3) >> ROW_SHIFT; row[4] = (a3 - b3) >> ROW_SHIFT;}static inline void idctSparseColAdd (uint8_t *dest, int line_size, DCTELEM * col){ int a0, a1, a2, a3, b0, b1, b2, b3; uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; /* XXX: I did that only to give same values as previous code */ a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4)); a1 = a0; a2 = a0; a3 = a0; a0 += + W2*col[8*2]; a1 += + W6*col[8*2]; a2 += - W6*col[8*2]; a3 += - W2*col[8*2]; MUL16(b0, W1, col[8*1]); MUL16(b1, W3, col[8*1]); MUL16(b2, W5, col[8*1]); MUL16(b3, W7, col[8*1]); MAC16(b0, + W3, col[8*3]); MAC16(b1, - W7, col[8*3]); MAC16(b2, - W1, col[8*3]); MAC16(b3, - W5, col[8*3]); if(col[8*4]){ a0 += + W4*col[8*4]; a1 += - W4*col[8*4]; a2 += - W4*col[8*4]; a3 += + W4*col[8*4]; } if (col[8*5]) { MAC16(b0, + W5, col[8*5]); MAC16(b1, - W1, col[8*5]); MAC16(b2, + W7, col[8*5]); MAC16(b3, + W3, col[8*5]); } if(col[8*6]){ a0 += + W6*col[8*6]; a1 += - W2*col[8*6]; a2 += + W2*col[8*6]; a3 += - W6*col[8*6]; } if (col[8*7]) { MAC16(b0, + W7, col[8*7]); MAC16(b1, - W5, col[8*7]); MAC16(b2, + W3, col[8*7]); MAC16(b3, - W1, col[8*7]); } dest[0] = cm[dest[0] + ((a0 + b0) >> COL_SHIFT)]; dest += line_size; dest[0] = cm[dest[0] + ((a1 + b1) >> COL_SHIFT)]; dest += line_size; dest[0] = cm[dest[0] + ((a2 + b2) >> COL_SHIFT)]; dest += line_size; dest[0] = cm[dest[0] + ((a3 + b3) >> COL_SHIFT)]; dest += line_size; dest[0] = cm[dest[0] + ((a3 - b3) >> COL_SHIFT)]; dest += line_size; dest[0] = cm[dest[0] + ((a2 - b2) >> COL_SHIFT)]; dest += line_size; dest[0] = cm[dest[0] + ((a1 - b1) >> COL_SHIFT)]; dest += line_size; dest[0] = cm[dest[0] + ((a0 - b0) >> COL_SHIFT)];}/* 8x4 & 4x8 WMV2 IDCT */#undef CN_SHIFT#undef C_SHIFT#undef C_FIX#undef C1#undef C2#define CN_SHIFT 12#define C_FIX(x) ((int)((x) * 1.414213562 * (1 << CN_SHIFT) + 0.5))#define C1 C_FIX(0.6532814824)#define C2 C_FIX(0.2705980501)#define C3 C_FIX(0.5)#define C_SHIFT (4+1+12)static inline void idct4col_add(uint8_t *dest, int line_size, const DCTELEM *col){ int c0, c1, c2, c3, a0, a1, a2, a3;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?