static void vp56_decode_4mv(VP56Context *s, int row, int col) { VP56mv mv = {0,0}; int type[4]; int b; /* parse each block type */ for (b=0; b<4; b++) { type[b] = vp56_rac_gets(&s->c, 2); if (type[b]) type[b]++; /* only returns 0, 2, 3 or 4 (all INTER_PF) */ } /* get vectors */ for (b=0; b<4; b++) { switch (type[b]) { case VP56_MB_INTER_NOVEC_PF: #ifdef IDE_COMPILE { VP56mv tmp1 = {0,0}; s->mv[b] = tmp1; } #else s->mv[b] = (VP56mv) {0,0}; #endif break; case VP56_MB_INTER_DELTA_PF: s->parse_vector_adjustment(s, &s->mv[b]); break; case VP56_MB_INTER_V1_PF: s->mv[b] = s->vector_candidate[0]; break; case VP56_MB_INTER_V2_PF: s->mv[b] = s->vector_candidate[1]; break; } mv.x += s->mv[b].x; mv.y += s->mv[b].y; } /* this is the one selected for the whole MB for prediction */ s->macroblocks[row * s->mb_width + col].mv = s->mv[3]; /* chroma vectors are average luma vectors */ if (s->avctx->codec->id == AV_CODEC_ID_VP5) { s->mv[4].x = s->mv[5].x = RSHIFT(mv.x,2); s->mv[4].y = s->mv[5].y = RSHIFT(mv.y,2); } else { #ifdef IDE_COMPILE { VP56mv tmp2 = {mv.x/4, mv.y/4}; s->mv[4] = s->mv[5] = tmp2; } #else s->mv[4] = s->mv[5] = (VP56mv) {mv.x/4, mv.y/4}; #endif } }
static void do_mouse_calibrate (int* x, int* y) { int x1, y1, x2, y2, x3, y3, x4, y4; x1 = vars1 [0] * (*x) + vars1 [1] * (*y) + vars1 [2]; y1 = vars1 [3] * (*x) + vars1 [4] * (*y) + vars1 [5]; x2 = vars2 [0] * (*x) + vars2 [1] * (*y) + vars2 [2]; y2 = vars2 [3] * (*x) + vars2 [4] * (*y) + vars2 [5]; x3 = vars3 [0] * (*x) + vars3 [1] * (*y) + vars3 [2]; y3 = vars3 [3] * (*x) + vars3 [4] * (*y) + vars3 [5]; x4 = vars4 [0] * (*x) + vars4 [1] * (*y) + vars4 [2]; y4 = vars4 [3] * (*x) + vars4 [4] * (*y) + vars4 [5]; *x = RSHIFT (x1 + x2 + x3 + x4); *y = RSHIFT (y1 + y2 + y3 + y4); }
VALUE rb_num2ulong(VALUE x) # endif { return (long)RSHIFT((SIGNED_VALUE)(x),1); }
//------------------------------------------------------------------------------------------------------------------------------------------------------ uint8 GetSampleSinusWave(Channel ch, int numSample) { float dT = numSample * TSHIFT_2_ABS(1, TBASE); float voltage = ampl[ch] * sinf(2.0f * M_PI * freq[ch] * dT + angle[ch]) + NewNoiseValue(ch); return Math_VoltageToPoint(voltage, RANGE(ch), RSHIFT(ch)); }
// process 64 byte chunk // translated from pseudocode on wikipedia void Sha256Digest::process() { // these follow the naming conventions in the psuedocode uint32 w[64]; uint32 a, b, c, d, e, f, g, h; uint32 s0, s1, maj, t2, t1, ch; GET_BE_UINT32(w[0], m_buffer, 0); GET_BE_UINT32(w[1], m_buffer, 4); GET_BE_UINT32(w[2], m_buffer, 8); GET_BE_UINT32(w[3], m_buffer, 12); GET_BE_UINT32(w[4], m_buffer, 16); GET_BE_UINT32(w[5], m_buffer, 20); GET_BE_UINT32(w[6], m_buffer, 24); GET_BE_UINT32(w[7], m_buffer, 28); GET_BE_UINT32(w[8], m_buffer, 32); GET_BE_UINT32(w[9], m_buffer, 36); GET_BE_UINT32(w[10], m_buffer, 40); GET_BE_UINT32(w[11], m_buffer, 44); GET_BE_UINT32(w[12], m_buffer, 48); GET_BE_UINT32(w[13], m_buffer, 52); GET_BE_UINT32(w[14], m_buffer, 56); GET_BE_UINT32(w[15], m_buffer, 60); // init hash value for this chunk a = m_state[0]; b = m_state[1]; c = m_state[2]; d = m_state[3]; e = m_state[4]; f = m_state[5]; g = m_state[6]; h = m_state[7]; for(int i=16; i<64; i++) { s0 = RROT(w[i-15], 7) XOR RROT(w[i-15], 18) XOR RSHIFT(w[i-15], 3); s1 = RROT(w[i-2], 17) XOR RROT(w[i-2], 19) XOR RSHIFT(w[i-2], 10); w[i] = w[i-16] + s0 + w[i-7] + s1; } // main loop // TODO: unroll? for(int j=0; j<64; j++) { s0 = RROT(a, 2) XOR RROT(a, 13) XOR RROT(a, 22); maj = (a & b) XOR (a & c) ^ (b & c); t2 = s0 + maj; s1 = RROT(e, 6) XOR RROT(e, 11) XOR RROT(e, 25); ch = (e & f) XOR ((~e) & g); t1 = h + s1 + ch + K[j] + w[j]; h = g; g = f; f = e; e = d + t1; d = c; c = b; b = a; a = t1 + t2; } // append this chunk's has value m_state[0] += a; m_state[1] += b; m_state[2] += c; m_state[3] += d; m_state[4] += e; m_state[5] += f; m_state[6] += g; m_state[7] += h; }
/* 配置 pic 下行消息 */ SINT32 MP4HAL_V400R004_CfgDnMsg(MP4_DEC_PARAM_S *pMp4DecParam, SINT32 VdhId) { UINT8 *pMsgBlock; UINT32 *pReg; UINT32 Dat; SINT32 i, j;//k; UINT32 WidthInMb, HeightInMb, MbCnt; SINT32 bitNumofMbCnt; SINT32 MbTotal; WidthInMb = pMp4DecParam->PicWidthInMb; HeightInMb = pMp4DecParam->PicHeightInMb; MbCnt = WidthInMb * HeightInMb; MbTotal = MbCnt; bitNumofMbCnt = MP4HAL_V400R004_Log2bin(MbCnt); /* step1: basic config < D0 ~ D7 > */ pMsgBlock = (UINT8 *)MEM_Phy2Vir(g_HwMem[VdhId].MsgSlotAddr[DN_V400R004_MSG_SLOT_INDEX]); if (NULL == pMsgBlock) { dprint(PRN_FATAL, "line: %d ,pMsgBlock = NULL is not expected value!\n", __LINE__); return VDMHAL_ERR; } pReg = (UINT32 *)pMsgBlock; if ( 1 == pMp4DecParam->IsShortHeader) { /* short header!*/ /* D0 */ Dat = 4; // [2] is_short_header WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D0=0x%x\n", Dat); /* D1 */ Dat = ((UINT32)( (pMp4DecParam->VopGobNum - 1) & 0x1F ) << 0) // [4:0] num_gobs_in_vop | ((UINT32)( (pMp4DecParam->GobMbNum) & 0x7F ) << 5) // [11:5] num_macroblocks_in_gob | ((UINT32)( pMp4DecParam->VopQuant & 0x1F ) << 26); // [30:26] vop_quant ++pReg; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D1=0x%x\n", Dat); /* D2 */ Dat = ((UINT32)( pMp4DecParam->PicCodingType & 3 ) << 5) // [6:5] vop_coding_type | ((UINT32)( bitNumofMbCnt & 0x0F ) << 22); // [25:22] bit_num_of_mbnum ++pReg; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D2=0x%x\n", Dat); } else { /* D0 */ Dat = 0; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D0=0x%x\n", Dat); /* D1 */ Dat = ((UINT32)( pMp4DecParam->VopQuant & 0x1F ) << 26) // [30:26] vop_quant | ((UINT32)( pMp4DecParam->PicQuantType & 1 ) << 31); // [31] quant_type ++pReg; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D1=0x%x\n", Dat); if ( 2 == pMp4DecParam->PicCodingType ) //B_VOP { pMp4DecParam->vop_rounding_type = 0; } /* D2 */ Dat = ((UINT32)( pMp4DecParam->Interlaced & 1 ) ) // [0] interlaced | ((UINT32)( pMp4DecParam->top_field_first & 1 ) << 1) // [1] top_field_first | ((UINT32)( pMp4DecParam->alternate_vertical_scan & 1 ) << 2) // [2] alternative_vertical_scan_flag | ((UINT32)( pMp4DecParam->vop_rounding_type & 1 ) << 3) // [3] vop_rounding_type | ((UINT32)( pMp4DecParam->QuarterSample & 1 ) << 4) // [4] quarter_sample | ((UINT32)( pMp4DecParam->PicCodingType & 3 ) << 5) // [6:5] vop_coding_type | ((UINT32)( pMp4DecParam->resync_marker_disable & 1 ) << 7) // [7] resync_marker_disable | ((UINT32)( pMp4DecParam->intra_dc_vlc_thr & 7 ) << 8) // [10:8] intra_dc_vlc_thr | ((UINT32)( pMp4DecParam->FwdFcode & 7 ) << 11) // [13:11] vop_fcode_forward | ((UINT32)( pMp4DecParam->BwdFcode & 7 ) << 14) // [16:14] vop_fcode_backward | ((UINT32)( pMp4DecParam->BitsOfVopTimeIncr & 0x1F ) << 17) // [21:17] bit_num_of_voptimeincrement | ((UINT32)( bitNumofMbCnt & 0x0F ) << 22)// [25:22] bit_num_of_mbnum | ((UINT32)( pMp4DecParam->sprite_enable & 3 ) << 26) | ((UINT32)( pMp4DecParam->sprite_warping_accuracy & 3 ) << 28) | ((UINT32)( pMp4DecParam->sprite_warping_points & 3 ) << 30);//实际的point,根据参数化简后的结果 ++pReg; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D2=0x%x\n", Dat); /* D3 */ if ( 2 == pMp4DecParam->PicCodingType ) //B_VOP { /*bp,pp硬件只用16比特表示的,如果数据超过16bit,则软件计算最大公约数,同等简化 */ if (pMp4DecParam->Trd > 65535) { /*寻最大公约数,将bp,pp等比减小 */ //wait for adding } Dat = ((pMp4DecParam->Trb << 1) & 0xFFFF) | // [15:0] trb ( ((pMp4DecParam->Trd << 1) & 0xFFFF) << 16 ); // [31:16] trd ++pReg; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D3=0x%x\n", Dat); } } /* D4 */ pReg = (UINT32 *)( pMsgBlock + 4 * 4 ); Dat = (((UINT32)(pMp4DecParam->PicWidthInMb - 1)) & 0x0000FFFF) | ((((UINT32)(pMp4DecParam->PicHeightInMb - 1)) & 0x0000FFFF) << 16); WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D4=0x%x\n", Dat); /* 显示宽高: D5 */ pReg = (UINT32 *)( pMsgBlock + 4 * 5 ); Dat = ((UINT32)(pMp4DecParam->image_width)) | ((UINT32)(pMp4DecParam->image_height) << 16); WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D5=0x%x\n", Dat); if (pMp4DecParam->PicCodingType == 3) { if (pMp4DecParam->sprite_warping_points == 1) { if (pMp4DecParam->FF_BUG_DIVX500B413 == 1) { /* GMC_1PT_MVX: D6 */ pReg = (UINT32 *)( pMsgBlock + 4 * 6 ); Dat = (UINT32)(pMp4DecParam->Uo / (1 << (pMp4DecParam->sprite_warping_accuracy - pMp4DecParam->QuarterSample))); WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D6=0x%x\n", Dat); /* GMC_1PT_MVY: D7 */ pReg = (UINT32 *)( pMsgBlock + 4 * 7 ); Dat = (UINT32)(pMp4DecParam->Vo / (1 << (pMp4DecParam->sprite_warping_accuracy - pMp4DecParam->QuarterSample))); WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D7=0x%x\n", Dat); } else { /* GMC_1PT_MVX: D6 */ pReg = (UINT32 *)( pMsgBlock + 4 * 6 ); Dat = (UINT32)RSHIFT(pMp4DecParam->Uo << pMp4DecParam->QuarterSample, pMp4DecParam->sprite_warping_accuracy); WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D6=0x%x\n", Dat); /* GMC_1PT_MVY: D7 */ pReg = (UINT32 *)( pMsgBlock + 4 * 7 ); Dat = (UINT32)RSHIFT(pMp4DecParam->Vo << pMp4DecParam->QuarterSample, pMp4DecParam->sprite_warping_accuracy); WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D7=0x%x\n", Dat); } } } /* step2: bitstream < D8 ~ D15 > */ pReg = (UINT32 *)( pMsgBlock + 4 * 8 ); /* D8 */ Dat = 0;//StreamPhyAddr[0] & 0x00FFFFFF; //偏移地址 WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D8=0x%x\n", Dat); /* D9 */ Dat = 0;//((StreamBitOffset[0]<<24)&0x7F000000) | (StreamLength[0]&0x00FFFFFF); ++pReg; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D9=0x%x\n", Dat); /* D10 */ Dat = 0;//StreamPhyAddr[1] & 0x00FFFFFF; ++pReg; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D10=0x%x\n", Dat); /* D11 */ Dat = 0;//((StreamBitOffset[1]<<24)&0x7F000000) | (StreamLength[1]&0x00FFFFFF); ++pReg; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D11=0x%x\n", Dat); /* step3: space arrangement < D12 ~ D23 > */ /* D12: image_curr_recon_addr */ Dat = (pMp4DecParam->DispFramePhyAddr + 0xF) & 0xFFFFFFF0; pReg++; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D12= 0x%x\n", Dat); /* D13: image_forward_ref_addr */ Dat = (pMp4DecParam->FwdRefPicPhyAddr + 0xF) & 0xFFFFFFF0; pReg++; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D13= 0x%x\n", Dat); /* D14: image_backward_ref_addr */ Dat = (pMp4DecParam->BwdRefPicPhyAddr + 0xF) & 0xFFFFFFF0; pReg++; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D14= 0x%x\n", Dat); /* D15: pmv_colmb_addr */ Dat = (pMp4DecParam->CurPmvPhyAddr + 0xF) & 0xFFFFFFF0; pReg++; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D15= 0x%x\n", Dat); /* D16: pmv_backward_ref_addr */ Dat = (pMp4DecParam->BwdPmvPhyAddr + 0xF) & 0xFFFFFFF0; pReg++; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D16= 0x%x\n", Dat); /* D17: sed_top_addr */ Dat = (g_HwMem[VdhId].ItransTopAddr + 0xF) & 0xFFFFFFF0; pReg++; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D17= 0x%x\n", Dat); /* D18: pmv_top_addr */ Dat = (g_HwMem[VdhId].PmvTopAddr + 0xF) & 0xFFFFFFF0; pReg++; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D18= 0x%x\n", Dat); /*D19*/ pMp4DecParam->FF_BUG_QPEL_FILED = 0; #if 1 if (pMp4DecParam->PicCodingType == 3) { if (pMp4DecParam->sprite_warping_points == 1) { /*1pt扩边规则依然是由FF_BUG_EDGE_EXTEND决定*/ pMp4DecParam->FF_BUG_EDGE_FIND_POINT = 1; } if (pMp4DecParam->sprite_warping_points > 1) { /*23pt扩边规则与取点规则一致,均由FF_BUG_EDGE_EXTEND决定*/ pMp4DecParam->FF_BUG_EDGE_FIND_POINT = pMp4DecParam->FF_BUG_EDGE_EXTEND; } } else { pMp4DecParam->FF_BUG_EDGE_FIND_POINT = pMp4DecParam->FF_BUG_EDGE_EXTEND; } #else p_syntax_des->FF_BUG_EDGE_FIND_POINT = 0; //p_syntax_des->FF_BUG_EDGE_EXTEND = 0; #endif //pMp4DecParam->FF_BUG_EDGE_FIND_POINT = 1; //pMp4DecParam->FF_BUG_EDGE_EXTEND = 1; Dat = ((UINT32)(pMp4DecParam->FF_BUG_QPEL_CHROMA & 1)) | ((UINT32)(pMp4DecParam->FF_BUG_QPEL_CHROMA2 & 1) << 1) | ((UINT32)(pMp4DecParam->FF_BUG_EDGE_EXTEND & 1) << 2) | ((UINT32)(pMp4DecParam->FF_BUG_EDGE_FIND_POINT & 1) << 3) //|((UINT32)(pMp4DecParam->FF_BUG_DIVX500B413 & 1) << 4) | ((UINT32)(pMp4DecParam->FF_BUG_QPEL_FILED & 1) << 4) | (0 << 16); pReg++; //dprint(PRN_ALWS,"DAT %#x\n", Dat); //Dat = 0;//test WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D19= 0x%x\n", Dat); #if 1 /* W' : D20 */ pReg = (UINT32 *)( pMsgBlock + 4 * 20 ); Dat = pMp4DecParam->dU[0]; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D20= 0x%x\n", Dat); /* W' : D21 */ pReg = (UINT32 *)( pMsgBlock + 4 * 21 ); Dat = pMp4DecParam->dU[1]; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D21= 0x%x\n", Dat); /* W' : D22 */ pReg = (UINT32 *)( pMsgBlock + 4 * 22 ); Dat = pMp4DecParam->dV[0]; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D22= 0x%x\n", Dat); /* W' : D23 */ pReg = (UINT32 *)( pMsgBlock + 4 * 23 ); Dat = pMp4DecParam->dV[1]; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D23= 0x%x\n", Dat); /* W' : D24 */ pReg = (UINT32 *)( pMsgBlock + 4 * 24 ); Dat = pMp4DecParam->Uo; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D24= 0x%x\n", Dat); /* W' : D25 */ pReg = (UINT32 *)( pMsgBlock + 4 * 25 ); Dat = pMp4DecParam->Vo; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D25= 0x%x\n", Dat); /* W' : D26 */ pReg = (UINT32 *)( pMsgBlock + 4 * 26 ); Dat = pMp4DecParam->Uco; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D26= 0x%x\n", Dat); /* W' : D27 */ pReg = (UINT32 *)( pMsgBlock + 4 * 27 ); Dat = pMp4DecParam->Vco; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D27= 0x%x\n", Dat); #endif /* step4: quant table < D28 ~ D59 > */ pReg = (UINT32 *)( pMsgBlock + 4 * 28 ); if ( (NON_SHORT_HEADER_ID == pMp4DecParam->IsShortHeader) && (0 != pMp4DecParam->PicQuantType) ) //NON_SHORT_HEADER_ID { /* for ( i = 0; i < 4; i++ ) { for ( j = 0; j < 16; j += 2 ) { Dat = ((SINT32)(pMp4DecParam->IntraQuantTab[i*16+j] ) ) | ((SINT32)(pMp4DecParam->NonintraQuantTab[i*16+j]) << 8 ) | ((SINT32)(pMp4DecParam->IntraQuantTab[i*16+j+1]) << 16 ) | ((SINT32)(pMp4DecParam->NonintraQuantTab[i*16+j+1]) << 24 ); WR_MSGWORD( pReg, Dat ); pReg++; dprint(PRN_DNMSG, "D%d= 0x%x\n", i*8+j/2+28, Dat); } } */ for ( i = 0; i < 8; i++ ) { for ( j = 0; j < 2; j ++ ) { Dat = ((SINT32)(pMp4DecParam->IntraQuantTab[i + j * 8 + 0] ) ) | ((SINT32)(pMp4DecParam->IntraQuantTab[i + j * 8 + 16]) << 8 ) | ((SINT32)(pMp4DecParam->IntraQuantTab[i + j * 8 + 32]) << 16 ) | ((SINT32)(pMp4DecParam->IntraQuantTab[i + j * 8 + 48]) << 24 ); pReg = (UINT32 *)(pMsgBlock + 4 * 28 + 4 * (2 * i + j)); WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D%d= 0x%x\n", i * 8 + j / 2 + 24, Dat); } } for ( i = 0; i < 8; i++ ) { for ( j = 0; j < 2; j ++ ) { Dat = ((SINT32)(pMp4DecParam->NonintraQuantTab[i + j * 8 + 0] ) ) | ((SINT32)(pMp4DecParam->NonintraQuantTab[i + j * 8 + 16]) << 8 ) | ((SINT32)(pMp4DecParam->NonintraQuantTab[i + j * 8 + 32]) << 16 ) | ((SINT32)(pMp4DecParam->NonintraQuantTab[i + j * 8 + 48]) << 24 ); pReg = (UINT32 *)(pMsgBlock + 4 * 28 + 4 * (16 + 2 * i + j)); WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D%d= 0x%x\n", i * 8 + j / 2 + 24, Dat); } } } /* W' : D60 */ pReg = (UINT32*)( pMsgBlock + 4*60 ); Dat = g_HwMem[VdhId].SedTopAddr & 0xFFFFFFF0; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D60= 0x%x\n", Dat); /* W' : D63 */ pReg = (UINT32 *)( pMsgBlock + 4 * 63 ); Dat = g_HwMem[VdhId].MsgSlotAddr[DN_V400R004_MSG_SLOT_INDEX] + 4 * 64; WR_MSGWORD( pReg, Dat ); dprint(PRN_DNMSG, "D63= 0x%x\n", Dat); return VDMHAL_OK; }