Message ID | 7fc4719e-8032-310d-afe8-4381010bc0d2@gmail.com |
---|---|
State | New |
Headers | show |
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 [...]
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 >
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
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 >
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 --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 }, };