Skip to content
Snippets Groups Projects
postprocess.c 44 KiB
Newer Older
  • Learn to ignore specific revisions
  •                 c->vChromaSubSample= (cpuCaps>>4)&0x3;
            }else{
                    c->hChromaSubSample= 1;
                    c->vChromaSubSample= 1;
            }
    
            reallocBuffers(c, width, height, stride, qpStride);
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
    void pp_free_context(void *vc){
    
            PPContext *c = (PPContext*)vc;
            int i;
    
    Luca Barbato's avatar
    Luca Barbato committed
            for(i=0; i<3; i++) av_free(c->tempBlured[i]);
            for(i=0; i<3; i++) av_free(c->tempBluredPast[i]);
    
    Luca Barbato's avatar
    Luca Barbato committed
            av_free(c->tempBlocks);
            av_free(c->yHistogram);
            av_free(c->tempDst);
            av_free(c->tempSrc);
            av_free(c->deintTemp);
            av_free(c->stdQPTable);
            av_free(c->nonBQPTable);
            av_free(c->forcedQPTable);
    
            memset(c, 0, sizeof(PPContext));
    
    Luca Barbato's avatar
    Luca Barbato committed
            av_free(c);
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
    void  pp_postprocess(uint8_t * src[3], int srcStride[3],
    
                     uint8_t * dst[3], int dstStride[3],
    
                     int width, int height,
    
                     QP_STORE_T *QP_store,  int QPStride,
    
                     pp_mode_t *vm,  void *vc, int pict_type)
    
            int mbWidth = (width+15)>>4;
            int mbHeight= (height+15)>>4;
            PPMode *mode = (PPMode*)vm;
            PPContext *c = (PPContext*)vc;
    
            int minStride= FFMAX(FFABS(srcStride[0]), FFABS(dstStride[0]));
            int absQPStride = FFABS(QPStride);
    
    
            // c->stride and c->QPStride are always positive
            if(c->stride < minStride || c->qpStride < absQPStride)
                    reallocBuffers(c, width, height,
    
                                    FFMAX(minStride, c->stride),
                                    FFMAX(c->qpStride, absQPStride));
    
    
            if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
            {
                    int i;
                    QP_store= c->forcedQPTable;
                    absQPStride = QPStride = 0;
                    if(mode->lumMode & FORCE_QUANT)
                            for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
                    else
                            for(i=0; i<mbWidth; i++) QP_store[i]= 1;
            }
    
            if(pict_type & PP_PICT_TYPE_QP2){
                    int i;
                    const int count= mbHeight * absQPStride;
                    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;
                    }
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
                    QP_store= c->stdQPTable;
    
                    QPStride= absQPStride;
            }
    
    if(0){
    int x,y;
    for(y=0; y<mbHeight; y++){
    
            for(x=0; x<mbWidth; x++){
    
                    av_log(c, AV_LOG_INFO, "%2d ", QP_store[x + y*QPStride]);
    
            av_log(c, AV_LOG_INFO, "\n");
    
            av_log(c, AV_LOG_INFO, "\n");
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
    
    
            if((pict_type&7)!=3)
            {
                    if (QPStride >= 0) {
                            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;
                            }
                            for(i<<=2; i<count; i++){
                                    c->nonBQPTable[i] = QP_store[i] & 0x3F;
                            }
                    } else {
                            int i,j;
                            for(i=0; i<mbHeight; i++) {
                                        for(j=0; j<absQPStride; j++) {
                                            c->nonBQPTable[i*absQPStride+j] = QP_store[i*QPStride+j] & 0x3F;
                                    }
                            }
                    }
            }
    
    
            av_log(c, AV_LOG_DEBUG, "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])
            {
                    linecpy(dst[1], src[1], height, srcStride[1]);
                    linecpy(dst[2], src[2], height, srcStride[2]);
            }
            else
            {
                    int y;
                    for(y=0; y<height; 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);
                    }
            }