blob: 90fa7e4742ed6d3ae8f2dda7988962b9a3ec9a3d
1 | #ifndef CTVSCREENCAPTURE_H__ |
2 | #define CTVSCREENCAPTURE_H__ |
3 | |
4 | #define VIDEOCAPDEV "/dev/amvideocap0" |
5 | |
6 | #define AMVIDEOCAP_IOC_MAGIC 'V' |
7 | #include <linux/videodev2.h> |
8 | #include <binder/MemoryHeapBase.h> |
9 | #include <binder/MemoryBase.h> |
10 | #include "CTvLog.h" |
11 | #include "CTvEv.h" |
12 | |
13 | #define CAP_FLAG_AT_CURRENT 0 |
14 | #define CAP_FLAG_AT_TIME_WINDOW 1 |
15 | #define CAP_FLAG_AT_END 2 |
16 | |
17 | |
18 | #define FALSE 0 |
19 | #define SUCCEED 0 |
20 | #define FAILED -1 |
21 | |
22 | using namespace android; |
23 | |
24 | struct buffer { |
25 | void *start; |
26 | size_t length; |
27 | }; |
28 | |
29 | |
30 | struct camera { |
31 | char *device_name; |
32 | int fd; |
33 | int width; |
34 | int height; |
35 | int display_depth; |
36 | int image_size; |
37 | int frame_number; //fps |
38 | int bitrate ; // bitrate |
39 | struct v4l2_capability v4l2_cap; |
40 | struct v4l2_cropcap v4l2_cropcap; |
41 | struct v4l2_format v4l2_fmt; |
42 | struct v4l2_crop crop; |
43 | struct buffer *buffers; |
44 | }; |
45 | |
46 | /* |
47 | format see linux/ge2d/ge2d.h |
48 | like: |
49 | GE2D_FORMAT_S24_RGB |
50 | */ |
51 | #define ENDIAN_SHIFT 24 |
52 | #define LITTLE_ENDIAN (1 << ENDIAN_SHIFT) |
53 | #define FMT_S24_RGB (LITTLE_ENDIAN|0x00200) /* 10_00_0_00_0_00 */ |
54 | #define FMT_S16_RGB (LITTLE_ENDIAN|0x00100) /* 01_00_0_00_0_00 */ |
55 | #define FMT_S32_RGBA (LITTLE_ENDIAN|0x00300) /* 11_00_0_00_0_00 */ |
56 | |
57 | #define COLOR_MAP_SHIFT 20 |
58 | #define COLOR_MAP_MASK (0xf << COLOR_MAP_SHIFT) |
59 | /* 16 bit */ |
60 | #define COLOR_MAP_RGB565 (5 << COLOR_MAP_SHIFT) |
61 | /* 24 bit */ |
62 | #define COLOR_MAP_RGB888 (0 << COLOR_MAP_SHIFT) |
63 | #define COLOR_MAP_BGR888 (5 << COLOR_MAP_SHIFT) |
64 | /* 32 bit */ |
65 | #define COLOR_MAP_RGBA8888 (0 << COLOR_MAP_SHIFT) |
66 | #define COLOR_MAP_ARGB8888 (1 << COLOR_MAP_SHIFT) |
67 | #define COLOR_MAP_ABGR8888 (2 << COLOR_MAP_SHIFT) |
68 | #define COLOR_MAP_BGRA8888 (3 << COLOR_MAP_SHIFT) |
69 | |
70 | /*16 bit*/ |
71 | #define FORMAT_S16_RGB_565 (FMT_S16_RGB | COLOR_MAP_RGB565) |
72 | /*24 bit*/ |
73 | #define FORMAT_S24_BGR (FMT_S24_RGB | COLOR_MAP_BGR888) |
74 | #define FORMAT_S24_RGB (FMT_S24_RGB | COLOR_MAP_RGB888) |
75 | /*32 bit*/ |
76 | #define FORMAT_S32_ARGB (FMT_S32_RGBA | COLOR_MAP_ARGB8888) |
77 | #define FORMAT_S32_ABGR (FMT_S32_RGBA | COLOR_MAP_ABGR8888) |
78 | #define FORMAT_S32_BGRA (FMT_S32_RGBA | COLOR_MAP_BGRA8888) |
79 | #define FORMAT_S32_RGBA (FMT_S32_RGBA | COLOR_MAP_RGBA8888) |
80 | |
81 | #define AMVIDEOCAP_IOW_SET_WANTFRAME_FORMAT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x01, int) |
82 | #define AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH _IOW(AMVIDEOCAP_IOC_MAGIC, 0x02, int) |
83 | #define AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x03, int) |
84 | #define AMVIDEOCAP_IOW_SET_WANTFRAME_TIMESTAMP_MS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x04, u64) |
85 | #define AMVIDEOCAP_IOW_SET_WANTFRAME_WAIT_MAX_MS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x05, u64) |
86 | #define AMVIDEOCAP_IOW_SET_WANTFRAME_AT_FLAGS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x06, int) |
87 | |
88 | |
89 | #define AMVIDEOCAP_IOR_GET_FRAME_FORMAT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x10, int) |
90 | #define AMVIDEOCAP_IOR_GET_FRAME_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x11, int) |
91 | #define AMVIDEOCAP_IOR_GET_FRAME_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x12, int) |
92 | #define AMVIDEOCAP_IOR_GET_FRAME_TIMESTAMP_MS _IOR(AMVIDEOCAP_IOC_MAGIC, 0x13, int) |
93 | |
94 | |
95 | #define AMVIDEOCAP_IOR_GET_SRCFRAME_FORMAT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x20, int) |
96 | #define AMVIDEOCAP_IOR_GET_SRCFRAME_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x21, int) |
97 | #define AMVIDEOCAP_IOR_GET_SRCFRAME_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x22, int) |
98 | |
99 | |
100 | #define AMVIDEOCAP_IOR_GET_STATE _IOR(AMVIDEOCAP_IOC_MAGIC, 0x31, int) |
101 | #define AMVIDEOCAP_IOW_SET_START_CAPTURE _IOW(AMVIDEOCAP_IOC_MAGIC, 0x32, int) |
102 | #define AMVIDEOCAP_IOW_SET_CANCEL_CAPTURE _IOW(AMVIDEOCAP_IOC_MAGIC, 0x33, int) |
103 | |
104 | #define AMVIDEOCAP_IOR_SET_SRC_X _IOR(AMVIDEOCAP_IOC_MAGIC, 0x40, int) |
105 | #define AMVIDEOCAP_IOR_SET_SRC_Y _IOR(AMVIDEOCAP_IOC_MAGIC, 0x41, int) |
106 | #define AMVIDEOCAP_IOR_SET_SRC_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x42, int) |
107 | #define AMVIDEOCAP_IOR_SET_SRC_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x43, int) |
108 | |
109 | enum amvideocap_state { |
110 | AMVIDEOCAP_STATE_INIT = 0, |
111 | AMVIDEOCAP_STATE_ON_CAPTURE = 200, |
112 | AMVIDEOCAP_STATE_FINISHED_CAPTURE = 300, |
113 | AMVIDEOCAP_STATE_ERROR = 0xffff, |
114 | }; |
115 | |
116 | class CTvScreenCapture |
117 | { |
118 | public: |
119 | CTvScreenCapture(); |
120 | ~CTvScreenCapture(); |
121 | |
122 | int InitVCap(sp<IMemory> Mem); |
123 | int SetVideoParameter(int width, int height, int frame); |
124 | int VideoStart(); |
125 | int GetVideoData( int *length); |
126 | int VideoStop(); |
127 | int DeinitVideoCap(); |
128 | class CapEvent : public CTvEv |
129 | { |
130 | public: |
131 | CapEvent(): CTvEv(CTvEv::TV_EVENT_HDMI_IN_CAP) {}; |
132 | ~CapEvent() {}; |
133 | |
134 | int mFrameNum; |
135 | int mFrameWide; |
136 | int mFrameHeight; |
137 | int mFrameSize; |
138 | }; |
139 | |
140 | class TvIObserver |
141 | { |
142 | public: |
143 | TvIObserver() {}; |
144 | virtual ~TvIObserver() {}; |
145 | virtual void onTvEvent ( const CTvEv &ev ) = 0; |
146 | }; |
147 | |
148 | int setObserver(TvIObserver *ob) |
149 | { |
150 | mpObserver = ob; |
151 | return 0; |
152 | } |
153 | |
154 | private: |
155 | |
156 | int xioctl(int fd, int request, void *arg); |
157 | int OpenCamera(struct camera *pCameraDev); |
158 | int InitMmap(struct camera *cam) ; |
159 | //int SetFrameRate( struct camera *cam); |
160 | int InitCamera(struct camera *cam) ; |
161 | int StartCapturing(struct camera *cam); |
162 | int StopCapturing(struct camera *cam); |
163 | int UninitCamera(struct camera *cam); |
164 | int CloseCamera(struct camera *cam); |
165 | void yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb); |
166 | void nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height, int *len); |
167 | private: |
168 | sp<IMemory> m_pMem; |
169 | camera m_capV4l2Cam; |
170 | unsigned int m_capNumBuffers; |
171 | |
172 | char *m_pData; |
173 | TvIObserver *mpObserver; |
174 | CapEvent mCapEvt; |
175 | }; |
176 | #endif |
177 | |
178 |