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 + -
显示快捷键?