comparison libpostproc/postprocess.c @ 1196:2e06398e4647 libavcodec

mpeg2 qscale flag a few bugfixes for the C pp code minor optimization
author michaelni
date Fri, 18 Apr 2003 12:45:34 +0000
parents 57fe9c4e0c6e
children d9cbc8ef5a33
comparison
equal deleted inserted replaced
1195:f7522f310c7e 1196:2e06398e4647
197 */ 197 */
198 static inline int isHorizDC(uint8_t src[], int stride, PPContext *c) 198 static inline int isHorizDC(uint8_t src[], int stride, PPContext *c)
199 { 199 {
200 int numEq= 0; 200 int numEq= 0;
201 int y; 201 int y;
202 const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1; 202 const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
203 const int dcThreshold= dcOffset*2 + 1; 203 const int dcThreshold= dcOffset*2 + 1;
204
204 for(y=0; y<BLOCK_SIZE; y++) 205 for(y=0; y<BLOCK_SIZE; y++)
205 { 206 {
206 if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++; 207 if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++;
207 if(((unsigned)(src[1] - src[2] + dcOffset)) < dcThreshold) numEq++; 208 if(((unsigned)(src[1] - src[2] + dcOffset)) < dcThreshold) numEq++;
208 if(((unsigned)(src[2] - src[3] + dcOffset)) < dcThreshold) numEq++; 209 if(((unsigned)(src[2] - src[3] + dcOffset)) < dcThreshold) numEq++;
219 * Check if the middle 8x8 Block in the given 8x16 block is flat 220 * Check if the middle 8x8 Block in the given 8x16 block is flat
220 */ 221 */
221 static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){ 222 static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){
222 int numEq= 0; 223 int numEq= 0;
223 int y; 224 int y;
224 const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1; 225 const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
225 const int dcThreshold= dcOffset*2 + 1; 226 const int dcThreshold= dcOffset*2 + 1;
227
226 src+= stride*4; // src points to begin of the 8x8 Block 228 src+= stride*4; // src points to begin of the 8x8 Block
227 for(y=0; y<BLOCK_SIZE-1; y++) 229 for(y=0; y<BLOCK_SIZE-1; y++)
228 { 230 {
229 if(((unsigned)(src[0] - src[0+stride] + dcOffset)) < dcThreshold) numEq++; 231 if(((unsigned)(src[0] - src[0+stride] + dcOffset)) < dcThreshold) numEq++;
230 if(((unsigned)(src[1] - src[1+stride] + dcOffset)) < dcThreshold) numEq++; 232 if(((unsigned)(src[1] - src[1+stride] + dcOffset)) < dcThreshold) numEq++;
733 if(*p) free(*p); 735 if(*p) free(*p);
734 *p= memalign(alignment, size); 736 *p= memalign(alignment, size);
735 memset(*p, 0, size); 737 memset(*p, 0, size);
736 } 738 }
737 739
738 static void reallocBuffers(PPContext *c, int width, int height, int stride){ 740 static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride){
739 int mbWidth = (width+15)>>4; 741 int mbWidth = (width+15)>>4;
740 int mbHeight= (height+15)>>4; 742 int mbHeight= (height+15)>>4;
741 int i; 743 int i;
742 744
743 c->stride= stride; 745 c->stride= stride;
746 c->qpStride= qpStride;
744 747
745 reallocAlign((void **)&c->tempDst, 8, stride*24); 748 reallocAlign((void **)&c->tempDst, 8, stride*24);
746 reallocAlign((void **)&c->tempSrc, 8, stride*24); 749 reallocAlign((void **)&c->tempSrc, 8, stride*24);
747 reallocAlign((void **)&c->tempBlocks, 8, 2*16*8); 750 reallocAlign((void **)&c->tempBlocks, 8, 2*16*8);
748 reallocAlign((void **)&c->yHistogram, 8, 256*sizeof(uint64_t)); 751 reallocAlign((void **)&c->yHistogram, 8, 256*sizeof(uint64_t));
755 reallocAlign((void **)&c->tempBlured[i], 8, stride*mbHeight*16 + 17*1024); 758 reallocAlign((void **)&c->tempBlured[i], 8, stride*mbHeight*16 + 17*1024);
756 reallocAlign((void **)&c->tempBluredPast[i], 8, 256*((height+7)&(~7))/2 + 17*1024);//FIXME size 759 reallocAlign((void **)&c->tempBluredPast[i], 8, 256*((height+7)&(~7))/2 + 17*1024);//FIXME size
757 } 760 }
758 761
759 reallocAlign((void **)&c->deintTemp, 8, 2*width+32); 762 reallocAlign((void **)&c->deintTemp, 8, 2*width+32);
760 reallocAlign((void **)&c->nonBQPTable, 8, mbWidth*mbHeight*sizeof(QP_STORE_T)); 763 reallocAlign((void **)&c->nonBQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
764 reallocAlign((void **)&c->stdQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
761 reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T)); 765 reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
762 } 766 }
763 767
764 static void global_init(){ 768 static void global_init(){
765 int i; 769 int i;
770 } 774 }
771 775
772 pp_context_t *pp_get_context(int width, int height, int cpuCaps){ 776 pp_context_t *pp_get_context(int width, int height, int cpuCaps){
773 PPContext *c= memalign(32, sizeof(PPContext)); 777 PPContext *c= memalign(32, sizeof(PPContext));
774 int stride= (width+15)&(~15); //assumed / will realloc if needed 778 int stride= (width+15)&(~15); //assumed / will realloc if needed
779 int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
775 780
776 global_init(); 781 global_init();
777 782
778 memset(c, 0, sizeof(PPContext)); 783 memset(c, 0, sizeof(PPContext));
779 c->cpuCaps= cpuCaps; 784 c->cpuCaps= cpuCaps;
783 }else{ 788 }else{
784 c->hChromaSubSample= 1; 789 c->hChromaSubSample= 1;
785 c->vChromaSubSample= 1; 790 c->vChromaSubSample= 1;
786 } 791 }
787 792
788 reallocBuffers(c, width, height, stride); 793 reallocBuffers(c, width, height, stride, qpStride);
789 794
790 c->frameNum=-1; 795 c->frameNum=-1;
791 796
792 return c; 797 return c;
793 } 798 }
802 free(c->tempBlocks); 807 free(c->tempBlocks);
803 free(c->yHistogram); 808 free(c->yHistogram);
804 free(c->tempDst); 809 free(c->tempDst);
805 free(c->tempSrc); 810 free(c->tempSrc);
806 free(c->deintTemp); 811 free(c->deintTemp);
812 free(c->stdQPTable);
807 free(c->nonBQPTable); 813 free(c->nonBQPTable);
808 free(c->forcedQPTable); 814 free(c->forcedQPTable);
809 815
810 memset(c, 0, sizeof(PPContext)); 816 memset(c, 0, sizeof(PPContext));
811 817
821 int mbWidth = (width+15)>>4; 827 int mbWidth = (width+15)>>4;
822 int mbHeight= (height+15)>>4; 828 int mbHeight= (height+15)>>4;
823 PPMode *mode = (PPMode*)vm; 829 PPMode *mode = (PPMode*)vm;
824 PPContext *c = (PPContext*)vc; 830 PPContext *c = (PPContext*)vc;
825 int minStride= MAX(srcStride[0], dstStride[0]); 831 int minStride= MAX(srcStride[0], dstStride[0]);
826 832
827 if(c->stride < minStride) 833 if(c->stride < minStride || c->qpStride < QPStride)
828 reallocBuffers(c, width, height, minStride); 834 reallocBuffers(c, width, height,
835 MAX(minStride, c->stride),
836 MAX(c->qpStride, QPStride));
829 837
830 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT)) 838 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
831 { 839 {
832 int i; 840 int i;
833 QP_store= c->forcedQPTable; 841 QP_store= c->forcedQPTable;
835 if(mode->lumMode & FORCE_QUANT) 843 if(mode->lumMode & FORCE_QUANT)
836 for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant; 844 for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
837 else 845 else
838 for(i=0; i<mbWidth; i++) QP_store[i]= 1; 846 for(i=0; i<mbWidth; i++) QP_store[i]= 1;
839 } 847 }
848 //printf("pict_type:%d\n", pict_type);
849
850 if(pict_type & PP_PICT_TYPE_QP2){
851 int i;
852 const int count= mbHeight * QPStride;
853 for(i=0; i<(count>>2); i++){
854 ((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
855 }
856 for(i<<=2; i<count; i++){
857 c->stdQPTable[i] = QP_store[i]>>1;
858 }
859 QP_store= c->stdQPTable;
860 }
861
840 if(0){ 862 if(0){
841 int x,y; 863 int x,y;
842 for(y=0; y<mbHeight; y++){ 864 for(y=0; y<mbHeight; y++){
843 for(x=0; x<mbWidth; x++){ 865 for(x=0; x<mbWidth; x++){
844 printf("%2d ", QP_store[x + y*QPStride]); 866 printf("%2d ", QP_store[x + y*QPStride]);
845 } 867 }
846 printf("\n"); 868 printf("\n");
847 } 869 }
848 printf("\n"); 870 printf("\n");
849 } 871 }
850 //printf("pict_type:%d\n", pict_type); 872
851 873 if((pict_type&7)!=3)
852 if(pict_type!=3) 874 {
853 { 875 int i;
854 int x,y; 876 const int count= mbHeight * QPStride;
855 for(y=0; y<mbHeight; y++){ 877 for(i=0; i<(count>>2); i++){
856 for(x=0; x<mbWidth; x++){ 878 ((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x1F1F1F1F;
857 int qscale= QP_store[x + y*QPStride]; 879 }
858 if(qscale&~31) 880 for(i<<=2; i<count; i++){
859 qscale=31; 881 c->nonBQPTable[i] = QP_store[i] & 0x1F;
860 c->nonBQPTable[y*mbWidth + x]= qscale;
861 }
862 } 882 }
863 } 883 }
864 884
865 if(verbose>2) 885 if(verbose>2)
866 { 886 {