From patchwork Wed Oct 3 17:49: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: 10602 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:ab0:73d2:0:0:0:0:0 with SMTP id m18csp4504165uaq; Wed, 3 Oct 2018 10:49:53 -0700 (PDT) X-Google-Smtp-Source: ACcGV63RbYeQym2uFwTHkWYLudbsEenRzrgEVpexx9cr6J14uAbMYitkd8K2BTFdkm9p7TAooaPN X-Received: by 2002:adf:c793:: with SMTP id l19-v6mr2130656wrg.230.1538588993846; Wed, 03 Oct 2018 10:49:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538588993; cv=none; d=google.com; s=arc-20160816; b=kfyZRt4BnfJJWgx8e6RMPKVPb/owSW5k7BQuESBNqjmqy5IDdRWW0f+03QXD0odVUI VbRWpmni3Hkq4aAQLzuuBOKxzr4sOXqQAuY+aHHy6BkWdbEvO1zFJhWUXfa28Q0ihb26 daK+8Esw/51ws3Z2vmexbcdyNkC4mTbZUiLriqDjwp4qGo1pNs5Go+SZK7qaBh4qI8uo jVT3F9MWCHBeN3kCC435L+IgsWFJgHCpmGQhI5WX5tucM4WZpUi1CoE2ZRbMRDce1tXg FSPXCPpsBkh25bRHvsnWHxzfZJPoynOfdXrkPIl5pX1OMTo3uKh8luoqVRMSKbRMYgjp EEiA== 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:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=75RedP2dVFMQzKMHGBxVanfJqJkUsoCP8gGeO3rhGWA=; b=XO4gILDq/5/65Aemb8VJQWO3YHuw5sLSR/Z6ty21i687QUbfXSVQUlxijJHS/qZD3s FNMPfS31o0HLL54wEeqP7JBlD+4JTgxC0RIzJRlYKAm3bHxdm7zVIJL3LoNYGimhUjoE A8QX1CLw+CBxKch5crqOIB9et3g4qiqgPZWXg5AzDtgMrEbAzdsO8Pab1Etdl56SmVSp Di95/jr/K+SWRFqD2CclRPPW5UAnXqPtQYHWdKfTuEyr9fWdBzO/+1kRqjsGnJcgBAuW CjSFZ/xytuCVcDbX5BDXtoPRHGPqPWcdtNhgWwvKOEQbsAvvslGX94TbOP4922qP/qnA W6zA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=EC0+HGMZ; 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=QUARANTINE 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 c18-v6si1684075wrn.225.2018.10.03.10.49.53; Wed, 03 Oct 2018 10:49:53 -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=@gmail.com header.s=20161025 header.b=EC0+HGMZ; 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=QUARANTINE 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 D82E068A3F8; Wed, 3 Oct 2018 20:49:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E1DA4689BE0 for ; Wed, 3 Oct 2018 20:49:24 +0300 (EEST) Received: by mail-qk1-f193.google.com with SMTP id 84-v6so4021012qkf.0 for ; Wed, 03 Oct 2018 10:49:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=xXZR3Qqo/vt3Cy9R8heg7Xqhw15Njgbln305yfVreWs=; b=EC0+HGMZvYg1eGth67i7PhB8a6gIdYDfN/QHW45r2TQUz8Jej8GUPvrWq0SqE7RvVT wV2ddwK6FAz1Pw3VbZhM1Lw7YKOMs2QSXbudA8KFYLSt6WRJmtIx5MPpKe5x2+PeqHHF w6NPWLeu72iweg4HifP4Inmgs72EZH/YOPfLbMBEB32coNpe42kyBbmnBRorcivRrXji 2DUStEVyN0loLN6Qf3N3FbZEi/7a2CgnskGtTMd7OTkxKWf7tsRJbb9IoYOdcnADktIt Mdvtn8bfhsNgLThBmuz1awubjtCBNWNJYkpL8gC43U2p1XwqI8dd+3XFXyS+NQtQ3W/p 64VQ== 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:mime-version :content-transfer-encoding; bh=xXZR3Qqo/vt3Cy9R8heg7Xqhw15Njgbln305yfVreWs=; b=ehYhhtI7tCKTuoNrIHqtVhspC1SKT36wHx7n0M6sbvwMzBcQ6h+Q25cC5nLBKHfmDU PTgerkhabR677lGdL9xdDXb5Orb8ydbSKWOaXsf3sgFnT7MteOStj9mGppMFgl1QLfN3 djqqTh42lZ0+Ek4OR7arjnO7bzc/fh1hBNmeny4vuuRm+jP0SftRMxS0fXIcha13XFka jcUuoQEJSBdEzjRURdvj/skVDradT15OKcfBJ7nGZAyyBTrM/PKy1UX9sUjoCg0p4w1o Gp6lbYe4fhudq2pQVaHjVP0GYNiLS+baAxmw2jaGSABc9ZU+JHwfxg+gvBqbxwSMgg62 7thQ== X-Gm-Message-State: ABuFfoiBxlpIWu8r3xOvyzLdkU053jeHrzWdplVrVXPMJDOaaxKYqVgy OmbHRE5dJPKsggjeGm8FJ0rHSWJW X-Received: by 2002:a37:9b82:: with SMTP id d124-v6mr2038377qke.231.1538588983272; Wed, 03 Oct 2018 10:49:43 -0700 (PDT) Received: from localhost.localdomain ([179.38.230.94]) by smtp.gmail.com with ESMTPSA id s13-v6sm1096681qtc.95.2018.10.03.10.49.42 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Oct 2018 10:49:42 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Oct 2018 14:49:21 -0300 Message-Id: <20181003174921.1176-1-jamrial@gmail.com> X-Mailer: git-send-email 2.19.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/vp9_parser: export profile and pixel format 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" Signed-off-by: James Almer --- libavcodec/vp9_parser.c | 82 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/libavcodec/vp9_parser.c b/libavcodec/vp9_parser.c index 9531f34a32..d4110f20bf 100644 --- a/libavcodec/vp9_parser.c +++ b/libavcodec/vp9_parser.c @@ -23,36 +23,114 @@ #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 colorspace, bits = avctx->profile <= 1 ? 0 : 1 + get_bits1(gb); // 0:8, 1:10, 2:12 + + colorspace = colorspaces[get_bits(gb, 3)]; + if (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; + 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 } } + }; + 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; - if ((res = init_get_bits8(&gb, data, size)) < 0) + if (!size || (res = init_get_bits8(&gb, data, size)) < 0) return size; // parsers can't return errors get_bits(&gb, 2); // frame marker profile = get_bits1(&gb); profile |= get_bits1(&gb) << 1; if (profile == 3) profile += get_bits1(&gb); + if (profile > 3) + return size; + avctx->profile = profile; 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; + if (profile >= 1) { + if ((read_colorspace_details(ctx, avctx, &gb)) < 0) + return size; + } else { + ctx->format = AV_PIX_FMT_YUV420P; + } + } + ctx->pict_type = AV_PICTURE_TYPE_P; ctx->key_frame = 0; } else { + if (get_bits_long(&gb, 24) != VP9_SYNCCODE) // synccode + return size; + if (read_colorspace_details(ctx, avctx, &gb) < 0) + return size; + ctx->pict_type = AV_PICTURE_TYPE_I; ctx->key_frame = 1; }