blob: 897c99f00dad412cf347d014f12e5455a8339cfb [file] [log] [blame]
/*
* Copyright 2020 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_DECODER_STATE_H_
#define LIBGAV1_SRC_DECODER_STATE_H_
#include <array>
#include <cstdint>
#include "src/buffer_pool.h"
#include "src/utils/constants.h"
namespace libgav1 {
struct DecoderState {
// Section 7.20. Updates frames in the reference_frame array with
// |current_frame|, based on the |refresh_frame_flags| bitmask.
void UpdateReferenceFrames(const RefCountedBufferPtr& current_frame,
int refresh_frame_flags) {
for (int ref_index = 0, mask = refresh_frame_flags; mask != 0;
++ref_index, mask >>= 1) {
if ((mask & 1) != 0) {
reference_valid[ref_index] = true;
reference_frame_id[ref_index] = current_frame_id;
reference_frame[ref_index] = current_frame;
reference_order_hint[ref_index] = order_hint;
}
}
}
// Clears all the reference frames.
void ClearReferenceFrames() {
reference_valid = {};
reference_frame_id = {};
reference_order_hint = {};
for (int ref_index = 0; ref_index < kNumReferenceFrameTypes; ++ref_index) {
reference_frame[ref_index] = nullptr;
}
}
// reference_valid and reference_frame_id are used only if
// sequence_header_.frame_id_numbers_present is true.
// The reference_valid array is indexed by a reference picture slot number.
// A value (boolean) in the array signifies whether the corresponding
// reference picture slot is valid for use as a reference picture.
std::array<bool, kNumReferenceFrameTypes> reference_valid = {};
std::array<uint16_t, kNumReferenceFrameTypes> reference_frame_id = {};
// A valid value of current_frame_id is an unsigned integer of at most 16
// bits. -1 indicates current_frame_id is not initialized.
int current_frame_id = -1;
// The RefOrderHint array variable in the spec.
std::array<uint8_t, kNumReferenceFrameTypes> reference_order_hint = {};
// The OrderHint variable in the spec. Its value comes from either the
// order_hint syntax element in the uncompressed header (if
// show_existing_frame is false) or RefOrderHint[ frame_to_show_map_idx ]
// (if show_existing_frame is true and frame_type is KEY_FRAME). See Section
// 5.9.2 and Section 7.4.
//
// NOTE: When show_existing_frame is false, it is often more convenient to
// just use the order_hint field of the frame header as OrderHint. So this
// field is mainly used to update the reference_order_hint array in
// UpdateReferenceFrames().
uint8_t order_hint = 0;
// reference_frame_sign_bias[i] (a boolean) specifies the intended direction
// of the motion vector in time for each reference frame.
// * |false| indicates that the reference frame is a forwards reference (i.e.
// the reference frame is expected to be output before the current frame);
// * |true| indicates that the reference frame is a backwards reference.
// Note: reference_frame_sign_bias[0] (for kReferenceFrameIntra) is not used.
std::array<bool, kNumReferenceFrameTypes> reference_frame_sign_bias = {};
std::array<RefCountedBufferPtr, kNumReferenceFrameTypes> reference_frame;
};
} // namespace libgav1
#endif // LIBGAV1_SRC_DECODER_STATE_H_