UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
yuri_decoders.cpp File Reference
#include "audio/utils.h"
#include "rtp/rtp.h"
#include "rtp/rtp_callback.h"
#include "rtp/pbuf.h"
#include "rtp/audio_decoders.h"
#include "rtp/yuri_decoders.h"
#include "rtp/video_decoders.h"
#include "yuri/core/frame/RawAudioFrame.h"
#include "yuri/core/frame/CompressedVideoFrame.h"
#include "yuri/core/frame/RawVideoFrame.h"
#include "modules/ultragrid/YuriUltragrid.h"
Include dependency graph for yuri_decoders.cpp:

Go to the source code of this file.

Functions

static int decode_yuri_audio_frame (struct coded_data *cdata, yuri_decoder_data *s)
 
int decode_yuri_frame (struct coded_data *cdata, void *decoder_data)
 
static int decode_yuri_video_frame (struct coded_data *cdata, yuri_decoder_data *s)
 

Detailed Description

Author
Martin Pulec pulec.nosp@m.@ces.nosp@m.net.c.nosp@m.z

Definition in file yuri_decoders.cpp.

Function Documentation

◆ decode_yuri_audio_frame()

static int decode_yuri_audio_frame ( struct coded_data * cdata,
yuri_decoder_data * s )
static

Definition at line 59 of file yuri_decoders.cpp.

60{
61 rtp_packet *pckt = NULL;
62 uint32_t *hdr;
63 int buffer_length;
64 struct audio_desc network_desc;
65 char *received_data = NULL;
66
67 pckt = cdata->data;
68 hdr = (uint32_t *)(void *) pckt->data;
69 parse_audio_hdr(hdr, &network_desc);
70 buffer_length = ntohl(hdr[2]);
71
72 if (network_desc.codec != AC_PCM) {
73 s->log[yuri::log::warning] << "Compressed audio is not yet supported!";
74 return FALSE;
75 }
76
77 yuri::core::pRawAudioFrame frame = yuri::core::RawAudioFrame::create_empty(
78 yuri::ultragrid::audio_uv_to_yuri(network_desc.bps * 8), network_desc.ch_count,
79 network_desc.sample_rate, yuri::uvector<uint8_t>(buffer_length * network_desc.ch_count));
80 received_data = reinterpret_cast<char *>(frame->data());
81 s->yuri_frame = frame;
82 if (!s->yuri_frame) {
83 return FALSE;
84 }
85
86 while (cdata != NULL) {
87 uint32_t *hdr;
88 uint32_t substream;
89 char *data;
90 uint32_t data_pos;
91 int len;
92
93 pckt = cdata->data;
94
95 hdr = (uint32_t *)(void *) pckt->data;
96 data_pos = ntohl(hdr[1]);
97 substream = ntohl(hdr[0]) >> 22;
98
99 len = pckt->data_len - sizeof(audio_payload_hdr_t);
100 data = (char *) hdr + sizeof(audio_payload_hdr_t);
101
102 mux_channel(received_data + data_pos * network_desc.ch_count, data, network_desc.bps,
103 len, network_desc.ch_count, substream, 1.0);
104
105 cdata = cdata->nxt;
106 }
107
108 return TRUE;
109}
struct video_frame * frame
int void size_t * len
@ AC_PCM
Definition types.h:53
bool parse_audio_hdr(uint32_t *hdr, struct audio_desc *desc)
#define TRUE
#define FALSE
rtp_packet
Definition rtp.h:126
uint32_t audio_payload_hdr_t[5]
Definition rtp_types.h:129
rtp_packet * data
Definition pbuf.h:75
struct coded_data * nxt
Definition pbuf.h:72
yuri::core::pFrame yuri_frame
yuri::log::Log & log
void mux_channel(char *out, const char *in, int bps, int in_len, int out_stream_channels, int pos_in_stream, double scale)
Definition utils.cpp:371

References AC_PCM, audio_desc::bps, audio_desc::ch_count, audio_desc::codec, coded_data::data, FALSE, frame, len, yuri_decoder_data::log, mux_channel(), coded_data::nxt, parse_audio_hdr(), rtp_packet, audio_desc::sample_rate, TRUE, and yuri_decoder_data::yuri_frame.

Referenced by decode_yuri_frame().

Here is the call graph for this function:

◆ decode_yuri_frame()

int decode_yuri_frame ( struct coded_data * cdata,
void * decoder_data )

Definition at line 168 of file yuri_decoders.cpp.

169{
170 yuri_decoder_data *s = (yuri_decoder_data *) decoder_data;
171 if (cdata->data->pt == PT_VIDEO) {
172 return decode_yuri_video_frame(cdata, s);
173 } else if (cdata->data ->pt == PT_AUDIO) {
174 return decode_yuri_audio_frame(cdata, s);
175 } else {
176 s->log[yuri::log::warning] << "Unsupported UltraGrid pt " << cdata->data->pt << "!";
177 return FALSE;
178 }
179}
#define PT_AUDIO
Definition rtp_types.h:67
#define PT_VIDEO
Definition rtp_types.h:66
static int decode_yuri_audio_frame(struct coded_data *cdata, yuri_decoder_data *s)
static int decode_yuri_video_frame(struct coded_data *cdata, yuri_decoder_data *s)

References coded_data::data, decode_yuri_audio_frame(), decode_yuri_video_frame(), FALSE, yuri_decoder_data::log, PT_AUDIO, and PT_VIDEO.

Here is the call graph for this function:

◆ decode_yuri_video_frame()

static int decode_yuri_video_frame ( struct coded_data * cdata,
yuri_decoder_data * s )
static

Definition at line 111 of file yuri_decoders.cpp.

112{
113 char *received_data = NULL;
114
115 rtp_packet *pckt = NULL;
116 int buffer_length;
117 uint32_t *hdr;
118 struct video_desc network_desc;
119
120 pckt = cdata->data;
121 hdr = (uint32_t *)(void *) pckt->data;
122 parse_video_hdr(hdr, &network_desc);
123 buffer_length = ntohl(hdr[2]);
124
125 s->yuri_frame = yuri::ultragrid::create_yuri_from_uv_desc(&network_desc, buffer_length, s->log);
126 if (!s->yuri_frame) {
127 return FALSE;
128 }
129
130 auto raw = dynamic_pointer_cast<yuri::core::RawVideoFrame>(s->yuri_frame);
131 if (raw) {
132 received_data = reinterpret_cast<char *>(PLANE_RAW_DATA(raw, 0));
133 } else {
134 auto compressed = dynamic_pointer_cast<yuri::core::CompressedVideoFrame>(s->yuri_frame);
135 if (compressed) {
136 received_data = reinterpret_cast<char *>(compressed->begin());
137 }
138 }
139
140 while (cdata != NULL) {
141 char *data;
142 uint32_t data_pos;
143 int len;
144 uint32_t *hdr;
145 uint32_t substream;
146 pckt = cdata->data;
147
148 hdr = (uint32_t *)(void *) pckt->data;
149 data_pos = ntohl(hdr[1]);
150 substream = ntohl(hdr[0]) >> 22;
151
152 if (substream > 0) {
153 s->log[yuri::log::warning] << "Multiple substreams for video yet supported!";
154 return FALSE;
155 }
156
157 len = pckt->data_len - sizeof(video_payload_hdr_t);
158 data = (char *) hdr + sizeof(video_payload_hdr_t);
159
160 memcpy(received_data + data_pos, (unsigned char*) data, len);
161
162 cdata = cdata->nxt;
163 }
164
165 return TRUE;
166}
bool parse_video_hdr(const uint32_t *hdr, struct video_desc *desc)
uint32_t video_payload_hdr_t[6]
Definition rtp_types.h:107

References coded_data::data, FALSE, len, yuri_decoder_data::log, coded_data::nxt, parse_video_hdr(), rtp_packet, TRUE, and yuri_decoder_data::yuri_frame.

Referenced by decode_yuri_frame().

Here is the call graph for this function: