From patchwork Fri Jan 19 03:51:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 7343 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp332283jak; Thu, 18 Jan 2018 19:51:52 -0800 (PST) X-Google-Smtp-Source: ACJfBotwGGchBcMCOC7OrvB+xTTx8oWAM0GleVhzdTizx8JsC5qRjrJalw8O3M3d5uqMI9yTReT+ X-Received: by 10.223.189.131 with SMTP id l3mr7539693wrh.168.1516333912387; Thu, 18 Jan 2018 19:51:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516333912; cv=none; d=google.com; s=arc-20160816; b=pEW0kC7wngFvW3um16B29TzyBmHo39de4XvJwt0e+eyX61m51ZwnIXffwV0KzKw2eT x7qoc/uNKKWSusYPtYD4xjRdSCxfEymyQKZKLvg+X//qhWXEwZICN8G6zKuOCFkQ+1C3 jHIIqFW5UA57myfcHaibC/QABjDcBzwvgUA0Wveckb1sBL9NYVC5S6T9U0dAWB5TDVTo GYBUSBCRtGGkO76V/PxIBQjZIZeYTlfIKj4kGeLaels38KQQsAnuOq2x2GKF1xxA1Ubt dbFRPSeUU+e8KSpRpD8vxVxFicDVwLKCTZFGz5d7v2LBBYqcS5ekHe394lEYqxBWOY67 WQ/A== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=vbJIKQb8qK7il1/unbiKuWtx0EYHUElEodPF73tQpx4=; b=d2FaAAxjvqlglyT0QkUBjR5TL2ItbT4U+YZioRCJrj8sLsU3sUJ7/GqxY2+TlSnolb VyGLYjHCWMxfhqZda/arR9sazMgti6Tso3EYpcUd/aKUSSJwh11eBVbayjxFrySsZxbL 58hqUVLOLhHTFJ3yjbtLG1Dvaw3JmGZ5u8cQHf/QZyfLIt2koTCDEq3Tqswbh/NYSOMg BLXSpbLt4VuQ2pbHQKEwkywWGUUjvbfNbqEtRN29f877tmGJwyz4sFtjmxzKUXzLLked Dbse97NAELsv8F2Elxeyqpdh38szVIs7rvPsqpsvD3NrMuLJof8lufy4FxrqUnp1NoWY 7PCQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=KCydW5w9; 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 sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o15si7220738wra.395.2018.01.18.19.51.51; Thu, 18 Jan 2018 19:51:52 -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 header.s=20161025 header.b=KCydW5w9; 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 sp=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 E3DF368A30F; Fri, 19 Jan 2018 05:51:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f195.google.com (mail-qt0-f195.google.com [209.85.216.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 93C9668A2BA for ; Fri, 19 Jan 2018 05:51:43 +0200 (EET) Received: by mail-qt0-f195.google.com with SMTP id i1so909056qtj.8 for ; Thu, 18 Jan 2018 19:51:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=LvbVgcKIJbFHrUVYOUey9XLkRbOXlfXCEtNowHKkx+Q=; b=KCydW5w9ru6ZdCJH1A0YTNxZaLKr36VU2lZBzaLNhqjXpLWAUhtJTCL+ZPPqfetk1Y En8PjFS1h242X7s+BSfnowXzNpXpjyrwvZcAA7BWwUk11qjFJNmi4dhwydsWPntL53Ht GHVNVOA3Ltm1KbG6bjYGBMl6DEExqndrXdo7rxCsVa4GWjRyochQHzw24xI/M6NknSpv 12mgd/89DCZye49teiOrUvJ1kZeYGhf/rKhiSjgXoC67a/e4CsF+gL8riDK6Hy+kng/s Pa6cXevrzcJvukqxHuhLExrj/NtZkiYgK3j38v6WkltejGT2rG48jQ0utZQeMg1GyiZs xG4Q== 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; bh=LvbVgcKIJbFHrUVYOUey9XLkRbOXlfXCEtNowHKkx+Q=; b=Azhq6KROgIWgzFpkraioK4Izh7t7WzrM+WjK3iKOj04yCW2MeVuRA0uZgBPEG3oaHr 4TNMaE31hK1yYIVJ9p8QAqhrvd0fFWCqC0Kg4L5RAgyIBBtrKPRXJ7wognHojNaOfdyy 4tSHpyohEZIYv4ag9Jihn333edsIU5suSXzylMdcns/2kqAZJ/TYZV3spXgZMLXBysaO 2z8+oI9NYkfPoHVm9L059W8TGaY5UaBsCZFkK6GSNKqoSDWoRghNpC9Snqfk02mf88KZ 2QMfZ6XbTGlnwBC82FMlf7znQWZ0VceOQksUO48GrQbm9S5TxGawOxgBK8JDjwhDBcCi 3oHQ== X-Gm-Message-State: AKwxytfaYGSHIW/ybI1Ho0LKKLO0RMLcjwJB/HjHZQbvtxB/K+7jMD+H Fy6Pfk5swg1r40Q6OxDvEqG98A== X-Received: by 10.55.118.199 with SMTP id r190mr63105434qkc.99.1516333902643; Thu, 18 Jan 2018 19:51:42 -0800 (PST) Received: from localhost.localdomain ([181.229.225.176]) by smtp.gmail.com with ESMTPSA id t11sm6031197qta.70.2018.01.18.19.51.41 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 18 Jan 2018 19:51:42 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 19 Jan 2018 00:51:21 -0300 Message-Id: <20180119035121.4612-1-jamrial@gmail.com> X-Mailer: git-send-email 2.15.0 Subject: [FFmpeg-devel] [PATCH] avcodec/vp9_parser: parse size and colorspace values from frame headers 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" Improves remuxing support when vp9 decoder is not compiled in. Signed-off-by: James Almer --- libavcodec/vp9_parser.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/libavcodec/vp9_parser.c b/libavcodec/vp9_parser.c index 9531f34a32..b059477747 100644 --- a/libavcodec/vp9_parser.c +++ b/libavcodec/vp9_parser.c @@ -23,15 +23,69 @@ #include "libavutil/intreadwrite.h" #include "libavcodec/get_bits.h" +#include "libavcodec/internal.h" #include "parser.h" +#define VP9_SYNCCODE 0x498342 + +static int read_colorspace_details(AVCodecParserContext *ctx, AVCodecContext *avctx, + GetBitContext *gb) +{ + static const enum AVColorSpace colorspaces[8] = { + AVCOL_SPC_UNSPECIFIED, AVCOL_SPC_BT470BG, AVCOL_SPC_BT709, AVCOL_SPC_SMPTE170M, + AVCOL_SPC_SMPTE240M, AVCOL_SPC_BT2020_NCL, AVCOL_SPC_RESERVED, AVCOL_SPC_RGB, + }; + int bits = avctx->profile <= 1 ? 0 : 1 + get_bits1(gb); // 0:8, 1:10, 2:12 + + avctx->colorspace = colorspaces[get_bits(gb, 3)]; + if (avctx->colorspace == AVCOL_SPC_RGB) { // RGB = profile 1 + static const enum AVPixelFormat pix_fmt_rgb[3] = { + AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12 + }; + if (avctx->profile & 1) { + if (get_bits1(gb)) // reserved bit + return AVERROR_INVALIDDATA; + } else + return AVERROR_INVALIDDATA; + avctx->color_range = AVCOL_RANGE_JPEG; + ctx->format = pix_fmt_rgb[bits]; + } else { + static const enum AVPixelFormat pix_fmt_for_ss[3][2 /* v */][2 /* h */] = { + { { AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P }, + { AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV420P } }, + { { AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV422P10 }, + { AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV420P10 } }, + { { AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12 }, + { AV_PIX_FMT_YUV440P12, AV_PIX_FMT_YUV420P12 } } + }; + avctx->color_range = get_bits1(gb) ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; + if (avctx->profile & 1) { + int ss_h, ss_v, format; + + ss_h = get_bits1(gb); + ss_v = get_bits1(gb); + format = pix_fmt_for_ss[bits][ss_v][ss_h]; + if (format == AV_PIX_FMT_YUV420P) + // YUV 4:2:0 not supported in profiles 1 and 3 + return AVERROR_INVALIDDATA; + else if (get_bits1(gb)) // color details reserved bit + return AVERROR_INVALIDDATA; + ctx->format = format; + } else { + ctx->format = pix_fmt_for_ss[bits][1][1]; + } + } + + return 0; +} + static int parse(AVCodecParserContext *ctx, AVCodecContext *avctx, const uint8_t **out_data, int *out_size, const uint8_t *data, int size) { GetBitContext gb; - int res, profile, keyframe; + int res, profile, keyframe, invisible, errorres; *out_data = data; *out_size = size; @@ -42,21 +96,63 @@ static int parse(AVCodecParserContext *ctx, profile = get_bits1(&gb); profile |= get_bits1(&gb) << 1; if (profile == 3) profile += get_bits1(&gb); + if (profile > 3) + return size; if (get_bits1(&gb)) { keyframe = 0; + skip_bits(&gb, 3); } else { keyframe = !get_bits1(&gb); } + invisible = !get_bits1(&gb); + errorres = get_bits1(&gb); + if (!keyframe) { + int intraonly = invisible ? get_bits1(&gb) : 0; + if (!errorres) + skip_bits(&gb, 2); + if (intraonly) { + if (get_bits_long(&gb, 24) != VP9_SYNCCODE) // synccode + return size; + avctx->profile = profile; + if (profile >= 1) { + if ((read_colorspace_details(ctx, avctx, &gb)) < 0) + return size; + } else { + ctx->format = AV_PIX_FMT_YUV420P; + avctx->colorspace = AVCOL_SPC_BT470BG; + avctx->color_range = AVCOL_RANGE_MPEG; + } + skip_bits(&gb, 8); // refreshrefmask + ctx->width = get_bits(&gb, 16) + 1; + ctx->height = get_bits(&gb, 16) + 1; + if (get_bits1(&gb)) // display size + skip_bits(&gb, 32); + } + ctx->pict_type = AV_PICTURE_TYPE_P; ctx->key_frame = 0; } else { + if (get_bits_long(&gb, 24) != VP9_SYNCCODE) // synccode + return size; + avctx->profile = profile; + if (read_colorspace_details(ctx, avctx, &gb) < 0) + return size; + ctx->width = get_bits(&gb, 16) + 1; + ctx->height = get_bits(&gb, 16) + 1; + if (get_bits1(&gb)) // display size + skip_bits(&gb, 32); + ctx->pict_type = AV_PICTURE_TYPE_I; ctx->key_frame = 1; } + if (ctx->width && (!avctx->width || !avctx->height || + !avctx->coded_width || !avctx->coded_height)) + ff_set_dimensions(avctx, ctx->width, ctx->height); + return size; }