From patchwork Mon Sep 14 16:37:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Kunhya X-Patchwork-Id: 22380 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 BE5B8443BFE for ; Mon, 14 Sep 2020 19:38:08 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 966ED68BB73; Mon, 14 Sep 2020 19:38:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f174.google.com (mail-oi1-f174.google.com [209.85.167.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C6C3A68BA8F for ; Mon, 14 Sep 2020 19:38:01 +0300 (EEST) Received: by mail-oi1-f174.google.com with SMTP id x19so551141oix.3 for ; Mon, 14 Sep 2020 09:38:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=obe-tv.20150623.gappssmtp.com; s=20150623; h=mime-version:from:date:message-id:subject:to; bh=pPqsSMpLJqR21gjBOT8FfQlmJ4417gOnUUNy5A/0FsE=; b=njPPZLH3y5Hj0lAEwg3JPhPyCyVBds+5clBPu5j71VXjF923KSS4ZrWutkoikBlEmd sAAkMkfuwJNezMKG6m+GLqRpijVMg6AnAP1dJJllscJZBfqx6lxRzWit2l0+u4pUwkh1 9qlgFrtVwrzJAt+xe8GGzFPCqn7kpSrnE5Riutdqd+cNi9C0eP8uOP9L/P0J48QMAyUN ObC8wfqooqjRjHSUxNozyqcT9Fq/8HvB+jtBw2sTLwIHj3wksTVH2GGADLZpmkZknWSY kRxdEcnruWVtpW6/ZuvWQmtEAWkDixtVVyNxv8SMsq84PI6Gn/3pqWqIoCUtJuCRDFC1 Z43A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=pPqsSMpLJqR21gjBOT8FfQlmJ4417gOnUUNy5A/0FsE=; b=S/DyWBVcLoTw81On3aWhtFX8zLc3iq8MTUml9ynxUA1ZetH4quvrTor2fkDmHeabhU BhbHo89hoJwdEcleQ4oXRSdWiGm/jYrfJw8Ic1BLgiL69zO0M/qE3btgZS6AVFgbu8um kERShY2cj4ZGB3t1UHgQG5W8BJ/aYYF7cJjVOVooD0as//7BLbaHykq/378NWBkPgxbC X/34qnNQocko/sbP7nweaDY6NQftUgVNRbPf54B8DCKuu7igSbFLaIvIfHWqsK0u8NiR 9t2CjMC5PGbjm8WlIATr3nF9NfMDfNBtHtThlY8rjLRfhrgIyoFcXXLicFB47HgRV7hg LioQ== X-Gm-Message-State: AOAM532NMEsV51WLnELlprtjNE3zwKdYarJvaUF3x7IWmgytv6bkFh7f 6RB8q3ahFuJYB3NwOWa8i3gBUAsmWFX9a0U1Dfj8HnkcKJD0PA== X-Google-Smtp-Source: ABdhPJz0HlG+8TU9xpYhgkA94VTSBGsn21LcKoSpAOYRYCHcue69jJUlNLt0QbA/mvJwT2moNUZPcDM6BiO1NJilX1g= X-Received: by 2002:aca:54d1:: with SMTP id i200mr160638oib.172.1600101479956; Mon, 14 Sep 2020 09:37:59 -0700 (PDT) MIME-Version: 1.0 From: Kieran Kunhya Date: Mon, 14 Sep 2020 17:37:53 +0100 Message-ID: To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCHv2] [RFC] libavcodec/hevc_refs: Clear DPB of old frames 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 21bf6e5eac61d34f270534dd5a2a7229967c1ee9 Mon Sep 17 00:00:00 2001 From: Kieran Kunhya Date: Thu, 16 Jul 2020 20:29:24 +0100 Subject: [PATCHv2] [RFC] libavcodec/hevc_refs: Clear DPB of old frames During glitching or looping streams, old frames remain in the DPB. The decoder incorrectly thinks that the DPB contains the right number of buffered frames to output and reordering breaks badly --- libavcodec/hevc_refs.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) -- 1.9.1 diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c index 4f6d985..6af0f6e 100644 --- a/libavcodec/hevc_refs.c +++ b/libavcodec/hevc_refs.c @@ -277,6 +277,10 @@ static int init_slice_rpl(HEVCContext *s) int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr]; int i; + if(frame && !frame->rpl_buf) { + return AVERROR_INVALIDDATA; + } + if (s->slice_idx >= frame->rpl_buf->size / sizeof(RefPicListTab)) return AVERROR_INVALIDDATA; @@ -462,6 +466,21 @@ int ff_hevc_frame_rps(HEVCContext *s) mark_ref(frame, 0); } + /* Clear the DPB of any junk frames */ + for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) { + HEVCFrame *frame = &s->DPB[i]; + if ((frame->flags & HEVC_FRAME_FLAG_OUTPUT) && + frame->sequence == s->seq_output) { + int dpb_size = FF_ARRAY_ELEMS(s->DPB); + if (frame->frame->buf[0] && ((frame->poc > s->poc + dpb_size) || (frame->poc < s->poc - dpb_size))) { + if(frame->poc == s->poc) + continue; + + ff_hevc_unref_frame(s, frame, ~0); + } + } + } + for (i = 0; i < NB_RPS_TYPE; i++) rps[i].nb_refs = 0;