25 #include <libavcodec/avcodec.h>
26 #include <libavformat/avformat.h>
27 #include <libavutil/opt.h>
28 #include <libswscale/swscale.h>
35 #include <condition_variable>
48 int init(
enum AVPixelFormat pix_fmt,
int width,
int height)
50 frame = av_frame_alloc();
51 frame->format = pix_fmt;
53 frame->height = height;
54 return av_frame_get_buffer(
frame, 32);
60 av_frame_free(&
frame);
64 template <
typename T,
size_t S = 2>
68 explicit MTQueue(
const size_t maxSize = S)
75 std::unique_lock<std::mutex> lock(_mutex);
76 std::queue<T>().swap(_queue);
77 _condition.notify_all();
80 void push(
const T &element)
82 std::unique_lock<std::mutex> lock(_mutex);
83 _condition.wait(lock, [&] {
return _queue.size() < _maxSize; });
85 _condition.notify_all();
90 std::unique_lock<std::mutex> lock(_mutex);
91 _condition.wait(lock, [&] {
return !_queue.empty(); });
93 T element = _queue.front();
95 _condition.notify_all();
100 std::unique_lock<std::mutex> lock(_mutex);
101 return _queue.size();
105 std::queue<T> _queue;
106 mutable std::mutex _mutex;
107 mutable std::condition_variable _condition;
108 const size_t _maxSize;
129 AVFormatContext *formatContext{
nullptr};
130 AVStream *stream{
nullptr};
132 AVCodecContext *codecContext{
nullptr};
133 AVCodec *codec{
nullptr};
135 SwsContext *sws_context{
nullptr};
138 int64_t _frameNumber{0};
140 const bool _async =
true;
142 std::atomic_bool _running{
true};
148 std::vector<uint8_t>
data;
149 bool empty()
const {
return width == 0 ||
height == 0; }
154 int _currentImage{0};
158 void _toPicture(
const uint8_t *
const data,
const int width,
162 float _leftover{0.f};
std::function< void(const char *data, size_t size)> DataFunc
void encode(FrameBuffer &fb)
Encoder(const int width, const int height, const int fps, const int64_t kbps, const DataFunc &dataFunc)
This class represents a frame buffer for an engine specific code. It provides an API for utilizing an...
void push(const T &element)
MTQueue(const size_t maxSize=S)
int init(enum AVPixelFormat pix_fmt, int width, int height)