From patchwork Thu Sep 7 21:56:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 5048 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.15.201 with SMTP id 70csp697174jao; Thu, 7 Sep 2017 14:57:02 -0700 (PDT) X-Received: by 10.28.222.213 with SMTP id v204mr181447wmg.56.1504821422552; Thu, 07 Sep 2017 14:57:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504821422; cv=none; d=google.com; s=arc-20160816; b=nJxRSn/0jlzKZ9SA6c2qRVTwWv8QN/c+V0tKapQQs2QI6FlQfK/Rd7WDnw2LuYFV5C 6p+/SI9ZVDpyd8efyCkH46JyyZ8k2vQEwY6evEtXY2cxhzvt5p7NoHM8gON/ZgsfRQay 7/d7lY2JSh3MExMP9zqDHGOQwcVgt4fCsfKjQmvfzsbxJ/j8gVm2XN8Uofv8eNyBiqTh jaBZw108UoO9A2ZOJtqusfRd6ikK1Aq4V3wpoU/TtaJaLFX5x1qSMjHwjBIhdTYC02oJ JgCT98vdrtBnklXhPR26OtbGNOPjnnSw1ISUtg+ZpYmRbsSkzjVL+nCtZfceI8jjzdFk 1hAQ== 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=rD9NQnHxPZ3sJdPG/tovM3J4OEV+QnBX6bCnTLJBOhs=; b=xcya5Dw1oGAkvo17mq8rnx/+t89nwmR6wfv2FoY13ePpHq9EvdrFeyzAuX6wITbhRf leFmOh1WT3bh1Qc0l5LxgcL8fUoa8R7sIATAkzFOtTvGQZZ+noMNuZe+SLInQ4AZ8qKm l+yia1iTIOMJcU23eBV+jhelfqYx9wu8rQRi+Jq+vra3JCYQ1pref1FvGBZhTvdUuOed zEqdYq9oiV6o99TssPUS4E4A8Y7Tr6mepiSvZehyoaVnPdjJwYOJoUAekvOu/x70TrNJ GX/6RjtQ3QdnBXICWbN7xTtamW69x2A1RHyuVeHchY/wiXgVUROjtJESNVZwWmq/Lr01 xrHQ== 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=VwXxhh2s; 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 z47si253005wrc.73.2017.09.07.14.57.02; Thu, 07 Sep 2017 14:57:02 -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=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=VwXxhh2s; 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 2CC0E689F3F; Fri, 8 Sep 2017 00:56:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f173.google.com (mail-wr0-f173.google.com [209.85.128.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 24887689E30 for ; Fri, 8 Sep 2017 00:56:24 +0300 (EEST) Received: by mail-wr0-f173.google.com with SMTP id v109so1665001wrc.1 for ; Thu, 07 Sep 2017 14:56:28 -0700 (PDT) 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=AUAakd+E55M0g1BarHjImTohHCgnqLBLN8zdJrPC29I=; b=VwXxhh2sNhnGmPFNd6d/1lD6TEphsD6yoFvf/u5XpHunKCjL+YR2Mj4J8jQ8yFxDae +Cm2xz2dOuCQBdkICVKT/lM87jDjuuqrKwke6Fb1IqudtNg2sbLcPSOCFGwR4D77T2JV zwgaenPIdgPfZxszIMvo1l2zuBgzW9ccwMaZbsQs5WyY5XIiy9tsq05vlo8VfbPRdpp+ qxBPAzjCeTPXF+VNTWJi0tDna8h73PnLzED6Qs+FGtXDSeQyzkv5At6CRDKC7U4yZ0F2 1bqIzVvuZ9A39WgQc39oHjsS4cCiSI4SCE8r5Z6uoyIZCsReOFLgBIw6HcGsqlKch4EC +A4w== 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=AUAakd+E55M0g1BarHjImTohHCgnqLBLN8zdJrPC29I=; b=HY/m7fdwYpOhlpDCM8nDFCg/9131lphDPUKfGNkjdjbO0wdu898IfE8V9TkcijNDyN RMEhWjfHR7MUYUaR5iXK3V/osvcVVPUMvFU5dONEWN05cr9AaE8rRIqBGlcHgKNJ+/Ia cMUB3C5oI4kTqy1tBeZN0qCXFnIUeO8GJywe6JmiOfPaTVjCphZ893dXPMinxPyVprRn B0aVnm7WZdS66NAMneyFlpajPPt5uBNKfEPCN9GGH9jRLynK4OgAgfQGLgP4vjDiAQVI gzYkXHm4skSnPfRULRjVOg3IejXTpua+sdTDQgzhZczOzGawjYSD0R/9YMcyYpJ2nLIS ryuQ== X-Gm-Message-State: AHPjjUj41nVaM9vNB9ar6fBROj5pF7ZGuf+4A1L+vy7koBh90bgzzlVE 8EKaOntkVLXxviYBo0I= X-Google-Smtp-Source: ADKCNb7fH+qDpmJpxCdLplbgK6SpgQ8ZLHcSds66JR9ZauZA1JCvJ6924CslTGdw7s2ZVW82ZnkEHg== X-Received: by 10.223.130.116 with SMTP id 107mr429987wrb.240.1504821387528; Thu, 07 Sep 2017 14:56:27 -0700 (PDT) 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 z51sm577870wrb.22.2017.09.07.14.56.26 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Sep 2017 14:56:26 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Thu, 7 Sep 2017 22:56:18 +0100 Message-Id: <20170907215619.3182-4-sw@jkqxz.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170907215619.3182-1-sw@jkqxz.net> References: <20170907215619.3182-1-sw@jkqxz.net> Subject: [FFmpeg-devel] [PATCH 4/5] lavc: Add wrapped_avframe decoder 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" Intended for use with hardware frames for which rawvideo is not sufficient. Requires the trusted packet flag to be set - decoding fails if not to avoid security issues (the wrapped AVFrame can contain pointers to arbitrary data). --- Now uses the trusted packet flag, rejects the packet if not set. libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 2 +- libavcodec/wrapped_avframe.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 999632cf9e..943e5db511 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -653,6 +653,7 @@ OBJS-$(CONFIG_WMV2_DECODER) += wmv2dec.o wmv2.o wmv2data.o \ OBJS-$(CONFIG_WMV2_ENCODER) += wmv2enc.o wmv2.o wmv2data.o \ msmpeg4.o msmpeg4enc.o msmpeg4data.o OBJS-$(CONFIG_WNV1_DECODER) += wnv1.o +OBJS-$(CONFIG_WRAPPED_AVFRAME_DECODER) += wrapped_avframe.o OBJS-$(CONFIG_WRAPPED_AVFRAME_ENCODER) += wrapped_avframe.o OBJS-$(CONFIG_WS_SND1_DECODER) += ws-snd1.o OBJS-$(CONFIG_XAN_DPCM_DECODER) += dpcm.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index ce0bc7ecf3..625720578f 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -377,7 +377,7 @@ static void register_all(void) REGISTER_DECODER(VQA, vqa); REGISTER_DECODER(BITPACKED, bitpacked); REGISTER_DECODER(WEBP, webp); - REGISTER_ENCODER(WRAPPED_AVFRAME, wrapped_avframe); + REGISTER_ENCDEC (WRAPPED_AVFRAME, wrapped_avframe); REGISTER_ENCDEC (WMV1, wmv1); REGISTER_ENCDEC (WMV2, wmv2); REGISTER_DECODER(WMV3, wmv3); diff --git a/libavcodec/wrapped_avframe.c b/libavcodec/wrapped_avframe.c index 14360320ff..5f88a668b9 100644 --- a/libavcodec/wrapped_avframe.c +++ b/libavcodec/wrapped_avframe.c @@ -75,6 +75,33 @@ static int wrapped_avframe_encode(AVCodecContext *avctx, AVPacket *pkt, return 0; } +static int wrapped_avframe_decode(AVCodecContext *avctx, void *data, + int *got_frame, AVPacket *pkt) +{ + AVFrame *in, *out; + int err; + + if (!(pkt->flags & AV_PKT_FLAG_TRUSTED)) { + // This decoder is not usable with untrusted input. + return AVERROR(EPERM); + } + + if (pkt->size < sizeof(AVFrame)) + return AVERROR(EINVAL); + + in = (AVFrame*)pkt->data; + out = data; + + err = ff_decode_frame_props(avctx, out); + if (err < 0) + return err; + + av_frame_move_ref(out, in); + + *got_frame = 1; + return 0; +} + AVCodec ff_wrapped_avframe_encoder = { .name = "wrapped_avframe", .long_name = NULL_IF_CONFIG_SMALL("AVFrame to AVPacket passthrough"), @@ -83,3 +110,12 @@ AVCodec ff_wrapped_avframe_encoder = { .encode2 = wrapped_avframe_encode, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, }; + +AVCodec ff_wrapped_avframe_decoder = { + .name = "wrapped_avframe", + .long_name = NULL_IF_CONFIG_SMALL("AVPacket to AVFrame passthrough"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_WRAPPED_AVFRAME, + .decode = wrapped_avframe_decode, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, +};