radeonsi/vcn: Don't hardcode nal_ref_idc
For slice header use the value parsed by frontend. For SPS and PPS directly output first NAL byte from packed header. Reviewed-by: Ruijing Dong <ruijing.dong@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31354>
This commit is contained in:
@@ -1490,11 +1490,14 @@ static uint32_t radeon_vcn_enc_encode_h264_header(struct radeon_encoder *enc,
|
||||
struct pipe_enc_raw_header *header,
|
||||
uint8_t *out)
|
||||
{
|
||||
/* Startcode may be 3 or 4 bytes. */
|
||||
const uint8_t nal_byte = header->buffer[header->buffer[2] == 0x1 ? 3 : 4];
|
||||
|
||||
switch (header->type) {
|
||||
case PIPE_H264_NAL_SPS:
|
||||
return radeon_enc_write_sps(enc, out);
|
||||
return radeon_enc_write_sps(enc, nal_byte, out);
|
||||
case PIPE_H264_NAL_PPS:
|
||||
return radeon_enc_write_pps(enc, out);
|
||||
return radeon_enc_write_pps(enc, nal_byte, out);
|
||||
default:
|
||||
assert(header->buffer);
|
||||
memcpy(out, header->buffer, header->size);
|
||||
|
||||
@@ -346,9 +346,9 @@ void radeon_enc_4_0_init(struct radeon_encoder *enc);
|
||||
|
||||
void radeon_enc_5_0_init(struct radeon_encoder *enc);
|
||||
|
||||
unsigned int radeon_enc_write_sps(struct radeon_encoder *enc, uint8_t *out);
|
||||
unsigned int radeon_enc_write_sps(struct radeon_encoder *enc, uint8_t nal_byte, uint8_t *out);
|
||||
|
||||
unsigned int radeon_enc_write_pps(struct radeon_encoder *enc, uint8_t *out);
|
||||
unsigned int radeon_enc_write_pps(struct radeon_encoder *enc, uint8_t nal_byte, uint8_t *out);
|
||||
|
||||
unsigned int radeon_enc_write_vps(struct radeon_encoder *enc, uint8_t *out);
|
||||
|
||||
|
||||
@@ -191,7 +191,7 @@ static void radeon_enc_quality_params(struct radeon_encoder *enc)
|
||||
RADEON_ENC_END();
|
||||
}
|
||||
|
||||
unsigned int radeon_enc_write_sps(struct radeon_encoder *enc, uint8_t *out)
|
||||
unsigned int radeon_enc_write_sps(struct radeon_encoder *enc, uint8_t nal_byte, uint8_t *out)
|
||||
{
|
||||
struct radeon_enc_pic *pic = &enc->enc_pic;
|
||||
struct pipe_h264_enc_seq_param *sps = &pic->h264.desc->seq;
|
||||
@@ -200,7 +200,7 @@ unsigned int radeon_enc_write_sps(struct radeon_encoder *enc, uint8_t *out)
|
||||
radeon_enc_set_output_buffer(enc, out);
|
||||
radeon_enc_set_emulation_prevention(enc, false);
|
||||
radeon_enc_code_fixed_bits(enc, 0x00000001, 32);
|
||||
radeon_enc_code_fixed_bits(enc, 0x67, 8);
|
||||
radeon_enc_code_fixed_bits(enc, nal_byte, 8);
|
||||
radeon_enc_byte_align(enc);
|
||||
radeon_enc_set_emulation_prevention(enc, true);
|
||||
radeon_enc_code_fixed_bits(enc, pic->spec_misc.profile_idc, 8);
|
||||
@@ -454,13 +454,13 @@ unsigned int radeon_enc_write_sps_hevc(struct radeon_encoder *enc, uint8_t *out)
|
||||
return enc->bits_buf_pos;
|
||||
}
|
||||
|
||||
unsigned int radeon_enc_write_pps(struct radeon_encoder *enc, uint8_t *out)
|
||||
unsigned int radeon_enc_write_pps(struct radeon_encoder *enc, uint8_t nal_byte, uint8_t *out)
|
||||
{
|
||||
radeon_enc_reset(enc);
|
||||
radeon_enc_set_output_buffer(enc, out);
|
||||
radeon_enc_set_emulation_prevention(enc, false);
|
||||
radeon_enc_code_fixed_bits(enc, 0x00000001, 32);
|
||||
radeon_enc_code_fixed_bits(enc, 0x68, 8);
|
||||
radeon_enc_code_fixed_bits(enc, nal_byte, 8);
|
||||
radeon_enc_byte_align(enc);
|
||||
radeon_enc_set_emulation_prevention(enc, true);
|
||||
radeon_enc_code_ue(enc, 0x0); /* pic_parameter_set_id */
|
||||
@@ -608,12 +608,9 @@ static void radeon_enc_slice_header(struct radeon_encoder *enc)
|
||||
radeon_enc_set_emulation_prevention(enc, false);
|
||||
|
||||
cdw_start = enc->cs.current.cdw;
|
||||
if (enc->enc_pic.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR)
|
||||
radeon_enc_code_fixed_bits(enc, 0x65, 8);
|
||||
else if (enc->enc_pic.not_referenced)
|
||||
radeon_enc_code_fixed_bits(enc, 0x01, 8);
|
||||
else
|
||||
radeon_enc_code_fixed_bits(enc, 0x41, 8);
|
||||
radeon_enc_code_fixed_bits(enc, 0x0, 1); /* forbidden_zero_bit */
|
||||
radeon_enc_code_fixed_bits(enc, pps->nal_ref_idc, 2);
|
||||
radeon_enc_code_fixed_bits(enc, pps->nal_unit_type, 5);
|
||||
|
||||
radeon_enc_flush_headers(enc);
|
||||
instruction[inst_index] = RENCODE_HEADER_INSTRUCTION_COPY;
|
||||
|
||||
Reference in New Issue
Block a user