├── README.md ├── docs ├── .buildinfo ├── .doctrees │ ├── api │ │ ├── coresdk.doctree │ │ ├── injection │ │ │ ├── audio.doctree │ │ │ ├── example.doctree │ │ │ ├── media_source_interface.doctree │ │ │ └── video.doctree │ │ ├── media_injection.doctree │ │ ├── media_io.doctree │ │ ├── media_recording.doctree │ │ ├── plugins.doctree │ │ ├── recording │ │ │ ├── audio.doctree │ │ │ ├── encoded_video.doctree │ │ │ ├── events.doctree │ │ │ ├── example.doctree │ │ │ ├── media_sink_interface.doctree │ │ │ └── raw_video.doctree │ │ └── sdk │ │ │ ├── audio.doctree │ │ │ ├── common │ │ │ ├── async_ops.doctree │ │ │ ├── custom_allocator.doctree │ │ │ ├── event_handling.doctree │ │ │ ├── exception.doctree │ │ │ └── log_level.doctree │ │ │ ├── conference.doctree │ │ │ ├── device_management.doctree │ │ │ ├── injector.doctree │ │ │ ├── processor.doctree │ │ │ ├── recorder.doctree │ │ │ ├── sdk.doctree │ │ │ ├── session.doctree │ │ │ └── video.doctree │ ├── environment.pickle │ ├── index.doctree │ └── other │ │ ├── getting_started.doctree │ │ ├── run_time_deps.doctree │ │ └── supported_platforms.doctree ├── .nojekyll ├── _sources │ ├── api │ │ ├── coresdk.rst.txt │ │ ├── injection │ │ │ ├── audio.rst.txt │ │ │ ├── example.rst.txt │ │ │ ├── media_source_interface.rst.txt │ │ │ └── video.rst.txt │ │ ├── media_injection.rst.txt │ │ ├── media_io.rst.txt │ │ ├── media_recording.rst.txt │ │ ├── plugins.rst.txt │ │ ├── recording │ │ │ ├── audio.rst.txt │ │ │ ├── encoded_video.rst.txt │ │ │ ├── events.rst.txt │ │ │ ├── example.rst.txt │ │ │ ├── media_sink_interface.rst.txt │ │ │ └── raw_video.rst.txt │ │ └── sdk │ │ │ ├── audio.rst.txt │ │ │ ├── common │ │ │ ├── async_ops.rst.txt │ │ │ ├── custom_allocator.rst.txt │ │ │ ├── event_handling.rst.txt │ │ │ ├── exception.rst.txt │ │ │ └── log_level.rst.txt │ │ │ ├── conference.rst.txt │ │ │ ├── device_management.rst.txt │ │ │ ├── injector.rst.txt │ │ │ ├── processor.rst.txt │ │ │ ├── recorder.rst.txt │ │ │ ├── sdk.rst.txt │ │ │ ├── session.rst.txt │ │ │ └── video.rst.txt │ ├── index.rst.txt │ └── other │ │ ├── getting_started.rst.txt │ │ ├── run_time_deps.rst.txt │ │ └── supported_platforms.rst.txt ├── _static │ ├── _sphinx_javascript_frameworks_compat.js │ ├── basic.css │ ├── css │ │ ├── badge_only.css │ │ ├── custom.css │ │ ├── fonts │ │ │ ├── Roboto-Slab-Bold.woff │ │ │ ├── Roboto-Slab-Bold.woff2 │ │ │ ├── Roboto-Slab-Regular.woff │ │ │ ├── Roboto-Slab-Regular.woff2 │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ ├── fontawesome-webfont.woff2 │ │ │ ├── lato-bold-italic.woff │ │ │ ├── lato-bold-italic.woff2 │ │ │ ├── lato-bold.woff │ │ │ ├── lato-bold.woff2 │ │ │ ├── lato-normal-italic.woff │ │ │ ├── lato-normal-italic.woff2 │ │ │ ├── lato-normal.woff │ │ │ └── lato-normal.woff2 │ │ └── theme.css │ ├── doctools.js │ ├── documentation_options.js │ ├── favicon.ico │ ├── file.png │ ├── graphviz.css │ ├── jquery-3.6.0.js │ ├── jquery.js │ ├── js │ │ ├── badge_only.js │ │ ├── html5shiv-printshiv.min.js │ │ ├── html5shiv.min.js │ │ └── theme.js │ ├── language_data.js │ ├── minus.png │ ├── plus.png │ ├── pygments.css │ ├── searchtools.js │ ├── sphinx_highlight.js │ ├── underscore-1.13.1.js │ └── underscore.js ├── api │ ├── coresdk.html │ ├── injection │ │ ├── audio.html │ │ ├── example.html │ │ ├── media_source_interface.html │ │ └── video.html │ ├── media_injection.html │ ├── media_io.html │ ├── media_recording.html │ ├── plugins.html │ ├── recording │ │ ├── audio.html │ │ ├── encoded_video.html │ │ ├── events.html │ │ ├── example.html │ │ ├── media_sink_interface.html │ │ └── raw_video.html │ └── sdk │ │ ├── audio.html │ │ ├── common │ │ ├── async_ops.html │ │ ├── custom_allocator.html │ │ ├── event_handling.html │ │ ├── exception.html │ │ └── log_level.html │ │ ├── conference.html │ │ ├── device_management.html │ │ ├── injector.html │ │ ├── processor.html │ │ ├── recorder.html │ │ ├── sdk.html │ │ ├── session.html │ │ └── video.html ├── genindex.html ├── index.html ├── objects.inv ├── other │ ├── getting_started.html │ ├── run_time_deps.html │ └── supported_platforms.html ├── search.html └── searchindex.js ├── license.md └── third_party_license_src.md /README.md: -------------------------------------------------------------------------------- 1 | # :warning: This repository is no longer maintained :warning: 2 | 3 | # Dolby.io Communications C++ SDK 4 | 5 | [Reference Documentation](https://api-references.dolby.io/comms-sdk-cpp/index.html) 6 | 7 | [Getting Started Guide](https://api-references.dolby.io/comms-sdk-cpp/other/getting_started.html) 8 | 9 | The Dolby.io Communications C++ SDK provides applications with the ability to create high-quality voice and video for fully immersive real-time communications experiences. The C++ SDK allows creating an application that can join Dolby.io conferences. 10 | 11 | The C++ SDK is responsible for communicating with the Dolby.io backend and providing conferencing functionalities, such as opening and closing sessions, joining and leaving conferences, sending and receiving messages, as well as receiving and injecting WebRTC media streams. 12 | 13 | Currently, an instance of the C++ SDK can connect to only one conference at a time. Joining multiple conferences at a time requires running multiple instances of the application. 14 | 15 | Core SDK 16 | ======== 17 | The [Core C++ SDK](https://api-references.dolby.io/comms-sdk-cpp/api/coresdk.html) handles all of the signalling with the Dolby.io backend as well as providing various events, messages and other valuable information to users. The Dolby.io Communications C++ SDK allows joining Dolby Voice Conferences where participants can send and receive high-quality voice streams, including spatial audio and shared scenes. This functionality is useful for integrating the Dolby Voice experience into your own game engine or virtual world experience. The C++ SDK provides applications with the ability to capture and playback audio and video, manage input and output audio devices and input video devices, add spatial placement for participants, as well as partake in a shared spatial scene. 18 | 19 | The Audio captured using the Core C++ SDK features is processed using Dolby Voice audio processing, allowing for clear, crisp conversations without echo or background noise and provides the option to use Dolby's world class 3D audio spatialization. 20 | 21 | The C++ SDK offers full control of the video capture pipeline to applications. For instance, allowing developers to implement video filters and apply them to a user’s camera feed. As part of our documentation we provide [an example](https://api-references.dolby.io/comms-sdk-cpp/other/getting_started.html#video-processor) of how this can be done. 22 | 23 | Media IO 24 | ======== 25 | In addition to the Core features, the Dolby.io Communications C++ SDK also provides [Media IO](https://api-references.dolby.io/comms-sdk-cpp/api/media_io.html) features. These include injecting audio from custom sources into conferences, connecting audio sinks to receive decoded PCM audio data and receiving encoded video frames before they are decoded. These features allow applications to connect as a client to a Dolby.io conference and record all of the present participants' video and audio. Think of it as recording a conference on your own machine without needing to pay for recording minutes. Additionally, you can inject some media from an external source (a file for instance) into the conference (especially applicable for Virtual Worlds for example). Note that using the Media IO features for Audio currently forces the use of the Opus Codec. 26 | 27 | Plugins 28 | ======= 29 | The C++ SDK also allows applications to make use of our ready-to-use [plugins](https://api-references.dolby.io/comms-sdk-cpp/api/plugins.html#plugins-api). The C++ SDK provides a default media recorder plugin: a ready-to-use library that can be easily configured and included in an application. The plugin automatically records the incoming media streams for conference participants and stores the recorded streams in either raw or encoded format. 30 | 31 | The C++ SDK provides two default media injection plugins that are able to receive raw media frames and pass them to the SDK. One of the default plugins is the Pacing Injector. This injector exposes interfaces for an application to provide the injector with decoded audio and video frames. Then, the injector provides these frames into the SDK at specified intervals. The other default plugin is the Passthrough-Injector, which exposes interfaces for passing decoded audio/video frames that are directly provided to the SDK. 32 | -------------------------------------------------------------------------------- /docs/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 7c803c1b9ac4e2971921ec7b57bf1abd 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /docs/.doctrees/api/coresdk.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/coresdk.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/injection/audio.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/injection/audio.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/injection/example.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/injection/example.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/injection/media_source_interface.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/injection/media_source_interface.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/injection/video.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/injection/video.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/media_injection.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/media_injection.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/media_io.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/media_io.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/media_recording.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/media_recording.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/plugins.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/plugins.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/recording/audio.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/recording/audio.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/recording/encoded_video.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/recording/encoded_video.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/recording/events.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/recording/events.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/recording/example.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/recording/example.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/recording/media_sink_interface.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/recording/media_sink_interface.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/recording/raw_video.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/recording/raw_video.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/audio.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/audio.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/common/async_ops.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/common/async_ops.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/common/custom_allocator.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/common/custom_allocator.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/common/event_handling.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/common/event_handling.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/common/exception.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/common/exception.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/common/log_level.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/common/log_level.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/conference.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/conference.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/device_management.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/device_management.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/injector.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/injector.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/processor.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/processor.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/recorder.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/recorder.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/sdk.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/sdk.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/session.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/session.doctree -------------------------------------------------------------------------------- /docs/.doctrees/api/sdk/video.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/api/sdk/video.doctree -------------------------------------------------------------------------------- /docs/.doctrees/environment.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/environment.pickle -------------------------------------------------------------------------------- /docs/.doctrees/index.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/index.doctree -------------------------------------------------------------------------------- /docs/.doctrees/other/getting_started.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/other/getting_started.doctree -------------------------------------------------------------------------------- /docs/.doctrees/other/run_time_deps.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/other/run_time_deps.doctree -------------------------------------------------------------------------------- /docs/.doctrees/other/supported_platforms.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.doctrees/other/supported_platforms.doctree -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/.nojekyll -------------------------------------------------------------------------------- /docs/_sources/api/coresdk.rst.txt: -------------------------------------------------------------------------------- 1 | .. _coresdk_api: 2 | 3 | Core API 4 | -------- 5 | The main part of the Dolby.io Communications C++ SDK, refered to as Core API, is responsible for communicating with the Dolby.io backend and providing conferencing functionalities, such as 6 | creating sessions, joining conferences, receiving Websocket events, sending/receiving messages, receiving WebRTC media streams, managing audio devices and leaving conferences. 7 | The SDK also provides the ability to configure the default Audio/Video recorder to handle and store the incoming media streams in desired formats. 8 | The SDK provides the ability to create a default Audio/Video injector to which the application can provide raw media frames that will 9 | then be injected into the conference. The SDK also provides the ability to set spatial locations of participants' audio and participate in a shared spatial scene within a conference. 10 | The :ref:`api_sdk`, :ref:`api_session`, :ref:`api_conference`, :ref:`api_device_management`, :ref:`api_audio_service`, :ref:`api_video_service` sections are the core of the user interface to the CoreSDK. 11 | 12 | .. toctree:: 13 | :maxdepth: 2 14 | :titlesonly: 15 | :glob: 16 | 17 | sdk/sdk.rst 18 | sdk/session.rst 19 | sdk/conference.rst 20 | sdk/audio.rst 21 | sdk/video.rst 22 | sdk/device_management.rst 23 | sdk/common/async_ops.rst 24 | sdk/common/log_level.rst 25 | sdk/common/exception.rst 26 | sdk/common/event_handling.rst 27 | sdk/common/custom_allocator.rst 28 | 29 | .. note:: 30 | 31 | The Core SDK API provides methods that are asynchronous in nature and return :ref:`async_result `. This means that if the result or the completion of operation is necessary for subsequent calls, you have to be 32 | careful. For more details refer to the :ref:`api_async_result` page. Details are also available in the descriptions of each interface which has functions producing results asynchronously: :cpp:class:`sdk `, 33 | :cpp:class:`conference `, :cpp:class:`session `, :cpp:class:`device_management `, 34 | :cpp:class:`local audio `, :cpp:class:`remote audio `, :cpp:class:`local video `, 35 | :cpp:class:`remote video `. 36 | -------------------------------------------------------------------------------- /docs/_sources/api/injection/audio.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_inject_audio: 2 | 3 | Audio 4 | ===== 5 | #include 6 | 7 | The interface through which raw audio frames are provided to the CoreSDK. This audio source must provide signed 16 bit PCM data in 10ms chunks at 10ms intervals. Application writers who want to 8 | implement this source must override the two virtual functions of :cpp:func:`registering ` and 9 | :cpp:func:`deregistering ` the RTC Audio Source on the Injector. Attaching the RTC Audio source to the injector establishes the audio 10 | pipeline so that frames can be passed to the CoreSDK. The :cpp:class:`Audio Source ` must be provided to the SDK using the :cpp:func:`Set Audio Source ` method and this 11 | must be done before starting a Conference. 12 | 13 | .. doxygenclass:: dolbyio::comms::audio_source 14 | :project: C++ SDK 15 | 16 | The :cpp:class:`RTC Audio Source ` is NOT to be implemented by the application. This is the interface through which the injector can view its own Audio Sink. After 17 | receiving audio frames from some media source, the injector provides the raw audio frames to this RTC Audio Source. The provided audio is expected to be in 10ms chunks provided every 10ms. 18 | The RTC Audio Source then pushes the audio data further down the audio pipeline until it is injected into the conference. The RTC Audio Source expects :cpp:class:`audio frames `. 19 | 20 | .. doxygenclass:: dolbyio::comms::rtc_audio_source 21 | :project: C++ SDK 22 | 23 | .. doxygenclass:: dolbyio::comms::audio_frame 24 | :project: C++ SDK 25 | 26 | See :ref:`injection_example` for an example of child injection class for all possible media. 27 | -------------------------------------------------------------------------------- /docs/_sources/api/injection/example.rst.txt: -------------------------------------------------------------------------------- 1 | .. _injection_example: 2 | 3 | Example Injector Implementation 4 | =============================== 5 | Below are the header and cpp files for a Media Injector Implementation. In order for this injector to be used by the C++ SDK, it must be passed to the conference service 6 | using the :cpp:func:`dolbyio::comms::services::conference::set_media_source` method. Now when a conference is joined and audio/video is started, this injector is part of the media injection 7 | pipeline. 8 | 9 | The interfaces inherited by this custom_injector example must be implemented by any custom injector intended to inject video and audio frames to a conference. 10 | 11 | At the bottom of the page is a sample CMakeLists.txt which shows how to create a library for this custom injector, then the library can be linked against the executable shown in the 12 | :ref:`getting_started_sample` section if you want to use a custom injector module. 13 | 14 | custom_injector.h 15 | _________________ 16 | .. literalinclude:: ../../../src/public/dolbyio/comms/sample/custom_injector/custom_injector.h 17 | :language: c++ 18 | 19 | custom_injector.cc 20 | __________________ 21 | .. literalinclude:: ../../../src/public/dolbyio/comms/sample/custom_injector/custom_injector.cc 22 | :language: c++ 23 | 24 | CMakeLists.txt 25 | _______________ 26 | .. literalinclude:: ../../../src/public/dolbyio/comms/sample/custom_injector/CMakeLists.txt 27 | :language: console 28 | -------------------------------------------------------------------------------- /docs/_sources/api/injection/media_source_interface.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_media_source_interface: 2 | 3 | Media Source Interface 4 | ========================= 5 | #include 6 | 7 | Top level interface that exposes the underlying source interfaces for injecting raw video and raw audio. This abstract class exposes 8 | the two possible source interfaces: :cpp:class:`video `, :cpp:class:`audio `. These two source interfaces essentially serve as input for the RTC Audio and Video sources created by the Media Engine. 9 | 10 | .. doxygenclass:: dolbyio::comms::media_source_interface 11 | :project: C++ SDK 12 | -------------------------------------------------------------------------------- /docs/_sources/api/injection/video.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_inject_video: 2 | 3 | Video 4 | ===== 5 | For details about Video Injection please refer to :ref:`vid_frame_handle`. The application must create a :cpp:class:`Video Source ` and then provide it to the SDK using the 6 | :cpp:func:`Local Video Service Start ` method. 7 | 8 | See :ref:`injection_example` for an example of child injection class for all possible media. 9 | -------------------------------------------------------------------------------- /docs/_sources/api/media_injection.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_media_injection: 2 | 3 | Media Injection API 4 | ___________________ 5 | 6 | .. note:: 7 | The Media Injection feature of the C++SDK is intended for Server applications. 8 | 9 | 10 | The Media Injection API provides interfaces for writing modules that inject audio/video frames into the CoreSDK. The API provides the ability to create a module that accepts raw video/audio 11 | frames from any media source and passes them to respective sinks: :cpp:class:`RTCAudio ` and :cpp:class:`RTCVideo `. A media sink from 12 | the perspective of the injector is a media source from the perspective of the CoreSDK. The media is then encoded and the streams are sent into the conference. The C++ SDK provides a 13 | default injector module, explained in the :ref:`Default Injector ` section, which the application can instantiate and provide raw frames to. This Default Injector module then takes 14 | care of getting the frames to the CoreSDK. The API for injecting media streams uses a pattern of setting producer objects, which are C++ classes with pure virtual functions. The virtual functions for 15 | connecting :cpp:class:`RTCAudioSource ` and :cpp:class:`RTCVideoSource ` to an injector are exposed through the 16 | :cpp:class:`audio ` and :cpp:class:`video ` source interface. The injector provides media frames to these RTC sources. The custom injector 17 | must also implement the :cpp:class:`dolbyio::comms::media_source_interface`, which is the interface through which the injector is provided to the Conference Service. 18 | 19 | .. toctree:: 20 | :maxdepth: 2 21 | :titlesonly: 22 | :glob: 23 | 24 | injection/media_source_interface.rst 25 | injection/audio.rst 26 | injection/video.rst 27 | injection/example.rst 28 | -------------------------------------------------------------------------------- /docs/_sources/api/media_io.rst.txt: -------------------------------------------------------------------------------- 1 | .. _media_io_api: 2 | 3 | Media IO API 4 | ============= 5 | The Media IO feature allows for :ref:`injecting ` video and audio streams into a conference as well as :ref:`recording ` the remote participants' streams. 6 | 7 | The basic usage of the Session Service consists of the following steps: 8 | 1) Access the service after :cpp:func:`creating ` and instance of the SDK through the :cpp:func:`sdk::media_io ` method. 9 | 2) Set an :cpp:func:`Audio Sink `. 10 | 3) Set an :cpp:func:`Audio Source `. 11 | 4) Set an :cpp:func:`Encoded Video Sink `. 12 | 13 | .. doxygenclass:: dolbyio::comms::services::media_io 14 | 15 | .. _api_injection: 16 | 17 | Injection 18 | _________ 19 | .. toctree:: 20 | :maxdepth: 2 21 | :titlesonly: 22 | :glob: 23 | 24 | injection/audio.rst 25 | injection/video.rst 26 | injection/example.rst 27 | 28 | .. _api_recording: 29 | 30 | Recording 31 | _________ 32 | .. toctree:: 33 | :maxdepth: 2 34 | :titlesonly: 35 | :glob: 36 | 37 | recording/raw_video.rst 38 | recording/encoded_video.rst 39 | recording/audio.rst 40 | recording/events.rst 41 | recording/example.rst 42 | 43 | .. note:: 44 | The Core SDK API provides methods that are asynchronous in nature and return :ref:`async_result `. This means that if 45 | the result or the completion of the operation is necessary for subsequent calls, you have to be careful. 46 | -------------------------------------------------------------------------------- /docs/_sources/api/media_recording.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_media_recording: 2 | 3 | Media Recording API 4 | ___________________ 5 | 6 | .. note:: 7 | The Media Recording feature of the C++ SDK is intended for Server applications. 8 | 9 | The Media Recording API provides interfaces for writing modules that allow recording audio and video. These modules are responsible for passing frames from incoming WebRTC Media Streams and handling, processing, and storing the media data. The C++ SDK provides a default recording module. However, using the Media Recording API, users can create and connect their own audio/video recording module to handle, process, and store streams from conferences. The API for recording media streams uses a pattern of setting listener objects, which are C++ classes with pure virtual functions. The virtual functions are exposed through sink interfaces for each of the type of media, which is provided by the Media Engine. The video data is received as :ref:`Raw ` YUV frames or in the :ref:`Encoded ` format. The :ref:`audio ` data is received in the decoded format. Listeners set by the application are called whenever data is available; these methods are called on the dedicated WebRTC threads that produced the data. 10 | 11 | .. toctree:: 12 | :maxdepth: 2 13 | :titlesonly: 14 | :glob: 15 | 16 | recording/media_sink_interface.rst 17 | recording/audio.rst 18 | recording/encoded_video.rst 19 | recording/raw_video.rst 20 | recording/events.rst 21 | recording/example.rst 22 | 23 | -------------------------------------------------------------------------------- /docs/_sources/api/plugins.rst.txt: -------------------------------------------------------------------------------- 1 | .. _plugins_api: 2 | 3 | Plugins 4 | ======= 5 | The video processing library is part of the **dolbyio_video_processor** library. Applications which would like to use our video processor should link against this library. The video processor library provides the ability to process frames captured from camera and blur the background, the processed frames can then be sent into the conference. 6 | 7 | The media injection/recording plugins are provided as part of the **dolbyio_multimedia_streaming_addon** library. Applications that would like to use our Default Injector/Recorder modules should link against this library. 8 | 9 | To record conferences, the C++ SDK uses a Media Recorder that allows processing and storing video frames from the incoming WebRTC media streams. The library provides a default media recorder plugin. The default media recorder plugin is 10 | a ready-to-use library that can be easily configured and included in an application. The plugin automatically records the incoming media streams for conference participants and stores the recorded streams in either raw or encoded format. 11 | 12 | The library also provides two flavors of Media Injectors as plugins. One of the default plugins is the Pacing Injector. The injector exposes an interface for an application and allows passing decoded audio and video. Then, the injector provides these frames to WebRTC at specified intervals. This version of the plugin is suitable for injecting media files. The second default injection plugin is the Passthrough Injector, which exposes the application the same interface 13 | for injecting frames, but this plugin directly relays the frames it receives to WebRTC without any internal pacing. The media injection plugins do not provide capturing of audio or video; instead, they serve in constructing the respective media injection pipelines. The application is responsible for performing the audio and video capture and providing the decoded frames to the injector plugin. 14 | 15 | .. toctree:: 16 | :maxdepth: 2 17 | :titlesonly: 18 | :glob: 19 | 20 | sdk/processor.rst 21 | sdk/recorder.rst 22 | sdk/injector.rst 23 | -------------------------------------------------------------------------------- /docs/_sources/api/recording/audio.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_record_audio: 2 | 3 | Audio 4 | ====== 5 | #include 6 | 7 | The interface for handling incoming audio frames. Applications must set listener which override the virtual function. The :cpp:func:`handle_audio ` function is called with the decoded PCM audio data. Inside a conference, the received audio depends on whether or not the conference is using :cpp:var:`Dolby Voice `. When Dolby Voice is enabled, the SDK receives a single audio stream containing mixed audio of all unmuted participants. When Dolby Voice is disabled, the SDK receives separate audio streams from all unmuted participants. The :cpp:class:`Audio Sink ` must be provided to the SDK using the :cpp:func:`Set Audio Sink ` function and this must be done before starting a conference. 8 | 9 | .. doxygenclass:: dolbyio::comms::audio_sink 10 | :project: C++ SDK 11 | 12 | See :ref:`recording_example` for a template for child recording class for all possible media. 13 | -------------------------------------------------------------------------------- /docs/_sources/api/recording/encoded_video.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_record_encoded: 2 | 3 | Encoded Video 4 | ============= 5 | #include 6 | 7 | The interface for handling encoded video frames. Application must set listeners which override both of the virtual functions. The 8 | :cpp:func:`handle_frame_encoded ` function is called after the RTP data is depacktized and an encoded frame 9 | is constructed. This function will be executed on the Webrtc DecodingQueue thread created for the track to which the encoded frames belong. The Encoded Video Sink must be provided to the SDK using the 10 | :cpp:func:`Set Encoded Sink ` function. 11 | 12 | .. doxygenclass:: dolbyio::comms::video_sink_encoded 13 | :project: C++ SDK 14 | 15 | .. doxygenclass:: dolbyio::comms::encoded_video_frame 16 | :project: C++ SDK 17 | 18 | See :ref:`recording_example` for a template for child recording class for all possible media. 19 | -------------------------------------------------------------------------------- /docs/_sources/api/recording/events.rst.txt: -------------------------------------------------------------------------------- 1 | .. _recording_events: 2 | 3 | Media Recording Events 4 | ====================== 5 | The events which are of interest to record media can all be accessed and subscribed through the :ref:`api_conference`. These :ref:`conf_events` contain information about participants joining and leaving the conference as well as audio and video track events emitted by Webrtc necessary to configure the recording pipelines. These events 6 | will indicate when video or audio tracks have been added or removed from the peer connection and from which peers streams are coming via the same. 7 | The Media Recording Module should set handlers for all of these events via the :cpp:func:`dolbyio::comms::services::conference::add_event_handler` methods. 8 | -------------------------------------------------------------------------------- /docs/_sources/api/recording/example.rst.txt: -------------------------------------------------------------------------------- 1 | .. _recording_example: 2 | 3 | Example Recorder Implementation 4 | =============================== 5 | Below are the header and cpp files for a Media Recorder Implementation, in order for this recorder to be used by the C++ SDK it must be passed to the conference service as 6 | using the :cpp:class:`dolbyio::comms::services::media_io`. Now when a conference is joined all incoming media will be passed to the recorder implementation. 7 | 8 | The recorder should be configured appropriately to be used for handling encoded or raw video and PCM/AAC audio. The application should set this configuration before passing the recorder implementation 9 | to the conference service. 10 | 11 | The interfaces inheritted from by this custom_recorder example must be implemented by any custom recorder which wishes to receive video and audio frames. 12 | 13 | At the bottom of the page is a sample CMakeLists.txt which shows how to create a library for this custom recorder, then the library can be linked against the executable shown in the 14 | :ref:`getting_started_sample` section if you want to use a custom recorder module. 15 | 16 | custom_recorder.h 17 | _________________ 18 | .. literalinclude:: ../../../src/public/dolbyio/comms/sample/custom_recorder/custom_recorder.h 19 | :language: c++ 20 | 21 | custom_recorder.cc 22 | __________________ 23 | .. literalinclude:: ../../../src/public/dolbyio/comms/sample/custom_recorder/custom_recorder.cc 24 | :language: c++ 25 | 26 | CMakeLists.txt 27 | _______________ 28 | .. literalinclude:: ../../../src/public/dolbyio/comms/sample/custom_recorder/CMakeLists.txt 29 | :language: console 30 | -------------------------------------------------------------------------------- /docs/_sources/api/recording/media_sink_interface.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_media_capturer_interface: 2 | 3 | Media Sink Interface 4 | ========================= 5 | #include 6 | 7 | Top level interface which exposes the underlying sink interfaces for receiving and handling audio, raw video and encoded video data. This abstract class just exposes 8 | the three possible sink interfaces: :cpp:class:`raw video `, :cpp:class:`encoded video ` 9 | and :cpp:class:`audio `. 10 | 11 | .. doxygenclass:: dolbyio::comms::media_sink_interface 12 | :project: C++ SDK 13 | -------------------------------------------------------------------------------- /docs/_sources/api/recording/raw_video.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_record_raw: 2 | 3 | Raw Video 4 | ========= 5 | #include 6 | 7 | For details about Raw Video Recording an application must implement a :cpp:class:`Video Sink ` to receive the frames and provide this Video Sink to the SDK using the :cpp:class:`Remote Video Service `. 8 | 9 | See :ref:`recording_example` for a template for child recording class for all possible media. 10 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/audio.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_audio_service: 2 | 3 | Audio Service 4 | ============== 5 | 6 | The Audio Service allows enabling and disabling audio for the local and remote participants, as well as configuring audio capture modes. 7 | 8 | Audio Interface 9 | --------------- 10 | #include 11 | 12 | Provides access to the local and remote audio services. 13 | 14 | .. doxygenclass:: dolbyio::comms::services::audio 15 | 16 | Local Audio 17 | ----------- 18 | .. doxygenclass:: dolbyio::comms::services::local_audio 19 | 20 | Remote Audio 21 | ------------ 22 | .. doxygenclass:: dolbyio::comms::services::remote_audio 23 | 24 | Audio Processing 25 | ---------------- 26 | .. doxygenenum:: dolbyio::comms::noise_reduction 27 | 28 | .. doxygenenum:: dolbyio::comms::voice_font 29 | 30 | .. doxygenstruct:: dolbyio::comms::audio_capture_mode::unprocessed 31 | 32 | .. doxygenstruct:: dolbyio::comms::audio_capture_mode::standard 33 | 34 | .. doxygentypedef:: dolbyio::comms::audio_capture_mode::variant 35 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/common/async_ops.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_async_result: 2 | 3 | Asynchronous Operations 4 | ======================= 5 | 6 | The SDK provides a thread-safe, asynchronous, and reentrant public API. This means that these public API methods can return results produced asynchronously in the form of :cpp:type:`async_result `. The :cpp:type:`async_result ` object represents an eventual completion or a failure of an asynchronous operation and its resulting value. All calls to the SDK are queued onto the SDKs event loop and processed in the FIFO (First In, First Out) order. After making a call, the SDK user application is responsible for either blocking until the operation completes and result is available or setting a function object to execute when the asynchronous operation resolves using the :cpp:class:`async_result and ` methods. We highly recommend the latter to fully utilize the asynchronous capabilities of the SDK. 7 | 8 | When a user application invokes an asynchronous method of the SDK, the SDK creates two objects: :cpp:type:`solver `, 9 | which is used by the asynchronous operation to notify about its completion, and :cpp:type:`async_result `, which is used by the application to get the completion notifications. Both of these objects share the same internal state. The user application must set function object callbacks to be executed when the operation succeeds or fails on the async_result. When the asynchronous operation completes the callbacks set by the user, it invokes the application. 10 | If the asynchronous operation ends before the callbacks are set by the user application, then the callbacks are invoked as soon as they are 11 | set, on the application's thread. Otherwise, the callbacks are invoked when the operation is finished on the SDK's event loop. 12 | 13 | .. _async_types: 14 | 15 | Thread Safe Types and Helper Methods 16 | ------------------------------------ 17 | #include 18 | 19 | The thread safe types which can be exposed by the user via the public API. They define thread safe versions of the Asynchronous Classes documented in the 20 | sections below. The helper method allows for synchronous usage of the asynchronous API when called from a different thread. 21 | 22 | .. doxygentypedef:: dolbyio::comms::async_result 23 | :project: C++ SDK 24 | 25 | .. doxygenstruct:: dolbyio::comms::thread_safe_solver_traits 26 | :project: C++ SDK 27 | 28 | .. doxygentypedef:: dolbyio::comms::async_result_with_solver 29 | :project: C++ SDK 30 | 31 | .. doxygentypedef:: dolbyio::comms::solver 32 | :project: C++ SDK 33 | 34 | .. doxygentypedef:: dolbyio::comms::low_level_solver 35 | :project: C++ SDK 36 | 37 | .. doxygentypedef:: dolbyio::comms::low_level_solver_ptr 38 | :project: C++ SDK 39 | 40 | .. doxygenfunction:: dolbyio::comms::wait 41 | :project: C++ SDK 42 | 43 | .. _async_resultt: 44 | 45 | Async Result Class 46 | ------------------ 47 | #include 48 | 49 | The async_result is a result that is returned to the SDK by all asynchronous calls, except calls that create the SDK and set the log level. Asynchronous operations can be chained together using 50 | :cpp:func:`async_result::then ` calls and must be terminated with 51 | :cpp:func:`async_result::on_error ` calls. 52 | 53 | The solver class is used in the SDK internally and allows notifying the asynchronous operation end. The low_level_solver class 54 | defines a shared state used by the async_result and the solver. The solver class is not directly used by the SDK user. The 55 | solver class is used only by the asynchronous operation itself and the SDK interface does not require the user to create and 56 | manage the state of any asynchronous operation. The user only needs to consume the asynchronous work initiated by the SDK and 57 | react to its completion. 58 | 59 | The low_level_solver should almost never be used directly, even if the user chooses to use SDK's asynchronous operations framework 60 | to implement its own asynchronous operations. Using the async_result and solver pairs is easier and less error-prone. 61 | We recommend creating and using low_level_solver directly only for optimization opportunities if the application 62 | needs to share the solver between multiple entities using std::shared_ptr. 63 | 64 | .. doxygenclass:: dolbyio::comms::detail::async_result 65 | :project: C++ SDK 66 | 67 | .. doxygenclass:: dolbyio::comms::detail::async_result_with_solver 68 | :project: C++ SDK 69 | 70 | .. doxygenclass:: dolbyio::comms::detail::solver 71 | :project: C++ SDK 72 | 73 | .. doxygenclass:: dolbyio::comms::detail::low_level_solver 74 | :project: C++ SDK 75 | 76 | .. doxygenclass:: dolbyio::comms::detail::low_level_solver< void, traits > 77 | :project: C++ SDK 78 | 79 | .. doxygentypedef:: dolbyio::comms::detail::low_level_solver_ptr 80 | :project: C++ SDK 81 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/common/custom_allocator.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_custom_allocator: 2 | 3 | Overriding new/delete operators 4 | =============================== 5 | 6 | .. note:: 7 | The Custom Allocator functionality for overriding new/delete operators is only available on Windows. It is not required on Linux or MacOS. 8 | 9 | .. doxygenstruct:: dolbyio::comms::app_allocator 10 | :project: C++ SDK 11 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/common/event_handling.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_event_handling: 2 | 3 | Event Handling Interface 4 | ======================== 5 | #include 6 | 7 | The event handler connection interface is used for handling subscriptions to events which can be emitted by the SDK. The user will utilize either 8 | :cpp:func:`sdk::add_event_handler ` or :cpp:func:`conference::add_event_handler ` to subscribe to an events. 9 | 10 | - In order to subscribe to an event the user will provide a callback of type :cpp:type:`event_handler ` to be invoked by the SDK when th event occurrs. 11 | - The user will receive a :cpp:class:`event_handler_connection ` for each event they subscribe to. This connection is to be used to disconnect a event listener. 12 | - When subscription is finished the user will be returned an :cpp:type:`event_handler_id ` which is a unique pointer to an :cpp:class:`event_handler_connection `. 13 | 14 | .. doxygentypedef:: dolbyio::comms::event_handler 15 | :project: C++ SDK 16 | 17 | .. doxygentypedef:: dolbyio::comms::event_handler_id 18 | :project: C++ SDK 19 | 20 | .. doxygenclass:: dolbyio::comms::event_handler_connection 21 | :project: C++ SDK 22 | 23 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/common/exception.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_exception: 2 | 3 | SDK Exceptions 4 | ============== 5 | #include 6 | 7 | Exception's which can be thrown by the SDK and caught by user. These have been left defined 8 | 9 | .. doxygenclass:: dolbyio::comms::exception 10 | :project: C++ SDK 11 | 12 | .. doxygenclass:: dolbyio::comms::async_operation_canceled 13 | :project: C++ SDK 14 | 15 | .. doxygenclass:: dolbyio::comms::dvc_error_exception 16 | :project: C++ SDK 17 | 18 | .. doxygenclass:: dolbyio::comms::json_exception 19 | :project: C++ SDK 20 | 21 | .. doxygenclass:: dolbyio::comms::jwt_exception 22 | :project: C++ SDK 23 | 24 | .. doxygenclass:: dolbyio::comms::io_exception 25 | :project: C++ SDK 26 | 27 | .. doxygenclass:: dolbyio::comms::http_exception 28 | :project: C++ SDK 29 | 30 | .. doxygenclass:: dolbyio::comms::restapi_exception 31 | :project: C++ SDK 32 | 33 | .. doxygenclass:: dolbyio::comms::session_exception 34 | :project: C++ SDK 35 | 36 | .. doxygenclass:: dolbyio::comms::conference_exception 37 | :project: C++ SDK 38 | 39 | .. doxygenclass:: dolbyio::comms::conference_state_exception 40 | :project: C++ SDK 41 | 42 | .. doxygenclass:: dolbyio::comms::media_exception 43 | :project: C++ SDK 44 | 45 | .. doxygenclass:: dolbyio::comms::media_engine_exception 46 | :project: C++ SDK 47 | 48 | .. doxygenclass:: dolbyio::comms::create_answer_exception 49 | :project: C++ SDK 50 | 51 | .. doxygenclass:: dolbyio::comms::create_peer_connection_exception 52 | :project: C++ SDK 53 | 54 | .. doxygenclass:: dolbyio::comms::ice_candidate_exception 55 | :project: C++ SDK 56 | 57 | .. doxygenclass:: dolbyio::comms::media_stream_exception 58 | :project: C++ SDK 59 | 60 | .. doxygenclass:: dolbyio::comms::peer_connection_disconnected_exception 61 | :project: C++ SDK 62 | 63 | .. doxygenclass:: dolbyio::comms::peer_connection_failed_exception 64 | :project: C++ SDK 65 | 66 | .. doxygenclass:: dolbyio::comms::sdp_exception 67 | :project: C++ SDK 68 | 69 | .. doxygenclass:: dolbyio::comms::spatial_placement_exception 70 | :project: C++ SDK 71 | 72 | .. doxygenclass:: dolbyio::comms::dvc_exception 73 | :project: C++ SDK 74 | 75 | .. doxygenclass:: dolbyio::comms::certificate_exception 76 | :project: C++ SDK 77 | 78 | .. doxygenclass:: dolbyio::comms::security_check_exception 79 | :project: C++ SDK 80 | 81 | .. doxygenclass:: dolbyio::comms::signaling_channel_exception 82 | :project: C++ SDK 83 | 84 | .. doxygenclass:: dolbyio::comms::invalid_token_exception 85 | :project: C++ SDK 86 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/common/log_level.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_log_level: 2 | 3 | Logging 4 | ========= 5 | #include 6 | 7 | Enum describing the log levels of the SDK. 8 | 9 | .. doxygenenum:: dolbyio::comms::log_level 10 | :project: C++ SDK 11 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/conference.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_conference: 2 | 3 | Conference Service 4 | ================== 5 | .. note:: 6 | Features, such as recording and injecting media are only available for server applications. 7 | 8 | The Conference Service allows the application to manage the conference life-cycle and interact with the conference. During a conference, the SDK may receive: 9 | 10 | - A single audio stream that contains mixed audio of all un-muted participants 11 | - Video streams from all participants who joined the conference with their cameras enabled 12 | - One screen-share stream 13 | 14 | The basic usage of the Conference Service is as follows: 15 | 1) Log in to :ref:`sess_serv`. 16 | 2) Subscribe to any of the available :ref:`conf_events` using the :cpp:func:`conference::add_event_handler ` method. 17 | 3) Create a conference using a conference alias :cpp:func:`conference::create `. You can omit this step if you want to join an existing conference. 18 | 4) Join a conference using the :cpp:func:`conference::join ` or :cpp:func:`conference::listen ` method. This method returns the conference_info structure (see :ref:`conf_models`) describing the conference. In the case of failure, you will receive an exception returned in the async_result. 19 | 5) To leave the conference, call the :cpp:func:`conference::leave ` method. 20 | 21 | .. _conf_serv: 22 | 23 | Conference Interface 24 | -------------------------- 25 | #include 26 | 27 | The interface for the :ref:`api_conference`. Methods of this interface provide the ability to create, join, and leave conferences and subscribe to 28 | events. The conference service methods are all asynchronous in nature, refer to :ref:`api_async_result` for more information. Structures which are part of the 29 | interface can be passed to and returned by the service. 30 | 31 | .. doxygenclass:: dolbyio::comms::services::conference 32 | 33 | Spatial Audio 34 | ------------- 35 | #include 36 | 37 | The spatial audio methods that allow placing conference participants spatially in a 3D rendered audio scene and hear the audio from the participants rendered at the given locations. 38 | 39 | .. doxygenstruct:: dolbyio::comms::spatial_position 40 | 41 | .. doxygenstruct:: dolbyio::comms::spatial_direction 42 | 43 | .. doxygenstruct:: dolbyio::comms::spatial_scale 44 | 45 | .. doxygenclass:: dolbyio::comms::spatial_audio_batch_update 46 | 47 | .. doxygenenum:: dolbyio::comms::spatial_audio_style 48 | 49 | .. _conf_events: 50 | 51 | Conference Events 52 | ----------------- 53 | The :ref:`api_conference` events that are emitted by the SDK. You can subscribe to the events using the :cpp:func:`conference::add_event_handler ` methods. 54 | 55 | .. doxygenstruct:: dolbyio::comms::active_speaker_changed 56 | :project: C++ SDK 57 | 58 | .. doxygenstruct:: dolbyio::comms::conference_status_updated 59 | :project: C++ SDK 60 | 61 | .. doxygenenum:: dolbyio::comms::conference_status 62 | :project: C++ SDK 63 | 64 | .. doxygenstruct:: dolbyio::comms::local_participant_updated 65 | :project: C++ SDK 66 | 67 | .. doxygenstruct:: dolbyio::comms::remote_participant_updated 68 | :project: C++ SDK 69 | 70 | .. doxygenstruct:: dolbyio::comms::remote_participant_added 71 | :project: C++ SDK 72 | 73 | .. doxygenstruct:: dolbyio::comms::local_video_track_added 74 | :project: C++ SDK 75 | 76 | .. doxygenstruct:: dolbyio::comms::local_video_track_removed 77 | :project: C++ SDK 78 | 79 | .. doxygenstruct:: dolbyio::comms::remote_video_track_added 80 | :project: C++ SDK 81 | 82 | .. doxygenstruct:: dolbyio::comms::remote_video_track_removed 83 | :project: C++ SDK 84 | 85 | .. doxygenstruct:: dolbyio::comms::participant_added 86 | :project: C++ SDK 87 | 88 | .. doxygenstruct:: dolbyio::comms::participant_updated 89 | :project: C++ SDK 90 | 91 | .. doxygenstruct:: dolbyio::comms::video_track_added 92 | :project: C++ SDK 93 | 94 | .. doxygenstruct:: dolbyio::comms::video_track_removed 95 | :project: C++ SDK 96 | 97 | .. doxygenstruct:: dolbyio::comms::audio_track_added 98 | :project: C++ SDK 99 | 100 | .. doxygenstruct:: dolbyio::comms::audio_track_removed 101 | :project: C++ SDK 102 | 103 | .. doxygenstruct:: dolbyio::comms::recording_status_updated 104 | :project: C++ SDK 105 | 106 | .. doxygenstruct:: dolbyio::comms::video_forwarded_changed 107 | :project: C++ SDK 108 | 109 | .. doxygenstruct:: dolbyio::comms::conference_message_received 110 | :project: C++ SDK 111 | 112 | .. doxygenstruct:: dolbyio::comms::conference_invitation_received 113 | :project: C++ SDK 114 | 115 | .. doxygenstruct:: dolbyio::comms::audio_level 116 | :project: C++ SDK 117 | 118 | .. doxygenstruct:: dolbyio::comms::audio_levels 119 | :project: C++ SDK 120 | 121 | .. _conf_models: 122 | 123 | Other Structures 124 | ---------------- 125 | Other structures used by the :ref:`api_conference`, which are not defined in the :ref:`conf_serv` interface. 126 | 127 | .. doxygenstruct:: dolbyio::comms::conference_info 128 | :project: C++ SDK 129 | 130 | .. doxygenenum:: dolbyio::comms::conference_access_permissions 131 | :project: C++ SDK 132 | 133 | .. doxygenenum:: dolbyio::comms::listen_mode 134 | :project: C++ SDK 135 | 136 | .. doxygenstruct:: dolbyio::comms::participant_info 137 | :project: C++ SDK 138 | 139 | .. doxygenenum:: dolbyio::comms::participant_status 140 | :project: C++ SDK 141 | 142 | .. doxygenenum:: dolbyio::comms::participant_type 143 | :project: C++ SDK 144 | 145 | .. doxygenenum:: dolbyio::comms::recording_format 146 | :project: C++ SDK 147 | 148 | .. doxygenenum:: dolbyio::comms::rtcp_mode 149 | :project: C++ SDK 150 | 151 | .. doxygenenum:: dolbyio::comms::screen_share_content_type 152 | :project: C++ SDK 153 | 154 | .. doxygenstruct:: dolbyio::comms::screen_share_content_info 155 | :project: C++ SDK 156 | 157 | .. doxygenenum:: dolbyio::comms::video_codec 158 | :project: C++ SDK 159 | 160 | .. doxygenenum:: dolbyio::comms::video_forwarding_strategy 161 | :project: C++ SDK 162 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/device_management.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_device_management: 2 | 3 | Device Management Service 4 | ========================== 5 | 6 | Once the SDK is instantiated, applications have access to the device management service. Currently, this allows managing audio input and output devices. This service provides the ability to: 7 | 8 | - Get the available audio devices 9 | - Set the preferred input and output devices 10 | - Check the currently set input and output device 11 | - Receive events about audio devices that have been added, removed, or changed as well as device failures 12 | 13 | .. _devman_serv: 14 | 15 | Device Management Interface 16 | ---------------------------- 17 | #include 18 | 19 | .. doxygenclass:: dolbyio::comms::services::device_management 20 | 21 | Device Events 22 | ------------- 23 | The :ref:`api_device_management` events that are emitted by the SDK. They can be subscribed to using the 24 | :cpp:func:`device_management::add_event_handler ` methods. 25 | 26 | .. doxygenstruct:: dolbyio::comms::audio_device_added 27 | :project: C++ SDK 28 | 29 | .. doxygenstruct:: dolbyio::comms::audio_device_removed 30 | :project: C++ SDK 31 | 32 | .. doxygenstruct:: dolbyio::comms::audio_device_changed 33 | :project: C++ SDK 34 | 35 | .. doxygenstruct:: dolbyio::comms::audio_device_timeout_failure 36 | :project: C++ SDK 37 | 38 | .. doxygenstruct:: dolbyio::comms::audio_volume_changed 39 | :project: C++ SDK 40 | 41 | .. doxygenstruct:: dolbyio::comms::video_device_added 42 | :project: C++ SDK 43 | 44 | .. doxygenstruct:: dolbyio::comms::video_device_removed 45 | :project: C++ SDK 46 | 47 | .. doxygenstruct:: dolbyio::comms::video_device_changed 48 | :project: C++ SDK 49 | 50 | .. doxygenstruct:: dolbyio::comms::video_device_error 51 | :project: C++ SDK 52 | 53 | .. doxygenstruct:: dolbyio::comms::screen_share_error 54 | :project: C++ SDK 55 | 56 | .. _devman_models: 57 | 58 | Device Structs 59 | --------------- 60 | Other structures used by the :ref:`api_device_management` that are not defined in the :ref:`devman_serv` interface. 61 | 62 | .. doxygenclass:: dolbyio::comms::audio_device 63 | :project: C++ SDK 64 | 65 | .. doxygenstruct:: dolbyio::comms::camera_device 66 | :project: C++ SDK 67 | 68 | .. doxygenstruct:: dolbyio::comms::screen_share_source 69 | :project: C++ SDK 70 | 71 | .. doxygenenum:: dolbyio::comms::default_audio_device_policy 72 | :project: C++ SDK 73 | 74 | .. doxygenstruct:: dolbyio::comms::linear_volume 75 | :project: C++ SDK 76 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/injector.rst.txt: -------------------------------------------------------------------------------- 1 | .. _default_injector: 2 | 3 | Default Media Injector 4 | ========================== 5 | 6 | The Default Media Injector module provides two different types of injectors: 7 | 8 | - A pass-through injector designed for streaming applications 9 | - A pacing injector designed for media file injecting applications 10 | 11 | Both types of injectors provide connections to :cpp:class:`audio ` and :cpp:class:`video ` sinks for the media 12 | frames to be passed on to. Each of the injectors accepts :cpp:class:`audio frames ` and :cpp:class:`video frames `. 13 | 14 | The main difference between the two injectors is that the paced injector provides a pacing logic, so that it can queue audio and video frames before injecting them into a conference. The passthrough injector accepts the raw audio and video frames and directly relays them to the CoreSDK. Thus, the application is responsible for invoking the frame injection 15 | interface quickly. 16 | 17 | .. doxygenclass:: dolbyio::comms::plugin::injector 18 | :project: C++ SDK 19 | 20 | Passthrough Injector 21 | ____________________ 22 | The Passthrough Injector acts as a proxy to the RTC Audio/Video sources. A Media Injection Source uses the :cpp:func:`audio ` 23 | and the :cpp:func:`video ` methods to pass frames to the Passthrough Injector, which in turn relays these frames to the CoreSDK. 24 | 25 | .. doxygenclass:: dolbyio::comms::plugin::injector_passthrough 26 | :project: C++ SDK 27 | 28 | Paced Injector 29 | ______________ 30 | The Paced Injector ensures that an application provides media frames to the CoreSDK at desired intervals. This is useful for applications that read from media files and produce frames quite quickly. The Paced Injector provides audio to 31 | the CoreSDK in intervals of 10ms and has a configurable option for the video frame interval that specifies how quickly video frames should be provided. The injector 32 | provides frames at these intervals by temporarily storing audio and video in queues. These queues have a limited size; they can store up to 1 second of audio and 300-400ms of video. When the queues are filled, the thread 33 | pushing to the queues is blocked until a free space is available. The Paced Injector also provides methods for managing the pace, such as starting and stopping the pacing threads, clearing the 34 | queues, and setting the video frame interval. If media file injection is paused by the injection source, silence should be injected into the conference to avoid AV sync issues when resuming the injection. 35 | The Paced Injector also provides a method for injecting silent audio frames in 10ms chunks into the conference. 36 | 37 | .. doxygenclass:: dolbyio::comms::plugin::injector_paced 38 | :project: C++ SDK 39 | 40 | Media Injection Status 41 | ______________________ 42 | The Media Injection Status is a structure that depicts the status of the injector. It is passed to the application when the status changes. 43 | 44 | .. doxygenstruct:: dolbyio::comms::plugin::media_injection_status 45 | :project: C++ SDK 46 | 47 | Media Source for Injector 48 | _________________________ 49 | Neither of the default injectors provide infrastructure for capturing and decoding media. This is the application's responsibility; once it has decoded media frames, it can pass them to either of the 50 | aforementioned injectors. We have provided a sample library to showcase how to create a Media Injection Source. This sample library, called :ref:`media_source_file`, reads media from a mov/mp4 file 51 | and using the Paced Injector injects the audio and video frames into the CoreSDK. This :ref:`media_source_file` library is utilized by the provided sample application to inject media files. The 52 | :ref:`getting_started_sample` page describes how to get media injection running with the sample application. A brief overview of the library is provided :ref:`below `. 53 | 54 | The audio provided to the injector, contained by the :cpp:class:`audio frame `, should have the following specifications: 55 | 56 | .. table:: 57 | 58 | +-------+--------------+---------+ 59 | | Codec | Size | Format | 60 | +=======+==============+=========+ 61 | | PCM | 10ms of data | s16_Int | 62 | +-------+--------------+---------+ 63 | 64 | The CoreSDK expects these 10ms chunks of PCM audio to be provided every 10ms. The video frames provided to the Injector, contained in :cpp:class:`video frames `, must be YUV 65 | pixels. 66 | 67 | .. _media_source_file: 68 | 69 | Media File Source Sample 70 | __________________________________ 71 | The Media Source File sample library is a simple library that makes use of LibAV to read, demux, and decode audio and video frames. The top-level entity of this class is 72 | **dolbyio::comms::sample::file_source** that takes an instance of the Paced Injector and creates a capture thread that parses and decodes media. When a media frame is decoded, this entity pushes the frame to the Paced Injector. 73 | 74 | The Media File Source sample library provides the ability to parse the following types of media files: 75 | 76 | +-----------+ 77 | | Container | 78 | +===========+ 79 | | MP4 | 80 | +-----------+ 81 | | MOV | 82 | +-----------+ 83 | 84 | The Media File Source sample is able to decode the following video and audio codecs: 85 | 86 | +-------+--------------+---------------------+ 87 | | Codec | Type | Sample/Pixel Format | 88 | +=======+==============+=====================+ 89 | | AAC | Audio | float, planar | 90 | +-------+--------------+---------------------+ 91 | | H264 | Video | YUV | 92 | +-------+--------------+---------------------+ 93 | 94 | The library is included along with proper CMake file in the package under **share/dolbyio/comms/sample/media_source/** directory. A sample of the top-level object 95 | of the Media Source File library is in the following files: 96 | 97 | .. literalinclude:: ../../../src/public/dolbyio/comms/sample/media_source/file/source_capture.h 98 | :language: c++ 99 | 100 | .. literalinclude:: ../../../src/public/dolbyio/comms/sample/media_source/file/source_capture.cc 101 | :language: c++ 102 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/processor.rst.txt: -------------------------------------------------------------------------------- 1 | .. _plugin_video_processor: 2 | 3 | Video Processor Library 4 | ========================== 5 | 6 | The Video Processor library, available on Windows and MacOS platforms. For usage please refer to the **sample/utilities/vsl/interactions.cc** and desktop_app sample code. 7 | 8 | .. doxygenclass:: dolbyio::comms::plugin::video_processor 9 | :project: C++ SDK 10 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/recorder.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_recorder: 2 | 3 | Default Media Recorder 4 | ============================ 5 | 6 | The default recorder handles the incoming media streams and stores the streams in proper containers. The following table lists containers used for respective codecs: 7 | 8 | .. table:: 9 | 10 | +-------+----------+ 11 | | Codec | Container| 12 | +=======+==========+ 13 | | H264 | MPEG-TS | 14 | +-------+----------+ 15 | | VP8 | Matroska | 16 | +-------+----------+ 17 | | YUV | Matroska | 18 | +-------+----------+ 19 | | PCM | Matroska | 20 | +-------+----------+ 21 | | AAC | Matroska | 22 | +-------+----------+ 23 | 24 | .. note:: 25 | 26 | Recording of YUV frames is not supported on MacOS when the H264 codec is used in the conference. MacOS only supports dumping of Encoded Frames for H264. This restriction does not apply for VP8. 27 | 28 | The recorded files are placed in a directory specified when the default recorder is created. The files are stored with the respective container extension: 29 | 30 | * vid_X.mkv 31 | * vid_X.mpegts 32 | * audio_X.mkv 33 | 34 | Where X corresponds to a incrementing integer ID for the video/audio file. Information regarding which file represents which streamer is available in the metadata.txt file in the same folder. When a new file is created, the video_first_data event occurs that contains the file name and 35 | the video track ID for the video in the file. This metadata file contains the processed scpp events and media pipeline events. The types of events logged and 36 | the structure of the corresponding lines for the events in the metadata.txt file are as follows: 37 | 38 | .. table:: 39 | 40 | +-------------------------------+------------------------------------------------------------------------+ 41 | | Log Event | Output File Line | 42 | +===============================+========================================================================+ 43 | | Audio Track Added | +audio | 44 | +-------------------------------+------------------------------------------------------------------------+ 45 | | Audio Track First Data | track_first_data | 46 | +-------------------------------+------------------------------------------------------------------------+ 47 | | Audio Track Removed | -audio | 48 | +-------------------------------+------------------------------------------------------------------------+ 49 | | Conference Ended | conference_ended | 50 | +-------------------------------+------------------------------------------------------------------------+ 51 | | Participant Added | +peer | 52 | +-------------------------------+------------------------------------------------------------------------+ 53 | | Participant Removed | -peer | 54 | +-------+-----------------------+------------------------------------------------------------------------+ 55 | | Video Track Added | +video | 56 | +-------------------------------+------------------------------------------------------------------------+ 57 | | Video Track Removed | -video | 58 | +-------------------------------+------------------------------------------------------------------------+ 59 | | Video Track First Data | track_first_data | 60 | +-------------------------------+------------------------------------------------------------------------+ 61 | 62 | WebRTC may change the format in which RAW audio is presented to the audio track sinks. This may have severe impact on the raw (PCM) and transcoded (AAC) capture; when this situation occurs, a new file is created. The encoded video resolution change can be seamlessly muxed into the stream, but the raw (YUV) video resolution change cannot. Therefore, selecting the YUV output causes the video frame size reconfigurations to open new files. In the case of encoded video capture, we could generate the file name for the stream at the time the stream is first discovered (the +video event), but for consistency the file name is also generated on the track first data event. 63 | 64 | 65 | .. _recorder: 66 | 67 | Default Recorder Interface 68 | -------------------------- 69 | #include 70 | 71 | The recorder interface is used for configuring the default recorder. The methods in the recorder interface are used to create and configure the recording module. This 72 | creates and configures the recording module that is provided as a part of the C++ SDK. The enums of the interface are used for setting the Video/Audio storage formats of the media. If you want to build your own recorder module, do not use this API. 73 | 74 | .. doxygenclass:: dolbyio::comms::plugin::recorder 75 | :project: C++ SDK 76 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/sdk.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_sdk: 2 | 3 | Sdk Interface 4 | ============= 5 | #include 6 | 7 | This interface is the starting point for the SDK. It exposes methods that allow initializing the SDK and accessing the underlying services. The basic steps to use the SDK are: 8 | 1) Acquire the necessary Access Token from the application server. This is a mandatory step that allows using the SDK. 9 | 2) Set a log level for the SDK :cpp:func:`sdk::set_log_level `. For the possible log levels, see the :ref:`api_log_level` enum. 10 | 3) Create the SDK using :cpp:func:`sdk::create `. The create call needs to pass a valid access token in order to initialize the SDK. Wait for the return of the create call. 11 | 4) Log in to the Dolby.io backend. For more information, see the :ref:`api_session`. 12 | 5) Retrieve a reference to :ref:`sess_serv` through :cpp:func:`sdk::session `. 13 | 6) Create and join a conference. A reference to the :ref:`conf_serv` can be retrieved through the :cpp:func:`sdk::conference `. 14 | 7) Manage Audio Devices using the :ref:`devman_serv`. A reference to this service can be retrieved through :cpp:func:`sdk::device_management `. 15 | 8) Manage local and remote Audio streams using the :ref:`api_audio_service`. A reference to this service can be retrieved through :cpp:func:`sdk::audio `. 16 | 9) Manage local Video stream using the :ref:`api_video_service`. A reference to this service can be retrieved through :cpp:func:`sdk::video `. 17 | 10) The destructor for the SDK performs necessary cleanups when the SDK instance goes out of scope. This means that you do not need to perform any cleanup. 18 | 19 | .. _sdk_class: 20 | 21 | .. doxygenclass:: dolbyio::comms::sdk 22 | :project: C++ SDK 23 | 24 | .. doxygenclass:: dolbyio::comms::refresh_token 25 | :project: C++ SDK 26 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/session.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_session: 2 | 3 | Session Service 4 | =============== 5 | The Session Service allows logging in and out of the Dolby.io backend. Logging into the backend is essential for the SDK to receive backend 6 | notifications in and out of a conference; the Session Service provides APIs for the application to manage subscriptions to various types 7 | of the backend notifications. 8 | 9 | The basic usage of the session service is: 10 | 1) Log in to the session using the :cpp:func:`session::open ` command. 11 | 2) Listen to a conference and record it. For more information, see the :ref:`api_conference`. 12 | 3) Log out of the session using the :cpp:func:`session::close ` method. 13 | 14 | .. _sess_serv: 15 | 16 | Session Interface 17 | ----------------- 18 | #include 19 | 20 | The methods of the Session Interface provide the ability to connect to the Dolby.io 21 | backend. The session service methods are all asynchronous in nature. For more information, refer to :ref:`api_async_result`. The structures defined in the interface 22 | are used by and returned by methods of the interface. 23 | 24 | 25 | .. doxygenclass:: dolbyio::comms::services::session 26 | :project: C++ SDK 27 | 28 | Other Structures 29 | ---------------- 30 | Other structures used by the :ref:`api_session`, which are not defined in the :ref:`sess_serv` interface. 31 | 32 | .. doxygenstruct:: dolbyio::comms::token_expired_event 33 | :project: C++ SDK 34 | 35 | .. doxygenenum:: dolbyio::comms::notification_subscription_type 36 | :project: C++ SDK 37 | 38 | .. doxygenstruct:: dolbyio::comms::notification_subscription 39 | :project: C++ SDK 40 | 41 | .. doxygenstruct:: dolbyio::comms::subscription_events::conference 42 | :project: C++ SDK 43 | 44 | .. doxygenstruct:: dolbyio::comms::subscription_events::participant_joined 45 | :project: C++ SDK 46 | 47 | .. doxygenstruct:: dolbyio::comms::subscription_events::participant_left 48 | :project: C++ SDK 49 | 50 | .. doxygenstruct:: dolbyio::comms::subscription_events::active_participants 51 | :project: C++ SDK 52 | 53 | .. doxygenstruct:: dolbyio::comms::subscription_events::conference_status 54 | :project: C++ SDK 55 | 56 | .. doxygenstruct:: dolbyio::comms::subscription_events::conference_created 57 | :project: C++ SDK 58 | 59 | .. doxygenstruct:: dolbyio::comms::subscription_events::conference_ended 60 | :project: C++ SDK 61 | -------------------------------------------------------------------------------- /docs/_sources/api/sdk/video.rst.txt: -------------------------------------------------------------------------------- 1 | .. _api_video_service: 2 | 3 | Video Service 4 | ============= 5 | 6 | The Video Service allows managing the local participant's video stream as well as attaching a Video Sink to remote video streams. 7 | 8 | Video interface 9 | --------------- 10 | #include 11 | 12 | .. doxygenclass:: dolbyio::comms::services::video 13 | 14 | Local video 15 | ----------- 16 | .. doxygenclass:: dolbyio::comms::services::local_video 17 | 18 | 19 | Remote video 20 | ------------ 21 | The remote video API allows attaching a :cpp:class:`Video Sink ` to receive :cpp:class:`Raw Video Frames `. These video frames can then be handled as the application desires. For example, for rendering on screen or dumping to a file. 22 | 23 | .. doxygenclass:: dolbyio::comms::services::remote_video 24 | 25 | .. _vid_frame_handle: 26 | 27 | Video Forwarding Startegy 28 | _________________________ 29 | Using the :cpp:enum:`Video Forwarding Strategy ` option when :cpp:func:`joining a conference ` applications can set how many video streams they want forwarded to them. They can then :cpp:func:`subscribe ` to the :cpp:class:`vfs event ` which can be used to know which participants streams are being forwarded to them at a given time and thus which streams to render. 30 | 31 | .. doxygenstruct:: dolbyio::comms::utils::vfs_event 32 | 33 | Video frame handling 34 | --------------------- 35 | #include 36 | 37 | The application can use the :cpp:class:`video frame handling ` capabilities of the SDK to process captured :cpp:class:`VideoFrames `. The frame handler is an interface providing a :cpp:class:`Video Sink ` and a :cpp:class:`Video Source `, thus inserting the frame handler into the video capture pipeline allows the application to receive, process, and then inject 38 | :cpp:class:`VideoFrames ` into the SDK. If you want to only provide frames to the SDK, the application only needs to implement the :cpp:class:`Video Source ` portion of the handler. 39 | 40 | The :ref:`cv_p_example` section shows a very basic idea for implementing a Video Processor to receive camera frames, alter them and inject them back into the SDK. Note that this is just an example 41 | to give an idea of how to create such a module. 42 | After creating a custom video processor module like the example, one must call :cpp:func:`start video ` and provide the processor to this function 43 | call. At this point the processor will be part of the Video Capture pipeline and all camera frames will pass through it. 44 | 45 | .. doxygenclass:: dolbyio::comms::video_frame_handler 46 | 47 | .. doxygenclass:: dolbyio::comms::video_sink 48 | 49 | .. doxygenclass:: dolbyio::comms::video_source 50 | 51 | Video frame API 52 | --------------- 53 | #include 54 | 55 | Video frame interface 56 | _____________________ 57 | 58 | .. doxygenclass:: dolbyio::comms::video_frame 59 | 60 | Video frame buffer interface 61 | ____________________________ 62 | 63 | .. doxygenclass:: dolbyio::comms::video_frame_buffer 64 | 65 | YUV420 video frame buffer 66 | _________________________ 67 | #include 68 | 69 | .. doxygenclass:: dolbyio::comms::video_frame_buffer_i420_interface 70 | .. doxygenclass:: dolbyio::comms::video_frame_buffer_i420 71 | 72 | NV12 video frame buffer 73 | _______________________ 74 | #include 75 | 76 | .. doxygenclass:: dolbyio::comms::video_frame_buffer_nv12_interface 77 | .. doxygenclass:: dolbyio::comms::video_frame_buffer_nv12 78 | 79 | Native video frame buffer 80 | _________________________ 81 | 82 | .. doxygenclass:: dolbyio::comms::video_frame_buffer_native_interface 83 | 84 | ARGB video frame buffer 85 | _______________________ 86 | #include 87 | 88 | .. doxygenclass:: dolbyio::comms::video_frame_buffer_argb_interface 89 | .. doxygenclass:: dolbyio::comms::video_frame_buffer_argb 90 | 91 | Video utilities 92 | _______________ 93 | #include 94 | 95 | .. doxygenclass:: dolbyio::comms::video_utils::format_converter 96 | -------------------------------------------------------------------------------- /docs/_sources/index.rst.txt: -------------------------------------------------------------------------------- 1 | C++ SDK |release| Documentation 2 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 3 | 4 | Overview 5 | """""""" 6 | The Dolby.io Communications C++ SDK provides applications the ability to create high-quality voice and video for fully immersive real-time communications experiences. The C++ SDK allows creating an application that can join Dolby.io conferences. 7 | 8 | The C++ SDK is responsible for communicating with the Dolby.io backend and providing conferencing functionalities, such as opening and closing sessions, joining and leaving conferences, sending and receiving messages, as well as receiving and injecting WebRTC media streams. 9 | 10 | Currently, an instance of the C++ SDK can connect to only one conference at a time. Joining multiple conferences at a time requires running multiple instances of the application. 11 | 12 | Core SDK 13 | ======== 14 | The Core C++ SDK handles all of the signalling with the Dolby.io backend as well as providing various events, messages and other valuable information to users. The Dolby.io Communications C++ SDK allows joining 15 | Dolby Voice Conferences where participants can send and receive high-quality voice streams, including Dolby.io Spatial Audio, powered by Dolby Atmos technology, and shared scenes. This functionality is useful for integrating the Dolby Voice experience 16 | into your own game engine or virtual world experience. The C++ SDK provides applications the ability to capture and playback audio and video, manage input and output audio devices and input video devices, add 17 | spatial placement for participants, as well as partake in a shared spatial scene. 18 | 19 | The Audio captured using the Core C++ SDK features is processed using Dolby Voice audio processing allowing for clear, crisp conversations without echo or background noise and provides the option to use Dolby's world class 3D audio spatialization. 20 | 21 | The C++ SDK offers full control of the video capture pipeline to applications. For instance allowing developers to implement video filters and apply them to a user’s camera feed. As part of our documentation we provide 22 | :ref:`an example ` of how this can be done. 23 | 24 | Media IO 25 | =================== 26 | In addition to the Core features, the Dolby.io Communications C++ SDK also provides Media IO features. These include injecting audio from custom sources into conferences, connecting audio sinks to 27 | receive decoded PCM audio data and receiving encoded video frames before they are decoded. These features allow applications to connect as a client to a Dolby.io conference and record all of the present 28 | participants' video and audio. Think of it as recording a conference on your own machine without needing to pay for recording minutes. Additionally you can inject some media from an external source (a file for instance) into the conference (especially applicable for Virtual Worlds for example). Note that using the Media IO features for Audio currently forces the use of the Opus Codec. 29 | 30 | To record conferences, the C++ SDK exposes incoming Audio and Video frames via the :cpp:class:`Audio Sink ` and :cpp:class:`Video Sink `/:cpp:class:`Encoded Video Sink ` interfaces. Applications can implement these interfaces themselves and use respective services to provide the recorders/injectors to the SDK. 31 | 32 | Plugins 33 | ======= 34 | The C++ SDK also allows applications to make use of our ready-to-use :ref:`plugins_api`. The C++ SDK provides a default media recorder plugin; a ready-to-use library that can be easily configured and included in an application. The plugin automatically records the incoming media streams for conference participants and stores the recorded streams in either raw or encoded format. 35 | 36 | The C++ SDK provides two default media injection plugins that are able to receive raw media frames and pass them to the SDK. One of the default plugins is the Pacing Injector. This injector exposes interfaces for an application to provide the 37 | injector with decoded audio and video frames. Then, the injector provides these frames into the SDK at specified intervals. The other default plugin is the Passthrough-Injector, which exposes interfaces for passing decoded audio/video 38 | frames that are directly provided to the SDK. 39 | 40 | Table of Contents 41 | ----------------- 42 | 43 | .. toctree:: 44 | :maxdepth: 2 45 | :glob: 46 | 47 | Overview 48 | other/getting_started 49 | other/run_time_deps 50 | other/supported_platforms 51 | api/coresdk 52 | api/media_io 53 | api/plugins 54 | 55 | Indices and tables 56 | ------------------ 57 | * :ref:`genindex` 58 | * :ref:`search` 59 | -------------------------------------------------------------------------------- /docs/_sources/other/run_time_deps.rst.txt: -------------------------------------------------------------------------------- 1 | .. _run_time_deps: 2 | 3 | Run Time Dependencies 4 | ====================== 5 | 6 | MacOS systems 7 | ------------- 8 | 9 | System event loop 10 | _________________ 11 | - Ensure that the application has started its mainQueue. This must be done as any UI Rendering of Video Frames or receiving of AVCaptureDevice events relies on the existence of an active mainQueue. 12 | - In our samples we enable the mainQueue to start processing events as follows (refer to **share/dolbyio/comms/sample/utilities/ui_loop/macos_ui.mm** for more details): 13 | 14 | .. code-block:: c++ 15 | 16 | [NSApp run] 17 | 18 | - **IMPORTANT:** On macOS some operations performed by the SDK require using the application mainQueue. Blocking the application mainQueue while awaiting any specific SDK operation to finish may lead to deadlocks. Refer to following documentation section to see how to properly :ref:`chain asynchronous operations ` and avoid the need for blocking. 19 | 20 | 21 | Microphone/camera permission 22 | _____________________________ 23 | - Ensure that terminal has access to a microphone and a camera. 24 | - If not provided, the SDK will request access when launching application; then make sure to grant permission. 25 | - Failure to grant permissions will not allow the SDK to capture audio/video and send it into the conference. 26 | 27 | Windows systems 28 | --------------- 29 | 30 | CRT version 31 | ___________ 32 | - All components of the SDK use the dynamic, release, multithreaded runtime. The SDK API requires passing some memory ownership between the application and the SDK. 33 | - The application needs to use the dynamic, release, multithreaded CRT in the code which interfaces with the SDK. 34 | - In order to achieve this, the **/MD** switch should be used for the MSVC compiler; the sample code uses the CMake build system 35 | - CMake-based applications can easily enforce using the correct CRT flavour using the following directive in the CMakeLists.txt file: 36 | 37 | .. code-block:: console 38 | 39 | set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL) 40 | 41 | Microphone/camera permission 42 | _____________________________ 43 | - Ensure that terminal has access to a microphone and a camera. 44 | - If not provided, the SDK will request access when launching application; then make sure to grant permission. 45 | - Failure to grant permissions will not allow the SDK to capture audio/video and send it into the conference. 46 | 47 | Linux systems 48 | ------------- 49 | 50 | PulseAudio 51 | __________ 52 | - On Linux systems the C++ SDK needs access to the PulseAudio Sound Server in order to successfully initialize. 53 | - Make sure that the Ubuntu has either system wide PulseAudio running or that an instance of PulseAudio is started by the same user who will run the application. 54 | - To check if you have pulseaudio installed you can run: 55 | 56 | .. code-block:: console 57 | 58 | $ pulseaudio --version 59 | 60 | - The Ubuntu machine should already have pulseaudio installed, but if it does not, run the following command. Please note, to use package manager you need to be super user. 61 | 62 | .. code-block:: console 63 | 64 | $ sudo apt-get install pulseaudio 65 | 66 | - When it is installed, start pulseaudio for your user as follows: 67 | 68 | .. code-block:: console 69 | 70 | $ pulseaudio 71 | -------------------------------------------------------------------------------- /docs/_sources/other/supported_platforms.rst.txt: -------------------------------------------------------------------------------- 1 | .. _supported_platforms: 2 | 3 | Supported Platforms 4 | =================== 5 | 6 | The C++ SDK is compatible with the following operating systems: 7 | 8 | * Ubuntu 20.04+ 9 | * x86_64 10 | * gcc9/gnustl, clang10/libc++ 11 | * Debian 11 (Beta) 12 | * arm64 13 | * gcc9/gnustl 14 | * MacOS 10.15+ 15 | * x86_64, arm64 16 | * Windows 10+ 17 | * x86_64 18 | * Windows SDK 10.0.20348.0+ 19 | -------------------------------------------------------------------------------- /docs/_static/_sphinx_javascript_frameworks_compat.js: -------------------------------------------------------------------------------- 1 | /* 2 | * _sphinx_javascript_frameworks_compat.js 3 | * ~~~~~~~~~~ 4 | * 5 | * Compatability shim for jQuery and underscores.js. 6 | * 7 | * WILL BE REMOVED IN Sphinx 6.0 8 | * xref RemovedInSphinx60Warning 9 | * 10 | */ 11 | 12 | /** 13 | * select a different prefix for underscore 14 | */ 15 | $u = _.noConflict(); 16 | 17 | 18 | /** 19 | * small helper function to urldecode strings 20 | * 21 | * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL 22 | */ 23 | jQuery.urldecode = function(x) { 24 | if (!x) { 25 | return x 26 | } 27 | return decodeURIComponent(x.replace(/\+/g, ' ')); 28 | }; 29 | 30 | /** 31 | * small helper function to urlencode strings 32 | */ 33 | jQuery.urlencode = encodeURIComponent; 34 | 35 | /** 36 | * This function returns the parsed url parameters of the 37 | * current request. Multiple values per key are supported, 38 | * it will always return arrays of strings for the value parts. 39 | */ 40 | jQuery.getQueryParameters = function(s) { 41 | if (typeof s === 'undefined') 42 | s = document.location.search; 43 | var parts = s.substr(s.indexOf('?') + 1).split('&'); 44 | var result = {}; 45 | for (var i = 0; i < parts.length; i++) { 46 | var tmp = parts[i].split('=', 2); 47 | var key = jQuery.urldecode(tmp[0]); 48 | var value = jQuery.urldecode(tmp[1]); 49 | if (key in result) 50 | result[key].push(value); 51 | else 52 | result[key] = [value]; 53 | } 54 | return result; 55 | }; 56 | 57 | /** 58 | * highlight a given string on a jquery object by wrapping it in 59 | * span elements with the given class name. 60 | */ 61 | jQuery.fn.highlightText = function(text, className) { 62 | function highlight(node, addItems) { 63 | if (node.nodeType === 3) { 64 | var val = node.nodeValue; 65 | var pos = val.toLowerCase().indexOf(text); 66 | if (pos >= 0 && 67 | !jQuery(node.parentNode).hasClass(className) && 68 | !jQuery(node.parentNode).hasClass("nohighlight")) { 69 | var span; 70 | var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); 71 | if (isInSVG) { 72 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 73 | } else { 74 | span = document.createElement("span"); 75 | span.className = className; 76 | } 77 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 78 | node.parentNode.insertBefore(span, node.parentNode.insertBefore( 79 | document.createTextNode(val.substr(pos + text.length)), 80 | node.nextSibling)); 81 | node.nodeValue = val.substr(0, pos); 82 | if (isInSVG) { 83 | var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); 84 | var bbox = node.parentElement.getBBox(); 85 | rect.x.baseVal.value = bbox.x; 86 | rect.y.baseVal.value = bbox.y; 87 | rect.width.baseVal.value = bbox.width; 88 | rect.height.baseVal.value = bbox.height; 89 | rect.setAttribute('class', className); 90 | addItems.push({ 91 | "parent": node.parentNode, 92 | "target": rect}); 93 | } 94 | } 95 | } 96 | else if (!jQuery(node).is("button, select, textarea")) { 97 | jQuery.each(node.childNodes, function() { 98 | highlight(this, addItems); 99 | }); 100 | } 101 | } 102 | var addItems = []; 103 | var result = this.each(function() { 104 | highlight(this, addItems); 105 | }); 106 | for (var i = 0; i < addItems.length; ++i) { 107 | jQuery(addItems[i].parent).before(addItems[i].target); 108 | } 109 | return result; 110 | }; 111 | 112 | /* 113 | * backward compatibility for jQuery.browser 114 | * This will be supported until firefox bug is fixed. 115 | */ 116 | if (!jQuery.browser) { 117 | jQuery.uaMatch = function(ua) { 118 | ua = ua.toLowerCase(); 119 | 120 | var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || 121 | /(webkit)[ \/]([\w.]+)/.exec(ua) || 122 | /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || 123 | /(msie) ([\w.]+)/.exec(ua) || 124 | ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || 125 | []; 126 | 127 | return { 128 | browser: match[ 1 ] || "", 129 | version: match[ 2 ] || "0" 130 | }; 131 | }; 132 | jQuery.browser = {}; 133 | jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; 134 | } 135 | -------------------------------------------------------------------------------- /docs/_static/css/badge_only.css: -------------------------------------------------------------------------------- 1 | .clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} -------------------------------------------------------------------------------- /docs/_static/css/custom.css: -------------------------------------------------------------------------------- 1 | .wy-nav-content { 2 | max-width: none; 3 | } 4 | -------------------------------------------------------------------------------- /docs/_static/css/fonts/Roboto-Slab-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/Roboto-Slab-Bold.woff -------------------------------------------------------------------------------- /docs/_static/css/fonts/Roboto-Slab-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/Roboto-Slab-Bold.woff2 -------------------------------------------------------------------------------- /docs/_static/css/fonts/Roboto-Slab-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/Roboto-Slab-Regular.woff -------------------------------------------------------------------------------- /docs/_static/css/fonts/Roboto-Slab-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/Roboto-Slab-Regular.woff2 -------------------------------------------------------------------------------- /docs/_static/css/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /docs/_static/css/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /docs/_static/css/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /docs/_static/css/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /docs/_static/css/fonts/lato-bold-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/lato-bold-italic.woff -------------------------------------------------------------------------------- /docs/_static/css/fonts/lato-bold-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/lato-bold-italic.woff2 -------------------------------------------------------------------------------- /docs/_static/css/fonts/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/lato-bold.woff -------------------------------------------------------------------------------- /docs/_static/css/fonts/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/lato-bold.woff2 -------------------------------------------------------------------------------- /docs/_static/css/fonts/lato-normal-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/lato-normal-italic.woff -------------------------------------------------------------------------------- /docs/_static/css/fonts/lato-normal-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/lato-normal-italic.woff2 -------------------------------------------------------------------------------- /docs/_static/css/fonts/lato-normal.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/lato-normal.woff -------------------------------------------------------------------------------- /docs/_static/css/fonts/lato-normal.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/css/fonts/lato-normal.woff2 -------------------------------------------------------------------------------- /docs/_static/doctools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * doctools.js 3 | * ~~~~~~~~~~~ 4 | * 5 | * Base JavaScript utilities for all Sphinx HTML documentation. 6 | * 7 | * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | "use strict"; 12 | 13 | const _ready = (callback) => { 14 | if (document.readyState !== "loading") { 15 | callback(); 16 | } else { 17 | document.addEventListener("DOMContentLoaded", callback); 18 | } 19 | }; 20 | 21 | /** 22 | * highlight a given string on a node by wrapping it in 23 | * span elements with the given class name. 24 | */ 25 | const _highlight = (node, addItems, text, className) => { 26 | if (node.nodeType === Node.TEXT_NODE) { 27 | const val = node.nodeValue; 28 | const parent = node.parentNode; 29 | const pos = val.toLowerCase().indexOf(text); 30 | if ( 31 | pos >= 0 && 32 | !parent.classList.contains(className) && 33 | !parent.classList.contains("nohighlight") 34 | ) { 35 | let span; 36 | 37 | const closestNode = parent.closest("body, svg, foreignObject"); 38 | const isInSVG = closestNode && closestNode.matches("svg"); 39 | if (isInSVG) { 40 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 41 | } else { 42 | span = document.createElement("span"); 43 | span.classList.add(className); 44 | } 45 | 46 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 47 | parent.insertBefore( 48 | span, 49 | parent.insertBefore( 50 | document.createTextNode(val.substr(pos + text.length)), 51 | node.nextSibling 52 | ) 53 | ); 54 | node.nodeValue = val.substr(0, pos); 55 | 56 | if (isInSVG) { 57 | const rect = document.createElementNS( 58 | "http://www.w3.org/2000/svg", 59 | "rect" 60 | ); 61 | const bbox = parent.getBBox(); 62 | rect.x.baseVal.value = bbox.x; 63 | rect.y.baseVal.value = bbox.y; 64 | rect.width.baseVal.value = bbox.width; 65 | rect.height.baseVal.value = bbox.height; 66 | rect.setAttribute("class", className); 67 | addItems.push({ parent: parent, target: rect }); 68 | } 69 | } 70 | } else if (node.matches && !node.matches("button, select, textarea")) { 71 | node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); 72 | } 73 | }; 74 | const _highlightText = (thisNode, text, className) => { 75 | let addItems = []; 76 | _highlight(thisNode, addItems, text, className); 77 | addItems.forEach((obj) => 78 | obj.parent.insertAdjacentElement("beforebegin", obj.target) 79 | ); 80 | }; 81 | 82 | /** 83 | * Small JavaScript module for the documentation. 84 | */ 85 | const Documentation = { 86 | init: () => { 87 | Documentation.highlightSearchWords(); 88 | Documentation.initDomainIndexTable(); 89 | Documentation.initOnKeyListeners(); 90 | }, 91 | 92 | /** 93 | * i18n support 94 | */ 95 | TRANSLATIONS: {}, 96 | PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), 97 | LOCALE: "unknown", 98 | 99 | // gettext and ngettext don't access this so that the functions 100 | // can safely bound to a different name (_ = Documentation.gettext) 101 | gettext: (string) => { 102 | const translated = Documentation.TRANSLATIONS[string]; 103 | switch (typeof translated) { 104 | case "undefined": 105 | return string; // no translation 106 | case "string": 107 | return translated; // translation exists 108 | default: 109 | return translated[0]; // (singular, plural) translation tuple exists 110 | } 111 | }, 112 | 113 | ngettext: (singular, plural, n) => { 114 | const translated = Documentation.TRANSLATIONS[singular]; 115 | if (typeof translated !== "undefined") 116 | return translated[Documentation.PLURAL_EXPR(n)]; 117 | return n === 1 ? singular : plural; 118 | }, 119 | 120 | addTranslations: (catalog) => { 121 | Object.assign(Documentation.TRANSLATIONS, catalog.messages); 122 | Documentation.PLURAL_EXPR = new Function( 123 | "n", 124 | `return (${catalog.plural_expr})` 125 | ); 126 | Documentation.LOCALE = catalog.locale; 127 | }, 128 | 129 | /** 130 | * highlight the search words provided in the url in the text 131 | */ 132 | highlightSearchWords: () => { 133 | const highlight = 134 | new URLSearchParams(window.location.search).get("highlight") || ""; 135 | const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); 136 | if (terms.length === 0) return; // nothing to do 137 | 138 | // There should never be more than one element matching "div.body" 139 | const divBody = document.querySelectorAll("div.body"); 140 | const body = divBody.length ? divBody[0] : document.querySelector("body"); 141 | window.setTimeout(() => { 142 | terms.forEach((term) => _highlightText(body, term, "highlighted")); 143 | }, 10); 144 | 145 | const searchBox = document.getElementById("searchbox"); 146 | if (searchBox === null) return; 147 | searchBox.appendChild( 148 | document 149 | .createRange() 150 | .createContextualFragment( 151 | '" 155 | ) 156 | ); 157 | }, 158 | 159 | /** 160 | * helper function to hide the search marks again 161 | */ 162 | hideSearchWords: () => { 163 | document 164 | .querySelectorAll("#searchbox .highlight-link") 165 | .forEach((el) => el.remove()); 166 | document 167 | .querySelectorAll("span.highlighted") 168 | .forEach((el) => el.classList.remove("highlighted")); 169 | const url = new URL(window.location); 170 | url.searchParams.delete("highlight"); 171 | window.history.replaceState({}, "", url); 172 | }, 173 | 174 | /** 175 | * helper function to focus on search bar 176 | */ 177 | focusSearchBar: () => { 178 | document.querySelectorAll("input[name=q]")[0]?.focus(); 179 | }, 180 | 181 | /** 182 | * Initialise the domain index toggle buttons 183 | */ 184 | initDomainIndexTable: () => { 185 | const toggler = (el) => { 186 | const idNumber = el.id.substr(7); 187 | const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); 188 | if (el.src.substr(-9) === "minus.png") { 189 | el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; 190 | toggledRows.forEach((el) => (el.style.display = "none")); 191 | } else { 192 | el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; 193 | toggledRows.forEach((el) => (el.style.display = "")); 194 | } 195 | }; 196 | 197 | const togglerElements = document.querySelectorAll("img.toggler"); 198 | togglerElements.forEach((el) => 199 | el.addEventListener("click", (event) => toggler(event.currentTarget)) 200 | ); 201 | togglerElements.forEach((el) => (el.style.display = "")); 202 | if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); 203 | }, 204 | 205 | initOnKeyListeners: () => { 206 | // only install a listener if it is really needed 207 | if ( 208 | !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && 209 | !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS 210 | ) 211 | return; 212 | 213 | const blacklistedElements = new Set([ 214 | "TEXTAREA", 215 | "INPUT", 216 | "SELECT", 217 | "BUTTON", 218 | ]); 219 | document.addEventListener("keydown", (event) => { 220 | if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements 221 | if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys 222 | 223 | if (!event.shiftKey) { 224 | switch (event.key) { 225 | case "ArrowLeft": 226 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; 227 | 228 | const prevLink = document.querySelector('link[rel="prev"]'); 229 | if (prevLink && prevLink.href) { 230 | window.location.href = prevLink.href; 231 | event.preventDefault(); 232 | } 233 | break; 234 | case "ArrowRight": 235 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; 236 | 237 | const nextLink = document.querySelector('link[rel="next"]'); 238 | if (nextLink && nextLink.href) { 239 | window.location.href = nextLink.href; 240 | event.preventDefault(); 241 | } 242 | break; 243 | case "Escape": 244 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; 245 | Documentation.hideSearchWords(); 246 | event.preventDefault(); 247 | } 248 | } 249 | 250 | // some keyboard layouts may need Shift to get / 251 | switch (event.key) { 252 | case "/": 253 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; 254 | Documentation.focusSearchBar(); 255 | event.preventDefault(); 256 | } 257 | }); 258 | }, 259 | }; 260 | 261 | // quick alias for translations 262 | const _ = Documentation.gettext; 263 | 264 | _ready(Documentation.init); 265 | -------------------------------------------------------------------------------- /docs/_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | var DOCUMENTATION_OPTIONS = { 2 | URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), 3 | VERSION: '2.6.1', 4 | LANGUAGE: 'en', 5 | COLLAPSE_INDEX: false, 6 | BUILDER: 'html', 7 | FILE_SUFFIX: '.html', 8 | LINK_SUFFIX: '.html', 9 | HAS_SOURCE: true, 10 | SOURCELINK_SUFFIX: '.txt', 11 | NAVIGATION_WITH_KEYS: false, 12 | SHOW_SEARCH_SUMMARY: true, 13 | ENABLE_SEARCH_SHORTCUTS: true, 14 | }; -------------------------------------------------------------------------------- /docs/_static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/favicon.ico -------------------------------------------------------------------------------- /docs/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/file.png -------------------------------------------------------------------------------- /docs/_static/graphviz.css: -------------------------------------------------------------------------------- 1 | /* 2 | * graphviz.css 3 | * ~~~~~~~~~~~~ 4 | * 5 | * Sphinx stylesheet -- graphviz extension. 6 | * 7 | * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | img.graphviz { 13 | border: 0; 14 | max-width: 100%; 15 | } 16 | 17 | object.graphviz { 18 | max-width: 100%; 19 | } 20 | -------------------------------------------------------------------------------- /docs/_static/js/badge_only.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); -------------------------------------------------------------------------------- /docs/_static/js/html5shiv-printshiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); -------------------------------------------------------------------------------- /docs/_static/js/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); -------------------------------------------------------------------------------- /docs/_static/js/theme.js: -------------------------------------------------------------------------------- 1 | !function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 63 | var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 64 | var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 65 | var s_v = "^(" + C + ")?" + v; // vowel in stem 66 | 67 | this.stemWord = function (w) { 68 | var stem; 69 | var suffix; 70 | var firstch; 71 | var origword = w; 72 | 73 | if (w.length < 3) 74 | return w; 75 | 76 | var re; 77 | var re2; 78 | var re3; 79 | var re4; 80 | 81 | firstch = w.substr(0,1); 82 | if (firstch == "y") 83 | w = firstch.toUpperCase() + w.substr(1); 84 | 85 | // Step 1a 86 | re = /^(.+?)(ss|i)es$/; 87 | re2 = /^(.+?)([^s])s$/; 88 | 89 | if (re.test(w)) 90 | w = w.replace(re,"$1$2"); 91 | else if (re2.test(w)) 92 | w = w.replace(re2,"$1$2"); 93 | 94 | // Step 1b 95 | re = /^(.+?)eed$/; 96 | re2 = /^(.+?)(ed|ing)$/; 97 | if (re.test(w)) { 98 | var fp = re.exec(w); 99 | re = new RegExp(mgr0); 100 | if (re.test(fp[1])) { 101 | re = /.$/; 102 | w = w.replace(re,""); 103 | } 104 | } 105 | else if (re2.test(w)) { 106 | var fp = re2.exec(w); 107 | stem = fp[1]; 108 | re2 = new RegExp(s_v); 109 | if (re2.test(stem)) { 110 | w = stem; 111 | re2 = /(at|bl|iz)$/; 112 | re3 = new RegExp("([^aeiouylsz])\\1$"); 113 | re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 114 | if (re2.test(w)) 115 | w = w + "e"; 116 | else if (re3.test(w)) { 117 | re = /.$/; 118 | w = w.replace(re,""); 119 | } 120 | else if (re4.test(w)) 121 | w = w + "e"; 122 | } 123 | } 124 | 125 | // Step 1c 126 | re = /^(.+?)y$/; 127 | if (re.test(w)) { 128 | var fp = re.exec(w); 129 | stem = fp[1]; 130 | re = new RegExp(s_v); 131 | if (re.test(stem)) 132 | w = stem + "i"; 133 | } 134 | 135 | // Step 2 136 | re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; 137 | if (re.test(w)) { 138 | var fp = re.exec(w); 139 | stem = fp[1]; 140 | suffix = fp[2]; 141 | re = new RegExp(mgr0); 142 | if (re.test(stem)) 143 | w = stem + step2list[suffix]; 144 | } 145 | 146 | // Step 3 147 | re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; 148 | if (re.test(w)) { 149 | var fp = re.exec(w); 150 | stem = fp[1]; 151 | suffix = fp[2]; 152 | re = new RegExp(mgr0); 153 | if (re.test(stem)) 154 | w = stem + step3list[suffix]; 155 | } 156 | 157 | // Step 4 158 | re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; 159 | re2 = /^(.+?)(s|t)(ion)$/; 160 | if (re.test(w)) { 161 | var fp = re.exec(w); 162 | stem = fp[1]; 163 | re = new RegExp(mgr1); 164 | if (re.test(stem)) 165 | w = stem; 166 | } 167 | else if (re2.test(w)) { 168 | var fp = re2.exec(w); 169 | stem = fp[1] + fp[2]; 170 | re2 = new RegExp(mgr1); 171 | if (re2.test(stem)) 172 | w = stem; 173 | } 174 | 175 | // Step 5 176 | re = /^(.+?)e$/; 177 | if (re.test(w)) { 178 | var fp = re.exec(w); 179 | stem = fp[1]; 180 | re = new RegExp(mgr1); 181 | re2 = new RegExp(meq1); 182 | re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 183 | if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) 184 | w = stem; 185 | } 186 | re = /ll$/; 187 | re2 = new RegExp(mgr1); 188 | if (re.test(w) && re2.test(w)) { 189 | re = /.$/; 190 | w = w.replace(re,""); 191 | } 192 | 193 | // and turn initial Y back to y 194 | if (firstch == "y") 195 | w = firstch.toLowerCase() + w.substr(1); 196 | return w; 197 | } 198 | } 199 | 200 | -------------------------------------------------------------------------------- /docs/_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/minus.png -------------------------------------------------------------------------------- /docs/_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/_static/plus.png -------------------------------------------------------------------------------- /docs/_static/pygments.css: -------------------------------------------------------------------------------- 1 | .highlight .hll { background-color: #ffffcc } 2 | .highlight { background: #eeffcc; } 3 | .highlight .c { color: #408090; font-style: italic } /* Comment */ 4 | .highlight .err { border: 1px solid #FF0000 } /* Error */ 5 | .highlight .k { color: #007020; font-weight: bold } /* Keyword */ 6 | .highlight .o { color: #666666 } /* Operator */ 7 | .highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ 8 | .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ 9 | .highlight .cp { color: #007020 } /* Comment.Preproc */ 10 | .highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ 11 | .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ 12 | .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ 13 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 14 | .highlight .ge { font-style: italic } /* Generic.Emph */ 15 | .highlight .gr { color: #FF0000 } /* Generic.Error */ 16 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 17 | .highlight .gi { color: #00A000 } /* Generic.Inserted */ 18 | .highlight .go { color: #333333 } /* Generic.Output */ 19 | .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ 20 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 21 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 22 | .highlight .gt { color: #0044DD } /* Generic.Traceback */ 23 | .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ 24 | .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ 25 | .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ 26 | .highlight .kp { color: #007020 } /* Keyword.Pseudo */ 27 | .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ 28 | .highlight .kt { color: #902000 } /* Keyword.Type */ 29 | .highlight .m { color: #208050 } /* Literal.Number */ 30 | .highlight .s { color: #4070a0 } /* Literal.String */ 31 | .highlight .na { color: #4070a0 } /* Name.Attribute */ 32 | .highlight .nb { color: #007020 } /* Name.Builtin */ 33 | .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ 34 | .highlight .no { color: #60add5 } /* Name.Constant */ 35 | .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ 36 | .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ 37 | .highlight .ne { color: #007020 } /* Name.Exception */ 38 | .highlight .nf { color: #06287e } /* Name.Function */ 39 | .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ 40 | .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ 41 | .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ 42 | .highlight .nv { color: #bb60d5 } /* Name.Variable */ 43 | .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ 44 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 45 | .highlight .mb { color: #208050 } /* Literal.Number.Bin */ 46 | .highlight .mf { color: #208050 } /* Literal.Number.Float */ 47 | .highlight .mh { color: #208050 } /* Literal.Number.Hex */ 48 | .highlight .mi { color: #208050 } /* Literal.Number.Integer */ 49 | .highlight .mo { color: #208050 } /* Literal.Number.Oct */ 50 | .highlight .sa { color: #4070a0 } /* Literal.String.Affix */ 51 | .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ 52 | .highlight .sc { color: #4070a0 } /* Literal.String.Char */ 53 | .highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ 54 | .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ 55 | .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ 56 | .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ 57 | .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ 58 | .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ 59 | .highlight .sx { color: #c65d09 } /* Literal.String.Other */ 60 | .highlight .sr { color: #235388 } /* Literal.String.Regex */ 61 | .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ 62 | .highlight .ss { color: #517918 } /* Literal.String.Symbol */ 63 | .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ 64 | .highlight .fm { color: #06287e } /* Name.Function.Magic */ 65 | .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ 66 | .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ 67 | .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ 68 | .highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ 69 | .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /docs/_static/sphinx_highlight.js: -------------------------------------------------------------------------------- 1 | /* Highlighting utilities for Sphinx HTML documentation. */ 2 | "use strict"; 3 | 4 | const SPHINX_HIGHLIGHT_ENABLED = true 5 | 6 | /** 7 | * highlight a given string on a node by wrapping it in 8 | * span elements with the given class name. 9 | */ 10 | const _highlight = (node, addItems, text, className) => { 11 | if (node.nodeType === Node.TEXT_NODE) { 12 | const val = node.nodeValue; 13 | const parent = node.parentNode; 14 | const pos = val.toLowerCase().indexOf(text); 15 | if ( 16 | pos >= 0 && 17 | !parent.classList.contains(className) && 18 | !parent.classList.contains("nohighlight") 19 | ) { 20 | let span; 21 | 22 | const closestNode = parent.closest("body, svg, foreignObject"); 23 | const isInSVG = closestNode && closestNode.matches("svg"); 24 | if (isInSVG) { 25 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 26 | } else { 27 | span = document.createElement("span"); 28 | span.classList.add(className); 29 | } 30 | 31 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 32 | parent.insertBefore( 33 | span, 34 | parent.insertBefore( 35 | document.createTextNode(val.substr(pos + text.length)), 36 | node.nextSibling 37 | ) 38 | ); 39 | node.nodeValue = val.substr(0, pos); 40 | 41 | if (isInSVG) { 42 | const rect = document.createElementNS( 43 | "http://www.w3.org/2000/svg", 44 | "rect" 45 | ); 46 | const bbox = parent.getBBox(); 47 | rect.x.baseVal.value = bbox.x; 48 | rect.y.baseVal.value = bbox.y; 49 | rect.width.baseVal.value = bbox.width; 50 | rect.height.baseVal.value = bbox.height; 51 | rect.setAttribute("class", className); 52 | addItems.push({ parent: parent, target: rect }); 53 | } 54 | } 55 | } else if (node.matches && !node.matches("button, select, textarea")) { 56 | node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); 57 | } 58 | }; 59 | const _highlightText = (thisNode, text, className) => { 60 | let addItems = []; 61 | _highlight(thisNode, addItems, text, className); 62 | addItems.forEach((obj) => 63 | obj.parent.insertAdjacentElement("beforebegin", obj.target) 64 | ); 65 | }; 66 | 67 | /** 68 | * Small JavaScript module for the documentation. 69 | */ 70 | const SphinxHighlight = { 71 | 72 | /** 73 | * highlight the search words provided in localstorage in the text 74 | */ 75 | highlightSearchWords: () => { 76 | if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight 77 | 78 | // get and clear terms from localstorage 79 | const url = new URL(window.location); 80 | const highlight = 81 | localStorage.getItem("sphinx_highlight_terms") 82 | || url.searchParams.get("highlight") 83 | || ""; 84 | localStorage.removeItem("sphinx_highlight_terms") 85 | url.searchParams.delete("highlight"); 86 | window.history.replaceState({}, "", url); 87 | 88 | // get individual terms from highlight string 89 | const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); 90 | if (terms.length === 0) return; // nothing to do 91 | 92 | // There should never be more than one element matching "div.body" 93 | const divBody = document.querySelectorAll("div.body"); 94 | const body = divBody.length ? divBody[0] : document.querySelector("body"); 95 | window.setTimeout(() => { 96 | terms.forEach((term) => _highlightText(body, term, "highlighted")); 97 | }, 10); 98 | 99 | const searchBox = document.getElementById("searchbox"); 100 | if (searchBox === null) return; 101 | searchBox.appendChild( 102 | document 103 | .createRange() 104 | .createContextualFragment( 105 | '" 109 | ) 110 | ); 111 | }, 112 | 113 | /** 114 | * helper function to hide the search marks again 115 | */ 116 | hideSearchWords: () => { 117 | document 118 | .querySelectorAll("#searchbox .highlight-link") 119 | .forEach((el) => el.remove()); 120 | document 121 | .querySelectorAll("span.highlighted") 122 | .forEach((el) => el.classList.remove("highlighted")); 123 | localStorage.removeItem("sphinx_highlight_terms") 124 | }, 125 | 126 | initEscapeListener: () => { 127 | // only install a listener if it is really needed 128 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; 129 | 130 | document.addEventListener("keydown", (event) => { 131 | // bail for input elements 132 | if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; 133 | // bail with special keys 134 | if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; 135 | if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { 136 | SphinxHighlight.hideSearchWords(); 137 | event.preventDefault(); 138 | } 139 | }); 140 | }, 141 | }; 142 | 143 | _ready(SphinxHighlight.highlightSearchWords); 144 | _ready(SphinxHighlight.initEscapeListener); 145 | -------------------------------------------------------------------------------- /docs/api/injection/video.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Video — C++ SDK 2.6.1 documentation 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 70 | 71 |
75 | 76 |
77 |
78 |
79 | 87 |
88 |
89 |
90 |
91 | 92 |
93 |

Video

94 |

For details about Video Injection please refer to Video Forwarding Startegy. The application must create a Video Source and then provide it to the SDK using the 95 | Local Video Service Start method.

96 |

See Example Injector Implementation for an example of child injection class for all possible media.

97 |
98 | 99 | 100 |
101 |
102 |
106 | 107 |
108 | 109 |
110 |

© Copyright Dolby Laboratories.

111 |
112 | 113 | Built with Sphinx using a 114 | theme 115 | provided by Read the Docs. 116 | 117 | 118 |
119 |
120 |
121 |
122 |
123 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /docs/api/media_injection.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Media Injection API — C++ SDK 2.1.0 documentation 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 63 | 64 |
68 | 69 |
70 |
71 |
72 | 79 |
80 |
81 |
82 |
83 | 84 |
85 |

Media Injection API

86 |
87 |

Note

88 |

The Media Injection feature of the C++SDK is intended for Server applications.

89 |
90 |

The Media Injection API provides interfaces for writing modules that inject audio/video frames into the CoreSDK. The API provides the ability to create a module that accepts raw video/audio 91 | frames from any media source and passes them to respective sinks: RTCAudio and RTCVideo. A media sink from 92 | the perspective of the injector is a media source from the perspective of the CoreSDK. The media is then encoded and the streams are sent into the conference. The C++ SDK provides a 93 | default injector module, explained in the Default Injector section, which the application can instantiate and provide raw frames to. This Default Injector module then takes 94 | care of getting the frames to the CoreSDK. The API for injecting media streams uses a pattern of setting producer objects, which are C++ classes with pure virtual functions. The virtual functions for 95 | connecting RTCAudioSource and RTCVideoSource to an injector are exposed through the 96 | audio and video source interface. The injector provides media frames to these RTC sources. The custom injector 97 | must also implement the dolbyio::comms::media_source_interface, which is the interface through which the injector is provided to the Conference Service.

98 | 106 |
107 | 108 | 109 |
110 |
111 |
115 | 116 |
117 | 118 |
119 |

© Copyright Dolby Laboratories.

120 |
121 | 122 | Built with Sphinx using a 123 | theme 124 | provided by Read the Docs. 125 | 126 | 127 |
128 |
129 |
130 |
131 |
132 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /docs/api/media_recording.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Media Recording API — C++ SDK 2.1.0 documentation 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 65 | 66 |
70 | 71 |
72 |
73 |
74 | 81 |
82 |
83 |
84 |
85 | 86 |
87 |

Media Recording API

88 |
89 |

Note

90 |

The Media Recording feature of the C++ SDK is intended for Server applications.

91 |
92 |

The Media Recording API provides interfaces for writing modules that allow recording audio and video. These modules are responsible for passing frames from incoming WebRTC Media Streams and handling, processing, and storing the media data. The C++ SDK provides a default recording module. However, using the Media Recording API, users can create and connect their own audio/video recording module to handle, process, and store streams from conferences. The API for recording media streams uses a pattern of setting listener objects, which are C++ classes with pure virtual functions. The virtual functions are exposed through sink interfaces for each of the type of media, which is provided by the Media Engine. The video data is received as Raw YUV frames or in the Encoded format. The audio data is received in the decoded format. Listeners set by the application are called whenever data is available; these methods are called on the dedicated WebRTC threads that produced the data.

93 | 103 |
104 | 105 | 106 |
107 |
108 |
112 | 113 |
114 | 115 |
116 |

© Copyright Dolby Laboratories.

117 |
118 | 119 | Built with Sphinx using a 120 | theme 121 | provided by Read the Docs. 122 | 123 | 124 |
125 |
126 |
127 |
128 |
129 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /docs/api/plugins.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Plugins — C++ SDK 2.6.1 documentation 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 66 | 67 |
71 | 72 |
73 |
74 |
75 | 82 |
83 |
84 |
85 |
86 | 87 |
88 |
89 |
90 |

Plugins

91 |

The video processing library is part of the dolbyio_video_processor library. Applications which would like to use our video processor should link against this library. The video processor library provides the ability to process frames captured from camera and blur the background, the processed frames can then be sent into the conference.

92 |

The media injection/recording plugins are provided as part of the dolbyio_multimedia_streaming_addon library. Applications that would like to use our Default Injector/Recorder modules should link against this library.

93 |

To record conferences, the C++ SDK uses a Media Recorder that allows processing and storing video frames from the incoming WebRTC media streams. The library provides a default media recorder plugin. The default media recorder plugin is 94 | a ready-to-use library that can be easily configured and included in an application. The plugin automatically records the incoming media streams for conference participants and stores the recorded streams in either raw or encoded format.

95 |

The library also provides two flavors of Media Injectors as plugins. One of the default plugins is the Pacing Injector. The injector exposes an interface for an application and allows passing decoded audio and video. Then, the injector provides these frames to WebRTC at specified intervals. This version of the plugin is suitable for injecting media files. The second default injection plugin is the Passthrough Injector, which exposes the application the same interface 96 | for injecting frames, but this plugin directly relays the frames it receives to WebRTC without any internal pacing. The media injection plugins do not provide capturing of audio or video; instead, they serve in constructing the respective media injection pipelines. The application is responsible for performing the audio and video capture and providing the decoded frames to the injector plugin.

97 | 104 |
105 | 106 | 107 |
108 |
109 |
113 | 114 |
115 | 116 |
117 |

© Copyright Dolby Laboratories.

118 |
119 | 120 | Built with Sphinx using a 121 | theme 122 | provided by Read the Docs. 123 | 124 | 125 |
126 |
127 |
128 |
129 |
130 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /docs/api/recording/events.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Media Recording Events — C++ SDK 2.6.1 documentation 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 72 | 73 |
77 | 78 |
79 |
80 |
81 | 89 |
90 |
91 |
92 |
93 | 94 |
95 |

Media Recording Events

96 |

The events which are of interest to record media can all be accessed and subscribed through the Conference Service. These Conference Events contain information about participants joining and leaving the conference as well as audio and video track events emitted by Webrtc necessary to configure the recording pipelines. These events 97 | will indicate when video or audio tracks have been added or removed from the peer connection and from which peers streams are coming via the same. 98 | The Media Recording Module should set handlers for all of these events via the dolbyio::comms::services::conference::add_event_handler() methods.

99 |
100 | 101 | 102 |
103 |
104 |
108 | 109 |
110 | 111 |
112 |

© Copyright Dolby Laboratories.

113 |
114 | 115 | Built with Sphinx using a 116 | theme 117 | provided by Read the Docs. 118 | 119 | 120 |
121 |
122 |
123 |
124 |
125 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /docs/api/recording/raw_video.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Raw Video — C++ SDK 2.6.1 documentation 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 72 | 73 |
77 | 78 |
79 |
80 |
81 | 89 |
90 |
91 |
92 |
93 | 94 |
95 |

Raw Video

96 |

#include <dolbyio/comms/media_engine/media_engine.h>

97 |

For details about Raw Video Recording an application must implement a Video Sink to receive the frames and provide this Video Sink to the SDK using the Remote Video Service.

98 |

See Example Recorder Implementation for a template for child recording class for all possible media.

99 |
100 | 101 | 102 |
103 |
104 |
108 | 109 |
110 | 111 |
112 |

© Copyright Dolby Laboratories.

113 |
114 | 115 | Built with Sphinx using a 116 | theme 117 | provided by Read the Docs. 118 | 119 | 120 |
121 |
122 |
123 |
124 |
125 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /docs/objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxeet/comms-sdk-cpp/1a4ab0cc19f364412f0845f7b1dacf82267f2ead/docs/objects.inv -------------------------------------------------------------------------------- /docs/other/run_time_deps.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Run Time Dependencies — C++ SDK 2.6.1 documentation 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 77 | 78 |
82 | 83 |
84 |
85 |
86 | 93 |
94 |
95 |
96 |
97 | 98 |
99 |

Run Time Dependencies

100 |
101 |

MacOS systems

102 |
103 |

System event loop

104 |
    105 |
  • Ensure that the application has started its mainQueue. This must be done as any UI Rendering of Video Frames or receiving of AVCaptureDevice events relies on the existence of an active mainQueue.

  • 106 |
  • In our samples we enable the mainQueue to start processing events as follows (refer to share/dolbyio/comms/sample/utilities/ui_loop/macos_ui.mm for more details):

  • 107 |
108 |
[NSApp run]
109 | 
110 |
111 |
    112 |
  • IMPORTANT: On macOS some operations performed by the SDK require using the application mainQueue. Blocking the application mainQueue while awaiting any specific SDK operation to finish may lead to deadlocks. Refer to following documentation section to see how to properly chain asynchronous operations and avoid the need for blocking.

  • 113 |
114 |
115 |
116 |

Microphone/camera permission

117 |
    118 |
  • Ensure that terminal has access to a microphone and a camera.

  • 119 |
  • If not provided, the SDK will request access when launching application; then make sure to grant permission.

  • 120 |
  • Failure to grant permissions will not allow the SDK to capture audio/video and send it into the conference.

  • 121 |
122 |
123 |
124 |
125 |

Windows systems

126 |
127 |

CRT version

128 |
    129 |
  • All components of the SDK use the dynamic, release, multithreaded runtime. The SDK API requires passing some memory ownership between the application and the SDK.

  • 130 |
  • The application needs to use the dynamic, release, multithreaded CRT in the code which interfaces with the SDK.

  • 131 |
  • In order to achieve this, the /MD switch should be used for the MSVC compiler; the sample code uses the CMake build system

  • 132 |
  • CMake-based applications can easily enforce using the correct CRT flavour using the following directive in the CMakeLists.txt file:

  • 133 |
134 |
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
135 | 
136 |
137 |
138 |
139 |

Microphone/camera permission

140 |
    141 |
  • Ensure that terminal has access to a microphone and a camera.

  • 142 |
  • If not provided, the SDK will request access when launching application; then make sure to grant permission.

  • 143 |
  • Failure to grant permissions will not allow the SDK to capture audio/video and send it into the conference.

  • 144 |
145 |
146 |
147 |
148 |

Linux systems

149 |
150 |

PulseAudio

151 |
    152 |
  • On Linux systems the C++ SDK needs access to the PulseAudio Sound Server in order to successfully initialize.

  • 153 |
  • Make sure that the Ubuntu has either system wide PulseAudio running or that an instance of PulseAudio is started by the same user who will run the application.

  • 154 |
  • To check if you have pulseaudio installed you can run:

  • 155 |
156 |
$ pulseaudio --version
157 | 
158 |
159 |
    160 |
  • The Ubuntu machine should already have pulseaudio installed, but if it does not, run the following command. Please note, to use package manager you need to be super user.

  • 161 |
162 |
$ sudo apt-get install pulseaudio
163 | 
164 |
165 |
    166 |
  • When it is installed, start pulseaudio for your user as follows:

  • 167 |
168 |
$ pulseaudio
169 | 
170 |
171 |
172 |
173 |
174 | 175 | 176 |
177 |
178 |
182 | 183 |
184 | 185 |
186 |

© Copyright Dolby Laboratories.

187 |
188 | 189 | Built with Sphinx using a 190 | theme 191 | provided by Read the Docs. 192 | 193 | 194 |
195 |
196 |
197 |
198 |
199 | 204 | 205 | 206 | -------------------------------------------------------------------------------- /docs/other/supported_platforms.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Supported Platforms — C++ SDK 2.6.1 documentation 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 61 | 62 |
66 | 67 |
68 |
69 |
70 | 77 |
78 |
79 |
80 |
81 | 82 |
83 |

Supported Platforms

84 |

The C++ SDK is compatible with the following operating systems:

85 |
    86 |
  • 87 |
    Ubuntu 20.04+
      88 |
    • x86_64

    • 89 |
    • gcc9/gnustl, clang10/libc++

    • 90 |
    91 |
    92 |
    93 |
  • 94 |
  • 95 |
    Debian 11 (Beta)
      96 |
    • arm64

    • 97 |
    • gcc9/gnustl

    • 98 |
    99 |
    100 |
    101 |
  • 102 |
  • 103 |
    MacOS 10.15+
      104 |
    • x86_64, arm64

    • 105 |
    106 |
    107 |
    108 |
  • 109 |
  • 110 |
    Windows 10+
      111 |
    • x86_64

    • 112 |
    • Windows SDK 10.0.20348.0+

    • 113 |
    114 |
    115 |
    116 |
  • 117 |
118 |
119 | 120 | 121 |
122 |
123 |
127 | 128 |
129 | 130 |
131 |

© Copyright Dolby Laboratories.

132 |
133 | 134 | Built with Sphinx using a 135 | theme 136 | provided by Read the Docs. 137 | 138 | 139 |
140 |
141 |
142 |
143 |
144 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /docs/search.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Search — C++ SDK 2.6.1 documentation 7 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 61 | 62 |
66 | 67 |
68 |
69 |
70 |
    71 |
  • 72 | 73 |
  • 74 |
  • 75 |
76 |
77 |
78 |
79 |
80 | 81 | 88 | 89 | 90 |
91 | 92 |
93 | 94 |
95 |
96 |
97 | 98 |
99 | 100 |
101 |

© Copyright Dolby Laboratories.

102 |
103 | 104 | Built with Sphinx using a 105 | theme 106 | provided by Read the Docs. 107 | 108 | 109 |
110 |
111 |
112 |
113 |
114 | 119 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | **BEFORE DOWNLOADING THE SOFTWARE, PLEASE CAREFULLY READ THE FOLLOWING AGREEMENT. DO NOT DOWNLOAD, INSTALL, ACTIVATE OR USE THIS SOFTWARE IF YOU HAVE NOT 2 | ENTERED INTO A COMMERCIAL AGREEMENT WITH DOLBY. BY DOWNLOADING, INSTALLING, ACTIVATING OR USING THE SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE TERMS 3 | OF THIS AGREEMENT. IF PRIOR TO DOWNLOADING, INSTALLING, ACTIVATING OR USING THE SOFTWARE, YOU DECIDE YOU ARE UNWILLING TO AGREE TO THE TERMS OF THIS 4 | AGREEMENT, YOU HAVE NO RIGHT TO USE THE SDK.** 5 | 6 | This Dolby Software License Agreement (“Agreement”) is a legal agreement between you individually if you are agreeing to it in your own capacity, or if 7 | you are authorized to acquire the Software on behalf of your company or organization, between the entity for whose benefit you act (“Licensee”) and 8 | **Dolby Laboratories Licensing Corporation** , a New York corporation, **Dolby International AB** , a Swedish company residing in The Netherlands 9 | (collectively, “**Licensor**”). This Agreement is governed by the terms in the commercial agreement separately entered into by Licensee and Licensor (the 10 | “Commercial Agreement”), the terms of which are incorporated herein by reference. Defined terms in this Agreement and not otherwise defined herein, have 11 | the meanings given to them in the Commercial Agreement. 12 | 13 | 1. License: Subject to the terms and conditions of this Agreement, Licensor hereby grants Licensee a revocable, royalty-free, nonexclusive, 14 | nontransferable, nonassignable license (subject to Licensee’s continued compliance with this Agreement) to install and use a reasonable number of 15 | copies of the Software to be used solely in the manner described in the documentation contained in the Software and as further authorized in the 16 | Commercial Agreement. Licensee may not copy the Software or any portion thereof except as expressly permitted herein. For the purposes of this 17 | provision "copy" shall not include copying of statements and instructions of the Software or any portion thereof that naturally occurs during normal 18 | program execution when used in accordance with and for the purposes described in the documentation or in the course of making unmodified copies of 19 | the Software or documentation as part of the regular back-up of the Software in accordance with standard industry business practices. 20 | 2. EULA: If applicable, Licensee shall incorporate the End User License Agreement referenced in the Commercial Agreement. 21 | 3. License Restriction: Licensee shall have no right to copy, modify or create derivative works of the Software, except as expressly permitted herein, or 22 | to reverse assemble, reverse engineer, decompile or otherwise attempt to derive source code from the Software. 23 | 4. Rights in Software: This Agreement is not a sale and does not transfer to Licensee any title or ownership interest in or to the Software or any 24 | patent, copyright, trade secret, trade name, trademark or other proprietary or intellectual property rights related to the Software. Except for the 25 | rights expressly granted herein, Licensor retains all of its right, title and interest in and to the Software. Licensee shall not remove, alter, or 26 | obscure any proprietary notices contained on or within the Software and shall reproduce such notices on any back-up copy of the Software. 27 | 5. Open Source Software: “Open Source Software” means any software or other material included in the Software which is (1) subject to a license (a) 28 | listed at [http://opensource.org/licenses/](http://opensource.org/licenses/) as of the effective date, (b) that meet the criteria listed at 29 | [http://opensource.org/docs/definition.php](http://opensource.org/docs/definition.php) as of the effective date, or (c) that is licensed under a free 30 | software, open source software, or similar licensing model; and (2) which if distributed by Licensee would (a) impose any obligations on Licensee to 31 | provide reports or royalties, or to disclose any information to a third party, or (b) impose any requirements that any patents related to the 32 | Software must be licensed to, or may be asserted against, recipients of the Software. A list of such Open Source Software, as amended from time to 33 | time, is provided in the documentation contained in the Software. Open Source Software also includes libraries from the FFmpeg project under the 34 | LGPLv2.1. The Open Source Software is not subject to the terms and conditions of this Agreement. Instead, each item of Open Source Software is 35 | licensed under the terms of the end user license that accompanies such Open Source Software. Nothing in this Agreement limits Licensee’s rights 36 | under, or grants Licensee rights that supersede, the terms and conditions of any applicable end user license for the Open Source Software. 37 | 6. Feedback: Licensee hereby grants to Licensor a non-exclusive, royalty-free, worldwide, perpetual, irrevocable, non-terminable, transferable, 38 | assignable and sublicensable license to reproduce, distribute, publicly perform and display, make, have made, sell, import, modify and make 39 | derivative works based on, and otherwise use and exploit any and all suggestions, comments, ideas, and all other types of information relating to the 40 | Software which is communicated directly or indirectly by Licensee to Licensor. 41 | 8. No Warranty by Licensor: LICENSOR IS PROVIDING THE SOFTWARE AND OPEN SOURCE SOFTWARE TO LICENSEE “AS IS” AND WITHOUT WARRANTY OF ANY KIND WHATSOEVER, 42 | EXPRESS OR IMPLIED. ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE ARE HEREBY DISCLAIMED BY 43 | LICENSOR AND EXCLUDED. LICENSOR DOES NOT WARRANT THAT SOFTWARE AND OPEN SOURCE SOFTWARE OR THE FUNCTIONS CONTAINED THEREIN WILL MEET LICENSEE’S 44 | REQUIREMENTS, THAT THE OPERATION OF THE SOFTWARE AND OPEN SOURCE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE SOFTWARE AND 45 | OPEN SOURCE SOFTWARE WILL BE CORRECTED. LICENSEE IS SOLELY RESPONSIBLE FOR THE USE AND DISTRIBUTION OF OPEN SOURCE SOFTWARE AND ASSUMES ALL RISKS 46 | ASSOCIATED WITH ITS USE, INCLUDING WITH RESPECT TO THE FFMPEG OPEN SOURCE SOFTWARE LICENSE. 47 | 9. Indemnification: Licensee shall indemnify, defend and hold harmless Licensor, its affiliates, their respective successors and their respective 48 | officers, directors, employees, agents, and representatives for any claim, liability, loss or damage arising out of: (a) Licensee’s breach of any 49 | term of this Agreement; and (b) any claim of allegedly unauthorized use or violation of any third-party patent, copyright, trade secret, or other 50 | intellectual property. 51 | 10. Term: This Agreement shall be effective upon Licensee’s agreement to be bound by the terms of this Agreement and shall end upon termination of this 52 | Agreement in accordance with the provisions set out herein. Unless otherwise authorized by Licensor, Licensee must destroy all copies and component 53 | parts of the Software licensed under this Agreement within one (2) weeks of the termination of this Agreement, and Licensee may be required to 54 | provide proof of such destruction to Licensor. Upon the termination of this Agreement the license shall immediately terminate and Licensee shall 55 | promptly stop all use of the Software. 56 | 11. Termination: Licensor reserves the right to terminate this Agreement on thirty (30) days' notice to Licensee for any reason whatsoever. 57 | 12. This Agreement shall not create or be construed as creating a joint venture, co-ownership, partnership, or agency relationship between Licensee and 58 | Licensor. Neither Party will have authority to or will hold itself out as having any authority to incur, assume, or create, orally or in writing, any 59 | liability, obligation or undertaking of any kind in the name of, or on behalf of, or in any way binding upon, the other. 60 | --------------------------------------------------------------------------------