OSDN Git Service

fix loop filter processing.
authorNoumi Akira <noumiakira@users.sourceforge.jp>
Mon, 15 Jun 2009 05:22:09 +0000 (14:22 +0900)
committerNoumi Akira <noumiakira@users.sourceforge.jp>
Mon, 15 Jun 2009 05:22:09 +0000 (14:22 +0900)
Lib/QTheora/Filter.c
Lib/QTheora/Filter.h
Lib/QTheora/FrameDecoder.c

index 4ba5795..1de572f 100644 (file)
@@ -29,29 +29,30 @@ void Filter_Setup(
        INT32 x;
        INT32 lim = l->Limit[q];
 
-       INT16* d = t->Delta + 0x100;
+       INT16* d = t->Delta;
 
        memset(t->Delta, 0, sizeof(t->Delta));
 
+       t->Limit = lim;
+
        for (x = 0; x < lim; x++) {
                INT32 i = lim + x;
-               INT32 v = lim - x;
 
-               if (-i >= -0x100) {
-                       d[-i] = -v;
+               if (127 - i >= 0) {
+                       d[127 - i] = x - lim;
                }
 
-               d[-x] = -x;
-               d[ x] =  x;
+               d[127 - x] = -x;
+               d[127 + x] =  x;
 
-               if (i < 0x200) {
-                       d[i] = v;
+               if (127 + i < 256) {
+                       d[127 + i] = lim - x;
                }
        }
 
 #if 0
        printf("FL: %d\n", lim);
-       for (x = 0; x < 256*2; x++) {
+       for (x = 0; x < 256; x++) {
                printf("%d", t->Delta[x]);
                if ((x % 16) == 15) {
                        printf("\n");
@@ -70,7 +71,7 @@ void Filter_LoopFilterH(
        UINT8*              b,
        INT32               s)
 {
-       const INT16* d = t->Delta + 0x100 / 2 + 1;
+       const INT16* d = t->Delta + 127;
 
        INT32 p0[2];
        INT32 p1[2];
@@ -87,7 +88,8 @@ void Filter_LoopFilterH(
        q1[1] = 255;
 
        for (; p < end; p += s) {
-               INT32 v = d[((p[-2] - p[1]) - 3 * (p[0] - p[-1]) + 4) >> 3];
+               INT32 x = (p[-2] - p[1]) + 3 * (p[0] - p[-1]);
+               INT32 v = d[(x + 4) >> 3];
 
                p0[0] = p[-1] + v;
                p1[0] = p[ 0] - v;
@@ -105,7 +107,7 @@ void Filter_LoopFilterV(
        UINT8*              b,
        INT32               s)
 {
-       const INT16* d = t->Delta + 0x100 / 2 + 1;
+       const INT16* d = t->Delta + 127;
 
        INT32 p0[2];
        INT32 p1[2];
@@ -122,7 +124,8 @@ void Filter_LoopFilterV(
        q1[1] = 255;
 
        for (; p < end; p++) {
-               INT32 v = d[((p[-2 * s] - p[1 * s]) - 3 * (p[0] - p[-1 * s]) + 4) >> 3];
+               INT32 x = (p[-2 * s] - p[1 * s]) + 3 * (p[0] - p[-1 * s]);
+               INT32 v = d[(x + 4) >> 3];
 
                p0[0] = p[-s] + v;
                p1[0] = p[ 0] - v;
index dd3470c..7c4d9f3 100644 (file)
@@ -21,7 +21,9 @@ BOOL Filter_Decode(
 /* LoopFilter */
 struct LoopFilter {
 
-       INT16 Delta[0x100*2];
+       INT16 Delta[0x100];
+
+       INT32 Limit;
 
 }; /* LoopFilter */
 
index 0dec7dc..1026b8a 100644 (file)
@@ -975,7 +975,9 @@ BOOL QT_FrameDecoder_DecodeFrame(
 
        Reconstruct(t);
 
-       LoopFilter(t);
+       if (t->Filter.Limit > 0) {
+               LoopFilter(t);
+       }
 
        return TRUE;
 }