vp9: Cleanup unused variables
With reference frames refreshes fix, we no longer need to buffer two frames in advance. We can also remove other unused or otherwise unneeded variables.pull/6799/head
parent
a3f80a97a3
commit
e3688f0627
|
|
@ -11,6 +11,9 @@
|
||||||
|
|
||||||
namespace Tegra::Decoder {
|
namespace Tegra::Decoder {
|
||||||
namespace {
|
namespace {
|
||||||
|
constexpr u32 diff_update_probability = 252;
|
||||||
|
constexpr u32 frame_sync_code = 0x498342;
|
||||||
|
|
||||||
// Default compressed header probabilities once frame context resets
|
// Default compressed header probabilities once frame context resets
|
||||||
constexpr Vp9EntropyProbs default_probs{
|
constexpr Vp9EntropyProbs default_probs{
|
||||||
.y_mode_prob{
|
.y_mode_prob{
|
||||||
|
|
@ -361,8 +364,7 @@ Vp9PictureInfo VP9::GetVp9PictureInfo(const NvdecCommon::NvdecRegisters& state)
|
||||||
InsertEntropy(state.vp9_entropy_probs_offset, vp9_info.entropy);
|
InsertEntropy(state.vp9_entropy_probs_offset, vp9_info.entropy);
|
||||||
|
|
||||||
// surface_luma_offset[0:3] contains the address of the reference frame offsets in the following
|
// surface_luma_offset[0:3] contains the address of the reference frame offsets in the following
|
||||||
// order: last, golden, altref, current. It may be worthwhile to track the updates done here
|
// order: last, golden, altref, current.
|
||||||
// to avoid buffering frame data needed for reference frame updating in the header composition.
|
|
||||||
std::copy(state.surface_luma_offset.begin(), state.surface_luma_offset.begin() + 4,
|
std::copy(state.surface_luma_offset.begin(), state.surface_luma_offset.begin() + 4,
|
||||||
vp9_info.frame_offsets.begin());
|
vp9_info.frame_offsets.begin());
|
||||||
|
|
||||||
|
|
@ -384,33 +386,18 @@ Vp9FrameContainer VP9::GetCurrentFrame(const NvdecCommon::NvdecRegisters& state)
|
||||||
gpu.MemoryManager().ReadBlock(state.frame_bitstream_offset, current_frame.bit_stream.data(),
|
gpu.MemoryManager().ReadBlock(state.frame_bitstream_offset, current_frame.bit_stream.data(),
|
||||||
current_frame.info.bitstream_size);
|
current_frame.info.bitstream_size);
|
||||||
}
|
}
|
||||||
// Buffer two frames, saving the last show frame info
|
if (!next_frame.bit_stream.empty()) {
|
||||||
if (!next_next_frame.bit_stream.empty()) {
|
|
||||||
Vp9FrameContainer temp{
|
Vp9FrameContainer temp{
|
||||||
.info = current_frame.info,
|
.info = current_frame.info,
|
||||||
.bit_stream = std::move(current_frame.bit_stream),
|
.bit_stream = std::move(current_frame.bit_stream),
|
||||||
};
|
};
|
||||||
next_next_frame.info.show_frame = current_frame.info.last_frame_shown;
|
next_frame.info.show_frame = current_frame.info.last_frame_shown;
|
||||||
current_frame.info = next_next_frame.info;
|
current_frame.info = next_frame.info;
|
||||||
current_frame.bit_stream = std::move(next_next_frame.bit_stream);
|
current_frame.bit_stream = std::move(next_frame.bit_stream);
|
||||||
next_next_frame = std::move(temp);
|
next_frame = std::move(temp);
|
||||||
|
|
||||||
if (!next_frame.bit_stream.empty()) {
|
|
||||||
Vp9FrameContainer temp2{
|
|
||||||
.info = current_frame.info,
|
|
||||||
.bit_stream = std::move(current_frame.bit_stream),
|
|
||||||
};
|
|
||||||
next_frame.info.show_frame = current_frame.info.last_frame_shown;
|
|
||||||
current_frame.info = next_frame.info;
|
|
||||||
current_frame.bit_stream = std::move(next_frame.bit_stream);
|
|
||||||
next_frame = std::move(temp2);
|
|
||||||
} else {
|
|
||||||
next_frame.info = current_frame.info;
|
|
||||||
next_frame.bit_stream = std::move(current_frame.bit_stream);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
next_next_frame.info = current_frame.info;
|
next_frame.info = current_frame.info;
|
||||||
next_next_frame.bit_stream = std::move(current_frame.bit_stream);
|
next_frame.bit_stream = std::move(current_frame.bit_stream);
|
||||||
}
|
}
|
||||||
return current_frame;
|
return current_frame;
|
||||||
}
|
}
|
||||||
|
|
@ -616,13 +603,7 @@ VpxBitStreamWriter VP9::ComposeUncompressedHeader() {
|
||||||
swap_ref_indices = false;
|
swap_ref_indices = false;
|
||||||
loop_filter_ref_deltas.fill(0);
|
loop_filter_ref_deltas.fill(0);
|
||||||
loop_filter_mode_deltas.fill(0);
|
loop_filter_mode_deltas.fill(0);
|
||||||
|
frame_ctxs.fill(default_probs);
|
||||||
// allow frames offsets to stabilize before checking for golden frames
|
|
||||||
grace_period = 4;
|
|
||||||
|
|
||||||
// On key frames, all frame slots are set to the current frame,
|
|
||||||
// so the value of the selected slot doesn't really matter.
|
|
||||||
frame_ctxs.fill({current_frame_number, false, default_probs});
|
|
||||||
|
|
||||||
// intra only, meaning the frame can be recreated with no other references
|
// intra only, meaning the frame can be recreated with no other references
|
||||||
current_frame_info.intra_only = true;
|
current_frame_info.intra_only = true;
|
||||||
|
|
@ -698,10 +679,9 @@ VpxBitStreamWriter VP9::ComposeUncompressedHeader() {
|
||||||
frame_ctx_idx = 1;
|
frame_ctx_idx = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uncomp_writer.WriteU(frame_ctx_idx, 2); // Frame context index.
|
uncomp_writer.WriteU(frame_ctx_idx, 2); // Frame context index.
|
||||||
prev_frame_probs =
|
prev_frame_probs = frame_ctxs[frame_ctx_idx]; // reference probabilities for compressed header
|
||||||
frame_ctxs[frame_ctx_idx].probs; // reference probabilities for compressed header
|
frame_ctxs[frame_ctx_idx] = current_frame_info.entropy;
|
||||||
frame_ctxs[frame_ctx_idx] = {current_frame_number, false, current_frame_info.entropy};
|
|
||||||
|
|
||||||
uncomp_writer.WriteU(current_frame_info.first_level, 6);
|
uncomp_writer.WriteU(current_frame_info.first_level, 6);
|
||||||
uncomp_writer.WriteU(current_frame_info.sharpness_level, 3);
|
uncomp_writer.WriteU(current_frame_info.sharpness_level, 3);
|
||||||
|
|
@ -811,13 +791,6 @@ const std::vector<u8>& VP9::ComposeFrameHeader(const NvdecCommon::NvdecRegisters
|
||||||
frame.begin() + uncompressed_header.size());
|
frame.begin() + uncompressed_header.size());
|
||||||
std::copy(bitstream.begin(), bitstream.end(),
|
std::copy(bitstream.begin(), bitstream.end(),
|
||||||
frame.begin() + uncompressed_header.size() + compressed_header.size());
|
frame.begin() + uncompressed_header.size() + compressed_header.size());
|
||||||
|
|
||||||
// keep track of frame number
|
|
||||||
current_frame_number++;
|
|
||||||
grace_period--;
|
|
||||||
|
|
||||||
// don't display hidden frames
|
|
||||||
hidden = !current_frame_info.show_frame;
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
namespace Tegra {
|
namespace Tegra {
|
||||||
class GPU;
|
class GPU;
|
||||||
enum class FrameType { KeyFrame = 0, InterFrame = 1 };
|
|
||||||
namespace Decoder {
|
namespace Decoder {
|
||||||
|
|
||||||
/// The VpxRangeEncoder, and VpxBitStreamWriter classes are used to compose the
|
/// The VpxRangeEncoder, and VpxBitStreamWriter classes are used to compose the
|
||||||
|
|
@ -124,7 +123,7 @@ public:
|
||||||
|
|
||||||
/// Returns true if the most recent frame was a hidden frame.
|
/// Returns true if the most recent frame was a hidden frame.
|
||||||
[[nodiscard]] bool WasFrameHidden() const {
|
[[nodiscard]] bool WasFrameHidden() const {
|
||||||
return hidden;
|
return !current_frame_info.show_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -178,19 +177,12 @@ private:
|
||||||
std::array<s8, 4> loop_filter_ref_deltas{};
|
std::array<s8, 4> loop_filter_ref_deltas{};
|
||||||
std::array<s8, 2> loop_filter_mode_deltas{};
|
std::array<s8, 2> loop_filter_mode_deltas{};
|
||||||
|
|
||||||
bool hidden = false;
|
|
||||||
s64 current_frame_number = -2; // since we buffer 2 frames
|
|
||||||
s32 grace_period = 6; // frame offsets need to stabilize
|
|
||||||
std::array<FrameContexts, 4> frame_ctxs{};
|
|
||||||
Vp9FrameContainer next_frame{};
|
Vp9FrameContainer next_frame{};
|
||||||
Vp9FrameContainer next_next_frame{};
|
std::array<Vp9EntropyProbs, 4> frame_ctxs{};
|
||||||
bool swap_ref_indices{};
|
bool swap_ref_indices{};
|
||||||
|
|
||||||
Vp9PictureInfo current_frame_info{};
|
Vp9PictureInfo current_frame_info{};
|
||||||
Vp9EntropyProbs prev_frame_probs{};
|
Vp9EntropyProbs prev_frame_probs{};
|
||||||
|
|
||||||
s32 diff_update_probability = 252;
|
|
||||||
s32 frame_sync_code = 0x498342;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Decoder
|
} // namespace Decoder
|
||||||
|
|
|
||||||
|
|
@ -296,12 +296,6 @@ struct RefPoolElement {
|
||||||
bool refresh{};
|
bool refresh{};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FrameContexts {
|
|
||||||
s64 from;
|
|
||||||
bool adapted;
|
|
||||||
Vp9EntropyProbs probs;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ASSERT_POSITION(field_name, position) \
|
#define ASSERT_POSITION(field_name, position) \
|
||||||
static_assert(offsetof(Vp9EntropyProbs, field_name) == position, \
|
static_assert(offsetof(Vp9EntropyProbs, field_name) == position, \
|
||||||
"Field " #field_name " has invalid position")
|
"Field " #field_name " has invalid position")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue