media: fix incorrect usage of SRB2_ASSERT on functions with side effects

This commit is contained in:
James R 2023-02-16 04:52:06 -08:00
parent bf8d90af8c
commit cea8a10007
5 changed files with 49 additions and 13 deletions

View file

@ -20,6 +20,19 @@
using namespace srb2::media; using namespace srb2::media;
namespace
{
void runtime_assert(VorbisError error, const char *what)
{
if (error != 0)
{
throw std::runtime_error(fmt::format("{}: {}", what, error));
}
}
}; // namespace
VorbisEncoder::VorbisEncoder(Config cfg) VorbisEncoder::VorbisEncoder(Config cfg)
{ {
const long max_bitrate = options_.get<int>("max_bitrate"); const long max_bitrate = options_.get<int>("max_bitrate");
@ -58,8 +71,8 @@ VorbisEncoder::VorbisEncoder(Config cfg)
} }
} }
SRB2_ASSERT(vorbis_analysis_init(&vd_, &vi_) == 0); runtime_assert(vorbis_analysis_init(&vd_, &vi_), "vorbis_analysis_init");
SRB2_ASSERT(vorbis_block_init(&vd_, &vb_) == 0); runtime_assert(vorbis_block_init(&vd_, &vb_), "vorbis_block_init");
} }
VorbisEncoder::~VorbisEncoder() VorbisEncoder::~VorbisEncoder()
@ -104,12 +117,12 @@ void VorbisEncoder::analyse(sample_buffer_t in)
} }
// automatically handles end of stream if n = 0 // automatically handles end of stream if n = 0
SRB2_ASSERT(vorbis_analysis_wrote(&vd_, n) == 0); runtime_assert(vorbis_analysis_wrote(&vd_, n), "vorbis_analysis_wrote");
while (vorbis_analysis_blockout(&vd_, &vb_) > 0) while (vorbis_analysis_blockout(&vd_, &vb_) > 0)
{ {
SRB2_ASSERT(vorbis_analysis(&vb_, nullptr) == 0); runtime_assert(vorbis_analysis(&vb_, nullptr), "vorbis_analysis");
SRB2_ASSERT(vorbis_bitrate_addblock(&vb_) == 0); runtime_assert(vorbis_bitrate_addblock(&vb_), "vorbis_bitrate_addblock");
ogg_packet op; ogg_packet op;

View file

@ -110,7 +110,10 @@ VP8Encoder::CtxWrapper::~CtxWrapper()
VP8Encoder::ImgWrapper::ImgWrapper(int width, int height) VP8Encoder::ImgWrapper::ImgWrapper(int width, int height)
{ {
SRB2_ASSERT(vpx_img_alloc(&img_, VPX_IMG_FMT_I420, width, height, YUV420pFrame::kAlignment) != nullptr); if (vpx_img_alloc(&img_, VPX_IMG_FMT_I420, width, height, YUV420pFrame::kAlignment) == nullptr)
{
throw std::runtime_error("vpx_img_alloc");
}
} }
VP8Encoder::ImgWrapper::~ImgWrapper() VP8Encoder::ImgWrapper::~ImgWrapper()

View file

@ -9,6 +9,9 @@
#include <cstdint> #include <cstdint>
#include <memory> #include <memory>
#include <stdexcept>
#include <fmt/format.h>
#include "../cxxutil.hpp" #include "../cxxutil.hpp"
#include "webm_vorbis.hpp" #include "webm_vorbis.hpp"
@ -20,7 +23,10 @@ using time_unit_t = MediaEncoder::time_unit_t;
WebmContainer::WebmContainer(const Config cfg) : writer_(cfg.file_name), dtor_cb_(cfg.destructor_callback) WebmContainer::WebmContainer(const Config cfg) : writer_(cfg.file_name), dtor_cb_(cfg.destructor_callback)
{ {
SRB2_ASSERT(segment_.Init(&writer_) == true); if (!segment_.Init(&writer_))
{
throw std::runtime_error("mkvmuxer::Segment::Init");
}
} }
WebmContainer::~WebmContainer() WebmContainer::~WebmContainer()
@ -101,15 +107,22 @@ void WebmContainer::write_frame(
bool is_key_frame bool is_key_frame
) )
{ {
SRB2_ASSERT( if (!segment_.AddFrame(
segment_.AddFrame(
reinterpret_cast<const uint8_t*>(buffer.data()), reinterpret_cast<const uint8_t*>(buffer.data()),
buffer.size_bytes(), buffer.size_bytes(),
trackid, trackid,
timestamp, timestamp,
is_key_frame is_key_frame
) == true ))
); {
throw std::runtime_error(fmt::format(
"mkvmuxer::Segment::AddFrame, size={}, track={}, ts={}, key={}",
buffer.size_bytes(),
trackid,
timestamp,
is_key_frame
));
}
queue_[trackid].data_size += buffer.size_bytes(); queue_[trackid].data_size += buffer.size_bytes();
} }

View file

@ -13,8 +13,11 @@
#include <chrono> #include <chrono>
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include <stdexcept>
#include <vector> #include <vector>
#include <fmt/format.h>
#include "../cxxutil.hpp" #include "../cxxutil.hpp"
#include "vorbis.hpp" #include "vorbis.hpp"
#include "webm_encoder.hpp" #include "webm_encoder.hpp"
@ -32,7 +35,10 @@ public:
const auto p = make_vorbis_private_data(); const auto p = make_vorbis_private_data();
SRB2_ASSERT(track()->SetCodecPrivate(reinterpret_cast<const uint8_t*>(p.data()), p.size()) == true); if (!track()->SetCodecPrivate(reinterpret_cast<const uint8_t*>(p.data()), p.size()))
{
throw std::runtime_error(fmt::format("mkvmuxer::AudioTrack::SetCodecPrivate, size={}", p.size()));
}
} }
virtual BitRate estimated_bit_rate() const override final virtual BitRate estimated_bit_rate() const override final

View file

@ -41,7 +41,8 @@ bool YUV420pFrame::BufferRGBA::resize(int width, int height)
void* p = vec_.data(); void* p = vec_.data();
std::size_t n = vec_.size(); std::size_t n = vec_.size();
SRB2_ASSERT(std::align(kAlignment, 1, p, n) != nullptr); p = std::align(kAlignment, 1, p, n);
SRB2_ASSERT(p != nullptr);
plane = tcb::span<uint8_t>(reinterpret_cast<uint8_t*>(p), new_size); plane = tcb::span<uint8_t>(reinterpret_cast<uint8_t*>(p), new_size);