6 #define LOC QString("DRMPRIMECtx: ")
8 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
46 const AVCodec **Codec,
50 const QString &CodecName,
54 QString name = QString((*Codec)->name) +
"_" + CodecName;
55 if (name.startsWith(
"mpeg2video"))
56 name =
"mpeg2_" + CodecName;
57 const AVCodec *codec = avcodec_find_decoder_by_name(name.toLocal8Bit());
59 if (!codec || !decoder)
62 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Failed to find %1").arg(name));
66 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Found FFmpeg decoder '%1'").arg(name));
68 decoder->CodecMap()->FreeCodecContext(Stream);
69 *Context = decoder->CodecMap()->GetCodecContext(Stream, *Codec);
70 (*Context)->pix_fmt =
Format;
75 const AVCodec **Codec,
102 if (codecname.isEmpty())
107 failure, codecname, AV_PIX_FMT_DRM_PRIME);
114 if (Context->pix_fmt != AV_PIX_FMT_DRM_PRIME)
118 if (
auto * player =
GetPlayerUI(Context); player !=
nullptr)
127 if (Context->pix_fmt == AV_PIX_FMT_DRM_PRIME)
129 DirectRendering =
false;
145 if (AvFrame->format == AV_PIX_FMT_DRM_PRIME)
152 while (*PixFmt != AV_PIX_FMT_NONE)
154 if (*PixFmt == AV_PIX_FMT_DRM_PRIME)
155 return AV_PIX_FMT_DRM_PRIME;
158 return AV_PIX_FMT_NONE;
163 if (!Context || !AvFrame || !
Frame)
166 if (
Frame->m_type !=
FMT_DRMPRIME ||
static_cast<AVPixelFormat
>(AvFrame->format) != AV_PIX_FMT_DRM_PRIME)
168 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Not a DRM PRIME buffer");
172 Frame->m_width = AvFrame->width;
173 Frame->m_height = AvFrame->height;
174 Frame->m_pixFmt = Context->pix_fmt;
175 Frame->m_swPixFmt = Context->sw_pix_fmt;
176 Frame->m_directRendering =
true;
177 AvFrame->opaque =
Frame;
178 AvFrame->reordered_opaque = Context->reordered_opaque;
181 Frame->m_buffer = AvFrame->data[0];
183 Frame->m_priv[0] =
reinterpret_cast<unsigned char*
>(av_buffer_ref(AvFrame->buf[0]));
194 static bool s_needscheck =
true;
195 static QVector<AVCodecID> s_supportedCodecs;
199 if (s_needscheck || Reinit)
201 s_needscheck =
false;
202 s_supportedCodecs.clear();
205 const AVCodec* codec =
nullptr;
206 void* opaque =
nullptr;
207 QStringList debugcodecs;
209 while ((codec = av_codec_iterate(&opaque)))
211 if (!av_codec_is_decoder(codec))
215 if (QString(codec->name).contains(
"v4l2m2m"))
218 const AVCodecHWConfig* config =
nullptr;
219 for (
int i = 0; (config = avcodec_get_hw_config(codec, i)); ++i)
221 if (config->pix_fmt != AV_PIX_FMT_DRM_PRIME)
226 if (config->methods & AV_CODEC_HW_CONFIG_METHOD_INTERNAL)
228 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
229 QStringList name = QString(codec->name).split(
"_", QString::SkipEmptyParts);
231 QStringList name = QString(codec->name).split(
"_", Qt::SkipEmptyParts);
235 if (!s_supportedCodecs.contains(codec->id))
237 s_supportedCodecs.append(codec->id);
238 debugcodecs.append(avcodec_get_name(codec->id));
244 if (debugcodecs.isEmpty())
245 debugcodecs.append(
"None");
246 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"DRM PRIME codecs supported: %1 %2")
247 .arg(debugcodecs.join(
","),
252 return !s_supportedCodecs.isEmpty();
253 return s_supportedCodecs.contains(Codec);