From patchwork Fri Nov 24 00:51:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 6315 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp1465093jah; Thu, 23 Nov 2017 16:53:33 -0800 (PST) X-Google-Smtp-Source: AGs4zMaDu3gqFC3aAEdU55zJiQ/XXA6QDGHBj/czGWTV3KaMAdFSHsrzU4oxlWcYwkXIGCpJDLEg X-Received: by 10.223.197.141 with SMTP id m13mr23786064wrg.203.1511484813272; Thu, 23 Nov 2017 16:53:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511484813; cv=none; d=google.com; s=arc-20160816; b=hnPaaWgU/tuta0rvwaQcH9SdHZz25B73ucXoTqyVh2trpk2diY6QfgTADPTrwbK2p4 4SJLokoUe3LtJRyjED8l8FpAgCvX8xi/+c8MPmLWwkjZS12L9UvGyCiGkxd52tdvnWiJ Sb8gUSCMKlE4Rd2eJKX5jVCumkkdsAwzLqHZNzNQHrgy7gIwy8i7i0jKK/o/IGmGMBwo U/hC1V/LvZntQsIBcksZU3QYZ4Wyx1z/wiEQZ6bfEFKKKzuu9AWgLxdDT7itPGRYud3i NFaIkS2wIHEYucwB/1wCpqlrBPcz0cxGbSplR9i83V0P+GDG670O1sxIMDPT4aJEAbQm 4JTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=F49WsjygwXda1SUDOPW4dNK7ZJi+385G3dq5CHuJczY=; b=LmmkKP1WUBc/EbTk5n5LhGXIZN2kSgdHaobXkwfjzaNXYVgNMnR6iExivA4pj4zJsQ BYxduWJRe5a6bB1xCNsBvh1bCDhox/1B7OrYKRXsv3e1V/8ZAWHdHQkLxbKbV5Oj+DML dDWV0h4KAYj5JQwJIXTBz/tJLw1tla0KfoUywgK7NVssVYz/13c1jey/uLLfPMFeEDsX VkS08scvcqy8Y4yCc//6dXqhbsNtNLHA8hySP8ZRt8njAFXFMPHiEGap3vfE4QJOfjHk ZO2nD04cOKDzlsppC4V4IS48l2KcCpcD4mY0H7YwdjyM8RLBHUDYP8SPRPDjyAaXHPJ6 hUMw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=F1UuUagP; 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 l18si16237895wre.410.2017.11.23.16.53.32; Thu, 23 Nov 2017 16:53:33 -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=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=F1UuUagP; 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 BD85068A273; Fri, 24 Nov 2017 02:51:55 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f169.google.com (mail-wr0-f169.google.com [209.85.128.169]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6C83168A1B0 for ; Fri, 24 Nov 2017 02:51:52 +0200 (EET) Received: by mail-wr0-f169.google.com with SMTP id w95so18990330wrc.2 for ; Thu, 23 Nov 2017 16:51:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=tLVkjRvQHt17rIl84IAxVjkU2HzMv6L+bJrOdfXWXT4=; b=F1UuUagPCwukLeN4NvzTKRiphYFuXJaKA+D46liERVfCLXH0JVvl+reTFnWv8l8wPf lxJLSM8asAWJ1BX9kzw8D73krImFQJSUOfxt72TT9rT4jyv+RxztyLDFmfTKcb1OxFFY 6d/pKHvefqUFoHwcW8j5w/REGWvuoYThtJKRim67+7QdYxMQNJ0/6iQreM2qguBZyIwO /0y2LTYyR6sJOEKM5CCJ4ajzT2TXzfBZ6ArQWQm82s7vXFtJRKb2LCYk4IeDBvi5cUu0 uft3CuCz6za+03IGPN6pDZq7sd155hZvim2REpQUuhhAqB+eX7dcHjVMHYEOxq2/9XVg vQ8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=tLVkjRvQHt17rIl84IAxVjkU2HzMv6L+bJrOdfXWXT4=; b=JmkkkHu1QaNGVaISVVG+MmmOuelYC/8LHWjgM191a5dWJK2jFAuubSHpkOUmrdmTXI XDl6qACJPBPCpELfpuHlD87vfjYlE5JZisleJ8lUeeV4PwQmdOvYHt0jgQFxNaN5Xp2t wowDEOdoJHvczyaYFJDTiN7+3dm3N6iLGRCmX8hWaqI+DpS9tsClJU6d5WoAjpFP0Ry0 UyXtuk2fTB+ZrUMke5VI17lzAAzNFWsHR8KgBXr5Hnl3iUR12jtCOmUVtG9aa4QSpxsA s5L3befwWewRxiMd1ooDBKifdH23u1v2yg8KUAGCCQwoNRXAHWfJQq1lU/vgimOT+AQT 4sfA== X-Gm-Message-State: AJaThX5tslFKjdf6hUEgTz9K6f77DIishzu6tOKl3mRUysqRyb6avbCo to15Iox5bZSYXNRSaEF1Q0m7mm0T X-Received: by 10.223.129.135 with SMTP id 7mr24255794wra.55.1511484712552; Thu, 23 Nov 2017 16:51:52 -0800 (PST) Received: from rywe.jkqxz.net (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id h7sm4489655wrb.35.2017.11.23.16.51.51 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 23 Nov 2017 16:51:52 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Fri, 24 Nov 2017 00:51:31 +0000 Message-Id: <20171124005134.5683-14-sw@jkqxz.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171124005134.5683-1-sw@jkqxz.net> References: <20171124005134.5683-1-sw@jkqxz.net> Subject: [FFmpeg-devel] [PATCH 14/17] mjpegdec: Add hwaccel hooks 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Also adds some extra fields to the main context structure that may be needed by a hwaccel decoder. --- The YUVJ formats really mess with this. This patch hacks them out so that the hwaccel works, suggestions welcome on what to actually do about them. libavcodec/mjpegdec.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++-- libavcodec/mjpegdec.h | 11 ++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index f01d44a169..846dec2f42 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -36,6 +36,7 @@ #include "avcodec.h" #include "blockdsp.h" #include "copy_block.h" +#include "hwaccel.h" #include "idctdsp.h" #include "internal.h" #include "jpegtables.h" @@ -147,6 +148,7 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) s->org_height = avctx->coded_height; avctx->chroma_sample_location = AVCHROMA_LOC_CENTER; avctx->colorspace = AVCOL_SPC_BT470BG; + s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE; if ((ret = build_basic_mjpeg_vlc(s)) < 0) return ret; @@ -279,6 +281,11 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s) code_max + 1, 0, 0)) < 0) return ret; } + + for (i = 0; i < 16; i++) + s->raw_huffman_lengths[class][index][i] = bits_table[i + 1]; + for (i = 0; i < 256; i++) + s->raw_huffman_values[class][index][i] = val_table[i]; } return 0; } @@ -636,6 +643,26 @@ unk_pixfmt: return AVERROR_BUG; } + if (s->avctx->pix_fmt == AV_PIX_FMT_YUVJ420P) + s->avctx->pix_fmt = AV_PIX_FMT_YUV420P; + if (s->avctx->pix_fmt == AV_PIX_FMT_YUVJ422P) + s->avctx->pix_fmt = AV_PIX_FMT_YUV422P; + + if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt) { + s->avctx->pix_fmt = s->hwaccel_pix_fmt; + } else { + enum AVPixelFormat pix_fmts[] = { + s->avctx->pix_fmt, + AV_PIX_FMT_NONE, + }; + s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts); + if (s->hwaccel_pix_fmt < 0) + return AVERROR(EINVAL); + + s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt; + s->avctx->pix_fmt = s->hwaccel_pix_fmt; + } + if (s->avctx->skip_frame == AVDISCARD_ALL) { s->picture_ptr->pict_type = AV_PICTURE_TYPE_I; s->picture_ptr->key_frame = 1; @@ -683,6 +710,19 @@ unk_pixfmt: } memset(s->coefs_finished, 0, sizeof(s->coefs_finished)); } + + if (s->avctx->hwaccel) { + s->hwaccel_picture_private = + av_mallocz(s->avctx->hwaccel->frame_priv_data_size); + if (!s->hwaccel_picture_private) + return AVERROR(ENOMEM); + + ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_buffer, + s->raw_buffer_size); + if (ret < 0) + return ret; + } + return 0; } @@ -1510,7 +1550,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, } } - av_assert0(s->picture_ptr->data[0]); + //av_assert0(s->picture_ptr->data[0]); /* XXX: verify len field validity */ len = get_bits(&s->gb, 16); nb_components = get_bits(&s->gb, 8); @@ -1600,7 +1640,18 @@ next_field: for (i = 0; i < nb_components; i++) s->last_dc[i] = (4 << s->bits); - if (s->lossless) { + if (s->avctx->hwaccel) { + int bytes_to_start = get_bits_count(&s->gb) / 8; + av_assert0(bytes_to_start >= 0 && + s->raw_buffer_size >= bytes_to_start); + + ret = s->avctx->hwaccel->decode_slice(s->avctx, + s->raw_buffer + bytes_to_start, + s->raw_buffer_size - bytes_to_start); + if (ret < 0) + return ret; + + } else if (s->lossless) { av_assert0(s->picture_ptr == s->picture); if (CONFIG_JPEGLS_DECODER && s->ls) { // for () { @@ -2226,6 +2277,9 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, goto fail; } + s->raw_buffer = buf_ptr; + s->raw_buffer_size = buf_end - buf_ptr; + s->start_code = start_code; if (s->avctx->debug & FF_DEBUG_STARTCODE) av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code); @@ -2349,6 +2403,13 @@ eoi_parser: s->got_picture = 0; goto the_end_no_picture; } + if (s->avctx->hwaccel) { + ret = s->avctx->hwaccel->end_frame(s->avctx); + if (ret < 0) + return ret; + + av_freep(&s->hwaccel_picture_private); + } if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0) return ret; *got_frame = 1; @@ -2673,6 +2734,8 @@ av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx) reset_icc_profile(s); + av_freep(&s->hwaccel_picture_private); + return 0; } @@ -2713,6 +2776,9 @@ AVCodec ff_mjpeg_decoder = { .priv_class = &mjpegdec_class, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, + .hw_configs = (const AVCodecHWConfigInternal*[]) { + NULL + }, }; #endif #if CONFIG_THP_DECODER diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h index c84a40aa6e..50443937b4 100644 --- a/libavcodec/mjpegdec.h +++ b/libavcodec/mjpegdec.h @@ -135,6 +135,17 @@ typedef struct MJpegDecodeContext { int *iccdatalens; int iccnum; int iccread; + + // Raw stream data for hwaccel use. + const uint8_t *raw_buffer; + size_t raw_buffer_size; + + uint8_t raw_huffman_lengths[2][4][16]; + uint8_t raw_huffman_values[2][4][256]; + + enum AVPixelFormat hwaccel_sw_pix_fmt; + enum AVPixelFormat hwaccel_pix_fmt; + void *hwaccel_picture_private; } MJpegDecodeContext; int ff_mjpeg_decode_init(AVCodecContext *avctx);