3 #include "avcpp/avconfig.h"
14 #include <type_traits>
17 #if AVCPP_CXX_STANDARD >= 20
24 #if AVCPP_HAS_AVFORMAT
26 #include <libavformat/avformat.h>
36 constexpr
auto NoPts =
static_cast<int64_t
>(AV_NOPTS_VALUE);
37 constexpr
auto TimeBase =
static_cast<int>(AV_TIME_BASE);
38 constexpr
auto TimeBaseQ = AVRational{1, AV_TIME_BASE};
41 template<
typename R,
typename T>
81 #define setFFmpegLoggingLevel set_logging_level
90 [[deprecated(
"Use av::hex_dump()")]]
124 bool operator() (
struct SwsContext* &swsContext);
125 bool operator() (
struct AVCodecContext* &codecContext);
126 #if AVCPP_HAS_AVFORMAT
127 bool operator() (
struct AVOutputFormat* &format);
128 bool operator() (
struct AVFormatContext* &formatContext);
132 bool operator() (
struct AVDictionary* &dictionary);
133 #if AVCPP_HAS_AVFILTER
134 bool operator ()(
struct AVFilterInOut* &filterInOut);
136 bool operator() (
struct AVBufferRef* &bufferRef);
140 inline namespace v2 {
151 std::unique_ptr<T, void(*)(
void*)>
malloc(
size_t size)
153 return {
static_cast<T*
>(av_malloc(size)), av_free};
157 std::unique_ptr<T, void(*)(
void*)>
mallocz(
size_t size)
159 return {
static_cast<T*
>(av_mallocz(size)), av_free};
163 std::unique_ptr<T, void(*)(
void*)>
memdup(
const void *p,
size_t size)
165 return {
static_cast<T*
>(av_memdup(p, size)), av_free};
174 AVFilterInOut * operator()(AVFilterInOut * x)
const
198 template<
typename T,
typename V = T>
267 template<
typename Proc>
272 template<
typename Proc>
274 : m_proc(
std::forward<Proc>(proc))
284 std::function<void()> m_proc;
290 #if AVCPP_CXX_STANDARD >= 20
296 struct SentinelEndPolicy
298 using value_type = std::remove_reference_t<T>;
300 constexpr
bool isEnd(T* it)
const noexcept {
309 struct SentinelUntilPolicy
311 using value_type = std::remove_cvref_t<T>;
313 constexpr
bool isEnd(T* it)
const noexcept {
314 return it ==
nullptr || *it == value;
322 template<
class T,
class Policy>
326 friend constexpr
bool operator==(T* it,
const ArraySentinel& s) noexcept {
327 return s.policy.isEnd(it);
331 template<
class T,
class U,
bool UseProxy>
332 struct ReferenceSelector;
334 template<
class T,
class U>
335 struct ReferenceSelector<T, U, true>
340 template<
class T,
class U>
341 struct ReferenceSelector<T, U, false>
352 template<
typename T,
typename U>
355 static constexpr
bool UseProxy = !std::is_same_v<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
357 using difference_type = std::ptrdiff_t;
358 using value_type = std::remove_reference_t<U>;
359 using pointer = std::remove_reference_t<T>*;
361 using reference =
typename ReferenceSelector<T, U, !UseProxy>::Type;
362 using iterator_category =
365 std::random_access_iterator_tag,
366 std::contiguous_iterator_tag>;
368 ArrayIterator() noexcept = default;
369 ArrayIterator(pointer ptr) noexcept : m_ptr(ptr) {}
372 if constexpr (UseProxy)
373 return reference{*m_ptr};
378 ArrayIterator& operator++() noexcept { m_ptr++;
return *
this; }
379 ArrayIterator operator++(
int) noexcept { ArrayIterator tmp = *
this; ++(*this);
return tmp; }
381 ArrayIterator& operator--() noexcept { m_ptr--;
return *
this; }
382 ArrayIterator operator--(
int) noexcept { ArrayIterator tmp = *
this; --(*this);
return tmp; }
384 ArrayIterator& operator+=(
int n) noexcept { m_ptr+=n;
return *
this; }
385 ArrayIterator& operator-=(
int n) noexcept { m_ptr-=n;
return *
this; }
388 reference operator[](
int n) noexcept {
389 if constexpr (UseProxy)
390 return reference{m_ptr[n]};
394 const reference operator[](
int n)
const noexcept {
395 if constexpr (UseProxy)
396 return reference{m_ptr[n]};
403 friend ArrayIterator
operator+(
const ArrayIterator& a,
int n) noexcept {
return {a.m_ptr + n}; }
404 friend ArrayIterator
operator+(
int n,
const ArrayIterator& a) noexcept {
return {a.m_ptr + n}; }
406 friend ArrayIterator
operator-(
const ArrayIterator& a,
int n) noexcept {
return {a.m_ptr - n}; }
408 friend difference_type
operator-(
const ArrayIterator& b,
const ArrayIterator& a) noexcept {
return b.m_ptr - a.m_ptr; }
411 friend std::strong_ordering operator<=>(
const ArrayIterator& a,
const ArrayIterator& b) noexcept {
412 return a.m_ptr == b.m_ptr ? std::strong_ordering::equal
413 : a.m_ptr < b.m_ptr ? std::strong_ordering::less
414 : std::strong_ordering::greater;
416 friend bool operator== (
const ArrayIterator& a,
const ArrayIterator& b) {
return a.m_ptr == b.m_ptr; };
417 friend bool operator!= (
const ArrayIterator& a,
const ArrayIterator& b) {
return !(a == b); };
422 friend bool operator==(ArrayIterator it, std::default_sentinel_t) =
delete;
424 friend bool operator==(ArrayIterator it,
auto sentinel) {
return it.m_ptr == sentinel; }
425 friend bool operator!=(ArrayIterator it,
auto sentinel) {
return it.m_ptr != sentinel; }
426 friend bool operator==(
auto sentinel, ArrayIterator it) {
return it.m_ptr == sentinel; }
427 friend bool operator!=(
auto sentinel, ArrayIterator it) {
return it.m_ptr != sentinel; }
438 template<
typename T,
typename U,
class Policy>
439 class ArrayView :
public std::ranges::view_interface<ArrayView<T, U, Policy>>
442 constexpr ArrayView() =
default;
443 constexpr ArrayView(T *ptr, Policy policy)
444 : m_ptr(ptr), m_policy(
std::move(policy))
447 auto constexpr begin() const noexcept
449 return ArrayIterator<T, U>{m_ptr};
452 auto constexpr end() const noexcept
455 if constexpr (std::is_same_v<Policy, std::size_t>) {
456 return ArrayIterator<T, U>{m_ptr + m_policy};
458 return ArraySentinel<T, Policy>{m_policy};
473 auto make_array_view_size(
auto* ptr, std::size_t size)
475 using T = std::remove_reference_t<decltype(*ptr)>;
476 return ArrayView<T, U, std::size_t>(ptr, size);
485 auto make_array_view_until(
auto* ptr,
auto value)
487 using T = std::remove_reference_t<decltype(*ptr)>;
488 return ArrayView<T, U, SentinelUntilPolicy<T>>(ptr, SentinelUntilPolicy<T>{value});
505 template<
typename T,
typename L>
506 requires std::ranges::range<L> &&
508 std::ranges::empty(r);
516 T bestDistance = (std::numeric_limits<T>::max)();
518 for (
auto&& cur : list) {
519 auto const distance = (std::max)(cur, value) - (std::min)(cur, value);
520 if (distance < bestDistance) {
521 bestDistance = distance;
540 if (this->value ==
value)
564 template<
typename T,
typename L,
typename C>
565 T
guessValue(
const T& value,
const L * list, C endListComparator)
571 T bestDistance = (std::numeric_limits<T>::max)();
573 for (
const L * ptr = list; !endListComparator(*ptr); ++ptr) {
574 auto const cur = *ptr;
575 auto const distance = (std::max)(cur, value) - (std::min)(cur, value);
576 if (distance < bestDistance) {
577 bestDistance = distance;
586 template<
typename T,
typename Container>
589 if (!array || nelements == 0)
591 std::copy_n(array, array + nelements, std::back_inserter(container));
594 template<
typename T,
typename Container,
typename Callable>
595 void array_to_container(
const T* array, std::size_t nelements, Container &container, Callable convert)
597 if (!array || nelements == 0)
601 for (
auto i = 0u; i < nelements; ++i) {
602 container.push_back(convert(array[i]));
606 template<
typename T,
typename Container,
typename Compare>
612 while (!isEnd(value = *array++))
613 container.push_back(value);
616 template<
typename T,
typename Container,
typename Compare,
typename Callable>
622 while (!isEnd(value = *array++))
623 container.push_back(convert(value));
631 void hex_dump(FILE *f,
const uint8_t *buf, std::size_t size);
632 void hex_dump_log(
void *avcl,
int level,
const uint8_t *buf, std::size_t size);
634 #if AVCPP_CXX_STANDARD >= 20
635 void hex_dump(FILE *f, std::span<const uint8_t> buf);
636 void hex_dump_log(
void *avcl,
int level, std::span<const uint8_t> buf);
643 #ifdef __cpp_lib_format
647 template <
typename B>
648 concept has_name_method_with_ec = requires(
const B& type, std::error_code ec) {
649 { type.name(ec) } -> std::convertible_to<std::string_view>;
652 template <
typename B>
653 concept has_name_method_without_ec = requires(
const B& type) {
654 { type.name() } -> std::convertible_to<std::string_view>;
657 template <
typename B>
658 concept has_long_name_method_with_ec = requires(
const B& type, std::error_code ec) {
659 { type.longName(ec) } -> std::convertible_to<std::string_view>;
662 template <
typename B>
663 concept has_long_name_method_without_ec = requires(
const B& type) {
664 { type.longName() } -> std::convertible_to<std::string_view>;
668 template <
class T,
class CharT>
669 requires av::has_name_method_with_ec<T> || av::has_name_method_without_ec<T>
670 struct std::formatter<T, CharT>
672 bool longName =
false;
674 template<
typename ParseContext>
675 constexpr ParseContext::iterator parse(ParseContext& ctx)
677 auto it = ctx.begin();
678 if constexpr (requires { requires av::has_long_name_method_with_ec<T> || av::has_long_name_method_without_ec<T>; }) {
685 if (it != ctx.end() && *it !=
'}')
686 throw std::format_error(
"Invalid format args");
691 template<
typename ParseContext>
692 auto format(
const T& value, ParseContext& ctx)
const
695 if constexpr (requires { requires av::has_long_name_method_with_ec<T>; }) {
696 std::error_code dummy;
697 return std::format_to(ctx.out(),
"{}", value.longName(dummy));
698 }
else if constexpr (requires { requires av::has_long_name_method_without_ec<T>; }) {
699 return std::format_to(ctx.out(),
"{}", value.longName());
702 if constexpr (requires { requires av::has_name_method_with_ec<T>; }) {
703 std::error_code dummy;
704 return std::format_to(ctx.out(),
"{}", value.name(dummy));
706 return std::format_to(ctx.out(),
"{}", value.name());
The ScopeOutAction class - guard-type class that allows points callback that will be called at the sc...
Definition: avutils.h:265
~ScopeOutAction()
Definition: avutils.h:277
ScopeOutAction(Proc &&proc)
Definition: avutils.h:273
ScopeOutAction(const Proc &proc)
Definition: avutils.h:268
Functor to take next element in list/array.
Definition: avutils.h:200
ScopedValue(T &var, const V &outValue)
Ctor.
Definition: avutils.h:207
~ScopedValue()
Definition: avutils.h:226
ScopedValue(T &var, const V &inValue, const V &outValue)
Ctor.
Definition: avutils.h:219
void operator=(const noncopyable &)=delete
noncopyable(const noncopyable &)=delete
Definition: audioresampler.cpp:8
R lexical_cast(const T &v)
Definition: avutils.h:42
string error2string(int error)
C++ verstion of the av_err2str()
Definition: avutils.cpp:211
Timestamp operator-(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.cpp:102
Timestamp operator+(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.cpp:90
std::unique_ptr< T, void(*)(void *)> memdup(const void *p, size_t size)
Definition: avutils.h:163
Timestamp operator*(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.cpp:114
std::unique_ptr< T, void(*)(void *)> malloc(size_t size)
Definition: avutils.h:151
void hex_dump_log(void *avcl, int level, const uint8_t *buf, std::size_t size)
Definition: avutils.cpp:330
void dumpBinaryBuffer(uint8_t *buffer, int buffer_size, int width)
dump_binary_buffer Dump binary buffer to std out in HEX view
Definition: avutils.cpp:77
T guessValue(const T &value, const L *list, C endListComparator)
Select more approptiate value from given value list.
Definition: avutils.h:565
constexpr auto TimeBaseQ
Definition: avutils.h:38
void hex_dump(FILE *f, const uint8_t *buf, std::size_t size)
Definition: avutils.cpp:325
bool operator==(const Dictionary::Entry &lhs, const Dictionary::Entry &rhs)
Definition: dictionary.cpp:382
constexpr auto TimeBase
Definition: avutils.h:37
bool operator!=(const Dictionary::Entry &lhs, const Dictionary::Entry &rhs)
Definition: dictionary.cpp:387
void array_to_container(const T *array, std::size_t nelements, Container &container)
Definition: avutils.h:587
void set_logging_level(int32_t level)
This method can be used to turn up or down FFmpeg's logging level.
Definition: avutils.cpp:26
std::unique_ptr< T, void(*)(void *)> mallocz(size_t size)
Definition: avutils.h:157
constexpr auto NoPts
Definition: avutils.h:36
Definition: averror.h:230
Definition: avutils.h:112
void operator()(void *)
Definition: avutils.h:113
Definition: avutils.h:533
bool operator()(const T &value) const
Definition: avutils.h:538
EqualComparator(const T &value)
Definition: avutils.h:534
const T & value
Definition: avutils.h:546
Definition: avutils.h:123
bool operator()(struct SwsContext *&swsContext)
Definition: avutils.cpp:219
Definition: avutils.h:142
bool operator()(T *ptr)
Definition: avutils.h:144