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