00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __RTJPEG_H__
00025 #define __RTJPEG_H__
00026
00027 #include "config.h"
00028
00029
00030
00031
00032
00033 #define RTJPEG_FILE_VERSION 0
00034 #define RTJPEG_HEADER_SIZE 12
00035
00036 #ifdef WORDS_BIGENDIAN
00037 #define RTJPEG_SWAP_WORD(a) ( ((a) << 24) | \
00038 (((a) << 8) & 0x00ff0000) | \
00039 (((a) >> 8) & 0x0000ff00) | \
00040 ((unsigned long)(a) >>24) )
00041 #define RTJPEG_SWAP_HALFWORD(a) ( (((a) << 8) & 0xff00) | \
00042 (((a) >> 8) & 0x00ff) )
00043 #else
00044 #define RTJPEG_SWAP_WORD(a) (a)
00045 #define RTJPEG_SWAP_HALFWORD(a) (a)
00046 #endif
00047
00048 #ifdef HAVE_STDINT_H
00049 #include <stdint.h>
00050 #endif
00051
00052 #ifdef MMX
00053 #include "i386/mmx.h"
00054 #endif
00055
00056
00057
00058 #define RTJ_YUV420 0
00059 #define RTJ_YUV422 1
00060 #define RTJ_RGB8 2
00061
00062 class RTjpeg
00063 {
00064 public:
00065 RTjpeg();
00066 ~RTjpeg();
00067
00068 int SetQuality(int *quality);
00069 int SetFormat(int *format);
00070 int SetSize(int *w, int *h);
00071 int SetIntra(int *key, int *lm, int *cm);
00072
00073 int Compress(int8_t *sp, uint8_t **planes);
00074 void Decompress(int8_t *sp, uint8_t **planes);
00075
00076 void SetNextKey(void);
00077
00078 private:
00079 int b2s(int16_t *data, int8_t *strm, uint8_t bt8);
00080 int s2b(int16_t *data, int8_t *strm, uint8_t bt8, int32_t *qtbla);
00081
00082 void QuantInit(void);
00083 void Quant(int16_t *block, int32_t *qtbl);
00084
00085 void DctInit(void);
00086 void DctY(uint8_t *idata, int rskip);
00087
00088 void IdctInit(void);
00089 void Idct(uint8_t *odata, int16_t *data, int rskip);
00090
00091 void CalcTbls(void);
00092
00093 inline int compressYUV420(int8_t *sp, uint8_t **planes);
00094 inline int compressYUV422(int8_t *sp, uint8_t **planes);
00095 inline int compress8(int8_t *sp, uint8_t **planes);
00096
00097 int mcompressYUV420(int8_t *sp, uint8_t **planes);
00098 int mcompressYUV422(int8_t *sp, uint8_t **planes);
00099 int mcompress8(int8_t *sp, uint8_t **planes);
00100
00101 void decompressYUV422(int8_t *sp, uint8_t **planes);
00102 void decompressYUV420(int8_t *sp, uint8_t **planes);
00103 void decompress8(int8_t *sp, uint8_t **planes);
00104
00105 #ifdef MMX
00106 int bcomp(int16_t *rblock, int16_t *old, mmx_t *mask);
00107 #else
00108 int bcomp(int16_t *rblock, int16_t *old, uint16_t *mask);
00109 #endif
00110
00111 int16_t block[64] __attribute__ ((aligned (32)));
00112 int32_t ws[64*4] __attribute__ ((aligned (32)));
00113 int32_t lqt[64] __attribute__ ((aligned (32)));
00114 int32_t cqt[64] __attribute__ ((aligned (32)));
00115 int32_t liqt[64] __attribute__ ((aligned (32)));
00116 int32_t ciqt[64] __attribute__ ((aligned (32)));
00117 int32_t lb8;
00118 int32_t cb8;
00119 int32_t Ywidth;
00120 int32_t Cwidth;
00121 int32_t Ysize;
00122 int32_t Csize;
00123 int16_t *old;
00124 int16_t *old_start;
00125 int key_count;
00126
00127 int width;
00128 int height;
00129 int Q;
00130 int f;
00131 #ifdef MMX
00132 mmx_t lmask;
00133 mmx_t cmask;
00134 #else
00135 uint16_t lmask;
00136 uint16_t cmask;
00137 #endif
00138 int key_rate;
00139 };
00140
00141 typedef struct {
00142 uint32_t framesize;
00143 uint8_t headersize;
00144 uint8_t version;
00145 uint16_t width;
00146 uint16_t height;
00147 uint8_t quality;
00148 uint8_t key;
00149 uint8_t data;
00150 } RTjpeg_frameheader;
00151
00152 #endif