more horizontal refactoring
[swftools.git] / lib / h.263 / video.c
index 3a04be1..31391db 100644 (file)
@@ -3,7 +3,21 @@
 
    Part of the swftools package.
    
-   Copyright (c) 2003 Matthias Kramm <kramm@quiss.org> */
+   Copyright (c) 2003 Matthias Kramm <kramm@quiss.org>
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
 #include "../../config.h"
 #include <unistd.h>
@@ -256,6 +270,10 @@ void get_DC_TCOEF(TAG*tag, int t, int has_dc, int has_tcoef)
     int ac;// = swf_GetBits();
     int index;
     int pos = 0;
+    int line[64];
+    int show_rle_code=0;
+    memset(line, 0, sizeof(line));
+
     //printf("DC:%d\n", dc);
     if(has_dc) {
        dc = swf_GetBits(tag, 8);
@@ -263,12 +281,13 @@ void get_DC_TCOEF(TAG*tag, int t, int has_dc, int has_tcoef)
            printf("error: dc=%d\n", dc);
            exit(1);
        }
-       DEBUG printf(" %d ", dc);
+       DEBUG if(show_rle_code) printf(" %d ", dc);
+       line[pos] = dc;
        pos++;
     }
 
     if(has_tcoef) {
-       DEBUG printf("[");
+       DEBUG if(show_rle_code) printf("[");
        while(1) {
            int last;
            int run;
@@ -282,10 +301,11 @@ void get_DC_TCOEF(TAG*tag, int t, int has_dc, int has_tcoef)
                last = swf_GetBits(tag, 1);
                run = swf_GetBits(tag, 6);
                level = swf_GetBits(tag, 8);
-               if(run)
-                   DEBUG printf("(%d) E%d", run, level);
-               else
-                   DEBUG printf("E");
+               if(run) {
+                   DEBUG if(show_rle_code) printf(" (%d) E%d", run, level);
+               } else {
+                   DEBUG if(show_rle_code) printf("E");
+               }
                if(level == 0 || level == 128) {
                    printf("error: level=%d\n", level);
                    exit(1);
@@ -293,25 +313,40 @@ void get_DC_TCOEF(TAG*tag, int t, int has_dc, int has_tcoef)
                level = (int)((signed char)level);
            } else {
                int sign = swf_GetBits(tag, 1);
-               if(sign)
+               if(sign) {
                    level = -level;
-               if(run)
-                   DEBUG printf("(%d) %s%d", run, level>0?"+":"",level);
-               else
-                   DEBUG printf("%s%d", level>0?"+":"",level);
+               }
+               if(run) {
+                   DEBUG if(show_rle_code) printf(" (%d) %s%d", run, level>0?"+":"",level);
+               } else {
+                   DEBUG if(show_rle_code) printf(" %s%d", level>0?"+":"",level);
+               }
            }
-           pos += run+1;
+           pos += run;
+           if(pos>=64) {
+               printf("\nerror:bad pos: %d\n", pos);
+               exit(1);
+           }
+           line[pos++] = level;
            //DEBUG printf("run:%d level:%d\n", run, level);
            if(last) {
-               DEBUG printf("] pos: %d", pos);
+               DEBUG if(show_rle_code) printf("] pos: %d", pos);
                if(pos>64) {
                    printf("\nerror:bad pos (%d)\n", pos);
                    exit(1);
                }
-               return;
+               break;
            }
        }
     }
+    DEBUG if(show_rle_code) printf("\n");
+
+    DEBUG printf("[");
+    for(t=0;t<pos;t++) {
+       DEBUG printf("%d", line[t]);
+       DEBUG if(t<pos-1) printf(" ");
+    }
+    DEBUG printf("]\n");
 }
            
 int readMVD(TAG*tag)
@@ -409,8 +444,9 @@ void decode_block(TAG*tag, int pictype)
        int x,y;
        x = readMVD(tag); //horizontal
        y = readMVD(tag); //vertical
-       if(x==32 && y==32)
-           printf("\b0");
+       /*if(x==32 && y==32)
+           printf("\b0"); // prediction was 100% match
+        */
     }
     if(has_mvd[mb_type]&2) {
        /* only in advanced prediction mode */
@@ -427,14 +463,12 @@ void decode_block(TAG*tag, int pictype)
        int has_tcoef = cbpy_value & (8>>t);
        DEBUG printf("luminance%d ", t);
        get_DC_TCOEF(tag, t, has_intradc, has_tcoef); /*luminance - affected by cbpy*/
-       DEBUG printf("\n");
     }
     for(t=0;t<2;t++) {
        int has_intradc = intrablock;
        int has_tcoef = cbpc & (2>>t);
        DEBUG printf("chrominance%d ", t); 
        get_DC_TCOEF(tag, t, has_intradc, has_tcoef); /*chrominance - affected by mcbc*/
-       DEBUG printf("\n");
     }
 }