00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <stdio.h>
00031
00032 #include "config.h"
00033 #include "global.h"
00034 #include "vlc.h"
00035
00036
00037 static void putDC(slice_engine_t *engine, sVLCtable *tab, int val)
00038 {
00039 int absval, size;
00040
00041 absval = (val < 0) ? -val : val;
00042
00043 if(absval > dctsatlim)
00044 {
00045
00046 sprintf(errortext,"DC value out of range (%d)\n",val);
00047 error(errortext);
00048 }
00049
00050
00051 size = 0;
00052
00053 while(absval)
00054 {
00055 absval >>= 1;
00056 size++;
00057 }
00058
00059
00060
00061
00062 slice_putbits(engine, tab[size].code, tab[size].len);
00063
00064
00065
00066 if(size != 0)
00067 {
00068 if(val >= 0)
00069 absval = val;
00070 else
00071 absval = val + (1 << size) - 1;
00072 slice_putbits(engine, absval, size);
00073 }
00074
00075 }
00076
00077
00078 void putDClum(slice_engine_t *engine, int val)
00079 {
00080 putDC(engine, DClumtab, val);
00081 }
00082
00083
00084 void putDCchrom(slice_engine_t *engine, int val)
00085 {
00086 putDC(engine, DCchromtab, val);
00087 }
00088
00089
00090 void putAC(slice_engine_t *engine, int run, int signed_level, int vlcformat)
00091 {
00092 int level, len;
00093 VLCtable *ptab;
00094
00095 level = (signed_level < 0) ? -signed_level : signed_level;
00096
00097
00098 if(run < 0 || run > 63 || level == 0 || level > dctsatlim)
00099 {
00100 sprintf(errortext,"AC value out of range (run=%d, signed_level=%d)\n",
00101 run,signed_level);
00102 error(errortext);
00103 }
00104
00105 len = 0;
00106
00107 if(run < 2 && level < 41)
00108 {
00109
00110 if(vlcformat)
00111 ptab = &dct_code_tab1a[run][level - 1];
00112 else
00113 ptab = &dct_code_tab1[run][level - 1];
00114
00115 len = ptab->len;
00116 }
00117 else
00118 if(run < 32 && level < 6)
00119 {
00120
00121 if(vlcformat)
00122 ptab = &dct_code_tab2a[run - 2][level - 1];
00123 else
00124 ptab = &dct_code_tab2[run - 2][level - 1];
00125
00126 len = ptab->len;
00127 }
00128
00129 if(len != 0)
00130 {
00131 slice_putbits(engine, ptab->code, len);
00132 slice_putbits(engine, signed_level < 0, 1);
00133 }
00134 else
00135 {
00136
00137 slice_putbits(engine, 1l, 6);
00138 slice_putbits(engine, run, 6);
00139 if(mpeg1)
00140 {
00141
00142 if (signed_level > 127)
00143 slice_putbits(engine, 0, 8);
00144 if (signed_level < -127)
00145 slice_putbits(engine, 128, 8);
00146 slice_putbits(engine, signed_level, 8);
00147 }
00148 else
00149 {
00150
00151 slice_putbits(engine, signed_level, 12);
00152 }
00153 }
00154 }
00155
00156
00157
00158 void putACfirst(slice_engine_t *engine, int run, int val)
00159 {
00160 if(run == 0 && (val == 1 || val == -1))
00161 slice_putbits(engine, 2 | (val < 0), 2);
00162 else
00163 putAC(engine, run, val, 0);
00164 }
00165
00166
00167 void putaddrinc(slice_engine_t *engine, int addrinc)
00168 {
00169 while(addrinc > 33)
00170 {
00171 slice_putbits(engine, 0x08, 11);
00172 addrinc -= 33;
00173 }
00174
00175
00176
00177 slice_putbits(engine,
00178 addrinctab[addrinc - 1].code,
00179 addrinctab[addrinc - 1].len);
00180 }
00181
00182
00183 void putmbtype(slice_engine_t *engine, int pict_type, int mb_type)
00184 {
00185 slice_putbits(engine,
00186 mbtypetab[pict_type - 1][mb_type].code,
00187 mbtypetab[pict_type - 1][mb_type].len);
00188 }
00189
00190
00191 void putmotioncode(slice_engine_t *engine, int motion_code)
00192 {
00193 int abscode;
00194
00195 abscode = (motion_code >= 0) ? motion_code : -motion_code;
00196 slice_putbits(engine,
00197 motionvectab[abscode].code,
00198 motionvectab[abscode].len);
00199 if(motion_code!=0)
00200 slice_putbits(engine,
00201 motion_code < 0,
00202 1);
00203 }
00204
00205
00206 void putdmv(slice_engine_t *engine, int dmv)
00207 {
00208 if(dmv == 0)
00209 slice_putbits(engine, 0, 1);
00210 else if (dmv>0)
00211 slice_putbits(engine, 2, 2);
00212 else
00213 slice_putbits(engine, 3, 2);
00214 }
00215
00216
00217
00218
00219
00220 void putcbp(slice_engine_t *engine, int cbp)
00221 {
00222 slice_putbits(engine, cbptable[cbp].code, cbptable[cbp].len);
00223 }