FreeRDP
Loading...
Searching...
No Matches
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#if defined(WITH_INPUT_FORMAT_MJPG)
29#include <libavcodec/avcodec.h>
30#endif
31
32#include <libswscale/swscale.h>
33#include <libavutil/imgutils.h>
34
35#include <winpr/wlog.h>
36#include <winpr/wtypes.h>
37
38#include <freerdp/api.h>
39#include <freerdp/types.h>
40
41#include <freerdp/client/channels.h>
42#include <freerdp/channels/log.h>
43#include <freerdp/channels/rdpecam.h>
44#include <freerdp/codecs.h>
45#include <freerdp/primitives.h>
46
47#define ECAM_PROTO_VERSION 0x02
48/* currently supporting 1 stream per device */
49#define ECAM_DEVICE_MAX_STREAMS 1
50#define ECAM_MAX_MEDIA_TYPE_DESCRIPTORS 256
51
52/* Allow to send up to that many unsolicited samples.
53 * For example, to support 30 fps with 250 ms round trip
54 * ECAM_MAX_SAMPLE_CREDITS has to be at least 8.
55 */
56#define ECAM_MAX_SAMPLE_CREDITS 8
57
58/* Having this hardcoded allows to preallocate and reuse buffer
59 * for sample responses. Excessive size is to make sure any sample
60 * will fit in, even with highest resolution.
61 */
62#define ECAM_SAMPLE_RESPONSE_BUFFER_SIZE (1024ULL * 4050ULL)
63
64/* Special format addition for CAM_MEDIA_FORMAT enum formats
65 * used to support H264 stream muxed in MJPG container stream.
66 * The value picked not to overlap with enum values
67 */
68#define CAM_MEDIA_FORMAT_MJPG_H264 0x0401
69
70typedef struct s_ICamHal ICamHal;
71
72typedef struct
73{
74 IWTSPlugin iface;
75 IWTSListener* listener;
77
78 /* HAL interface */
79 ICamHal* ihal;
80 char* subsystem;
81
82 BOOL initialized;
83 BOOL attached;
84
85 UINT32 version;
86 wHashTable* devices;
87
89
90typedef struct
91{
92 CAM_MEDIA_FORMAT inputFormat; /* camera side */
93 CAM_MEDIA_FORMAT outputFormat; /* network side */
94
96
97typedef struct
98{
99 BOOL streaming;
100 CAM_MEDIA_FORMAT_INFO formats;
101 CAM_MEDIA_TYPE_DESCRIPTION currMediaType;
102
103 GENERIC_CHANNEL_CALLBACK* hSampleReqChannel;
104 CRITICAL_SECTION lock;
105 volatile LONG samplesRequested;
106 wStream* pendingSample;
107 volatile BOOL haveSample;
108 wStream* sampleRespBuffer;
109
110 H264_CONTEXT* h264;
111
112#if defined(WITH_INPUT_FORMAT_MJPG)
113 AVCodecContext* avContext;
114 AVPacket* avInputPkt;
115 AVFrame* avOutFrame;
116#endif
117
118#if defined(WITH_INPUT_FORMAT_H264)
119 size_t h264FrameMaxSize;
120 BYTE* h264Frame;
121#endif
122
123 /* sws_scale */
124 uint32_t swsWidth;
125 uint32_t swsHeight;
126 struct SwsContext* sws;
127
129
130WINPR_ATTR_NODISCARD
131static inline CAM_MEDIA_FORMAT streamInputFormat(CameraDeviceStream* stream)
132{
133 return stream->formats.inputFormat;
134}
135
136WINPR_ATTR_NODISCARD
137static inline CAM_MEDIA_FORMAT streamOutputFormat(CameraDeviceStream* stream)
138{
139 return stream->formats.outputFormat;
140}
141
142typedef struct
143{
144 IWTSListener* listener;
145 GENERIC_LISTENER_CALLBACK* hlistener;
146 CameraPlugin* ecam;
147 ICamHal* ihal; /* HAL interface, same as used by CameraPlugin */
148 char deviceId[32];
149 CameraDeviceStream streams[ECAM_DEVICE_MAX_STREAMS];
150
152
157typedef UINT (*ICamHalEnumCallback)(CameraPlugin* ecam, GENERIC_CHANNEL_CALLBACK* hchannel,
158 const char* deviceId, const char* deviceName);
159
160/* may run in context of different thread */
161typedef UINT (*ICamHalSampleCapturedCallback)(CameraDevice* dev, size_t streamIndex,
162 const BYTE* sample, size_t size);
163
166{
175 WINPR_ATTR_NODISCARD UINT (*Enumerate)(ICamHal* ihal, ICamHalEnumCallback callback,
176 CameraPlugin* ecam, GENERIC_CHANNEL_CALLBACK* hchannel);
177
186 WINPR_ATTR_NODISCARD BOOL (*Activate)(ICamHal* ihal, const char* deviceId,
187 CAM_ERROR_CODE* errorCode);
188
197 WINPR_ATTR_NODISCARD BOOL (*Deactivate)(ICamHal* ihal, const char* deviceId,
198 CAM_ERROR_CODE* errorCode);
199
211 WINPR_ATTR_NODISCARD INT16 (*GetMediaTypeDescriptions)(
212 ICamHal* ihal, const char* deviceId, size_t streamIndex,
213 const CAM_MEDIA_FORMAT_INFO* supportedFormats, size_t nSupportedFormats,
214 CAM_MEDIA_TYPE_DESCRIPTION* mediaTypes, size_t* nMediaTypes);
215
225 WINPR_ATTR_NODISCARD CAM_ERROR_CODE (*StartStream)(ICamHal* ihal, CameraDevice* dev,
226 size_t streamIndex,
227 const CAM_MEDIA_TYPE_DESCRIPTION* mediaType,
228 ICamHalSampleCapturedCallback callback);
229
237 CAM_ERROR_CODE (*StopStream)(ICamHal* ihal, const char* deviceId, size_t streamIndex);
238
244 CAM_ERROR_CODE (*Free)(ICamHal* ihal);
245};
246
247typedef UINT (*PREGISTERCAMERAHAL)(IWTSPlugin* plugin, ICamHal* hal);
248
249typedef struct
250{
251 IWTSPlugin* plugin;
252 WINPR_ATTR_NODISCARD PREGISTERCAMERAHAL pRegisterCameraHal;
253 CameraPlugin* ecam;
254 const ADDIN_ARGV* args;
255
257
259
260/* entry point called by addin manager */
261typedef UINT(VCAPITYPE* PFREERDP_CAMERA_HAL_ENTRY)(PFREERDP_CAMERA_HAL_ENTRY_POINTS pEntryPoints);
262
263/* common functions */
264WINPR_ATTR_NODISCARD FREERDP_LOCAL UINT ecam_channel_send_generic_msg(
265 CameraPlugin* ecam, GENERIC_CHANNEL_CALLBACK* hchannel, CAM_MSG_ID msg);
266
267FREERDP_LOCAL UINT ecam_channel_send_error_response(CameraPlugin* ecam,
268 GENERIC_CHANNEL_CALLBACK* hchannel,
269 CAM_ERROR_CODE code);
270
271WINPR_ATTR_NODISCARD FREERDP_LOCAL UINT ecam_channel_write(CameraPlugin* ecam,
272 GENERIC_CHANNEL_CALLBACK* hchannel,
273 CAM_MSG_ID msg, wStream* out,
274 BOOL freeStream);
275
276/* ecam device interface */
277FREERDP_LOCAL void ecam_dev_destroy(CameraDevice* dev);
278
279WINPR_ATTR_MALLOC(ecam_dev_destroy, 1)
280WINPR_ATTR_NODISCARD
281FREERDP_LOCAL CameraDevice* ecam_dev_create(CameraPlugin* ecam, const char* deviceId,
282 const char* deviceName);
283
284/* video encoding interface */
285WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ecam_encoder_context_init(CameraDeviceStream* stream);
286
287FREERDP_LOCAL BOOL ecam_encoder_context_free(CameraDeviceStream* stream);
288
289WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ecam_encoder_compress(CameraDeviceStream* stream,
290 const BYTE* srcData, size_t srcSize,
291 BYTE** ppDstData, size_t* pDstSize);
292
293WINPR_ATTR_NODISCARD FREERDP_LOCAL UINT32 h264_get_max_bitrate(UINT32 height);
294
295#endif /* FREERDP_CLIENT_CAMERA_H */
Definition camera.h:250
interface to implement for the camera HAL
Definition camera.h:166
WINPR_ATTR_NODISCARD BOOL(* Deactivate)(ICamHal *ihal, const char *deviceId, CAM_ERROR_CODE *errorCode)
Definition camera.h:197
WINPR_ATTR_NODISCARD INT16(* GetMediaTypeDescriptions)(ICamHal *ihal, const char *deviceId, size_t streamIndex, const CAM_MEDIA_FORMAT_INFO *supportedFormats, size_t nSupportedFormats, CAM_MEDIA_TYPE_DESCRIPTION *mediaTypes, size_t *nMediaTypes)
Definition camera.h:211
WINPR_ATTR_NODISCARD UINT(* Enumerate)(ICamHal *ihal, ICamHalEnumCallback callback, CameraPlugin *ecam, GENERIC_CHANNEL_CALLBACK *hchannel)
Definition camera.h:175
WINPR_ATTR_NODISCARD BOOL(* Activate)(ICamHal *ihal, const char *deviceId, CAM_ERROR_CODE *errorCode)
Definition camera.h:186
CAM_ERROR_CODE(* StopStream)(ICamHal *ihal, const char *deviceId, size_t streamIndex)
Definition camera.h:237
WINPR_ATTR_NODISCARD CAM_ERROR_CODE(* StartStream)(ICamHal *ihal, CameraDevice *dev, size_t streamIndex, const CAM_MEDIA_TYPE_DESCRIPTION *mediaType, ICamHalSampleCapturedCallback callback)
Definition camera.h:225
CAM_ERROR_CODE(* Free)(ICamHal *ihal)
Definition camera.h:244