Skip to content

Commit 9476e3b

Browse files
committed
Fix issue with Packet::sideData(type)
Due to incorrect condition, for valid side data returns empty data set. Added tests for this case.
1 parent 18c354f commit 9476e3b

2 files changed

Lines changed: 81 additions & 6 deletions

File tree

src/avcpp/packet.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -371,18 +371,24 @@ void Packet::setTimeBase(const Rational &tb)
371371
#if AVCPP_HAS_PKT_SIDE_DATA
372372
using SideDataSize_t = std::conditional_t<AVCPP_API_AVBUFFER_SIZE_T, std::size_t, int>;
373373

374-
std::span<const uint8_t> Packet::sideData(AVPacketSideDataType type) const
374+
static auto sideDataCommon(auto *pkt, AVPacketSideDataType type)
375375
{
376+
using ResultType = std::conditional_t<std::is_const_v<decltype(pkt)>, std::span<const uint8_t>, std::span<uint8_t>>;
377+
if (!pkt)
378+
return ResultType{};
376379
SideDataSize_t size;
377-
auto const data = av_packet_get_side_data(raw(), type, &size);
378-
return data ? std::span<const uint8_t>{} : std::span<const uint8_t>{data, std::size_t(size)};
380+
auto const data = av_packet_get_side_data(pkt, type, &size);
381+
return data ? ResultType{data, std::size_t(size)} : ResultType{};
382+
}
383+
384+
std::span<const uint8_t> Packet::sideData(AVPacketSideDataType type) const
385+
{
386+
return sideDataCommon(raw(), type);
379387
}
380388

381389
std::span<uint8_t> Packet::sideData(AVPacketSideDataType type)
382390
{
383-
SideDataSize_t size;
384-
auto const data = av_packet_get_side_data(raw(), type, &size);
385-
return data ? std::span<uint8_t>{} : std::span<uint8_t>{data, std::size_t(size)};
391+
return sideDataCommon(raw(), type);
386392
}
387393

388394
PacketSideData Packet::sideData(std::size_t index) noexcept

tests/Packet.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <vector>
44

5+
#include "avcpp/avconfig.h"
56
#include "avcpp/packet.h"
67

78
#ifdef _MSC_VER
@@ -179,6 +180,74 @@ TEST_CASE("Packet define", "[Packet][Construct]")
179180
}
180181
}
181182

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+
182251
#ifdef __cpp_lib_print
183252
SECTION("std::format formatter :: Side Data")
184253
{

0 commit comments

Comments
 (0)