summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/libpostproc/postprocess.c
diff options
context:
space:
mode:
authorMike Melanson <mike@multimedia.cx>2003-06-19 00:47:19 +0000
committerMike Melanson <mike@multimedia.cx>2003-06-19 00:47:19 +0000
commit6f3b07176ae833429586bf9d27c8477db9efa7a7 (patch)
treeacba2593ed69e5a2aaa96aea9215948459d8ea8f /src/libffmpeg/libavcodec/libpostproc/postprocess.c
parentc52df867db2f177dcabbbbe2b93517c9bf4f8ae1 (diff)
downloadxine-lib-6f3b07176ae833429586bf9d27c8477db9efa7a7.tar.gz
xine-lib-6f3b07176ae833429586bf9d27c8477db9efa7a7.tar.bz2
maintenance ffmpeg sync: import and activate decoders for 4X and
RealAudio codecs; import VP3 decoder but leave de-activated; fixes for SVQ3 bugs; more conditional compilation for encoders CVS patchset: 5067 CVS date: 2003/06/19 00:47:19
Diffstat (limited to 'src/libffmpeg/libavcodec/libpostproc/postprocess.c')
-rw-r--r--src/libffmpeg/libavcodec/libpostproc/postprocess.c66
1 files changed, 43 insertions, 23 deletions
diff --git a/src/libffmpeg/libavcodec/libpostproc/postprocess.c b/src/libffmpeg/libavcodec/libpostproc/postprocess.c
index ce61ffd39..8473882bb 100644
--- a/src/libffmpeg/libavcodec/libpostproc/postprocess.c
+++ b/src/libffmpeg/libavcodec/libpostproc/postprocess.c
@@ -169,8 +169,9 @@ static inline int isHorizDC(uint8_t src[], int stride, PPContext *c)
{
int numEq= 0;
int y;
- const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1;
+ const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
const int dcThreshold= dcOffset*2 + 1;
+
for(y=0; y<BLOCK_SIZE; y++)
{
if(((unsigned)(src[0] - src[1] + dcOffset)) < dcThreshold) numEq++;
@@ -191,8 +192,9 @@ static inline int isHorizDC(uint8_t src[], int stride, PPContext *c)
static inline int isVertDC_C(uint8_t src[], int stride, PPContext *c){
int numEq= 0;
int y;
- const int dcOffset= ((c->QP*c->ppMode.baseDcDiff)>>8) + 1;
+ const int dcOffset= ((c->nonBQP*c->ppMode.baseDcDiff)>>8) + 1;
const int dcThreshold= dcOffset*2 + 1;
+
src+= stride*4; // src points to begin of the 8x8 Block
for(y=0; y<BLOCK_SIZE-1; y++)
{
@@ -483,8 +485,8 @@ char *pp_help=
" c chrom chrominance filtring enabled\n"
" y nochrom chrominance filtring disabled\n"
"hb hdeblock (2 Threshold) horizontal deblocking filter\n"
-" 1. difference factor: default=64, higher -> more deblocking\n"
-" 2. flatness threshold: default=40, lower -> more deblocking\n"
+" 1. difference factor: default=32, higher -> more deblocking\n"
+" 2. flatness threshold: default=39, lower -> more deblocking\n"
" the h & v deblocking filters share these\n"
" so u cant set different thresholds for h / v\n"
"vb vdeblock (2 Threshold) vertical deblocking filter\n"
@@ -523,8 +525,8 @@ pp_mode_t *pp_get_mode_by_name_and_quality(char *name, int quality)
ppMode->maxTmpNoise[2]= 3000;
ppMode->maxAllowedY= 234;
ppMode->minAllowedY= 16;
- ppMode->baseDcDiff= 256/4;
- ppMode->flatnessThreshold= 56-16;
+ ppMode->baseDcDiff= 256/8;
+ ppMode->flatnessThreshold= 56-16-1;
ppMode->maxClippedThreshold= 0.01;
ppMode->error=0;
@@ -705,12 +707,13 @@ static void reallocAlign(void **p, int alignment, int size){
memset(*p, 0, size);
}
-static void reallocBuffers(PPContext *c, int width, int height, int stride){
+static void reallocBuffers(PPContext *c, int width, int height, int stride, int qpStride){
int mbWidth = (width+15)>>4;
int mbHeight= (height+15)>>4;
int i;
c->stride= stride;
+ c->qpStride= qpStride;
reallocAlign((void **)&c->tempDst, 8, stride*24);
reallocAlign((void **)&c->tempSrc, 8, stride*24);
@@ -727,11 +730,12 @@ static void reallocBuffers(PPContext *c, int width, int height, int stride){
}
reallocAlign((void **)&c->deintTemp, 8, 2*width+32);
- reallocAlign((void **)&c->nonBQPTable, 8, mbWidth*mbHeight*sizeof(QP_STORE_T));
+ reallocAlign((void **)&c->nonBQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
+ reallocAlign((void **)&c->stdQPTable, 8, qpStride*mbHeight*sizeof(QP_STORE_T));
reallocAlign((void **)&c->forcedQPTable, 8, mbWidth*sizeof(QP_STORE_T));
}
-static void global_init(){
+static void global_init(void){
int i;
memset(clip_table, 0, 256);
for(i=256; i<512; i++)
@@ -742,6 +746,7 @@ static void global_init(){
pp_context_t *pp_get_context(int width, int height, int cpuCaps){
PPContext *c= memalign(32, sizeof(PPContext));
int stride= (width+15)&(~15); //assumed / will realloc if needed
+ int qpStride= (width+15)/16 + 2; //assumed / will realloc if needed
global_init();
@@ -755,7 +760,7 @@ pp_context_t *pp_get_context(int width, int height, int cpuCaps){
c->vChromaSubSample= 1;
}
- reallocBuffers(c, width, height, stride);
+ reallocBuffers(c, width, height, stride, qpStride);
c->frameNum=-1;
@@ -774,6 +779,7 @@ void pp_free_context(void *vc){
free(c->tempDst);
free(c->tempSrc);
free(c->deintTemp);
+ free(c->stdQPTable);
free(c->nonBQPTable);
free(c->forcedQPTable);
@@ -793,9 +799,11 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
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(c->stride < minStride || c->qpStride < QPStride)
+ reallocBuffers(c, width, height,
+ MAX(minStride, c->stride),
+ MAX(c->qpStride, QPStride));
if(QP_store==NULL || (mode->lumMode & FORCE_QUANT))
{
@@ -807,6 +815,20 @@ void pp_postprocess(uint8_t * src[3], int srcStride[3],
else
for(i=0; i<mbWidth; i++) QP_store[i]= 1;
}
+//printf("pict_type:%d\n", pict_type);
+
+ if(pict_type & PP_PICT_TYPE_QP2){
+ int i;
+ const int count= mbHeight * QPStride;
+ 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;
+ }
+ QP_store= c->stdQPTable;
+ }
+
if(0){
int x,y;
for(y=0; y<mbHeight; y++){
@@ -817,18 +839,16 @@ for(y=0; y<mbHeight; y++){
}
printf("\n");
}
-//printf("pict_type:%d\n", pict_type);
- if(pict_type!=3)
+ if((pict_type&7)!=3)
{
- int x,y;
- for(y=0; y<mbHeight; y++){
- for(x=0; x<mbWidth; x++){
- int qscale= QP_store[x + y*QPStride];
- if(qscale&~31)
- qscale=31;
- c->nonBQPTable[y*mbWidth + x]= qscale;
- }
+ int i;
+ const int count= mbHeight * QPStride;
+ for(i=0; i<(count>>2); i++){
+ ((uint32_t*)c->nonBQPTable)[i] = ((uint32_t*)QP_store)[i] & 0x1F1F1F1F;
+ }
+ for(i<<=2; i<count; i++){
+ c->nonBQPTable[i] = QP_store[i] & 0x1F;
}
}