FreeRDP
camera.h
1 
20 #ifndef FREERDP_CLIENT_CAMERA_H
21 #define FREERDP_CLIENT_CAMERA_H
22 
23 #include <errno.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 
28 #include <libswscale/swscale.h>
29 #include <libavutil/imgutils.h>
30 
31 #include <winpr/wlog.h>
32 
33 #include <freerdp/api.h>
34 #include <freerdp/types.h>
35 
36 #include <freerdp/client/channels.h>
37 #include <freerdp/channels/log.h>
38 #include <freerdp/channels/rdpecam.h>
39 #include <freerdp/codecs.h>
40 #include <freerdp/primitives.h>
41 
42 #define ECAM_PROTO_VERSION 0x02
43 /* currently supporting 1 stream per device */
44 #define ECAM_DEVICE_MAX_STREAMS 1
45 #define ECAM_MAX_MEDIA_TYPE_DESCRIPTORS 256
46 
47 /* Allow to send up to that many unsolicited samples.
48  * For example, to support 30 fps with 250 ms round trip
49  * ECAM_MAX_SAMPLE_CREDITS has to be at least 8.
50  */
51 #define ECAM_MAX_SAMPLE_CREDITS 8
52 
53 /* Having this hardcoded allows to preallocate and reuse buffer
54  * for sample responses. Excessive size is to make sure any sample
55  * will fit in, even with highest resolution.
56  */
57 #define ECAM_SAMPLE_RESPONSE_BUFFER_SIZE (1024 * 4050)
58 
59 typedef struct s_ICamHal ICamHal;
60 
61 typedef struct
62 {
63  IWTSPlugin iface;
64  IWTSListener* listener;
65  GENERIC_LISTENER_CALLBACK* hlistener;
66 
67  /* HAL interface */
68  ICamHal* ihal;
69  char* subsystem;
70 
71  BOOL initialized;
72  BOOL attached;
73 
74  UINT32 version;
75  wHashTable* devices;
76 
77 } CameraPlugin;
78 
79 typedef struct
80 {
81  CAM_MEDIA_FORMAT inputFormat; /* camera side */
82  CAM_MEDIA_FORMAT outputFormat; /* network side */
83 
85 
86 typedef struct
87 {
88  BOOL streaming;
89  CAM_MEDIA_FORMAT_INFO formats;
90  CAM_MEDIA_TYPE_DESCRIPTION currMediaType;
91 
92  GENERIC_CHANNEL_CALLBACK* hSampleReqChannel;
93  INT nSampleCredits;
94  wStream* sampleRespBuffer;
95 
96  H264_CONTEXT* h264;
97  struct SwsContext* sws;
98  int srcLineSizes[4];
99 
101 
102 static INLINE CAM_MEDIA_FORMAT streamInputFormat(CameraDeviceStream* stream)
103 {
104  return stream->formats.inputFormat;
105 }
106 static INLINE CAM_MEDIA_FORMAT streamOutputFormat(CameraDeviceStream* stream)
107 {
108  return stream->formats.outputFormat;
109 }
110 
111 typedef struct
112 {
113  IWTSListener* listener;
114  GENERIC_LISTENER_CALLBACK* hlistener;
115  CameraPlugin* ecam;
116  ICamHal* ihal; /* HAL interface, same as used by CameraPlugin */
117  char deviceId[32];
118  CameraDeviceStream streams[ECAM_DEVICE_MAX_STREAMS];
119 
120 } CameraDevice;
121 
126 typedef UINT (*ICamHalEnumCallback)(CameraPlugin* ecam, GENERIC_CHANNEL_CALLBACK* hchannel,
127  const char* deviceId, const char* deviceName);
128 
129 /* may run in context of different thread */
130 typedef UINT (*ICamHalSampleCapturedCallback)(CameraDevice* dev, int streamIndex,
131  const BYTE* sample, size_t size);
132 
133 struct s_ICamHal
134 {
135  UINT(*Enumerate)
136  (ICamHal* ihal, ICamHalEnumCallback callback, CameraPlugin* ecam,
137  GENERIC_CHANNEL_CALLBACK* hchannel);
138  INT16(*GetMediaTypeDescriptions)
139  (ICamHal* ihal, const char* deviceId, int streamIndex,
140  const CAM_MEDIA_FORMAT_INFO* supportedFormats, size_t nSupportedFormats,
141  CAM_MEDIA_TYPE_DESCRIPTION* mediaTypes, size_t* nMediaTypes);
142  UINT(*StartStream)
143  (ICamHal* ihal, CameraDevice* dev, int streamIndex, const CAM_MEDIA_TYPE_DESCRIPTION* mediaType,
144  ICamHalSampleCapturedCallback callback);
145  UINT (*StopStream)(ICamHal* ihal, const char* deviceId, int streamIndex);
146  UINT (*Free)(ICamHal* hal);
147 };
148 
149 typedef UINT (*PREGISTERCAMERAHAL)(IWTSPlugin* plugin, ICamHal* hal);
150 
151 typedef struct
152 {
153  IWTSPlugin* plugin;
154  PREGISTERCAMERAHAL pRegisterCameraHal;
155  CameraPlugin* ecam;
156  const ADDIN_ARGV* args;
157 
159 
161 
162 /* entry point called by addin manager */
163 typedef UINT(VCAPITYPE* PFREERDP_CAMERA_HAL_ENTRY)(PFREERDP_CAMERA_HAL_ENTRY_POINTS pEntryPoints);
164 
165 /* common functions */
166 UINT ecam_channel_send_generic_msg(CameraPlugin* ecam, GENERIC_CHANNEL_CALLBACK* hchannel,
167  CAM_MSG_ID msg);
168 UINT ecam_channel_send_error_response(CameraPlugin* ecam, GENERIC_CHANNEL_CALLBACK* hchannel,
169  CAM_ERROR_CODE code);
170 UINT ecam_channel_write(CameraPlugin* ecam, GENERIC_CHANNEL_CALLBACK* hchannel, CAM_MSG_ID msg,
171  wStream* out, BOOL freeStream);
172 
173 /* ecam device interface */
174 void ecam_dev_destroy(CameraDevice* dev);
175 
176 WINPR_ATTR_MALLOC(ecam_dev_destroy, 1)
177 CameraDevice* ecam_dev_create(CameraPlugin* ecam, const char* deviceId, const char* deviceName);
178 
179 /* video encoding interface */
180 BOOL ecam_encoder_context_init(CameraDeviceStream* stream);
181 BOOL ecam_encoder_context_free(CameraDeviceStream* stream);
182 BOOL ecam_encoder_compress(CameraDeviceStream* stream, const BYTE* srcData, size_t srcSize,
183  BYTE** ppDstData, size_t* pDstSize);
184 
185 #endif /* FREERDP_CLIENT_CAMERA_H */
Definition: camera.h:152