void decode_and_reconstruct_block_inter (uint8_t *rec, int stride, int size, int qp, uint8_t *pblock, int16_t *coeffq,int tb_split){ int16_t *rcoeff = thor_alloc(2*MAX_TR_SIZE*MAX_TR_SIZE, 16); int16_t *rblock = thor_alloc(2*MAX_TR_SIZE*MAX_TR_SIZE, 16); int16_t *rblock2 = thor_alloc(2*MAX_TR_SIZE*MAX_TR_SIZE, 16); if (tb_split){ int size2 = size/2; int i,j,k,index; for (i=0;i<size;i+=size2){ for (j=0;j<size;j+=size2){ index = 2*(i/size2) + (j/size2); dequantize (coeffq+index*size2*size2,rcoeff,qp,size2); inverse_transform (rcoeff, rblock2, size2); /* Copy from compact block of quarter size to full size */ for (k=0;k<size2;k++){ memcpy(rblock+(i+k)*size+j,rblock2+k*size2,size2*sizeof(int16_t)); } } } } else{ dequantize (coeffq,rcoeff,qp,size); inverse_transform (rcoeff, rblock, size); } reconstruct_block(rblock,pblock,rec,size,stride); thor_free(rcoeff); thor_free(rblock); thor_free(rblock2); }
void decode_and_reconstruct_block_intra (uint8_t *rec, int stride, int size, int qp, uint8_t *pblock, int16_t *coeffq, int tb_split, int upright_available,int downleft_available, intra_mode_t intra_mode,int ypos,int xpos,int width,int comp, qmtx_t ** iwmatrix){ int16_t *rcoeff = thor_alloc(2*MAX_TR_SIZE*MAX_TR_SIZE, 16); int16_t *rblock = thor_alloc(2*MAX_TR_SIZE*MAX_TR_SIZE, 16); int16_t *rblock2 = thor_alloc(2*MAX_TR_SIZE*MAX_TR_SIZE, 16); uint8_t* left_data = (uint8_t*)thor_alloc(2*MAX_TR_SIZE+2,16)+1; uint8_t* top_data = (uint8_t*)thor_alloc(2*MAX_TR_SIZE+2,16)+1; uint8_t top_left; if (tb_split){ int size2 = size/2; int i,j,index; for (i=0;i<size;i+=size2){ for (j=0;j<size;j+=size2){ make_top_and_left(left_data,top_data,&top_left,rec,stride,&rec[i*stride+j],stride,i,j,ypos,xpos,size2,upright_available,downleft_available,1); get_intra_prediction(left_data,top_data,top_left,ypos+i,xpos+j,size2,pblock,intra_mode); index = 2*(i/size2) + (j/size2); dequantize (coeffq+index*size2*size2, rcoeff, qp, size2, iwmatrix ? iwmatrix[log2i(size2/4)] : NULL, MAX_QUANT_SIZE); inverse_transform (rcoeff, rblock2, size2); reconstruct_block(rblock2,pblock,&rec[i*stride+j],size2,stride); } } } else{ make_top_and_left(left_data,top_data,&top_left,rec,stride,NULL,0,0,0,ypos,xpos,size,upright_available,downleft_available,0); get_intra_prediction(left_data,top_data,top_left,ypos,xpos,size,pblock,intra_mode); dequantize (coeffq, rcoeff, qp, size, iwmatrix ? iwmatrix[log2i(size/4)] : NULL, MAX_QUANT_SIZE); inverse_transform (rcoeff, rblock, size); reconstruct_block(rblock,pblock,rec,size,stride); } thor_free(top_data - 1); thor_free(left_data - 1); thor_free(rcoeff); thor_free(rblock); thor_free(rblock2); }
static void motion_estimate_bi(mv_data_t* mv_data, mv_data_t** guide_mv_data, int num_guides, yuv_frame_t* indata0, yuv_frame_t* indata1, int k) { // Estimate indata0 from indata1 and vice-versa const int bw=mv_data->bw; const int bh=mv_data->bh; if (num_guides==0) { memset(mv_data->mv[0], 0, sizeof(mv_t)*bw*bh); memset(mv_data->mv[1], 0, sizeof(mv_t)*bw*bh); } memset(mv_data->bgmap, 0, sizeof(int)*bw*bh); const int step=mv_data->step; mv_t cand_list[MAX_CANDS]; yuv_frame_t* pic[2]; pic[0] = mv_data->reversed ? indata1 : indata0; pic[1] = mv_data->reversed ? indata0 : indata1; for (int i=0; i<bh; i+=step) { for (int j=0; j<bw; j+=step) { make_skip_vector(mv_data, j, i, step, step); skip_test(mv_data, pic, j, i); int pos=i*bw+j; if (mv_data->bgmap[pos]==0) { int num_cands=get_cands(mv_data, cand_list, guide_mv_data, num_guides, j, i, MAX_CANDS, step, step); adaptive_search_v2(mv_data, num_guides!=0, cand_list, num_cands, pic, j, i, step, step); } // propagate const mv_t mv0=mv_data->mv[0][pos]; const mv_t mv1=mv_data->mv[1][pos]; int bgval=mv_data->bgmap[pos]; for (int q=0; q<step; ++q) { for (int p=0; p<step; ++p) { mv_data->mv[0][pos+q*bw+p]=mv0; mv_data->mv[1][pos+q*bw+p]=mv1; mv_data->bgmap[pos+q*bw+p]=bgval; } } } } mv_t * mv0 = (mv_t*) thor_alloc(bw*bh*sizeof(mv_t), 16); mv_t * mv1 = (mv_t*) thor_alloc(bw*bh*sizeof(mv_t), 16); for (int i=0; i<bh; i++) { for (int j=0; j<bw; j++) { int num_cands=get_merge_cands(mv_data, cand_list, 1, j, i, MAX_CANDS); if (num_cands>1){ merge_candidate_search(cand_list, num_cands, mv_data, mv0, mv1, pic, j, i); } else { mv0[i*bw+j]=mv_data->mv[0][i*bw+j]; mv1[i*bw+j]=mv_data->mv[1][i*bw+j]; } } } memcpy(mv_data->mv[0], mv0, bw*bh*sizeof(mv_t)); memcpy(mv_data->mv[1], mv1, bw*bh*sizeof(mv_t)); thor_free(mv0); thor_free(mv1); }