blob: 204308f08f36c67d5411ece2b892e5958ee74872 [file] [log] [blame]
/*
* Copyright (c) 2023, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
* and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
* License was not distributed with this source code in the LICENSE file, you
* can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
* Alliance for Open Media Patent License 1.0 was not distributed with this
* source code in the PATENTS file, you can obtain it at
* www.aomedia.org/license/patent.
*/
#ifndef OBU_OBU_HEADER_H_
#define OBU_OBU_HEADER_H_
#include <cstdint>
#include <vector>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "iamf/common/leb_generator.h"
#include "iamf/common/read_bit_buffer.h"
#include "iamf/common/write_bit_buffer.h"
#include "iamf/obu/types.h"
namespace iamf_tools {
/*!\brief A 5-bit enum for the type of OBU. */
enum ObuType : uint8_t {
kObuIaCodecConfig = 0,
kObuIaAudioElement = 1,
kObuIaMixPresentation = 2,
kObuIaParameterBlock = 3,
kObuIaTemporalDelimiter = 4,
kObuIaAudioFrame = 5,
kObuIaAudioFrameId0 = 6,
kObuIaAudioFrameId1 = 7,
kObuIaAudioFrameId2 = 8,
kObuIaAudioFrameId3 = 9,
kObuIaAudioFrameId4 = 10,
kObuIaAudioFrameId5 = 11,
kObuIaAudioFrameId6 = 12,
kObuIaAudioFrameId7 = 13,
kObuIaAudioFrameId8 = 14,
kObuIaAudioFrameId9 = 15,
kObuIaAudioFrameId10 = 16,
kObuIaAudioFrameId11 = 17,
kObuIaAudioFrameId12 = 18,
kObuIaAudioFrameId13 = 19,
kObuIaAudioFrameId14 = 20,
kObuIaAudioFrameId15 = 21,
kObuIaAudioFrameId16 = 22,
kObuIaAudioFrameId17 = 23,
kObuIaReserved24 = 24,
kObuIaReserved25 = 25,
kObuIaReserved26 = 26,
kObuIaReserved27 = 27,
kObuIaReserved28 = 28,
kObuIaReserved29 = 29,
kObuIaReserved30 = 30,
kObuIaSequenceHeader = 31,
};
struct HeaderMetadata {
ObuType obu_type;
int64_t total_obu_size;
};
struct ObuHeader {
friend bool operator==(const ObuHeader& lhs, const ObuHeader& rhs) = default;
/*!\brief Validates and writes an `ObuHeader`.
*
* \param payload_serialized_size `payload_serialized_size` of the output OBU.
* The value MUST be able to be cast to `uint32_t` without losing data.
* \param wb Buffer to write to.
* \return `absl::OkStatus()` if successful. `absl::InvalidArgumentError()`
* if the fields are invalid or inconsistent or if writing the
* `Leb128` representation of `obu_size` fails.
* `absl::InvalidArgumentError()` if fields are set inconsistent with
* the IAMF specification or if the calculated `obu_size_` larger
* than IAMF limitations. Or a specific status if the write fails.
*/
absl::Status ValidateAndWrite(int64_t payload_serialized_size,
WriteBitBuffer& wb) const;
/*!\brief Validates and reads an `ObuHeader`.
*
* \param rb Buffer to read from.
* \param output_payload_serialized_size `output_payload_serialized_size` Size
* of the payload of the OBU.
* \return `absl::OkStatus()` if successful. `absl::InvalidArgumentError()` if
* the fields are invalid or set in a manner that is inconsistent with
* the IAMF specification.
*/
absl::Status ReadAndValidate(ReadBitBuffer& rb,
int64_t& output_payload_serialized_size);
/*!\brief Prints logging information about an `ObuHeader`.
*
* \param leb_generator `LebGenerator` to use when calculating `obu_size_`.
* \param payload_serialized_size `payload_serialized_size` of the output OBU.
* The value MUST be able to be cast to `uint32_t` without losing data.
*/
void Print(const LebGenerator& leb_generator,
int64_t payload_serialized_size) const;
/*!\brief Peeks the type and total OBU size from the bitstream.
*
* This function does not consume any data from the bitstream.
*
* \param rb Buffer to read from.
* \return `HeaderMetadata` containing the OBU type and total OBU size if
* successful. Returns an absl::ResourceExhaustedError if there is not
* enough data to read the obu_type and obu_size. Returns other errors
* if the bitstream is invalid.
*/
static absl::StatusOr<HeaderMetadata> PeekObuTypeAndTotalObuSize(
ReadBitBuffer& rb);
static bool IsTemporalUnitObuType(ObuType obu_type);
ObuType obu_type;
// `obu_size` is inserted automatically.
bool obu_redundant_copy = false;
bool obu_trimming_status_flag = false;
bool obu_extension_flag = false;
DecodedUleb128 num_samples_to_trim_at_end = 0;
DecodedUleb128 num_samples_to_trim_at_start = 0;
DecodedUleb128 extension_header_size = 0;
std::vector<uint8_t> extension_header_bytes = {};
};
} // namespace iamf_tools
#endif // OBU_OBU_HEADER_H_