Commit 3c81fa9a authored by Hendrik Leppkes's avatar Hendrik Leppkes

Merge commit '92736c74'

* commit '92736c74':
  qsvdec: add support for P010 (10-bit 420) decoding
Merged-by: 's avatarHendrik Leppkes <h.leppkes@gmail.com>
parents 220e7739 92736c74
...@@ -112,6 +112,9 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) ...@@ -112,6 +112,9 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc)
case AV_PIX_FMT_YUVJ420P: case AV_PIX_FMT_YUVJ420P:
*fourcc = MFX_FOURCC_NV12; *fourcc = MFX_FOURCC_NV12;
return AV_PIX_FMT_NV12; return AV_PIX_FMT_NV12;
case AV_PIX_FMT_YUV420P10:
*fourcc = MFX_FOURCC_P010;
return AV_PIX_FMT_P010;
default: default:
return AVERROR(ENOSYS); return AVERROR(ENOSYS);
} }
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "libavutil/hwcontext_qsv.h" #include "libavutil/hwcontext_qsv.h"
#include "libavutil/mem.h" #include "libavutil/mem.h"
#include "libavutil/log.h" #include "libavutil/log.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixfmt.h" #include "libavutil/pixfmt.h"
#include "libavutil/time.h" #include "libavutil/time.h"
...@@ -86,11 +87,16 @@ static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession ses ...@@ -86,11 +87,16 @@ static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession ses
static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q) static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
{ {
const AVPixFmtDescriptor *desc;
mfxSession session = NULL; mfxSession session = NULL;
int iopattern = 0; int iopattern = 0;
mfxVideoParam param = { { 0 } }; mfxVideoParam param = { { 0 } };
int ret; int ret;
desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
if (!desc)
return AVERROR_BUG;
if (!q->async_fifo) { if (!q->async_fifo) {
q->async_fifo = av_fifo_alloc((1 + q->async_depth) * q->async_fifo = av_fifo_alloc((1 + q->async_depth) *
(sizeof(mfxSyncPoint*) + sizeof(QSVFrame*))); (sizeof(mfxSyncPoint*) + sizeof(QSVFrame*)));
...@@ -136,9 +142,9 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q) ...@@ -136,9 +142,9 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
param.mfx.CodecProfile = ff_qsv_profile_to_mfx(avctx->codec_id, avctx->profile); param.mfx.CodecProfile = ff_qsv_profile_to_mfx(avctx->codec_id, avctx->profile);
param.mfx.CodecLevel = avctx->level == FF_LEVEL_UNKNOWN ? MFX_LEVEL_UNKNOWN : avctx->level; param.mfx.CodecLevel = avctx->level == FF_LEVEL_UNKNOWN ? MFX_LEVEL_UNKNOWN : avctx->level;
param.mfx.FrameInfo.BitDepthLuma = 8; param.mfx.FrameInfo.BitDepthLuma = desc->comp[0].depth;
param.mfx.FrameInfo.BitDepthChroma = 8; param.mfx.FrameInfo.BitDepthChroma = desc->comp[0].depth;
param.mfx.FrameInfo.Shift = 0; param.mfx.FrameInfo.Shift = desc->comp[0].depth > 8;
param.mfx.FrameInfo.FourCC = q->fourcc; param.mfx.FrameInfo.FourCC = q->fourcc;
param.mfx.FrameInfo.Width = avctx->coded_width; param.mfx.FrameInfo.Width = avctx->coded_width;
param.mfx.FrameInfo.Height = avctx->coded_height; param.mfx.FrameInfo.Height = avctx->coded_height;
...@@ -463,7 +469,8 @@ int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q, ...@@ -463,7 +469,8 @@ int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q,
qsv_format = ff_qsv_map_pixfmt(q->parser->format, &q->fourcc); qsv_format = ff_qsv_map_pixfmt(q->parser->format, &q->fourcc);
if (qsv_format < 0) { if (qsv_format < 0) {
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"Only 8-bit YUV420 streams are supported.\n"); "Decoding pixel format '%s' is not supported\n",
av_get_pix_fmt_name(q->parser->format));
ret = AVERROR(ENOSYS); ret = AVERROR(ENOSYS);
goto reinit_fail; goto reinit_fail;
} }
......
...@@ -269,6 +269,7 @@ AVCodec ff_hevc_qsv_decoder = { ...@@ -269,6 +269,7 @@ AVCodec ff_hevc_qsv_decoder = {
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
.priv_class = &hevc_class, .priv_class = &hevc_class,
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
AV_PIX_FMT_P010,
AV_PIX_FMT_QSV, AV_PIX_FMT_QSV,
AV_PIX_FMT_NONE }, AV_PIX_FMT_NONE },
}; };
...@@ -307,6 +308,7 @@ AVCodec ff_h264_qsv_decoder = { ...@@ -307,6 +308,7 @@ AVCodec ff_h264_qsv_decoder = {
.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
.priv_class = &class, .priv_class = &class,
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
AV_PIX_FMT_P010,
AV_PIX_FMT_QSV, AV_PIX_FMT_QSV,
AV_PIX_FMT_NONE }, AV_PIX_FMT_NONE },
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment