VirtualBox

source: vbox/trunk/include/VBox/RemoteDesktop/VRDEVideoIn.h@ 93115

Last change on this file since 93115 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 43.7 KB
Line 
1/** @file
2 * VBox Remote Desktop Extension (VRDE) - Video Input interface.
3 */
4
5/*
6 * Copyright (C) 2012-2022 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef VBOX_INCLUDED_RemoteDesktop_VRDEVideoIn_h
27#define VBOX_INCLUDED_RemoteDesktop_VRDEVideoIn_h
28#ifndef RT_WITHOUT_PRAGMA_ONCE
29# pragma once
30#endif
31
32
33/* Define VRDE_VIDEOIN_WITH_VRDEINTERFACE to include the server VRDE interface parts. */
34
35#ifdef VRDE_VIDEOIN_WITH_VRDEINTERFACE
36# include <VBox/RemoteDesktop/VRDE.h>
37#endif /* VRDE_VIDEOIN_WITH_VRDEINTERFACE */
38
39#ifdef AssertCompileSize
40# define ASSERTSIZE(type, size) AssertCompileSize(type, size);
41#else
42# define ASSERTSIZE(type, size)
43#endif /* AssertCompileSize */
44
45#include <iprt/types.h>
46
47
48/*
49 * Interface for accessing a video camera device on the client.
50 *
51 * Async callbacks are used for providing feedback, reporting errors, etc.
52 *
53 * Initial version supports: Camera + Processing Unit + Streaming Control.
54 *
55 * There are 2 modes:
56 * 1) The virtual WebCam is already attached to the guest.
57 * 2) The virtual WebCam will be attached when the client has it.
58 *
59 * Initially the mode 1 is supported.
60 *
61 * Mode 1 details:
62 * The WebCam has some fixed functionality, according to the descriptors,
63 * which has been already read by the guest. So some of functions will
64 * not work if the client does not support them.
65 *
66 * Mode 2 details:
67 * Virtual WebCam descriptors are built from the client capabilities.
68 *
69 * Similarly to the smartcard, the server will inform the ConsoleVRDE that there is a WebCam.
70 * ConsoleVRDE creates a VRDEVIDEOIN handle and forwards virtual WebCam requests to it.
71 *
72 * Interface with VBox.
73 *
74 * Virtual WebCam ConsoleVRDE VRDE
75 *
76 * Negotiate <->
77 * <- VideoInDeviceNotify(Attached, DeviceId)
78 * -> GetDeviceDesc
79 * <- DeviceDesc
80 * 2 <- CreateCamera
81 * 2 CameraCreated ->
82 *
83 * CameraRequest -> Request ->
84 * Response <- <- Response <- Response
85 * Frame <- <- Frame <- Frame
86 * <- VideoInDeviceNotify(Detached, DeviceId)
87 *
88 * Unsupported requests fail.
89 * The Device Description received from the client may be used to validate WebCam requests
90 * in the ConsoleVRDE code, for example filter out unsupported requests.
91 *
92 */
93
94/* All structures in this file are packed.
95 * Everything is little-endian.
96 */
97#pragma pack(1)
98
99/*
100 * The interface supports generic video input descriptors, capabilities and controls:
101 * * Descriptors
102 * + Interface
103 * - Input, Camera Terminal
104 * - Processing Unit
105 * + Video Streaming
106 * - Input Header
107 * - Payload Format
108 * - Video Frame
109 * - Still Image Frame
110 * * Video Control requests
111 * + Interface
112 * - Power Mode
113 * + Unit and Terminal
114 * camera
115 * - Scanning Mode (interlaced, progressive)
116 * - Auto-Exposure Mode
117 * - Auto-Exposure Priority
118 * - Exposure Time Absolute, Relative
119 * - Focus Absolute, Relative, Auto
120 * - Iris Absolute, Relative
121 * - Zoom Absolute, Relative
122 * - PanTilt Absolute, Relative
123 * - Roll Absolute, Relative
124 * - Privacy
125 * processing
126 * - Backlight Compensation
127 * - Brightness
128 * - Contrast
129 * - Gain
130 * - Power Line Frequency
131 * - Hue Manual, Auto
132 * - Saturation
133 * - Sharpness
134 * - Gamma
135 * - White Balance Temperature Manual, Auto
136 * - White Balance Component Manual, Auto
137 * - Digital Multiplier
138 * - Digital Multiplier Limit
139 * * Video Streaming requests
140 * + Interface
141 * - Synch Delay
142 * - Still Image Trigger
143 * - Generate Key Frame
144 * - Update Frame Segment
145 * - Stream Error Code
146 *
147 *
148 * Notes:
149 * * still capture uses a method similar to method 2, because the still frame will
150 * be send instead of video over the channel.
151 * Also the method 2 can be in principle emulated by both 1 and 3 on the client.
152 * However the client can initiate a still frame transfer, similar to hardware button trigger.
153 * * all control changes are async.
154 * * probe/commit are not used. The server can select a supported format/frame from the list.
155 * * no color matching. sRGB is the default.
156 * * most of constants are the same as in USB Video Class spec, but they are not the same and
157 * should be always converted.
158 */
159
160/*
161 * The DEVICEDEC describes the device and provides a list of supported formats:
162 * VRDEVIDEOINDEVICEDESC
163 * VRDEVIDEOINFORMATDESC[0];
164 * VRDEVIDEOINFRAMEDESC[0..N-1]
165 * VRDEVIDEOINFORMATDESC[1];
166 * VRDEVIDEOINFRAMEDESC[0..M-1]
167 * ...
168 */
169
170typedef struct VRDEVIDEOINDEVICEDESC
171{
172 uint16_t u16ObjectiveFocalLengthMin;
173 uint16_t u16ObjectiveFocalLengthMax;
174 uint16_t u16OcularFocalLength;
175 uint16_t u16MaxMultiplier;
176 uint32_t fu32CameraControls; /* VRDE_VIDEOIN_F_CT_CTRL_* */
177 uint32_t fu32ProcessingControls; /* VRDE_VIDEOIN_F_PU_CTRL_* */
178 uint8_t fu8DeviceCaps; /* VRDE_VIDEOIN_F_DEV_CAP_* */
179 uint8_t u8NumFormats; /* Number of following VRDEVIDEOINFORMATDESC structures. */
180 uint16_t cbExt; /* Size of the optional extended description. */
181 /* An extended description may follow. */
182 /* An array of VRDEVIDEOINFORMATDESC follows. */
183} VRDEVIDEOINDEVICEDESC;
184
185/* VRDEVIDEOINDEVICEDESC::fu32CameraControls */
186#define VRDE_VIDEOIN_F_CT_CTRL_SCANNING_MODE 0x00000001 /* D0: Scanning Mode */
187#define VRDE_VIDEOIN_F_CT_CTRL_AE_MODE 0x00000002 /* D1: Auto-Exposure Mode */
188#define VRDE_VIDEOIN_F_CT_CTRL_AE_PRIORITY 0x00000004 /* D2: Auto-Exposure Priority */
189#define VRDE_VIDEOIN_F_CT_CTRL_EXPOSURE_TIME_ABSOLUTE 0x00000008 /* D3: Exposure Time (Absolute) */
190#define VRDE_VIDEOIN_F_CT_CTRL_EXPOSURE_TIME_RELATIVE 0x00000010 /* D4: Exposure Time (Relative) */
191#define VRDE_VIDEOIN_F_CT_CTRL_FOCUS_ABSOLUTE 0x00000020 /* D5: Focus (Absolute) */
192#define VRDE_VIDEOIN_F_CT_CTRL_FOCUS_RELATIVE 0x00000040 /* D6: Focus (Relative) */
193#define VRDE_VIDEOIN_F_CT_CTRL_IRIS_ABSOLUTE 0x00000080 /* D7: Iris (Absolute) */
194#define VRDE_VIDEOIN_F_CT_CTRL_IRIS_RELATIVE 0x00000100 /* D8: Iris (Relative) */
195#define VRDE_VIDEOIN_F_CT_CTRL_ZOOM_ABSOLUTE 0x00000200 /* D9: Zoom (Absolute) */
196#define VRDE_VIDEOIN_F_CT_CTRL_ZOOM_RELATIVE 0x00000400 /* D10: Zoom (Relative) */
197#define VRDE_VIDEOIN_F_CT_CTRL_PANTILT_ABSOLUTE 0x00000800 /* D11: PanTilt (Absolute) */
198#define VRDE_VIDEOIN_F_CT_CTRL_PANTILT_RELATIVE 0x00001000 /* D12: PanTilt (Relative) */
199#define VRDE_VIDEOIN_F_CT_CTRL_ROLL_ABSOLUTE 0x00002000 /* D13: Roll (Absolute) */
200#define VRDE_VIDEOIN_F_CT_CTRL_ROLL_RELATIVE 0x00004000 /* D14: Roll (Relative) */
201#define VRDE_VIDEOIN_F_CT_CTRL_RESERVED1 0x00008000 /* D15: Reserved */
202#define VRDE_VIDEOIN_F_CT_CTRL_RESERVED2 0x00010000 /* D16: Reserved */
203#define VRDE_VIDEOIN_F_CT_CTRL_FOCUS_AUTO 0x00020000 /* D17: Focus, Auto */
204#define VRDE_VIDEOIN_F_CT_CTRL_PRIVACY 0x00040000 /* D18: Privacy */
205
206/* VRDEVIDEOINDEVICEDESC::fu32ProcessingControls */
207#define VRDE_VIDEOIN_F_PU_CTRL_BRIGHTNESS 0x00000001 /* D0: Brightness */
208#define VRDE_VIDEOIN_F_PU_CTRL_CONTRAST 0x00000002 /* D1: Contrast */
209#define VRDE_VIDEOIN_F_PU_CTRL_HUE 0x00000004 /* D2: Hue */
210#define VRDE_VIDEOIN_F_PU_CTRL_SATURATION 0x00000008 /* D3: Saturation */
211#define VRDE_VIDEOIN_F_PU_CTRL_SHARPNESS 0x00000010 /* D4: Sharpness */
212#define VRDE_VIDEOIN_F_PU_CTRL_GAMMA 0x00000020 /* D5: Gamma */
213#define VRDE_VIDEOIN_F_PU_CTRL_WHITE_BALANCE_TEMPERATURE 0x00000040 /* D6: White Balance Temperature */
214#define VRDE_VIDEOIN_F_PU_CTRL_WHITE_BALANCE_COMPONENT 0x00000080 /* D7: White Balance Component */
215#define VRDE_VIDEOIN_F_PU_CTRL_BACKLIGHT_COMPENSATION 0x00000100 /* D8: Backlight Compensation */
216#define VRDE_VIDEOIN_F_PU_CTRL_GAIN 0x00000200 /* D9: Gain */
217#define VRDE_VIDEOIN_F_PU_CTRL_POWER_LINE_FREQUENCY 0x00000400 /* D10: Power Line Frequency */
218#define VRDE_VIDEOIN_F_PU_CTRL_HUE_AUTO 0x00000800 /* D11: Hue, Auto */
219#define VRDE_VIDEOIN_F_PU_CTRL_WHITE_BALANCE_TEMPERATURE_AUTO 0x00001000 /* D12: White Balance Temperature, Auto */
220#define VRDE_VIDEOIN_F_PU_CTRL_WHITE_BALANCE_COMPONENT_AUTO 0x00002000 /* D13: White Balance Component, Auto */
221#define VRDE_VIDEOIN_F_PU_CTRL_DIGITAL_MULTIPLIER 0x00004000 /* D14: Digital Multiplier */
222#define VRDE_VIDEOIN_F_PU_CTRL_DIGITAL_MULTIPLIER_LIMIT 0x00008000 /* D15: Digital Multiplier Limit */
223
224/* VRDEVIDEOINDEVICEDESC::fu8DeviceCaps */
225#define VRDE_VIDEOIN_F_DEV_CAP_DYNAMICCHANGE 0x01 /* Whether dynamic format change is supported. */
226#define VRDE_VIDEOIN_F_DEV_CAP_TRIGGER 0x02 /* Whether hardware triggering is supported. */
227#define VRDE_VIDEOIN_F_DEV_CAP_TRIGGER_USAGE 0x04 /* 0 - still image, 1 - generic button event.*/
228
229/* VRDEVIDEOINDEVICEDESC extended description. */
230typedef struct VRDEVIDEOINDEVICEEXT
231{
232 uint32_t fu32Fields;
233 /* One or more VRDEVIDEOINDEVICEFIELD follow. */
234} VRDEVIDEOINDEVICEEXT;
235
236typedef struct VRDEVIDEOINDEVICEFIELDHDR
237{
238 uint16_t cbField; /* Number of bytes reserved for this field. */
239} VRDEVIDEOINDEVICEFIELDHDR;
240
241/* VRDEVIDEOINDEVICEDESC::fu32Fields */
242#define VRDE_VIDEOIN_F_DEV_EXT_NAME 0x00000001 /* Utf8 device name. */
243#define VRDE_VIDEOIN_F_DEV_EXT_SERIAL 0x00000002 /* Utf8 device serial number. */
244
245/* The video format descriptor. */
246typedef struct VRDEVIDEOINFORMATDESC
247{
248 uint16_t cbFormat; /* Size of the structure including cbFormat and format specific data. */
249 uint8_t u8FormatId; /* The unique identifier of the format on the client. */
250 uint8_t u8FormatType; /* MJPEG etc. VRDE_VIDEOIN_FORMAT_* */
251 uint8_t u8FormatFlags; /* VRDE_VIDEOIN_F_FMT_* */
252 uint8_t u8NumFrames; /* Number of following VRDEVIDEOINFRAMEDESC structures. */
253 uint16_t u16Reserved; /* Must be set to 0. */
254 /* Other format specific data may follow. */
255 /* An array of VRDEVIDEOINFRAMEDESC follows. */
256} VRDEVIDEOINFORMATDESC;
257
258/* VRDEVIDEOINFORMATDESC::u8FormatType */
259#define VRDE_VIDEOIN_FORMAT_UNCOMPRESSED 0x04
260#define VRDE_VIDEOIN_FORMAT_MJPEG 0x06
261#define VRDE_VIDEOIN_FORMAT_MPEG2TS 0x0A
262#define VRDE_VIDEOIN_FORMAT_DV 0x0C
263#define VRDE_VIDEOIN_FORMAT_FRAME_BASED 0x10
264#define VRDE_VIDEOIN_FORMAT_STREAM_BASED 0x12
265
266/* VRDEVIDEOINFORMATDESC::u8FormatFlags. */
267#define VRDE_VIDEOIN_F_FMT_GENERATEKEYFRAME 0x01 /* Supports Generate Key Frame */
268#define VRDE_VIDEOIN_F_FMT_UPDATEFRAMESEGMENT 0x02 /* Supports Update Frame Segment */
269#define VRDE_VIDEOIN_F_FMT_COPYPROTECT 0x04 /* If duplication should be restricted. */
270#define VRDE_VIDEOIN_F_FMT_COMPQUALITY 0x08 /* If the format supports an adjustable compression quality. */
271
272typedef struct VRDEVIDEOINFRAMEDESC
273{
274 uint16_t cbFrame; /* Size of the structure including cbFrame and frame specific data. */
275 uint8_t u8FrameId; /* The unique identifier of the frame for the corresponding format on the client. */
276 uint8_t u8FrameFlags;
277 uint16_t u16Width;
278 uint16_t u16Height;
279 uint32_t u32NumFrameIntervals; /* The number of supported frame intervals. */
280 uint32_t u32MinFrameInterval; /* Shortest frame interval supported (at highest frame rate), in 100ns units. */
281 uint32_t u32MaxFrameInterval; /* Longest frame interval supported (at lowest frame rate), in 100ns units. */
282 /* Supported frame intervals (in 100ns units) follow if VRDE_VIDEOIN_F_FRM_DISCRETE_INTERVALS is set.
283 * uint32_t au32FrameIntervals[u32NumFrameIntervals];
284 */
285 /* Supported min and max bitrate in bits per second follow if VRDE_VIDEOIN_F_FRM_BITRATE is set.
286 * uint32_t u32MinBitRate;
287 * uint32_t u32MaxBitRate;
288 */
289 /* Other frame specific data may follow. */
290} VRDEVIDEOINFRAMEDESC;
291
292/* VRDEVIDEOINFRAMEDESC::u8FrameFlags. */
293#define VRDE_VIDEOIN_F_FRM_STILL 0x01 /* If still images are supported for this frame. */
294#define VRDE_VIDEOIN_F_FRM_DISCRETE_INTERVALS 0x02 /* If the discrete intervals list is included. */
295#define VRDE_VIDEOIN_F_FRM_BITRATE 0x04 /* If the bitrate fields are included. */
296#define VRDE_VIDEOIN_F_FRM_SIZE_OF_FIELDS 0x08 /* If the all optional fields start with 16 bit field size. */
297
298/*
299 * Controls.
300 *
301 * The same structures are used for both SET and GET requests.
302 * Requests are async. A callback is invoked, when the client returns a reply.
303 * A control change notification also uses these structures.
304 *
305 * If a control request can not be fulfilled, then VRDE_VIDEOIN_CTRLHDR_F_FAIL
306 * will be set and u8Status contains the error code. This replaces the VC_REQUEST_ERROR_CODE_CONTROL.
307 *
308 * If the client receives an unsupported control, then the client must ignore it.
309 * That is the control request must not affect the client in any way.
310 * The client may send a VRDEVIDEOINCTRLHDR response for the unsupported control with:
311 * u16ControlSelector = the received value;
312 * u16RequestType = the received value;
313 * u16ParmSize = 0;
314 * u8Flags = VRDE_VIDEOIN_CTRLHDR_F_FAIL;
315 * u8Status = VRDE_VIDEOIN_CTRLHDR_STATUS_INVALIDCONTROL;
316 */
317
318typedef struct VRDEVIDEOINCTRLHDR
319{
320 uint16_t u16ControlSelector; /* VRDE_VIDEOIN_CTRLSEL_* */
321 uint16_t u16RequestType; /* VRDE_VIDEOIN_CTRLREQ_* */
322 uint16_t u16ParmSize; /* The size of the control specific parameters. */
323 uint8_t u8Flags; /* VRDE_VIDEOIN_CTRLHDR_F_* */
324 uint8_t u8Status; /* VRDE_VIDEOIN_CTRLHDR_STATUS_* */
325 /* Control specific data follows. */
326} VRDEVIDEOINCTRLHDR;
327
328/* Control request types: VRDEVIDEOINCTRLHDR::u16RequestType. */
329#define VRDE_VIDEOIN_CTRLREQ_UNDEFINED 0x00
330#define VRDE_VIDEOIN_CTRLREQ_SET_CUR 0x01
331#define VRDE_VIDEOIN_CTRLREQ_GET_CUR 0x81
332#define VRDE_VIDEOIN_CTRLREQ_GET_MIN 0x82
333#define VRDE_VIDEOIN_CTRLREQ_GET_MAX 0x83
334#define VRDE_VIDEOIN_CTRLREQ_GET_RES 0x84
335#define VRDE_VIDEOIN_CTRLREQ_GET_LEN 0x85
336#define VRDE_VIDEOIN_CTRLREQ_GET_INFO 0x86
337#define VRDE_VIDEOIN_CTRLREQ_GET_DEF 0x87
338
339/* VRDEVIDEOINCTRLHDR::u8Flags */
340#define VRDE_VIDEOIN_CTRLHDR_F_NOTIFY 0x01 /* Control change notification, the attribute is derived from u16RequestType and F_FAIL. */
341#define VRDE_VIDEOIN_CTRLHDR_F_FAIL 0x02 /* The operation failed. Error code is in u8Status. */
342
343/* VRDEVIDEOINCTRLHDR::u8Status if the VRDE_VIDEOIN_CTRLHDR_F_FAIL is set. */
344#define VRDE_VIDEOIN_CTRLHDR_STATUS_SUCCESS 0x00 /**/
345#define VRDE_VIDEOIN_CTRLHDR_STATUS_NOTREADY 0x01 /* Not ready */
346#define VRDE_VIDEOIN_CTRLHDR_STATUS_WRONGSTATE 0x02 /* Wrong state */
347#define VRDE_VIDEOIN_CTRLHDR_STATUS_POWER 0x03 /* Power */
348#define VRDE_VIDEOIN_CTRLHDR_STATUS_OUTOFRANGE 0x04 /* Out of range */
349#define VRDE_VIDEOIN_CTRLHDR_STATUS_INVALIDUNIT 0x05 /* Invalid unit */
350#define VRDE_VIDEOIN_CTRLHDR_STATUS_INVALIDCONTROL 0x06 /* Invalid control */
351#define VRDE_VIDEOIN_CTRLHDR_STATUS_INVALIDREQUEST 0x07 /* Invalid request */
352#define VRDE_VIDEOIN_CTRLHDR_STATUS_UNKNOWN 0xFF /* Unknown */
353
354/* Control selectors. 16 bit. High byte is the category. Low byte is the identifier.*/
355#ifdef RT_MAKE_U16
356#define VRDE_VIDEOIN_CTRLSEL_MAKE(Lo, Hi) RT_MAKE_U16(Lo, Hi)
357#else
358#define VRDE_VIDEOIN_CTRLSEL_MAKE(Lo, Hi) ((uint16_t)( (uint16_t)((uint8_t)(Hi)) << 8 | (uint8_t)(Lo) ))
359#endif
360
361#define VRDE_VIDEOIN_CTRLSEL_VC(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x01)
362#define VRDE_VIDEOIN_CTRLSEL_CT(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x02)
363#define VRDE_VIDEOIN_CTRLSEL_PU(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x03)
364#define VRDE_VIDEOIN_CTRLSEL_VS(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x04)
365#define VRDE_VIDEOIN_CTRLSEL_HW(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x05)
366#define VRDE_VIDEOIN_CTRLSEL_PROT(a) VRDE_VIDEOIN_CTRLSEL_MAKE(a, 0x06)
367
368#define VRDE_VIDEOIN_CTRLSEL_VC_VIDEO_POWER_MODE_CONTROL VRDE_VIDEOIN_CTRLSEL_VC(0x01)
369
370#define VRDE_VIDEOIN_CTRLSEL_CT_UNDEFINED VRDE_VIDEOIN_CTRLSEL_CT(0x00)
371#define VRDE_VIDEOIN_CTRLSEL_CT_SCANNING_MODE VRDE_VIDEOIN_CTRLSEL_CT(0x01)
372#define VRDE_VIDEOIN_CTRLSEL_CT_AE_MODE VRDE_VIDEOIN_CTRLSEL_CT(0x02)
373#define VRDE_VIDEOIN_CTRLSEL_CT_AE_PRIORITY VRDE_VIDEOIN_CTRLSEL_CT(0x03)
374#define VRDE_VIDEOIN_CTRLSEL_CT_EXPOSURE_TIME_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x04)
375#define VRDE_VIDEOIN_CTRLSEL_CT_EXPOSURE_TIME_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x05)
376#define VRDE_VIDEOIN_CTRLSEL_CT_FOCUS_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x06)
377#define VRDE_VIDEOIN_CTRLSEL_CT_FOCUS_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x07)
378#define VRDE_VIDEOIN_CTRLSEL_CT_FOCUS_AUTO VRDE_VIDEOIN_CTRLSEL_CT(0x08)
379#define VRDE_VIDEOIN_CTRLSEL_CT_IRIS_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x09)
380#define VRDE_VIDEOIN_CTRLSEL_CT_IRIS_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x0A)
381#define VRDE_VIDEOIN_CTRLSEL_CT_ZOOM_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x0B)
382#define VRDE_VIDEOIN_CTRLSEL_CT_ZOOM_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x0C)
383#define VRDE_VIDEOIN_CTRLSEL_CT_PANTILT_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x0D)
384#define VRDE_VIDEOIN_CTRLSEL_CT_PANTILT_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x0E)
385#define VRDE_VIDEOIN_CTRLSEL_CT_ROLL_ABSOLUTE VRDE_VIDEOIN_CTRLSEL_CT(0x0F)
386#define VRDE_VIDEOIN_CTRLSEL_CT_ROLL_RELATIVE VRDE_VIDEOIN_CTRLSEL_CT(0x10)
387#define VRDE_VIDEOIN_CTRLSEL_CT_PRIVACY VRDE_VIDEOIN_CTRLSEL_CT(0x11)
388
389#define VRDE_VIDEOIN_CTRLSEL_PU_UNDEFINED VRDE_VIDEOIN_CTRLSEL_PU(0x00)
390#define VRDE_VIDEOIN_CTRLSEL_PU_BACKLIGHT_COMPENSATION VRDE_VIDEOIN_CTRLSEL_PU(0x01)
391#define VRDE_VIDEOIN_CTRLSEL_PU_BRIGHTNESS VRDE_VIDEOIN_CTRLSEL_PU(0x02)
392#define VRDE_VIDEOIN_CTRLSEL_PU_CONTRAST VRDE_VIDEOIN_CTRLSEL_PU(0x03)
393#define VRDE_VIDEOIN_CTRLSEL_PU_GAIN VRDE_VIDEOIN_CTRLSEL_PU(0x04)
394#define VRDE_VIDEOIN_CTRLSEL_PU_POWER_LINE_FREQUENCY VRDE_VIDEOIN_CTRLSEL_PU(0x05)
395#define VRDE_VIDEOIN_CTRLSEL_PU_HUE VRDE_VIDEOIN_CTRLSEL_PU(0x06)
396#define VRDE_VIDEOIN_CTRLSEL_PU_SATURATION VRDE_VIDEOIN_CTRLSEL_PU(0x07)
397#define VRDE_VIDEOIN_CTRLSEL_PU_SHARPNESS VRDE_VIDEOIN_CTRLSEL_PU(0x08)
398#define VRDE_VIDEOIN_CTRLSEL_PU_GAMMA VRDE_VIDEOIN_CTRLSEL_PU(0x09)
399#define VRDE_VIDEOIN_CTRLSEL_PU_WHITE_BALANCE_TEMPERATURE VRDE_VIDEOIN_CTRLSEL_PU(0x0A)
400#define VRDE_VIDEOIN_CTRLSEL_PU_WHITE_BALANCE_TEMPERATURE_AUTO VRDE_VIDEOIN_CTRLSEL_PU(0x0B)
401#define VRDE_VIDEOIN_CTRLSEL_PU_WHITE_BALANCE_COMPONENT VRDE_VIDEOIN_CTRLSEL_PU(0x0C)
402#define VRDE_VIDEOIN_CTRLSEL_PU_WHITE_BALANCE_COMPONENT_AUTO VRDE_VIDEOIN_CTRLSEL_PU(0x0D)
403#define VRDE_VIDEOIN_CTRLSEL_PU_DIGITAL_MULTIPLIER VRDE_VIDEOIN_CTRLSEL_PU(0x0E)
404#define VRDE_VIDEOIN_CTRLSEL_PU_DIGITAL_MULTIPLIER_LIMIT VRDE_VIDEOIN_CTRLSEL_PU(0x0F)
405#define VRDE_VIDEOIN_CTRLSEL_PU_HUE_AUTO VRDE_VIDEOIN_CTRLSEL_PU(0x10)
406#define VRDE_VIDEOIN_CTRLSEL_PU_ANALOG_VIDEO_STANDARD VRDE_VIDEOIN_CTRLSEL_PU(0x11)
407#define VRDE_VIDEOIN_CTRLSEL_PU_ANALOG_LOCK_STATUS VRDE_VIDEOIN_CTRLSEL_PU(0x12)
408
409#define VRDE_VIDEOIN_CTRLSEL_VS_UNDEFINED VRDE_VIDEOIN_CTRLSEL_VS(0x00)
410#define VRDE_VIDEOIN_CTRLSEL_VS_SETUP VRDE_VIDEOIN_CTRLSEL_VS(0x01)
411#define VRDE_VIDEOIN_CTRLSEL_VS_OFF VRDE_VIDEOIN_CTRLSEL_VS(0x02)
412#define VRDE_VIDEOIN_CTRLSEL_VS_ON VRDE_VIDEOIN_CTRLSEL_VS(0x03)
413#define VRDE_VIDEOIN_CTRLSEL_VS_STILL_IMAGE_TRIGGER VRDE_VIDEOIN_CTRLSEL_VS(0x05)
414#define VRDE_VIDEOIN_CTRLSEL_VS_STREAM_ERROR_CODE VRDE_VIDEOIN_CTRLSEL_VS(0x06)
415#define VRDE_VIDEOIN_CTRLSEL_VS_GENERATE_KEY_FRAME VRDE_VIDEOIN_CTRLSEL_VS(0x07)
416#define VRDE_VIDEOIN_CTRLSEL_VS_UPDATE_FRAME_SEGMENT VRDE_VIDEOIN_CTRLSEL_VS(0x08)
417#define VRDE_VIDEOIN_CTRLSEL_VS_SYNCH_DELAY VRDE_VIDEOIN_CTRLSEL_VS(0x09)
418
419#define VRDE_VIDEOIN_CTRLSEL_HW_BUTTON VRDE_VIDEOIN_CTRLSEL_HW(0x01)
420
421#define VRDE_VIDEOIN_CTRLSEL_PROT_PING VRDE_VIDEOIN_CTRLSEL_PROT(0x01)
422#define VRDE_VIDEOIN_CTRLSEL_PROT_SAMPLING VRDE_VIDEOIN_CTRLSEL_PROT(0x02)
423#define VRDE_VIDEOIN_CTRLSEL_PROT_FRAMES VRDE_VIDEOIN_CTRLSEL_PROT(0x03)
424
425typedef struct VRDEVIDEOINCTRL_VIDEO_POWER_MODE
426{
427 VRDEVIDEOINCTRLHDR hdr;
428 uint8_t u8DevicePowerMode;
429} VRDEVIDEOINCTRL_VIDEO_POWER_MODE;
430
431typedef struct VRDEVIDEOINCTRL_CT_SCANNING_MODE
432{
433 VRDEVIDEOINCTRLHDR hdr;
434 uint8_t u8ScanningMode;
435} VRDEVIDEOINCTRL_CT_SCANNING_MODE;
436
437typedef struct VRDEVIDEOINCTRL_CT_AE_MODE
438{
439 VRDEVIDEOINCTRLHDR hdr;
440 uint8_t u8AutoExposureMode;
441} VRDEVIDEOINCTRL_CT_AE_MODE;
442
443typedef struct VRDEVIDEOINCTRL_CT_AE_PRIORITY
444{
445 VRDEVIDEOINCTRLHDR hdr;
446 uint8_t u8AutoExposurePriority;
447} VRDEVIDEOINCTRL_CT_AE_PRIORITY;
448
449typedef struct VRDEVIDEOINCTRL_CT_EXPOSURE_TIME_ABSOLUTE
450{
451 VRDEVIDEOINCTRLHDR hdr;
452 uint32_t u32ExposureTimeAbsolute;
453} VRDEVIDEOINCTRL_CT_EXPOSURE_TIME_ABSOLUTE;
454
455typedef struct VRDEVIDEOINCTRL_CT_EXPOSURE_TIME_RELATIVE
456{
457 VRDEVIDEOINCTRLHDR hdr;
458 uint8_t u8ExposureTimeRelative;
459} VRDEVIDEOINCTRL_CT_EXPOSURE_TIME_RELATIVE;
460
461typedef struct VRDEVIDEOINCTRL_CT_FOCUS_ABSOLUTE
462{
463 VRDEVIDEOINCTRLHDR hdr;
464 uint16_t u16FocusAbsolute;
465} VRDEVIDEOINCTRL_CT_FOCUS_ABSOLUTE;
466
467typedef struct VRDEVIDEOINCTRL_CT_FOCUS_RELATIVE
468{
469 VRDEVIDEOINCTRLHDR hdr;
470 uint8_t u8FocusRelative;
471 uint8_t u8Speed;
472} VRDEVIDEOINCTRL_CT_FOCUS_RELATIVE;
473
474typedef struct VRDEVIDEOINCTRL_CT_FOCUS_AUTO
475{
476 VRDEVIDEOINCTRLHDR hdr;
477 uint8_t u8FocusAuto;
478} VRDEVIDEOINCTRL_CT_FOCUS_AUTO;
479
480typedef struct VRDEVIDEOINCTRL_CT_IRIS_ABSOLUTE
481{
482 VRDEVIDEOINCTRLHDR hdr;
483 uint16_t u16IrisAbsolute;
484} VRDEVIDEOINCTRL_CT_IRIS_ABSOLUTE;
485
486typedef struct VRDEVIDEOINCTRL_CT_IRIS_RELATIVE
487{
488 VRDEVIDEOINCTRLHDR hdr;
489 uint8_t u8IrisRelative;
490} VRDEVIDEOINCTRL_CT_IRIS_RELATIVE;
491
492typedef struct VRDEVIDEOINCTRL_CT_ZOOM_ABSOLUTE
493{
494 VRDEVIDEOINCTRLHDR hdr;
495 uint16_t u16ZoomAbsolute;
496} VRDEVIDEOINCTRL_CT_ZOOM_ABSOLUTE;
497
498typedef struct VRDEVIDEOINCTRL_CT_ZOOM_RELATIVE
499{
500 VRDEVIDEOINCTRLHDR hdr;
501 uint8_t u8Zoom;
502 uint8_t u8DigitalZoom;
503 uint8_t u8Speed;
504} VRDEVIDEOINCTRL_CT_ZOOM_RELATIVE;
505
506typedef struct VRDEVIDEOINCTRL_CT_PANTILT_ABSOLUTE
507{
508 VRDEVIDEOINCTRLHDR hdr;
509 uint32_t u32PanAbsolute;
510 uint32_t u32TiltAbsolute;
511} VRDEVIDEOINCTRL_CT_PANTILT_ABSOLUTE;
512
513typedef struct VRDEVIDEOINCTRL_CT_PANTILT_RELATIVE
514{
515 VRDEVIDEOINCTRLHDR hdr;
516 uint8_t u8PanRelative;
517 uint8_t u8PanSpeed;
518 uint8_t u8TiltRelative;
519 uint8_t u8TiltSpeed;
520} VRDEVIDEOINCTRL_CT_PANTILT_RELATIVE;
521
522typedef struct VRDEVIDEOINCTRL_CT_ROLL_ABSOLUTE
523{
524 VRDEVIDEOINCTRLHDR hdr;
525 uint16_t u16RollAbsolute;
526} VRDEVIDEOINCTRL_CT_ROLL_ABSOLUTE;
527
528typedef struct VRDEVIDEOINCTRL_CT_ROLL_RELATIVE
529{
530 VRDEVIDEOINCTRLHDR hdr;
531 uint8_t u8RollRelative;
532 uint8_t u8Speed;
533} VRDEVIDEOINCTRL_CT_ROLL_RELATIVE;
534
535typedef struct VRDEVIDEOINCTRL_CT_PRIVACY_MODE
536{
537 VRDEVIDEOINCTRLHDR hdr;
538 uint8_t u8Privacy;
539} VRDEVIDEOINCTRL_CT_PRIVACY_MODE;
540
541typedef struct VRDEVIDEOINCTRL_PU_BACKLIGHT_COMPENSATION
542{
543 VRDEVIDEOINCTRLHDR hdr;
544 uint16_t u16BacklightCompensation;
545} VRDEVIDEOINCTRL_PU_BACKLIGHT_COMPENSATION;
546
547typedef struct VRDEVIDEOINCTRL_PU_BRIGHTNESS
548{
549 VRDEVIDEOINCTRLHDR hdr;
550 uint16_t u16Brightness;
551} VRDEVIDEOINCTRL_PU_BRIGHTNESS;
552
553typedef struct VRDEVIDEOINCTRL_PU_CONTRAST
554{
555 VRDEVIDEOINCTRLHDR hdr;
556 uint16_t u16Contrast;
557} VRDEVIDEOINCTRL_PU_CONTRAST;
558
559typedef struct VRDEVIDEOINCTRL_PU_GAIN
560{
561 VRDEVIDEOINCTRLHDR hdr;
562 uint16_t u16Gain;
563} VRDEVIDEOINCTRL_PU_GAIN;
564
565typedef struct VRDEVIDEOINCTRL_PU_POWER_LINE_FREQUENCY
566{
567 VRDEVIDEOINCTRLHDR hdr;
568 uint16_t u16PowerLineFrequency;
569} VRDEVIDEOINCTRL_PU_POWER_LINE_FREQUENCY;
570
571typedef struct VRDEVIDEOINCTRL_PU_HUE
572{
573 VRDEVIDEOINCTRLHDR hdr;
574 uint16_t u16Hue;
575} VRDEVIDEOINCTRL_PU_HUE;
576
577typedef struct VRDEVIDEOINCTRL_PU_HUE_AUTO
578{
579 VRDEVIDEOINCTRLHDR hdr;
580 uint8_t u8HueAuto;
581} VRDEVIDEOINCTRL_PU_HUE_AUTO;
582
583typedef struct VRDEVIDEOINCTRL_PU_SATURATION
584{
585 VRDEVIDEOINCTRLHDR hdr;
586 uint16_t u16Saturation;
587} VRDEVIDEOINCTRL_PU_SATURATION;
588
589typedef struct VRDEVIDEOINCTRL_PU_SHARPNESS
590{
591 VRDEVIDEOINCTRLHDR hdr;
592 uint16_t u16Sharpness;
593} VRDEVIDEOINCTRL_PU_SHARPNESS;
594
595typedef struct VRDEVIDEOINCTRL_PU_GAMMA
596{
597 VRDEVIDEOINCTRLHDR hdr;
598 uint16_t u16Gamma;
599} VRDEVIDEOINCTRL_PU_GAMMA;
600
601typedef struct VRDEVIDEOINCTRL_PU_WHITE_BALANCE_TEMPERATURE
602{
603 VRDEVIDEOINCTRLHDR hdr;
604 uint16_t u16WhiteBalanceTemperature;
605} VRDEVIDEOINCTRL_PU_WHITE_BALANCE_TEMPERATURE;
606
607typedef struct VRDEVIDEOINCTRL_PU_WHITE_BALANCE_TEMPERATURE_AUTO
608{
609 VRDEVIDEOINCTRLHDR hdr;
610 uint8_t u8WhiteBalanceTemperatureAuto;
611} VRDEVIDEOINCTRL_PU_WHITE_BALANCE_TEMPERATURE_AUTO;
612
613typedef struct VRDEVIDEOINCTRL_PU_WHITE_BALANCE_COMPONENT
614{
615 VRDEVIDEOINCTRLHDR hdr;
616 uint16_t u16WhiteBalanceBlue;
617 uint16_t u16WhiteBalanceRed;
618} VRDEVIDEOINCTRL_PU_WHITE_BALANCE_COMPONENT;
619
620typedef struct VRDEVIDEOINCTRL_PU_WHITE_BALANCE_COMPONENT_AUTO
621{
622 VRDEVIDEOINCTRLHDR hdr;
623 uint8_t u8WhiteBalanceComponentAuto;
624} VRDEVIDEOINCTRL_PU_WHITE_BALANCE_COMPONENT_AUTO;
625
626typedef struct VRDEVIDEOINCTRL_PU_DIGITAL_MULTIPLIER
627{
628 VRDEVIDEOINCTRLHDR hdr;
629 uint16_t u16MultiplierStep;
630} VRDEVIDEOINCTRL_PU_DIGITAL_MULTIPLIER;
631
632typedef struct VRDEVIDEOINCTRL_PU_DIGITAL_MULTIPLIER_LIMIT
633{
634 VRDEVIDEOINCTRLHDR hdr;
635 uint16_t u16MultiplierLimit;
636} VRDEVIDEOINCTRL_PU_DIGITAL_MULTIPLIER_LIMIT;
637
638typedef struct VRDEVIDEOINCTRL_PU_ANALOG_VIDEO_STANDARD
639{
640 VRDEVIDEOINCTRLHDR hdr;
641 uint8_t u8VideoStandard;
642} VRDEVIDEOINCTRL_PU_ANALOG_VIDEO_STANDARD;
643
644typedef struct VRDEVIDEOINCTRL_PU_ANALOG_LOCK_STATUS
645{
646 VRDEVIDEOINCTRLHDR hdr;
647 uint8_t u8Status;
648} VRDEVIDEOINCTRL_PU_ANALOG_LOCK_STATUS;
649
650/* Set streaming parameters. The actual streaming will be enabled by VS_ON. */
651#define VRDEVIDEOINCTRL_F_VS_SETUP_FID 0x01
652#define VRDEVIDEOINCTRL_F_VS_SETUP_EOF 0x02
653
654typedef struct VRDEVIDEOINCTRL_VS_SETUP
655{
656 VRDEVIDEOINCTRLHDR hdr;
657 uint8_t u8FormatId; /* The format id on the client: VRDEVIDEOINFORMATDESC::u8FormatId. */
658 uint8_t u8FramingInfo; /* VRDEVIDEOINCTRL_F_VS_SETUP_*. Set by the client. */
659 uint16_t u16Width;
660 uint16_t u16Height;
661 uint32_t u32FrameInterval; /* Frame interval in 100 ns units, 0 means a still image capture.
662 * The client may choose a different interval if this value is
663 * not supported.
664 */
665 uint16_t u16CompQuality; /* 0 .. 10000 = 0 .. 100%.
666 * Applicable if the format has VRDE_VIDEOIN_F_FMT_COMPQUALITY,
667 * otherwise this field is ignored.
668 */
669 uint16_t u16Delay; /* Latency in ms from video data capture to presentation on the channel.
670 * Set by the client, read by the server.
671 */
672 uint32_t u32ClockFrequency; /* @todo just all clocks in 100ns units? */
673} VRDEVIDEOINCTRL_VS_SETUP;
674
675/* Stop sending video frames. */
676typedef struct VRDEVIDEOINCTRL_VS_OFF
677{
678 VRDEVIDEOINCTRLHDR hdr;
679} VRDEVIDEOINCTRL_VS_OFF;
680
681/* Start sending video frames with parameters set by VS_SETUP. */
682typedef struct VRDEVIDEOINCTRL_VS_ON
683{
684 VRDEVIDEOINCTRLHDR hdr;
685} VRDEVIDEOINCTRL_VS_ON;
686
687typedef struct VRDEVIDEOINCTRL_VS_STILL_IMAGE_TRIGGER
688{
689 VRDEVIDEOINCTRLHDR hdr;
690 uint8_t u8Trigger;
691} VRDEVIDEOINCTRL_VS_STILL_IMAGE_TRIGGER;
692
693typedef struct VRDEVIDEOINCTRL_VS_STREAM_ERROR_CODE
694{
695 VRDEVIDEOINCTRLHDR hdr;
696 uint8_t u8StreamErrorCode;
697} VRDEVIDEOINCTRL_VS_STREAM_ERROR_CODE;
698
699typedef struct VRDEVIDEOINCTRL_VS_GENERATE_KEY_FRAME
700{
701 VRDEVIDEOINCTRLHDR hdr;
702 uint8_t u8GenerateKeyFrame;
703} VRDEVIDEOINCTRL_VS_GENERATE_KEY_FRAME;
704
705typedef struct VRDEVIDEOINCTRL_VS_UPDATE_FRAME_SEGMENT
706{
707 VRDEVIDEOINCTRLHDR hdr;
708 uint8_t u8StartFrameSegment;
709 uint8_t u8EndFrameSegment;
710} VRDEVIDEOINCTRL_VS_UPDATE_FRAME_SEGMENT;
711
712typedef struct VRDEVIDEOINCTRL_VS_SYNCH_DELAY
713{
714 VRDEVIDEOINCTRLHDR hdr;
715 uint16_t u16Delay;
716} VRDEVIDEOINCTRL_VS_SYNCH_DELAY;
717
718/* A hardware button was pressed/released on the device. */
719typedef struct VRDEVIDEOINCTRL_HW_BUTTON
720{
721 VRDEVIDEOINCTRLHDR hdr;
722 uint8_t u8Pressed;
723} VRDEVIDEOINCTRL_HW_BUTTON;
724
725typedef struct VRDEVIDEOINCTRL_PROT_PING
726{
727 VRDEVIDEOINCTRLHDR hdr;
728 uint32_t u32Timestamp; /* Set in the request and the same value must be send back in the response. */
729} VRDEVIDEOINCTRL_PROT_PING;
730
731typedef struct VRDEVIDEOINCTRL_PROT_SAMPLING
732{
733 VRDEVIDEOINCTRLHDR hdr;
734 uint32_t fu32SampleStart; /* Which parameters must be sampled VRDEVIDEOINCTRL_F_PROT_SAMPLING_*. */
735 uint32_t fu32SampleStop; /* Which parameters to disable VRDEVIDEOINCTRL_F_PROT_SAMPLING_*.
736 * If both Start and Stop is set, then restart the sampling.
737 */
738 uint32_t u32PeriodMS; /* Sampling period in milliseconds. Applies to all samples in fu32SampleStart.
739 * Not mandatory, the actual sampling period may be different.
740 */
741} VRDEVIDEOINCTRL_PROT_SAMPLING;
742
743#define VRDEVIDEOINCTRL_F_PROT_SAMPLING_FRAMES_SOURCE 0x00000001 /* Periodic VRDEVIDEOINCTRL_PROT_FRAMES samples */
744#define VRDEVIDEOINCTRL_F_PROT_SAMPLING_FRAMES_CLIENT_OUT 0x00000002 /* Periodic VRDEVIDEOINCTRL_PROT_FRAMES samples */
745
746typedef struct VRDEVIDEOINCTRL_PROT_FRAMES
747{
748 VRDEVIDEOINCTRLHDR hdr; /* Note: the message should be sent as VRDE_VIDEOIN_FN_CONTROL_NOTIFY. */
749 uint32_t u32Sample; /* Which sample is this, one of VRDEVIDEOINCTRL_F_PROT_SAMPLING_*. */
750 uint32_t u32TimestampMS; /* When the period started, milliseconds since the start of sampling. */
751 uint32_t u32PeriodMS; /* Actual period during which the frames were counted in milliseconds.
752 * This may be different from VRDEVIDEOINCTRL_PROT_SAMPLING::u32PeriodMS.
753 */
754 uint32_t u32FramesCount; /* How many frames per u32PeriodMS milliseconds. */
755} VRDEVIDEOINCTRL_PROT_FRAMES;
756
757
758/*
759 * Payload transfers. How frames are sent to the server:
760 * the client send a PAYLOAD packet, which has the already set format.
761 * The server enables the transfers by sending VRDEVIDEOINCTRL_VS_ON.
762 */
763
764/* Payload header */
765typedef struct VRDEVIDEOINPAYLOADHDR
766{
767 uint8_t u8HeaderLength; /* Entire header. */
768 uint8_t u8HeaderInfo; /* VRDE_VIDEOIN_PAYLOAD_F_* */
769 uint32_t u32PresentationTime; /* @todo define this */
770 uint32_t u32SourceTimeClock; /* @todo At the moment when the frame was sent to the channel.
771 * Allows the server to measure clock drift.
772 */
773 uint16_t u16Reserved; /* @todo */
774} VRDEVIDEOINPAYLOADHDR;
775
776/* VRDEVIDEOINPAYLOADHDR::u8HeaderInfo */
777#define VRDE_VIDEOIN_PAYLOAD_F_FID 0x01 /* Frame ID */
778#define VRDE_VIDEOIN_PAYLOAD_F_EOF 0x02 /* End of Frame */
779#define VRDE_VIDEOIN_PAYLOAD_F_PTS 0x04 /* Presentation Time */
780#define VRDE_VIDEOIN_PAYLOAD_F_SCR 0x08 /* Source Clock Reference */
781#define VRDE_VIDEOIN_PAYLOAD_F_RES 0x10 /* Reserved */
782#define VRDE_VIDEOIN_PAYLOAD_F_STI 0x20 /* Still Image */
783#define VRDE_VIDEOIN_PAYLOAD_F_ERR 0x40 /* Error */
784#define VRDE_VIDEOIN_PAYLOAD_F_EOH 0x80 /* End of header */
785
786
787/*
788 * The network channel specification.
789 */
790
791/*
792 * The protocol uses a dynamic RDP channel.
793 * Everything is little-endian.
794 */
795
796/* The dynamic RDP channel name. */
797#define VRDE_VIDEOIN_CHANNEL "RVIDEOIN"
798
799/* Major functions. */
800#define VRDE_VIDEOIN_FN_NEGOTIATE 0x0000 /* Version and capabilities check. */
801#define VRDE_VIDEOIN_FN_NOTIFY 0x0001 /* Device attach/detach from the client. */
802#define VRDE_VIDEOIN_FN_DEVICEDESC 0x0002 /* Query device description. */
803#define VRDE_VIDEOIN_FN_CONTROL 0x0003 /* Control the device and start/stop video input.
804 * This function is used for sending a request and
805 * the corresponding response.
806 */
807#define VRDE_VIDEOIN_FN_CONTROL_NOTIFY 0x0004 /* The client reports a control change, etc.
808 * This function indicated that the message is
809 * not a response to a CONTROL request.
810 */
811#define VRDE_VIDEOIN_FN_FRAME 0x0005 /* Frame from the client. */
812
813/* Status codes. */
814#define VRDE_VIDEOIN_STATUS_SUCCESS 0 /* Function completed successfully. */
815#define VRDE_VIDEOIN_STATUS_FAILED 1 /* Failed for some reason. */
816
817typedef struct VRDEVIDEOINMSGHDR
818{
819 uint32_t u32Length; /* The length of the message in bytes, including the header. */
820 uint32_t u32DeviceId; /* The client's device id. */
821 uint32_t u32MessageId; /* Unique id assigned by the server. The client must send a reply with the same id.
822 * If the client initiates a request, then this must be set to 0, because there is
823 * currently no client requests, which would require a response from the server.
824 */
825 uint16_t u16FunctionId; /* VRDE_VIDEOIN_FN_* */
826 uint16_t u16Status; /* The result of a request. VRDE_VIDEOIN_STATUS_*. */
827} VRDEVIDEOINMSGHDR;
828ASSERTSIZE(VRDEVIDEOINMSGHDR, 16)
829
830/*
831 * VRDE_VIDEOIN_FN_NEGOTIATE
832 *
833 * Sent by the server when the channel is established and the client replies with its capabilities.
834 */
835#define VRDE_VIDEOIN_NEGOTIATE_VERSION 1
836
837/* VRDEVIDEOINMSG_NEGOTIATE::fu32Capabilities */
838#define VRDE_VIDEOIN_NEGOTIATE_CAP_VOID 0x00000000
839#define VRDE_VIDEOIN_NEGOTIATE_CAP_PROT 0x00000001 /* Supports VRDE_VIDEOIN_CTRLSEL_PROT_* controls. */
840
841typedef struct VRDEVIDEOINMSG_NEGOTIATE
842{
843 VRDEVIDEOINMSGHDR hdr;
844 uint32_t u32Version; /* VRDE_VIDEOIN_NEGOTIATE_VERSION */
845 uint32_t fu32Capabilities; /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */
846} VRDEVIDEOINMSG_NEGOTIATE;
847
848/*
849 * VRDE_VIDEOIN_FN_NOTIFY
850 *
851 * Sent by the client when a webcam is attached or detached.
852 * The client must send the ATTACH notification for each webcam, which is
853 * already connected to the client when the VIDEOIN channel is established.
854 */
855#define VRDE_VIDEOIN_NOTIFY_EVENT_ATTACH 0
856#define VRDE_VIDEOIN_NOTIFY_EVENT_DETACH 1
857#define VRDE_VIDEOIN_NOTIFY_EVENT_NEGOTIATE 2 /* Negotiate again with the client. */
858
859typedef struct VRDEVIDEOINMSG_NOTIFY
860{
861 VRDEVIDEOINMSGHDR hdr;
862 uint32_t u32NotifyEvent; /* VRDE_VIDEOIN_NOTIFY_EVENT_* */
863 /* Event specific data may follow. The underlying protocol provides the length of the message. */
864} VRDEVIDEOINMSG_NOTIFY;
865
866/*
867 * VRDE_VIDEOIN_FN_DEVICEDESC
868 *
869 * The server queries the description of a device.
870 */
871typedef struct VRDEVIDEOINMSG_DEVICEDESC_REQ
872{
873 VRDEVIDEOINMSGHDR hdr;
874} VRDEVIDEOINMSG_DEVICEDESC_REQ;
875
876typedef struct VRDEVIDEOINMSG_DEVICEDESC_RSP
877{
878 VRDEVIDEOINMSGHDR hdr;
879 VRDEVIDEOINDEVICEDESC Device;
880 /*
881 * VRDEVIDEOINFORMATDESC[0]
882 * VRDEVIDEOINFRAMEDESC[0]
883 * ...
884 * VRDEVIDEOINFRAMEDESC[n]
885 * VRDEVIDEOINFORMATDESC[1]
886 * VRDEVIDEOINFRAMEDESC[0]
887 * ...
888 * VRDEVIDEOINFRAMEDESC[m]
889 * ...
890 */
891} VRDEVIDEOINMSG_DEVICEDESC_RSP;
892
893/*
894 * VRDE_VIDEOIN_FN_CONTROL
895 * VRDE_VIDEOIN_FN_CONTROL_NOTIFY
896 *
897 * Either sent by the server or by the client as a notification/response.
898 * If sent by the client as a notification, then hdr.u32MessageId must be 0.
899 */
900typedef struct VRDEVIDEOINMSG_CONTROL
901{
902 VRDEVIDEOINMSGHDR hdr;
903 VRDEVIDEOINCTRLHDR Control;
904 /* Control specific data may follow. */
905} VRDEVIDEOINMSG_CONTROL;
906
907/*
908 * VRDE_VIDEOIN_FN_FRAME
909 *
910 * The client sends a video/still frame in the already specified format.
911 * hdr.u32MessageId must be 0.
912 */
913typedef struct VRDEVIDEOINMSG_FRAME
914{
915 VRDEVIDEOINMSGHDR hdr;
916 VRDEVIDEOINPAYLOADHDR Payload;
917 /* The frame data follow. */
918} VRDEVIDEOINMSG_FRAME;
919
920
921#ifdef VRDE_VIDEOIN_WITH_VRDEINTERFACE
922/*
923 * The application interface between VirtualBox and the VRDE server.
924 */
925
926#define VRDE_VIDEOIN_INTERFACE_NAME "VIDEOIN"
927
928typedef struct VRDEVIDEOINDEVICEHANDLE
929{
930 uint32_t u32ClientId;
931 uint32_t u32DeviceId;
932} VRDEVIDEOINDEVICEHANDLE;
933
934/* The VRDE server video input interface entry points. Interface version 1. */
935typedef struct VRDEVIDEOININTERFACE
936{
937 /* The header. */
938 VRDEINTERFACEHDR header;
939
940 /* Tell the server that this device will be used and associate a context with the device.
941 *
942 * @param hServer The VRDE server instance.
943 * @param pDeviceHandle The device reported by ATTACH notification.
944 * @param pvDeviceCtx The caller context associated with the pDeviceHandle.
945 *
946 * @return IPRT status code.
947 */
948 DECLR3CALLBACKMEMBER(int, VRDEVideoInDeviceAttach, (HVRDESERVER hServer,
949 const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle,
950 void *pvDeviceCtx));
951
952 /* This device will be not be used anymore. The device context must not be used by the server too.
953 *
954 * @param hServer The VRDE server instance.
955 * @param pDeviceHandle The device reported by ATTACH notification.
956 *
957 * @return IPRT status code.
958 */
959 DECLR3CALLBACKMEMBER(int, VRDEVideoInDeviceDetach, (HVRDESERVER hServer,
960 const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle));
961
962 /* Get a device description.
963 *
964 * @param hServer The VRDE server instance.
965 * @param pvUser The callers context of this request.
966 * @param pDeviceHandle The device reported by ATTACH notification.
967 *
968 * @return IPRT status code.
969 */
970 DECLR3CALLBACKMEMBER(int, VRDEVideoInGetDeviceDesc, (HVRDESERVER hServer,
971 void *pvUser,
972 const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle));
973
974 /* Submit a set/get control request.
975 *
976 * @param hServer The VRDE server instance.
977 * @param pvUser The callers context of this request.
978 * @param pDeviceHandle The device reported by ATTACH notification.
979 * @param pReq The request.
980 * @param cbReq Size of the request.
981 *
982 * @return IPRT status code.
983 */
984 DECLR3CALLBACKMEMBER(int, VRDEVideoInControl, (HVRDESERVER hServer,
985 void *pvUser,
986 const VRDEVIDEOINDEVICEHANDLE *pDeviceHandle,
987 const VRDEVIDEOINCTRLHDR *pReq,
988 uint32_t cbReq));
989
990} VRDEVIDEOININTERFACE;
991
992
993/*
994 * Notifications.
995 * Data structures: pvData of VRDEVIDEOINCALLBACKS::VRDECallbackVideoInNotify.
996 */
997typedef struct VRDEVIDEOINNOTIFYATTACH
998{
999 VRDEVIDEOINDEVICEHANDLE deviceHandle;
1000 uint32_t u32Version; /* VRDE_VIDEOIN_NEGOTIATE_VERSION */
1001 uint32_t fu32Capabilities; /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */
1002} VRDEVIDEOINNOTIFYATTACH;
1003
1004typedef struct VRDEVIDEOINNOTIFYDETACH
1005{
1006 VRDEVIDEOINDEVICEHANDLE deviceHandle;
1007} VRDEVIDEOINNOTIFYDETACH;
1008
1009/* Notification codes, */
1010#define VRDE_VIDEOIN_NOTIFY_ID_ATTACH 0
1011#define VRDE_VIDEOIN_NOTIFY_ID_DETACH 1
1012
1013
1014/* Video input interface callbacks. */
1015typedef struct VRDEVIDEOINCALLBACKS
1016{
1017 /* The header. */
1018 VRDEINTERFACEHDR header;
1019
1020 /* Notifications.
1021 *
1022 * @param pvCallback The callbacks context specified in VRDEGetInterface.
1023 * @param u32EventId The notification identifier: VRDE_VIDEOIN_NOTIFY_*.
1024 * @param pvData The notification specific data.
1025 * @param cbData The size of buffer pointed by pvData.
1026 */
1027 DECLR3CALLBACKMEMBER(void, VRDECallbackVideoInNotify,(void *pvCallback,
1028 uint32_t u32Id,
1029 const void *pvData,
1030 uint32_t cbData));
1031
1032 /* Device description received from the client.
1033 *
1034 * @param pvCallback The callbacks context specified in VRDEGetInterface.
1035 * @param rcRequest The result code of the request.
1036 * @param pDeviceCtx The device context associated with the device in VRDEVideoInGetDeviceDesc.
1037 * @param pvUser The pvUser parameter of VRDEVideoInGetDeviceDesc.
1038 * @param pDeviceDesc The device description.
1039 * @param cbDeviceDesc The size of buffer pointed by pDevice.
1040 */
1041 DECLR3CALLBACKMEMBER(void, VRDECallbackVideoInDeviceDesc,(void *pvCallback,
1042 int rcRequest,
1043 void *pDeviceCtx,
1044 void *pvUser,
1045 const VRDEVIDEOINDEVICEDESC *pDeviceDesc,
1046 uint32_t cbDeviceDesc));
1047
1048 /* Control response or notification.
1049 *
1050 * @param pvCallback The callbacks context specified in VRDEGetInterface.
1051 * @param rcRequest The result code of the request.
1052 * @param pDeviceCtx The device context associated with the device in VRDEVideoInGetDeviceDesc.
1053 * @param pvUser The pvUser parameter of VRDEVideoInControl. NULL if this is a notification.
1054 * @param pControl The control information.
1055 * @param cbControl The size of buffer pointed by pControl.
1056 */
1057 DECLR3CALLBACKMEMBER(void, VRDECallbackVideoInControl,(void *pvCallback,
1058 int rcRequest,
1059 void *pDeviceCtx,
1060 void *pvUser,
1061 const VRDEVIDEOINCTRLHDR *pControl,
1062 uint32_t cbControl));
1063
1064 /* Frame which was received from the client.
1065 *
1066 * @param pvCallback The callbacks context specified in VRDEGetInterface.
1067 * @param rcRequest The result code of the request.
1068 * @param pDeviceCtx The device context associated with the device in VRDEVideoInGetDeviceDesc.
1069 * @param pFrame The frame data.
1070 * @param cbFrame The size of buffer pointed by pFrame.
1071 */
1072 DECLR3CALLBACKMEMBER(void, VRDECallbackVideoInFrame,(void *pvCallback,
1073 int rcRequest,
1074 void *pDeviceCtx,
1075 const VRDEVIDEOINPAYLOADHDR *pFrame,
1076 uint32_t cbFrame));
1077
1078} VRDEVIDEOINCALLBACKS;
1079#endif /* VRDE_VIDEOIN_WITH_VRDEINTERFACE */
1080
1081#pragma pack()
1082
1083#endif /* !VBOX_INCLUDED_RemoteDesktop_VRDEVideoIn_h */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette