From patchwork Tue May 2 02:49:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 3544 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.3.129 with SMTP id 123csp1676463vsd; Mon, 1 May 2017 19:50:07 -0700 (PDT) X-Received: by 10.28.111.134 with SMTP id c6mr553827wmi.128.1493693407143; Mon, 01 May 2017 19:50:07 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d29si16955898wrb.156.2017.05.01.19.50.06; Mon, 01 May 2017 19:50:07 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B157968975F; Tue, 2 May 2017 05:49:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f53.google.com (mail-pg0-f53.google.com [74.125.83.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 012E068829C for ; Tue, 2 May 2017 05:49:52 +0300 (EEST) Received: by mail-pg0-f53.google.com with SMTP id v1so53410629pgv.1 for ; Mon, 01 May 2017 19:49:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=Mez3Vop4ir2jG7A21MJWgOZ7y01D/eojw4I2wiRuSs4=; b=uW0fUhVRqdK5xnAx/OT6/chYT61WqtpgPp7FgIz8eiuRoA27e6DQ6QMth4x/yhqLp/ dYZ9o3yPA0AivdNsAf2GHbzl5GZmiQhalwl8VXs3lrY0mbGMv6lUfw164DIYCxvDMTTs H0xnPQvQjijptjfzj2QZhPVEO70W45FWJjR4gPNxr3+rWg0OvDaEPkb57ocvVB3rkZr6 kLd6KDvLXJN6wnrGpTC7pDcGmPjwcJV57GDchsV9CTsgvEl7O+tBUHVOsL/WjntfYfwc BkLqffMfxzRgQawRRcr9b/iWYeytyNI4HCM9EjFqMduRk2jHzG5CXYDvQJyKatBvHdDL mAmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language; bh=Mez3Vop4ir2jG7A21MJWgOZ7y01D/eojw4I2wiRuSs4=; b=uSYcy1hqZ8HeJIcSqtWVs8U6RD0o8v/gZ6a3U3voHp1kURswn6T28+/be+i0FQKh0q pHmbGViVeP/JrLjUq38cLZ9V7Rl7Ix55Ihc6wxFhswGpkmbuTcfPG0LHnt3Rq9w2jFll NTJ1/LqxYg7bFRaBdkduNJGBoQmLyUGcoG9DCL10DD1atH8fmb8GTObYGujBFgti1LDR Qx1GQOXlwV2xNtlxABkMVgMabEWkU7IgBpqCQdzui+xFK2hVfHd6K9fjwjFDmKbSz1SY NCsz57ubhehh1J4hhvkx1OAUDVlmuoSqzteZ+bLPn16xXCWEjW83bGTw632ix+LKSH68 nRxQ== X-Gm-Message-State: AN3rC/6LyGABpag/nixhjZ8Eeu6S1dn7RbGGif4jc0CooFMTgBP6IAW4 ve6/4b7uD/Z4Fw== X-Received: by 10.98.1.22 with SMTP id 22mr29727602pfb.263.1493693395145; Mon, 01 May 2017 19:49:55 -0700 (PDT) Received: from [10.239.205.153] (fmdmzpr01-ext.fm.intel.com. [192.55.54.36]) by smtp.gmail.com with ESMTPSA id a184sm31168040pfb.118.2017.05.01.19.49.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 May 2017 19:49:54 -0700 (PDT) To: Mark Thompson , FFmpeg development discussions and patches From: Jun Zhao Message-ID: <7fc4719e-8032-310d-afe8-4381010bc0d2@gmail.com> Date: Tue, 2 May 2017 10:49:50 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0 MIME-Version: 1.0 Content-Language: en-US Content-Disposition: attachment; filename*0="0001-lavc-vaapi_encode_h264-add-option-to-insert-AUD-nal-.pa"; filename*1="tch" X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] [PATCH] lavc/vaapi_encode_h264: add option to insert AUD nal to AVC stream X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From e39078e9fe02c8d77c5e28436aef4d80a2d7b3a0 Mon Sep 17 00:00:00 2001 From: Jun Zhao 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 Signed-off-by: Yi A Wang --- 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); + 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 }, };