/*
 *  Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef MODULES_RTP_RTCP_SOURCE_RTP_PACKETIZER_AV1_TEST_HELPER_H_
#define MODULES_RTP_RTCP_SOURCE_RTP_PACKETIZER_AV1_TEST_HELPER_H_

#include <stddef.h>
#include <stdint.h>

#include <initializer_list>
#include <utility>
#include <vector>

namespace webrtc {
// All obu types offset by 3 to take correct position in the obu_header.
constexpr uint8_t kAv1ObuTypeSequenceHeader = 1 << 3;
constexpr uint8_t kAv1ObuTypeTemporalDelimiter = 2 << 3;
constexpr uint8_t kAv1ObuTypeFrameHeader = 3 << 3;
constexpr uint8_t kAv1ObuTypeTileGroup = 4 << 3;
constexpr uint8_t kAv1ObuTypeMetadata = 5 << 3;
constexpr uint8_t kAv1ObuTypeFrame = 6 << 3;
constexpr uint8_t kAv1ObuTypeTileList = 8 << 3;
constexpr uint8_t kAv1ObuExtensionPresentBit = 0b0'0000'100;
constexpr uint8_t kAv1ObuSizePresentBit = 0b0'0000'010;
constexpr uint8_t kAv1ObuExtensionS1T1 = 0b001'01'000;

class Av1Obu {
 public:
  explicit Av1Obu(uint8_t obu_type);

  Av1Obu& WithExtension(uint8_t extension);
  Av1Obu& WithoutSize();
  Av1Obu& WithPayload(std::vector<uint8_t> payload);

 private:
  friend std::vector<uint8_t> BuildAv1Frame(std::initializer_list<Av1Obu> obus);
  uint8_t header_;
  uint8_t extension_ = 0;
  std::vector<uint8_t> payload_;
};

std::vector<uint8_t> BuildAv1Frame(std::initializer_list<Av1Obu> obus);

}  // namespace webrtc
#endif  // MODULES_RTP_RTCP_SOURCE_RTP_PACKETIZER_AV1_TEST_HELPER_H_
