blob: a57de790d3df2e4fcfff4e1a4b66d68d8d90425a [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_AUDIO_FRAME_H_
#define OBU_AUDIO_FRAME_H_
#include <cstdint>
#include <vector>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/types/span.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"
#include "iamf/obu/types.h"
namespace iamf_tools {
/*!\brief The Audio Frame OBU.
*
* The length and meaning of the `audio_frame` field depends on the associated
* `CodecConfigObu` and `AudioElementObu`.
*
* For IAMF-OPUS the field represents an opus packet of RFC6716.
* For IAMF-AAC-LC the field represents an raw_data_block() of the AAC spec.
* For IAMF-FLAC the field represents an FRAME of the FLAC spec.
* For IAMF-LPCM the field represents PCM samples. When more than one byte is
* used to represent a PCM sample, the byte order (i.e. its endianness) is
* indicated in `sample_format_flags` from the corresponding `CodecConfigObu`.
*/
class AudioFrameObu : public ObuBase {
public:
/*!\brief Creates an `AudioFrameObu` from a `ReadBitBuffer`.
*
* This function is designed to be used from the perspective of the decoder.
* It will call `ReadAndValidatePayload` in order to read from the buffer;
* therefore it can fail.
*
* \param header `ObuHeader` of the OBU.
* \param payload_size Size of the obu payload in bytes.
* \param rb `ReadBitBuffer` where the `AudioFrameObu` data is stored.
* Data read from the buffer is consumed.
* \return a `AudioFrameObu` on success. A specific status on failure.
*/
static absl::StatusOr<AudioFrameObu> CreateFromBuffer(const ObuHeader& header,
int64_t payload_size,
ReadBitBuffer& rb);
/*!\brief Constructor.
*
* \param header `ObuHeader` of the OBU.
* \param substream_id Substream ID.
* \param audio_frame Audio frame.
*/
AudioFrameObu(const ObuHeader& header, DecodedUleb128 substream_id,
absl::Span<const uint8_t> audio_frame);
/*!\brief Destructor.*/
~AudioFrameObu() = default;
friend bool operator==(const AudioFrameObu& lhs,
const AudioFrameObu& rhs) = default;
/*!\brief Prints logging information about the OBU.*/
void PrintObu() const override;
/*!\brief Gets the substream ID of the OBU.
* \return Substream ID.
*/
DecodedUleb128 GetSubstreamId() const { return audio_substream_id_; }
std::vector<uint8_t> audio_frame_;
private:
// This field is not serialized when in the range [0, 17].
DecodedUleb128 audio_substream_id_;
// Used only by the factory create function.
explicit AudioFrameObu(const ObuHeader& header)
: ObuBase(header, header.obu_type),
audio_frame_({}),
audio_substream_id_(DecodedUleb128()) {}
/*!\brief Writes the OBU payload to the buffer.
*
* \param wb Buffer to write to.
* \return `absl::OkStatus()` if the OBU is valid. A specific status 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_AUDIO_FRAME_H_