Commit 803b73a3 authored by Max Kellermann's avatar Max Kellermann

pcm/PcmPack: add pcm_unpack_24be()

parent b1512201
...@@ -94,3 +94,12 @@ pcm_unpack_24(int32_t *dest, const uint8_t *src, const uint8_t *src_end) ...@@ -94,3 +94,12 @@ pcm_unpack_24(int32_t *dest, const uint8_t *src, const uint8_t *src_end)
src += 3; src += 3;
} }
} }
void
pcm_unpack_24be(int32_t *dest, const uint8_t *src, const uint8_t *src_end)
{
while (src < src_end) {
*dest++ = ReadS24BE(src);
src += 3;
}
}
...@@ -49,4 +49,11 @@ pcm_pack_24(uint8_t *dest, const int32_t *src, const int32_t *src_end); ...@@ -49,4 +49,11 @@ pcm_pack_24(uint8_t *dest, const int32_t *src, const int32_t *src_end);
void void
pcm_unpack_24(int32_t *dest, const uint8_t *src, const uint8_t *src_end); pcm_unpack_24(int32_t *dest, const uint8_t *src, const uint8_t *src_end);
/**
* Like pcm_unpack_24(), but assume the source byte order is
* big-endian. The destination byte order ia always native.
*/
void
pcm_unpack_24be(int32_t *dest, const uint8_t *src, const uint8_t *src_end);
#endif #endif
...@@ -40,11 +40,13 @@ class PcmPackTest : public CppUnit::TestFixture { ...@@ -40,11 +40,13 @@ class PcmPackTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(PcmPackTest); CPPUNIT_TEST_SUITE(PcmPackTest);
CPPUNIT_TEST(TestPack24); CPPUNIT_TEST(TestPack24);
CPPUNIT_TEST(TestUnpack24); CPPUNIT_TEST(TestUnpack24);
CPPUNIT_TEST(TestUnpack24BE);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
public: public:
void TestPack24(); void TestPack24();
void TestUnpack24(); void TestUnpack24();
void TestUnpack24BE();
}; };
class PcmChannelsTest : public CppUnit::TestFixture { class PcmChannelsTest : public CppUnit::TestFixture {
......
...@@ -70,3 +70,23 @@ PcmPackTest::TestUnpack24() ...@@ -70,3 +70,23 @@ PcmPackTest::TestUnpack24()
CPPUNIT_ASSERT_EQUAL(s, dest[i]); CPPUNIT_ASSERT_EQUAL(s, dest[i]);
} }
} }
void
PcmPackTest::TestUnpack24BE()
{
constexpr unsigned N = 509;
const auto src = TestDataBuffer<uint8_t, N * 3>();
int32_t dest[N];
pcm_unpack_24be(dest, src.begin(), src.end());
for (unsigned i = 0; i < N; ++i) {
int32_t s;
s = (src[i * 3] << 16) | (src[i * 3 + 1] << 8)
| src[i * 3 + 2];
if (s & 0x800000)
s |= 0xff000000;
CPPUNIT_ASSERT_EQUAL(s, dest[i]);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment