Commit e3e8eab3 authored by Mark Thompson's avatar Mark Thompson

vaapi_h265: Add support for AUD NAL units

Matching the H.264 encoder.
parent ac124867
...@@ -42,6 +42,7 @@ typedef struct VAAPIEncodeH265Context { ...@@ -42,6 +42,7 @@ typedef struct VAAPIEncodeH265Context {
int fixed_qp_p; int fixed_qp_p;
int fixed_qp_b; int fixed_qp_b;
H265RawAUD aud;
H265RawVPS vps; H265RawVPS vps;
H265RawSPS sps; H265RawSPS sps;
H265RawPPS pps; H265RawPPS pps;
...@@ -52,13 +53,16 @@ typedef struct VAAPIEncodeH265Context { ...@@ -52,13 +53,16 @@ typedef struct VAAPIEncodeH265Context {
int slice_nal_unit; int slice_nal_unit;
int slice_type; int slice_type;
int pic_type;
CodedBitstreamContext cbc; CodedBitstreamContext cbc;
CodedBitstreamFragment current_access_unit; CodedBitstreamFragment current_access_unit;
int aud_needed;
} VAAPIEncodeH265Context; } VAAPIEncodeH265Context;
typedef struct VAAPIEncodeH265Options { typedef struct VAAPIEncodeH265Options {
int qp; int qp;
int aud;
} VAAPIEncodeH265Options; } VAAPIEncodeH265Options;
...@@ -117,6 +121,13 @@ static int vaapi_encode_h265_write_sequence_header(AVCodecContext *avctx, ...@@ -117,6 +121,13 @@ static int vaapi_encode_h265_write_sequence_header(AVCodecContext *avctx,
CodedBitstreamFragment *au = &priv->current_access_unit; CodedBitstreamFragment *au = &priv->current_access_unit;
int err; int err;
if (priv->aud_needed) {
err = vaapi_encode_h265_add_nal(avctx, au, &priv->aud);
if (err < 0)
goto fail;
priv->aud_needed = 0;
}
err = vaapi_encode_h265_add_nal(avctx, au, &priv->vps); err = vaapi_encode_h265_add_nal(avctx, au, &priv->vps);
if (err < 0) if (err < 0)
goto fail; goto fail;
...@@ -145,6 +156,13 @@ static int vaapi_encode_h265_write_slice_header(AVCodecContext *avctx, ...@@ -145,6 +156,13 @@ static int vaapi_encode_h265_write_slice_header(AVCodecContext *avctx,
CodedBitstreamFragment *au = &priv->current_access_unit; CodedBitstreamFragment *au = &priv->current_access_unit;
int err; int err;
if (priv->aud_needed) {
err = vaapi_encode_h265_add_nal(avctx, au, &priv->aud);
if (err < 0)
goto fail;
priv->aud_needed = 0;
}
err = vaapi_encode_h265_add_nal(avctx, au, &priv->slice); err = vaapi_encode_h265_add_nal(avctx, au, &priv->slice);
if (err < 0) if (err < 0)
goto fail; goto fail;
...@@ -519,6 +537,7 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, ...@@ -519,6 +537,7 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
{ {
VAAPIEncodeContext *ctx = avctx->priv_data; VAAPIEncodeContext *ctx = avctx->priv_data;
VAAPIEncodeH265Context *priv = ctx->priv_data; VAAPIEncodeH265Context *priv = ctx->priv_data;
VAAPIEncodeH265Options *opt = ctx->codec_options;
VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params; VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params;
int i; int i;
...@@ -529,16 +548,19 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, ...@@ -529,16 +548,19 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
priv->slice_nal_unit = HEVC_NAL_IDR_W_RADL; priv->slice_nal_unit = HEVC_NAL_IDR_W_RADL;
priv->slice_type = HEVC_SLICE_I; priv->slice_type = HEVC_SLICE_I;
priv->pic_type = 0;
} else { } else {
av_assert0(pic->encode_order > priv->last_idr_frame); av_assert0(pic->encode_order > priv->last_idr_frame);
if (pic->type == PICTURE_TYPE_I) { if (pic->type == PICTURE_TYPE_I) {
priv->slice_nal_unit = HEVC_NAL_CRA_NUT; priv->slice_nal_unit = HEVC_NAL_CRA_NUT;
priv->slice_type = HEVC_SLICE_I; priv->slice_type = HEVC_SLICE_I;
priv->pic_type = 0;
} else if (pic->type == PICTURE_TYPE_P) { } else if (pic->type == PICTURE_TYPE_P) {
av_assert0(pic->refs[0]); av_assert0(pic->refs[0]);
priv->slice_nal_unit = HEVC_NAL_TRAIL_R; priv->slice_nal_unit = HEVC_NAL_TRAIL_R;
priv->slice_type = HEVC_SLICE_P; priv->slice_type = HEVC_SLICE_P;
priv->pic_type = 1;
} else { } else {
av_assert0(pic->refs[0] && pic->refs[1]); av_assert0(pic->refs[0] && pic->refs[1]);
if (pic->refs[1]->type == PICTURE_TYPE_I) if (pic->refs[1]->type == PICTURE_TYPE_I)
...@@ -546,10 +568,23 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, ...@@ -546,10 +568,23 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
else else
priv->slice_nal_unit = HEVC_NAL_TRAIL_N; priv->slice_nal_unit = HEVC_NAL_TRAIL_N;
priv->slice_type = HEVC_SLICE_B; priv->slice_type = HEVC_SLICE_B;
priv->pic_type = 2;
} }
} }
priv->pic_order_cnt = pic->display_order - priv->last_idr_frame; priv->pic_order_cnt = pic->display_order - priv->last_idr_frame;
if (opt->aud) {
priv->aud_needed = 1;
priv->aud.nal_unit_header = (H265RawNALUnitHeader) {
.nal_unit_type = HEVC_NAL_AUD,
.nuh_layer_id = 0,
.nuh_temporal_id_plus1 = 1,
};
priv->aud.pic_type = priv->pic_type;
} else {
priv->aud_needed = 0;
}
vpic->decoded_curr_pic = (VAPictureHEVC) { vpic->decoded_curr_pic = (VAPictureHEVC) {
.picture_id = pic->recon_surface, .picture_id = pic->recon_surface,
.pic_order_cnt = priv->pic_order_cnt, .pic_order_cnt = priv->pic_order_cnt,
...@@ -902,6 +937,10 @@ static av_cold int vaapi_encode_h265_close(AVCodecContext *avctx) ...@@ -902,6 +937,10 @@ static av_cold int vaapi_encode_h265_close(AVCodecContext *avctx)
static const AVOption vaapi_encode_h265_options[] = { static const AVOption vaapi_encode_h265_options[] = {
{ "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)", { "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, 52, FLAGS }, OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, 52, FLAGS },
{ "aud", "Include AUD",
OFFSET(aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
{ NULL }, { NULL },
}; };
......
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