summaryrefslogtreecommitdiff
path: root/tvapi/libtv/tv/CTvScreenCapture.h (plain)
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
22using namespace android;
23
24struct buffer {
25 void *start;
26 size_t length;
27};
28
29struct 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/*
46format see linux/ge2d/ge2d.h
47like:
48GE2D_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
108enum 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
115class CTvScreenCapture {
116public:
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
152private:
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);
166private:
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