From patchwork Tue Jul 30 20:19:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 14150 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 9DD9A447006 for ; Tue, 30 Jul 2019 23:22:03 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 86E97689A6C; Tue, 30 Jul 2019 23:22:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f195.google.com (mail-qk1-f195.google.com [209.85.222.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8D127680D20 for ; Tue, 30 Jul 2019 23:21:56 +0300 (EEST) Received: by mail-qk1-f195.google.com with SMTP id v22so47535563qkj.8 for ; Tue, 30 Jul 2019 13:21:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=v2scriCR654pn3s+BdLgq8lIwqYl4KYE7+9wZLjtxFc=; b=CGfd2Uiby8FY9RLWnIixZQAvS6oTeR/AbmSQ45KoFjNPh/+4u0qo0jTdbOV/gVbzl6 rfLXm8FzId1nltd9X0Gf8z0irtemNhSmkMUmpe2xQVQVItnzSOQ+YSagVo7knkozxJNF t/aKZPRvZ8KkKGXZ2TiPJ98qnsc16/XNxKR3IV1Cp/UnW9SZXvU3FFkq6r/ayDDTyMK/ PxJcP2uarbZ8WOYcbdb8UUsWwQKyZMCVeqjvMOZpqgxsoWhI37M/51F0cGOTA/MEqtq+ qfES4qlGfwb1LMS/SV9fO3awsz0Z8pK6w7b1v6hnPFQUaxQ1eC33AaI58DAmV0Z1OSRA BEvw== 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:mime-version:content-transfer-encoding; bh=v2scriCR654pn3s+BdLgq8lIwqYl4KYE7+9wZLjtxFc=; b=Dms595z8o2dIxuu2lhVC7i+oamgEG8k+6VCaO9V8g3Vogzhz37TmIwEa/HUBfV/gg9 kH7ts1X8g2Cv8QgSgRjkboS3aC0Bm/nhOrxss7WWCQ4rTzwjwyiWGzuIxtkz0mUjgyNP 9tFj7ZPm00iIHmKorRohWD/i64qfWQtrKsBJbvwxJ655upWtZZ8lNMY6o3eE5qIqYMQw wesOLME5rZMeipCqhRGpbXQof6/58TloXwFnTZ61UTqUGyb4k0YJ7hUjE84k0d43MJvl vLfo9L0x7ufUlqSx/oCyWU8cwWt9v8zAYPKOUOypabNB3NIrL30gI5pSkVQPUsuBlU5M sJVw== X-Gm-Message-State: APjAAAWkszHWTHK6vdAEwHaFb+c5kxRJM3A7biAeNKFCvhUCb9nT105t 0UFgOJoZ7EOgGJrZA65YcGp7oAdq X-Google-Smtp-Source: APXvYqxzoasyqk5UmnszH4jKGTZ2dhT1s7Y3TlIta+NOW9U7fAcTCJ0iTdazB34x2L3W9qtLFc3QVw== X-Received: by 2002:a37:ac19:: with SMTP id e25mr78121919qkm.155.1564518115268; Tue, 30 Jul 2019 13:21:55 -0700 (PDT) Received: from localhost.localdomain ([191.83.214.187]) by smtp.gmail.com with ESMTPSA id r36sm35243859qte.71.2019.07.30.13.21.54 for (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 30 Jul 2019 13:21:55 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 30 Jul 2019 17:19:45 -0300 Message-Id: <20190730201951.2033-2-jamrial@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190730201951.2033-1-jamrial@gmail.com> References: <20190730201951.2033-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/7] avformat/av1: split off sequence header parsing from the av1C writing function 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" It will be used by the dash muxer Signed-off-by: James Almer --- libavformat/av1.c | 47 ++++++++++++++++++++++++++++++----------------- libavformat/av1.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/libavformat/av1.c b/libavformat/av1.c index bd23891d26..cc8918e577 100644 --- a/libavformat/av1.c +++ b/libavformat/av1.c @@ -76,23 +76,6 @@ int ff_av1_filter_obus_buf(const uint8_t *buf, uint8_t **out, int *size) return ret; } -typedef struct AV1SequenceParameters { - uint8_t seq_profile; - uint8_t seq_level_idx_0; - uint8_t seq_tier_0; - uint8_t high_bitdepth; - uint8_t twelve_bit; - uint8_t monochrome; - uint8_t chroma_subsampling_x; - uint8_t chroma_subsampling_y; - uint8_t chroma_sample_position; - uint8_t color_description_present_flag; - uint8_t color_primaries; - uint8_t transfer_characteristics; - uint8_t matrix_coefficients; - uint8_t color_range; -} AV1SequenceParameters; - static inline void uvlc(GetBitContext *gb) { int leading_zeros = 0; @@ -301,6 +284,36 @@ static int parse_sequence_header(AV1SequenceParameters *seq_params, const uint8_ return 0; } +int ff_av1_parse_seq_header(AV1SequenceParameters *seq, const uint8_t *buf, int size) +{ + int64_t obu_size; + int start_pos, type, temporal_id, spatial_id; + + if (size <= 0) + return AVERROR_INVALIDDATA; + + while (size > 0) { + int len = parse_obu_header(buf, size, &obu_size, &start_pos, + &type, &temporal_id, &spatial_id); + if (len < 0) + return len; + + switch (type) { + case AV1_OBU_SEQUENCE_HEADER: + if (!obu_size) + return AVERROR_INVALIDDATA; + + return parse_sequence_header(seq, buf + start_pos, obu_size); + default: + break; + } + size -= len; + buf += len; + } + + return AVERROR_INVALIDDATA; +} + int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size) { AVIOContext *seq_pb = NULL, *meta_pb = NULL; diff --git a/libavformat/av1.h b/libavformat/av1.h index dc872e5c59..e3ee667eb3 100644 --- a/libavformat/av1.h +++ b/libavformat/av1.h @@ -25,6 +25,23 @@ #include "avio.h" +typedef struct AV1SequenceParameters { + uint8_t seq_profile; + uint8_t seq_level_idx_0; + uint8_t seq_tier_0; + uint8_t high_bitdepth; + uint8_t twelve_bit; + uint8_t monochrome; + uint8_t chroma_subsampling_x; + uint8_t chroma_subsampling_y; + uint8_t chroma_sample_position; + uint8_t color_description_present_flag; + uint8_t color_primaries; + uint8_t transfer_characteristics; + uint8_t matrix_coefficients; + uint8_t color_range; +} AV1SequenceParameters; + /** * Filter out AV1 OBUs not meant to be present in ISOBMFF sample data and write * the resulting bitstream to the provided AVIOContext. @@ -55,6 +72,18 @@ int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size); */ int ff_av1_filter_obus_buf(const uint8_t *buf, uint8_t **out, int *size); +/** + * Parses a Sequence Header from the the provided buffer. + * + * @param seq pointer to the AV1SequenceParameters where the parsed values will + * be written + * @param buf input data buffer + * @param size size in bytes of the input data buffer + * + * @return >= 0 in case of success, a negative AVERROR code in case of failure + */ +int ff_av1_parse_seq_header(AV1SequenceParameters *seq, const uint8_t *buf, int size); + /** * Writes AV1 extradata (Sequence Header and Metadata OBUs) to the provided * AVIOContext.