20#ifndef FREERDP_CLIENT_CAMERA_H
21#define FREERDP_CLIENT_CAMERA_H
28#include <winpr/wlog.h>
29#include <winpr/wtypes.h>
31#include <freerdp/api.h>
32#include <freerdp/types.h>
34#include <freerdp/client/channels.h>
35#include <freerdp/channels/log.h>
36#include <freerdp/channels/rdpecam.h>
37#include <freerdp/codecs.h>
38#include <freerdp/codec/video.h>
39#include <freerdp/primitives.h>
41#define ECAM_PROTO_VERSION 0x02
43#define ECAM_DEVICE_MAX_STREAMS 1
44#define ECAM_MAX_MEDIA_TYPE_DESCRIPTORS 256
50#define ECAM_MAX_SAMPLE_CREDITS 8
56#define ECAM_SAMPLE_RESPONSE_BUFFER_SIZE (1024ULL * 4050ULL)
63 IWTSListener* listener;
81 CAM_MEDIA_FORMAT inputFormat;
82 CAM_MEDIA_FORMAT outputFormat;
96 volatile LONG samplesRequested;
98 UINT64 lastSampleRequestTime;
100 volatile BOOL haveSample;
103 FREERDP_VIDEO_CONTEXT* video;
107#define ECAM_SAMPLE_CAPTURE_DRAINED 0x00010000u
112#define ECAM_CAPTURE_IDLE_TIMEOUT_MS 2000ULL
117 return stream->formats.inputFormat;
123 return stream->formats.outputFormat;
128 IWTSListener* listener;
142 const char* deviceId,
const char* deviceName);
145typedef UINT (*ICamHalSampleCapturedCallback)(
CameraDevice* dev,
size_t streamIndex,
146 const BYTE* sample,
size_t size);
152 BOOL RequestDrivenCapture;
162 WINPR_ATTR_NODISCARD UINT (*
Enumerate)(ICamHal* ihal, ICamHalEnumCallback callback,
173 WINPR_ATTR_NODISCARD BOOL (*
Activate)(ICamHal* ihal,
const char* deviceId,
174 CAM_ERROR_CODE* errorCode);
184 WINPR_ATTR_NODISCARD BOOL (*
Deactivate)(ICamHal* ihal,
const char* deviceId,
185 CAM_ERROR_CODE* errorCode);
199 ICamHal* ihal,
const char* deviceId,
size_t streamIndex,
215 ICamHalSampleCapturedCallback callback);
224 CAM_ERROR_CODE (*
StopStream)(ICamHal* ihal,
const char* deviceId,
size_t streamIndex);
231 CAM_ERROR_CODE (*
Free)(ICamHal* ihal);
234typedef UINT (*PREGISTERCAMERAHAL)(IWTSPlugin* plugin, ICamHal* hal);
239 WINPR_ATTR_NODISCARD PREGISTERCAMERAHAL pRegisterCameraHal;
251WINPR_ATTR_NODISCARD FREERDP_LOCAL UINT ecam_channel_send_generic_msg(
254FREERDP_LOCAL UINT ecam_channel_send_error_response(
CameraPlugin* ecam,
256 CAM_ERROR_CODE code);
258WINPR_ATTR_NODISCARD FREERDP_LOCAL UINT ecam_channel_write(
CameraPlugin* ecam,
266WINPR_ATTR_MALLOC(ecam_dev_destroy, 1)
269 const
char* deviceName);
272WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ecam_encoder_context_init(
CameraDeviceStream* stream);
276WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ecam_encoder_compress(
CameraDeviceStream* stream,
277 const BYTE* srcData,
size_t srcSize,
280WINPR_ATTR_NODISCARD FREERDP_LOCAL UINT32 h264_get_max_bitrate(UINT32 height);
283FREERDP_LOCAL FREERDP_VIDEO_FORMAT ecamToVideoFormat(CAM_MEDIA_FORMAT ecamFormat);
interface to implement for the camera HAL
WINPR_ATTR_NODISCARD BOOL(* Deactivate)(ICamHal *ihal, const char *deviceId, CAM_ERROR_CODE *errorCode)
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)
WINPR_ATTR_NODISCARD UINT(* Enumerate)(ICamHal *ihal, ICamHalEnumCallback callback, CameraPlugin *ecam, GENERIC_CHANNEL_CALLBACK *hchannel)
WINPR_ATTR_NODISCARD BOOL(* Activate)(ICamHal *ihal, const char *deviceId, CAM_ERROR_CODE *errorCode)
CAM_ERROR_CODE(* StopStream)(ICamHal *ihal, const char *deviceId, size_t streamIndex)
WINPR_ATTR_NODISCARD CAM_ERROR_CODE(* StartStream)(ICamHal *ihal, CameraDevice *dev, size_t streamIndex, const CAM_MEDIA_TYPE_DESCRIPTION *mediaType, ICamHalSampleCapturedCallback callback)
CAM_ERROR_CODE(* Free)(ICamHal *ihal)