123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- #include "Decoder.h"
- #include "vlc_table.h"
- static int PRED_type_EP[] = {0,0,1,1,1,2,2,2,3,3};
- static int QUANT_present_EP[] = {0,1,0,0,1,0,0,1,0,1};
- static int CBP_present_EP[] = {1,1,0,1,1,0,1,1,1,1};
- static VLCtab MBTYPEtabEP[] = {
- {-1,0}, {9,8}, {8,7}, {8,7}, {7,6}, {7,6}, {7,6}, {7,6},
- {4,5}, {4,5}, {4,5}, {4,5}, {4,5}, {4,5}, {4,5}, {4,5},
- {5,5}, {5,5}, {5,5}, {5,5}, {5,5}, {5,5}, {5,5}, {5,5},
- {6,5}, {6,5}, {6,5}, {6,5}, {6,5}, {6,5}, {6,5}, {6,5},
- {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
- {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
- {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
- {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}
- };
- static int PRED_type_B[] = {0,0,1,1,1,2,2,2,3,3,3,4,4};
- static int QUANT_present_B[] = {0,1,0,0,1,0,0,1,0,0,1,0,1};
- static int CBPC_pattern_EI[] = {0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3};
- static int CBP_present_B[] = {1,1,0,1,1,0,1,1,0,1,1,1,1};
- static VLCtab MBTYPEtabB[] = {
- {-1,0}, {12,7}, {11,6}, {11,6}, {10,5}, {10,5}, {10,5}, {10,5},
- {1,4}, {1,4}, {1,4}, {1,4}, {1,4}, {1,4}, {1,4}, {1,4},
- {8,5}, {8,5}, {8,5}, {8,5}, {9,5}, {9,5}, {9,5}, {9,5},
- {4,5}, {4,5}, {4,5}, {4,5}, {7,5}, {7,5}, {7,5}, {7,5},
- {5,3}, {5,3}, {5,3}, {5,3}, {5,3}, {5,3}, {5,3}, {5,3},
- {5,3}, {5,3}, {5,3}, {5,3}, {5,3}, {5,3}, {5,3}, {5,3},
- {6,3}, {6,3}, {6,3}, {6,3}, {6,3}, {6,3}, {6,3}, {6,3},
- {6,3}, {6,3}, {6,3}, {6,3}, {6,3}, {6,3}, {6,3}, {6,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}
- };
- static int QUANT_present_EI[] = {0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1};
- static VLCtab MBTYPEtabEI[] = {
- {-1,0}, {8,8}, {5,7}, {5,7}, {6,7}, {6,7}, {7,7}, {7,7},
- {-1,0}, {9,8}, {10,8}, {11,8}, {12,8}, {13,8}, {14,8}, {15,8},
- {4,4}, {4,4}, {4,4}, {4,4}, {4,4}, {4,4}, {4,4}, {4,4},
- {4,4}, {4,4}, {4,4}, {4,4}, {4,4}, {4,4}, {4,4}, {4,4},
- {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
- {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
- {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
- {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3}, {1,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3}, {2,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3},
- {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}, {3,3}
- };
- static int PRED_type_EI[] = {1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3};
- int Decoder::getTMNMV()
- {
- int code;
- if (buffer.getbits1())
- {
- return 0;
- }
- if ((code = buffer.showbits(12))>=512)
- {
- code = (code>>8) - 2;
- buffer.flushbits(TMNMVtab0[code].len);
- return TMNMVtab0[code].val;
- }
- if (code>=128)
- {
- code = (code>>2) -32;
- buffer.flushbits(TMNMVtab1[code].len);
- return TMNMVtab1[code].val;
- }
- if ((code-=5)<0)
- {
- fault=1;
- return 0;
- }
- buffer.flushbits(TMNMVtab2[code].len);
- return TMNMVtab2[code].val;
- }
- int Decoder::getMCBPC()
- {
- int code;
- code = buffer.showbits (13);
- if (code >> 4 == 1)
- {
- /* macroblock stuffing */
- buffer.flushbits (9);
- return 255;
- }
- if (code == 0)
- {
- fault = 1;
- return 0;
- }
- if (code >= 4096)
- {
- buffer.flushbits (1);
- return 0;
- }
- if (code >= 16)
- {
- buffer.flushbits (MCBPCtab0[code >> 4].len);
- return MCBPCtab0[code >> 4].val;
- }
- else
- {
- buffer.flushbits (MCBPCtab1[code - 8].len);
- return MCBPCtab1[code - 8].val;
- }
- }
- int Decoder::getMCBPCintra()
- {
- int code;
- code = buffer.showbits(9);
- if (code == 1) {
- /* macroblock stuffing */
- buffer.flushbits(9);
- return 255;
- }
- if (code < 8) {
- fault = 1;
- return 0;
- }
- code >>= 3;
-
- if (code>=32)
- {
- buffer.flushbits(1);
- return 3;
- }
- buffer.flushbits(MCBPCtabintra[code].len);
- return MCBPCtabintra[code].val;
- }
- int Decoder::getCBPY()
- {
- int code;
- code = buffer.showbits(6);
- if (code < 2) {
- fault = 1;
- return -1;
- }
-
- if (code>=48)
- {
- buffer.flushbits(2);
- return 0;
- }
- buffer.flushbits(CBPYtab[code].len);
- return CBPYtab[code].val;
- }
|