/*
 * Copyright 2019 The libgav1 Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef LIBGAV1_SRC_DSP_COMMON_H_
#define LIBGAV1_SRC_DSP_COMMON_H_

#include <cstdint>

#include "src/dsp/constants.h"
#include "src/utils/constants.h"
#include "src/utils/memory.h"

namespace libgav1 {

enum { kSgrStride = kRestorationUnitWidth + 8 };  // anonymous enum

// Self guided projection filter.
struct SgrProjInfo {
  int index;
  int multiplier[2];
};

struct WienerInfo {
  static const int kVertical = 0;
  static const int kHorizontal = 1;
  int16_t number_leading_zero_coefficients[2];
  alignas(kMaxAlignment) int16_t filter[2][(kWienerFilterTaps + 1) / 2];
};

struct RestorationUnitInfo : public MaxAlignedAllocable {
  LoopRestorationType type;
  SgrProjInfo sgr_proj_info;
  WienerInfo wiener_info;
};

struct SgrBuffer {
  alignas(kMaxAlignment) uint16_t sum3[4 * kSgrStride];
  alignas(kMaxAlignment) uint16_t sum5[5 * kSgrStride];
  alignas(kMaxAlignment) uint32_t square_sum3[4 * kSgrStride];
  alignas(kMaxAlignment) uint32_t square_sum5[5 * kSgrStride];
  alignas(kMaxAlignment) uint16_t ma343[4 * kRestorationUnitWidth];
  alignas(kMaxAlignment) uint16_t ma444[3 * kRestorationUnitWidth];
  alignas(kMaxAlignment) uint16_t ma565[2 * kRestorationUnitWidth];
  alignas(kMaxAlignment) uint32_t b343[4 * kRestorationUnitWidth];
  alignas(kMaxAlignment) uint32_t b444[3 * kRestorationUnitWidth];
  alignas(kMaxAlignment) uint32_t b565[2 * kRestorationUnitWidth];
  alignas(kMaxAlignment) uint16_t
      temp_buffer[12 * (kRestorationUnitHeight + 2)];
  alignas(kMaxAlignment) uint8_t ma[kSgrStride];  // [0, 255]
  // b is less than 2^16 for 8-bit. However, making it a template slows down the
  // C function by 5%. So b is fixed to 32-bit.
  alignas(kMaxAlignment) uint32_t b[kSgrStride];
};

union RestorationBuffer {
  // For self-guided filter.
  SgrBuffer sgr_buffer;
  // For wiener filter.
  // The array |intermediate| in Section 7.17.4, the intermediate results
  // between the horizontal and vertical filters.
  alignas(kMaxAlignment) int16_t
      wiener_buffer[(kRestorationUnitHeight + kWienerFilterTaps - 1) *
                    kRestorationUnitWidth];
};

}  // namespace libgav1

#endif  // LIBGAV1_SRC_DSP_COMMON_H_
