/*
 * Copyright 2022 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "bitstreams/nalu_parser.h"

#include <assert.h>

uint8_t* find_next_nalu(uint8_t* start_pos, uint8_t* end_pos) {
  uint8_t* next_nalu_pos = start_pos;
  // Initializes "previous byte" buffers b0, b1, b2 so they won't match the
  // NALU start code sequence
  uint8_t b0 = 0xFF; // b0 holds *(next_nalu_pos-2)
  uint8_t b1 = 0xFF; // b1 holds *(next_nalu_pos-1)
  uint8_t b2 = 0xFF; // b2 holds *(next_nalu_pos)
  while (next_nalu_pos < end_pos) {
    b0 = b1;
    b1 = b2;
    b2 = *(++next_nalu_pos);
    // Checks to see if a nalu started an next_nalu_pos - 2
    if (b0 == 0x00 && b1 == 0x00 && b2 == 0x01)
      return next_nalu_pos - 2;
  }
  return NULL;
}

Nalu tokenize_nalu(uint8_t* curr_pos, uint8_t* end_pos) {
  assert(end_pos > curr_pos + NALU_SIGNATURE_SIZE);
  assert(*curr_pos == 0x00);
  assert(*(curr_pos + 1) == 0x00);
  assert(*(curr_pos + 2) == 0x01);
  uint8_t* next_nalu = find_next_nalu(curr_pos + NALU_SIGNATURE_SIZE, end_pos);
  Nalu nalu= {.data=curr_pos,
              .size=(next_nalu ? next_nalu : end_pos) - curr_pos};
  return nalu;
}
