# Use raw data
> The code on this page works with either the **default UI** or the **custom UI**.
The Meeting SDK for Linux provides you with an option to access real-time raw audio and video of a meeting. After accessing the raw data, you can process it and apply additional effects to enhance in-meeting or post-meeting experience. This section describes how to enable and gain access to a session's raw data.
## Prerequisites
The Meeting SDK for Linux requires pulseaudio to enable audio raw data function.
If you're using a Docker container to create your app, [install pulseaudio](https://github.com/mviereck/x11docker/wiki/Container-sound:-ALSA-or-Pulseaudio) before implementing the audio raw data function, then create a configuration file at `~/.config/zoomus.conf` and add this content.
```plaintext
system.audio.type=default
```
## Select raw data memory mode
You must select a memory mode to receive any type of raw data. The Meeting SDK supports heap-based and stack-based memory modes.
### Compare stack-based and heap-based memory
|
Stack-based (
more details
)
|
Heap-based (
more details
)
|
| Memory allocation |
Automatically allocated and deallocated |
Must manually allocate and deallocate to avoid memory leaks |
| Variable scope |
Can't be accessed from or transferred to other threads |
Can be accessed globally |
| Access speed |
Typically faster access |
Typically relatively slower access |
| Memory space |
• Managed by the CPU • Will not
become fragmented
|
• No efficiency guarantee • May
become fragmented
|
| Can resize variables |
No |
Yes |
| How to specify |
`ZoomSDKRawDataMemoryModeStack` |
`ZoomSDKRawDataMemoryModeHeap` |
## Specify memory mode
After determining which memory mode is right for you, specify the memory mode when initializing the SDK. This must be done for audio, video, and share data types individually. To specify a raw data memory mode, provide one of these enums cases to the `InitParam` during SDK initialization. The two types of memory allocation are defined with these enum values.
```cpp
InitParam init_params;
init_params.rawdataOpts.videoRawdataMemoryMode = ZoomSDKRawDataMemoryModeHeap;
init_params.rawdataOpts.shareRawDataMemoryMode = ZoomSDKRawDataMemoryModeHeap;
init_params.rawdataOpts.audioRawDataMemoryMode = ZoomSDKRawDataMemoryModeHeap;
```
## Receive raw video data
Raw video data is encoded in the YUV420p format. YUV420 is a data object commonly used by the renderer based on OpenGL ES. To access and modify the video data, follow these steps.
1. Implement an instance of the `IZoomSDKRendererDelegate`.
2. Use callback functions provided by the `IZoomSDKRendererDelegate` to receive each frame of the raw video data.
3. Pass the `userID` to `IZoomSDKRenderer`'s subscribe function.
```cpp
ZoomSDKRendererDelegate* videoSource = new ZoomSDKRendererDelegate();
IZoomSDKRenderer* videoHelper;
SDKError err1 = m_pRecordController->StartRawRecording();
if (err1 != SDKERR_SUCCESS) {
std::cout << "Error occurred" << std::endl;
}
SDKError err = createRenderer(&videoHelper, videoSource);
if (err != SDKERR_SUCCESS) {
std::cout << "Error occurred" << std::endl;
//handle error
}
else {
std::cout << "attemptToStartRawRecording : subscribing" << std::endl;
videoHelper->setRawDataResolution(ZoomSDKResolution_720P);
videoHelper->subscribe(getUserID(), RAW_DATA_TYPE_VIDEO);
}
.
.
.
void ZoomSDKRenderer::onRawDataFrameReceived(YUVRawDataI420* data)
{
}
void ZoomSDKRenderer::onRawDataStatusChanged(RawDataStatus status)
{
}
void ZoomSDKRenderer::onRendererBeDestroyed()
{
}
```
Each frame of video data is available through the `YUVRawDataI420` object. Access various pieces of data through this object in `onRawDataFrameReceived`.
```cpp
const int width = data->GetStreamWidth();
const int height = data->GetStreamHeight();
const int bufLen = data->GetBufferLen();
const int rotation = data->GetRotation();
const int sourceID = data->GetSourceID();
```
The Meeting SDK for Linux supports receiving videos in the resolutions listed on the [`ZoomSDKResolution`](https://marketplacefront.zoom.us/sdk/meeting/linux/rawdata__renderer__interface_8h.html#aacc2075d701a61eb5d07e48e1343c7c3) page in the Meeting SDK for Linux reference docs.
## Receive raw audio data
Access **mixed** and **per-user** raw audio data through your implementation of `IZoomSDKAudioRawDataDelegate`. Unlike raw video data, raw audio data defaults to stack-based memory if you don't specify a memory mode.
> Mixed raw audio data is combined audio output from one or more users, as heard in a session.
To access raw audio data:
1. Implement an instance of the `IZoomSDKAudioRawDataDelegate`.
2. Access `IZoomSDKAudioRawDataHelper` using `GetAudioRawdataHelper();`.
3. Subscribe to audio using `IZoomSDKAudioRawDataHelper`.
4. Listen for these callbacks in your listener.
```cpp
ZoomSDKAudioRawDataDelegate* audio_source = new ZoomSDKAudioRawDataDelegate();
IZoomSDKAudioRawDataHelper* audioHelper;
audioHelper = GetAudioRawdataHelper();
if (audioHelper) {
SDKError err = audioHelper->subscribe(audio_source);
if (err != SDKERR_SUCCESS) {
std::cout << "Error occurred subscribing to audio : " << err << std::endl;
}
}
else {
std::cout << "Error getting audioHelper" << std::endl;
}
.
.
.
void ZoomSDKAudioRawData::onOneWayAudioRawDataReceived(AudioRawData* data, uint32_t node_id)
{
}
void ZoomSDKAudioRawData::onMixedAudioRawDataReceived(AudioRawData* data)
{
}
```
From within the callbacks, access the data buffer with `data->GetBuffer()`.