vaapi_h265: Add support for AUD NAL units
Matching the H.264 encoder.
This commit is contained in:
parent
ac12486714
commit
e3e8eab359
@ -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 {
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
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 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user