From patchwork Wed Nov 14 21:54:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 11027 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 2275044CE49 for ; Wed, 14 Nov 2018 23:54:28 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EDD02688359; Wed, 14 Nov 2018 23:53:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BAE6B687EC0 for ; Wed, 14 Nov 2018 23:53:43 +0200 (EET) Received: by mail-wm1-f68.google.com with SMTP id s11so6795236wmh.1 for ; Wed, 14 Nov 2018 13:54:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=to:from:subject:message-id:date:user-agent:mime-version :content-language:content-transfer-encoding; bh=nEBYoVW8MtgNDg8CvYehO+CnBmua3Or2sWADxsDDFOA=; b=hLahZpR8ddSyfHrnp51klbHLOZc7eKTcVYkarRSuDYdDYdmwkrU3AkdxpR7ftt/a0k g6zzAi9ydBc/UQjA/uk5AzBV6E8bIhypZ7sKf7PqoTf8VIZJDOx8QL4XBxhK63d7Pl+y pn8vw6iNbSRy/SJkdi1dg8Ev+qB4uYgbWIRJgISse9SOcNkdzHYqusFig9AwTRFwU9Be ITURus92Ebn+r48wf+iFeOGAMEpJufNNYXUIMvX8JlMIs+T99gBRDxuKobcmxipOSDFp F/y+WTNt6S3CBVwOTkmkDQ9r7DYkj0xo2juem6UUO+wF0bYi5rLCPQz/G9pnYn4sSo1H C8nA== 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:content-transfer-encoding; bh=nEBYoVW8MtgNDg8CvYehO+CnBmua3Or2sWADxsDDFOA=; b=rU9YNo7n1Dk4EsOD5Jy2/Nj1do1jQSzeVEDaepeTGnadbCSo67+HxfDm3MnkbPExMG rUcbIMssuhYhpg+gyMLU6lmbJCv6jH5n4ByAP7+HryMkbWKdS86ZuMoZW9F95HEWL3JN 6w0zEx3UqbQq779CwRWcc32Gh7UAVfiMwGzLU5S8RHsLNLMj4J7g0JS6Dy73Rsx9GG84 DYHGIWrLnXIX1DNEl6fvOOS9QnvpEFkc/aSqjOh7SFMs9roJhq0RQVKssi/idHd1K3Ca 4SKBEmUyYY4GxSY9G3prIcdU88TL2BI2rtJdslZy1WyXTaTcUAG8+T7cenvOecaQSZQv 9TiA== X-Gm-Message-State: AGRZ1gIfQbzwCSl8V+xPtLp100x+BiZauAXV1HN/KCHCjeGerLKJDht0 5VTfgSZI2X+uOau2JTMG9870EQn2hGI= X-Google-Smtp-Source: AJdET5cz/aN30qyaAPADN3OCwj1ctriQKIO3E5wt/kem9lT9jJb2Mv76Ee+N+PnwUoc0/jZFIUNfHQ== X-Received: by 2002:a1c:e402:: with SMTP id b2-v6mr3344972wmh.12.1542232460987; Wed, 14 Nov 2018 13:54:20 -0800 (PST) Received: from [192.168.0.4] (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id e10-v6sm23601626wmg.23.2018.11.14.13.54.20 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 14 Nov 2018 13:54:20 -0800 (PST) To: FFmpeg development discussions and patches From: Mark Thompson Message-ID: <1d039a52-ae08-10af-95cb-860d05747170@jkqxz.net> Date: Wed, 14 Nov 2018 21:54:19 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] [PATCH] hevcdec: Fix get_format behaviour when the user declines to pick a format 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" Maintain the context pixfmt as NONE in this case, indicating that if the user requests more decoding then get_format() will need to be called again. Also remove the pixfmt setting from inside set_sps() and make it explicit, so that the behaviour is clearer. --- libavcodec/hevcdec.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index a3b5c8cb71..dca478db6c 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -421,8 +421,7 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) return ff_thread_get_format(s->avctx, pix_fmts); } -static int set_sps(HEVCContext *s, const HEVCSPS *sps, - enum AVPixelFormat pix_fmt) +static int set_sps(HEVCContext *s, const HEVCSPS *sps) { int ret, i; @@ -439,8 +438,6 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps, export_stream_params(s->avctx, &s->ps, sps); - s->avctx->pix_fmt = pix_fmt; - ff_hevc_pred_init(&s->hpc, sps->bit_depth); ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth); ff_videodsp_init (&s->vdsp, sps->bit_depth); @@ -512,7 +509,6 @@ static int hls_slice_header(HEVCContext *s) if (s->ps.sps != (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data) { const HEVCSPS *sps = (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data; const HEVCSPS *last_sps = s->ps.sps; - enum AVPixelFormat pix_fmt; if (last_sps && IS_IRAP(s) && s->nal_unit_type != HEVC_NAL_CRA_NUT) { if (sps->width != last_sps->width || sps->height != last_sps->height || @@ -522,17 +518,25 @@ static int hls_slice_header(HEVCContext *s) } ff_hevc_clear_refs(s); - ret = set_sps(s, sps, sps->pix_fmt); + ret = set_sps(s, sps); if (ret < 0) return ret; + s->seq_decode = (s->seq_decode + 1) & 0xff; + s->max_ra = INT_MAX; + + s->avctx->pix_fmt = AV_PIX_FMT_NONE; + } + + if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) { + const HEVCSPS *sps = (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data; + enum AVPixelFormat pix_fmt; + pix_fmt = get_format(s, sps); if (pix_fmt < 0) - return pix_fmt; - s->avctx->pix_fmt = pix_fmt; + return AVERROR(EINVAL); - s->seq_decode = (s->seq_decode + 1) & 0xff; - s->max_ra = INT_MAX; + s->avctx->pix_fmt = pix_fmt; } sh->dependent_slice_segment_flag = 0; @@ -3411,9 +3415,11 @@ static int hevc_update_thread_context(AVCodecContext *dst, } if (s->ps.sps != s0->ps.sps) - if ((ret = set_sps(s, s0->ps.sps, src->pix_fmt)) < 0) + if ((ret = set_sps(s, s0->ps.sps)) < 0) return ret; + dst->pix_fmt = src->pix_fmt; + s->seq_decode = s0->seq_decode; s->seq_output = s0->seq_output; s->pocTid0 = s0->pocTid0;