blob: d6bc771aabcd58130a399da9aed269570ab915a3 [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_ARBITRARY_OBU_H_
#define OBU_ARBITRARY_OBU_H_
#include <cstdint>
#include <list>
#include <optional>
#include <vector>
#include "absl/status/status.h"
#include "iamf/common/read_bit_buffer.h"
#include "iamf/common/write_bit_buffer.h"
#include "iamf/obu/obu_base.h"
#include "iamf/obu/obu_header.h"
namespace iamf_tools {
/*!\brief An arbitrary OBU.
*
* This class is useful to create edge-cases, invalid streams, or to allow
* encoding features that are not otherwise directly supported.
*
* Usually this class is used in a way that means any side effects of the OBU
* are not taken into account.
*/
class ArbitraryObu : public ObuBase {
public:
/*!\brief A hook describing how the OBU will be put into the bitstream. */
enum InsertionHook {
kInsertionHookBeforeDescriptors,
kInsertionHookAfterDescriptors,
kInsertionHookAfterIaSequenceHeader,
kInsertionHookAfterCodecConfigs,
kInsertionHookAfterAudioElements,
kInsertionHookAfterMixPresentations,
kInsertionHookBeforeParameterBlocksAtTick,
kInsertionHookAfterParameterBlocksAtTick,
kInsertionHookAfterAudioFramesAtTick,
};
/*!\brief Constructor.
*
* \param obu_type Type of the OBU.
* \param header Header of the OBU.
* \param payload Payload of the OBU.
* \param insertion_hook Hook describing when to insert the OBU.
* \param insertion_tick Optional hook to describe the tick to insert the OBU.
* \param invalidates_bitstream Whether writing the OBU invalidates the
* bitstream.
*/
ArbitraryObu(ObuType obu_type, const ObuHeader& header,
const std::vector<uint8_t>& payload,
InsertionHook insertion_hook,
const std::optional<int64_t>& insertion_tick = std::nullopt,
bool invalidates_bitstream = false)
: ObuBase(header, obu_type),
payload_(payload),
insertion_hook_(insertion_hook),
insertion_tick_(insertion_tick),
invalidates_bitstream_(invalidates_bitstream) {}
/*!\brief Destructor. */
~ArbitraryObu() override = default;
friend bool operator==(const ArbitraryObu& lhs,
const ArbitraryObu& rhs) = default;
/*!\brief Writes arbitrary OBUs with the specified hook.
*
* \param insertion_hook Hook of OBUs to write.
* \param arbitrary_obus Arbitrary OBUs to write.
* \param wb Write buffer to write to.
* \return `absl::OkStatus()` on success. A specific status if
* writing any of the OBUs fail.
*/
static absl::Status WriteObusWithHook(
InsertionHook insertion_hook,
const std::list<ArbitraryObu>& arbitrary_obus, WriteBitBuffer& wb);
/*!\brief Prints logging information about the OBU.*/
void PrintObu() const override;
const std::vector<uint8_t> payload_;
// Metadata.
const InsertionHook insertion_hook_;
const std::optional<int64_t> insertion_tick_;
const bool invalidates_bitstream_;
private:
/*!\brief Writes the OBU payload to the buffer.
*
* \param wb Buffer to write to.
* \return `absl::OkStatus()` if the OBU is valid. A specific error if
* ` invalidates_bitstream_` is true. Other specific statuses on failure.
*/
absl::Status ValidateAndWritePayload(WriteBitBuffer& wb) const override;
/*!\brief Reads the OBU payload from the buffer.
*
* \param payload_size Size of the obu payload in bytes.
* \param rb Buffer to read from.
* \return `absl::OkStatus()` if the payload is valid. A specific status on
* failure.
*/
absl::Status ReadAndValidatePayloadDerived(int64_t payload_size,
ReadBitBuffer& rb) override;
};
} // namespace iamf_tools
#endif // OBU_ARBITRARY_OBU_H_