⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macroblock.c

📁 包含了从MPEG4的视频解码到H.264的视频编码部分的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
				  movq mm2,[esi+16]				  			  
				  movq mm3,[esi+24]
				  //PUNPCKLBW mm0,mm7	
				  //PUNPCKLBW mm1,mm7	
				  //PUNPCKLBW mm2,mm7	
				  //PUNPCKLBW mm3,mm7
				  //转秩	
				  movq mm4,mm0
				  movq mm5,mm1
				  movq mm6,mm2 
				  movq mm7,mm3
				  PUNPCKLWD mm0,mm1
				  PUNPCKLWD mm2,mm3
				  movq mm1,mm0
				  PUNPCKLDQ mm0,mm2
				  PUNPCKHDQ mm1,mm2
				  PUNPCKHWD mm4,mm5
				  PUNPCKHWD mm6,mm3
				  movq mm3,mm4
				  PUNPCKLDQ mm4,mm6
				  PUNPCKHDQ mm3,mm6
				  movq mm2,mm4

				  movq [edi],mm0
				  movq [edi+32],mm1
				  movq [edi+64],mm2
				  movq [edi+96],mm3				  
				  emms
			  }
			 
		  }
		  else if (bw_ref_frame ==-1 )
		  {
			  _asm
			  {
				  mov edi,pt1
				  mov esi,fpred
				  //pxor mm7,mm7
				  movq mm0,[esi]				  			  
				  movq mm1,[esi+8]				  			  
				  movq mm2,[esi+16]				  			  
				  movq mm3,[esi+24]
				 // PUNPCKLBW mm0,mm7	
				 // PUNPCKLBW mm1,mm7	
				 // PUNPCKLBW mm2,mm7	
				 // PUNPCKLBW mm3,mm7
				  //转秩	
				  movq mm4,mm0
				  movq mm5,mm1
				  movq mm6,mm2 
				  movq mm7,mm3
				  PUNPCKLWD mm0,mm1
				  PUNPCKLWD mm2,mm3
				  movq mm1,mm0
				  PUNPCKLDQ mm0,mm2
				  PUNPCKHDQ mm1,mm2
				  PUNPCKHWD mm4,mm5
				  PUNPCKHWD mm6,mm3
				  movq mm3,mm4
				  PUNPCKLDQ mm4,mm6
				  PUNPCKHDQ mm3,mm6
				  movq mm2,mm4

				  movq [edi],mm0
				  movq [edi+32],mm1
				  movq [edi+64],mm2
				  movq [edi+96],mm3				  
				  emms
			  }
		
		  }
		  else
		  {
			  _asm
			  {
				  mov edi,pt1
				  mov eax,bpred
				  mov ebx,fpred					  
				  movq mm0,[eax]
				  movq mm1,[eax+8]
				  movq mm2,[eax+16]
				  movq mm3,[eax+24]
				  movq mm4,[ebx]
				  movq mm5,[ebx+8]
				  movq mm6,[ebx+16]
				  movq mm7,[ebx+24]
				  //PUNPCKLBW mm0,zero
				  //PUNPCKLBW mm1,zero
				  //PUNPCKLBW mm2,zero
				  //PUNPCKLBW mm3,zero
				  //PUNPCKLBW mm4,zero
				  //PUNPCKLBW mm5,zero
				  //PUNPCKLBW mm6,zero
				  //PUNPCKLBW mm7,zero
				  paddw mm0,mm4
				  paddw mm0,f1
				  psraw mm0,1
				  paddw mm1,mm5
				  paddw mm1,f1
				  psraw mm1,1
				  paddw mm2,mm6
				  paddw mm2,f1
				  psraw mm2,1
				  paddw mm3,mm7
				  paddw mm3,f1
				  psraw mm3,1
				  //转秩	
				  movq mm4,mm0
				  movq mm5,mm1
				  movq mm6,mm2 
				  movq mm7,mm3
				  PUNPCKLWD mm0,mm1
				  PUNPCKLWD mm2,mm3
				  movq mm1,mm0
				  PUNPCKLDQ mm0,mm2
				  PUNPCKHDQ mm1,mm2
				  PUNPCKHWD mm4,mm5
				  PUNPCKHWD mm6,mm3
				  movq mm3,mm4
				  PUNPCKLDQ mm4,mm6
				  PUNPCKHDQ mm3,mm6
				  movq mm2,mm4

				  movq [edi],mm0				  
				  movq [edi+32],mm1					  
				  movq [edi+64],mm2					  
				  movq [edi+96],mm3	
				  emms
			  }
		
		  }
		  
      }
      else
	  {        
		  _asm
			  {
				  mov edi,pt1
				  mov eax,bpred
				  mov ebx,fpred					  
				  movq mm0,[eax]
				  movq mm1,[eax+8]
				  movq mm2,[eax+16]
				  movq mm3,[eax+24]
				  movq mm4,[ebx]
				  movq mm5,[ebx+8]
				  movq mm6,[ebx+16]
				  movq mm7,[ebx+24]
				  /*PUNPCKLBW mm0,zero
				  PUNPCKLBW mm1,zero
				  PUNPCKLBW mm2,zero
				  PUNPCKLBW mm3,zero
				  PUNPCKLBW mm4,zero
				  PUNPCKLBW mm5,zero
				  PUNPCKLBW mm6,zero
				  PUNPCKLBW mm7,zero*/
				  paddw mm0,mm4
				  paddw mm0,f1
				  psraw mm0,1
				  paddw mm1,mm5
				  paddw mm1,f1
				  psraw mm1,1
				  paddw mm2,mm6
				  paddw mm2,f1
				  psraw mm2,1
				  paddw mm3,mm7
				  paddw mm3,f1
				  psraw mm3,1
				  //转秩	
				  movq mm4,mm0
				  movq mm5,mm1
				  movq mm6,mm2 
				  movq mm7,mm3
				  PUNPCKLWD mm0,mm1
				  PUNPCKLWD mm2,mm3
				  movq mm1,mm0
				  PUNPCKLDQ mm0,mm2
				  PUNPCKHDQ mm1,mm2
				  PUNPCKHWD mm4,mm5
				  PUNPCKHWD mm6,mm3
				  movq mm3,mm4
				  PUNPCKLDQ mm4,mm6
				  PUNPCKHDQ mm3,mm6
				  movq mm2,mm4

				  movq [edi],mm0				  
				  movq [edi+32],mm1					  
				  movq [edi+64],mm2					  
				  movq [edi+96],mm3	
				  emms
			  }
		
	  }
    }    
    else if (fw_mode || skipped)
    {     
		_asm
			  {
				  mov edi,pt1
				  mov esi,fpred
				  //pxor mm7,mm7
				  movq mm0,[esi]				  			  
				  movq mm1,[esi+8]				  			  
				  movq mm2,[esi+16]				  			  
				  movq mm3,[esi+24]
				  /*PUNPCKLBW mm0,mm7	
				  PUNPCKLBW mm1,mm7	
				  PUNPCKLBW mm2,mm7	
				  PUNPCKLBW mm3,mm7*/
				  //转秩	
				  movq mm4,mm0
				  movq mm5,mm1
				  movq mm6,mm2 
				  movq mm7,mm3
				  PUNPCKLWD mm0,mm1
				  PUNPCKLWD mm2,mm3
				  movq mm1,mm0
				  PUNPCKLDQ mm0,mm2
				  PUNPCKHDQ mm1,mm2
				  PUNPCKHWD mm4,mm5
				  PUNPCKHWD mm6,mm3
				  movq mm3,mm4
				  PUNPCKLDQ mm4,mm6
				  PUNPCKHDQ mm3,mm6
				  movq mm2,mm4

				  movq [edi],mm0
				  movq [edi+32],mm1
				  movq [edi+64],mm2
				  movq [edi+96],mm3				  
				  emms
			  }		
    }
    else
    {      
		_asm
			  {
				  mov edi,pt1
				  mov esi,bpred
				  //pxor mm7,mm7
				  movq mm0,[esi]				  			  
				  movq mm1,[esi+8]				  			  
				  movq mm2,[esi+16]				  			  
				  movq mm3,[esi+24]
				  /*PUNPCKLBW mm0,mm7	
				  PUNPCKLBW mm1,mm7	
				  PUNPCKLBW mm2,mm7	
				  PUNPCKLBW mm3,mm7*/
				  //转秩	
				  movq mm4,mm0
				  movq mm5,mm1
				  movq mm6,mm2 
				  movq mm7,mm3
				  PUNPCKLWD mm0,mm1
				  PUNPCKLWD mm2,mm3
				  movq mm1,mm0
				  PUNPCKLDQ mm0,mm2
				  PUNPCKHDQ mm1,mm2
				  PUNPCKHWD mm4,mm5
				  PUNPCKHWD mm6,mm3
				  movq mm3,mm4
				  PUNPCKLDQ mm4,mm6
				  PUNPCKHDQ mm3,mm6
				  movq mm2,mm4

				  movq [edi],mm0
				  movq [edi+32],mm1
				  movq [edi+64],mm2
				  movq [edi+96],mm3				  
				  emms
			  }
		
    }
  
  /*
    if (direct || (fw_mode && bw_mode))
    {
      if (direct )
      {
        for (j=block_y; j<block_y4; j++)
          for (i=block_x; i<block_x4; i++)  
            if (fw_ref_frame==-1)
              img->mpr[i][j] = *bpred++;
            else if (bw_ref_frame==-1)
              img->mpr[i][j] = *fpred++;
            else
              img->mpr[i][j] = (*fpred++ + *bpred++ + 1) / 2; 
      }
      else
        for (j=block_y; j<block_y4; j++)
          for (i=block_x; i<block_x4; i++)  
            img->mpr[i][j] = (*fpred++ + *bpred++ + 1) / 2; 
     }    
     else if (fw_mode || skipped)
     {
       for (j=block_y; j<block_y4; j++)
         for (i=block_x; i<block_x4; i++)  img->mpr[i][j] = *fpred++;
     }
     else
     {
       for (j=block_y; j<block_y4; j++)
         for (i=block_x; i<block_x4; i++)  img->mpr[i][j] = *bpred++;
     }*/
  
}




/*!
 ************************************************************************
 * \brief
 *    Chroma residual coding for an macroblock
 ************************************************************************
 */
void ChromaResidualCoding (int* cr_cbp)
{
  int   uv, block8, block_y, block_x, j, i;
  int   fw_mode, bw_mode, refframe;
  int   skipped = (img->mb_data[img->current_mb_nr].mb_type == 0 && img->type == INTER_IMG);
  int   incr = 1, offset = 0; // For MB level field/frame coding 
  int   bw_ref;


  if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
  {
    incr = 2;   // increment every other field  
    if(!img->top_field)
      offset = -7;
  }

  for (*cr_cbp=0, uv=0; uv<2; uv++)
  {
    //===== prediction of chrominance blocks ===d==
    block8 = 0;
    for (block_y=0; block_y<8; block_y+=4)
    for (block_x=0; block_x<8; block_x+=4, block8++)
    {
      SetModesAndRefframe (block8, &fw_mode, &bw_mode, &refframe, &bw_ref);

      ChromaPrediction4x4 (uv, block_x, block_y, fw_mode, bw_mode, refframe, bw_ref);
    }

        // ==== set chroma residue to zero for skip Mode in SP frames 
    if (img->NoResidueDirect)
      for (j=0; j<8; j++)
        for (i=0; i<8; i++)
        {
          imgUV[uv][img->pix_c_y+j][img->pix_c_x+i] = img->mpr[i][j];
        }
        else
    if (skipped && img->types==SP_IMG)
      for (j=0; j<8; j++)
        for (i=0; i<8; i++)
        {
          img->m7[i][j] = 0;
        }
    else
    if (skipped)
    {
      for (j=0; j<8; j++)
        for (i=0; i<8; i++)
        {
          imgUV[uv][img->pix_c_y+j][img->pix_c_x+i] = img->mpr[i][j];
        }
    }
    else
      for (j=0; j<8; j++)
        for (i=0; i<8; i++)
        {
          img->m7[i][j] = imgUV_org[uv][img->pix_c_y+(j*incr)+offset][img->pix_c_x+i] - img->mpr[i][j];
        }

    //===== DCT, Quantization, inverse Quantization, IDCT, and Reconstruction =====
    //===== Call function for skip mode in SP frames to properly process frame ====
    
    if (skipped && img->types==SP_IMG)
    {
        *cr_cbp=dct_chroma_sp(uv,*cr_cbp);
    }
    else
    if (!img->NoResidueDirect && !skipped)
    {
      if (img->types!=SP_IMG || IS_INTRA (&img->mb_data[img->current_mb_nr]))
        *cr_cbp=dct_chroma   (uv,*cr_cbp);
      else
        *cr_cbp=dct_chroma_sp(uv,*cr_cbp);
    }
  }

  //===== update currMB->cbp =====
  img->mb_data[img->current_mb_nr].cbp += ((*cr_cbp)<<4);  
}


/*!
 ************************************************************************
 * \brief
 *    Predict an intra chroma 8x8 block
 ************************************************************************
 */
void IntraChromaPrediction8x8 (int *mb_up, int *mb_left, int*mb_up_left)
{
  Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  int     s, s0, s1, s2, s3, i, j, k;
  pel_t** image;
  int     block_x, block_y, b4;
  int     img_cx            = img->pix_c_x;
  int     img_cy            = img->pix_c_y;
  int     img_cx_1          = img->pix_c_x-1;
  int     img_cx_4          = img->pix_c_x+4;
  int     img_cy_1          = img->pix_c_y-1;
  int     img_cy_4          = img->pix_c_y+4;
  int     mb_nr             = img->current_mb_nr;
  int     mb_width          = img->width/16;
  int     mb_available_up   = (img_cy/BLOCK_SIZE == 0) ? 0 : (img->mb_data[mb_nr].slice_nr==img->mb_data[mb_nr-mb_width].slice_nr);
  int     mb_available_left = (img_cx/BLOCK_SIZE == 0) ? 0 : (img->mb_data[mb_nr].slice_nr==img->mb_data[mb_nr-1]       .slice_nr);
  int     mb_available_up_left = (img_cx/BLOCK_SIZE == 0 || img_cy/BLOCK_SIZE == 0) ? 0 : (img->mb_data[mb_nr].slice_nr==img->mb_data[mb_nr-mb_width-1].slice_nr);
  int     ih,iv;
  int     ib,ic,iaa;
  int     uv;
  int     hline[8], vline[8];
  int     mode;
  int     best_mode = DC_PRED_8;         //just an initilaization here, should always be overwritten
  int     cost;
  int     min_cost;
  _int16     diff[16];

  if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
  {
    img_cy   = img->field_pix_c_y;
    img_cy_1 = img->field_pix_c_y-1;
    img_cy_4 = img->field_pix_c_y+4;
    mb_available_up = (img_cy/BLOCK_SIZE == 0) ? 0 : (img->mb

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -