From patchwork Wed May 9 05:50:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Borsboom X-Patchwork-Id: 8891 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp4810226jad; Tue, 8 May 2018 22:50:44 -0700 (PDT) X-Google-Smtp-Source: AB8JxZo0e2yGHQeDJryAg7/4Ln6g9RechZLAzLfoxwc0NkM5pfiylsIZ/d3eIoRKH51DJaI87YGL X-Received: by 2002:a1c:4249:: with SMTP id p70-v6mr4819246wma.17.1525845044611; Tue, 08 May 2018 22:50:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525845044; cv=none; d=google.com; s=arc-20160816; b=q4wqmHe6xU2jgVKk0XV/b+9IIXcCfphDVmAIf9ghANy58g1THPVvQC5cn3XFjcEukW TSb/u7UVRJ4wn01wu3tyhC5K6VVW/cAJ1JyOpzb56OrVi7DaRKxkojBNgyUbgNoMWLI1 ITTntmLizH7l+9zqfWC6/U0bWlYNDHmRWSEIGy4c+0+rQQyIpz4Vul0AieptsRo4JjnQ dDlv4VdW+1wGHmH4Cu9+NA/K1Y4ptir+6c3edTUvB+dBEFBzYVvcKZiRXAhe1nhEf0Q3 Q8jS1E9qZAZiD5y12iNOUW2b6r/U2QwuOMjwA+xBbAcGRkYaUjV8iBcJxpyikByqGzSa QO2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:content-language:mime-version:user-agent:date :message-id:from:to:dkim-signature:delivered-to :arc-authentication-results; bh=KEPyWcF4CZ2OCIu5JYoflPX9NOXIzaPshawbIO6BiuQ=; b=VYCAzPn55arb60yAJAAA1O8RzI7t9+Nu8EhS29dB3nMN690T+7EJrKp9pb0a7fsBLG C1ScJ+W1MzYlM+7+ufWDCKzP+bfS+4i4gZjaJf5s7MLk8NZ9J7/jCX3a4T/dYTb1Bwi4 8otIs24fJccy0/46ZCWeO5xk8DtCXhVLG3AtTeNrxOb2e3Lz1gRnqGU5jHd8QMTHalzM JVJITt0ESaXD6xHKWkhh/67pGjxHz8FWmXnC0mUeilWb41YICfvD0jvT8DtHCIWI+lck MoRswRC3UxgGKAh2H7JqLzKISctDFJ5VGvJmr/n6WXuUijO/ZzFiEDlsKGrKPxu2VkRQ CStA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@carpalis.nl header.s=default header.b=Y1ncJkhD; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a76-v6si23389526wrc.18.2018.05.08.22.50.44; Tue, 08 May 2018 22:50:44 -0700 (PDT) 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=@carpalis.nl header.s=default header.b=Y1ncJkhD; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5A40B68A429; Wed, 9 May 2018 08:50:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from kyoto.xs4all.nl (kyoto.xs4all.nl [83.161.153.34]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 589D368A375 for ; Wed, 9 May 2018 08:49:54 +0300 (EEST) Received: from [10.10.7.135] ([212.205.49.114]) (authenticated bits=0) by kyoto.xs4all.nl (8.14.7/8.14.7) with ESMTP id w495oRhA001519 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 9 May 2018 07:50:29 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=carpalis.nl; s=default; t=1525845029; bh=iLCAzSa//zZSjF+3LkYKiTNrDCGBs8hLEx4m5+sdS6I=; h=To:From:Subject:Date; b=Y1ncJkhDKQuAb1+RxzfmJ4elvHThK3VwB87QDhIHY7a2p4AnM/2yQeoMzZuXxUcbh VvK1oNrGYTOWJ92M+8WKMMVUJSXJx8rWF/D73U82Qt+R3s1o2796ItQ+Ygj0XguC+A 7b7BAzInwNncChm+t6hf0FcsC1z5Bp+KL5SAdqJgtnrcxfIC+ODUEt9U+0jRrElZR9 Gv/tSnOgfUu6TVkNRVG4JT9FYktlPHCMU5cxNJsqn8hhcLHk0X1GfyoS5dOVXrykD5 jswuONvw9eZ7Thfp6YLRhRrl82yFk/a+4Q+FVkngyUctRdZeoMI6Fc3pRLu6/0qfSv rUhz91rkTQ3zw== To: ffmpeg-devel@ffmpeg.org From: Jerome Borsboom Message-ID: <3f20b3ab-fe19-d8ca-754a-75001d9606b1@carpalis.nl> Date: Wed, 9 May 2018 07:50:28 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 Content-Language: nl Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/vc1: support multi-slice field interlaced pictures with 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" When using hardware accelerated decoding for multi-slice field interlaced pictures, only the first slice was decoded. This patch adds the neccesary looping over the remaining slices that may exist in field interlaced pictures. Additionally, we align the calculation of mby_start for the second field with the method given in VC-1 spec. Signed-off-by: Jerome Borsboom --- libavcodec/vc1dec.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 40a3e501dd..750f4dff1c 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -698,9 +698,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, slices[n_slices].buf); init_get_bits(&slices[n_slices].gb, slices[n_slices].buf, buf_size3 << 3); - /* assuming that the field marker is at the exact middle, - hope it's correct */ - slices[n_slices].mby_start = s->mb_height + 1 >> 1; + slices[n_slices].mby_start = avctx->coded_height + 31 >> 5; slices[n_slices].rawbuf = start; slices[n_slices].raw_size = size + 4; n_slices1 = n_slices - 1; // index of the last slice of the first field @@ -903,13 +901,41 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, s->picture_structure = PICT_BOTTOM_FIELD - v->tff; if ((ret = avctx->hwaccel->start_frame(avctx, buf_start, buf_start_second_field - buf_start)) < 0) goto err; - if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, buf_start_second_field - buf_start)) < 0) - goto err; + + if (n_slices1 == -1) { + // no slices, decode the field as-is + if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, buf_start_second_field - buf_start)) < 0) + goto err; + } else { + if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, slices[0].rawbuf - buf_start)) < 0) + goto err; + + for (i = 0 ; i < n_slices1 + 1; i++) { + s->gb = slices[i].gb; + s->mb_y = slices[i].mby_start; + + v->pic_header_flag = get_bits1(&s->gb); + if (v->pic_header_flag) { + if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) { + av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n"); + ret = AVERROR_INVALIDDATA; + if (avctx->err_recognition & AV_EF_EXPLODE) + goto err; + continue; + } + } + + if ((ret = avctx->hwaccel->decode_slice(avctx, slices[i].rawbuf, slices[i].raw_size)) < 0) + goto err; + } + } + if ((ret = avctx->hwaccel->end_frame(avctx)) < 0) goto err; // decode second field s->gb = slices[n_slices1 + 1].gb; + s->mb_y = slices[n_slices1 + 1].mby_start; s->picture_structure = PICT_TOP_FIELD + v->tff; v->second_field = 1; v->pic_header_flag = 0; @@ -922,8 +948,35 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, if ((ret = avctx->hwaccel->start_frame(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field)) < 0) goto err; - if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field)) < 0) - goto err; + + if (n_slices - n_slices1 == 2) { + // no slices, decode the field as-is + if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field)) < 0) + goto err; + } else { + if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start_second_field, slices[n_slices1 + 2].rawbuf - buf_start_second_field)) < 0) + goto err; + + for (i = n_slices1 + 2; i < n_slices; i++) { + s->gb = slices[i].gb; + s->mb_y = slices[i].mby_start; + + v->pic_header_flag = get_bits1(&s->gb); + if (v->pic_header_flag) { + if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) { + av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n"); + ret = AVERROR_INVALIDDATA; + if (avctx->err_recognition & AV_EF_EXPLODE) + goto err; + continue; + } + } + + if ((ret = avctx->hwaccel->decode_slice(avctx, slices[i].rawbuf, slices[i].raw_size)) < 0) + goto err; + } + } + if ((ret = avctx->hwaccel->end_frame(avctx)) < 0) goto err; } else {