From 3e7b5e5db2f332e258d01c855137476e8fd4a44f Mon Sep 17 00:00:00 2001 From: Leo Liu Date: Tue, 18 Sep 2018 16:19:57 -0400 Subject: [PATCH] radeon/uvd: use bitstream coded number for symbols of Huffman tables Signed-off-by: Leo Liu Fixes: 130d1f456(radeon/uvd: reconstruct MJPEG bitstream) Cc: "18.2" Reviewed-by: Boyuan Zhang --- src/gallium/drivers/radeon/radeon_uvd.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/radeon/radeon_uvd.c b/src/gallium/drivers/radeon/radeon_uvd.c index 923216d77f1..a7ef4252ee0 100644 --- a/src/gallium/drivers/radeon/radeon_uvd.c +++ b/src/gallium/drivers/radeon/radeon_uvd.c @@ -1003,25 +1003,35 @@ static void get_mjpeg_slice_header(struct ruvd_decoder *dec, struct pipe_mjpeg_p size++; for (i = 0; i < 2; ++i) { + int num = 0, j; + if (pic->huffman_table.load_huffman_table[i] == 0) continue; buf[size++] = 0x00 | i; memcpy((buf + size), &pic->huffman_table.table[i].num_dc_codes, 16); size += 16; - memcpy((buf + size), &pic->huffman_table.table[i].dc_values, 12); - size += 12; + for (j = 0; j < 16; ++j) + num += pic->huffman_table.table[i].num_dc_codes[j]; + assert(num <= 12); + memcpy((buf + size), &pic->huffman_table.table[i].dc_values, num); + size += num; } for (i = 0; i < 2; ++i) { + int num = 0, j; + if (pic->huffman_table.load_huffman_table[i] == 0) continue; buf[size++] = 0x10 | i; memcpy((buf + size), &pic->huffman_table.table[i].num_ac_codes, 16); size += 16; - memcpy((buf + size), &pic->huffman_table.table[i].ac_values, 162); - size += 162; + for (j = 0; j < 16; ++j) + num += pic->huffman_table.table[i].num_ac_codes[j]; + assert(num <= 162); + memcpy((buf + size), &pic->huffman_table.table[i].ac_values, num); + size += num; } bs = (uint16_t*)&buf[len_pos]; -- 2.30.2