diff mbox

[FFmpeg-devel] lavc/vaapi_encode_h264: add option to insert AUD nal to AVC stream

Message ID 7fc4719e-8032-310d-afe8-4381010bc0d2@gmail.com
State New
Headers show

Commit Message

Jun Zhao May 2, 2017, 2:49 a.m. UTC
From e39078e9fe02c8d77c5e28436aef4d80a2d7b3a0 Mon Sep 17 00:00:00 2001
From: Jun Zhao <jun.zhao@intel.com>
Date: Tue, 2 May 2017 10:36:55 +0800
Subject: [PATCH] lavc/vaapi_encode_h264: add option to insert AUD nal to AVC
 stream.

Add aud option to support insert AUD nal in AVC stream. Default is
disable.

Signed-off-by: Jun Zhao <jun.zhao@intel.com>
Signed-off-by: Yi A Wang <yi.a.wang@intel.com>
---
 libavcodec/vaapi_encode.c      | 15 ++++++++++++++
 libavcodec/vaapi_encode.h      |  4 ++++
 libavcodec/vaapi_encode_h264.c | 45 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+)

Comments

Michael Niedermayer May 2, 2017, 2:08 p.m. UTC | #1
On Tue, May 02, 2017 at 10:49:50AM +0800, Jun Zhao wrote:
>  vaapi_encode.c      |   15 +++++++++++++++
>  vaapi_encode.h      |    4 ++++
>  vaapi_encode_h264.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 64 insertions(+)
> 32cb532f5b6e7a3237b3997a79a93bf54b02660f  0001-lavc-vaapi_encode_h264-add-option-to-insert-AUD-nal-.patch
> From e39078e9fe02c8d77c5e28436aef4d80a2d7b3a0 Mon Sep 17 00:00:00 2001
> From: Jun Zhao <jun.zhao@intel.com>
> Date: Tue, 2 May 2017 10:36:55 +0800
> Subject: [PATCH] lavc/vaapi_encode_h264: add option to insert AUD nal to AVC
>  stream.
> 
> Add aud option to support insert AUD nal in AVC stream. Default is
> disable.
> 
> Signed-off-by: Jun Zhao <jun.zhao@intel.com>
> Signed-off-by: Yi A Wang <yi.a.wang@intel.com>
> ---
>  libavcodec/vaapi_encode.c      | 15 ++++++++++++++
>  libavcodec/vaapi_encode.h      |  4 ++++
>  libavcodec/vaapi_encode_h264.c | 45 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 64 insertions(+)
> 
> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
> index 7e9c00f51d..77a10f98a7 100644
> --- a/libavcodec/vaapi_encode.c
> +++ b/libavcodec/vaapi_encode.c
> @@ -236,6 +236,21 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
>              goto fail;
>      }
>  
> +    if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA &&
> +        ctx->codec->write_aud_header) {
> +        bit_len = 8 * sizeof(data);
> +        err = ctx->codec->write_aud_header(avctx, pic, data, &bit_len);
> +        if (err < 0) {

> +            av_log(avctx, AV_LOG_ERROR, "Failed to write aud "
> +                   "header %d: %d.\n", err);

the %d(s) and the argument doesnt match up

[...]
Mark Thompson May 2, 2017, 8:23 p.m. UTC | #2
On 02/05/17 03:49, Jun Zhao wrote:
> From e39078e9fe02c8d77c5e28436aef4d80a2d7b3a0 Mon Sep 17 00:00:00 2001
> From: Jun Zhao <jun.zhao@intel.com>
> Date: Tue, 2 May 2017 10:36:55 +0800
> Subject: [PATCH] lavc/vaapi_encode_h264: add option to insert AUD nal to AVC
>  stream.
> 
> Add aud option to support insert AUD nal in AVC stream. Default is
> disable.
> 
> Signed-off-by: Jun Zhao <jun.zhao@intel.com>
> Signed-off-by: Yi A Wang <yi.a.wang@intel.com>
> ---
>  libavcodec/vaapi_encode.c      | 15 ++++++++++++++
>  libavcodec/vaapi_encode.h      |  4 ++++
>  libavcodec/vaapi_encode_h264.c | 45 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 64 insertions(+)

This puts the AUDs in the wrong place?

./ffmpeg_g -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i in.mp4 -an -c:v h264_vaapi -aud 1 -b 5M -maxrate 5M out.h264

IDR frame:

00000000  00 00 00 01 67 64 00 33  ac 2e c0 78 02 27 e5 c0  |....gd.3...x.'..|  <- SPS
00000010  44 00 00 03 00 04 00 00  03 01 e3 89 80 00 98 96  |D...............|
00000020  00 01 31 2c bd ce 01 e1  10 8a 70 00 00 00 01 68  |..1,......p....h|  <- PPS
00000030  ee 38 b0 00 00 00 01 06  00 07 80 83 d6 00 00 03  |.8..............|  <- SEI
00000040  00 40 01 04 00 00 03 00  02 05 79 59 94 8b 28 11  |.@........yY..(.|
00000050  ec 45 af 96 75 19 d4 1f  ea a9 4d 4c 61 76 63 35  |.E..u.....MLavc5|
00000060  37 2e 39 33 2e 31 30 30  20 2f 20 56 41 41 50 49  |7.93.100 / VAAPI|
00000070  20 30 2e 34 30 2e 30 20  2f 20 49 6e 74 65 6c 20  | 0.40.0 / Intel |
00000080  69 39 36 35 20 64 72 69  76 65 72 20 66 6f 72 20  |i965 driver for |
00000090  49 6e 74 65 6c 28 52 29  20 43 68 65 72 72 79 56  |Intel(R) CherryV|
000000a0  69 65 77 20 2d 20 31 2e  38 2e 32 2e 70 72 65 31  |iew - 1.8.2.pre1|
000000b0  20 28 31 2e 38 2e 31 2d  35 35 2d 67 39 39 36 65  | (1.8.1-55-g996e|
000000c0  63 65 64 29 80 00 00 00  01 09 10 00 00 00 01 65  |ced)...........e|  <- AUD, IDR slice
000000d0  b8 04 0f fe c5 c0 00 ce  c7 8f f2 87 2b 23 ba dd  |............+#..|
000000e0  b5 a3 38 20 c6 f1 d3 00  00 03 00 00 03 00 00 03  |..8 ............|
000000f0  00 00 03 00 00 12 8f f3  09 91 c0 00 00 03 00 05  |................|
00000100  14 00 00 03 02 26 00 00  03 01 37 00 00 03 00 d4  |.....&....7.....|
00000110  00 00 03 00 c9 00 00 03  00 e2 00 00 03 00 fe 00  |................|
00000120  00 03 01 32 00 00 03 02  1a 00 00 04 04 00 00 06  |...2............|
00000130  28 00 00 0e c0 00 00 03  00 00 03 00 00 03 00 00  |(...............|
00000140  03 00 00 03 00 00 03 00  00 03 00 00 03 00 00 03  |................|

Normal frame:

00000250  00 03 00 00 03 00 00 03  00 00 03 00 00 03 00 00  |................|
00000260  03 00 00 03 00 00 03 00  01 01 00 00 00 01 06 01  |................|  <- SEI
00000270  04 00 00 03 02 06 80 00  00 00 01 09 30 00 00 00  |............0...|  <- AUD
00000280  01 21 e0 26 3f 00 00 03  00 00 03 00 00 03 00 00  |.!.&?...........|  <- Non-IDR slice
00000290  03 00 00 03 00 00 03 00  00 03 00 00 03 00 00 03  |................|

(Braswell N3700, i965 driver from git as of an hour ago.)

> 
> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
> index 7e9c00f51d..77a10f98a7 100644
> --- a/libavcodec/vaapi_encode.c
> +++ b/libavcodec/vaapi_encode.c
> @@ -236,6 +236,21 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
>              goto fail;
>      }
>  
> +    if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA &&
> +        ctx->codec->write_aud_header) {
> +        bit_len = 8 * sizeof(data);
> +        err = ctx->codec->write_aud_header(avctx, pic, data, &bit_len);
> +        if (err < 0) {
> +            av_log(avctx, AV_LOG_ERROR, "Failed to write aud "
> +                   "header %d: %d.\n", err);
> +            goto fail;
> +        }
> +        err = vaapi_encode_make_packed_header(avctx, pic, VAEncPackedHeaderRawData,
> +                                              data, bit_len);
> +        if (err < 0)
> +            goto fail;
> +    }
> +
>      if (pic->type == PICTURE_TYPE_IDR) {
>          if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE &&
>              ctx->codec->write_sequence_header) {
> diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
> index 0edf27e4cb..09a5d87f7d 100644
> --- a/libavcodec/vaapi_encode.h
> +++ b/libavcodec/vaapi_encode.h
> @@ -267,6 +267,10 @@ typedef struct VAAPIEncodeType {
>                                   VAAPIEncodePicture *pic,
>                                   int index, int *type,
>                                   char *data, size_t *data_len);
> +     // Write an AU packed header, called by AVC encoder to insert AUD
> +     int    (*write_aud_header)(AVCodecContext *avctx,
> +                                VAAPIEncodePicture *pic,
> +                                char *data, size_t *data_len);
>  } VAAPIEncodeType;

You don't need a separate function - this is what write_extra_header is for.


> diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
> index 47d0c9496a..7fa9ca70e0 100644
> --- a/libavcodec/vaapi_encode_h264.c
> +++ b/libavcodec/vaapi_encode_h264.c
> @@ -168,6 +168,7 @@ typedef struct VAAPIEncodeH264Options {
>      int qp;
>      int quality;
>      int low_power;
> +    int aud;
>  } VAAPIEncodeH264Options;
>  
>  
> @@ -750,6 +751,41 @@ static int vaapi_encode_h264_write_slice_header(AVCodecContext *avctx,
>                                                          tmp, header_len);
>  }
>  
> +static int vaapi_encode_h264_write_aud_header(AVCodecContext *avctx,
> +                                              VAAPIEncodePicture *pic,
> +                                              char *data, size_t *data_len)
> +{
> +    VAAPIEncodeContext *ctx = avctx->priv_data;
> +    PutBitContext pbc;
> +    char tmp[256];
> +    size_t header_len;
> +    int primary_pic_type;
> +
> +    init_put_bits(&pbc, tmp, sizeof(tmp));
> +    vaapi_encode_h264_write_nal_header(&pbc, H264_NAL_AUD, 0);
> +    switch (pic->type) {
> +        case PICTURE_TYPE_IDR:
> +        case PICTURE_TYPE_I:
> +            primary_pic_type = 0;
> +            break;
> +        case PICTURE_TYPE_P:
> +            primary_pic_type = 1;
> +            break;
> +        case PICTURE_TYPE_B:
> +            primary_pic_type = 2;
> +            break;
> +        default:
> +            av_assert0(0 && "unknown pic type");
> +            break;
> +    }
> +    write_u(&pbc, 3, primary_pic_type, primary_pic_type);
> +    vaapi_encode_h264_write_trailing_rbsp(&pbc);
> +    header_len = put_bits_count(&pbc);
> +    flush_put_bits(&pbc);
> +    return ff_vaapi_encode_h26x_nal_unit_to_byte_stream(data, data_len,
> +                                                        tmp, header_len);
> +}

Mild preference for this being derived in init_picture_params rather than inside the writing function?

> +
>  static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
>                                                  VAAPIEncodePicture *pic,
>                                                  int index, int *type,
> @@ -1180,6 +1216,8 @@ static const VAAPIEncodeType vaapi_encode_type_h264 = {
>      .write_slice_header    = &vaapi_encode_h264_write_slice_header,
>  
>      .write_extra_header    = &vaapi_encode_h264_write_extra_header,
> +
> +    .write_aud_header      = &vaapi_encode_h264_write_aud_header,
>  };
>  
>  static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
> @@ -1265,6 +1303,11 @@ static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
>          VA_ENC_PACKED_HEADER_SLICE    | // Slice headers.
>          VA_ENC_PACKED_HEADER_MISC;      // SEI.
>  
> +    if (opt->aud == 1) {
> +        ctx->va_packed_headers |=
> +            VA_ENC_PACKED_HEADER_RAW_DATA;
> +    }
> +
>      ctx->surface_width  = FFALIGN(avctx->width,  16);
>      ctx->surface_height = FFALIGN(avctx->height, 16);
>  
> @@ -1282,6 +1325,8 @@ static const AVOption vaapi_encode_h264_options[] = {
>      { "low_power", "Use low-power encoding mode (experimental: only supported "
>        "on some platforms, does not support all features)",
>        OFFSET(low_power), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
> +    { "aud", "Use access unit delimiters",
> +      OFFSET(aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
>      { NULL },
>  };
>  
> -- 
> 2.11.0
>
Mark Thompson May 2, 2017, 8:49 p.m. UTC | #3
On 02/05/17 21:23, Mark Thompson wrote:
> On 02/05/17 03:49, Jun Zhao wrote:
>> From e39078e9fe02c8d77c5e28436aef4d80a2d7b3a0 Mon Sep 17 00:00:00 2001
>> From: Jun Zhao <jun.zhao@intel.com>
>> Date: Tue, 2 May 2017 10:36:55 +0800
>> Subject: [PATCH] lavc/vaapi_encode_h264: add option to insert AUD nal to AVC
>>  stream.
>>
>> Add aud option to support insert AUD nal in AVC stream. Default is
>> disable.
>>
>> Signed-off-by: Jun Zhao <jun.zhao@intel.com>
>> Signed-off-by: Yi A Wang <yi.a.wang@intel.com>
>> ---
>>  libavcodec/vaapi_encode.c      | 15 ++++++++++++++
>>  libavcodec/vaapi_encode.h      |  4 ++++
>>  libavcodec/vaapi_encode_h264.c | 45 ++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 64 insertions(+)
> 
> ...

I should probably also note that there are plans to replace all the raw bitstream writing code upstream, with common code shared with other cases (bitstream filters) rather than having it ad-hoc inside the individual VAAPI encode files.

<https://lists.libav.org/pipermail/libav-devel/2017-April/083452.html>  (As yet very incomplete, VAAPI not yet touched.)

- Mark
Jun Zhao May 3, 2017, 2:53 a.m. UTC | #4
On 2017/5/2 22:08, Michael Niedermayer wrote:
> On Tue, May 02, 2017 at 10:49:50AM +0800, Jun Zhao wrote:
>>  vaapi_encode.c      |   15 +++++++++++++++
>>  vaapi_encode.h      |    4 ++++
>>  vaapi_encode_h264.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 64 insertions(+)
>> 32cb532f5b6e7a3237b3997a79a93bf54b02660f  0001-lavc-vaapi_encode_h264-add-option-to-insert-AUD-nal-.patch
>> From e39078e9fe02c8d77c5e28436aef4d80a2d7b3a0 Mon Sep 17 00:00:00 2001
>> From: Jun Zhao <jun.zhao@intel.com>
>> Date: Tue, 2 May 2017 10:36:55 +0800
>> Subject: [PATCH] lavc/vaapi_encode_h264: add option to insert AUD nal to AVC
>>  stream.
>>
>> Add aud option to support insert AUD nal in AVC stream. Default is
>> disable.
>>
>> Signed-off-by: Jun Zhao <jun.zhao@intel.com>
>> Signed-off-by: Yi A Wang <yi.a.wang@intel.com>
>> ---
>>  libavcodec/vaapi_encode.c      | 15 ++++++++++++++
>>  libavcodec/vaapi_encode.h      |  4 ++++
>>  libavcodec/vaapi_encode_h264.c | 45 ++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 64 insertions(+)
>>
>> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
>> index 7e9c00f51d..77a10f98a7 100644
>> --- a/libavcodec/vaapi_encode.c
>> +++ b/libavcodec/vaapi_encode.c
>> @@ -236,6 +236,21 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
>>              goto fail;
>>      }
>>  
>> +    if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA &&
>> +        ctx->codec->write_aud_header) {
>> +        bit_len = 8 * sizeof(data);
>> +        err = ctx->codec->write_aud_header(avctx, pic, data, &bit_len);
>> +        if (err < 0) {
> 
>> +            av_log(avctx, AV_LOG_ERROR, "Failed to write aud "
>> +                   "header %d: %d.\n", err);
> 
> the %d(s) and the argument doesnt match up

will fix in the V2 patch, tks.

> 
> [...]
> 
> 
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
Jun Zhao May 3, 2017, 3:06 a.m. UTC | #5
On 2017/5/3 4:23, Mark Thompson wrote:
> On 02/05/17 03:49, Jun Zhao wrote:
>> From e39078e9fe02c8d77c5e28436aef4d80a2d7b3a0 Mon Sep 17 00:00:00 2001
>> From: Jun Zhao <jun.zhao@intel.com>
>> Date: Tue, 2 May 2017 10:36:55 +0800
>> Subject: [PATCH] lavc/vaapi_encode_h264: add option to insert AUD nal to AVC
>>  stream.
>>
>> Add aud option to support insert AUD nal in AVC stream. Default is
>> disable.
>>
>> Signed-off-by: Jun Zhao <jun.zhao@intel.com>
>> Signed-off-by: Yi A Wang <yi.a.wang@intel.com>
>> ---
>>  libavcodec/vaapi_encode.c      | 15 ++++++++++++++
>>  libavcodec/vaapi_encode.h      |  4 ++++
>>  libavcodec/vaapi_encode_h264.c | 45 ++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 64 insertions(+)
> 
> This puts the AUDs in the wrong place?
> 
> ./ffmpeg_g -y -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i in.mp4 -an -c:v h264_vaapi -aud 1 -b 5M -maxrate 5M out.h264
> 
> IDR frame:
> 
> 00000000  00 00 00 01 67 64 00 33  ac 2e c0 78 02 27 e5 c0  |....gd.3...x.'..|  <- SPS
> 00000010  44 00 00 03 00 04 00 00  03 01 e3 89 80 00 98 96  |D...............|
> 00000020  00 01 31 2c bd ce 01 e1  10 8a 70 00 00 00 01 68  |..1,......p....h|  <- PPS
> 00000030  ee 38 b0 00 00 00 01 06  00 07 80 83 d6 00 00 03  |.8..............|  <- SEI
> 00000040  00 40 01 04 00 00 03 00  02 05 79 59 94 8b 28 11  |.@........yY..(.|
> 00000050  ec 45 af 96 75 19 d4 1f  ea a9 4d 4c 61 76 63 35  |.E..u.....MLavc5|
> 00000060  37 2e 39 33 2e 31 30 30  20 2f 20 56 41 41 50 49  |7.93.100 / VAAPI|
> 00000070  20 30 2e 34 30 2e 30 20  2f 20 49 6e 74 65 6c 20  | 0.40.0 / Intel |
> 00000080  69 39 36 35 20 64 72 69  76 65 72 20 66 6f 72 20  |i965 driver for |
> 00000090  49 6e 74 65 6c 28 52 29  20 43 68 65 72 72 79 56  |Intel(R) CherryV|
> 000000a0  69 65 77 20 2d 20 31 2e  38 2e 32 2e 70 72 65 31  |iew - 1.8.2.pre1|
> 000000b0  20 28 31 2e 38 2e 31 2d  35 35 2d 67 39 39 36 65  | (1.8.1-55-g996e|
> 000000c0  63 65 64 29 80 00 00 00  01 09 10 00 00 00 01 65  |ced)...........e|  <- AUD, IDR slice
> 000000d0  b8 04 0f fe c5 c0 00 ce  c7 8f f2 87 2b 23 ba dd  |............+#..|
> 000000e0  b5 a3 38 20 c6 f1 d3 00  00 03 00 00 03 00 00 03  |..8 ............|
> 000000f0  00 00 03 00 00 12 8f f3  09 91 c0 00 00 03 00 05  |................|
> 00000100  14 00 00 03 02 26 00 00  03 01 37 00 00 03 00 d4  |.....&....7.....|
> 00000110  00 00 03 00 c9 00 00 03  00 e2 00 00 03 00 fe 00  |................|
> 00000120  00 03 01 32 00 00 03 02  1a 00 00 04 04 00 00 06  |...2............|
> 00000130  28 00 00 0e c0 00 00 03  00 00 03 00 00 03 00 00  |(...............|
> 00000140  03 00 00 03 00 00 03 00  00 03 00 00 03 00 00 03  |................|
> 
> Normal frame:
> 
> 00000250  00 03 00 00 03 00 00 03  00 00 03 00 00 03 00 00  |................|
> 00000260  03 00 00 03 00 00 03 00  01 01 00 00 00 01 06 01  |................|  <- SEI
> 00000270  04 00 00 03 02 06 80 00  00 00 01 09 30 00 00 00  |............0...|  <- AUD
> 00000280  01 21 e0 26 3f 00 00 03  00 00 03 00 00 03 00 00  |.!.&?...........|  <- Non-IDR slice
> 00000290  03 00 00 03 00 00 03 00  00 03 00 00 03 00 00 03  |................|
> 
> (Braswell N3700, i965 driver from git as of an hour ago.)

I have verified in Skylake, i965 driver fix this issue in GEN9 with the commit fd52137
in master branch, but don't fix in Braswell GEN8, open a issue to i965 driver
https://github.com/01org/intel-vaapi-driver/issues/155

> 
>>
>> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
>> index 7e9c00f51d..77a10f98a7 100644
>> --- a/libavcodec/vaapi_encode.c
>> +++ b/libavcodec/vaapi_encode.c
>> @@ -236,6 +236,21 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
>>              goto fail;
>>      }
>>  
>> +    if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA &&
>> +        ctx->codec->write_aud_header) {
>> +        bit_len = 8 * sizeof(data);
>> +        err = ctx->codec->write_aud_header(avctx, pic, data, &bit_len);
>> +        if (err < 0) {
>> +            av_log(avctx, AV_LOG_ERROR, "Failed to write aud "
>> +                   "header %d: %d.\n", err);
>> +            goto fail;
>> +        }
>> +        err = vaapi_encode_make_packed_header(avctx, pic, VAEncPackedHeaderRawData,
>> +                                              data, bit_len);
>> +        if (err < 0)
>> +            goto fail;
>> +    }
>> +
>>      if (pic->type == PICTURE_TYPE_IDR) {
>>          if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE &&
>>              ctx->codec->write_sequence_header) {
>> diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
>> index 0edf27e4cb..09a5d87f7d 100644
>> --- a/libavcodec/vaapi_encode.h
>> +++ b/libavcodec/vaapi_encode.h
>> @@ -267,6 +267,10 @@ typedef struct VAAPIEncodeType {
>>                                   VAAPIEncodePicture *pic,
>>                                   int index, int *type,
>>                                   char *data, size_t *data_len);
>> +     // Write an AU packed header, called by AVC encoder to insert AUD
>> +     int    (*write_aud_header)(AVCodecContext *avctx,
>> +                                VAAPIEncodePicture *pic,
>> +                                char *data, size_t *data_len);
>>  } VAAPIEncodeType;
> 
> You don't need a separate function - this is what write_extra_header is for.
> 
> 
>> diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
>> index 47d0c9496a..7fa9ca70e0 100644
>> --- a/libavcodec/vaapi_encode_h264.c
>> +++ b/libavcodec/vaapi_encode_h264.c
>> @@ -168,6 +168,7 @@ typedef struct VAAPIEncodeH264Options {
>>      int qp;
>>      int quality;
>>      int low_power;
>> +    int aud;
>>  } VAAPIEncodeH264Options;
>>  
>>  
>> @@ -750,6 +751,41 @@ static int vaapi_encode_h264_write_slice_header(AVCodecContext *avctx,
>>                                                          tmp, header_len);
>>  }
>>  
>> +static int vaapi_encode_h264_write_aud_header(AVCodecContext *avctx,
>> +                                              VAAPIEncodePicture *pic,
>> +                                              char *data, size_t *data_len)
>> +{
>> +    VAAPIEncodeContext *ctx = avctx->priv_data;
>> +    PutBitContext pbc;
>> +    char tmp[256];
>> +    size_t header_len;
>> +    int primary_pic_type;
>> +
>> +    init_put_bits(&pbc, tmp, sizeof(tmp));
>> +    vaapi_encode_h264_write_nal_header(&pbc, H264_NAL_AUD, 0);
>> +    switch (pic->type) {
>> +        case PICTURE_TYPE_IDR:
>> +        case PICTURE_TYPE_I:
>> +            primary_pic_type = 0;
>> +            break;
>> +        case PICTURE_TYPE_P:
>> +            primary_pic_type = 1;
>> +            break;
>> +        case PICTURE_TYPE_B:
>> +            primary_pic_type = 2;
>> +            break;
>> +        default:
>> +            av_assert0(0 && "unknown pic type");
>> +            break;
>> +    }
>> +    write_u(&pbc, 3, primary_pic_type, primary_pic_type);
>> +    vaapi_encode_h264_write_trailing_rbsp(&pbc);
>> +    header_len = put_bits_count(&pbc);
>> +    flush_put_bits(&pbc);
>> +    return ff_vaapi_encode_h26x_nal_unit_to_byte_stream(data, data_len,
>> +                                                        tmp, header_len);
>> +}
> 
> Mild preference for this being derived in init_picture_params rather than inside the writing function?

I can change it with this way, but I don't think this way have more benefit. BTW, we also need to 
support insert AUD in HEVC encoder.

> 
>> +
>>  static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
>>                                                  VAAPIEncodePicture *pic,
>>                                                  int index, int *type,
>> @@ -1180,6 +1216,8 @@ static const VAAPIEncodeType vaapi_encode_type_h264 = {
>>      .write_slice_header    = &vaapi_encode_h264_write_slice_header,
>>  
>>      .write_extra_header    = &vaapi_encode_h264_write_extra_header,
>> +
>> +    .write_aud_header      = &vaapi_encode_h264_write_aud_header,
>>  };
>>  
>>  static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
>> @@ -1265,6 +1303,11 @@ static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
>>          VA_ENC_PACKED_HEADER_SLICE    | // Slice headers.
>>          VA_ENC_PACKED_HEADER_MISC;      // SEI.
>>  
>> +    if (opt->aud == 1) {
>> +        ctx->va_packed_headers |=
>> +            VA_ENC_PACKED_HEADER_RAW_DATA;
>> +    }
>> +
>>      ctx->surface_width  = FFALIGN(avctx->width,  16);
>>      ctx->surface_height = FFALIGN(avctx->height, 16);
>>  
>> @@ -1282,6 +1325,8 @@ static const AVOption vaapi_encode_h264_options[] = {
>>      { "low_power", "Use low-power encoding mode (experimental: only supported "
>>        "on some platforms, does not support all features)",
>>        OFFSET(low_power), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
>> +    { "aud", "Use access unit delimiters",
>> +      OFFSET(aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
>>      { NULL },
>>  };
>>  
>> -- 
>> 2.11.0
>>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
diff mbox

Patch

diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index 7e9c00f51d..77a10f98a7 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -236,6 +236,21 @@  static int vaapi_encode_issue(AVCodecContext *avctx,
             goto fail;
     }
 
+    if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_RAW_DATA &&
+        ctx->codec->write_aud_header) {
+        bit_len = 8 * sizeof(data);
+        err = ctx->codec->write_aud_header(avctx, pic, data, &bit_len);
+        if (err < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to write aud "
+                   "header %d: %d.\n", err);
+            goto fail;
+        }
+        err = vaapi_encode_make_packed_header(avctx, pic, VAEncPackedHeaderRawData,
+                                              data, bit_len);
+        if (err < 0)
+            goto fail;
+    }
+
     if (pic->type == PICTURE_TYPE_IDR) {
         if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE &&
             ctx->codec->write_sequence_header) {
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
index 0edf27e4cb..09a5d87f7d 100644
--- a/libavcodec/vaapi_encode.h
+++ b/libavcodec/vaapi_encode.h
@@ -267,6 +267,10 @@  typedef struct VAAPIEncodeType {
                                  VAAPIEncodePicture *pic,
                                  int index, int *type,
                                  char *data, size_t *data_len);
+     // Write an AU packed header, called by AVC encoder to insert AUD
+     int    (*write_aud_header)(AVCodecContext *avctx,
+                                VAAPIEncodePicture *pic,
+                                char *data, size_t *data_len);
 } VAAPIEncodeType;
 
 
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 47d0c9496a..7fa9ca70e0 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -168,6 +168,7 @@  typedef struct VAAPIEncodeH264Options {
     int qp;
     int quality;
     int low_power;
+    int aud;
 } VAAPIEncodeH264Options;
 
 
@@ -750,6 +751,41 @@  static int vaapi_encode_h264_write_slice_header(AVCodecContext *avctx,
                                                         tmp, header_len);
 }
 
+static int vaapi_encode_h264_write_aud_header(AVCodecContext *avctx,
+                                              VAAPIEncodePicture *pic,
+                                              char *data, size_t *data_len)
+{
+    VAAPIEncodeContext *ctx = avctx->priv_data;
+    PutBitContext pbc;
+    char tmp[256];
+    size_t header_len;
+    int primary_pic_type;
+
+    init_put_bits(&pbc, tmp, sizeof(tmp));
+    vaapi_encode_h264_write_nal_header(&pbc, H264_NAL_AUD, 0);
+    switch (pic->type) {
+        case PICTURE_TYPE_IDR:
+        case PICTURE_TYPE_I:
+            primary_pic_type = 0;
+            break;
+        case PICTURE_TYPE_P:
+            primary_pic_type = 1;
+            break;
+        case PICTURE_TYPE_B:
+            primary_pic_type = 2;
+            break;
+        default:
+            av_assert0(0 && "unknown pic type");
+            break;
+    }
+    write_u(&pbc, 3, primary_pic_type, primary_pic_type);
+    vaapi_encode_h264_write_trailing_rbsp(&pbc);
+    header_len = put_bits_count(&pbc);
+    flush_put_bits(&pbc);
+    return ff_vaapi_encode_h26x_nal_unit_to_byte_stream(data, data_len,
+                                                        tmp, header_len);
+}
+
 static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
                                                 VAAPIEncodePicture *pic,
                                                 int index, int *type,
@@ -1180,6 +1216,8 @@  static const VAAPIEncodeType vaapi_encode_type_h264 = {
     .write_slice_header    = &vaapi_encode_h264_write_slice_header,
 
     .write_extra_header    = &vaapi_encode_h264_write_extra_header,
+
+    .write_aud_header      = &vaapi_encode_h264_write_aud_header,
 };
 
 static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
@@ -1265,6 +1303,11 @@  static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
         VA_ENC_PACKED_HEADER_SLICE    | // Slice headers.
         VA_ENC_PACKED_HEADER_MISC;      // SEI.
 
+    if (opt->aud == 1) {
+        ctx->va_packed_headers |=
+            VA_ENC_PACKED_HEADER_RAW_DATA;
+    }
+
     ctx->surface_width  = FFALIGN(avctx->width,  16);
     ctx->surface_height = FFALIGN(avctx->height, 16);
 
@@ -1282,6 +1325,8 @@  static const AVOption vaapi_encode_h264_options[] = {
     { "low_power", "Use low-power encoding mode (experimental: only supported "
       "on some platforms, does not support all features)",
       OFFSET(low_power), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
+    { "aud", "Use access unit delimiters",
+      OFFSET(aud), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
     { NULL },
 };