static av_noinline void FUNC(hl_decode_mb_444)(H264Context *h) { MpegEncContext *const s = &h->s; const int mb_x = s->mb_x; const int mb_y = s->mb_y; const int mb_xy = h->mb_xy; const int mb_type = s->current_picture.f.mb_type[mb_xy]; uint8_t *dest[3]; int linesize; int i, j, p; int *block_offset = &h->block_offset[0]; const int transform_bypass = !SIMPLE && (s->qscale == 0 && h->sps.transform_bypass); const int plane_count = (SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) ? 3 : 1; for (p = 0; p < plane_count; p++) { dest[p] = s->current_picture.f.data[p] + ((mb_x << PIXEL_SHIFT) + mb_y * s->linesize) * 16; s->vdsp.prefetch(dest[p] + (s->mb_x & 3) * 4 * s->linesize + (64 << PIXEL_SHIFT), s->linesize, 4); } h->list_counts[mb_xy] = h->list_count; if (!SIMPLE && MB_FIELD) { linesize = h->mb_linesize = h->mb_uvlinesize = s->linesize * 2; block_offset = &h->block_offset[48]; if (mb_y & 1) // FIXME move out of this function? for (p = 0; p < 3; p++) dest[p] -= s->linesize * 15; if (FRAME_MBAFF) { int list; for (list = 0; list < h->list_count; list++) { if (!USES_LIST(mb_type, list)) continue; if (IS_16X16(mb_type)) { int8_t *ref = &h->ref_cache[list][scan8[0]]; fill_rectangle(ref, 4, 4, 8, (16 + *ref) ^ (s->mb_y & 1), 1); } else { for (i = 0; i < 16; i += 4) { int ref = h->ref_cache[list][scan8[i]]; if (ref >= 0) fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, 8, (16 + ref) ^ (s->mb_y & 1), 1); } } } } } else { linesize = h->mb_linesize = h->mb_uvlinesize = s->linesize; } if (!SIMPLE && IS_INTRA_PCM(mb_type)) { if (PIXEL_SHIFT) { const int bit_depth = h->sps.bit_depth_luma; GetBitContext gb; init_get_bits(&gb, (uint8_t *)h->mb, 768 * bit_depth); for (p = 0; p < plane_count; p++) for (i = 0; i < 16; i++) { uint16_t *tmp = (uint16_t *)(dest[p] + i * linesize); for (j = 0; j < 16; j++) tmp[j] = get_bits(&gb, bit_depth); } } else { for (p = 0; p < plane_count; p++) for (i = 0; i < 16; i++) memcpy(dest[p] + i * linesize, (uint8_t *)h->mb + p * 256 + i * 16, 16); } } else { if (IS_INTRA(mb_type)) { if (h->deblocking_filter) xchg_mb_border(h, dest[0], dest[1], dest[2], linesize, linesize, 1, 1, SIMPLE, PIXEL_SHIFT); for (p = 0; p < plane_count; p++) hl_decode_mb_predict_luma(h, mb_type, 1, SIMPLE, transform_bypass, PIXEL_SHIFT, block_offset, linesize, dest[p], p); if (h->deblocking_filter) xchg_mb_border(h, dest[0], dest[1], dest[2], linesize, linesize, 0, 1, SIMPLE, PIXEL_SHIFT); } else { FUNC(hl_motion_444)(h, dest[0], dest[1], dest[2], s->me.qpel_put, s->dsp.put_h264_chroma_pixels_tab, s->me.qpel_avg, s->dsp.avg_h264_chroma_pixels_tab, h->h264dsp.weight_h264_pixels_tab, h->h264dsp.biweight_h264_pixels_tab); } for (p = 0; p < plane_count; p++) hl_decode_mb_idct_luma(h, mb_type, 1, SIMPLE, transform_bypass, PIXEL_SHIFT, block_offset, linesize, dest[p], p); } if (h->cbp || IS_INTRA(mb_type)) { s->dsp.clear_blocks(h->mb); s->dsp.clear_blocks(h->mb + (24 * 16 << PIXEL_SHIFT)); } }
static av_noinline void FUNC(hl_decode_mb)(H264Context *h) { MpegEncContext *const s = &h->s; const int mb_x = s->mb_x; const int mb_y = s->mb_y; const int mb_xy = h->mb_xy; const int mb_type = s->current_picture.f.mb_type[mb_xy]; uint8_t *dest_y, *dest_cb, *dest_cr; int linesize, uvlinesize /*dct_offset*/; int i, j; int *block_offset = &h->block_offset[0]; const int transform_bypass = !SIMPLE && (s->qscale == 0 && h->sps.transform_bypass); /* is_h264 should always be true if SVQ3 is disabled. */ const int is_h264 = !CONFIG_SVQ3_DECODER || SIMPLE || s->codec_id == AV_CODEC_ID_H264; void (*idct_add)(uint8_t *dst, int16_t *block, int stride); const int block_h = 16 >> s->chroma_y_shift; const int chroma422 = CHROMA422; dest_y = s->current_picture.f.data[0] + ((mb_x << PIXEL_SHIFT) + mb_y * s->linesize) * 16; dest_cb = s->current_picture.f.data[1] + (mb_x << PIXEL_SHIFT) * 8 + mb_y * s->uvlinesize * block_h; dest_cr = s->current_picture.f.data[2] + (mb_x << PIXEL_SHIFT) * 8 + mb_y * s->uvlinesize * block_h; s->vdsp.prefetch(dest_y + (s->mb_x & 3) * 4 * s->linesize + (64 << PIXEL_SHIFT), s->linesize, 4); s->vdsp.prefetch(dest_cb + (s->mb_x & 7) * s->uvlinesize + (64 << PIXEL_SHIFT), dest_cr - dest_cb, 2); h->list_counts[mb_xy] = h->list_count; if (!SIMPLE && MB_FIELD) { linesize = h->mb_linesize = s->linesize * 2; uvlinesize = h->mb_uvlinesize = s->uvlinesize * 2; block_offset = &h->block_offset[48]; if (mb_y & 1) { // FIXME move out of this function? dest_y -= s->linesize * 15; dest_cb -= s->uvlinesize * (block_h - 1); dest_cr -= s->uvlinesize * (block_h - 1); } if (FRAME_MBAFF) { int list; for (list = 0; list < h->list_count; list++) { if (!USES_LIST(mb_type, list)) continue; if (IS_16X16(mb_type)) { int8_t *ref = &h->ref_cache[list][scan8[0]]; fill_rectangle(ref, 4, 4, 8, (16 + *ref) ^ (s->mb_y & 1), 1); } else { for (i = 0; i < 16; i += 4) { int ref = h->ref_cache[list][scan8[i]]; if (ref >= 0) fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, 8, (16 + ref) ^ (s->mb_y & 1), 1); } } } } } else { linesize = h->mb_linesize = s->linesize; uvlinesize = h->mb_uvlinesize = s->uvlinesize; // dct_offset = s->linesize * 16; } if (!SIMPLE && IS_INTRA_PCM(mb_type)) { const int bit_depth = h->sps.bit_depth_luma; if (PIXEL_SHIFT) { int j; GetBitContext gb; init_get_bits(&gb, (uint8_t *)h->mb, ff_h264_mb_sizes[h->sps.chroma_format_idc] * bit_depth); for (i = 0; i < 16; i++) { uint16_t *tmp_y = (uint16_t *)(dest_y + i * linesize); for (j = 0; j < 16; j++) tmp_y[j] = get_bits(&gb, bit_depth); } if (SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) { if (!h->sps.chroma_format_idc) { for (i = 0; i < block_h; i++) { uint16_t *tmp_cb = (uint16_t *)(dest_cb + i * uvlinesize); uint16_t *tmp_cr = (uint16_t *)(dest_cr + i * uvlinesize); for (j = 0; j < 8; j++) { tmp_cb[j] = tmp_cr[j] = 1 << (bit_depth - 1); } } } else { for (i = 0; i < block_h; i++) { uint16_t *tmp_cb = (uint16_t *)(dest_cb + i * uvlinesize); for (j = 0; j < 8; j++) tmp_cb[j] = get_bits(&gb, bit_depth); } for (i = 0; i < block_h; i++) { uint16_t *tmp_cr = (uint16_t *)(dest_cr + i * uvlinesize); for (j = 0; j < 8; j++) tmp_cr[j] = get_bits(&gb, bit_depth); } } } } else { for (i = 0; i < 16; i++) memcpy(dest_y + i * linesize, (uint8_t *)h->mb + i * 16, 16); if (SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) { if (!h->sps.chroma_format_idc) { for (i = 0; i < 8; i++) { memset(dest_cb + i*uvlinesize, 1 << (bit_depth - 1), 8); memset(dest_cr + i*uvlinesize, 1 << (bit_depth - 1), 8); } } else { uint8_t *src_cb = (uint8_t *)h->mb + 256; uint8_t *src_cr = (uint8_t *)h->mb + 256 + block_h * 8; for (i = 0; i < block_h; i++) { memcpy(dest_cb + i * uvlinesize, src_cb + i * 8, 8); memcpy(dest_cr + i * uvlinesize, src_cr + i * 8, 8); } } } } } else { if (IS_INTRA(mb_type)) { if (h->deblocking_filter) xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 1, 0, SIMPLE, PIXEL_SHIFT); if (SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) { h->hpc.pred8x8[h->chroma_pred_mode](dest_cb, uvlinesize); h->hpc.pred8x8[h->chroma_pred_mode](dest_cr, uvlinesize); } hl_decode_mb_predict_luma(h, mb_type, is_h264, SIMPLE, transform_bypass, PIXEL_SHIFT, block_offset, linesize, dest_y, 0); if (h->deblocking_filter) xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 0, 0, SIMPLE, PIXEL_SHIFT); } else if (is_h264) { if (chroma422) { FUNC(hl_motion_422)(h, dest_y, dest_cb, dest_cr, s->me.qpel_put, s->dsp.put_h264_chroma_pixels_tab, s->me.qpel_avg, s->dsp.avg_h264_chroma_pixels_tab, h->h264dsp.weight_h264_pixels_tab, h->h264dsp.biweight_h264_pixels_tab); } else { FUNC(hl_motion_420)(h, dest_y, dest_cb, dest_cr, s->me.qpel_put, s->dsp.put_h264_chroma_pixels_tab, s->me.qpel_avg, s->dsp.avg_h264_chroma_pixels_tab, h->h264dsp.weight_h264_pixels_tab, h->h264dsp.biweight_h264_pixels_tab); } } hl_decode_mb_idct_luma(h, mb_type, is_h264, SIMPLE, transform_bypass, PIXEL_SHIFT, block_offset, linesize, dest_y, 0); if ((SIMPLE || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) && (h->cbp & 0x30)) { uint8_t *dest[2] = { dest_cb, dest_cr }; if (transform_bypass) { if (IS_INTRA(mb_type) && h->sps.profile_idc == 244 && (h->chroma_pred_mode == VERT_PRED8x8 || h->chroma_pred_mode == HOR_PRED8x8)) { h->hpc.pred8x8_add[h->chroma_pred_mode](dest[0], block_offset + 16, h->mb + (16 * 16 * 1 << PIXEL_SHIFT), uvlinesize); h->hpc.pred8x8_add[h->chroma_pred_mode](dest[1], block_offset + 32, h->mb + (16 * 16 * 2 << PIXEL_SHIFT), uvlinesize); } else { idct_add = s->dsp.add_pixels4; for (j = 1; j < 3; j++) { for (i = j * 16; i < j * 16 + 4; i++) if (h->non_zero_count_cache[scan8[i]] || dctcoef_get(h->mb, PIXEL_SHIFT, i * 16)) idct_add(dest[j - 1] + block_offset[i], h->mb + (i * 16 << PIXEL_SHIFT), uvlinesize); if (chroma422) { for (i = j * 16 + 4; i < j * 16 + 8; i++) if (h->non_zero_count_cache[scan8[i + 4]] || dctcoef_get(h->mb, PIXEL_SHIFT, i * 16)) idct_add(dest[j - 1] + block_offset[i + 4], h->mb + (i * 16 << PIXEL_SHIFT), uvlinesize); } } } } else { if (is_h264) { int qp[2]; if (chroma422) { qp[0] = h->chroma_qp[0] + 3; qp[1] = h->chroma_qp[1] + 3; } else { qp[0] = h->chroma_qp[0]; qp[1] = h->chroma_qp[1]; } if (h->non_zero_count_cache[scan8[CHROMA_DC_BLOCK_INDEX + 0]]) h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + (16 * 16 * 1 << PIXEL_SHIFT), h->dequant4_coeff[IS_INTRA(mb_type) ? 1 : 4][qp[0]][0]); if (h->non_zero_count_cache[scan8[CHROMA_DC_BLOCK_INDEX + 1]]) h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + (16 * 16 * 2 << PIXEL_SHIFT), h->dequant4_coeff[IS_INTRA(mb_type) ? 2 : 5][qp[1]][0]); h->h264dsp.h264_idct_add8(dest, block_offset, h->mb, uvlinesize, h->non_zero_count_cache); } else if (CONFIG_SVQ3_DECODER) { h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16 * 16 * 1, h->dequant4_coeff[IS_INTRA(mb_type) ? 1 : 4][h->chroma_qp[0]][0]); h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16 * 16 * 2, h->dequant4_coeff[IS_INTRA(mb_type) ? 2 : 5][h->chroma_qp[1]][0]); for (j = 1; j < 3; j++) { for (i = j * 16; i < j * 16 + 4; i++) if (h->non_zero_count_cache[scan8[i]] || h->mb[i * 16]) { uint8_t *const ptr = dest[j - 1] + block_offset[i]; ff_svq3_add_idct_c(ptr, h->mb + i * 16, uvlinesize, ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2); } } } } } } if (h->cbp || IS_INTRA(mb_type)) { s->dsp.clear_blocks(h->mb); s->dsp.clear_blocks(h->mb + (24 * 16 << PIXEL_SHIFT)); } }
__tcsm1_main int main() { int c; S32I2M(xr16,3); c = i_la(_gp); int fifo_rp = 0; unsigned int XCHGtmp; H264_Frame_GlbARGs *dFRM = (H264_Frame_GlbARGs *)TCSM1_FRM_ARGS; H264_MB_DecARGs *dMB_aux = (H264_MB_DecARGs *)TCSM1_MBARGS_BUF; H264_MB_DecARGs *dMB2 = (H264_MB_DecARGs *)TCSM1_MBARGS_BUF2; H264_AUX_T *AUX_T = (H264_AUX_T *)TCSM1_AUX_T; MDMA_DesNode *MDMA1_TRAN = (MDMA_DesNode *)TCSM1_GP1_TRAN_CHAIN; MDMA_DesNode *MDMA1_ARG = (MDMA_DesNode *)TCSM1_GP1_ARG_CHAIN; H264_MB_DecARGs *dMBsrc; fifo_wp = (int *)TCSM1_FIFO_WP; dMBsrc = (H264_MB_DecARGs *)(dFRM->dMB_baseaddr_aux); int mb_num; int mb_start; int total_mbs; mb_start = dFRM->first_mb_in_frame; total_mbs = dFRM->mb_width * dFRM->mb_height; int i; uint16_t *intra_pred4x4_top_ptr[2]; intra_pred4x4_top_ptr[0]=intra_pred4x4_top[0]; intra_pred4x4_top_ptr[1]=intra_pred4x4_top[1]; uint16_t *intra_pred4x4_left_ptr[2]; intra_pred4x4_left_ptr[0]=intra_pred4x4_left[0]; intra_pred4x4_left_ptr[1]=intra_pred4x4_left[1]; uint8_t mb_x_d1, mb_y_d1; uint8_t mb_x_d2, mb_y_d2; mb_x_d1 = mb_y_d1 = mb_x_d2 = mb_y_d2 =0; AUX_PMON_CREAT(mc); AUX_PMON_CREAT(idct); AUX_PMON_CREAT(dblk); AUX_PMON_CREAT(intra); AUX_PMON_CREAT(mdma); AUX_PMON_CREAT(sync); do{ }while(fifo_rp == *fifo_wp); fifo_rp++; MDMA1_ARG->TSA = get_phy_addr_aux((uint32_t)dMBsrc); MDMA1_ARG->TDA = (uint32_t)dMB_aux; MDMA1_ARG->STRD = MDMA_STRD(64, 64); MDMA1_ARG->UNIT = MDMA_UNIT(1,64,(sizeof(H264_MB_DecARGs))); SET_MDMA1_DHA((uint32_t)TCSM1_GP1_ARG_CHAIN); MDMA1_RUN(); dMBsrc++; POLLING_MDMA1_END(); char bakup_x0 = dFRM->mb_width-1; char bakup_x1 = 0; int mb_type_last= 0; volatile unsigned int *infar = (unsigned int *)TCSM1_H264_DBLK_INFAR; uint8_t non_zero_count_cache_luma_last[16]; for ( mb_num = mb_start; (mb_num < total_mbs+2); mb_num ++ ) { AUX_PMON_ON(sync); do{ }while(fifo_rp == *fifo_wp); fifo_rp++; int gp1_tran_start = 0; int gp1_tran_len = sizeof(H264_MB_DecARGs); if (dMB_aux->next_mb_no_weight_flag) { gp1_tran_start = (53 << 2); gp1_tran_len -= (53 << 2); } if (dMB_aux->next_mb_skip_flag) { gp1_tran_len -= (192 << 2); } AUX_PMON_OFF(sync); AUX_PMON_ON(mdma); AUX_PMON_OFF(mdma); AUX_PMON_ON(intra); MDMA1_ARG->TSA = (get_phy_addr_aux((uint32_t)dMBsrc) + gp1_tran_start); MDMA1_ARG->TDA = ((uint32_t)dMB2 + gp1_tran_start); MDMA1_ARG->STRD = MDMA_STRD(64, 64); MDMA1_ARG->UNIT = MDMA_UNIT(1,64,gp1_tran_len); dMBsrc++; POLLING_MDMA1_END(); //ensure curr dblked MB has been trans out SET_MDMA1_DHA((uint32_t)TCSM1_GP1_ARG_CHAIN); MDMA1_RUN(); int mb_x= dMB_aux->mb_x; int mb_y= dMB_aux->mb_y; int mb_type= dMB_aux->mb_type; if (dMB_aux->curr_mb_skip_flag) for(i=0; i<24; i++) dMB_aux->mb[i*16] = 0; AUX_T->mc_des_dirty=0; if(IS_INTRA(mb_type_last)){ // chroma predict Intra_pred_chroma(dMB_aux->chroma_pred_mode, AUX_T->h264_urecon[1], AUX_T->h264_urecon[0] + MB_CHROM_WIDTH, TCSM1_BOTTOM_U_13PIX+4); Intra_pred_chroma(dMB_aux->chroma_pred_mode, AUX_T->h264_vrecon[1], AUX_T->h264_vrecon[0] + MB_CHROM_WIDTH, TCSM1_BOTTOM_V_13PIX+4); // luma predict if(IS_INTRA4x4(mb_type_last)){ if(IS_8x8DCT(mb_type_last)){ for(i=0; i<16; i+=4){ uint8_t * src_left = (uint32_t)(intra_pred4x4_left_ptr[1][i]) | 0xF4000000; uint8_t * src_top = (uint32_t)(intra_pred4x4_top_ptr[1][i]) | 0xF4000000; uint8_t * src_topleft; if ( i==8 ) src_topleft = src_left - RECON_BUF_STRIDE - 1; else src_topleft = src_top - 1; uint8_t * ptr= AUX_T->h264_yrecon[1] + MB_offset_recon[i]; int dir= dMB_aux->intra4x4_pred_mode_cache[ i ]; int nnz = non_zero_count_cache_luma_last[i]; Intra_pred_luma_8x8l(dir,ptr,(dMB_aux->topleft_samples_available<<i)&0x8000, (dMB_aux->topright_samples_available<<i)&0x4000, src_left, src_top, src_topleft, RECON_BUF_STRIDE); if(nnz){ if(nnz == 1 && dMB_aux->mb[i*16]) ff_h264_idct8_dc_add_c(ptr, dMB_aux->mb + i*16, RECON_BUF_STRIDE); else ff_h264_idct8_add_c(ptr, dMB_aux->mb + i*16, RECON_BUF_STRIDE); } } }else { for(i=0; i<16; i++){ uint8_t * src_left = (uint32_t)(intra_pred4x4_left_ptr[1][i]) | 0xf4000000; uint8_t * src_top = (uint32_t)(intra_pred4x4_top_ptr[1][i]) | 0xf4000000; uint8_t * src_topleft; if ( (i==2) || (i==8) || (i==10) ) src_topleft = src_left - RECON_BUF_STRIDE; else src_topleft = src_top; uint8_t * ptr= AUX_T->h264_yrecon[1] + MB_offset_recon[i]; uint8_t *topright; int dir= dMB_aux->intra4x4_pred_mode_cache[ i ]; int nnz, tr; if(dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED){ int topright_avail= (dMB_aux->topright_samples_available<<i)&0x8000; if(!topright_avail){ tr= src_top[3]*0x01010101; topright= (uint8_t*) &tr; }else{ topright= src_top + 4; } } Intra_pred_luma_4x4(dir, ptr, src_left, topright, src_top, src_topleft); nnz = non_zero_count_cache_luma_last[i]; if(nnz){ if(nnz == 1 && dMB_aux->mb[i*16]) ff_h264_idct_dc_add_c(ptr, dMB_aux->mb + i*16, RECON_BUF_STRIDE); else ff_h264_idct_add_c(ptr, dMB_aux->mb + i*16, RECON_BUF_STRIDE); } } } }else{ Intra_pred_luma_16x16(dMB_aux->intra16x16_pred_mode, AUX_T->h264_yrecon[1], AUX_T->h264_yrecon[0] + MB_LUMA_WIDTH, TCSM1_BOTTOM_Y_25PIX+4); luma_dc_dequant_idct_c(dMB_aux->mb, dMB_aux->dequant4_coeff[0]); for(i=0; i<16; i++){ if(non_zero_count_cache_luma_last[i]) ff_h264_idct_add_c(AUX_T->h264_yrecon[1] + MB_offset_recon[i], dMB_aux->mb + i*16, RECON_BUF_STRIDE); else if(dMB_aux->mb[i*16]) ff_h264_idct_dc_add_c(AUX_T->h264_yrecon[1] + MB_offset_recon[i], dMB_aux->mb + i*16, RECON_BUF_STRIDE); } } } AUX_PMON_OFF(intra); if(IS_INTER(mb_type)){ hl_motion_hw(dFRM, dMB_aux, AUX_T); } AUX_PMON_ON(mc); MC_POLLING_END(); AUX_PMON_OFF(mc); AUX_PMON_ON(dblk); while ((*infar)!= TCSM1_H264_DBLK_INFDA) {} AUX_PMON_OFF(dblk); if(AUX_T->mc_des_dirty){ H264_MC_DesNode *h264_mc = (H264_MC_DesNode *)(AUX_T->h264_mc_des_ptr[0]); h264_mc[AUX_T->mc_des_dirty - 1].VNodeHead = H264_VHEAD_UNLINK; SET_MC_DHA((uint32_t)h264_mc); CLEAR_MC_TTEND(); SET_MC_DCS(); } if(IS_INTRA(mb_type)){ uint32_t * bakup_src = AUX_T->BackupMBbottom_Y[bakup_x1]-4; uint32_t * bakup_dst = TCSM1_BOTTOM_Y_25PIX; bakup_dst[0] = bakup_src[0]; bakup_dst[1] = bakup_src[1]; bakup_dst[2] = bakup_src[2]; bakup_dst[3] = bakup_src[3]; bakup_dst[4] = bakup_src[4]; bakup_dst[5] = bakup_src[5]; bakup_dst[6] = bakup_src[6]; bakup_src = AUX_T->BackupMBbottom_U[bakup_x1]-4; bakup_dst = TCSM1_BOTTOM_U_13PIX; bakup_dst[0] = bakup_src[0]; bakup_dst[1] = bakup_src[1]; bakup_dst[2] = bakup_src[2]; bakup_dst[3] = bakup_src[3]; bakup_src = AUX_T->BackupMBbottom_V[bakup_x1]-4; bakup_dst = TCSM1_BOTTOM_V_13PIX; bakup_dst[0] = bakup_src[0]; bakup_dst[1] = bakup_src[1]; bakup_dst[2] = bakup_src[2]; bakup_dst[3] = bakup_src[3]; } if(IS_INTER(mb_type_last)) hl_motion_hw_next(dMB_aux,AUX_T,mb_type_last); *(uint32_t*)&AUX_T->sub_mb_type[0] = *(uint32_t*)&dMB_aux->sub_mb_type[0]; *(uint32_t*)&AUX_T->sub_mb_type[2] = *(uint32_t*)&dMB_aux->sub_mb_type[2]; AUX_PMON_ON(idct); AUX_PMON_OFF(idct); if (IS_INTRA_PCM(mb_type)) { unsigned int x, y; for(i=0; i<24; i++) { for (y=0; y<4; y++) { for (x=0; x<4; x++) { *(AUX_T->h264_yrecon[0] + MB_offset_recon[i] + y*RECON_BUF_STRIDE + x) = dMB_aux->mb[i*16+y*4+x]; } } } } { int linesize, uvlinesize; uint8_t *dest_y_d2, *dest_u_d2, *dest_v_d2; linesize = dFRM->linesize; uvlinesize = dFRM->uvlinesize; dest_y_d2 = dFRM->current_picture.y_ptr + (mb_y_d2 * 16* linesize ) + mb_x_d2 * 16; dest_u_d2 = dFRM->current_picture.u_ptr + (mb_y_d2 * 8 * uvlinesize) + mb_x_d2 * 8; dest_v_d2 = dFRM->current_picture.v_ptr + (mb_y_d2 * 8 * uvlinesize) + mb_x_d2 * 8; //move dblked MB out MDMA1_TRAN[0].TSA = AUX_T->h264_ydblk[1]-4; MDMA1_TRAN[0].TDA = get_phy_addr_aux((uint32_t)dest_y_d2-4); MDMA1_TRAN[1].TSA = AUX_T->h264_ydblk[1]-4+DBLK_U_OFST; MDMA1_TRAN[1].TDA = get_phy_addr_aux((uint32_t)dest_u_d2-4); //MDMA1_TRAN[1].UNIT = MDMA_UNIT(1,12,96); MDMA1_TRAN[2].TSA = AUX_T->h264_ydblk[1]-4+DBLK_V_OFST; MDMA1_TRAN[2].TDA = get_phy_addr_aux((uint32_t)dest_v_d2-4); POLLING_MDMA1_END(); //ensure next MB's args has been received SET_MDMA1_DHA((uint32_t)MDMA1_TRAN); MDMA1_RUN(); } //---------idct fo inter--------------- if(IS_INTER(mb_type_last)){ void (*idct_dc_add)(uint8_t *dst, DCTELEM *block, int stride); void (*idct_add)(uint8_t *dst, DCTELEM *block, int stride); int di; if(IS_8x8DCT(mb_type_last)){ idct_dc_add = ff_h264_idct8_dc_add_c; idct_add = ff_h264_idct8_add_c; di = 4; }else{ idct_dc_add = ff_h264_idct_dc_add_c; idct_add = ff_h264_idct_add_c; di = 1; } for(i=0; i<16; i+=di){ int nnz = non_zero_count_cache_luma_last[i]; if(nnz){ if(nnz==1 && dMB_aux->mb[i*16]) idct_dc_add(AUX_T->h264_yrecon[1] + MB_offset_recon[i], dMB_aux->mb + i*16, RECON_BUF_STRIDE); else idct_add(AUX_T->h264_yrecon[1] + MB_offset_recon[i], dMB_aux->mb + i*16, RECON_BUF_STRIDE); } } } //------------- chroma idct------------ if(mb_type_last){ chroma_dc_dequant_idct_c(dMB_aux->mb + 16*16, dMB_aux->dequant4_coeff[1]); chroma_dc_dequant_idct_c(dMB_aux->mb + 16*16+4*16, dMB_aux->dequant4_coeff[2]); for(i=16; i<16+8; i++){ if(dMB_aux->non_zero_count_cache_chroma[ i - 16 ]) { ff_h264_idct_add_c(AUX_T->h264_yrecon[1] + MB_offset_recon[i], dMB_aux->mb + i*16, RECON_BUF_STRIDE); } else if (dMB_aux->mb[i*16]) { ff_h264_idct_dc_add_c(AUX_T->h264_yrecon[1] + MB_offset_recon[i], dMB_aux->mb + i*16, RECON_BUF_STRIDE); } } } if(!(mb_x==0 && mb_y==0)){ SET_DHA_DBLK((unsigned int)AUX_T->h264_dblk_des_ptr[1]); *infar = 0; SET_DCS_DBLK(0x1); } filter_mb_dblk(dFRM, dMB_aux, AUX_T); { uint32_t * bakup_src = AUX_T->h264_yrecon[1] + 15*RECON_BUF_STRIDE; uint32_t * bakup_dst = AUX_T->BackupMBbottom_Y[bakup_x0]; bakup_dst[0] = bakup_src[0]; bakup_dst[1] = bakup_src[1]; bakup_dst[2] = bakup_src[2]; bakup_dst[3] = bakup_src[3]; bakup_src = AUX_T->h264_urecon[1] + 7*RECON_BUF_STRIDE; bakup_dst = AUX_T->BackupMBbottom_U[bakup_x0]; bakup_dst[0] = bakup_src[0]; bakup_dst[1] = bakup_src[1]; bakup_src = AUX_T->h264_vrecon[1] + 7*RECON_BUF_STRIDE; bakup_dst = AUX_T->BackupMBbottom_V[bakup_x0]; bakup_dst[0] = bakup_src[0]; bakup_dst[1] = bakup_src[1]; } mb_x_d2 = mb_x_d1; mb_y_d2 = mb_y_d1; mb_x_d1 = mb_x; mb_y_d1 = mb_y; mb_type_last=mb_type; for(i=0;i<16;i++) non_zero_count_cache_luma_last[i]=dMB_aux->non_zero_count_cache_luma[ scan5[i] ]; // abnormal exit if (dMB_aux->deblocking_filter & 0x8) break; bakup_x0=(bakup_x0==((dFRM->mb_width)-1))?0:(bakup_x0+1);//hit second line's tail bakup_x1=(bakup_x1==((dFRM->mb_width)-1))?0:(bakup_x1+1); XCHG2(AUX_T->h264_yrecon[0],AUX_T->h264_yrecon[1],XCHGtmp); XCHG2(AUX_T->h264_urecon[0],AUX_T->h264_urecon[1],XCHGtmp); XCHG2(AUX_T->h264_vrecon[0],AUX_T->h264_vrecon[1],XCHGtmp); XCHG2(AUX_T->h264_ydblk[0],AUX_T->h264_ydblk[1],XCHGtmp); XCHG2(AUX_T->h264_dblk_des_ptr[0],AUX_T->h264_dblk_des_ptr[1],XCHGtmp); XCHG2(AUX_T->h264_mc_des_ptr[0],AUX_T->h264_mc_des_ptr[1],XCHGtmp); XCHG2(intra_pred4x4_top_ptr[0],intra_pred4x4_top_ptr[1],XCHGtmp); XCHG2(intra_pred4x4_left_ptr[0],intra_pred4x4_left_ptr[1],XCHGtmp); XCHG2(dMB_aux,dMB2,XCHGtmp); } AUX_PMON_TRAN(mc,PMON_MC_BUF); AUX_PMON_TRAN(idct,PMON_IDCT_BUF); AUX_PMON_TRAN(dblk,PMON_DBLK_BUF); AUX_PMON_TRAN(intra,PMON_INTRA_BUF); AUX_PMON_TRAN(mdma,PMON_MDMA_BUF); AUX_PMON_TRAN(sync,PMON_SYNC_BUF); /* task_done: aux-cpu task done flag, only write by aux-cpu, only read by main-cpu */ MDMA1_ARG->TSA = (TCSM1_TASK_DONE); MDMA1_ARG->TDA = (TCSM0_TASK_DONE); MDMA1_ARG->STRD = MDMA_STRD(4,4); MDMA1_ARG->UNIT = MDMA_UNIT(1,4,4); SET_MDMA1_DHA((uint32_t)TCSM1_GP1_ARG_CHAIN); MDMA1_RUN(); i_nop; i_nop; i_nop; i_nop; __asm__ __volatile__ ("wait"); }