1
0
Fork 0
forked from suyu/suyu

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.
This commit is contained in:
ameerj 2021-08-02 00:08:41 -04:00
parent a3f80a97a3
commit e3688f0627
3 changed files with 17 additions and 58 deletions

View file

@ -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,34 +386,19 @@ 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_next_frame.bit_stream.empty()) {
Vp9FrameContainer temp{
.info = current_frame.info,
.bit_stream = std::move(current_frame.bit_stream),
};
next_next_frame.info.show_frame = current_frame.info.last_frame_shown;
current_frame.info = next_next_frame.info;
current_frame.bit_stream = std::move(next_next_frame.bit_stream);
next_next_frame = std::move(temp);
if (!next_frame.bit_stream.empty()) { if (!next_frame.bit_stream.empty()) {
Vp9FrameContainer temp2{ 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_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_frame.info; current_frame.info = next_frame.info;
current_frame.bit_stream = std::move(next_frame.bit_stream); current_frame.bit_stream = std::move(next_frame.bit_stream);
next_frame = std::move(temp2); next_frame = std::move(temp);
} else { } else {
next_frame.info = current_frame.info; next_frame.info = current_frame.info;
next_frame.bit_stream = std::move(current_frame.bit_stream); next_frame.bit_stream = std::move(current_frame.bit_stream);
} }
} else {
next_next_frame.info = current_frame.info;
next_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;
@ -699,9 +680,8 @@ VpxBitStreamWriter VP9::ComposeUncompressedHeader() {
} }
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;
} }

View file

@ -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

View file

@ -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")