From patchwork Wed Nov 16 07:17:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 1429 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.90.1 with SMTP id o1csp30649vsb; Tue, 15 Nov 2016 23:18:03 -0800 (PST) X-Received: by 10.28.149.79 with SMTP id x76mr7418480wmd.27.1479280683664; Tue, 15 Nov 2016 23:18:03 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id fj9si32001508wjb.13.2016.11.15.23.18.02; Tue, 15 Nov 2016 23:18:03 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CBC66689D9E; Wed, 16 Nov 2016 09:17:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f194.google.com (mail-pf0-f194.google.com [209.85.192.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A431C6898B9 for ; Wed, 16 Nov 2016 09:17:52 +0200 (EET) Received: by mail-pf0-f194.google.com with SMTP id c4so6754457pfb.3 for ; Tue, 15 Nov 2016 23:17:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=to:from:subject:message-id:date:user-agent:mime-version; bh=/nG2nPdQtoseKgMMy/i5Do9c8oFU9uWB3zJceRpRFUQ=; b=aABkLuaVui+wYOMeGa7RcmnR2KLP6BM/D2sp8+a160MNYEi7RMBTjv09m3nQDast8j BoVPqu3SoZxzK0x+ykgNxUnklh2+b/H2i3AXGeEL7BdilgD0efNMixaUK0T9Z1Hoho/x heaEu1XpcnVlsbm299PqCoFcVE/0IBlpJP5SEZbWjW1GzvpweOWA2+FI7BeUnz1jFFKR WqDNC8H2pqpxHKyQgt9Nqxj6PkysICHKClrwcGcgnz/UCO3QbTC8oXMSLQ7F1O9Qrjod S9/ic/w//FnXXqUaZ7jCUYe7I0ZJibCsHgwTH2KSRFVLQpGWUBme6Rby9H9u/Jxh4boT ddnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version; bh=/nG2nPdQtoseKgMMy/i5Do9c8oFU9uWB3zJceRpRFUQ=; b=RjMmb3RDepPaJ1GZqbvIxoa2JHngj/bPWTWu5fzzdGl6bVHqTd+goXRxbrSTaxiMGH yGw+g88K/mVN/7m1DSoSy/pIZe5v0hLENB9W6jMkjiCAi9XzUasAemnf2XApIgMmXR9Z BDwKNUkJYWIgy/9QWEVIxw/mLRs45mEokM3eK/QbLF965P005/1Yw666iuMJIL2K33cA G1LaLL+MOQr97coWlWC9FnDdgbCGiBZn0o1JGv/wR92Z2FLc1dPf+hSCthRDEF69vw6Z YPPGVmZBZ1dfMa7jWsvZaqAqauJm39UnRjj3xgpjytzmOYJdo7NYZwEalXksmH5/wrpA yAqw== X-Gm-Message-State: ABUngvcuIHyr7/65shug0M0TYTlbDvYYUskJX1i8VEF8r3P0RkULB+qsriHWqQVNiLGF4Q== X-Received: by 10.99.55.30 with SMTP id e30mr5109056pga.75.1479280671202; Tue, 15 Nov 2016 23:17:51 -0800 (PST) Received: from [10.239.204.100] (fmdmzpr01-ext.fm.intel.com. [192.55.54.36]) by smtp.gmail.com with ESMTPSA id d1sm49761055pfb.76.2016.11.15.23.17.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Nov 2016 23:17:50 -0800 (PST) To: FFmpeg development discussions and patches , Hendrik Leppkes , Mark Thompson , Moritz Barsnick , Yi Wang From: Jun Zhao Message-ID: Date: Wed, 16 Nov 2016 15:17:46 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] lavc/vc1dec: add multi-slice decoding support for hwaccel. 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" V2: - in i965 + Skylake, after apply this fix, it's can decode vc1_sa20021/ vc1_sa10091, but can't decode vc1_sa10143/vc1_ilaced_twomv, the root cause is i965 driver can't support interlaced VC1 decode, I will open a issue to i965 driver. - used the cmd "make HWACCEL='vaapi -vaapi_device /dev/dri/renderD128 -hwaccel_output_format yuv420p' fate-vc1 -i" reproduce and verify From fe93d69cf9ffe8a9a84c1371f185dc8d10d0aec4 Mon Sep 17 00:00:00 2001 From: Jun Zhao Date: Tue, 15 Nov 2016 15:09:50 +0800 Subject: [PATCH v2] lavc/vc1dec: add multi-slice decoding support for hwaccel. add mutil-slice decoding support for hwaccel, after this fix vaapi hwaccel decoder will support FATE test sample SA20021.vc1, SA10091.vc1, and can't decode ilaced_twomv.vc1, SA10143.vc1 Signed-off-by: Wang, Yi A Signed-off-by: Jun Zhao --- libavcodec/vc1dec.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 4f78aa8..0c57f47 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -632,6 +632,8 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, int mb_height, n_slices1=-1; struct { uint8_t *buf; + uint8_t *buf_start; + int buf_size; GetBitContext gb; int mby_start; } *slices = NULL, *tmp; @@ -738,6 +740,10 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, ret = AVERROR(ENOMEM); goto err; } + + slices[n_slices].buf_start = start; + slices[n_slices].buf_size = size + 4; + buf_size3 = vc1_unescape_buffer(start + 4, size, slices[n_slices].buf); init_get_bits(&slices[n_slices].gb, slices[n_slices].buf, @@ -951,10 +957,27 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, goto err; } else { s->picture_structure = PICT_FRAME; + s->mb_y = 0; if ((ret = avctx->hwaccel->start_frame(avctx, buf_start, (buf + buf_size) - buf_start)) < 0) goto err; - if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start)) < 0) - goto err; + if (n_slices == 0) { + if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start)) < 0) + goto err; + } else { + int i; + ret = avctx->hwaccel->decode_slice(avctx, buf_start, slices[0].buf_start - buf_start); + if (ret < 0) + goto err; + for (i = 0 ; i < n_slices; i++) { + s->gb = slices[i].gb; + s->mb_y = slices[i].mby_start; + if (get_bits(&s->gb, 1)) + ff_vc1_parse_frame_header_adv(v, &s->gb); + ret = avctx->hwaccel->decode_slice(avctx, slices[i].buf_start, slices[i].buf_size); + if (ret < 0) + goto err; + } + } if ((ret = avctx->hwaccel->end_frame(avctx)) < 0) goto err; }