diff options
author | Mark Thompson <sw@jkqxz.net> | 2017-05-07 22:58:56 +0100 |
---|---|---|
committer | Mark Thompson <sw@jkqxz.net> | 2017-10-17 20:56:30 +0100 |
commit | 281b68b0265953ab2623a39484d927a0e921c405 (patch) | |
tree | 77eb447519bf6ddd84e885eef424d481133ebc18 /libavcodec | |
parent | 2e29ca2a9f19ba9a5b189f322f38497d2e2e3db0 (diff) | |
download | ffmpeg-281b68b0265953ab2623a39484d927a0e921c405.tar.gz |
vaapi_h264: Add support for AUD NAL units
Adds a new private option to enable them (off by default).
(cherry picked from commit 820a4483af13cf6fd51f13638e57bcd1c3f629d4)
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/vaapi_encode_h264.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c index 9a8019aa7b..b147457b75 100644 --- a/libavcodec/vaapi_encode_h264.c +++ b/libavcodec/vaapi_encode_h264.c @@ -53,6 +53,7 @@ typedef struct VAAPIEncodeH264Context { int fixed_qp_p; int fixed_qp_b; + H264RawAUD aud; H264RawSPS sps; H264RawPPS pps; H264RawSEI sei; @@ -77,6 +78,7 @@ typedef struct VAAPIEncodeH264Context { CodedBitstreamContext *cbc; CodedBitstreamFragment current_access_unit; + int aud_needed; int sei_needed; } VAAPIEncodeH264Context; @@ -86,6 +88,7 @@ typedef struct VAAPIEncodeH264Options { int low_power; // Entropy encoder type. int coder; + int aud; int sei; } VAAPIEncodeH264Options; @@ -145,6 +148,13 @@ static int vaapi_encode_h264_write_sequence_header(AVCodecContext *avctx, CodedBitstreamFragment *au = &priv->current_access_unit; int err; + if (priv->aud_needed) { + err = vaapi_encode_h264_add_nal(avctx, au, &priv->aud); + if (err < 0) + goto fail; + priv->aud_needed = 0; + } + err = vaapi_encode_h264_add_nal(avctx, au, &priv->sps); if (err < 0) goto fail; @@ -169,6 +179,13 @@ static int vaapi_encode_h264_write_slice_header(AVCodecContext *avctx, CodedBitstreamFragment *au = &priv->current_access_unit; int err; + if (priv->aud_needed) { + err = vaapi_encode_h264_add_nal(avctx, au, &priv->aud); + if (err < 0) + goto fail; + priv->aud_needed = 0; + } + err = vaapi_encode_h264_add_nal(avctx, au, &priv->slice); if (err < 0) goto fail; @@ -191,6 +208,11 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx, int err, i; if (priv->sei_needed) { + if (priv->aud_needed) { + vaapi_encode_h264_add_nal(avctx, au, &priv->aud); + priv->aud_needed = 0; + } + memset(&priv->sei, 0, sizeof(priv->sei)); priv->sei.nal_unit_header.nal_unit_type = H264_NAL_SEI; @@ -573,6 +595,14 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, priv->pic_order_cnt = pic->display_order - priv->last_idr_frame; priv->dpb_delay = pic->display_order - pic->encode_order + 1; + if (opt->aud) { + priv->aud_needed = 1; + priv->aud.nal_unit_header.nal_unit_type = H264_NAL_AUD; + priv->aud.primary_pic_type = priv->primary_pic_type; + } else { + priv->aud_needed = 0; + } + if (opt->sei & SEI_IDENTIFIER && pic->encode_order == 0) priv->sei_needed = 1; @@ -931,6 +961,9 @@ static const AVOption vaapi_encode_h264_options[] = { { "vlc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS, "coder" }, { "ac", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN, INT_MAX, FLAGS, "coder" }, + { "aud", "Include AUD", + OFFSET(aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS }, + { "sei", "Set SEI to include", OFFSET(sei), AV_OPT_TYPE_FLAGS, { .i64 = SEI_IDENTIFIER | SEI_TIMING }, |