00001 #ifndef FASTJPGMACRO_H
00002 #define FASTJPGMACRO_H
00003
00004
00005 #define QUICKTIME_FASTJPG_HANDLE_RST(rst_int, rst_cnt) \
00006 { \
00007 if(((rst_int) && (rst_cnt == 0))) \
00008 { \
00009 jpeg_info->jpg_h_bbuf = 0; \
00010 jpeg_info->jpg_h_bnum = 0; \
00011 if(jpeg_info->marker == 0) jpeg_info->marker = quicktime_fastjpg_check_for_marker(jpeg_info); \
00012 if(jpeg_info->marker) \
00013 { \
00014 if(jpeg_info->marker == M_EOI) \
00015 { \
00016 jpeg_info->jpg_saw_EOI = 1; \
00017 return 1; \
00018 } \
00019 else \
00020 if(jpeg_info->marker == M_SOS) quicktime_fastjpg_readSOS(jpeg_info); \
00021 else \
00022 if(!((jpeg_info->marker >= M_RST0) && (jpeg_info->marker <= M_RST7))) \
00023 { \
00024 printf("QUICKTIME_FASTJPG_HANDLE_RST: unexp marker(%x)\n", jpeg_info->marker); \
00025 \
00026 } \
00027 jpeg_info->marker = 0; \
00028 } \
00029 jpeg_info->jpg_comps[0].dc = jpeg_info->jpg_comps[1].dc = jpeg_info->jpg_comps[2].dc = 0; \
00030 rst_cnt = rst_int; \
00031 } \
00032 else \
00033 rst_cnt--; \
00034 }
00035
00036 #define QUICKTIME_FASTJPG_TEST_MARKER \
00037 while(jpeg_info->marker) \
00038 { \
00039 if(jpeg_info->marker == M_EOI) \
00040 { \
00041 jpeg_info->jpg_saw_EOI = 1; \
00042 jpeg_info->marker = 0; \
00043 } \
00044 else \
00045 if(jpeg_info->marker == M_SOS) \
00046 { \
00047 quicktime_fastjpg_readSOS(jpeg_info); \
00048 jpeg_info->marker = 0; \
00049 } \
00050 else \
00051 if((jpeg_info->marker >= M_RST0) && (jpeg_info->marker <= M_RST7)) \
00052 { \
00053 jpeg_info->jpg_comps[0].dc = jpeg_info->jpg_comps[1].dc = jpeg_info->jpg_comps[2].dc = 0; \
00054 rst_skip = rst_count; \
00055 rst_count = jpeg_info->jpg_rst_interval; \
00056 jpeg_info->marker = 0; \
00057 jpeg_info->jpg_h_bbuf = 0; \
00058 jpeg_info->jpg_h_bnum = 0; \
00059 } \
00060 else \
00061 { \
00062 printf("QUICKTIME_FASTJPG_TEST_MARKER: unexp marker(%x)\n", jpeg_info->marker); \
00063 jpeg_info->marker = quicktime_fastjpg_skip_to_next_rst(jpeg_info); \
00064 } \
00065 }
00066
00067 #define QUICKTIME_FASTJPG_HBBUF_FILL8_1(hbbuf, hbnum) \
00068 { \
00069 (hbbuf) <<= 8; \
00070 (hbnum) += 8; \
00071 \
00072 if(jpeg_info->marker) tmp__ = 0x00; \
00073 else \
00074 { \
00075 tmp__ = *(jpeg_info->chunk++); \
00076 jpeg_info->chunk_size--; \
00077 } \
00078 \
00079 while(tmp__ == 0xff) \
00080 { \
00081 t1_ = *(jpeg_info->chunk++); \
00082 jpeg_info->chunk_size--; \
00083 if(t1_ == 0x00) break; \
00084 else if(t1_ == 0xff) continue; \
00085 else \
00086 { \
00087 jpeg_info->marker = t1_; \
00088 tmp__ = 0x00; \
00089 break; \
00090 } \
00091 } \
00092 hbbuf |= tmp__; \
00093 }
00094
00095 #define QUICKTIME_FASTJPG_HUFF_DECODE(huff_hdr, htbl, hbnum, hbbuf, result) \
00096 { \
00097 while(hbnum < 16) { QUICKTIME_FASTJPG_HBBUF_FILL8_1(hbbuf, hbnum); } \
00098 tmp_ = (hbbuf >> (hbnum - 8)) & 0xff; \
00099 hcode_ = (htbl)[tmp_]; \
00100 if(hcode_) \
00101 { \
00102 hbnum -= (hcode_ >> 8); \
00103 (result) = hcode_ & 0xff; \
00104 } \
00105 else \
00106 { \
00107 minbits_ = 9; \
00108 tmp_ = (hbbuf >> (hbnum - 16)) & 0xffff; \
00109 shift_ = 16 - minbits_; \
00110 hcode_ = tmp_ >> shift_; \
00111 \
00112 while(hcode_ > huff_hdr->maxcode[minbits_]) \
00113 { \
00114 minbits_++; \
00115 shift_--; \
00116 hcode_ = tmp_ >> shift_; \
00117 } \
00118 \
00119 if(minbits_ > 16) \
00120 { \
00121 printf("QUICKTIME_FASTJPG_HUFF_DECODE error\n"); \
00122 return 1; \
00123 } \
00124 else \
00125 { \
00126 hbnum -= minbits_; \
00127 hcode_ -= huff_hdr->mincode[minbits_]; \
00128 result = huff_hdr->vals[(huff_hdr->valptr[minbits_] + hcode_)]; \
00129 } \
00130 } \
00131 }
00132
00133
00134 #define QUICKTIME_FASTJPG_HUFF_MASK(s) ((1 << (s)) - 1)
00135
00136 #define QUICKTIME_FASTJPG_GET_BITS(n, hbnum, hbbuf, result) \
00137 { \
00138 hbnum -= n; \
00139 while(hbnum < 0) \
00140 { \
00141 QUICKTIME_FASTJPG_HBBUF_FILL8_1(hbbuf, hbnum); \
00142 } \
00143 (result) = ((hbbuf >> hbnum) & QUICKTIME_FASTJPG_HUFF_MASK(n)); \
00144 }
00145
00146 #define QUICKTIME_FASTJPG_HUFF_EXTEND(val, sz) \
00147 ((val) < (1 << ((sz) - 1)) ? (val) + (((-1) << (sz)) + 1) : (val))
00148
00149 #define QUICKTIME_MCU_ARGS \
00150 quicktime_jpeg_t *jpeg_info, \
00151 unsigned char **row_pointers, \
00152 long frame_width, \
00153 long frame_height, \
00154 unsigned long mcu_row_size, \
00155 unsigned long ip_size, \
00156 quicktime_mjpa_buffs *yuvbufs, \
00157 int interlaced
00158
00159
00160 #define QUICKTIME_MCU_VARS \
00161 unsigned long yi; \
00162 unsigned char *yptr, *uptr, *vptr; \
00163 long *YTab = jpeg_info->yuvtabs.YUV_Y_tab; \
00164 long *UBTab = jpeg_info->yuvtabs.YUV_UB_tab; \
00165 long *VRTab = jpeg_info->yuvtabs.YUV_VR_tab; \
00166 long *UGTab = jpeg_info->yuvtabs.YUV_UG_tab; \
00167 long *VGTab = jpeg_info->yuvtabs.YUV_VG_tab; \
00168 unsigned char *ybuf = yuvbufs->ybuf; \
00169 unsigned char *ubuf = yuvbufs->ubuf; \
00170 unsigned char *vbuf = yuvbufs->vbuf;
00171
00172 #define QUICKTIME_MCU111111_MID_VARS \
00173 unsigned char *ip; \
00174 unsigned char *yp, *up, *vp; \
00175 long xi, skip;
00176
00177 #define QUICKTIME_MCU111111_MID_DECL \
00178 ip = *row_pointers; \
00179 yp = yptr; \
00180 up = uptr; \
00181 vp = vptr; \
00182 xi = frame_width; \
00183 skip = 0;
00184
00185 #define QUICKTIME_MCU_INNER_VARS \
00186 unsigned long u0; \
00187 unsigned long v0; \
00188 long cr; \
00189 long cb; \
00190 long cg; \
00191 long y_long;
00192
00193
00194 #define QUICKTIME_MCU_INNER_INIT \
00195 u0 = (unsigned long)*up++; \
00196 v0 = (unsigned long)*vp++; \
00197 cr = VRTab[v0]; \
00198 cb = UBTab[u0]; \
00199 cg = UGTab[u0] + VGTab[v0];
00200
00201 #define QUICKTIME_MCU4H_INNER_TAIL(inc1, inc2) \
00202 skip++; \
00203 if(skip >= 8) \
00204 { \
00205 skip = 0; \
00206 yp += inc2; \
00207 up += inc1; \
00208 vp += inc1; \
00209 } \
00210 else \
00211 if(!(skip & 1)) \
00212 yp += inc1;
00213
00214 #define QUICKTIME_MCU_LIMITRANGE(x) \
00215 (((x) < 0) ? 0 : (((x) > 255) ? 255 : (x)));
00216
00217 #define QUICKTIME_MCU_YUV_TO_RGB(y, cr, cg, cb, ip) \
00218 y_long = (long)y; \
00219 *ip++ = (unsigned char)QUICKTIME_MCU_LIMITRANGE((y_long + cr) >> 6); \
00220 *ip++ = (unsigned char)QUICKTIME_MCU_LIMITRANGE((y_long + cg) >> 6); \
00221 *ip++ = (unsigned char)QUICKTIME_MCU_LIMITRANGE((y_long + cb) >> 6);
00222
00223
00224 #define QUICKTIME_MCU221111_MID_VARS \
00225 unsigned char *ip0, *ip1; \
00226 unsigned char *yp, *up, *vp; \
00227 long xi, skip;
00228
00229
00230 #define QUICKTIME_MCU221111_MID_DECL \
00231 if(frame_height <= 0) return 0; \
00232 if(yi == 4) yptr += 64; \
00233 ip0 = *row_pointers; \
00234 row_pointers += interlaced ? 2 : 1; \
00235 ip1 = *row_pointers; \
00236 row_pointers += interlaced ? 2 : 1; \
00237 yp = yptr; \
00238 up = uptr; \
00239 vp = vptr; \
00240 xi = frame_width; \
00241 skip = 0;
00242
00243 #define QUICKTIME_MCU2H_INNER_TAIL(inc1, inc2) \
00244 skip++; \
00245 if(skip == 4) yp += inc1; \
00246 else \
00247 if(skip >= 8) \
00248 { \
00249 skip = 0; \
00250 yp += inc2; \
00251 up += inc1; \
00252 vp += inc1; \
00253 }
00254
00255 #define QUICKTIME_MCU1H_INNER_TAIL(inc) \
00256 skip++; \
00257 if(skip >= 8) \
00258 { \
00259 skip = 0; \
00260 yp += inc; \
00261 up += inc; \
00262 vp += inc; \
00263 }
00264
00265
00266 #endif