---
Changes from v2:
* modify some coding-style and comments as per Diego's review
---
---
Changes from v1:
* separate the mjpeg encoder from h264/hevc/mpeg2 as per Luca's review
* reuse the global_quality option as per Luca's review
* modify some coding-style and add changlog as per Diego's review
---
From b3f7127e32caef5dc59fba1bfd8a150e3c9fc57a Mon Sep 17 00:00:00 2001
From: "Huang, Zhengxu"
Date: Tue, 18 Jul 2017 01:13:24 +0800
Subject: [PATCH] libavcodec/mjpeg_qsv: Add QSV MJPEG encoder
usage:
-hwaccel qsv -c:v h264_qsv -i in -c:v mjpeg_qsv -global_quality 80 -f mjpeg out
Signed-off-by: ChaoX A Liu
Signed-off-by: Zhengxu Huang
Signed-off-by: Andrew Zhang
Change-Id: I6a8a89d04e200a833b58741836645be0e0482257
---
Changelog| 1 +
configure| 2 +
libavcodec/Makefile | 1 +
libavcodec/allcodecs.c | 1 +
libavcodec/qsv.c | 3 ++
libavcodec/qsvenc.c | 96 +++-
libavcodec/qsvenc_jpeg.c | 91 +
7 files changed, 193 insertions(+), 2 deletions(-)
create mode 100644 libavcodec/qsvenc_jpeg.c
diff --git a/Changelog b/Changelog
index adcca3f..82e3e3a 100644
--- a/Changelog
+++ b/Changelog
@@ -17,6 +17,7 @@ version :
- ClearVideo decoder (I-frames only)
- support for decoding through D3D11VA in avconv
- Cinepak encoder
+- Intel QSV-accelerated MJPEG encoding
version 12:
diff --git a/configure b/configure
index d92ce33..35ae031 100755
--- a/configure
+++ b/configure
@@ -2279,6 +2279,8 @@ hevc_qsv_decoder_select="hevc_mp4toannexb_bsf hevc_parser
hevc_qsv_hwaccel qsvde
hevc_qsv_encoder_select="hevc_ps qsvenc"
hevc_vaapi_encoder_deps="VAEncPictureParameterBufferHEVC"
hevc_vaapi_encoder_select="vaapi_encode golomb"
+mjpeg_qsv_encoder_deps="libmfx"
+mjpeg_qsv_encoder_select="qsvenc"
mjpeg_vaapi_encoder_deps="VAEncPictureParameterBufferJPEG"
mjpeg_vaapi_encoder_select="vaapi_encode jpegtables"
mpeg2_mmal_decoder_deps="mmal"
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 2b91588..12bf8fe 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -319,6 +319,7 @@ OBJS-$(CONFIG_MIMIC_DECODER) += mimic.o
OBJS-$(CONFIG_MJPEG_DECODER) += mjpegdec.o
OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpegenc_common.o
OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o
+OBJS-$(CONFIG_MJPEG_QSV_ENCODER) += qsvenc_jpeg.o
OBJS-$(CONFIG_MJPEG_VAAPI_ENCODER) += vaapi_encode_mjpeg.o
OBJS-$(CONFIG_MLP_DECODER) += mlpdec.o mlpdsp.o
OBJS-$(CONFIG_MMVIDEO_DECODER) += mmvideo.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 5635ae1..3fcea5b 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -509,6 +509,7 @@ void avcodec_register_all(void)
REGISTER_ENCODER(HEVC_NVENC,hevc_nvenc);
REGISTER_ENCODER(HEVC_QSV, hevc_qsv);
REGISTER_ENCODER(HEVC_VAAPI,hevc_vaapi);
+REGISTER_ENCODER(MJPEG_QSV, mjpeg_qsv);
REGISTER_ENCODER(MJPEG_VAAPI, mjpeg_vaapi);
REGISTER_ENCODER(MPEG2_QSV, mpeg2_qsv);
REGISTER_ENCODER(MPEG2_VAAPI, mpeg2_vaapi);
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 30d612f..a8ae656 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -20,6 +20,7 @@
#include
#include
+#include
#include
#include
@@ -56,6 +57,8 @@ int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
case AV_CODEC_ID_VP8:
return MFX_CODEC_VP8;
#endif
+case AV_CODEC_ID_MJPEG:
+return MFX_CODEC_JPEG;
default:
break;
}
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 7c6ad09..41325bc 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -353,6 +353,65 @@ static int rc_supported(QSVEncContext *q)
return 1;
}
+
+static int init_video_param_jpeg(AVCodecContext *avctx, QSVEncContext *q)
+{
+enum AVPixelFormat sw_format = avctx->pix_fmt == AV_PIX_FMT_QSV ?
+ avctx->sw_pix_fmt : avctx->pix_fmt;
+const AVPixFmtDescriptor *desc;
+int ret;
+
+ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
+if (ret < 0)
+return AVERROR_BUG;
+q->param.mfx.CodecId = ret;
+
+if (avctx->level > 0)
+q->param.mfx.CodecLevel = avctx->level;
+q->param.mfx.CodecProfile = q->profile;
+
+desc = av_pix_fmt_desc_get(sw_format);
+if (!desc)
+return AVERROR_BUG;
+
+ff_qsv_map_pixfmt(sw_format, &q->param.mfx.FrameInfo.FourCC);
+
+q->param.mfx.FrameInfo.CropX = 0;
+q->param.mfx.FrameInfo.CropY = 0;
+q->param.mfx.FrameInfo.CropW = avctx->width;
+q->param.mfx.FrameInfo.CropH = avctx->height;
+q->param.mfx.FrameInfo.AspectRatioW = avctx->sample_aspect_ratio.num;
+q->param.mfx.FrameInfo.AspectRatioH = avctx->sample_aspect_ratio.den;
+q->param.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_Y