2#include "libmythbase/mythconfig.h"
9#define LOC QString("DRMPRIMECtx: ")
45 const AVCodec **Codec,
49 const QString &CodecName,
53 QString name = QString((*Codec)->name) +
"_" + CodecName;
54 if (name.startsWith(
"mpeg2video"))
55 name =
"mpeg2_" + CodecName;
56 const AVCodec *codec = avcodec_find_decoder_by_name(name.toLocal8Bit());
58 if (!codec || !decoder)
61 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Failed to find %1").arg(name));
65 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Found FFmpeg decoder '%1'").arg(name));
67 decoder->CodecMap()->FreeCodecContext(Stream);
68 *Context = decoder->CodecMap()->GetCodecContext(Stream, *Codec);
69 (*Context)->pix_fmt =
Format;
74 const AVCodec **Codec,
101 if (codecname.isEmpty())
106 failure, codecname, AV_PIX_FMT_DRM_PRIME);
113 if (Context->pix_fmt != AV_PIX_FMT_DRM_PRIME)
117 if (
auto * player =
GetPlayerUI(Context); player !=
nullptr)
126 if (Context->pix_fmt == AV_PIX_FMT_DRM_PRIME)
128 DirectRendering =
false;
144 if (AvFrame->format == AV_PIX_FMT_DRM_PRIME)
151 while (*PixFmt != AV_PIX_FMT_NONE)
153 if (*PixFmt == AV_PIX_FMT_DRM_PRIME)
154 return AV_PIX_FMT_DRM_PRIME;
157 return AV_PIX_FMT_NONE;
162 if (!Context || !AvFrame || !
Frame)
165 if (
Frame->m_type !=
FMT_DRMPRIME ||
static_cast<AVPixelFormat
>(AvFrame->format) != AV_PIX_FMT_DRM_PRIME)
167 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Not a DRM PRIME buffer");
171 Frame->m_width = AvFrame->width;
172 Frame->m_height = AvFrame->height;
173 Frame->m_pixFmt = Context->pix_fmt;
174 Frame->m_swPixFmt = Context->sw_pix_fmt;
175 Frame->m_directRendering =
true;
176 AvFrame->opaque =
Frame;
179 Frame->m_buffer = AvFrame->data[0];
181 Frame->m_priv[0] =
reinterpret_cast<unsigned char*
>(av_buffer_ref(AvFrame->buf[0]));
192 static bool s_needscheck =
true;
193 static QVector<AVCodecID> s_supportedCodecs;
197 if (s_needscheck || Reinit)
199 s_needscheck =
false;
200 s_supportedCodecs.clear();
203 const AVCodec* codec =
nullptr;
204 void* opaque =
nullptr;
205 QStringList debugcodecs;
207 while ((codec = av_codec_iterate(&opaque)))
209 if (!av_codec_is_decoder(codec))
213 if (QString(codec->name).contains(
"v4l2m2m"))
216 const AVCodecHWConfig* config =
nullptr;
217 for (
int i = 0; (config = avcodec_get_hw_config(codec, i)); ++i)
219 if (config->pix_fmt != AV_PIX_FMT_DRM_PRIME)
224 if (config->methods & AV_CODEC_HW_CONFIG_METHOD_INTERNAL)
226 QStringList name = QString(codec->name).split(
"_", Qt::SkipEmptyParts);
229 if (!s_supportedCodecs.contains(codec->id))
231 s_supportedCodecs.append(codec->id);
232 debugcodecs.append(avcodec_get_name(codec->id));
238 if (debugcodecs.isEmpty())
239 debugcodecs.append(
"None");
240 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"DRM PRIME codecs supported: %1 %2")
241 .arg(debugcodecs.join(
","),
246 return !s_supportedCodecs.isEmpty();
247 return s_supportedCodecs.contains(Codec);
static bool FrameTypeIsSupported(AVCodecContext *Context, VideoFrameType Format)
static void ReleaseBuffer(void *Opaque, uint8_t *Data)
static void DestroyInterop(MythInteropGPU *Interop)
virtual void InitVideoCodec(AVCodecContext *Context, bool SelectedStream, bool &DirectRendering)
static MythPlayerUI * GetPlayerUI(AVCodecContext *Context)
void InitVideoCodec(AVCodecContext *Context, bool SelectedStream, bool &DirectRendering) override
static QStringList s_drmPrimeDecoders
static enum AVPixelFormat GetFormat(AVCodecContext *Context, const AVPixelFormat *PixFmt)
bool DecoderWillResetOnFlush(void) override
static MythCodecID GetSupportedCodec(AVCodecContext **Context, const AVCodec **Codec, const QString &Decoder, AVStream *Stream, uint StreamType)
bool GetDRMBuffer(AVCodecContext *Context, MythVideoFrame *Frame, AVFrame *AvFrame, int)
static bool HavePrimeDecoders(bool Reinit=false, AVCodecID Codec=AV_CODEC_ID_NONE)
~MythDRMPRIMEContext() override
MythDRMPRIMEContext(DecoderBase *Parent, MythCodecID CodecID)
static MythCodecID GetPrimeCodec(AVCodecContext **Context, const AVCodec **Codec, AVStream *Stream, MythCodecID Successs, MythCodecID Failure, const QString &CodecName, AVPixelFormat Format)
MythOpenGLInterop * m_interop
int HwDecoderInit(AVCodecContext *Context) override
static QRecursiveMutex s_drmPrimeLock
bool RetrieveFrame(AVCodecContext *Context, MythVideoFrame *Frame, AVFrame *AvFrame) override
static MythDRMPRIMEInterop * CreateDRM(MythRenderOpenGL *Context, MythPlayerUI *Player)
Create a DRM PRIME interop instance.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)