Как преобразовать аудиосэмплы PCM с прямым порядком байтов в с прямым порядком байтов ⇐ C++
Как преобразовать аудиосэмплы PCM с прямым порядком байтов в с прямым порядком байтов
Мне нужно заполнить буфер дейтаграмм сетевыми байтовыми упорядоченными образцами аудио в соответствии с макетом 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 | МБ | ЛСБ | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+
Мне нужно заполнить буфер дейтаграмм сетевыми байтовыми упорядоченными образцами аудио в соответствии с макетом 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 | МБ | ЛСБ | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Преобразовать текущую дату в массив байтов Uint8 в формате с прямым порядком байтов.
Anonymous » » в форуме Javascript - 0 Ответы
- 25 Просмотры
-
Последнее сообщение Anonymous
-