2#include <Media/Libav.hpp>
4#include <ossia/detail/hash_map.hpp>
8#include <score_plugin_media_export.h>
15#include <libavformat/avformat.h>
16#include <libavutil/imgutils.h>
17#include <libavutil/pixdesc.h>
23inline const ossia::hash_map<std::string, AVPixelFormat>& gstreamerToLibav()
25 static const auto map = [] {
26 ossia::hash_map<std::string, AVPixelFormat> format_map;
131 format_map[
"A420"] = AV_PIX_FMT_YUVA420P;
132 format_map[
"A420_10BE"] = AV_PIX_FMT_YUVA420P10BE;
133 format_map[
"A420_10LE"] = AV_PIX_FMT_YUVA420P10LE;
134 format_map[
"A422_10BE"] = AV_PIX_FMT_YUVA422P10BE;
135 format_map[
"A422_10LE"] = AV_PIX_FMT_YUVA422P10LE;
136 format_map[
"A444_10BE"] = AV_PIX_FMT_YUVA444P10BE;
137 format_map[
"A444_10LE"] = AV_PIX_FMT_YUVA444P10LE;
138 format_map[
"ABGR"] = AV_PIX_FMT_ABGR;
141 format_map[
"ARGB"] = AV_PIX_FMT_ARGB;
147 format_map[
"AYUV64"] = AV_PIX_FMT_AYUV64;
152 format_map[
"BGRA"] = AV_PIX_FMT_BGRA;
156 format_map[
"BGRx"] = AV_PIX_FMT_BGR0;
158 format_map[
"GBR"] = AV_PIX_FMT_GBRP;
159 format_map[
"GBRA"] = AV_PIX_FMT_GBRAP;
169 format_map[
"GRAY16_BE"] = AV_PIX_FMT_GRAY16BE;
170 format_map[
"GRAY16_LE"] = AV_PIX_FMT_GRAY16LE;
171 format_map[
"GRAY8"] = AV_PIX_FMT_GRAY8;
172 format_map[
"I420"] = AV_PIX_FMT_YUV420P;
173 format_map[
"I420_10BE"] = AV_PIX_FMT_YUV420P10BE;
174 format_map[
"I420_10LE"] = AV_PIX_FMT_YUV420P10LE;
175 format_map[
"I420_12BE"] = AV_PIX_FMT_YUV420P12BE;
176 format_map[
"I420_12LE"] = AV_PIX_FMT_YUV420P12LE;
177 format_map[
"I422_10BE"] = AV_PIX_FMT_YUV422P10BE;
178 format_map[
"I422_10LE"] = AV_PIX_FMT_YUV422P10LE;
179 format_map[
"I422_12BE"] = AV_PIX_FMT_YUV422P12BE;
180 format_map[
"I422_12LE"] = AV_PIX_FMT_YUV422P12LE;
183 format_map[
"NV12"] = AV_PIX_FMT_NV12;
189 format_map[
"NV16"] = AV_PIX_FMT_NV16;
191 format_map[
"NV21"] = AV_PIX_FMT_NV21;
192 format_map[
"NV24"] = AV_PIX_FMT_NV24;
194 format_map[
"P010_10BE"] = AV_PIX_FMT_P010BE;
195 format_map[
"P010_10LE"] = AV_PIX_FMT_P010LE;
198 format_map[
"P016_BE"] = AV_PIX_FMT_P016BE;
199 format_map[
"P016_LE"] = AV_PIX_FMT_P016LE;
201 format_map[
"RGB"] = AV_PIX_FMT_RGB24;
206 format_map[
"RGBA"] = AV_PIX_FMT_RGBA;
207 format_map[
"RGBA64_BE"] = AV_PIX_FMT_RGBA64BE;
208 format_map[
"RGBA64_LE"] = AV_PIX_FMT_RGBA64LE;
211 format_map[
"RGBP"] = AV_PIX_FMT_GBRP;
212 format_map[
"RGBx"] = AV_PIX_FMT_RGB0;
215 format_map[
"UYVY"] = AV_PIX_FMT_UYVY422;
221 format_map[
"xBGR"] = AV_PIX_FMT_0BGR;
222 format_map[
"xRGB"] = AV_PIX_FMT_0RGB;
223 format_map[
"Y210"] = AV_PIX_FMT_Y210;
229#if defined(AV_PIX_FMT_XV30)
230 format_map[
"Y410"] = AV_PIX_FMT_XV30;
234 format_map[
"Y41B"] = AV_PIX_FMT_YUV411P;
235 format_map[
"Y42B"] = AV_PIX_FMT_YUV422P;
236 format_map[
"Y444"] = AV_PIX_FMT_YUV444P;
237 format_map[
"Y444_10BE"] = AV_PIX_FMT_YUV444P10BE;
238 format_map[
"Y444_10LE"] = AV_PIX_FMT_YUV444P10LE;
239 format_map[
"Y444_12BE"] = AV_PIX_FMT_YUV444P12BE;
240 format_map[
"Y444_12LE"] = AV_PIX_FMT_YUV444P12LE;
241 format_map[
"Y444_16BE"] = AV_PIX_FMT_YUV444P16BE;
242 format_map[
"Y444_16LE"] = AV_PIX_FMT_YUV444P16LE;
244 format_map[
"YUY2"] = AV_PIX_FMT_YUYV422;
247 format_map[
"YVYU"] = AV_PIX_FMT_YVYU422;
261using PlaneOrder = std::array<int, 4>;
262inline constexpr PlaneOrder identityPlaneOrder{0, 1, 2, 3};
264inline PlaneOrder gstreamerPlaneOrder(std::string_view gstFormat)
noexcept
266 if(gstFormat ==
"RGBP")
268 return identityPlaneOrder;
281initFrameFromRawData(AVFrame* frame, uint8_t* p, std::size_t sz,
int align)
283 const auto fmt = (AVPixelFormat)frame->format;
285 = av_image_get_buffer_size(fmt, frame->width, frame->height, align);
286 if(needed < 0 || std::size_t(needed) > sz)
288 qDebug() <<
"unhandled video format" << av_get_pix_fmt_name(fmt) <<
":" << sz
289 <<
"bytes for a buffer that needs" << needed;
293 if(av_image_fill_arrays(
294 frame->data, frame->linesize, p, fmt, frame->width, frame->height, align)
297 qDebug() <<
"could not lay out video format" << av_get_pix_fmt_name(fmt);
304inline bool initFrameFromRawData(AVFrame* frame, uint8_t* p, std::size_t sz)
306 return initFrameFromRawData(frame, p, sz, 1);