radeonsi: Add radeon_bitstream and use it in radeon_vcn_enc

Reviewed-by: David (Ming Qiang) Wu <David.Wu3@amd.com>
Acked-by: Leo Liu <leo.liu@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32829>
This commit is contained in:
David Rosca
2025-01-02 11:01:29 +01:00
committed by Marge Bot
parent b72fde55ae
commit 6510c3d75f
8 changed files with 967 additions and 972 deletions
+2
View File
@@ -101,6 +101,8 @@ files_libradeonsi = files(
'radeon_vcn_enc_5_0.c',
'radeon_video.c',
'radeon_video.h',
'radeon_bitstream.h',
'radeon_bitstream.c',
)
radeonsi_include_dirs = [inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_amd_common,
@@ -0,0 +1,349 @@
/*
* Copyright 2025 Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: MIT
*/
#include "radeon_bitstream.h"
static const uint32_t index_to_shifts[4] = {24, 16, 8, 0};
static void radeon_bs_output_one_byte(struct radeon_bitstream *bs, uint8_t byte)
{
if (bs->buf) {
*(bs->buf++) = byte;
return;
}
if (bs->byte_index == 0)
bs->cs->current.buf[bs->cs->current.cdw] = 0;
bs->cs->current.buf[bs->cs->current.cdw] |=
((uint32_t)(byte) << index_to_shifts[bs->byte_index]);
bs->byte_index++;
if (bs->byte_index >= 4) {
bs->byte_index = 0;
bs->cs->current.cdw++;
}
}
static void radeon_bs_emulation_prevention(struct radeon_bitstream *bs, uint8_t byte)
{
if (bs->emulation_prevention) {
if ((bs->num_zeros >= 2) && ((byte == 0x00) || (byte == 0x01) ||
(byte == 0x02) || (byte == 0x03))) {
radeon_bs_output_one_byte(bs, 0x03);
bs->bits_output += 8;
bs->num_zeros = 0;
}
bs->num_zeros = (byte == 0 ? (bs->num_zeros + 1) : 0);
}
}
void radeon_bs_reset(struct radeon_bitstream *bs, uint8_t *out, struct radeon_cmdbuf *cs)
{
memset(bs, 0, sizeof(*bs));
bs->buf = out;
bs->cs = cs;
}
void radeon_bs_set_emulation_prevention(struct radeon_bitstream *bs, bool set)
{
if (set != bs->emulation_prevention) {
bs->emulation_prevention = set;
bs->num_zeros = 0;
}
}
void radeon_bs_byte_align(struct radeon_bitstream *bs)
{
uint32_t num_padding_zeros = (32 - bs->bits_in_shifter) % 8;
if (num_padding_zeros > 0)
radeon_bs_code_fixed_bits(bs, 0, num_padding_zeros);
}
void radeon_bs_flush_headers(struct radeon_bitstream *bs)
{
if (bs->bits_in_shifter != 0) {
uint8_t output_byte = bs->shifter >> 24;
radeon_bs_emulation_prevention(bs, output_byte);
radeon_bs_output_one_byte(bs, output_byte);
bs->bits_output += bs->bits_in_shifter;
bs->shifter = 0;
bs->bits_in_shifter = 0;
bs->num_zeros = 0;
}
if (bs->byte_index > 0) {
bs->cs->current.cdw++;
bs->byte_index = 0;
}
}
void radeon_bs_code_fixed_bits(struct radeon_bitstream *bs, uint32_t value, uint32_t num_bits)
{
uint32_t bits_to_pack = 0;
bs->bits_size += num_bits;
while (num_bits > 0) {
uint32_t value_to_pack = value & (0xffffffff >> (32 - num_bits));
bits_to_pack =
num_bits > (32 - bs->bits_in_shifter) ? (32 - bs->bits_in_shifter) : num_bits;
if (bits_to_pack < num_bits)
value_to_pack = value_to_pack >> (num_bits - bits_to_pack);
bs->shifter |= value_to_pack << (32 - bs->bits_in_shifter - bits_to_pack);
num_bits -= bits_to_pack;
bs->bits_in_shifter += bits_to_pack;
while (bs->bits_in_shifter >= 8) {
uint8_t output_byte = bs->shifter >> 24;
bs->shifter <<= 8;
radeon_bs_emulation_prevention(bs, output_byte);
radeon_bs_output_one_byte(bs, output_byte);
bs->bits_in_shifter -= 8;
bs->bits_output += 8;
}
}
}
void radeon_bs_code_ue(struct radeon_bitstream *bs, uint32_t value)
{
uint32_t x = 0;
uint32_t ue_code = value + 1;
value += 1;
while (value) {
value = value >> 1;
x += 1;
}
if (x > 1)
radeon_bs_code_fixed_bits(bs, 0, x - 1);
radeon_bs_code_fixed_bits(bs, ue_code, x);
}
void radeon_bs_code_se(struct radeon_bitstream *bs, int32_t value)
{
uint32_t v = 0;
if (value != 0)
v = (value < 0 ? ((uint32_t)(0 - value) << 1) : (((uint32_t)(value) << 1) - 1));
radeon_bs_code_ue(bs, v);
}
void radeon_bs_code_uvlc(struct radeon_bitstream *bs, uint32_t value)
{
uint32_t num_bits = 0;
uint64_t value_plus1 = (uint64_t)value + 1;
uint32_t num_leading_zeros = 0;
while ((uint64_t)1 << num_bits <= value_plus1)
num_bits++;
num_leading_zeros = num_bits - 1;
radeon_bs_code_fixed_bits(bs, 0, num_leading_zeros);
radeon_bs_code_fixed_bits(bs, 1, 1);
radeon_bs_code_fixed_bits(bs, (uint32_t)value_plus1, num_leading_zeros);
}
void radeon_bs_code_ns(struct radeon_bitstream *bs, uint32_t value, uint32_t max)
{
uint32_t w = 0;
uint32_t m;
uint32_t max_num = max;
while ( max_num ) {
max_num >>= 1;
w++;
}
m = (1 << w) - max;
assert(w > 1);
if (value < m) {
radeon_bs_code_fixed_bits(bs, value, (w - 1));
} else {
uint32_t diff = value - m;
uint32_t out = (((diff >> 1) + m) << 1) | (diff & 0x1);
radeon_bs_code_fixed_bits(bs, out, w);
}
}
void radeon_bs_h264_hrd_parameters(struct radeon_bitstream *bs,
struct pipe_h264_enc_hrd_params *hrd)
{
radeon_bs_code_ue(bs, hrd->cpb_cnt_minus1);
radeon_bs_code_fixed_bits(bs, hrd->bit_rate_scale, 4);
radeon_bs_code_fixed_bits(bs, hrd->cpb_size_scale, 4);
for (uint32_t i = 0; i <= hrd->cpb_cnt_minus1; i++) {
radeon_bs_code_ue(bs, hrd->bit_rate_value_minus1[i]);
radeon_bs_code_ue(bs, hrd->cpb_size_value_minus1[i]);
radeon_bs_code_fixed_bits(bs, hrd->cbr_flag[i], 1);
}
radeon_bs_code_fixed_bits(bs, hrd->initial_cpb_removal_delay_length_minus1, 5);
radeon_bs_code_fixed_bits(bs, hrd->cpb_removal_delay_length_minus1, 5);
radeon_bs_code_fixed_bits(bs, hrd->dpb_output_delay_length_minus1, 5);
radeon_bs_code_fixed_bits(bs, hrd->time_offset_length, 5);
}
static void radeon_bs_hevc_profile_tier(struct radeon_bitstream *bs,
struct pipe_h265_profile_tier *pt)
{
radeon_bs_code_fixed_bits(bs, pt->general_profile_space, 2);
radeon_bs_code_fixed_bits(bs, pt->general_tier_flag, 1);
radeon_bs_code_fixed_bits(bs, pt->general_profile_idc, 5);
radeon_bs_code_fixed_bits(bs, pt->general_profile_compatibility_flag, 32);
radeon_bs_code_fixed_bits(bs, pt->general_progressive_source_flag, 1);
radeon_bs_code_fixed_bits(bs, pt->general_interlaced_source_flag, 1);
radeon_bs_code_fixed_bits(bs, pt->general_non_packed_constraint_flag, 1);
radeon_bs_code_fixed_bits(bs, pt->general_frame_only_constraint_flag, 1);
/* general_reserved_zero_44bits */
radeon_bs_code_fixed_bits(bs, 0x0, 16);
radeon_bs_code_fixed_bits(bs, 0x0, 16);
radeon_bs_code_fixed_bits(bs, 0x0, 12);
}
void radeon_bs_hevc_profile_tier_level(struct radeon_bitstream *bs,
uint32_t max_num_sub_layers_minus1,
struct pipe_h265_profile_tier_level *ptl)
{
uint32_t i;
radeon_bs_hevc_profile_tier(bs, &ptl->profile_tier);
radeon_bs_code_fixed_bits(bs, ptl->general_level_idc, 8);
for (i = 0; i < max_num_sub_layers_minus1; ++i) {
radeon_bs_code_fixed_bits(bs, ptl->sub_layer_profile_present_flag[i], 1);
radeon_bs_code_fixed_bits(bs, ptl->sub_layer_level_present_flag[i], 1);
}
if (max_num_sub_layers_minus1 > 0) {
for (i = max_num_sub_layers_minus1; i < 8; ++i)
radeon_bs_code_fixed_bits(bs, 0x0, 2); /* reserved_zero_2bits */
}
for (i = 0; i < max_num_sub_layers_minus1; ++i) {
if (ptl->sub_layer_profile_present_flag[i])
radeon_bs_hevc_profile_tier(bs, &ptl->sub_layer_profile_tier[i]);
if (ptl->sub_layer_level_present_flag[i])
radeon_bs_code_fixed_bits(bs, ptl->sub_layer_level_idc[i], 8);
}
}
static void radeon_bs_hevc_sub_layer_hrd_parameters(struct radeon_bitstream *bs,
uint32_t cpb_cnt,
uint32_t sub_pic_hrd_params_present_flag,
struct pipe_h265_enc_sublayer_hrd_params *hrd)
{
for (uint32_t i = 0; i < cpb_cnt; i++) {
radeon_bs_code_ue(bs, hrd->bit_rate_value_minus1[i]);
radeon_bs_code_ue(bs, hrd->cpb_size_value_minus1[i]);
if (sub_pic_hrd_params_present_flag) {
radeon_bs_code_ue(bs, hrd->cpb_size_du_value_minus1[i]);
radeon_bs_code_ue(bs, hrd->bit_rate_du_value_minus1[i]);
}
radeon_bs_code_fixed_bits(bs, hrd->cbr_flag[i], 1);
}
}
void radeon_bs_hevc_hrd_parameters(struct radeon_bitstream *bs,
uint32_t common_inf_present_flag,
uint32_t max_sub_layers_minus1,
struct pipe_h265_enc_hrd_params *hrd)
{
if (common_inf_present_flag) {
radeon_bs_code_fixed_bits(bs, hrd->nal_hrd_parameters_present_flag, 1);
radeon_bs_code_fixed_bits(bs, hrd->vcl_hrd_parameters_present_flag, 1);
if (hrd->nal_hrd_parameters_present_flag || hrd->vcl_hrd_parameters_present_flag) {
radeon_bs_code_fixed_bits(bs, hrd->sub_pic_hrd_params_present_flag, 1);
if (hrd->sub_pic_hrd_params_present_flag) {
radeon_bs_code_fixed_bits(bs, hrd->tick_divisor_minus2, 8);
radeon_bs_code_fixed_bits(bs, hrd->du_cpb_removal_delay_increment_length_minus1, 5);
radeon_bs_code_fixed_bits(bs, hrd->sub_pic_hrd_params_present_flag, 1);
radeon_bs_code_fixed_bits(bs, hrd->dpb_output_delay_du_length_minus1, 5);
}
radeon_bs_code_fixed_bits(bs, hrd->bit_rate_scale, 4);
radeon_bs_code_fixed_bits(bs, hrd->cpb_rate_scale, 4);
if (hrd->sub_pic_hrd_params_present_flag)
radeon_bs_code_fixed_bits(bs, hrd->cpb_size_du_scale, 4);
radeon_bs_code_fixed_bits(bs, hrd->initial_cpb_removal_delay_length_minus1, 5);
radeon_bs_code_fixed_bits(bs, hrd->au_cpb_removal_delay_length_minus1, 5);
radeon_bs_code_fixed_bits(bs, hrd->dpb_output_delay_length_minus1, 5);
}
}
for (uint32_t i = 0; i <= max_sub_layers_minus1; i++) {
radeon_bs_code_fixed_bits(bs, hrd->fixed_pic_rate_general_flag[i], 1);
if (!hrd->fixed_pic_rate_general_flag[i])
radeon_bs_code_fixed_bits(bs, hrd->fixed_pic_rate_within_cvs_flag[i], 1);
if (hrd->fixed_pic_rate_within_cvs_flag[i])
radeon_bs_code_ue(bs, hrd->elemental_duration_in_tc_minus1[i]);
else
radeon_bs_code_fixed_bits(bs, hrd->low_delay_hrd_flag[i], 1);
if (!hrd->low_delay_hrd_flag[i])
radeon_bs_code_ue(bs, hrd->cpb_cnt_minus1[i]);
if (hrd->nal_hrd_parameters_present_flag) {
radeon_bs_hevc_sub_layer_hrd_parameters(bs,
hrd->cpb_cnt_minus1[i] + 1,
hrd->sub_pic_hrd_params_present_flag,
&hrd->nal_hrd_parameters[i]);
}
if (hrd->vcl_hrd_parameters_present_flag) {
radeon_bs_hevc_sub_layer_hrd_parameters(bs,
hrd->cpb_cnt_minus1[i] + 1,
hrd->sub_pic_hrd_params_present_flag,
&hrd->vlc_hrd_parameters[i]);
}
}
}
/* returns NumPicTotalCurr */
uint32_t radeon_bs_hevc_st_ref_pic_set(struct radeon_bitstream *bs,
uint32_t index,
uint32_t num_short_term_ref_pic_sets,
struct pipe_h265_st_ref_pic_set *st_rps)
{
struct pipe_h265_st_ref_pic_set *ref_rps = NULL;
struct pipe_h265_st_ref_pic_set *rps = &st_rps[index];
uint32_t i, num_pic_total_curr = 0;
if (index)
radeon_bs_code_fixed_bits(bs, rps->inter_ref_pic_set_prediction_flag, 1);
if (rps->inter_ref_pic_set_prediction_flag) {
if (index == num_short_term_ref_pic_sets)
radeon_bs_code_ue(bs, rps->delta_idx_minus1);
radeon_bs_code_fixed_bits(bs, rps->delta_rps_sign, 1);
radeon_bs_code_ue(bs, rps->abs_delta_rps_minus1);
ref_rps = st_rps + index +
(1 - 2 * rps->delta_rps_sign) * (st_rps->delta_idx_minus1 + 1);
for (i = 0; i <= (ref_rps->num_negative_pics + ref_rps->num_positive_pics); i++) {
radeon_bs_code_fixed_bits(bs, rps->used_by_curr_pic_flag[i], 1);
if (!rps->used_by_curr_pic_flag[i])
radeon_bs_code_fixed_bits(bs, rps->use_delta_flag[i], 1);
}
} else {
radeon_bs_code_ue(bs, rps->num_negative_pics);
radeon_bs_code_ue(bs, rps->num_positive_pics);
for (i = 0; i < rps->num_negative_pics; i++) {
radeon_bs_code_ue(bs, rps->delta_poc_s0_minus1[i]);
radeon_bs_code_fixed_bits(bs, rps->used_by_curr_pic_s0_flag[i], 1);
if (rps->used_by_curr_pic_s0_flag[i])
num_pic_total_curr++;
}
for (i = 0; i < st_rps->num_positive_pics; i++) {
radeon_bs_code_ue(bs, rps->delta_poc_s1_minus1[i]);
radeon_bs_code_fixed_bits(bs, rps->used_by_curr_pic_s1_flag[i], 1);
if (rps->used_by_curr_pic_s1_flag[i])
num_pic_total_curr++;
}
}
return num_pic_total_curr;
}
@@ -0,0 +1,53 @@
/*
* Copyright 2025 Advanced Micro Devices, Inc.
*
* SPDX-License-Identifier: MIT
*/
#ifndef RADEON_BITSTREAM_H
#define RADEON_BITSTREAM_H
#include "pipe/p_video_state.h"
#include "winsys/radeon_winsys.h"
struct radeon_bitstream {
bool emulation_prevention;
uint32_t shifter;
uint32_t bits_in_shifter;
uint32_t num_zeros;
uint32_t byte_index;
uint32_t bits_output;
uint32_t bits_size;
uint8_t *buf;
struct radeon_cmdbuf *cs;
};
void radeon_bs_reset(struct radeon_bitstream *bs, uint8_t *out, struct radeon_cmdbuf *cs);
void radeon_bs_set_emulation_prevention(struct radeon_bitstream *bs, bool set);
void radeon_bs_byte_align(struct radeon_bitstream *bs);
void radeon_bs_flush_headers(struct radeon_bitstream *bs);
void radeon_bs_code_fixed_bits(struct radeon_bitstream *bs, uint32_t value, uint32_t num_bits);
void radeon_bs_code_ue(struct radeon_bitstream *bs, uint32_t value);
void radeon_bs_code_se(struct radeon_bitstream *bs, int32_t value);
void radeon_bs_code_uvlc(struct radeon_bitstream *bs, uint32_t value);
void radeon_bs_code_ns(struct radeon_bitstream *bs, uint32_t value, uint32_t max);
void radeon_bs_h264_hrd_parameters(struct radeon_bitstream *bs,
struct pipe_h264_enc_hrd_params *hrd);
void radeon_bs_hevc_profile_tier_level(struct radeon_bitstream *bs,
uint32_t max_num_sub_layers_minus1,
struct pipe_h265_profile_tier_level *ptl);
void radeon_bs_hevc_hrd_parameters(struct radeon_bitstream *bs,
uint32_t common_inf_present_flag,
uint32_t max_sub_layers_minus1,
struct pipe_h265_enc_hrd_params *hrd);
uint32_t radeon_bs_hevc_st_ref_pic_set(struct radeon_bitstream *bs,
uint32_t index,
uint32_t num_short_term_ref_pic_sets,
struct pipe_h265_st_ref_pic_set *st_rps);
#endif
+5 -186
View File
@@ -17,8 +17,6 @@
#include "util/u_video.h"
#include "vl/vl_video_buffer.h"
static const unsigned index_to_shifts[4] = {24, 16, 8, 0};
/* set quality modes from the input */
static void radeon_vcn_enc_quality_modes(struct radeon_encoder *enc,
struct pipe_enc_quality_modes *in)
@@ -1980,7 +1978,6 @@ struct pipe_video_codec *radeon_create_encoder(struct pipe_context *context,
enc->base.fence_wait = radeon_enc_fence_wait;
enc->base.destroy_fence = radeon_enc_destroy_fence;
enc->get_buffer = get_buffer;
enc->bits_in_shifter = 0;
enc->screen = context->screen;
enc->ws = ws;
@@ -2048,96 +2045,6 @@ void radeon_enc_add_buffer(struct radeon_encoder *enc, struct pb_buffer_lean *bu
RADEON_ENC_CS(addr);
}
void radeon_enc_set_emulation_prevention(struct radeon_encoder *enc, bool set)
{
if (set != enc->emulation_prevention) {
enc->emulation_prevention = set;
enc->num_zeros = 0;
}
}
void radeon_enc_set_output_buffer(struct radeon_encoder *enc, uint8_t *buffer)
{
enc->bits_buf = buffer;
enc->bits_buf_pos = 0;
}
void radeon_enc_output_one_byte(struct radeon_encoder *enc, unsigned char byte)
{
if (enc->bits_buf) {
enc->bits_buf[enc->bits_buf_pos++] = byte;
return;
}
if (enc->byte_index == 0)
enc->cs.current.buf[enc->cs.current.cdw] = 0;
enc->cs.current.buf[enc->cs.current.cdw] |=
((unsigned int)(byte) << index_to_shifts[enc->byte_index]);
enc->byte_index++;
if (enc->byte_index >= 4) {
enc->byte_index = 0;
enc->cs.current.cdw++;
}
}
void radeon_enc_emulation_prevention(struct radeon_encoder *enc, unsigned char byte)
{
if (enc->emulation_prevention) {
if ((enc->num_zeros >= 2) && ((byte == 0x00) || (byte == 0x01) ||
(byte == 0x02) || (byte == 0x03))) {
radeon_enc_output_one_byte(enc, 0x03);
enc->bits_output += 8;
enc->num_zeros = 0;
}
enc->num_zeros = (byte == 0 ? (enc->num_zeros + 1) : 0);
}
}
void radeon_enc_code_fixed_bits(struct radeon_encoder *enc, unsigned int value,
unsigned int num_bits)
{
unsigned int bits_to_pack = 0;
enc->bits_size += num_bits;
while (num_bits > 0) {
unsigned int value_to_pack = value & (0xffffffff >> (32 - num_bits));
bits_to_pack =
num_bits > (32 - enc->bits_in_shifter) ? (32 - enc->bits_in_shifter) : num_bits;
if (bits_to_pack < num_bits)
value_to_pack = value_to_pack >> (num_bits - bits_to_pack);
enc->shifter |= value_to_pack << (32 - enc->bits_in_shifter - bits_to_pack);
num_bits -= bits_to_pack;
enc->bits_in_shifter += bits_to_pack;
while (enc->bits_in_shifter >= 8) {
unsigned char output_byte = (unsigned char)(enc->shifter >> 24);
enc->shifter <<= 8;
radeon_enc_emulation_prevention(enc, output_byte);
radeon_enc_output_one_byte(enc, output_byte);
enc->bits_in_shifter -= 8;
enc->bits_output += 8;
}
}
}
void radeon_enc_code_uvlc(struct radeon_encoder *enc, unsigned int value)
{
uint32_t num_bits = 0;
uint64_t value_plus1 = (uint64_t)value + 1;
uint32_t num_leading_zeros = 0;
while ((uint64_t)1 << num_bits <= value_plus1)
num_bits++;
num_leading_zeros = num_bits - 1;
radeon_enc_code_fixed_bits(enc, 0, num_leading_zeros);
radeon_enc_code_fixed_bits(enc, 1, 1);
radeon_enc_code_fixed_bits(enc, (uint32_t)value_plus1, num_leading_zeros);
}
void radeon_enc_code_leb128(uint8_t *buf, uint32_t value,
uint32_t num_bytes)
{
@@ -2156,71 +2063,6 @@ void radeon_enc_code_leb128(uint8_t *buf, uint32_t value,
} while((leb128_byte & 0x80));
}
void radeon_enc_reset(struct radeon_encoder *enc)
{
enc->emulation_prevention = false;
enc->shifter = 0;
enc->bits_in_shifter = 0;
enc->bits_output = 0;
enc->num_zeros = 0;
enc->byte_index = 0;
enc->bits_size = 0;
enc->bits_buf = NULL;
enc->bits_buf_pos = 0;
}
void radeon_enc_byte_align(struct radeon_encoder *enc)
{
unsigned int num_padding_zeros = (32 - enc->bits_in_shifter) % 8;
if (num_padding_zeros > 0)
radeon_enc_code_fixed_bits(enc, 0, num_padding_zeros);
}
void radeon_enc_flush_headers(struct radeon_encoder *enc)
{
if (enc->bits_in_shifter != 0) {
unsigned char output_byte = (unsigned char)(enc->shifter >> 24);
radeon_enc_emulation_prevention(enc, output_byte);
radeon_enc_output_one_byte(enc, output_byte);
enc->bits_output += enc->bits_in_shifter;
enc->shifter = 0;
enc->bits_in_shifter = 0;
enc->num_zeros = 0;
}
if (enc->byte_index > 0) {
enc->cs.current.cdw++;
enc->byte_index = 0;
}
}
void radeon_enc_code_ue(struct radeon_encoder *enc, unsigned int value)
{
unsigned int x = 0;
unsigned int ue_code = value + 1;
value += 1;
while (value) {
value = (value >> 1);
x += 1;
}
if (x > 1)
radeon_enc_code_fixed_bits(enc, 0, x - 1);
radeon_enc_code_fixed_bits(enc, ue_code, x);
}
void radeon_enc_code_se(struct radeon_encoder *enc, int value)
{
unsigned int v = 0;
if (value != 0)
v = (value < 0 ? ((unsigned int)(0 - value) << 1) : (((unsigned int)(value) << 1) - 1));
radeon_enc_code_ue(enc, v);
}
unsigned int radeon_enc_av1_tile_log2(unsigned int blk_size, unsigned int max)
{
unsigned int k;
@@ -2231,30 +2073,6 @@ unsigned int radeon_enc_av1_tile_log2(unsigned int blk_size, unsigned int max)
return k;
}
void radeon_enc_code_ns(struct radeon_encoder *enc, unsigned int value, unsigned int max)
{
unsigned w = 0;
unsigned m;
unsigned max_num = max;
while ( max_num ) {
max_num >>= 1;
w++;
}
m = ( 1 << w ) - max;
assert(w > 1);
if ( value < m )
radeon_enc_code_fixed_bits(enc, value, (w - 1));
else {
unsigned diff = value - m;
unsigned out = (((diff >> 1) + m) << 1) | (diff & 0x1);
radeon_enc_code_fixed_bits(enc, out, w);
}
}
/* dummy function for re-using the same pipeline */
void radeon_enc_dummy(struct radeon_encoder *enc) {}
@@ -2269,13 +2087,14 @@ static void radeon_enc_av1_bs_copy_end(struct radeon_encoder *enc, uint32_t bits
/* av1 bitstream instruction type */
void radeon_enc_av1_bs_instruction_type(struct radeon_encoder *enc,
struct radeon_bitstream *bs,
uint32_t inst,
uint32_t obu_type)
{
radeon_enc_flush_headers(enc);
radeon_bs_flush_headers(bs);
if (enc->bits_output)
radeon_enc_av1_bs_copy_end(enc, enc->bits_output);
if (bs->bits_output)
radeon_enc_av1_bs_copy_end(enc, bs->bits_output);
enc->enc_pic.copy_start = &enc->cs.current.buf[enc->cs.current.cdw++];
RADEON_ENC_CS(inst);
@@ -2289,7 +2108,7 @@ void radeon_enc_av1_bs_instruction_type(struct radeon_encoder *enc,
} else
RADEON_ENC_CS(0); /* allocate a dword for number of bits */
radeon_enc_reset(enc);
radeon_bs_reset(bs, NULL, &enc->cs);
}
uint32_t radeon_enc_value_bits(uint32_t value)
+5 -57
View File
@@ -11,6 +11,7 @@
#include "radeon_vcn.h"
#include "util/macros.h"
#include "radeon_bitstream.h"
#include "ac_vcn_enc.h"
@@ -248,19 +249,10 @@ struct radeon_encoder {
rvcn_enc_cmd_t cmd;
unsigned alignment;
unsigned shifter;
unsigned bits_in_shifter;
unsigned num_zeros;
unsigned byte_index;
unsigned bits_output;
unsigned bits_size;
uint8_t *bits_buf;
uint32_t bits_buf_pos;
uint32_t total_task_size;
uint32_t *p_task_size;
struct rvcn_sq_var sq;
bool emulation_prevention;
bool need_feedback;
bool need_rate_control;
bool need_rc_per_pic;
@@ -312,35 +304,9 @@ void radeon_enc_add_buffer(struct radeon_encoder *enc, struct pb_buffer_lean *bu
void radeon_enc_dummy(struct radeon_encoder *enc);
void radeon_enc_set_emulation_prevention(struct radeon_encoder *enc, bool set);
void radeon_enc_set_output_buffer(struct radeon_encoder *enc, uint8_t *buffer);
void radeon_enc_output_one_byte(struct radeon_encoder *enc, unsigned char byte);
void radeon_enc_emulation_prevention(struct radeon_encoder *enc, unsigned char byte);
void radeon_enc_code_fixed_bits(struct radeon_encoder *enc, unsigned int value,
unsigned int num_bits);
void radeon_enc_reset(struct radeon_encoder *enc);
void radeon_enc_byte_align(struct radeon_encoder *enc);
void radeon_enc_flush_headers(struct radeon_encoder *enc);
void radeon_enc_code_ue(struct radeon_encoder *enc, unsigned int value);
void radeon_enc_code_se(struct radeon_encoder *enc, int value);
void radeon_enc_code_uvlc(struct radeon_encoder *enc, unsigned int value);
void radeon_enc_code_leb128(unsigned char *buf, unsigned int value,
unsigned int num_bytes);
void radeon_enc_code_ns(struct radeon_encoder *enc, unsigned int value,
unsigned int max);
void radeon_enc_1_2_init(struct radeon_encoder *enc);
void radeon_enc_2_0_init(struct radeon_encoder *enc);
@@ -363,33 +329,15 @@ unsigned int radeon_enc_write_pps_hevc(struct radeon_encoder *enc, uint8_t *out)
unsigned int radeon_enc_write_sequence_header(struct radeon_encoder *enc, uint8_t *obu_bytes, uint8_t *out);
void radeon_enc_hrd_parameters(struct radeon_encoder *enc,
struct pipe_h264_enc_hrd_params *hrd);
void radeon_enc_hevc_profile_tier_level(struct radeon_encoder *enc,
unsigned int max_num_sub_layers_minus1,
struct pipe_h265_profile_tier_level *ptl);
void radeon_enc_hevc_hrd_parameters(struct radeon_encoder *enc,
unsigned int common_inf_present_flag,
unsigned int max_sub_layers_minus1,
struct pipe_h265_enc_hrd_params *hrd);
unsigned int radeon_enc_hevc_st_ref_pic_set(struct radeon_encoder *enc,
unsigned int index,
unsigned int num_short_term_ref_pic_sets,
struct pipe_h265_st_ref_pic_set *st_rps);
void radeon_enc_av1_bs_instruction_type(struct radeon_encoder *enc,
struct radeon_bitstream *bs,
unsigned int inst, unsigned int obu_type);
void radeon_enc_av1_obu_header(struct radeon_encoder *enc, uint32_t obu_type);
void radeon_enc_av1_obu_header(struct radeon_encoder *enc, struct radeon_bitstream *bs, uint32_t obu_type);
void radeon_enc_av1_frame_header_common(struct radeon_encoder *enc, bool frame_header);
void radeon_enc_av1_frame_header_common(struct radeon_encoder *enc, struct radeon_bitstream *bs, bool frame_header);
void radeon_enc_av1_tile_group(struct radeon_encoder *enc);
unsigned char *radeon_enc_av1_header_size_offset(struct radeon_encoder *enc);
void radeon_enc_av1_tile_group(struct radeon_encoder *enc, struct radeon_bitstream *bs);
unsigned int radeon_enc_value_bits(unsigned int value);
File diff suppressed because it is too large Load Diff
+152 -149
View File
@@ -157,226 +157,226 @@ static void radeon_enc_cdf_default_table(struct radeon_encoder *enc)
RADEON_ENC_END();
}
void radeon_enc_av1_obu_header(struct radeon_encoder *enc, uint32_t obu_type)
void radeon_enc_av1_obu_header(struct radeon_encoder *enc, struct radeon_bitstream *bs, uint32_t obu_type)
{
/* obu header () */
/* obu_forbidden_bit */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
/* obu_type */
radeon_enc_code_fixed_bits(enc, obu_type, 4);
radeon_bs_code_fixed_bits(bs, obu_type, 4);
/* obu_extension_flag */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.desc->obu_extension_flag ? 1 : 0, 1);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.av1.desc->obu_extension_flag ? 1 : 0, 1);
/* obu_has_size_field */
radeon_enc_code_fixed_bits(enc, 1, 1);
radeon_bs_code_fixed_bits(bs, 1, 1);
/* obu_reserved_1bit */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
if (enc->enc_pic.av1.desc->obu_extension_flag) {
radeon_enc_code_fixed_bits(enc, enc->enc_pic.temporal_id, 3);
radeon_enc_code_fixed_bits(enc, 0, 2); /* spatial_id should always be zero */
radeon_enc_code_fixed_bits(enc, 0, 3); /* reserved 3 bits */
radeon_bs_code_fixed_bits(bs, enc->enc_pic.temporal_id, 3);
radeon_bs_code_fixed_bits(bs, 0, 2); /* spatial_id should always be zero */
radeon_bs_code_fixed_bits(bs, 0, 3); /* reserved 3 bits */
}
}
unsigned int radeon_enc_write_sequence_header(struct radeon_encoder *enc, uint8_t *obu_bytes, uint8_t *out)
{
struct radeon_bitstream bs;
uint8_t *size_offset;
uint32_t obu_size;
uint32_t width_bits;
uint32_t height_bits;
struct pipe_av1_enc_seq_param *seq = &enc->enc_pic.av1.desc->seq;
radeon_enc_reset(enc);
radeon_enc_set_output_buffer(enc, out);
radeon_enc_code_fixed_bits(enc, obu_bytes[0], 8);
radeon_bs_reset(&bs, out, NULL);
radeon_bs_code_fixed_bits(&bs, obu_bytes[0], 8);
if (obu_bytes[0] & 0x4) /* obu_extension_flag */
radeon_enc_code_fixed_bits(enc, obu_bytes[1], 8);
radeon_bs_code_fixed_bits(&bs, obu_bytes[1], 8);
/* obu_size, use one byte for header, the size will be written in afterwards */
size_offset = &enc->bits_buf[enc->bits_buf_pos];
radeon_enc_code_fixed_bits(enc, 0, 8);
size_offset = &out[bs.bits_output / 8];
radeon_bs_code_fixed_bits(&bs, 0, 8);
/* sequence_header_obu() */
/* seq_profile */
radeon_enc_code_fixed_bits(enc, seq->profile, 3);
radeon_bs_code_fixed_bits(&bs, seq->profile, 3);
/* still_picture */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.still_picture, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.still_picture, 1);
/* reduced_still_picture_header */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.reduced_still_picture_header, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.reduced_still_picture_header, 1);
if (seq->seq_bits.reduced_still_picture_header) {
/* seq_level_idx[0] */
radeon_enc_code_fixed_bits(enc, seq->seq_level_idx[0], 5);
radeon_bs_code_fixed_bits(&bs, seq->seq_level_idx[0], 5);
} else {
/* timing_info_present_flag */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.timing_info_present_flag, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.timing_info_present_flag, 1);
if (seq->seq_bits.timing_info_present_flag) {
/* num_units_in_display_tick */
radeon_enc_code_fixed_bits(enc, seq->num_units_in_display_tick, 32);
radeon_bs_code_fixed_bits(&bs, seq->num_units_in_display_tick, 32);
/* time_scale */
radeon_enc_code_fixed_bits(enc, seq->time_scale, 32);
radeon_bs_code_fixed_bits(&bs, seq->time_scale, 32);
/* equal_picture_interval */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.equal_picture_interval, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.equal_picture_interval, 1);
/* num_ticks_per_picture_minus_1 */
if (seq->seq_bits.equal_picture_interval)
radeon_enc_code_uvlc(enc, seq->num_tick_per_picture_minus1);
radeon_bs_code_uvlc(&bs, seq->num_tick_per_picture_minus1);
/* decoder_model_info_present_flag */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.decoder_model_info_present_flag, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.decoder_model_info_present_flag, 1);
if (seq->seq_bits.decoder_model_info_present_flag) {
/* buffer_delay_length_minus1 */
radeon_enc_code_fixed_bits(enc, seq->decoder_model_info.buffer_delay_length_minus1, 5);
radeon_bs_code_fixed_bits(&bs, seq->decoder_model_info.buffer_delay_length_minus1, 5);
/* num_units_in_decoding_tick */
radeon_enc_code_fixed_bits(enc, seq->decoder_model_info.num_units_in_decoding_tick, 32);
radeon_bs_code_fixed_bits(&bs, seq->decoder_model_info.num_units_in_decoding_tick, 32);
/* buffer_removal_time_length_minus1 */
radeon_enc_code_fixed_bits(enc, seq->decoder_model_info.buffer_removal_time_length_minus1, 5);
radeon_bs_code_fixed_bits(&bs, seq->decoder_model_info.buffer_removal_time_length_minus1, 5);
/* frame_presentation_time_length_minus1 */
radeon_enc_code_fixed_bits(enc, seq->decoder_model_info.frame_presentation_time_length_minus1, 5);
radeon_bs_code_fixed_bits(&bs, seq->decoder_model_info.frame_presentation_time_length_minus1, 5);
}
}
/* initial_display_delay_present_flag */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.initial_display_delay_present_flag, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.initial_display_delay_present_flag, 1);
/* operating_points_cnt_minus_1 */
radeon_enc_code_fixed_bits(enc, seq->num_temporal_layers - 1, 5);
radeon_bs_code_fixed_bits(&bs, seq->num_temporal_layers - 1, 5);
for (uint32_t i = 0; i < seq->num_temporal_layers; i++) {
/* operating_point_idc[i] */
radeon_enc_code_fixed_bits(enc, seq->operating_point_idc[i], 12);
radeon_bs_code_fixed_bits(&bs, seq->operating_point_idc[i], 12);
/* seq_level_idx[i] */
radeon_enc_code_fixed_bits(enc, seq->seq_level_idx[i], 5);
radeon_bs_code_fixed_bits(&bs, seq->seq_level_idx[i], 5);
if (seq->seq_level_idx[i] > 7)
/* seq_tier[i] */
radeon_enc_code_fixed_bits(enc, seq->seq_tier[i], 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_tier[i], 1);
if (seq->seq_bits.decoder_model_info_present_flag) {
/* decoder_model_present_for_this_op[i] */
radeon_enc_code_fixed_bits(enc, seq->decoder_model_present_for_this_op[i], 1);
radeon_bs_code_fixed_bits(&bs, seq->decoder_model_present_for_this_op[i], 1);
if (seq->decoder_model_present_for_this_op[i]) {
uint32_t length = seq->decoder_model_info.buffer_delay_length_minus1 + 1;
/* decoder_buffer_delay[i] */
radeon_enc_code_fixed_bits(enc, seq->decoder_buffer_delay[i], length);
radeon_bs_code_fixed_bits(&bs, seq->decoder_buffer_delay[i], length);
/* encoder_buffer_delay[i] */
radeon_enc_code_fixed_bits(enc, seq->encoder_buffer_delay[i], length);
radeon_bs_code_fixed_bits(&bs, seq->encoder_buffer_delay[i], length);
/* low_delay_mode_flag[i] */
radeon_enc_code_fixed_bits(enc, seq->low_delay_mode_flag[i], 1);
radeon_bs_code_fixed_bits(&bs, seq->low_delay_mode_flag[i], 1);
}
}
if (seq->seq_bits.initial_display_delay_present_flag) {
/* initial_display_delay_present_for_this_op[i] */
radeon_enc_code_fixed_bits(enc, seq->initial_display_delay_present_for_this_op[i], 1);
radeon_bs_code_fixed_bits(&bs, seq->initial_display_delay_present_for_this_op[i], 1);
if (seq->initial_display_delay_present_for_this_op[i])
/* initial_display_delay_minus_1[i] */
radeon_enc_code_fixed_bits(enc, seq->initial_display_delay_minus_1[i], 4);
radeon_bs_code_fixed_bits(&bs, seq->initial_display_delay_minus_1[i], 4);
}
}
}
/* frame_width_bits_minus_1 */
width_bits = radeon_enc_value_bits(enc->enc_pic.av1.coded_width);
radeon_enc_code_fixed_bits(enc, width_bits - 1, 4);
radeon_bs_code_fixed_bits(&bs, width_bits - 1, 4);
/* frame_height_bits_minus_1 */
height_bits = radeon_enc_value_bits(enc->enc_pic.av1.coded_height);
radeon_enc_code_fixed_bits(enc, height_bits - 1, 4);
radeon_bs_code_fixed_bits(&bs, height_bits - 1, 4);
/* max_frame_width_minus_1 */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.coded_width - 1,
radeon_bs_code_fixed_bits(&bs, enc->enc_pic.av1.coded_width - 1,
width_bits);
/* max_frame_height_minus_1 */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.coded_height - 1,
radeon_bs_code_fixed_bits(&bs, enc->enc_pic.av1.coded_height - 1,
height_bits);
if (!seq->seq_bits.reduced_still_picture_header)
/* frame_id_numbers_present_flag */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.frame_id_number_present_flag, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.frame_id_number_present_flag, 1);
if (seq->seq_bits.frame_id_number_present_flag) {
/* delta_frame_id_length_minus_2 */
radeon_enc_code_fixed_bits(enc, seq->delta_frame_id_length - 2, 4);
radeon_bs_code_fixed_bits(&bs, seq->delta_frame_id_length - 2, 4);
/* additional_frame_id_length_minus_1 */
radeon_enc_code_fixed_bits(enc, seq->additional_frame_id_length - 1, 3);
radeon_bs_code_fixed_bits(&bs, seq->additional_frame_id_length - 1, 3);
}
/* use_128x128_superblock */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* enable_filter_intra */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* enable_intra_edge_filter */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
if (!seq->seq_bits.reduced_still_picture_header) {
/* enable_interintra_compound */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* enable_masked_compound */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* enable_warped_motion */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* enable_dual_filter */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* enable_order_hint */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.enable_order_hint, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.enable_order_hint, 1);
if (seq->seq_bits.enable_order_hint) {
/* enable_jnt_comp */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* enable_ref_frame_mvs */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
}
/* seq_choose_screen_content_tools */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.disable_screen_content_tools ? 0 : 1, 1);
radeon_bs_code_fixed_bits(&bs, enc->enc_pic.disable_screen_content_tools ? 0 : 1, 1);
if (enc->enc_pic.disable_screen_content_tools)
/* seq_force_screen_content_tools */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
else
/* seq_choose_integer_mv */
radeon_enc_code_fixed_bits(enc, 1, 1);
radeon_bs_code_fixed_bits(&bs, 1, 1);
if (seq->seq_bits.enable_order_hint)
/* order_hint_bits_minus_1 */
radeon_enc_code_fixed_bits(enc, seq->order_hint_bits - 1, 3);
radeon_bs_code_fixed_bits(&bs, seq->order_hint_bits - 1, 3);
}
/* enable_superres */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* enable_cdef */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1_spec_misc.cdef_mode ? 1 : 0, 1);
radeon_bs_code_fixed_bits(&bs, enc->enc_pic.av1_spec_misc.cdef_mode ? 1 : 0, 1);
/* enable_restoration */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* high_bitdepth */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.enc_output_format.output_color_bit_depth, 1);
radeon_bs_code_fixed_bits(&bs, enc->enc_pic.enc_output_format.output_color_bit_depth, 1);
/* mono_chrome */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* color_description_present_flag */
radeon_enc_code_fixed_bits(enc, seq->seq_bits.color_description_present_flag, 1);
radeon_bs_code_fixed_bits(&bs, seq->seq_bits.color_description_present_flag, 1);
if (seq->seq_bits.color_description_present_flag) {
/* color_primaries */
radeon_enc_code_fixed_bits(enc, seq->color_config.color_primaries, 8);
radeon_bs_code_fixed_bits(&bs, seq->color_config.color_primaries, 8);
/* transfer_characteristics */
radeon_enc_code_fixed_bits(enc, seq->color_config.transfer_characteristics, 8);
radeon_bs_code_fixed_bits(&bs, seq->color_config.transfer_characteristics, 8);
/* matrix_coefficients */
radeon_enc_code_fixed_bits(enc, seq->color_config.matrix_coefficients, 8);
radeon_bs_code_fixed_bits(&bs, seq->color_config.matrix_coefficients, 8);
}
/* color_range */
radeon_enc_code_fixed_bits(enc, seq->color_config.color_range, 1);
radeon_bs_code_fixed_bits(&bs, seq->color_config.color_range, 1);
/* chroma_sample_position */
radeon_enc_code_fixed_bits(enc, seq->color_config.chroma_sample_position, 2);
radeon_bs_code_fixed_bits(&bs, seq->color_config.chroma_sample_position, 2);
/* separate_uv_delta_q */
bool separate_delta_q = false;
radeon_enc_code_fixed_bits(enc, !!(separate_delta_q), 1);
radeon_bs_code_fixed_bits(&bs, !!(separate_delta_q), 1);
/* film_grain_params_present */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(&bs, 0, 1);
/* trailing_one_bit */
radeon_enc_code_fixed_bits(enc, 1, 1);
radeon_enc_byte_align(enc);
radeon_bs_code_fixed_bits(&bs, 1, 1);
radeon_bs_byte_align(&bs);
obu_size = (uint32_t)(&enc->bits_buf[enc->bits_buf_pos] - size_offset - 1);
obu_size = (uint32_t)(&out[bs.bits_output / 8] - size_offset - 1);
radeon_enc_code_leb128(size_offset, obu_size, 1);
return enc->bits_buf_pos;
return bs.bits_output / 8;
}
void radeon_enc_av1_frame_header_common(struct radeon_encoder *enc, bool frame_header)
void radeon_enc_av1_frame_header_common(struct radeon_encoder *enc, struct radeon_bitstream *bs, bool frame_header)
{
uint32_t i;
bool frame_is_intra = enc->enc_pic.frame_type == PIPE_AV1_ENC_FRAME_TYPE_KEY ||
@@ -386,53 +386,53 @@ void radeon_enc_av1_frame_header_common(struct radeon_encoder *enc, bool frame_h
bool error_resilient_mode = false;
struct pipe_av1_enc_picture_desc *av1 = enc->enc_pic.av1.desc;
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_obu_header(enc, obu_type);
radeon_enc_av1_obu_header(enc, bs, obu_type);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_SIZE, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_SIZE, 0);
/* uncompressed_header() */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
if (!av1->seq.seq_bits.reduced_still_picture_header) {
radeon_enc_code_fixed_bits(enc, 0, 1); /* show_existing_frame */
radeon_bs_code_fixed_bits(bs, 0, 1); /* show_existing_frame */
/* frame_type */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.frame_type, 2);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.frame_type, 2);
/* show_frame */
radeon_enc_code_fixed_bits(enc, av1->show_frame, 1);
radeon_bs_code_fixed_bits(bs, av1->show_frame, 1);
if (!av1->show_frame)
/* showable_frame */
radeon_enc_code_fixed_bits(enc, av1->showable_frame, 1);
radeon_bs_code_fixed_bits(bs, av1->showable_frame, 1);
if ((enc->enc_pic.frame_type == PIPE_AV1_ENC_FRAME_TYPE_SWITCH) ||
(enc->enc_pic.frame_type == PIPE_AV1_ENC_FRAME_TYPE_KEY && av1->show_frame))
error_resilient_mode = true;
else {
/* error_resilient_mode */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.enable_error_resilient_mode ? 1 : 0, 1);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.enable_error_resilient_mode ? 1 : 0, 1);
error_resilient_mode = enc->enc_pic.enable_error_resilient_mode;
}
}
/* disable_cdf_update */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1_spec_misc.disable_cdf_update ? 1 : 0, 1);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.av1_spec_misc.disable_cdf_update ? 1 : 0, 1);
bool allow_screen_content_tools = false;
if (av1->seq.seq_bits.reduced_still_picture_header || !enc->enc_pic.disable_screen_content_tools) {
/* allow_screen_content_tools */
allow_screen_content_tools = enc->enc_pic.av1_spec_misc.palette_mode_enable ||
enc->enc_pic.force_integer_mv;
radeon_enc_code_fixed_bits(enc, allow_screen_content_tools ? 1 : 0, 1);
radeon_bs_code_fixed_bits(bs, allow_screen_content_tools ? 1 : 0, 1);
}
if (allow_screen_content_tools)
/* force_integer_mv */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.force_integer_mv ? 1 : 0, 1);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.force_integer_mv ? 1 : 0, 1);
if (av1->seq.seq_bits.frame_id_number_present_flag)
/* current_frame_id */
radeon_enc_code_fixed_bits(enc, av1->current_frame_id,
radeon_bs_code_fixed_bits(bs, av1->current_frame_id,
av1->seq.delta_frame_id_length + av1->seq.additional_frame_id_length);
bool frame_size_override = false;
@@ -441,176 +441,179 @@ void radeon_enc_av1_frame_header_common(struct radeon_encoder *enc, bool frame_h
else if (!av1->seq.seq_bits.reduced_still_picture_header) {
/* frame_size_override_flag */
frame_size_override = false;
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
}
if (av1->seq.seq_bits.enable_order_hint)
/* order_hint */
radeon_enc_code_fixed_bits(enc, av1->order_hint, av1->seq.order_hint_bits);
radeon_bs_code_fixed_bits(bs, av1->order_hint, av1->seq.order_hint_bits);
if (!frame_is_intra && !error_resilient_mode)
/* primary_ref_frame */
radeon_enc_code_fixed_bits(enc, av1->primary_ref_frame, 3);
radeon_bs_code_fixed_bits(bs, av1->primary_ref_frame, 3);
if ((enc->enc_pic.frame_type != PIPE_AV1_ENC_FRAME_TYPE_SWITCH) &&
(enc->enc_pic.frame_type != PIPE_AV1_ENC_FRAME_TYPE_KEY || !av1->show_frame))
/* refresh_frame_flags */
radeon_enc_code_fixed_bits(enc, av1->refresh_frame_flags, 8);
radeon_bs_code_fixed_bits(bs, av1->refresh_frame_flags, 8);
if ((!frame_is_intra || av1->refresh_frame_flags != 0xff) &&
error_resilient_mode && av1->seq.seq_bits.enable_order_hint)
for (i = 0; i < RENCODE_AV1_NUM_REF_FRAMES; i++)
/* ref_order_hint */
radeon_enc_code_fixed_bits(enc, av1->ref_order_hint[i], av1->seq.order_hint_bits);
radeon_bs_code_fixed_bits(bs, av1->ref_order_hint[i], av1->seq.order_hint_bits);
if (frame_is_intra) {
/* render_and_frame_size_different */
radeon_enc_code_fixed_bits(enc, av1->enable_render_size ? 1 : 0, 1);
radeon_bs_code_fixed_bits(bs, av1->enable_render_size ? 1 : 0, 1);
if (av1->enable_render_size) {
/* render_width_minus_1 */
radeon_enc_code_fixed_bits(enc, av1->render_width_minus_1, 16);
radeon_bs_code_fixed_bits(bs, av1->render_width_minus_1, 16);
/* render_height_minus_1 */
radeon_enc_code_fixed_bits(enc, av1->render_height_minus_1, 16);
radeon_bs_code_fixed_bits(bs, av1->render_height_minus_1, 16);
}
if (!enc->enc_pic.disable_screen_content_tools &&
(enc->enc_pic.av1_spec_misc.palette_mode_enable || enc->enc_pic.force_integer_mv))
/* allow_intrabc */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
} else {
if (av1->seq.seq_bits.enable_order_hint)
/* frame_refs_short_signaling */
radeon_enc_code_fixed_bits(enc, av1->frame_refs_short_signaling, 1);
radeon_bs_code_fixed_bits(bs, av1->frame_refs_short_signaling, 1);
if (av1->frame_refs_short_signaling) {
radeon_enc_code_fixed_bits(enc, av1->last_frame_idx, 3);
radeon_enc_code_fixed_bits(enc, av1->gold_frame_idx, 3);
radeon_bs_code_fixed_bits(bs, av1->last_frame_idx, 3);
radeon_bs_code_fixed_bits(bs, av1->gold_frame_idx, 3);
}
for (i = 0; i < RENCODE_AV1_REFS_PER_FRAME; i++) {
/* ref_frame_idx[i] */
radeon_enc_code_fixed_bits(enc, av1->ref_frame_idx[i], 3);
radeon_bs_code_fixed_bits(bs, av1->ref_frame_idx[i], 3);
if (av1->seq.seq_bits.frame_id_number_present_flag)
/* delta_frame_id_minus_1[i] */
radeon_enc_code_fixed_bits(enc, av1->delta_frame_id_minus_1[i], av1->seq.delta_frame_id_length);
radeon_bs_code_fixed_bits(bs, av1->delta_frame_id_minus_1[i], av1->seq.delta_frame_id_length);
}
if (frame_size_override && !error_resilient_mode)
/* found_ref */
radeon_enc_code_fixed_bits(enc, 1, 1);
radeon_bs_code_fixed_bits(bs, 1, 1);
else {
if(frame_size_override) {
/* frame_width_minus_1 */
uint32_t used_bits =
radeon_enc_value_bits(enc->enc_pic.av1.coded_width - 1);
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.coded_width - 1,
used_bits);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.av1.coded_width - 1,
used_bits);
/* frame_height_minus_1 */
used_bits = radeon_enc_value_bits(enc->enc_pic.av1.coded_height - 1);
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.coded_height - 1,
used_bits);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.av1.coded_height - 1,
used_bits);
}
/* render_and_frame_size_different */
radeon_enc_code_fixed_bits(enc, av1->enable_render_size ? 1 : 0, 1);
radeon_bs_code_fixed_bits(bs, av1->enable_render_size ? 1 : 0, 1);
if (av1->enable_render_size) {
/* render_width_minus_1 */
radeon_enc_code_fixed_bits(enc, av1->render_width_minus_1, 16);
radeon_bs_code_fixed_bits(bs, av1->render_width_minus_1, 16);
/* render_height_minus_1 */
radeon_enc_code_fixed_bits(enc, av1->render_height_minus_1, 16);
radeon_bs_code_fixed_bits(bs, av1->render_height_minus_1, 16);
}
}
if (enc->enc_pic.disable_screen_content_tools || !enc->enc_pic.force_integer_mv)
/* allow_high_precision_mv */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_ALLOW_HIGH_PRECISION_MV, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_ALLOW_HIGH_PRECISION_MV, 0);
/* read_interpolation_filter */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_READ_INTERPOLATION_FILTER, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_READ_INTERPOLATION_FILTER, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
/* is_motion_mode_switchable */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
}
if (!av1->seq.seq_bits.reduced_still_picture_header && !enc->enc_pic.av1_spec_misc.disable_cdf_update)
/* disable_frame_end_update_cdf */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1_spec_misc.disable_frame_end_update_cdf ? 1 : 0, 1);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.av1_spec_misc.disable_frame_end_update_cdf ? 1 : 0, 1);
}
static void radeon_enc_av1_frame_header(struct radeon_encoder *enc, bool frame_header)
static void radeon_enc_av1_frame_header(struct radeon_encoder *enc, struct radeon_bitstream *bs, bool frame_header)
{
bool frame_is_intra = enc->enc_pic.frame_type == PIPE_AV1_ENC_FRAME_TYPE_KEY ||
enc->enc_pic.frame_type == PIPE_AV1_ENC_FRAME_TYPE_INTRA_ONLY;
radeon_enc_av1_frame_header_common(enc, frame_header);
radeon_enc_av1_frame_header_common(enc, bs, frame_header);
/* tile_info */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_V4_AV1_BITSTREAM_INSTRUCTION_TILE_INFO, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_V4_AV1_BITSTREAM_INSTRUCTION_TILE_INFO, 0);
/* quantization_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_V4_AV1_BITSTREAM_INSTRUCTION_QUANTIZATION_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_V4_AV1_BITSTREAM_INSTRUCTION_QUANTIZATION_PARAMS, 0);
/* segmentation_enable */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_bs_code_fixed_bits(bs, 0, 1);
/* delta_q_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_DELTA_Q_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_DELTA_Q_PARAMS, 0);
/* delta_lf_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_DELTA_LF_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_DELTA_LF_PARAMS, 0);
/* loop_filter_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_LOOP_FILTER_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_LOOP_FILTER_PARAMS, 0);
/* cdef_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_CDEF_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_CDEF_PARAMS, 0);
/* lr_params */
/* read_tx_mode */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_READ_TX_MODE, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_READ_TX_MODE, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
if (!frame_is_intra)
/* reference_select */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
/* reduced_tx_set */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
if (!frame_is_intra)
for (uint32_t ref = 1 /*LAST_FRAME*/; ref <= 7 /*ALTREF_FRAME*/; ref++)
/* is_global */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
/* film_grain_params() */
}
void radeon_enc_av1_tile_group(struct radeon_encoder *enc)
void radeon_enc_av1_tile_group(struct radeon_encoder *enc, struct radeon_bitstream *bs)
{
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_START,
RENCODE_OBU_START_TYPE_TILE_GROUP);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_START,
RENCODE_OBU_START_TYPE_TILE_GROUP);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_obu_header(enc, RENCODE_OBU_TYPE_TILE_GROUP);
radeon_enc_av1_obu_header(enc, bs, RENCODE_OBU_TYPE_TILE_GROUP);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_SIZE, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_TILE_GROUP_OBU, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_END, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_SIZE, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_TILE_GROUP_OBU, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_END, 0);
}
static void radeon_enc_obu_instruction(struct radeon_encoder *enc)
{
struct radeon_bitstream bs;
bool frame_header = !enc->enc_pic.is_obu_frame;
radeon_enc_reset(enc);
radeon_bs_reset(&bs, NULL, &enc->cs);
RADEON_ENC_BEGIN(enc->cmd.bitstream_instruction_av1);
radeon_enc_av1_bs_instruction_type(enc,
radeon_enc_av1_bs_instruction_type(enc, &bs,
RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_START,
frame_header ? RENCODE_OBU_START_TYPE_FRAME_HEADER
: RENCODE_OBU_START_TYPE_FRAME);
radeon_enc_av1_frame_header(enc, frame_header);
radeon_enc_av1_frame_header(enc, &bs, frame_header);
if (!frame_header)
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_TILE_GROUP_OBU, 0);
radeon_enc_av1_bs_instruction_type(enc, &bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_TILE_GROUP_OBU, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_END, 0);
radeon_enc_av1_bs_instruction_type(enc, &bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_END, 0);
if (frame_header)
radeon_enc_av1_tile_group(enc);
radeon_enc_av1_tile_group(enc, &bs);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_END, 0);
radeon_enc_av1_bs_instruction_type(enc, &bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_END, 0);
RADEON_ENC_END();
}
@@ -722,7 +722,7 @@ static void radeon_enc_tile_config_av1(struct radeon_encoder *enc)
RADEON_ENC_END();
}
static void radeon_enc_av1_tile_info(struct radeon_encoder *enc)
static void radeon_enc_av1_tile_info(struct radeon_encoder *enc, struct radeon_bitstream *bs)
{
rvcn_enc_av1_tile_config_t *p_config = &enc->enc_pic.av1_tile_config;
uint32_t i = 0;
@@ -738,17 +738,17 @@ static void radeon_enc_av1_tile_info(struct radeon_encoder *enc)
TileColsLog2 = util_logbase2_ceil(p_config->num_tile_cols);
TileRowsLog2 = util_logbase2_ceil(p_config->num_tile_rows);
radeon_enc_code_fixed_bits(enc, p_config->uniform_tile_spacing, 1);
radeon_bs_code_fixed_bits(bs, p_config->uniform_tile_spacing, 1);
if (p_config->uniform_tile_spacing) {
for ( i = minLog2TileCols; i < TileColsLog2; i++)
radeon_enc_code_fixed_bits(enc, 1, 1);
radeon_bs_code_fixed_bits(bs, 1, 1);
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
for ( i = minLog2Tiles - TileColsLog2; i < TileRowsLog2; i++)
radeon_enc_code_fixed_bits(enc, 1, 1);
radeon_bs_code_fixed_bits(bs, 1, 1);
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
} else {
uint32_t widestTileSb = 0;
uint32_t maxWidthInSb = 0;
@@ -758,7 +758,7 @@ static void radeon_enc_av1_tile_info(struct radeon_encoder *enc)
for (i = 0; i < p_config->num_tile_cols; i++) {
maxWidthInSb = MIN2(sbCols - startSb, maxTileWidthSb);
radeon_enc_code_ns(enc, p_config->tile_widths[i] - 1, maxWidthInSb);
radeon_bs_code_ns(bs, p_config->tile_widths[i] - 1, maxWidthInSb);
startSb += p_config->tile_widths[i];
widestTileSb = MAX2( p_config->tile_widths[i], widestTileSb);
}
@@ -773,52 +773,52 @@ static void radeon_enc_av1_tile_info(struct radeon_encoder *enc)
for (i = 0; i < p_config->num_tile_rows; i++) {
maxHeightInSb = MIN2(sbRows - startSb, maxTileHeightSb);
radeon_enc_code_ns(enc, p_config->tile_height[i] - 1, maxHeightInSb);
radeon_bs_code_ns(bs, p_config->tile_height[i] - 1, maxHeightInSb);
startSb += p_config->tile_height[i];
}
}
if (TileColsLog2 > 0 || TileRowsLog2 > 0) {
radeon_enc_av1_bs_instruction_type(enc, RENCODE_V5_AV1_BITSTREAM_INSTRUCTION_CONTEXT_UPDATE_TILE_ID, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_V5_AV1_BITSTREAM_INSTRUCTION_CONTEXT_UPDATE_TILE_ID, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_code_fixed_bits(enc, p_config->tile_size_bytes_minus_1, 2);
radeon_bs_code_fixed_bits(bs, p_config->tile_size_bytes_minus_1, 2);
}
}
static void radeon_enc_av1_write_delta_q(struct radeon_encoder *enc, int32_t q)
static void radeon_enc_av1_write_delta_q(struct radeon_bitstream *bs, int32_t q)
{
radeon_enc_code_fixed_bits(enc, !!(q), 1);
radeon_bs_code_fixed_bits(bs, !!(q), 1);
if (q)
radeon_enc_code_fixed_bits(enc, q, ( 1 + 6 ));
radeon_bs_code_fixed_bits(bs, q, ( 1 + 6 ));
}
static void radeon_enc_av1_quantization_params(struct radeon_encoder *enc)
static void radeon_enc_av1_quantization_params(struct radeon_encoder *enc, struct radeon_bitstream *bs)
{
rvcn_enc_av1_spec_misc_t *p = &enc->enc_pic.av1_spec_misc;
radeon_enc_av1_bs_instruction_type(enc, RENCODE_V5_AV1_BITSTREAM_INSTRUCTION_BASE_Q_IDX, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_V5_AV1_BITSTREAM_INSTRUCTION_BASE_Q_IDX, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_write_delta_q(enc, p->delta_q_y_dc);
radeon_enc_av1_write_delta_q(bs, p->delta_q_y_dc);
/* only support multi-planes at the time */
if (p->separate_delta_q)
radeon_enc_code_fixed_bits(enc, 1, 1);
radeon_bs_code_fixed_bits(bs, 1, 1);
radeon_enc_av1_write_delta_q(enc, p->delta_q_u_dc);
radeon_enc_av1_write_delta_q(enc, p->delta_q_u_ac);
radeon_enc_av1_write_delta_q(bs, p->delta_q_u_dc);
radeon_enc_av1_write_delta_q(bs, p->delta_q_u_ac);
if (p->separate_delta_q) {
radeon_enc_av1_write_delta_q(enc, p->delta_q_v_dc);
radeon_enc_av1_write_delta_q(enc, p->delta_q_v_ac);
radeon_enc_av1_write_delta_q(bs, p->delta_q_v_dc);
radeon_enc_av1_write_delta_q(bs, p->delta_q_v_ac);
}
/* using qmatrix */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
}
static int32_t radeon_enc_av1_get_relative_dist(struct radeon_encoder *enc, uint32_t a, uint32_t b)
@@ -886,74 +886,76 @@ bool radeon_enc_av1_skip_mode_allowed(struct radeon_encoder *enc, uint32_t frame
return true;
}
static void radeon_enc_av1_frame_header(struct radeon_encoder *enc, bool frame_header)
static void radeon_enc_av1_frame_header(struct radeon_encoder *enc, struct radeon_bitstream *bs, bool frame_header)
{
bool frame_is_intra = enc->enc_pic.frame_type == PIPE_AV1_ENC_FRAME_TYPE_KEY ||
enc->enc_pic.frame_type == PIPE_AV1_ENC_FRAME_TYPE_INTRA_ONLY;
radeon_enc_av1_frame_header_common(enc, frame_header);
radeon_enc_av1_frame_header_common(enc, bs, frame_header);
/* tile_info */
radeon_enc_av1_tile_info(enc);
radeon_enc_av1_tile_info(enc, bs);
/* quantization_params */
radeon_enc_av1_quantization_params(enc);
radeon_enc_av1_quantization_params(enc, bs);
/* segmentation_enable */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
/* delta_q_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_DELTA_Q_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_DELTA_Q_PARAMS, 0);
/* delta_lf_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_DELTA_LF_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_DELTA_LF_PARAMS, 0);
/* loop_filter_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_LOOP_FILTER_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_LOOP_FILTER_PARAMS, 0);
/* cdef_params */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_CDEF_PARAMS, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_CDEF_PARAMS, 0);
/* lr_params */
/* read_tx_mode */
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_READ_TX_MODE, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_READ_TX_MODE, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
radeon_enc_av1_bs_instruction_type(enc, bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_COPY, 0);
if (!frame_is_intra)
/* reference_select */
radeon_enc_code_fixed_bits(enc, enc->enc_pic.av1.compound, 1);
radeon_bs_code_fixed_bits(bs, enc->enc_pic.av1.compound, 1);
if (enc->enc_pic.av1.skip_mode_allowed)
/* skip_mode_present */
radeon_enc_code_fixed_bits(enc, !enc->enc_pic.av1_spec_misc.disallow_skip_mode, 1);
radeon_bs_code_fixed_bits(bs, !enc->enc_pic.av1_spec_misc.disallow_skip_mode, 1);
/* reduced_tx_set */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
if (!frame_is_intra)
for (uint32_t ref = 1 /*LAST_FRAME*/; ref <= 7 /*ALTREF_FRAME*/; ref++)
/* is_global */
radeon_enc_code_fixed_bits(enc, 0, 1);
radeon_bs_code_fixed_bits(bs, 0, 1);
/* film_grain_params() */
}
static void radeon_enc_obu_instruction(struct radeon_encoder *enc)
{
bool frame_header = !enc->enc_pic.is_obu_frame;
struct radeon_bitstream bs;
radeon_bs_reset(&bs, NULL, &enc->cs);
radeon_enc_reset(enc);
RADEON_ENC_BEGIN(enc->cmd.bitstream_instruction_av1);
radeon_enc_av1_bs_instruction_type(enc,
radeon_enc_av1_bs_instruction_type(enc, &bs,
RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_START,
frame_header ? RENCODE_OBU_START_TYPE_FRAME_HEADER
: RENCODE_OBU_START_TYPE_FRAME);
radeon_enc_av1_frame_header(enc, frame_header);
radeon_enc_av1_frame_header(enc, &bs, frame_header);
if (!frame_header)
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_TILE_GROUP_OBU, 0);
radeon_enc_av1_bs_instruction_type(enc, &bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_TILE_GROUP_OBU, 0);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_END, 0);
radeon_enc_av1_bs_instruction_type(enc, &bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_OBU_END, 0);
if (frame_header)
radeon_enc_av1_tile_group(enc);
radeon_enc_av1_tile_group(enc, &bs);
radeon_enc_av1_bs_instruction_type(enc, RENCODE_AV1_BITSTREAM_INSTRUCTION_END, 0);
radeon_enc_av1_bs_instruction_type(enc, &bs, RENCODE_AV1_BITSTREAM_INSTRUCTION_END, 0);
RADEON_ENC_END();
}