qsv: Add VC-1 decoder
authorMark Thompson <sw@jkqxz.net>
Wed, 26 Oct 2016 20:29:08 +0000 (21:29 +0100)
committerMark Thompson <sw@jkqxz.net>
Mon, 14 Nov 2016 19:38:19 +0000 (19:38 +0000)
It uses the same code as the MPEG-2 decoder, so the file is renamed
to contain all "other" (that is, not H.26[45]) codecs.

configure
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/qsvdec_other.c [moved from libavcodec/qsvdec_mpeg2.c with 72% similarity]

index 7ced8fa..e9615fc 100755 (executable)
--- a/configure
+++ b/configure
@@ -2184,6 +2184,7 @@ vc1_dxva2_hwaccel_select="vc1_decoder"
 vc1_mmal_decoder_deps="mmal"
 vc1_mmal_decoder_select="mmal"
 vc1_mmal_hwaccel_deps="mmal"
+vc1_qsv_hwaccel_deps="libmfx"
 vc1_vaapi_hwaccel_deps="vaapi"
 vc1_vaapi_hwaccel_select="vc1_decoder"
 vc1_vdpau_hwaccel_deps="vdpau"
@@ -2226,6 +2227,8 @@ mpeg2_qsv_decoder_deps="libmfx"
 mpeg2_qsv_decoder_select="qsvdec mpeg2_qsv_hwaccel mpegvideo_parser"
 mpeg2_qsv_encoder_deps="libmfx"
 mpeg2_qsv_encoder_select="qsvenc"
+vc1_qsv_decoder_deps="libmfx"
+vc1_qsv_decoder_select="qsvdec vc1_qsv_hwaccel vc1_parser"
 
 nvenc_h264_encoder_deps="nvenc"
 nvenc_hevc_encoder_deps="nvenc"
index 66a6c66..08b510a 100644 (file)
@@ -328,7 +328,7 @@ OBJS-$(CONFIG_MPC8_DECODER)            += mpc8.o mpc.o
 OBJS-$(CONFIG_MPEG_XVMC_DECODER)       += mpegvideo_xvmc.o
 OBJS-$(CONFIG_MPEG1VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
 OBJS-$(CONFIG_MPEG1VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
-OBJS-$(CONFIG_MPEG2_QSV_DECODER)       += qsvdec_mpeg2.o
+OBJS-$(CONFIG_MPEG2_QSV_DECODER)       += qsvdec_other.o
 OBJS-$(CONFIG_MPEG2_QSV_ENCODER)       += qsvenc_mpeg2.o
 OBJS-$(CONFIG_MPEG2VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
 OBJS-$(CONFIG_MPEG2VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
@@ -461,6 +461,7 @@ OBJS-$(CONFIG_VC1_DECODER)             += vc1dec.o vc1_block.o vc1_loopfilter.o
                                           msmpeg4dec.o msmpeg4.o msmpeg4data.o \
                                           wmv2data.o
 OBJS-$(CONFIG_VC1_MMAL_DECODER)        += mmaldec.o
+OBJS-$(CONFIG_VC1_QSV_DECODER)         += qsvdec_other.o
 OBJS-$(CONFIG_VCR1_DECODER)            += vcr1.o
 OBJS-$(CONFIG_VMDAUDIO_DECODER)        += vmdaudio.o
 OBJS-$(CONFIG_VMDVIDEO_DECODER)        += vmdvideo.o
index 41af38e..a66403a 100644 (file)
@@ -91,6 +91,7 @@ void avcodec_register_all(void)
     REGISTER_HWACCEL(MPEG4_VDPAU,       mpeg4_vdpau);
     REGISTER_HWACCEL(VC1_D3D11VA,       vc1_d3d11va);
     REGISTER_HWACCEL(VC1_DXVA2,         vc1_dxva2);
+    REGISTER_HWACCEL(VC1_QSV,           vc1_qsv);
     REGISTER_HWACCEL(VC1_VAAPI,         vc1_vaapi);
     REGISTER_HWACCEL(VC1_VDPAU,         vc1_vdpau);
     REGISTER_HWACCEL(VC1_MMAL,          vc1_mmal);
@@ -280,6 +281,7 @@ void avcodec_register_all(void)
     REGISTER_DECODER(VC1,               vc1);
     REGISTER_DECODER(VC1IMAGE,          vc1image);
     REGISTER_DECODER(VC1_MMAL,          vc1_mmal);
+    REGISTER_DECODER(VC1_QSV,           vc1_qsv);
     REGISTER_DECODER(VCR1,              vcr1);
     REGISTER_DECODER(VMDVIDEO,          vmdvideo);
     REGISTER_DECODER(VMNC,              vmnc);
similarity index 72%
rename from libavcodec/qsvdec_mpeg2.c
rename to libavcodec/qsvdec_other.c
index 2daad56..53a1bc8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Intel MediaSDK QSV based MPEG-2 decoder
+ * Intel MediaSDK QSV based MPEG-2 and VC-1 decoders
  *
  * copyright (c) 2015 Anton Khirnov
  *
 #include "qsvdec.h"
 #include "qsv.h"
 
-typedef struct QSVMPEG2Context {
+typedef struct QSVOtherContext {
     AVClass *class;
     QSVContext qsv;
 
     AVFifoBuffer *packet_fifo;
 
     AVPacket input_ref;
-} QSVMPEG2Context;
+} QSVOtherContext;
 
-static void qsv_clear_buffers(QSVMPEG2Context *s)
+static void qsv_clear_buffers(QSVOtherContext *s)
 {
     AVPacket pkt;
     while (av_fifo_size(s->packet_fifo) >= sizeof(pkt)) {
@@ -58,7 +58,7 @@ static void qsv_clear_buffers(QSVMPEG2Context *s)
 
 static av_cold int qsv_decode_close(AVCodecContext *avctx)
 {
-    QSVMPEG2Context *s = avctx->priv_data;
+    QSVOtherContext *s = avctx->priv_data;
 
     ff_qsv_decode_close(&s->qsv);
 
@@ -71,7 +71,7 @@ static av_cold int qsv_decode_close(AVCodecContext *avctx)
 
 static av_cold int qsv_decode_init(AVCodecContext *avctx)
 {
-    QSVMPEG2Context *s = avctx->priv_data;
+    QSVOtherContext *s = avctx->priv_data;
     int ret;
 
     s->packet_fifo = av_fifo_alloc(sizeof(AVPacket));
@@ -89,7 +89,7 @@ fail:
 static int qsv_decode_frame(AVCodecContext *avctx, void *data,
                             int *got_frame, AVPacket *avpkt)
 {
-    QSVMPEG2Context *s = avctx->priv_data;
+    QSVOtherContext *s = avctx->priv_data;
     AVFrame *frame    = data;
     int ret;
 
@@ -134,27 +134,30 @@ static int qsv_decode_frame(AVCodecContext *avctx, void *data,
 
 static void qsv_decode_flush(AVCodecContext *avctx)
 {
-    QSVMPEG2Context *s = avctx->priv_data;
+    QSVOtherContext *s = avctx->priv_data;
 
     qsv_clear_buffers(s);
     ff_qsv_decode_flush(avctx, &s->qsv);
 }
 
+#define OFFSET(x) offsetof(QSVOtherContext, x)
+#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
+static const AVOption options[] = {
+    { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 0, INT_MAX, VD },
+    { NULL },
+};
+
+#if CONFIG_MPEG2_QSV_HWACCEL
 AVHWAccel ff_mpeg2_qsv_hwaccel = {
     .name           = "mpeg2_qsv",
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_MPEG2VIDEO,
     .pix_fmt        = AV_PIX_FMT_QSV,
 };
+#endif
 
-#define OFFSET(x) offsetof(QSVMPEG2Context, x)
-#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
-static const AVOption options[] = {
-    { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 0, INT_MAX, VD },
-    { NULL },
-};
-
-static const AVClass class = {
+#if CONFIG_MPEG2_QSV_DECODER
+static const AVClass mpeg2_qsv_class = {
     .class_name = "mpeg2_qsv",
     .item_name  = av_default_item_name,
     .option     = options,
@@ -164,7 +167,7 @@ static const AVClass class = {
 AVCodec ff_mpeg2_qsv_decoder = {
     .name           = "mpeg2_qsv",
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-2 video (Intel Quick Sync Video acceleration)"),
-    .priv_data_size = sizeof(QSVMPEG2Context),
+    .priv_data_size = sizeof(QSVOtherContext),
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_MPEG2VIDEO,
     .init           = qsv_decode_init,
@@ -172,8 +175,44 @@ AVCodec ff_mpeg2_qsv_decoder = {
     .flush          = qsv_decode_flush,
     .close          = qsv_decode_close,
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
-    .priv_class     = &class,
+    .priv_class     = &mpeg2_qsv_class,
+    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
+                                                    AV_PIX_FMT_QSV,
+                                                    AV_PIX_FMT_NONE },
+};
+#endif
+
+#if CONFIG_VC1_QSV_HWACCEL
+AVHWAccel ff_vc1_qsv_hwaccel = {
+    .name           = "vc1_qsv",
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_VC1,
+    .pix_fmt        = AV_PIX_FMT_QSV,
+};
+#endif
+
+#if CONFIG_VC1_QSV_DECODER
+static const AVClass vc1_qsv_class = {
+    .class_name = "vc1_qsv",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_vc1_qsv_decoder = {
+    .name           = "vc1_qsv",
+    .long_name      = NULL_IF_CONFIG_SMALL("VC-1 video (Intel Quick Sync Video acceleration)"),
+    .priv_data_size = sizeof(QSVOtherContext),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_VC1,
+    .init           = qsv_decode_init,
+    .decode         = qsv_decode_frame,
+    .flush          = qsv_decode_flush,
+    .close          = qsv_decode_close,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
+    .priv_class     = &vc1_qsv_class,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_QSV,
                                                     AV_PIX_FMT_NONE },
 };
+#endif