buffer alloc cleanup / 10l
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 29 Dec 2002 00:57:23 +0000 (00:57 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 29 Dec 2002 00:57:23 +0000 (00:57 +0000)
Originally committed as revision 8631 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc

postproc/postprocess.c
postproc/postprocess_internal.h

index 1ccea03dfb52ddaf8f6fe4b285db3624ebe672ef..5fc0b7c1025f713b381955332880988a76b87079 100644 (file)
@@ -714,37 +714,48 @@ void pp_free_mode(pp_mode_t *mode){
     if(mode) free(mode);
 }
 
-pp_context_t *pp_get_context(int width, int height, int cpuCaps){
-       PPContext *c= memalign(32, sizeof(PPContext));
-       int i;
+static void reallocAlign(void **p, int alignment, int size){
+       if(*p) free(*p);
+       *p= memalign(alignment, size);
+       memset(*p, 0, size);
+}
+
+static void reallocBuffers(PPContext *c, int width, int height, int stride){
        int mbWidth = (width+15)>>4;
        int mbHeight= (height+15)>>4;
-       
-       c->cpuCaps= cpuCaps;
+       int i;
+
+       c->stride= stride;
 
-       c->tempBlocks= (uint8_t*)memalign(8, 2*16*8);
-       c->yHistogram= (uint64_t*)memalign(8, 256*sizeof(uint64_t));
+       reallocAlign((void **)&c->tempDst, 8, stride*24);
+       reallocAlign((void **)&c->tempSrc, 8, stride*24);
+       reallocAlign((void **)&c->tempBlocks, 8, 2*16*8);
+       reallocAlign((void **)&c->yHistogram, 8, 256*sizeof(uint64_t));
        for(i=0; i<256; i++)
                c->yHistogram[i]= width*height/64*15/256;
 
        for(i=0; i<3; i++)
        {
                //Note:the +17*1024 is just there so i dont have to worry about r/w over te end
-               c->tempBlured[i]= (uint8_t*)memalign(8, ((width+7)&(~7))*2*((height+7)&(~7)) + 17*1024); //FIXME dstStride instead of width
-               c->tempBluredPast[i]= (uint32_t*)memalign(8, 256*((height+7)&(~7))/2 + 17*1024);
-
-               memset(c->tempBlured[i], 0, ((width+7)&(~7))*2*((height+7)&(~7)) + 17*1024);
-               memset(c->tempBluredPast[i], 0, 256*((height+7)&(~7))/2 + 17*1024);
+               reallocAlign((void **)&c->tempBlured[i], 8, stride*mbHeight*16 + 17*1024);
+               reallocAlign((void **)&c->tempBluredPast[i], 8, 256*((height+7)&(~7))/2 + 17*1024);//FIXME size
        }
-       
-       c->tempDst= (uint8_t*)memalign(8, 1024*24);
-       c->tempSrc= (uint8_t*)memalign(8, 1024*24);
-       c->tempDstBlock= (uint8_t*)memalign(8, 1024*24);
-       c->tempSrcBlock= (uint8_t*)memalign(8, 1024*24);
-       c->deintTemp= (uint8_t*)memalign(8, width+16);
-       c->nonBQPTable= (QP_STORE_T*)memalign(8, mbWidth*mbHeight*sizeof(QP_STORE_T));
-       memset(c->nonBQPTable, 0, mbWidth*mbHeight*sizeof(QP_STORE_T));
 
+       reallocAlign((void **)&c->deintTemp, 8, width+16);
+       reallocAlign((void **)&c->nonBQPTable, 8, mbWidth*mbHeight*sizeof(QP_STORE_T));
+       reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
+}
+
+pp_context_t *pp_get_context(int width, int height, int cpuCaps){
+       PPContext *c= memalign(32, sizeof(PPContext));
+       int i;
+       int stride= (width+15)&(~15); //assumed / will realloc if needed
+        
+       memset(c, 0, sizeof(PPContext));
+       c->cpuCaps= cpuCaps;
+
+       reallocBuffers(c, width, height, stride);
+        
        c->frameNum=-1;
 
        return c;
@@ -761,11 +772,12 @@ void pp_free_context(void *vc){
        free(c->yHistogram);
        free(c->tempDst);
        free(c->tempSrc);
-       free(c->tempDstBlock);
-       free(c->tempSrcBlock);
        free(c->deintTemp);
        free(c->nonBQPTable);
-       
+       free(c->forcedQPTable);
+        
+       memset(c, 0, sizeof(PPContext));
+
        free(c);
 }
 
@@ -777,19 +789,23 @@ void  pp_postprocess(uint8_t * src[3], int srcStride[3],
 {
        int mbWidth = (width+15)>>4;
        int mbHeight= (height+15)>>4;
-       QP_STORE_T quantArray[2048/8];
        PPMode *mode = (PPMode*)vm;
        PPContext *c = (PPContext*)vc;
+        int minStride= MAX(srcStride[0], dstStride[0]);
+       
+       if(c->stride < minStride)
+               reallocBuffers(c, width, height, minStride);
+        
 
        if(QP_store==NULL || (mode->lumMode & FORCE_QUANT)) 
        {
                int i;
-               QP_store= quantArray;
+               QP_store= c->forcedQPTable;
                QPStride= 0;
                if(mode->lumMode & FORCE_QUANT)
-                       for(i=0; i<2048/8; i++) quantArray[i]= mode->forcedQuant;
+                       for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
                else
-                       for(i=0; i<2048/8; i++) quantArray[i]= 1;
+                       for(i=0; i<mbWidth; i++) QP_store[i]= 1;
        }
 if(0){
 int x,y;
index 12609e46d6afb5395680723251d92270c5904f04..e95e5e76de280acda17dca6520f8e1b5061e9027 100644 (file)
@@ -100,9 +100,6 @@ typedef struct PPContext{
        uint8_t *tempDst;
        uint8_t *tempSrc;
 
-       /* Temporary buffers for handling the last block */
-       uint8_t *tempDstBlock;
-       uint8_t *tempSrcBlock;
        uint8_t *deintTemp;
 
        uint64_t __attribute__((aligned(8))) pQPb;
@@ -110,15 +107,18 @@ typedef struct PPContext{
 
        uint64_t __attribute__((aligned(8))) mmxDcOffset[32];
        uint64_t __attribute__((aligned(8))) mmxDcThreshold[32];
-       
+
        QP_STORE_T *nonBQPTable;
-       
+       QP_STORE_T *forcedQPTable;
+
        int QP;
        int nonBQP;
 
        int frameNum;
        
        int cpuCaps;
+        
+       int stride; //size of some buffers (needed to realloc them if needed)
 
        PPMode ppMode;
 } PPContext;