[FFmpeg-devel] [PATCH v3] avcodec/hevcdec: dynamic allocate sList and HEVClcList

Nuo Mi nuomi2021 at gmail.com
Sun Nov 29 17:39:05 EET 2020


tested with:
make fate-hevc THREADS=17 THREAD_TYPE=slice
make fate-hevc THREADS=17 THREAD_TYPE=frame

On Sun, Nov 29, 2020 at 11:30 PM Nuo Mi <nuomi2021 at gmail.com> wrote:

> 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;
> --
> 2.25.1
>
>


More information about the ffmpeg-devel mailing list