comparison libpostproc/postprocess.c @ 2527:ace6e273f318 libavcodec

support for negative strides
author henry
date Sun, 27 Feb 2005 08:56:26 +0000
parents 805cbcf4dc8a
children 910cd8bd981f
comparison
equal deleted inserted replaced
2526:e55fcddd8392 2527:ace6e273f318
1049 { 1049 {
1050 int mbWidth = (width+15)>>4; 1050 int mbWidth = (width+15)>>4;
1051 int mbHeight= (height+15)>>4; 1051 int mbHeight= (height+15)>>4;
1052 PPMode *mode = (PPMode*)vm; 1052 PPMode *mode = (PPMode*)vm;
1053 PPContext *c = (PPContext*)vc; 1053 PPContext *c = (PPContext*)vc;
1054 int minStride= MAX(srcStride[0], dstStride[0]); 1054 int minStride= MAX(ABS(srcStride[0]), ABS(dstStride[0]));
1055 1055 int absQPStride = ABS(QPStride);
1056 if(c->stride < minStride || c->qpStride < QPStride) 1056
1057 // c->stride and c->QPStride are always positive
1058 if(c->stride < minStride || c->qpStride < absQPStride)
1057 reallocBuffers(c, width, height, 1059 reallocBuffers(c, width, height,
1058 MAX(minStride, c->stride), 1060 MAX(minStride, c->stride),
1059 MAX(c->qpStride, QPStride)); 1061 MAX(c->qpStride, absQPStride));
1060 1062
1061 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT)) 1063 if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
1062 { 1064 {
1063 int i; 1065 int i;
1064 QP_store= c->forcedQPTable; 1066 QP_store= c->forcedQPTable;
1065 QPStride= 0; 1067 absQPStride = QPStride = 0;
1066 if(mode->lumMode & FORCE_QUANT) 1068 if(mode->lumMode & FORCE_QUANT)
1067 for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant; 1069 for(i=0; i<mbWidth; i++) QP_store[i]= mode->forcedQuant;
1068 else 1070 else
1069 for(i=0; i<mbWidth; i++) QP_store[i]= 1; 1071 for(i=0; i<mbWidth; i++) QP_store[i]= 1;
1070 } 1072 }
1071 //printf("pict_type:%d\n", pict_type); 1073 //printf("pict_type:%d\n", pict_type);
1072 1074
1073 if(pict_type & PP_PICT_TYPE_QP2){ 1075 if(pict_type & PP_PICT_TYPE_QP2){
1074 int i; 1076 int i;
1075 const int count= mbHeight * QPStride; 1077 const int count= mbHeight * absQPStride;
1076 for(i=0; i<(count>>2); i++){ 1078 for(i=0; i<(count>>2); i++){
1077 ((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F; 1079 ((uint32_t*)c->stdQPTable)[i] = (((uint32_t*)QP_store)[i]>>1) & 0x7F7F7F7F;
1078 } 1080 }
1079 for(i<<=2; i<count; i++){ 1081 for(i<<=2; i<count; i++){
1080 c->stdQPTable[i] = QP_store[i]>>1; 1082 c->stdQPTable[i] = QP_store[i]>>1;
1081 } 1083 }
1082 QP_store= c->stdQPTable; 1084 QP_store= c->stdQPTable;
1085 QPStride= absQPStride;
1083 } 1086 }
1084 1087
1085 if(0){ 1088 if(0){
1086 int x,y; 1089 int x,y;
1087 for(y=0; y<mbHeight; y++){ 1090 for(y=0; y<mbHeight; y++){
1093 printf("\n"); 1096 printf("\n");
1094 } 1097 }
1095 1098
1096 if((pict_type&7)!=3) 1099 if((pict_type&7)!=3)
1097 { 1100 {
1098 int i; 1101 if (QPStride >= 0) {
1099 const int count= mbHeight * QPStride; 1102 int i;
1100 for(i=0; i<(count>>2); i++){ 1103 const int count= mbHeight * QPStride;
1101 ((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x3F3F3F3F; 1104 for(i=0; i<(count>>2); i++){
1102 } 1105 ((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x3F3F3F3F;
1103 for(i<<=2; i<count; i++){ 1106 }
1104 c->nonBQPTable[i] = QP_store[i] & 0x3F; 1107 for(i<<=2; i<count; i++){
1108 c->nonBQPTable[i] = QP_store[i] & 0x3F;
1109 }
1110 } else {
1111 int i,j;
1112 for(i=0; i<mbHeight; i++) {
1113 for(j=0; j<absQPStride; j++) {
1114 c->nonBQPTable[i*absQPStride+j] = QP_store[i*QPStride+j] & 0x3F;
1115 }
1116 }
1105 } 1117 }
1106 } 1118 }
1107 1119
1108 if(verbose>2) 1120 if(verbose>2)
1109 { 1121 {
1123 postProcess(src[2], srcStride[2], dst[2], dstStride[2], 1135 postProcess(src[2], srcStride[2], dst[2], dstStride[2],
1124 width, height, QP_store, QPStride, 2, mode, c); 1136 width, height, QP_store, QPStride, 2, mode, c);
1125 } 1137 }
1126 else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2]) 1138 else if(srcStride[1] == dstStride[1] && srcStride[2] == dstStride[2])
1127 { 1139 {
1128 memcpy(dst[1], src[1], srcStride[1]*height); 1140 linecpy(dst[1], src[1], height, srcStride[1]);
1129 memcpy(dst[2], src[2], srcStride[2]*height); 1141 linecpy(dst[2], src[2], height, srcStride[2]);
1130 } 1142 }
1131 else 1143 else
1132 { 1144 {
1133 int y; 1145 int y;
1134 for(y=0; y<height; y++) 1146 for(y=0; y<height; y++)