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