From patchwork Sun Nov 29 15:30:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nuo Mi X-Patchwork-Id: 24147 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 5C5E444ABF6 for ; Sun, 29 Nov 2020 17:30:49 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 41BD56881BA; Sun, 29 Nov 2020 17:30:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f195.google.com (mail-pg1-f195.google.com [209.85.215.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1F31688131 for ; Sun, 29 Nov 2020 17:30:42 +0200 (EET) Received: by mail-pg1-f195.google.com with SMTP id k11so8378483pgq.2 for ; Sun, 29 Nov 2020 07:30:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=64VNCJkjdhGX8sOYsmpPMk8ncAEE8a8HZza0zoS/F40=; b=LjZB6zAaqsrS5gjynBdKHXNy6IxU7bZMFBBmBKMnYOmdjYbnNhPcjPN7IiOs8RuiLh mH869QWszhe5jmUbS3u5oXpYq7PMuOKoqC/L9XWAu+DxWc4KRS4VAa/k362kBVmcGt9A gxsplvy8UvGMPoCJTKBYEMVAANg7gVwQdKIFaR88AM09lC9FYqdguEheTzQFfZFSGIAy RqNMK9H2wBbNNRpCg/ljRFszI46xB+fy3d9vzY/Mp9pD5JOODZwMBxaxxlhG5KZ4GHFY Ci0tv0o86hf78HAWMVwUmFKgOrFlkXEavkyVWPFBbY0LegSlIQWThAfhlRUH2EvcU6T+ ElLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=64VNCJkjdhGX8sOYsmpPMk8ncAEE8a8HZza0zoS/F40=; b=Ex2mbRh9cEFlkf6Yxzq47NCmxWImTqt+Tu2fqDonNtiXntnGeKRO0avQkCoQifru+Z aJjcvp03VyWi7QGEDXMZoKePWkE+5s38JZcx3/E3SJ6cGPtw+gL1MEO6TyxIngWAMG/7 28eJ7ojVvStIr452wUf20uQx28nyZMBK5v9Qr0zP1a1/4jof5NcbWR2+rEj5eQvgGBH/ OG5E/dBjSz16JYL12sI4H2RySD2UU9iVi4YNMtu50D8BS0X/bhkyyLdN6sEC5+qQGgo/ bvtyeCnOHn8TzuOnwJ2qel1t/8cF8HhZNd2Eqh2bCf0cdQB4Q9h48L4XO4YskD3+F0E7 S/gw== X-Gm-Message-State: AOAM533qdIDL1+d7ZPaevuWEyJBlm9sFaAkyab73q2qAlV/RKFYoDUmN QvqUEPxnPW79Fu/02pY0g6BUvVVLeTc= X-Google-Smtp-Source: ABdhPJxrCKUasASm5uaqTJdFXHKfaZSXkoa3DsytolZxPOSyR+X7093VEsBNhr6yaEoijZMz9dbXoQ== X-Received: by 2002:a17:90b:1888:: with SMTP id mn8mr22358647pjb.158.1606663840797; Sun, 29 Nov 2020 07:30:40 -0800 (PST) Received: from Guangxin-PC.localdomain (23.83.245.51.16clouds.com. [23.83.245.51]) by smtp.gmail.com with ESMTPSA id jz7sm12707751pjb.14.2020.11.29.07.30.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Nov 2020 07:30:40 -0800 (PST) From: Nuo Mi To: ffmpeg-devel@ffmpeg.org Date: Sun, 29 Nov 2020 23:30:10 +0800 Message-Id: <20201129153010.32484-1-nuomi2021@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3] avcodec/hevcdec: dynamic allocate sList and HEVClcList 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: Nuo Mi , cus@passwd.hu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" following comandline will crash the ffmpeg ffmpeg -threads 17 -thread_type slice -i WPP_A_ericsson_MAIN_2.bit out.yuv -y the HEVCContext->sList size is MAX_NB_THREADS(16), any > 16 thread number will crash the application --- libavcodec/hevcdec.c | 26 +++++++++++++++----------- libavcodec/hevcdec.h | 5 ++--- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 699c13bbcc..616372dfed 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -3416,6 +3416,8 @@ static av_cold int hevc_decode_free(AVCodecContext *avctx) if (s->HEVClc == s->HEVClcList[0]) s->HEVClc = NULL; av_freep(&s->HEVClcList[0]); + av_freep(&s->HEVClcList); + av_freep(&s->sList); ff_h2645_packet_uninit(&s->pkt); @@ -3432,7 +3434,9 @@ static av_cold int hevc_init_context(AVCodecContext *avctx) s->avctx = avctx; s->HEVClc = av_mallocz(sizeof(HEVCLocalContext)); - if (!s->HEVClc) + s->HEVClcList = av_mallocz(sizeof(HEVCLocalContext*) * s->threads_number); + s->sList = av_mallocz(sizeof(HEVCContext*) * s->threads_number); + if (!s->HEVClc || !s->HEVClcList || !s->sList) goto fail; s->HEVClcList[0] = s->HEVClc; s->sList[0] = s; @@ -3579,6 +3583,16 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) HEVCContext *s = avctx->priv_data; int ret; + if(avctx->active_thread_type & FF_THREAD_SLICE) + s->threads_number = avctx->thread_count; + else + s->threads_number = 1; + + if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1) + s->threads_type = FF_THREAD_FRAME; + else + s->threads_type = FF_THREAD_SLICE; + ret = hevc_init_context(avctx); if (ret < 0) return ret; @@ -3589,11 +3603,6 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) atomic_init(&s->wpp_err, 0); - if(avctx->active_thread_type & FF_THREAD_SLICE) - s->threads_number = avctx->thread_count; - else - s->threads_number = 1; - if (!avctx->internal->is_copy) { if (avctx->extradata_size > 0 && avctx->extradata) { ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1); @@ -3604,11 +3613,6 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) } } - if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1) - s->threads_type = FF_THREAD_FRAME; - else - s->threads_type = FF_THREAD_SLICE; - return 0; } diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h index 39c5c7f89f..c0a138e97a 100644 --- a/libavcodec/hevcdec.h +++ b/libavcodec/hevcdec.h @@ -42,7 +42,6 @@ #include "thread.h" #include "videodsp.h" -#define MAX_NB_THREADS 16 #define SHIFT_CTB_WPP 2 //TODO: check if this is really the maximum @@ -468,9 +467,9 @@ typedef struct HEVCContext { const AVClass *c; // needed by private avoptions AVCodecContext *avctx; - struct HEVCContext *sList[MAX_NB_THREADS]; + struct HEVCContext **sList; - HEVCLocalContext *HEVClcList[MAX_NB_THREADS]; + HEVCLocalContext **HEVClcList; HEVCLocalContext *HEVClc; uint8_t threads_type;