Как преобразовать аудиосэмплы PCM с прямым порядком байтов в с прямым порядком байтовC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как преобразовать аудиосэмплы PCM с прямым порядком байтов в с прямым порядком байтов

Сообщение Anonymous »


Мне нужно заполнить буфер дейтаграмм сетевыми байтовыми упорядоченными образцами аудио в соответствии с макетом RTP apt-x согласно разделу 5.5 RFC 7310:

Вот как аудиосэмплы располагаются в памяти моего приложения:
[*]24-битные образцы с прямым порядком байтов.
Буфер моего приложения в этом контейнере также сжат (раскладка аудиобайтов имеет прямой порядок байтов): обратите внимание, что я поменял порядок LSB и MSB ниже по сравнению с примером в конец раздела 5.5 в RFC, который требует отсчетов с прямым порядком байтов) — игнорируйте последний байт в этом примере, так как в компактной форме этот пустой байт будет младшим байтом для второго аудиосэмпла и т. д.)

0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | ЛСБ | МБ | MSB | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ Расположение памяти с прямым порядком байтов для образца PCM с 24-битным знаком. Мне нужно записать буфер моего приложения в буфер дейтаграмм (начиная со смещения 12, поскольку у меня уже есть правильно фиксированный 12-байтовый заголовок RTP с прямым порядком байтов, уже отформатированный в начале буфера). Должен ли я std::reverse буфер приложения, а затем вызвать memcpy, или мне нужен какой-то специальный вызов библиотеки с порядком байтов, который знает о 24-битных выборках?

Представьте себе семплы аудио как массив std::uint32_t[количество сэмплов] аудио в памяти Intel. Я могу просто сдвинуть каждую из этих выборок вправо на 8 бит, чтобы преобразовать их в знаковый формат pcm24, но я не знаю, как вставить это в целевой буфер дейтаграмм.

Последние два примера, очевидно, проще, поскольку все находится на четных границах, но я не знаю быстрого и прямого способа манипулирования буфером для его преобразования для доставки с прямым порядком байтов по сети (NBO).

Простой пример на C++ был бы отличным — возможно, используя std::endian или std::reverse из std::byteswap ? ?
Для примера формата на диаграмме ниже показано, как кодируются примеры. каждого канала упаковываются в блок сэмплов и как сэмплы блоки 1, 2 и 48 впоследствии упаковываются в пакет RTP. С: Индекс канала: левый (l) = 1, левый центр (lc) = 2, центр (c) = 3, правый (r) = 4, правый центр (rc) = 5, и объемное (S) = 6. Т: Индекс времени блока выборки: первый блок выборки равен 1; финал выборка 48. С(С)(Т): T-й образец из канала C. Программа стандартов Lindsay & Foerster [Страница 8] RFC 7310 apt-X Формат RTP, июль 2014 г. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(1)(1) | С(2)(1) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(2)(1) | С(3)(1) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(3)(1) | С(4)(1) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(5)(1) | С(6)(1) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(6)(1) | С(1)(2) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(2)(2) | С(3)(2) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(4)(2) | С(5)(2) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(5)(2) | С(6)(2) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(6)(2) | С(1)(3) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(6)(47) | С(1)(48) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(1)(48) | С(2)(48) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(3)(48) | С(4)(48) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(4)(48) | С(5)(48) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | С(5)(48) | С(6)(48) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ Для примера формата на диаграмме ниже показан порядок, в котором закодированные байты упаковываются в полезную нагрузку пакета в виде выборки значение байта. Используются следующие сокращения. MSB: Самый старший байт 24-битной кодированной выборки МБ: Средний байт 24-битной кодированной выборки младший бит: Младший значащий байт 24-битной закодированной выборки Программа стандартов Lindsay & Foerster [Страница 9] RFC 7310 apt-X Формат RTP, июль 2014 г. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+ | MSB | МБ | ЛСБ | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»