10 #include <QMutexLocker>
14 #include "mythconfig.h"
21 #include "libavcodec/avcodec.h"
22 #include "libavutil/imgutils.h"
23 #include "libavformat/avformat.h"
30 case FMT_YV12:
return AV_PIX_FMT_YUV420P;
36 case FMT_NV12:
return AV_PIX_FMT_NV12;
37 case FMT_P010:
return AV_PIX_FMT_P010;
38 case FMT_P016:
return AV_PIX_FMT_P016;
52 case FMT_BGRA:
return AV_PIX_FMT_BGRA;
56 case FMT_YUY2:
return AV_PIX_FMT_UYVY422;
58 case FMT_VTB:
return AV_PIX_FMT_VIDEOTOOLBOX;
62 case FMT_DXVA2:
return AV_PIX_FMT_DXVA2_VLD;
63 case FMT_MMAL:
return AV_PIX_FMT_MMAL;
67 return AV_PIX_FMT_NONE;
74 case AV_PIX_FMT_YUVJ420P:
75 case AV_PIX_FMT_YUV420P:
return FMT_YV12;
81 case AV_PIX_FMT_NV12:
return FMT_NV12;
82 case AV_PIX_FMT_P010:
return FMT_P010;
83 case AV_PIX_FMT_P016:
return FMT_P016;
84 case AV_PIX_FMT_YUVJ422P:
91 case AV_PIX_FMT_YUVJ444P:
98 case AV_PIX_FMT_UYVY422:
return FMT_YUY2;
102 case AV_PIX_FMT_BGRA:
return FMT_BGRA;
104 case AV_PIX_FMT_MMAL:
return FMT_MMAL;
106 case AV_PIX_FMT_VIDEOTOOLBOX:
return FMT_VTB;
108 case AV_PIX_FMT_DXVA2_VLD:
return FMT_DXVA2;
155 if (Fmt == AV_PIX_FMT_NONE)
181 m_size = av_image_get_buffer_size(Fmt, Width, Height, IMAGE_ALIGN);
189 int Width,
int Height)
191 int newwidth = Width;
199 if (FromFmt == AV_PIX_FMT_YUV420P && ToFmt == AV_PIX_FMT_BGRA)
200 newwidth = Width - 1;
203 newwidth, Height, ToFmt, SWS_FAST_BILINEAR,
204 nullptr,
nullptr,
nullptr);
207 sws_scale(
m_swsctx, From->data, From->linesize, 0, Height, To->data, To->linesize);
208 return SizeData(Width, Height, ToFmt);
218 unsigned char*
Buffer, AVPixelFormat Fmt)
225 av_image_fill_arrays(To->data, To->linesize,
Buffer, Fmt, From->
m_width, From->
m_height, IMAGE_ALIGN);
239 const AVCodec* Codec,
243 AVCodecContext* avctx =
m_streamMap.value(Stream,
nullptr);
246 if (Stream ==
nullptr || Stream->codecpar ==
nullptr)
256 Codec = avcodec_find_decoder(Stream->codecpar->codec_id);
260 LOG(VB_GENERAL, LOG_WARNING, QString(
"avcodec_find_decoder fail for %1")
261 .
arg(Stream->codecpar->codec_id));
265 avctx = avcodec_alloc_context3(Codec);
266 if (avcodec_parameters_to_context(avctx, Stream->codecpar) < 0)
267 avcodec_free_context(&avctx);
271 avctx->pkt_timebase = Stream->time_base;
293 avcodec_flush_buffers(avctx);
294 avcodec_free_context(&avctx);
301 QMap<const AVStream*, AVCodecContext*>::iterator i =
m_streamMap.begin();
304 const AVStream *stream = i.key();
312 const int probeBufferSize = 8 * 1024;
313 AVInputFormat *fmt =
nullptr;
315 memset(&probe, 0,
sizeof(AVProbeData));
317 probe.buf =
new unsigned char[probeBufferSize + AVPROBE_PADDING_SIZE];
318 probe.buf_size = probeBufferSize;
319 memset(probe.buf, 0, probeBufferSize + AVPROBE_PADDING_SIZE);
320 av_log_set_level(AV_LOG_FATAL);
325 if (
m_errorCode == 0 && !infile.open(QIODevice::ReadOnly))
328 int64_t leng = infile.read(
reinterpret_cast<char*
>(probe.buf), probeBufferSize);
329 probe.buf_size =
static_cast<int>(leng);
331 fmt = av_probe_input_format(&probe,
static_cast<int>(
true));
335 AVFormatContext *ctx =
nullptr;
338 ctx = avformat_alloc_context();
342 m_errorCode = avformat_find_stream_info(ctx,
nullptr);
346 for (
uint ix = 0; ix < ctx->nb_streams; ix++)
348 AVStream *stream = ctx->streams[ix];
349 if (stream ==
nullptr)
351 AVCodecParameters *codecpar = stream->codecpar;
352 const AVCodecDescriptor* desc =
nullptr;
355 if (codecpar !=
nullptr)
357 desc = avcodec_descriptor_get(codecpar->codec_id);
358 switch (codecpar->codec_type)
360 case AVMEDIA_TYPE_VIDEO:
363 case AVMEDIA_TYPE_AUDIO:
366 case AVMEDIA_TYPE_SUBTITLE:
375 info.
m_duration = stream->duration * stream->time_base.num / stream->time_base.den;
378 if (codecpar !=
nullptr)
380 info.
m_width = codecpar->width;
383 /
static_cast<float>(codecpar->sample_aspect_ratio.den);
384 switch (codecpar->field_order)
386 case AV_FIELD_PROGRESSIVE:
405 info.
m_frameRate =
static_cast<float>(stream->r_frame_rate.num)
406 /
static_cast<float>(stream->r_frame_rate.den);
407 info.
m_avgFrameRate =
static_cast<float>(stream->avg_frame_rate.num)
408 /
static_cast<float>(stream->avg_frame_rate.den);
422 m_errorMsg =
"av_probe_input_format returned no result";
434 LOG(VB_GENERAL, LOG_ERR,
435 QString(
"MythStreamInfoList failed for %1. Error code:%2 Message:%3")
442 avformat_close_input(&ctx);
443 avformat_free_context(ctx);