Newer
Older
pp_context_t *pp_get_context(int width, int height, int cpuCaps){
PPContext *c= memalign(32, sizeof(PPContext));
int stride= (width+15)&(~15); //assumed / will realloc if needed
int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
memset(c, 0, sizeof(PPContext));
c->cpuCaps= cpuCaps;
if(cpuCaps&PP_FORMAT){
c->hChromaSubSample= cpuCaps&0x3;
c->vChromaSubSample= (cpuCaps>>4)&0x3;
}else{
c->hChromaSubSample= 1;
c->vChromaSubSample= 1;
}
reallocBuffers(c, width, height, stride, qpStride);
PPContext *c = (PPContext*)vc;
int i;
for(i=0; i<3; i++) free(c->tempBlured[i]);
for(i=0; i<3; i++) free(c->tempBluredPast[i]);
free(c->tempBlocks);
free(c->yHistogram);
free(c->tempDst);
free(c->tempSrc);
free(c->deintTemp);
free(c->forcedQPTable);
memset(c, 0, sizeof(PPContext));
void pp_postprocess(uint8_t * src[3], int srcStride[3],
int mbWidth = (width+15)>>4;
int mbHeight= (height+15)>>4;
int minStride= MAX(srcStride[0], dstStride[0]);
if(c->stride < minStride || c->qpStride < QPStride)
reallocBuffers(c, width, height,
MAX(minStride, c->stride),
MAX(c->qpStride, QPStride));
if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
for(i=0; i<mbWidth; i++) QP_store[i]= 1;
//printf("pict_type:%d\n", pict_type);
if(pict_type & PP_PICT_TYPE_QP2){
int i;
const int count= mbHeight * QPStride;
for(i=0; i<(count>>2); i++){
((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
}
for(i<<=2; i<count; i++){
c->stdQPTable[i] = QP_store[i]>>1;
}
QP_store= c->stdQPTable;
}
if(0){
int x,y;
for(y=0; y<mbHeight; y++){
for(x=0; x<mbWidth; x++){
printf("%2d ", QP_store[x + y*QPStride]);
}
printf("\n");
}
printf("\n");
}
int i;
const int count= mbHeight * QPStride;
for(i=0; i<(count>>2); i++){
((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x3F3F3F3F;
{
printf("using npp filters 0x%X/0x%X\n", mode->lumMode, mode->chromMode);
}
postProcess(src[0], srcStride[0], dst[0], dstStride[0],
width, height, QP_store, QPStride, 0, mode, c);
width = (width )>>c->hChromaSubSample;
height = (height)>>c->vChromaSubSample;
if(mode->chromMode)
{
postProcess(src[1], srcStride[1], dst[1], dstStride[1],
width, height, QP_store, QPStride, 1, mode, c);
postProcess(src[2], srcStride[2], dst[2], dstStride[2],
width, height, QP_store, QPStride, 2, mode, c);
}
else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2])
{
memcpy(dst[1], src[1], srcStride[1]*height);
memcpy(dst[2], src[2], srcStride[2]*height);
}
else
{
int y;
{
memcpy(&(dst[1][y*dstStride[1]]), &(src[1][y*srcStride[1]]), width);
memcpy(&(dst[2][y*dstStride[2]]), &(src[2][y*srcStride[2]]), width);
}
}