Loading...
Searching...
No Matches
AudioFrameEncoder.hpp
1#pragma once
2
3#include <Media/Libav.hpp>
4#if SCORE_HAS_LIBAV
5extern "C" {
6#include <libavutil/frame.h>
7}
8
9#include <ossia/dataflow/float_to_sample.hpp>
10
11namespace Gfx
12{
13
15{
16 explicit AudioFrameEncoder(int target_buffer_size)
17 : target_buffer_size{target_buffer_size}
18 {
19 }
20
21 // We assume that vec has correct channel count here
22 // Also that vec.size() > 0
23 virtual void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) = 0;
24 virtual ~AudioFrameEncoder() = default;
25 int target_buffer_size{};
26};
27
29{
30 using AudioFrameEncoder::AudioFrameEncoder;
31
32 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
33 {
34 const int channels = vec.size();
35 const int frames = vec[0].size();
36 auto* ptr = reinterpret_cast<int16_t*>(frame.data[0]);
37 for(int i = 0; i < frames; i++)
38 for(int c = 0; c < channels; c++)
39 *ptr++ = ossia::float_to_sample<int16_t, 16>(vec[c][i]);
40 }
41};
42
44{
45 using AudioFrameEncoder::AudioFrameEncoder;
46
47 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
48 {
49 const int channels = vec.size();
50 const int frames = vec[0].size();
51 auto* ptr = reinterpret_cast<int32_t*>(frame.data[0]);
52 for(int i = 0; i < frames; i++)
53 for(int c = 0; c < channels; c++)
54 *ptr++ = ossia::float_to_sample<int32_t, 24>(vec[c][i]);
55 }
56};
57
59{
60 using AudioFrameEncoder::AudioFrameEncoder;
61
62 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
63 {
64 const int channels = vec.size();
65 const int frames = vec[0].size();
66 auto* ptr = reinterpret_cast<int32_t*>(frame.data[0]);
67 for(int i = 0; i < frames; i++)
68 for(int c = 0; c < channels; c++)
69 *ptr++ = ossia::float_to_sample<int32_t, 32>(vec[c][i]);
70 }
71};
72
74{
75 using AudioFrameEncoder::AudioFrameEncoder;
76
77 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
78 {
79 const int channels = vec.size();
80 const int frames = vec[0].size();
81 auto* ptr = reinterpret_cast<float*>(frame.data[0]);
82 for(int i = 0; i < frames; i++)
83 for(int c = 0; c < channels; c++)
84 *ptr++ = vec[c][i];
85 }
86};
87
89{
90 using AudioFrameEncoder::AudioFrameEncoder;
91
92 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
93 {
94 const int channels = vec.size();
95 const int frames = vec[0].size();
96 auto* ptr = reinterpret_cast<double*>(frame.data[0]);
97 for(int i = 0; i < frames; i++)
98 for(int c = 0; c < channels; c++)
99 *ptr++ = vec[c][i];
100 }
101};
102
104{
105 using AudioFrameEncoder::AudioFrameEncoder;
106
107 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
108 {
109 const int channels = vec.size();
110 // Copy into the AVFrame's own planar buffers (allocated by av_frame_get_buffer)
111 for(int i = 0; i < channels; ++i)
112 {
113 uint8_t* dst = (i < AV_NUM_DATA_POINTERS) ? frame.data[i]
114 : frame.extended_data[i];
115 if(dst)
116 {
117 const int bytes = vec[i].size() * sizeof(float);
118 std::memcpy(dst, vec[i].data(), bytes);
119 }
120 }
121 }
122};
123
125{
126 using AudioFrameEncoder::AudioFrameEncoder;
127
128 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
129 {
130 const int channels = vec.size();
131 const int frames = vec[0].size();
132 for(int i = 0; i < channels; ++i)
133 {
134 auto* dst = reinterpret_cast<int16_t*>(
135 (i < AV_NUM_DATA_POINTERS) ? frame.data[i] : frame.extended_data[i]);
136 if(dst)
137 for(int j = 0; j < frames; ++j)
138 dst[j] = ossia::float_to_sample<int16_t, 16>(vec[i][j]);
139 }
140 }
141};
142
144{
145 using AudioFrameEncoder::AudioFrameEncoder;
146
147 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
148 {
149 const int channels = vec.size();
150 const int frames = vec[0].size();
151 for(int i = 0; i < channels; ++i)
152 {
153 auto* dst = reinterpret_cast<int32_t*>(
154 (i < AV_NUM_DATA_POINTERS) ? frame.data[i] : frame.extended_data[i]);
155 if(dst)
156 for(int j = 0; j < frames; ++j)
157 dst[j] = ossia::float_to_sample<int32_t, 32>(vec[i][j]);
158 }
159 }
160};
161
163{
164 using AudioFrameEncoder::AudioFrameEncoder;
165
166 void add_frame(AVFrame& frame, const std::span<ossia::float_vector> vec) override
167 {
168 const int channels = vec.size();
169 const int frames = vec[0].size();
170 for(int i = 0; i < channels; ++i)
171 {
172 auto* dst = reinterpret_cast<double*>(
173 (i < AV_NUM_DATA_POINTERS) ? frame.data[i] : frame.extended_data[i]);
174 if(dst)
175 for(int j = 0; j < frames; ++j)
176 dst[j] = static_cast<double>(vec[i][j]);
177 }
178 }
179};
180}
181#endif
Binds the rendering pipeline to ossia processes.
Definition CameraDevice.cpp:30
Definition AudioFrameEncoder.hpp:15
Definition AudioFrameEncoder.hpp:89
Definition AudioFrameEncoder.hpp:163
Definition AudioFrameEncoder.hpp:74
Definition AudioFrameEncoder.hpp:104
Definition AudioFrameEncoder.hpp:29
Definition AudioFrameEncoder.hpp:125
Definition AudioFrameEncoder.hpp:44
Definition AudioFrameEncoder.hpp:59
Definition AudioFrameEncoder.hpp:144