/*
 *  Copyright (c) 2016 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 COMMON_VIDEO_H264_H264_COMMON_H_
#define COMMON_VIDEO_H264_H264_COMMON_H_

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

#include <span>
#include <vector>

#include "rtc_base/buffer.h"
#include "rtc_base/system/rtc_export.h"

namespace webrtc {

namespace H264 {
// The size of a full NALU start sequence {0 0 0 1}, used for the first NALU
// of an access unit, and for SPS and PPS blocks.
inline constexpr size_t kNaluLongStartSequenceSize = 4;

// The size of a shortened NALU start sequence {0 0 1}, that may be used if
// not the first NALU of an access unit or an SPS or PPS block.
inline constexpr size_t kNaluShortStartSequenceSize = 3;

// The size of the NALU type byte (1).
inline constexpr size_t kNaluTypeSize = 1;

// Maximum reference index for reference pictures.
inline constexpr int kMaxReferenceIndex = 31;

// Maximum SPS ID allowed by H.264 spec (Table 7-1 / 7.4.2.1.1).
inline constexpr int kMaxSpsId = 31;

// Maximum PPS ID allowed by H.264 spec (Table 7-1 / 7.4.2.2).
inline constexpr int kMaxPpsId = 255;

// H.264 Level 5.2 limits (Table A-1 and Section A.3.1):
// Max macroblocks per frame (MaxFS) = 36864.
// Max width/height in macroblocks = Sqrt(MaxFS * 8) = 543.
// A macroblock is 16x16 pixels.
inline constexpr int kMaxMacroblockFrameSizeLevel52 = 36864;
inline constexpr int kMaxMacroblockDimensionLevel52 = 543;
inline constexpr int kMaxPixelDimensionLevel52 =
    kMaxMacroblockDimensionLevel52 * 16;

// Returns true if the resolution complies with H.264 Level 5.2 limits.
inline bool IsValidResolution(int64_t width, int64_t height) {
  if (width <= 0 || height <= 0 || width > kMaxPixelDimensionLevel52 ||
      height > kMaxPixelDimensionLevel52) {
    return false;
  }
  const int64_t width_in_mbs = (width + 15) / 16;
  const int64_t height_in_mbs = (height + 15) / 16;
  return width_in_mbs * height_in_mbs <= kMaxMacroblockFrameSizeLevel52;
}

enum NaluType : uint8_t {
  kSlice = 1,
  kIdr = 5,
  kSei = 6,
  kSps = 7,
  kPps = 8,
  kAud = 9,
  kEndOfSequence = 10,
  kEndOfStream = 11,
  kFiller = 12,
  kPrefix = 14,
  kStapA = 24,
  kFuA = 28
};

enum SliceType : uint8_t { kP = 0, kB = 1, kI = 2, kSp = 3, kSi = 4 };

struct NaluIndex {
  // Start index of NALU, including start sequence.
  size_t start_offset;
  // Start index of NALU payload, typically type header.
  size_t payload_start_offset;
  // Length of NALU payload, in bytes, counting from payload_start_offset.
  size_t payload_size;
};

// Returns a vector of the NALU indices in the given buffer.
RTC_EXPORT std::vector<NaluIndex> FindNaluIndices(
    std::span<const uint8_t> buffer);

// Get the NAL type from the header byte immediately following start sequence.
RTC_EXPORT NaluType ParseNaluType(uint8_t data);

// Methods for parsing and writing RBSP. See section 7.4.1 of the H264 spec.
//
// The following sequences are illegal, and need to be escaped when encoding:
// 00 00 00 -> 00 00 03 00
// 00 00 01 -> 00 00 03 01
// 00 00 02 -> 00 00 03 02
// And things in the source that look like the emulation byte pattern (00 00 03)
// need to have an extra emulation byte added, so it's removed when decoding:
// 00 00 03 -> 00 00 03 03
//
// Decoding is simply a matter of finding any 00 00 03 sequence and removing
// the 03 emulation byte.

// Parse the given data and remove any emulation byte escaping.
std::vector<uint8_t> ParseRbsp(std::span<const uint8_t> data);

// TODO: bugs.webrtc.org/42225170 - Deprecate.
inline std::vector<uint8_t> ParseRbsp(const uint8_t* data, size_t length) {
  return ParseRbsp(std::span(data, length));
}

// Write the given data to the destination buffer, inserting and emulation
// bytes in order to escape any data the could be interpreted as a start
// sequence.
void WriteRbsp(std::span<const uint8_t> bytes, Buffer* destination);

// TODO: bugs.webrtc.org/42225170 - Deprecate.
inline void WriteRbsp(const uint8_t* bytes,
                      size_t length,
                      Buffer* destination) {
  WriteRbsp(std::span(bytes, length), destination);
}
}  // namespace H264
}  // namespace webrtc

#endif  // COMMON_VIDEO_H264_H264_COMMON_H_
