summaryrefslogtreecommitdiff
path: root/src/libvdpau/nal_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libvdpau/nal_parser.c')
-rw-r--r--src/libvdpau/nal_parser.c49
1 files changed, 35 insertions, 14 deletions
diff --git a/src/libvdpau/nal_parser.c b/src/libvdpau/nal_parser.c
index 8b3265337..7422bd118 100644
--- a/src/libvdpau/nal_parser.c
+++ b/src/libvdpau/nal_parser.c
@@ -4,6 +4,26 @@
#include "nal_parser.h"
+/* default scaling_lists according to Table 7-2 */
+uint8_t default_4x4_intra[16] =
+ { 6, 13, 13, 20, 20, 20, 28, 28, 28, 28, 32, 32, 32, 37, 37, 42 };
+
+uint8_t default_4x4_inter[16] =
+ { 10, 14, 14, 20, 20, 20, 24, 24, 24, 24, 27, 27, 27, 30, 30, 34};
+
+uint8_t default_8x8_intra[64] =
+ { 6, 10, 10, 13, 11, 13, 16, 16, 16, 16, 18, 18, 18, 18, 18, 32,
+ 23, 23, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27,
+ 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31,
+ 31, 33, 33, 33, 33, 33, 36, 36, 36, 36, 38, 38, 38, 40, 40, 42 };
+
+uint8_t default_8x8_inter[64] =
+ { 9, 13, 13, 15, 13, 15, 17, 17, 17, 17, 19, 19, 19, 19, 19, 21,
+ 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 24,
+ 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27,
+ 27, 28, 28, 28, 28, 28, 30, 30, 30, 30, 32, 32, 32, 33, 33, 35 };
+
+
struct buf_reader {
uint8_t *buf;
uint8_t *cur_pos;
@@ -15,6 +35,7 @@ static inline uint32_t read_bits(struct buf_reader *buf, int len);
uint32_t read_exp_golomb(struct buf_reader *buf);
int32_t read_exp_golomb_s(struct buf_reader *buf);
void skip_scaling_list(struct buf_reader *buf, int size);
+void parse_scaling_list(struct buf_reader *buf, uint8_t *scaling_list, int length, int index);
int parse_nal_header(struct buf_reader *buf, struct nal_unit *nal);
uint8_t parse_sps(struct buf_reader *buf, struct seq_parameter_set_rbsp *sps);
uint8_t parse_pps(struct buf_reader *buf, struct pic_parameter_set_rbsp *pps);
@@ -105,8 +126,8 @@ static inline uint8_t rbsp_trailing_bits(struct buf_reader *buf)
uint8_t rbsp_trailing_bits = 1;
- offset = buf->cur_offset;
- pos = buf->cur_pos;
+ last_offset = buf->cur_offset;
+ last_pos = buf->cur_pos;
if(read_bits(buf, 1) == 1)
{
@@ -116,8 +137,8 @@ static inline uint8_t rbsp_trailing_bits(struct buf_reader *buf)
}
// revert buffer
- buf->cur_offset = offset;
- buf->cur_pos = pos;
+ buf->cur_offset = last_offset;
+ buf->cur_pos = last_pos;
return rbsp_trailing_bits;
}
@@ -225,8 +246,8 @@ void parse_scaling_list(struct buf_reader *buf, uint8_t *scaling_list, int lengt
break;
}
}
- scaling_list = (next_scale == 0) ? last_scale : next_scale;
- last_scale = scaling_list->scaling_list[i];
+ scaling_list[i] = (next_scale == 0) ? last_scale : next_scale;
+ last_scale = scaling_list[i];
}
if(use_default_scaling_matrix_flag) {
@@ -234,18 +255,18 @@ void parse_scaling_list(struct buf_reader *buf, uint8_t *scaling_list, int lengt
case 0:
case 1:
case 2:
- memcpy(scaling_list, length, default_4x4_intra);
+ memcpy(scaling_list, default_4x4_intra, length);
break;
case 3:
case 4:
case 5:
- memcpy(scaling_list, length, default_4x4_inter);
+ memcpy(scaling_list, default_4x4_inter, length);
break;
case 6:
- memcpy(scaling_list, length, default_8x8_intra);
+ memcpy(scaling_list, default_8x8_intra, length);
break;
case 7:
- memcpy(scaling_list, length, default_8x8_inter);
+ memcpy(scaling_list, default_8x8_inter, length);
break;
}
}
@@ -341,7 +362,7 @@ uint8_t parse_pps(struct buf_reader *buf, struct pic_parameter_set_rbsp *pps)
pps->entropy_coding_mode_flag = read_bits(buf, 1);
pps->pic_order_present_flag = read_bits(buf, 1);
- pps->num_slice_groups_minus1 = read_exp_golomp(buf);
+ pps->num_slice_groups_minus1 = read_exp_golomb(buf);
if(pps->num_slice_groups_minus1 > 0) {
pps->slice_group_map_type = read_exp_golomb(buf);
if(pps->slice_group_map_type == 0) {
@@ -364,7 +385,7 @@ uint8_t parse_pps(struct buf_reader *buf, struct pic_parameter_set_rbsp *pps)
int i_group;
for(i_group = 0; i_group <= pps->num_slice_groups_minus1; i_group++) {
pps->slice_group_id[i_group] =
- read_bits(buf, ceil(log2(pps->num_slice_groups_minus1 + 1)));
+ read_bits(buf, ceil(log(pps->num_slice_groups_minus1 + 1)));
}
}
}
@@ -372,7 +393,7 @@ uint8_t parse_pps(struct buf_reader *buf, struct pic_parameter_set_rbsp *pps)
pps->num_ref_idx_l0_active_minus1 = read_exp_golomb(buf);
pps->num_ref_idx_l1_active_minus1 = read_exp_golomb(buf);
pps->weighted_pred_flag = read_bits(buf, 1);
- pps->weighted_bipred_flag = read_bits(buf, 2);
+ pps->weighted_bipred_idc = read_bits(buf, 2);
pps->pic_init_qp_minus26 = read_exp_golomb_s(buf);
pps->pic_init_qs_minus26 = read_exp_golomb_s(buf);
pps->chroma_qp_index_offset = read_exp_golomb_s(buf);
@@ -478,7 +499,7 @@ void free_parser(struct nal_parser *parser)
}
int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len,
- uint8_t **ret_buf, int *ret_len, int *ret_slice_cnt)
+ uint8_t **ret_buf, uint32_t *ret_len, uint32_t *ret_slice_cnt)
{
int next_nal;
int parsed_len = 0;