From patchwork Wed May 29 20:57:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fu, Linjie" X-Patchwork-Id: 13323 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3BF134473FD for ; Wed, 29 May 2019 11:58:44 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1F0CD68A451; Wed, 29 May 2019 11:58:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 833F768A3EC for ; Wed, 29 May 2019 11:58:37 +0300 (EEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 May 2019 01:58:35 -0700 X-ExtLoop1: 1 Received: from icl-dev.sh.intel.com ([10.239.158.85]) by orsmga007.jf.intel.com with ESMTP; 29 May 2019 01:58:34 -0700 From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Wed, 29 May 2019 16:57:03 -0400 Message-Id: <1559163423-22745-1-git-send-email-linjie.fu@intel.com> X-Mailer: git-send-email 2.7.4 Subject: [FFmpeg-devel] [PATCH] lavc/vaapi_encode: grow packet if vaMapBuffer returns multiple buffers 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 Cc: Linjie Fu MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" It seems that VA_CODED_BUF_STATUS_SINGLE_NALU allows driver to map buffer for each slice. Currently, assigning new buffer for pkt when multiple buffer returns from vaMapBuffer will cover the previous encoded pkt data and lead to encode issues. Using av_grow_packet to expand pkt if several buffers are returned. Signed-off-by: Linjie Fu --- libavcodec/vaapi_encode.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 2dda451..2812237 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -490,6 +490,7 @@ static int vaapi_encode_output(AVCodecContext *avctx, VACodedBufferSegment *buf_list, *buf; VAStatus vas; int err; + uint8_t *ptr; err = vaapi_encode_wait(avctx, pic); if (err < 0) @@ -509,11 +510,18 @@ static int vaapi_encode_output(AVCodecContext *avctx, av_log(avctx, AV_LOG_DEBUG, "Output buffer: %u bytes " "(status %08x).\n", buf->size, buf->status); - err = av_new_packet(pkt, buf->size); + if (pkt->size) + err = av_grow_packet(pkt, buf->size); + else { + err = av_new_packet(pkt, buf->size); + ptr = pkt->data; + } + if (err < 0) goto fail_mapped; - memcpy(pkt->data, buf->buf, buf->size); + memcpy(ptr, buf->buf, buf->size); + ptr += buf->size; } if (pic->type == PICTURE_TYPE_IDR)