* [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault
@ 2022-10-18 4:59 haihao.xiang-at-intel.com
2022-10-18 4:59 ` [FFmpeg-devel] [PATCH 2/3] lavc/qsvenc: enlarge the maximum number of ExtParam buffers on mfxEncodeCtrl haihao.xiang-at-intel.com
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: haihao.xiang-at-intel.com @ 2022-10-18 4:59 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Haihao Xiang
From: Haihao Xiang <haihao.xiang@intel.com>
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
libavcodec/qsvenc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 15e6936a65..19fe6e59a2 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -2093,8 +2093,8 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q,
pkt.bs->ExtParam = enc_buf;
}
- if (q->set_encode_ctrl_cb) {
- q->set_encode_ctrl_cb(avctx, frame, &qsv_frame->enc_ctrl);
+ if (q->set_encode_ctrl_cb && enc_ctrl) {
+ q->set_encode_ctrl_cb(avctx, frame, enc_ctrl);
}
if ((avctx->codec_id == AV_CODEC_ID_H264 ||
--
2.25.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 4+ messages in thread
* [FFmpeg-devel] [PATCH 2/3] lavc/qsvenc: enlarge the maximum number of ExtParam buffers on mfxEncodeCtrl
2022-10-18 4:59 [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault haihao.xiang-at-intel.com
@ 2022-10-18 4:59 ` haihao.xiang-at-intel.com
2022-10-18 4:59 ` [FFmpeg-devel] [PATCH 3/3] lavc/qsvenc_hevc: accept HDR metadata if have haihao.xiang-at-intel.com
2022-10-24 6:16 ` [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault Xiang, Haihao
2 siblings, 0 replies; 4+ messages in thread
From: haihao.xiang-at-intel.com @ 2022-10-18 4:59 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Haihao Xiang
From: Haihao Xiang <haihao.xiang@intel.com>
The next commit and other commits in future will use more ExtParam
buffers.
And combine 2 free functions into single one
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
libavcodec/qsv_internal.h | 2 +-
libavcodec/qsvenc.c | 27 ++++++++-------------------
2 files changed, 9 insertions(+), 20 deletions(-)
diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
index 768f707ffa..5119ef4dff 100644
--- a/libavcodec/qsv_internal.h
+++ b/libavcodec/qsv_internal.h
@@ -51,7 +51,7 @@
#define ASYNC_DEPTH_DEFAULT 4 // internal parallelism
#define QSV_MAX_ENC_PAYLOAD 2 // # of mfxEncodeCtrl payloads supported
-#define QSV_MAX_ENC_EXTPARAM 2
+#define QSV_MAX_ENC_EXTPARAM 8 // # of mfxEncodeCtrl extparam supported
#define QSV_MAX_ROI_NUM 256
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 19fe6e59a2..690a076016 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -1434,25 +1434,16 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
return 0;
}
-static void free_encoder_ctrl_payloads(mfxEncodeCtrl* enc_ctrl)
+static void free_encoder_ctrl(mfxEncodeCtrl* enc_ctrl)
{
if (enc_ctrl) {
- int i;
- for (i = 0; i < enc_ctrl->NumPayload && i < QSV_MAX_ENC_PAYLOAD; i++) {
+ for (int i = 0; i < enc_ctrl->NumPayload && i < QSV_MAX_ENC_PAYLOAD; i++)
av_freep(&enc_ctrl->Payload[i]);
- }
- enc_ctrl->NumPayload = 0;
- }
-}
-static void free_encoder_ctrl_extparam(mfxEncodeCtrl* enc_ctrl)
-{
- if (enc_ctrl) {
- int i;
- for (i = 0; i < enc_ctrl->NumExtParam && i < QSV_MAX_ENC_EXTPARAM; i++) {
- if (enc_ctrl->ExtParam[i])
- av_freep(&(enc_ctrl->ExtParam[i]));
- }
+ for (int i = 0; i < enc_ctrl->NumExtParam && i < QSV_MAX_ENC_EXTPARAM; i++)
+ av_freep(&enc_ctrl->ExtParam[i]);
+
+ enc_ctrl->NumPayload = 0;
enc_ctrl->NumExtParam = 0;
}
}
@@ -1462,8 +1453,7 @@ static void clear_unused_frames(QSVEncContext *q)
QSVFrame *cur = q->work_frames;
while (cur) {
if (cur->used && !cur->surface.Data.Locked) {
- free_encoder_ctrl_payloads(&cur->enc_ctrl);
- free_encoder_ctrl_extparam(&cur->enc_ctrl);
+ free_encoder_ctrl(&cur->enc_ctrl);
//do not reuse enc_ctrl from previous frame
memset(&cur->enc_ctrl, 0, sizeof(cur->enc_ctrl));
cur->enc_ctrl.Payload = cur->payloads;
@@ -2231,8 +2221,7 @@ int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q)
while (cur) {
q->work_frames = cur->next;
av_frame_free(&cur->frame);
- free_encoder_ctrl_extparam(&cur->enc_ctrl);
- free_encoder_ctrl_payloads(&cur->enc_ctrl);
+ free_encoder_ctrl(&cur->enc_ctrl);
av_freep(&cur);
cur = q->work_frames;
}
--
2.25.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 4+ messages in thread
* [FFmpeg-devel] [PATCH 3/3] lavc/qsvenc_hevc: accept HDR metadata if have
2022-10-18 4:59 [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault haihao.xiang-at-intel.com
2022-10-18 4:59 ` [FFmpeg-devel] [PATCH 2/3] lavc/qsvenc: enlarge the maximum number of ExtParam buffers on mfxEncodeCtrl haihao.xiang-at-intel.com
@ 2022-10-18 4:59 ` haihao.xiang-at-intel.com
2022-10-24 6:16 ` [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault Xiang, Haihao
2 siblings, 0 replies; 4+ messages in thread
From: haihao.xiang-at-intel.com @ 2022-10-18 4:59 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Haihao Xiang
From: Haihao Xiang <haihao.xiang@intel.com>
The SDK may accept HDR metadata via mfxEncodeCtrl::ExtParam
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
libavcodec/qsvenc_hevc.c | 80 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c
index 2a3f34b915..28d2cfcae1 100644
--- a/libavcodec/qsvenc_hevc.c
+++ b/libavcodec/qsvenc_hevc.c
@@ -26,6 +26,7 @@
#include "libavutil/common.h"
#include "libavutil/opt.h"
+#include "libavutil/mastering_display_metadata.h"
#include "avcodec.h"
#include "bytestream.h"
@@ -160,6 +161,83 @@ static int generate_fake_vps(QSVEncContext *q, AVCodecContext *avctx)
return 0;
}
+static int qsv_hevc_set_encode_ctrl(AVCodecContext *avctx,
+ const AVFrame *frame, mfxEncodeCtrl *enc_ctrl)
+{
+ QSVHEVCEncContext *q = avctx->priv_data;
+ AVFrameSideData *sd;
+
+ if (!frame || !QSV_RUNTIME_VERSION_ATLEAST(q->qsv.ver, 1, 25))
+ return 0;
+
+ sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+ if (sd) {
+ AVMasteringDisplayMetadata *mdm = (AVMasteringDisplayMetadata *)sd->data;
+
+ // SEI is needed when both the primaries and luminance are set
+ if (mdm->has_primaries && mdm->has_luminance) {
+ const int mapping[3] = {1, 2, 0};
+ const int chroma_den = 50000;
+ const int luma_den = 10000;
+ int i;
+ mfxExtMasteringDisplayColourVolume *mdcv = av_mallocz(sizeof(mfxExtMasteringDisplayColourVolume));
+
+ if (!mdcv)
+ return AVERROR(ENOMEM);
+
+ mdcv->Header.BufferId = MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME;
+ mdcv->Header.BufferSz = sizeof(*mdcv);
+
+ for (i = 0; i < 3; i++) {
+ const int j = mapping[i];
+
+ mdcv->DisplayPrimariesX[i] =
+ FFMIN(lrint(chroma_den *
+ av_q2d(mdm->display_primaries[j][0])),
+ chroma_den);
+ mdcv->DisplayPrimariesY[i] =
+ FFMIN(lrint(chroma_den *
+ av_q2d(mdm->display_primaries[j][1])),
+ chroma_den);
+ }
+
+ mdcv->WhitePointX =
+ FFMIN(lrint(chroma_den * av_q2d(mdm->white_point[0])),
+ chroma_den);
+ mdcv->WhitePointY =
+ FFMIN(lrint(chroma_den * av_q2d(mdm->white_point[1])),
+ chroma_den);
+
+ mdcv->MaxDisplayMasteringLuminance =
+ lrint(luma_den * av_q2d(mdm->max_luminance));
+ mdcv->MinDisplayMasteringLuminance =
+ FFMIN(lrint(luma_den * av_q2d(mdm->min_luminance)),
+ mdcv->MaxDisplayMasteringLuminance);
+
+ enc_ctrl->ExtParam[enc_ctrl->NumExtParam++] = (mfxExtBuffer *)mdcv;
+ }
+ }
+
+ sd = av_frame_get_side_data(frame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+ if (sd) {
+ AVContentLightMetadata *clm = (AVContentLightMetadata *)sd->data;
+ mfxExtContentLightLevelInfo * clli = av_mallocz(sizeof(mfxExtContentLightLevelInfo));
+
+ if (!clli)
+ return AVERROR(ENOMEM);
+
+ clli->Header.BufferId = MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO;
+ clli->Header.BufferSz = sizeof(*clli);
+
+ clli->MaxContentLightLevel = FFMIN(clm->MaxCLL, 65535);
+ clli->MaxPicAverageLightLevel = FFMIN(clm->MaxFALL, 65535);
+
+ enc_ctrl->ExtParam[enc_ctrl->NumExtParam++] = (mfxExtBuffer *)clli;
+ }
+
+ return 0;
+}
+
static av_cold int qsv_enc_init(AVCodecContext *avctx)
{
QSVHEVCEncContext *q = avctx->priv_data;
@@ -189,6 +267,8 @@ static av_cold int qsv_enc_init(AVCodecContext *avctx)
// HEVC and H264 meaning of the value is shifted by 1, make it consistent
q->qsv.idr_interval++;
+ q->qsv.set_encode_ctrl_cb = qsv_hevc_set_encode_ctrl;
+
ret = ff_qsv_enc_init(avctx, &q->qsv);
if (ret < 0)
return ret;
--
2.25.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault
2022-10-18 4:59 [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault haihao.xiang-at-intel.com
2022-10-18 4:59 ` [FFmpeg-devel] [PATCH 2/3] lavc/qsvenc: enlarge the maximum number of ExtParam buffers on mfxEncodeCtrl haihao.xiang-at-intel.com
2022-10-18 4:59 ` [FFmpeg-devel] [PATCH 3/3] lavc/qsvenc_hevc: accept HDR metadata if have haihao.xiang-at-intel.com
@ 2022-10-24 6:16 ` Xiang, Haihao
2 siblings, 0 replies; 4+ messages in thread
From: Xiang, Haihao @ 2022-10-24 6:16 UTC (permalink / raw)
To: ffmpeg-devel
On Tue, 2022-10-18 at 12:59 +0800, haihao.xiang@intel.com wrote:
> From: Haihao Xiang <haihao.xiang@intel.com>
>
> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
> ---
> libavcodec/qsvenc.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
> index 15e6936a65..19fe6e59a2 100644
> --- a/libavcodec/qsvenc.c
> +++ b/libavcodec/qsvenc.c
> @@ -2093,8 +2093,8 @@ static int encode_frame(AVCodecContext *avctx,
> QSVEncContext *q,
> pkt.bs->ExtParam = enc_buf;
> }
>
> - if (q->set_encode_ctrl_cb) {
> - q->set_encode_ctrl_cb(avctx, frame, &qsv_frame->enc_ctrl);
> + if (q->set_encode_ctrl_cb && enc_ctrl) {
> + q->set_encode_ctrl_cb(avctx, frame, enc_ctrl);
> }
>
> if ((avctx->codec_id == AV_CODEC_ID_H264 ||
Will apply this patchset.
-Haihao
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-10-24 6:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-18 4:59 [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault haihao.xiang-at-intel.com
2022-10-18 4:59 ` [FFmpeg-devel] [PATCH 2/3] lavc/qsvenc: enlarge the maximum number of ExtParam buffers on mfxEncodeCtrl haihao.xiang-at-intel.com
2022-10-18 4:59 ` [FFmpeg-devel] [PATCH 3/3] lavc/qsvenc_hevc: accept HDR metadata if have haihao.xiang-at-intel.com
2022-10-24 6:16 ` [FFmpeg-devel] [PATCH 1/3] lavc/qsvenc: fix check to avoid segfault Xiang, Haihao
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git