コード例 #1
0
ファイル: decode_block.c プロジェクト: awakecoding/thor
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);
}
コード例 #2
0
ファイル: decode_block.c プロジェクト: johnsonbaugh/thor
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);
}
コード例 #3
0
ファイル: temporal_interp.c プロジェクト: leloulight/thor
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);
}