On 2017/7/17 17:04, Luca Barbato wrote:
Thank you for your contribution, here some comments :)

On 7/17/17 10:40 AM, Huang, Zhengxu wrote:
+#include <mfx/mfxjpeg.h>
Is the header necessary?
the "MFX_CODEC_JPEG" needs this.

+++ b/libavcodec/qsvenc.c
@@ -435,6 +435,15 @@ static int init_video_param(AVCodecContext *avctx, 
QSVEncContext *q)
          q->param.mfx.FrameInfo.FrameRateExtD  = avctx->time_base.num;
      }
+ if (AV_CODEC_ID_MJPEG == avctx->codec_id) {
+        av_log(avctx, AV_LOG_DEBUG, " Init codec is QSV JPEG encode \n");
+        q->param.mfx.Interleaved          = 1;
+        q->param.mfx.Quality              = q->quality;;
+        q->param.mfx.RestartInterval      = 0;
+
+        return 0;
+    }
+
This should be moved in the specific encoder init function

      ret = select_rc_mode(avctx, q);
      if (ret < 0)
          return ret;
@@ -623,6 +632,11 @@ static int qsv_retrieve_enc_params(AVCodecContext *avctx, 
QSVEncContext *q)
q->packet_size = q->param.mfx.BufferSizeInKB * 1000; + // for qsv mjpeg the return value maybe 0 so alloc the buffer
+    if (0 == q->packet_size) {
+        q->packet_size = q->param.mfx.FrameInfo.Height * 
q->param.mfx.FrameInfo.Width * 4;
+    }
+
This should be moved there as well.
the qsv mjpeg indeed should be separated from the H264/MPEG2/HEVC according to the "mfxInfoMFX" struct's definition in the MSDK.
And I do this in the patch V2.


      if (!extradata.SPSBufSize || (need_pps && !extradata.PPSBufSize)) {
          av_log(avctx, AV_LOG_ERROR, "No extradata returned from libmfx.\n");
          return AVERROR_UNKNOWN;
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index a639904..1384068 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -132,6 +132,9 @@ typedef struct QSVEncContext {
      int int_ref_qp_delta;
      int recovery_point_sei;
+ // options for MJPEG
+    unsigned short quality;
+
There is a global quality option that probably could be reused.
yes, the global_quality should be reused.

      char *load_plugins;
  } QSVEncContext;
diff --git a/libavcodec/qsvenc_jpeg.c b/libavcodec/qsvenc_jpeg.c
new file mode 100644
index 0000000..fc9226d
--- /dev/null
+++ b/libavcodec/qsvenc_jpeg.c
@@ -0,0 +1,93 @@
+/*
+ * Intel MediaSDK QSV based MJPEG encoder
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <mfx/mfxvideo.h>
+
+#include "libavutil/common.h"
+#include "libavutil/opt.h"
+
+#include "avcodec.h"
+#include "internal.h"
+#include "h264.h"
+#include "qsv.h"
+#include "qsv_internal.h"
+#include "qsvenc.h"
+
+typedef struct QSVMJPEGEncContext {
+    AVClass *class;
+    QSVEncContext qsv;
+} QSVMJPEGEncContext;
+
+static av_cold int qsv_enc_init(AVCodecContext *avctx)
+{
+    QSVMJPEGEncContext *q = avctx->priv_data;
+
+    return ff_qsv_enc_init(avctx, &q->qsv);
+}
+
+static int qsv_enc_frame(AVCodecContext *avctx, AVPacket *pkt,
+                         const AVFrame *frame, int *got_packet)
+{
+    QSVMJPEGEncContext *q = avctx->priv_data;
+
+    return ff_qsv_encode(avctx, &q->qsv, pkt, frame, got_packet);
+}
+
+static av_cold int qsv_enc_close(AVCodecContext *avctx)
+{
+    QSVMJPEGEncContext *q = avctx->priv_data;
+
+    return ff_qsv_enc_close(avctx, &q->qsv);
+}
+
+#define OFFSET(x) offsetof(QSVMJPEGEncContext, x)
+#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+static const AVOption options[] = {
+    { "quality", "Specifies the image quality", OFFSET(qsv.quality), 
AV_OPT_TYPE_INT, { .i64 = 90 }, 1, 100, VE },
+
+    { NULL },
+};
+
+static const AVClass class = {
+    .class_name = "mjpeg_qsv encoder",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_mjpeg_qsv_encoder = {
+    .name           = "mjpeg_qsv",
+    .long_name      = NULL_IF_CONFIG_SMALL("MJPEG (Intel Quick Sync Video 
acceleration)"),
+    .priv_data_size = sizeof(QSVMJPEGEncContext),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_MJPEG,
+    .init           = qsv_enc_init,
+    .encode2        = qsv_enc_frame,
+    .close          = qsv_enc_close,
+    .capabilities   = AV_CODEC_CAP_DELAY,
+    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
+                                                    AV_PIX_FMT_QSV,
+                                                    AV_PIX_FMT_NONE },
+    .priv_class     = &class,
+};
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to