summaryrefslogtreecommitdiff
path: root/tvapi/libtv/tv/CTvScreenCapture.h (plain)
blob: 7bbf57ef52d36ff7f7479e27c819aa9a6b6c0734
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
29
30struct 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/*
47format see linux/ge2d/ge2d.h
48like:
49GE2D_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
109enum 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
116class CTvScreenCapture {
117public:
118 CTvScreenCapture();
119 ~CTvScreenCapture();
120
121 int InitVCap(sp<IMemory> Mem);
122 int SetVideoParameter(int width, int height, int frame);
123 int VideoStart();
124 int GetVideoData( int *length);
125 int VideoStop();
126 int DeinitVideoCap();
127 int CapMediaPlayerVideoLayerOnly(int width, int height);
128 int CapOsdAndVideoLayer(int width, int height);
129 class CapEvent : public CTvEv {
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 public:
142 TvIObserver() {};
143 virtual ~TvIObserver() {};
144 virtual void onTvEvent ( const CTvEv &ev ) = 0;
145 };
146
147 int setObserver(TvIObserver *ob)
148 {
149 mpObserver = ob;
150 return 0;
151 }
152
153private:
154
155 int xioctl(int fd, int request, void *arg);
156 int OpenCamera(struct camera *pCameraDev);
157 int InitMmap(struct camera *cam) ;
158 //int SetFrameRate( struct camera *cam);
159 int InitCamera(struct camera *cam) ;
160 int StartCapturing(struct camera *cam);
161 int StopCapturing(struct camera *cam);
162 int UninitCamera(struct camera *cam);
163 int CloseCamera(struct camera *cam);
164 void yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb);
165 void nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height, int *len);
166 int AmvideocapCapFrame(char *buf, int size, int *w, int *h, int *ret_size);
167private:
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