video_capture_types.mojom 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. module media.mojom;
  5. import "mojo/public/mojom/base/time.mojom";
  6. import "ui/gfx/geometry/mojom/geometry.mojom";
  7. [Stable, Extensible]
  8. enum VideoCapturePixelFormat {
  9. UNKNOWN,
  10. I420,
  11. YV12,
  12. I422,
  13. I420A,
  14. I444,
  15. NV12,
  16. NV21,
  17. UYVY,
  18. YUY2,
  19. ARGB,
  20. XRGB,
  21. RGB24,
  22. MJPEG,
  23. YUV420P9,
  24. YUV420P10,
  25. YUV422P9,
  26. YUV422P10,
  27. YUV444P9,
  28. YUV444P10,
  29. YUV420P12,
  30. YUV422P12,
  31. YUV444P12,
  32. Y16,
  33. ABGR,
  34. XBGR,
  35. P016LE,
  36. XR30,
  37. XB30,
  38. BGRA,
  39. RGBAF16,
  40. [MinVersion=1] I422A,
  41. [MinVersion=1] I444A,
  42. [MinVersion=1] YUV420AP10,
  43. [MinVersion=1] YUV422AP10,
  44. [MinVersion=1] YUV444AP10,
  45. };
  46. [Stable, Extensible]
  47. enum ResolutionChangePolicy {
  48. FIXED_RESOLUTION,
  49. FIXED_ASPECT_RATIO,
  50. ANY_WITHIN_LIMIT,
  51. };
  52. [Stable, Extensible]
  53. enum PowerLineFrequency {
  54. DEFAULT,
  55. HZ_50,
  56. HZ_60
  57. };
  58. [Stable, Extensible]
  59. enum VideoFacingMode {
  60. NONE,
  61. USER,
  62. ENVIRONMENT
  63. };
  64. [Stable, Extensible]
  65. enum VideoCaptureApi {
  66. LINUX_V4L2_SINGLE_PLANE,
  67. WIN_MEDIA_FOUNDATION,
  68. WIN_MEDIA_FOUNDATION_SENSOR,
  69. WIN_DIRECT_SHOW,
  70. MACOSX_AVFOUNDATION,
  71. MACOSX_DECKLINK,
  72. ANDROID_API1,
  73. ANDROID_API2_LEGACY,
  74. ANDROID_API2_FULL,
  75. ANDROID_API2_LIMITED,
  76. FUCHSIA_CAMERA3,
  77. VIRTUAL_DEVICE,
  78. UNKNOWN
  79. };
  80. [Stable, Extensible]
  81. enum VideoCaptureTransportType {
  82. // For MACOSX_AVFOUNDATION Api, identifies devices that are built-in or USB.
  83. MACOSX_USB_OR_BUILT_IN,
  84. OTHER_TRANSPORT
  85. };
  86. [Stable, Extensible]
  87. enum VideoCaptureBufferType {
  88. kSharedMemory,
  89. // Warning: This case is a workaround for compatibility with an older version
  90. // of Mojo only and will be deleted as soon as the Mojo version of ChromiumOS
  91. // becomes compatible with the |kSharedMemory|.
  92. // TODO(chfremer): Remove this when https://crbug.com/857537 is resolved.
  93. kSharedMemoryViaRawFileDescriptor,
  94. kMailboxHolder,
  95. kGpuMemoryBuffer
  96. };
  97. // Represents capture device's support for different controls.
  98. [Stable]
  99. struct VideoCaptureControlSupport {
  100. bool pan;
  101. bool tilt;
  102. bool zoom;
  103. };
  104. [Stable, Extensible]
  105. enum VideoCaptureError {
  106. kNone,
  107. kVideoCaptureControllerInvalidOrUnsupportedVideoCaptureParametersRequested,
  108. kVideoCaptureControllerIsAlreadyInErrorState,
  109. kVideoCaptureManagerDeviceConnectionLost,
  110. kFrameSinkVideoCaptureDeviceAlreadyEndedOnFatalError,
  111. kFrameSinkVideoCaptureDeviceEncounteredFatalError,
  112. kV4L2FailedToOpenV4L2DeviceDriverFile,
  113. kV4L2ThisIsNotAV4L2VideoCaptureDevice,
  114. kV4L2FailedToFindASupportedCameraFormat,
  115. kV4L2FailedToSetVideoCaptureFormat,
  116. kV4L2UnsupportedPixelFormat,
  117. kV4L2FailedToSetCameraFramerate,
  118. kV4L2ErrorRequestingMmapBuffers,
  119. kV4L2AllocateBufferFailed,
  120. kV4L2VidiocStreamonFailed,
  121. kV4L2VidiocStreamoffFailed,
  122. kV4L2FailedToVidiocReqbufsWithCount0,
  123. kV4L2PollFailed,
  124. kV4L2MultipleContinuousTimeoutsWhileReadPolling,
  125. kV4L2FailedToDequeueCaptureBuffer,
  126. kV4L2FailedToEnqueueCaptureBuffer,
  127. kSingleClientVideoCaptureHostLostConnectionToDevice,
  128. kSingleClientVideoCaptureDeviceLaunchAborted,
  129. kDesktopCaptureDeviceWebrtcDesktopCapturerHasFailed,
  130. kFileVideoCaptureDeviceCouldNotOpenVideoFile,
  131. kDeviceCaptureLinuxFailedToCreateVideoCaptureDelegate,
  132. kErrorFakeDeviceIntentionallyEmittingErrorEvent,
  133. kDeviceClientTooManyFramesDroppedY16,
  134. kDeviceMediaToMojoAdapterEncounteredUnsupportedBufferType,
  135. kVideoCaptureManagerProcessDeviceStartQueueDeviceInfoNotFound,
  136. kInProcessDeviceLauncherFailedToCreateDeviceInstance,
  137. kServiceDeviceLauncherLostConnectionToDeviceFactoryDuringDeviceStart,
  138. kServiceDeviceLauncherServiceRespondedWithDeviceNotFound,
  139. kServiceDeviceLauncherConnectionLostWhileWaitingForCallback,
  140. kIntentionalErrorRaisedByUnitTest,
  141. kCrosHalV3FailedToStartDeviceThread,
  142. kCrosHalV3DeviceDelegateMojoConnectionError,
  143. kCrosHalV3DeviceDelegateFailedToGetCameraInfo,
  144. kCrosHalV3DeviceDelegateMissingSensorOrientationInfo,
  145. kCrosHalV3DeviceDelegateFailedToOpenCameraDevice,
  146. kCrosHalV3DeviceDelegateFailedToInitializeCameraDevice,
  147. kCrosHalV3DeviceDelegateFailedToConfigureStreams,
  148. kCrosHalV3DeviceDelegateWrongNumberOfStreamsConfigured,
  149. kCrosHalV3DeviceDelegateFailedToGetDefaultRequestSettings,
  150. kCrosHalV3BufferManagerHalRequestedTooManyBuffers,
  151. kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer,
  152. kCrosHalV3BufferManagerFailedToMapGpuMemoryBuffer,
  153. kCrosHalV3BufferManagerUnsupportedVideoPixelFormat,
  154. kCrosHalV3BufferManagerFailedToDupFd,
  155. kCrosHalV3BufferManagerFailedToWrapGpuMemoryHandle,
  156. kCrosHalV3BufferManagerFailedToRegisterBuffer,
  157. kCrosHalV3BufferManagerProcessCaptureRequestFailed,
  158. kCrosHalV3BufferManagerInvalidPendingResultId,
  159. kCrosHalV3BufferManagerReceivedDuplicatedPartialMetadata,
  160. kCrosHalV3BufferManagerIncorrectNumberOfOutputBuffersReceived,
  161. kCrosHalV3BufferManagerInvalidTypeOfOutputBuffersReceived,
  162. kCrosHalV3BufferManagerReceivedMultipleResultBuffersForFrame,
  163. kCrosHalV3BufferManagerUnknownStreamInCamera3NotifyMsg,
  164. kCrosHalV3BufferManagerReceivedInvalidShutterTime,
  165. kCrosHalV3BufferManagerFatalDeviceError,
  166. kCrosHalV3BufferManagerReceivedFrameIsOutOfOrder,
  167. kCrosHalV3BufferManagerFailedToUnwrapReleaseFenceFd,
  168. kCrosHalV3BufferManagerSyncWaitOnReleaseFenceTimedOut,
  169. kCrosHalV3BufferManagerInvalidJpegBlob,
  170. kAndroidFailedToAllocate,
  171. kAndroidFailedToStartCapture,
  172. kAndroidFailedToStopCapture,
  173. kAndroidApi1CameraErrorCallbackReceived,
  174. kAndroidApi2CameraDeviceErrorReceived,
  175. kAndroidApi2CaptureSessionConfigureFailed,
  176. kAndroidApi2ImageReaderUnexpectedImageFormat,
  177. kAndroidApi2ImageReaderSizeDidNotMatchImageSize,
  178. kAndroidApi2ErrorRestartingPreview,
  179. kAndroidScreenCaptureUnsupportedFormat,
  180. kAndroidScreenCaptureFailedToStartCaptureMachine,
  181. kAndroidScreenCaptureTheUserDeniedScreenCapture,
  182. kAndroidScreenCaptureFailedToStartScreenCapture,
  183. kWinDirectShowCantGetCaptureFormatSettings,
  184. kWinDirectShowFailedToGetNumberOfCapabilities,
  185. kWinDirectShowFailedToGetCaptureDeviceCapabilities,
  186. kWinDirectShowFailedToSetCaptureDeviceOutputFormat,
  187. kWinDirectShowFailedToConnectTheCaptureGraph,
  188. kWinDirectShowFailedToPauseTheCaptureDevice,
  189. kWinDirectShowFailedToStartTheCaptureDevice,
  190. kWinDirectShowFailedToStopTheCaptureGraph,
  191. kWinMediaFoundationEngineIsNull,
  192. kWinMediaFoundationEngineGetSourceFailed ,
  193. kWinMediaFoundationFillPhotoCapabilitiesFailed ,
  194. kWinMediaFoundationFillVideoCapabilitiesFailed,
  195. kWinMediaFoundationNoVideoCapabilityFound,
  196. kWinMediaFoundationGetAvailableDeviceMediaTypeFailed,
  197. kWinMediaFoundationSetCurrentDeviceMediaTypeFailed,
  198. kWinMediaFoundationEngineGetSinkFailed,
  199. kWinMediaFoundationSinkQueryCapturePreviewInterfaceFailed,
  200. kWinMediaFoundationSinkRemoveAllStreamsFailed,
  201. kWinMediaFoundationCreateSinkVideoMediaTypeFailed,
  202. kWinMediaFoundationConvertToVideoSinkMediaTypeFailed,
  203. kWinMediaFoundationSinkAddStreamFailed,
  204. kWinMediaFoundationSinkSetSampleCallbackFailed,
  205. kWinMediaFoundationEngineStartPreviewFailed,
  206. kWinMediaFoundationGetMediaEventStatusFailed,
  207. kMacSetCaptureDeviceFailed,
  208. kMacCouldNotStartCaptureDevice,
  209. kMacReceivedFrameWithUnexpectedResolution,
  210. kMacUpdateCaptureResolutionFailed,
  211. kMacDeckLinkDeviceIdNotFoundInTheSystem,
  212. kMacDeckLinkErrorQueryingInputInterface,
  213. kMacDeckLinkErrorCreatingDisplayModeIterator,
  214. kMacDeckLinkCouldNotFindADisplayMode,
  215. kMacDeckLinkCouldNotSelectTheVideoFormatWeLike,
  216. kMacDeckLinkCouldNotStartCapturing,
  217. kMacDeckLinkUnsupportedPixelFormat,
  218. kMacAvFoundationReceivedAVCaptureSessionRuntimeErrorNotification,
  219. kAndroidApi2ErrorConfiguringCamera,
  220. kCrosHalV3DeviceDelegateFailedToFlush,
  221. kFuchsiaCameraDeviceDisconnected,
  222. kFuchsiaCameraStreamDisconnected,
  223. kFuchsiaSysmemDidNotSetImageFormat,
  224. kFuchsiaSysmemInvalidBufferIndex,
  225. kFuchsiaSysmemInvalidBufferSize,
  226. kFuchsiaUnsupportedPixelFormat,
  227. kFuchsiaFailedToMapSysmemBuffer,
  228. kCrosHalV3DeviceContextDuplicatedClient,
  229. kDesktopCaptureDeviceMacFailedStreamCreate,
  230. kDesktopCaptureDeviceMacFailedStreamStart,
  231. kCrosHalV3BufferManagerFailedToReserveBuffers,
  232. [MinVersion=1] kWinMediaFoundationSystemPermissionDenied,
  233. [MinVersion=2] kVideoCaptureImplTimedOutOnStart,
  234. [MinVersion=3] kLacrosVideoCaptureDeviceProxyAlreadyEndedOnFatalError,
  235. [MinVersion=3] kLacrosVideoCaptureDeviceProxyEncounteredFatalError,
  236. [MinVersion=4] kScreenCaptureKitFailedGetShareableContent,
  237. [MinVersion=4] kScreenCaptureKitFailedAddStreamOutput,
  238. [MinVersion=4] kScreenCaptureKitFailedStartCapture,
  239. [MinVersion=4] kScreenCaptureKitFailedStopCapture,
  240. [MinVersion=4] kScreenCaptureKitStreamError,
  241. [MinVersion=4] kScreenCaptureKitFailedToFindSCDisplay,
  242. };
  243. [Stable, Extensible]
  244. enum VideoCaptureFrameDropReason {
  245. kNone,
  246. kDeviceClientFrameHasInvalidFormat,
  247. kDeviceClientLibyuvConvertToI420Failed,
  248. kV4L2BufferErrorFlagWasSet,
  249. kV4L2InvalidNumberOfBytesInBuffer,
  250. kAndroidThrottling,
  251. kAndroidGetByteArrayElementsFailed,
  252. kAndroidApi1UnexpectedDataLength,
  253. kAndroidApi2AcquiredImageIsNull,
  254. kWinDirectShowUnexpectedSampleLength,
  255. kWinDirectShowFailedToGetMemoryPointerFromMediaSample,
  256. kWinMediaFoundationReceivedSampleIsNull,
  257. kWinMediaFoundationLockingBufferDelieveredNullptr,
  258. kWinMediaFoundationGetBufferByIndexReturnedNull,
  259. kBufferPoolMaxBufferCountExceeded,
  260. kBufferPoolBufferAllocationFailed,
  261. kVideoCaptureImplNotInStartedState,
  262. kVideoCaptureImplFailedToWrapDataAsMediaVideoFrame,
  263. kVideoTrackAdapterHasNoResolutionAdapters,
  264. kResolutionAdapterFrameIsNotValid,
  265. kResolutionAdapterWrappingFrameForCroppingFailed,
  266. kResolutionAdapterTimestampTooCloseToPrevious,
  267. kResolutionAdapterFrameRateIsHigherThanRequested,
  268. kResolutionAdapterHasNoCallbacks,
  269. kVideoTrackFrameDelivererNotEnabledReplacingWithBlackFrame,
  270. kRendererSinkFrameDelivererIsNotStarted
  271. };
  272. [Stable]
  273. struct VideoCaptureFormat {
  274. gfx.mojom.Size frame_size;
  275. float frame_rate;
  276. VideoCapturePixelFormat pixel_format;
  277. };
  278. [Stable]
  279. struct VideoCaptureParams {
  280. VideoCaptureFormat requested_format;
  281. VideoCaptureBufferType buffer_type;
  282. ResolutionChangePolicy resolution_change_policy;
  283. PowerLineFrequency power_line_frequency;
  284. bool enable_face_detection;
  285. };
  286. [Stable, RenamedFrom="media.mojom.VideoFrameFeedback"]
  287. struct VideoCaptureFeedback {
  288. // Reports that the frame incurred some fractional utilization of the
  289. // downstream pipeline's per-frame processing capacity.
  290. // See code comments in media::base::VideoFrameMetadata for a discussion of
  291. // how utilization is interpreted. The capturer uses this information to
  292. // auto-adjust the capture resolution based on performance variances in the
  293. // live system environment.
  294. // -1.0 means no value present.
  295. double resource_utilization;
  296. // The requested maximum frame-rate, float::inifinty used to signal no limit.
  297. float max_framerate_fps;
  298. // The requested maximum resolution (in sense of image area).
  299. // int::max used to signal no limit.
  300. int32 max_pixels;
  301. // Reports that the consumer needs a cpu readable frame.
  302. // TODO(https://crbug.com/1191986): When |kWebRtcUseModernFrameAdapter| is
  303. // shipped to 100%, |require_mapped_frame| can be removed in favor of checking
  304. // if |mapped_sizes| is non-empty.
  305. bool require_mapped_frame;
  306. // Reports which sizes the video frame got mapped by the consumer for CPU
  307. // access. Only reported when |kWebRtcUseModernFrameAdapter| is enabled.
  308. [MinVersion=1] array<gfx.mojom.Size>? mapped_sizes;
  309. // The frame that this feedback is associated with. Some consumers do not
  310. // break down their analysis on a per-frame basis; while some may expect to
  311. // hear any reports with a particular frame, so they can build a "timeline" of
  312. // performance (e.g. to know if they have recovered). This struct is often
  313. // funneled through multiple layers, so this frame_id may only be used by an
  314. // intermediate layer to help route the feedback accordingly.
  315. // This should usually be set to the same value as the |frame_feedback_id|
  316. // received with the frame (often from a received `ReadyFrameInBuffer`).
  317. [MinVersion=2] int32 frame_id = 0;
  318. // Indicates whether or not the value in |frame_id| is valid.
  319. // TODO(https://crbug.com/657632): Remove this and replace frame_id with an
  320. // optional type.
  321. [MinVersion=2] bool has_frame_id = false;
  322. };
  323. // Contains one stride value per image plane. Stride means the number of bytes
  324. // per row. If the image format uses fewer than kMaxPlanes planes, the values
  325. // for higher plane indices are ignored. For example, for a YUV format, plane
  326. // index 0 corresponds to the Y plane, index 1 to the U plane, and index 2 to
  327. // the V plane.
  328. struct PlaneStrides {
  329. // Size must be kept in sync with media::VideoFrame::kMaxPlanes.
  330. array<uint32, 4> stride_by_plane;
  331. };
  332. // Represents information about a capture device.
  333. // |device_id| represents a unique id of a physical device. Since the same
  334. // physical device may be accessible through different APIs |capture_api|
  335. // disambiguates the API.
  336. [Stable]
  337. struct VideoCaptureDeviceDescriptor {
  338. string display_name;
  339. string device_id;
  340. string model_id;
  341. VideoFacingMode facing_mode;
  342. VideoCaptureApi capture_api;
  343. VideoCaptureControlSupport control_support;
  344. VideoCaptureTransportType transport_type;
  345. };
  346. // Bundles a VideoCaptureDeviceDescriptor with corresponding supported
  347. // video formats.
  348. [Stable]
  349. struct VideoCaptureDeviceInfo {
  350. VideoCaptureDeviceDescriptor descriptor;
  351. array<VideoCaptureFormat> supported_formats;
  352. };
  353. // The result of an attempt by the client to start/stop cropping.
  354. // TODO(crbug.com/1247761): Remove kNotImplemented.
  355. enum CropRequestResult {
  356. kSuccess,
  357. kErrorGeneric,
  358. kUnsupportedCaptureDevice,
  359. kNotImplemented,
  360. kNonIncreasingCropVersion,
  361. kInvalidCropTarget,
  362. };