|
2 | 2 |
|
3 | 3 | #include <vector> |
4 | 4 |
|
| 5 | +#include "avcpp/avconfig.h" |
5 | 6 | #include "avcpp/packet.h" |
6 | 7 |
|
7 | 8 | #ifdef _MSC_VER |
@@ -179,6 +180,74 @@ TEST_CASE("Packet define", "[Packet][Construct]") |
179 | 180 | } |
180 | 181 | } |
181 | 182 |
|
| 183 | +#if AVCPP_HAS_PKT_SIDE_DATA |
| 184 | + SECTION("Packet side data") |
| 185 | + { |
| 186 | + const av::Rational tb{1000,1}; |
| 187 | + av::Packet in_pkt{pkt_data, sizeof(pkt_data)}; |
| 188 | + CHECK(in_pkt.timeBase() == av::Rational()); |
| 189 | + in_pkt.setTimeBase(tb); |
| 190 | + CHECK(in_pkt.timeBase() == tb); |
| 191 | + |
| 192 | + { |
| 193 | + auto sd = in_pkt.sideData(AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL); |
| 194 | + REQUIRE(sd.empty()); |
| 195 | + } |
| 196 | + |
| 197 | + std::string meta = "field=val;field2=val2"; |
| 198 | + |
| 199 | + { |
| 200 | + std::vector<uint8_t> side_block_adds(meta.size() + sizeof(uint64_t)); |
| 201 | + std::span out = side_block_adds; |
| 202 | + uint64_t id = 100; |
| 203 | + if (std::endian::native == std::endian::little) |
| 204 | + id = av_bswap64(id); |
| 205 | + memcpy(out.data(), &id, sizeof(id)); |
| 206 | + out = out.subspan(sizeof(id)); |
| 207 | + std::ranges::copy(meta, out.begin()); |
| 208 | + |
| 209 | + REQUIRE_NOTHROW(in_pkt.addSideData(AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, side_block_adds)); |
| 210 | + REQUIRE(in_pkt.sideDataCount() == 1); |
| 211 | + } |
| 212 | + |
| 213 | + { |
| 214 | + auto sd = in_pkt.sideData(AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL); |
| 215 | + REQUIRE(!sd.empty()); |
| 216 | + REQUIRE(sd.size() == sizeof(uint64_t) + meta.size()); |
| 217 | + |
| 218 | + auto in = sd; |
| 219 | + uint64_t id{}; |
| 220 | + memcpy(&id, in.data(), sizeof(uint64_t)); |
| 221 | + in = in.subspan(sizeof(uint64_t)); |
| 222 | + if (std::endian::native == std::endian::little) |
| 223 | + id = av_bswap64(id); |
| 224 | + REQUIRE(id == 100); |
| 225 | + |
| 226 | + std::string_view meta_read{reinterpret_cast<const char*>(in.data()), in.size()}; |
| 227 | + REQUIRE(meta_read == meta); |
| 228 | + } |
| 229 | + |
| 230 | + { |
| 231 | + auto const& pkt = in_pkt; |
| 232 | + auto sd = pkt.sideData(AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL); |
| 233 | + REQUIRE(!sd.empty()); |
| 234 | + REQUIRE(sd.size() == sizeof(uint64_t) + meta.size()); |
| 235 | + |
| 236 | + auto in = sd; |
| 237 | + uint64_t id{}; |
| 238 | + memcpy(&id, in.data(), sizeof(uint64_t)); |
| 239 | + in = in.subspan(sizeof(uint64_t)); |
| 240 | + if (std::endian::native == std::endian::little) |
| 241 | + id = av_bswap64(id); |
| 242 | + REQUIRE(id == 100); |
| 243 | + |
| 244 | + std::string_view meta_read{reinterpret_cast<const char*>(in.data()), in.size()}; |
| 245 | + REQUIRE(meta_read == meta); |
| 246 | + } |
| 247 | + |
| 248 | + } |
| 249 | +#endif |
| 250 | + |
182 | 251 | #ifdef __cpp_lib_print |
183 | 252 | SECTION("std::format formatter :: Side Data") |
184 | 253 | { |
|
0 commit comments