📄 dsp.c
字号:
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 + -