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

📄 dsp.c

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 C
📖 第 1 页 / 共 2 页
字号:
  for (i=8; i; i--) {
    sad += DSP_OP_ABS_DIFF(SrcData[0], DSP_OP_AVG (RefDataPtr1[0], RefDataPtr2[0]));
    sad += DSP_OP_ABS_DIFF(SrcData[1], DSP_OP_AVG (RefDataPtr1[1], RefDataPtr2[1]));
    sad += DSP_OP_ABS_DIFF(SrcData[2], DSP_OP_AVG (RefDataPtr1[2], RefDataPtr2[2]));
    sad += DSP_OP_ABS_DIFF(SrcData[3], DSP_OP_AVG (RefDataPtr1[3], RefDataPtr2[3]));
    sad += DSP_OP_ABS_DIFF(SrcData[4], DSP_OP_AVG (RefDataPtr1[4], RefDataPtr2[4]));
    sad += DSP_OP_ABS_DIFF(SrcData[5], DSP_OP_AVG (RefDataPtr1[5], RefDataPtr2[5]));
    sad += DSP_OP_ABS_DIFF(SrcData[6], DSP_OP_AVG (RefDataPtr1[6], RefDataPtr2[6]));
    sad += DSP_OP_ABS_DIFF(SrcData[7], DSP_OP_AVG (RefDataPtr1[7], RefDataPtr2[7]));

    if ( sad > thres )
      break;

    /* Step to next row of block. */
    SrcData += SrcStride;
    RefDataPtr1 += RefStride;
    RefDataPtr2 += RefStride;
  }

  return sad;
}

static ogg_uint32_t intra8x8_err__c (unsigned char *DataPtr, ogg_uint32_t Stride)
{
  ogg_uint32_t  i;
  ogg_uint32_t  XSum=0;
  ogg_uint32_t  XXSum=0;

  for (i=8; i; i--) {
     /* Examine alternate pixel locations. */
     XSum += DataPtr[0];
     XXSum += DataPtr[0]*DataPtr[0];
     XSum += DataPtr[1];
     XXSum += DataPtr[1]*DataPtr[1];
     XSum += DataPtr[2];
     XXSum += DataPtr[2]*DataPtr[2];
     XSum += DataPtr[3];
     XXSum += DataPtr[3]*DataPtr[3];
     XSum += DataPtr[4];
     XXSum += DataPtr[4]*DataPtr[4];
     XSum += DataPtr[5];
     XXSum += DataPtr[5]*DataPtr[5];
     XSum += DataPtr[6];
     XXSum += DataPtr[6]*DataPtr[6];
     XSum += DataPtr[7];
     XXSum += DataPtr[7]*DataPtr[7];

     /* Step to next row of block. */
     DataPtr += Stride;
   }

   /* Compute population variance as mis-match metric. */
   return (( (XXSum<<6) - XSum*XSum ) );
}

static ogg_uint32_t inter8x8_err__c (unsigned char *SrcData, ogg_uint32_t SrcStride,
		                 unsigned char *RefDataPtr, ogg_uint32_t RefStride)
{
  ogg_uint32_t  i;
  ogg_uint32_t  XSum=0;
  ogg_uint32_t  XXSum=0;
  ogg_int32_t   DiffVal;

  for (i=8; i; i--) {
    DiffVal = DSP_OP_DIFF (SrcData[0], RefDataPtr[0]);
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF (SrcData[1], RefDataPtr[1]);
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF (SrcData[2], RefDataPtr[2]);
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF (SrcData[3], RefDataPtr[3]);
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF (SrcData[4], RefDataPtr[4]);
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF (SrcData[5], RefDataPtr[5]);
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF (SrcData[6], RefDataPtr[6]);
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF (SrcData[7], RefDataPtr[7]);
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    /* Step to next row of block. */
    SrcData += SrcStride;
    RefDataPtr += RefStride;
  }

  /* Compute and return population variance as mis-match metric. */
  return (( (XXSum<<6) - XSum*XSum ));
}

static ogg_uint32_t inter8x8_err_xy2__c (unsigned char *SrcData, ogg_uint32_t SrcStride,
		                     unsigned char *RefDataPtr1,
				     unsigned char *RefDataPtr2, ogg_uint32_t RefStride)
{
  ogg_uint32_t  i;
  ogg_uint32_t  XSum=0;
  ogg_uint32_t  XXSum=0;
  ogg_int32_t   DiffVal;

  for (i=8; i; i--) {
    DiffVal = DSP_OP_DIFF(SrcData[0], DSP_OP_AVG (RefDataPtr1[0], RefDataPtr2[0]));
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF(SrcData[1], DSP_OP_AVG (RefDataPtr1[1], RefDataPtr2[1]));
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF(SrcData[2], DSP_OP_AVG (RefDataPtr1[2], RefDataPtr2[2]));
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF(SrcData[3], DSP_OP_AVG (RefDataPtr1[3], RefDataPtr2[3]));
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF(SrcData[4], DSP_OP_AVG (RefDataPtr1[4], RefDataPtr2[4]));
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF(SrcData[5], DSP_OP_AVG (RefDataPtr1[5], RefDataPtr2[5]));
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF(SrcData[6], DSP_OP_AVG (RefDataPtr1[6], RefDataPtr2[6]));
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    DiffVal = DSP_OP_DIFF(SrcData[7], DSP_OP_AVG (RefDataPtr1[7], RefDataPtr2[7]));
    XSum += DiffVal;
    XXSum += DiffVal*DiffVal;

    /* Step to next row of block. */
    SrcData += SrcStride;
    RefDataPtr1 += RefStride;
    RefDataPtr2 += RefStride;
  }

  /* Compute and return population variance as mis-match metric. */
  return (( (XXSum<<6) - XSum*XSum ));
}

static void nop (void) { /* NOP */ }

void dsp_init(DspFunctions *funcs)
{
  funcs->save_fpu = nop;
  funcs->restore_fpu = nop;
  funcs->sub8x8 = sub8x8__c;
  funcs->sub8x8_128 = sub8x8_128__c;
  funcs->sub8x8avg2 = sub8x8avg2__c;
  funcs->row_sad8 = row_sad8__c;
  funcs->col_sad8x8 = col_sad8x8__c;
  funcs->sad8x8 = sad8x8__c;
  funcs->sad8x8_thres = sad8x8_thres__c;
  funcs->sad8x8_xy2_thres = sad8x8_xy2_thres__c;
  funcs->intra8x8_err = intra8x8_err__c;
  funcs->inter8x8_err = inter8x8_err__c;
  funcs->inter8x8_err_xy2 = inter8x8_err_xy2__c;
}

extern void FilterHoriz(unsigned char * PixelPtr, ogg_int32_t LineLength, ogg_int32_t *BoundingValuePtr);
extern void FilterVert(unsigned char * PixelPtr, 	ogg_int32_t LineLength, ogg_int32_t *BoundingValuePtr);
extern void SetupBoundingValueArray_Generic(struct PB_INSTANCE *pbi, ogg_int32_t FLimit);
extern void FilterHoriz_MMX(unsigned char * PixelPtr, ogg_int32_t LineLength, ogg_int32_t *BoundingValuePtr);
extern void FilterVert_MMX(unsigned char * PixelPtr, 	ogg_int32_t LineLength, ogg_int32_t *BoundingValuePtr);
extern void SetupBoundingValueArray_ForMMX(struct PB_INSTANCE *pbi, ogg_int32_t FLimit);
extern void DeblockLoopFilteredBand(PB_INSTANCE *pbi, unsigned char *SrcPtr, unsigned char *DesPtr,ogg_uint32_t PlaneLineStep, ogg_uint32_t FragsAcross,ogg_uint32_t StartFrag,const ogg_uint32_t *QuantScale);
extern void DeblockLoopFilteredBand_MMX(PB_INSTANCE *pbi, unsigned char *SrcPtr, unsigned char *DesPtr,ogg_uint32_t PlaneLineStep, ogg_uint32_t FragsAcross,ogg_uint32_t StartFrag,const ogg_uint32_t *QuantScale);
extern void DeringBlockStrong(const unsigned char *SrcPtr,unsigned char *DstPtr,const ogg_int32_t Pitch,ogg_uint32_t FragQIndex,const ogg_uint32_t *QuantScale);
extern void DeringBlockWeak( const unsigned char *SrcPtr,unsigned char *DstPtr,const ogg_int32_t Pitch,ogg_uint32_t FragQIndex,const ogg_uint32_t *QuantScale);
extern void DeringBlockStrong_MMX(const unsigned char *SrcPtr,unsigned char *DstPtr,const ogg_int32_t Pitch,ogg_uint32_t FragQIndex,const ogg_uint32_t *QuantScale);
extern void DeringBlockWeak_MMX( const unsigned char *SrcPtr,unsigned char *DstPtr,const ogg_int32_t Pitch,ogg_uint32_t FragQIndex,const ogg_uint32_t *QuantScale);
void dsp_static_init(void)
{
  cpu_init ();
  dsp_init (&dsp_funcs);
  dsp_recon_init (&dsp_funcs);
  dsp_dct_init (&dsp_funcs);
  dsp_funcs.IDct1=IDct1;
  dsp_funcs.IDct10=IDct10;
  dsp_funcs.IDctSlow=IDctSlow;
  dsp_funcs.FilterHoriz=FilterHoriz;
  dsp_funcs.FilterVert=FilterVert;
  dsp_funcs.SetupBoundingValueArray=SetupBoundingValueArray_Generic;
  dsp_funcs.DeblockLoopFilteredBand=DeblockLoopFilteredBand;
  dsp_funcs.DeringBlockStrong=DeringBlockStrong;
  dsp_funcs.DeringBlockWeak=DeringBlockWeak;

  if (cpu_flags & CPU_X86_MMX) {
    dsp_i386_mmx_init(&dsp_funcs);
    dsp_funcs.IDct1=MMX_idct1;
    dsp_funcs.IDct10=MMX_idct10;
    dsp_funcs.IDctSlow=MMX_idct;
    fillidctconstants();
    dsp_funcs.FilterHoriz=FilterHoriz_MMX;
    dsp_funcs.FilterVert=FilterVert_MMX;
    dsp_funcs.SetupBoundingValueArray=SetupBoundingValueArray_ForMMX;
    dsp_funcs.DeblockLoopFilteredBand=DeblockLoopFilteredBand_MMX;
    dsp_funcs.DeringBlockStrong=DeringBlockStrong_MMX;
    dsp_funcs.DeringBlockWeak=DeringBlockWeak_MMX;
  }
  if (cpu_flags & CPU_X86_MMXEXT) {
    dsp_i386_mmxext_init(&dsp_funcs);
  }
  if (cpu_flags & CPU_X86_SSE2) {
    //dsp_funcs.IDctSlow=ff_vp3_idct_sse2;
  }
}

⌨️ 快捷键说明

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