Mercurial > libavcodec.hg
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++) |