From c66d70eb818cbc80ddae1dd5f35352d048ce5a5c Mon Sep 17 00:00:00 2001 From: kramm Date: Tue, 8 Apr 2003 19:50:42 +0000 Subject: [PATCH] more verbose error reporting, tables moved into h263tables.c. --- lib/h.263/video.c | 345 ++++------------------------------------------------- 1 file changed, 25 insertions(+), 320 deletions(-) diff --git a/lib/h.263/video.c b/lib/h.263/video.c index 2c59d04..2376017 100644 --- a/lib/h.263/video.c +++ b/lib/h.263/video.c @@ -12,10 +12,12 @@ #include #include "../lib/rfxswf.h" #include "../lib/args.h" +#include "h263tables.c" static char * filename = 0; static char * indent = " "; int hex = 0; +int debug = 0; struct options_t options[] = { @@ -39,6 +41,10 @@ int args_callback_option(char*name,char*val) hex = 1; return 0; } + else if(name[0]=='v') { + debug = 1; + return 0; + } else { printf("Unknown option: -%s\n", name); exit(1); @@ -55,6 +61,7 @@ void args_callback_usage(char*name) printf("Usage: %s [-at] file.swf\n", name); printf("\t-h , --help\t\t Print help and exit\n"); printf("\t-d , --hex\t\t Print hex output of tag data, too\n"); + printf("\t-v , --verbose\t\t Print debugging information\n"); printf("\t-V , --version\t\t Print program version and exit\n"); } int args_callback_command(char*name,char*val) @@ -67,7 +74,7 @@ int args_callback_command(char*name,char*val) return 0; } -#define DEBUG if(0) +#define DEBUG if(debug) void handleVideoStream(TAG*tag, char*prefix) { @@ -86,316 +93,6 @@ void handleVideoStream(TAG*tag, char*prefix) printf(" codec 0x%02x)", codec); } -struct huffcode { - char*code; - int len; - int index; -}; - -#define MCBPC_INTRA_STUFFING 8 - -struct huffcode mcbpc_intra[] = { -{"1",1, 0}, /*cbpc-00 mb type 3*/ -{"001",3, 1}, /*cbpc-01 mb type 3*/ -{"010",3, 2}, /*cbpc-10 mb type 3*/ -{"011",3, 3}, /*cbpc-11 mb type 3*/ -{"0001",4, 4}, /*cbpc-00 mb type 4*/ -{"000001",6, 5}, /*cbpc-01 mb type 4*/ -{"000010",6, 6}, /*cbpc-10 mb type 4*/ -{"000011",6, 7}, /*cbpc-11 mb type 4*/ -{"000000001",9, 8}, /* stuffing */ -{0,0,0}, -}; - -struct mcbpc_intra_params -{ - int index; - int mb_type; - int cbpc; -} mcbpc_intra_params[] = -{{0, 3, 0}, //00 - {1, 3, 1}, //01 - {2, 3, 2}, //10 - {3, 3, 3}, //11 - {4, 4, 0}, //00 - {5, 4, 1}, //01 - {6, 4, 2}, //10 - {7, 4, 3}, //11 - {8 -1, -1} -}; - -#define MCBPC_INTER_STUFFING 20 - -struct huffcode mcbpc_inter[] = { -{"1", 1, 0}, -{"0011", 4, 1}, -{"0010", 4 ,2}, -{"000101", 6, 3}, -{"011", 3, 4}, -{"0000111", 7, 5}, -{"0000110", 7, 6}, -{"000000101", 9, 7}, -{"010", 3, 8}, -{"0000101", 7, 9}, -{"0000100", 7, 10}, -{"00000101", 8, 11}, -{"00011", 5, 12}, -{"00000100", 8, 13}, -{"00000011", 8, 14}, -{"0000011", 7, 15}, -{"000100", 6, 16}, -{"000000100", 9, 17}, -{"000000011", 9, 18}, -{"000000010", 9, 19}, -{"000000001", 9, 20}, /*stuffing*/ - -/* h.263+ only -{"00000000010", 11, 21}, -{"0000000001100", 13, 22}, -{"0000000001110", 13, 23}, -{"0000000001111", 13, 24}, -*/ -{0,0,0} -}; - -struct mcbpc_inter_params -{ - int index; - int mb_type; - int cbpc; -} mcbpc_inter_params[] = -{{0, 0, 0}, {1, 0, 1}, {2, 0, 2}, {3, 0, 3}, {4, 1, 0}, - {5, 1, 1}, {6, 1, 2}, {7, 1, 3}, {8, 2, 0}, {9, 2, 1}, - {10, 2, 2}, {11, 2, 3}, {12, 3, 0}, {13, 3, 1}, {14, 3, 2}, - {15, 3, 3}, {16, 4, 0}, {17, 4, 1}, {18, 4, 2}, {19, 4, 3}, - {20, -1, -1}, //stuffing - //{21, 5, 0}, {22, 5, 1}, {23, 5, 2}, {24, 5, 3}, //h.263+ only -}; - -struct huffcode cbpy[] = { -{"0011", 4, 0}, -{"00101", 5, 1}, -{"00100", 5, 2}, -{"1001", 4, 3}, -{"00011", 5, 4}, -{"0111", 4, 5}, -{"000010", 6, 6}, -{"1011", 4, 7}, -{"00010", 5, 8}, -{"000011", 6, 9}, -{"0101", 4, 10}, -{"1010", 4, 11}, -{"0100", 4, 12}, -{"1000", 4, 13}, -{"0110", 4, 14}, -{"11", 2, 15}, -{0,0,0} -}; - -struct huffcode mvd[] = -{ -{"0000000000101", 13, 0}, -{"0000000000111", 13, 1}, -{"000000000101", 12, 2}, -{"000000000111", 12, 3}, -{"000000001001", 12, 4}, -{"000000001011", 12, 5}, -{"000000001101", 12, 6}, -{"000000001111", 12, 7}, -{"00000001001", 11, 8}, -{"00000001011", 11, 9}, -{"00000001101", 11, 10}, -{"00000001111", 11, 11}, -{"00000010001", 11, 12}, -{"00000010011", 11, 13}, -{"00000010101", 11, 14}, -{"00000010111", 11, 15}, -{"00000011001", 11, 16}, -{"00000011011", 11, 17}, -{"00000011101", 11, 18}, -{"00000011111", 11, 19}, -{"00000100001", 11, 20}, -{"00000100011", 11, 21}, -{"0000010011", 10, 22}, -{"0000010101", 10, 23}, -{"0000010111", 10, 24}, -{"00000111", 8, 25}, -{"00001001", 8, 26}, -{"00001011", 8, 27}, -{"0000111", 7, 28}, -{"00011", 5, 29}, -{"0011", 4, 30}, -{"011", 3, 31}, -{"1", 1, 32}, -{"010", 3, 33}, -{"0010", 4, 34}, -{"00010", 5, 35}, -{"0000110", 7, 36}, -{"00001010", 8, 37}, -{"00001000", 8, 38}, -{"00000110", 8, 39}, -{"0000010110", 10, 40}, -{"0000010100", 10, 41}, -{"0000010010", 10, 42}, -{"00000100010", 11, 43}, -{"00000100000", 11, 44}, -{"00000011110", 11, 45}, -{"00000011100", 11, 46}, -{"00000011010", 11, 47}, -{"00000011000", 11, 48}, -{"00000010110", 11, 49}, -{"00000010100", 11, 50}, -{"00000010010", 11, 51}, -{"00000010000", 11, 52}, -{"00000001110", 11, 53}, -{"00000001100", 11, 54}, -{"00000001010", 11, 55}, -{"00000001000", 11, 56}, -{"000000001110", 12, 57}, -{"000000001100", 12, 58}, -{"000000001010", 12, 59}, -{"000000001000", 12, 60}, -{"000000000110", 12, 61}, -{"000000000100", 12, 62}, -{"0000000000110", 13, 63}, -{0,0,0}}; - -struct huffcode rle[] = -{ -{"10", 2, 0}, -{"1111", 4, 1}, -{"010101", 6, 2}, -{"0010111", 7, 3}, -{"00011111", 8, 4}, -{"000100101", 9, 5}, -{"000100100", 9, 6}, -{"0000100001", 10, 7}, -{"0000100000", 10, 8}, -{"00000000111", 11, 9}, -{"00000000110", 11, 10}, -{"00000100000", 11, 11}, -{"110", 3, 12}, -{"010100", 6, 13}, -{"00011110", 8, 14}, -{"0000001111", 10, 15}, -{"00000100001", 11, 16}, -{"000001010000", 12, 17}, -{"1110", 4, 18}, -{"00011101", 8, 19}, -{"0000001110", 10, 20}, -{"000001010001", 12, 21}, -{"01101", 5, 22}, -{"000100011", 9, 23}, -{"0000001101", 10, 24}, -{"01100", 5, 25}, -{"000100010", 9, 26}, -{"000001010010", 12, 27}, -{"01011", 5, 28}, -{"0000001100", 10, 29}, -{"000001010011", 12, 30}, -{"010011", 6, 31}, -{"0000001011", 10, 32}, -{"000001010100", 12, 33}, -{"010010", 6, 34}, -{"0000001010", 10, 35}, -{"010001", 6, 36}, -{"0000001001", 10, 37}, -{"010000", 6, 38}, -{"0000001000", 10, 39}, -{"0010110", 7, 40}, -{"000001010101", 12, 41}, -{"0010101", 7, 42}, -{"0010100", 7, 43}, -{"00011100", 8, 44}, -{"00011011", 8, 45}, -{"000100001", 9, 46}, -{"000100000", 9, 47}, -{"000011111", 9, 48}, -{"000011110", 9, 49}, -{"000011101", 9, 50}, -{"000011100", 9, 51}, -{"000011011", 9, 52}, -{"000011010", 9, 53}, -{"00000100010", 11, 54}, -{"00000100011", 11, 55}, -{"000001010110", 12, 56}, -{"000001010111", 12, 57}, -{"0111", 4, 58}, -{"000011001", 9, 59}, -{"00000000101", 11, 60}, -{"001111", 6, 61}, -{"00000000100", 11, 62}, -{"001110", 6, 63}, -{"001101", 6, 64}, -{"001100", 6, 65}, -{"0010011", 7, 66}, -{"0010010", 7, 67}, -{"0010001", 7, 68}, -{"0010000", 7, 69}, -{"00011010", 8, 70}, -{"00011001", 8, 71}, -{"00011000", 8, 72}, -{"00010111", 8, 73}, -{"00010110", 8, 74}, -{"00010101", 8, 75}, -{"00010100", 8, 76}, -{"00010011", 8, 77}, -{"000011000", 9, 78}, -{"000010111", 9, 79}, -{"000010110", 9, 80}, -{"000010101", 9, 81}, -{"000010100", 9, 82}, -{"000010011", 9, 83}, -{"000010010", 9, 84}, -{"000010001", 9, 85}, -{"0000000111", 10, 86}, -{"0000000110", 10, 87}, -{"0000000101", 10, 88}, -{"0000000100", 10, 89}, -{"00000100100", 11, 90}, -{"00000100101", 11, 91}, -{"00000100110", 11, 92}, -{"00000100111", 11, 93}, -{"000001011000", 12, 94}, -{"000001011001", 12, 95}, -{"000001011010", 12, 96}, -{"000001011011", 12, 97}, -{"000001011100", 12, 98}, -{"000001011101", 12, 99}, -{"000001011110", 12, 100}, -{"000001011111", 12, 101}, -{"0000011", 7, 102}, /*ESCAPE*/ -{0,0,0} -}; - -#define RLE_ESCAPE 102 - -struct rle_params -{ - int index; - int last; - int run; - int level; -} rle_params[] = -{{0,0,0,1}, {1,0,0,2}, {2,0,0,3}, {3,0,0,4}, {4,0,0,5}, {5,0,0,6}, {6,0,0,7}, -{7,0,0,8}, {8,0,0,9}, {9,0,0,10}, {10,0,0,11}, {11,0,0,12}, {12,0,1,1}, {13,0,1,2}, -{14,0,1,3}, {15,0,1,4}, {16,0,1,5}, {17,0,1,6}, {18,0,2,1}, {19,0,2,2}, {20,0,2,3}, {21,0,2,4}, -{22,0,3,1}, {23,0,3,2}, {24,0,3,3}, {25,0,4,1}, {26,0,4,2}, {27,0,4,3}, {28,0,5,1}, -{29,0,5,2}, {30,0,5,3}, {31,0,6,1}, {32,0,6,2}, {33,0,6,3}, -{34,0,7,1}, {35,0,7,2}, {36,0,8,1}, {37,0,8,2}, {38,0,9,1}, {39,0,9,2}, {40,0,10,1}, -{41,0,10,2}, {42,0,11,1}, {43,0,12,1}, {44,0,13,1}, {45,0,14,1}, {46,0,15,1}, -{47,0,16,1}, {48,0,17,1}, {49,0,18,1}, {50,0,19,1}, {51,0,20,1}, {52,0,21,1}, -{53,0,22,1}, {54,0,23,1}, {55,0,24,1}, {56,0,25,1}, {57,0,26,1}, {58,1,0,1}, -{59,1,0,2}, {60,1,0,3}, {61,1,1,1}, {62,1,1,2}, {63,1,2,1}, {64,1,3,1}, {65, 1,4,1}, -{66,1,5,1}, {67,1,6,1}, {68,1,7,1}, {69,1,8,1}, {70,1,9,1}, {71,1,10,1}, -{72,1,11,1}, {73,1,12,1}, {74,1,13,1}, {75,1,14,1}, {76,1,15,1}, {77,1,16,1}, -{78,1,17,1}, {79,1,18,1}, {80,1,19,1}, {81,1,20,1}, {82,1,21,1}, {83,1,22,1}, -{84,1,23,1}, {85,1,24,1}, {86,1,25,1}, {87,1,26,1}, {88,1,27,1}, {89,1,28,1}, -{90,1,29,1}, {91,1,30,1}, {92,1,31,1}, {93,1,32,1}, {94,1,33,1}, {95,1,34,1}, -{96,1,35,1}, {97,1,36,1}, {98,1,37,1}, {99,1,38,1}, {100,1,39,1}, {101,1,40,1}, -{102,-1, -1, -1} -}; - int checkhufftable(struct huffcode*code, char*name) { int t=0; @@ -480,7 +177,7 @@ int gethuffvalue(TAG*tag, struct huffcode*code) }*/ } -void getCoefficient(TAG*tag, int t, int has_dc, int has_tcoef) +void get_DC_TCOEF(TAG*tag, int t, int has_dc, int has_tcoef) { int dc; int ac;// = swf_GetBits(); @@ -535,7 +232,7 @@ void getCoefficient(TAG*tag, int t, int has_dc, int has_tcoef) if(last) { DEBUG printf("] pos: %d", pos); if(pos>64) { - printf("\n"); + printf("\nerror:bad pos (%d)\n", pos); exit(1); } return; @@ -570,6 +267,7 @@ void decode_block(TAG*tag, int pictype) /* TODO: according to the flash spec, this field is always present */ { int cod = swf_GetBits(tag, 1); + DEBUG printf("cod=%d\n",cod); if(cod) { printf("."); return; @@ -581,17 +279,23 @@ void decode_block(TAG*tag, int pictype) if(pictype == TYPE_INTRA) { /* I-frame */ type = gethuffvalue(tag, mcbpc_intra); + DEBUG printf("mcbpc=%d\n",type); mb_type = mcbpc_intra_params[type].mb_type; cbpc = mcbpc_intra_params[type].cbpc; - if(type == MCBPC_INTRA_STUFFING) + if(type == MCBPC_INTRA_STUFFING) { + printf("stuffing not supported yet!\n"); exit(1); //TODO: goto COD + } } else if(pictype == 1) { /* P-frame */ type = gethuffvalue(tag, mcbpc_inter); + DEBUG printf("mcbpc=%d\n",type); mb_type = mcbpc_inter_params[type].mb_type; cbpc = mcbpc_inter_params[type].cbpc; - if(type == MCBPC_INTER_STUFFING) + if(type == MCBPC_INTER_STUFFING) { + printf("stuffing not supported yet!(2)\n"); exit(1); //TODO: goto COD + } } if(mb_type == 3 || mb_type == 4) @@ -642,14 +346,14 @@ void decode_block(TAG*tag, int pictype) int has_intradc = intrablock; int has_tcoef = cbpy_value & (8>>t); DEBUG printf("luminance%d ", t); - getCoefficient(tag, t, has_intradc, has_tcoef); /*luminance - affected by cbpy*/ + 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); - getCoefficient(tag, t, has_intradc, has_tcoef); /*chrominance - affected by mcbc*/ + get_DC_TCOEF(tag, t, has_intradc, has_tcoef); /*chrominance - affected by mcbc*/ DEBUG printf("\n"); } } @@ -684,6 +388,7 @@ void handleVideoFrame(TAG*tag, char*prefix) if(version >= 1) { /* version 1 has some different transform coefficient coding which we can't handle yet */ + printf("spark version %d not supported yet\n", version); exit(1); } reference = swf_GetBits(tag, 8); @@ -704,7 +409,7 @@ void handleVideoFrame(TAG*tag, char*prefix) pictype = swf_GetBits(tag, 2); if(pictype==3) { - printf("pictype: %d\n", pictype); + printf("error: unknown pictype: %d\n", pictype); exit(1); } if(pictype==2) { @@ -736,8 +441,8 @@ void handleVideoFrame(TAG*tag, char*prefix) /*if(pictype == TYPE_INTER) return;*/ - /*if(pictype == TYPE_INTRA) - return;*/ + if(pictype == TYPE_INTRA) + return; /*tagnr++; if(tagnr!=2) -- 1.7.10.4