From 71b549cef6216b400045de3d331e22adbe87e7cd Mon Sep 17 00:00:00 2001 From: Julian Scheel Date: Sat, 31 Jan 2009 13:16:37 +0000 Subject: Code cleanup. --- src/libvdpau/dpb.c | 10 +++---- src/libvdpau/h264_parser.c | 66 +++++++++++++++++++++++----------------------- src/libvdpau/nal.h | 3 ++- src/libvdpau/vdpau_h264.c | 2 +- 4 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/libvdpau/dpb.c b/src/libvdpau/dpb.c index acc3f0865..9aa2f4298 100644 --- a/src/libvdpau/dpb.c +++ b/src/libvdpau/dpb.c @@ -347,13 +347,11 @@ int fill_vdpau_reference_list(struct dpb *dpb, VdpReferenceFrameH264 *reflist) reflist[i].surface = pic->surface; reflist[i].is_long_term = pic->nal->used_for_long_term_ref; if(reflist[i].is_long_term) - reflist[i].frame_idx = pic->nal->slc->frame_num; //pic->nal->long_term_frame_idx; + reflist[i].frame_idx = pic->nal->slc->frame_num; else - reflist[i].frame_idx = pic->nal->slc->frame_num; //pic->nal->curr_pic_num; - reflist[i].top_is_reference = pic->top_is_reference; /*pic->nal->slc->field_pic_flag - ? (pic->nal->slc->bottom_field_flag ? 0 : 1) : 1;*/ - reflist[i].bottom_is_reference = pic->bottom_is_reference; /*pic->nal->slc->field_pic_flag - ? (pic->nal->slc->bottom_field_flag ? 1 : 0) : 1;*/ + reflist[i].frame_idx = pic->nal->slc->frame_num; + reflist[i].top_is_reference = pic->top_is_reference; + reflist[i].bottom_is_reference = pic->bottom_is_reference; reflist[i].field_order_cnt[0] = pic->nal->top_field_order_cnt; reflist[i].field_order_cnt[1] = pic->nal->bottom_field_order_cnt; i++; diff --git a/src/libvdpau/h264_parser.c b/src/libvdpau/h264_parser.c index f19383f8a..37ad1402b 100644 --- a/src/libvdpau/h264_parser.c +++ b/src/libvdpau/h264_parser.c @@ -442,11 +442,11 @@ static void pps_scaling_list_fallback(struct seq_parameter_set_rbsp *sps, struct uint8_t parse_sps(struct buf_reader *buf, struct nal_parser *parser) { struct seq_parameter_set_rbsp *sps = parser->current_nal->sps; - sps->profile_idc = buf->buf[0]; - sps->constraint_setN_flag = (buf->buf[1] >> 4) & 0x0f; - sps->level_idc = buf->buf[2]; + sps->profile_idc = read_bits(buf, 8); + sps->constraint_setN_flag = read_bits(buf, 4); + read_bits(buf, 4); + sps->level_idc = read_bits(buf, 8); - buf->cur_pos = buf->buf + 3; sps->seq_parameter_set_id = read_exp_golomb(buf); memset(sps->scaling_lists_4x4, 16, sizeof(sps->scaling_lists_4x4)); @@ -455,7 +455,7 @@ uint8_t parse_sps(struct buf_reader *buf, struct nal_parser *parser) == 122 || sps->profile_idc == 144) { sps->chroma_format_idc = read_exp_golomb(buf); if (sps->chroma_format_idc == 3) { - sps->residual_colour_transform_flag = read_bits(buf, 1); + sps->separate_colour_plane_flag = read_bits(buf, 1); } sps->bit_depth_luma_minus8 = read_exp_golomb(buf); @@ -484,7 +484,7 @@ uint8_t parse_sps(struct buf_reader *buf, struct nal_parser *parser) sps->pic_order_cnt_type = read_exp_golomb(buf); if (!sps->pic_order_cnt_type) sps->log2_max_pic_order_cnt_lsb_minus4 = read_exp_golomb(buf); - else { + else if(sps->pic_order_cnt_type == 1) { sps->delta_pic_order_always_zero_flag = read_bits(buf, 1); sps->offset_for_non_ref_pic = read_exp_golomb_s(buf); sps->offset_for_top_to_bottom_field = read_exp_golomb_s(buf); @@ -661,7 +661,6 @@ void parse_vui_parameters(struct buf_reader *buf, sps->vui_parameters.log2_max_mv_length_vertical = read_exp_golomb(buf); sps->vui_parameters.num_reorder_frames = read_exp_golomb(buf); sps->vui_parameters.max_dec_frame_buffering = read_exp_golomb(buf); - printf("Max_dec_frame_buffering: %d\n", sps->vui_parameters.max_dec_frame_buffering); } } @@ -738,7 +737,6 @@ uint8_t parse_pps(struct buf_reader *buf, struct pic_parameter_set_rbsp *pps, memset(pps->scaling_lists_4x4, 16, sizeof(pps->scaling_lists_4x4)); memset(pps->scaling_lists_8x8, 16, sizeof(pps->scaling_lists_8x8)); if (bit_length-bit_read > 1) { - printf("Read transform 8x8\n"); pps->transform_8x8_mode_flag = read_bits(buf, 1); pps->pic_scaling_matrix_present_flag = read_bits(buf, 1); if (pps->pic_scaling_matrix_present_flag) { @@ -786,6 +784,9 @@ uint8_t parse_slice_header(struct buf_reader *buf, struct nal_parser *parser) //print_slice_type(slc->slice_type); slc->pic_parameter_set_id = read_exp_golomb(buf); + if(sps->separate_colour_plane_flag) + slc->colour_plane_id = read_bits(buf, 2); + slc->frame_num = read_bits(buf, sps->log2_max_frame_num_minus4 + 4); if (!sps->frame_mbs_only_flag) { slc->field_pic_flag = read_bits(buf, 1); @@ -816,7 +817,8 @@ uint8_t parse_slice_header(struct buf_reader *buf, struct nal_parser *parser) if (pps->pic_order_present_flag && !slc->field_pic_flag) slc->delta_pic_order_cnt_bottom = read_exp_golomb_s(buf); } - else if (sps->pic_order_cnt_type == 1) { + + if (sps->pic_order_cnt_type == 1 && !sps->delta_pic_order_always_zero_flag) { slc->delta_pic_order_cnt[0] = read_exp_golomb_s(buf); if (pps->pic_order_present_flag && !slc->field_pic_flag) slc->delta_pic_order_cnt[1] = read_exp_golomb_s(buf); @@ -863,11 +865,7 @@ uint8_t parse_slice_header(struct buf_reader *buf, struct nal_parser *parser) void parse_ref_pic_list_reordering(struct buf_reader *buf, struct nal_unit *nal, struct nal_parser *parser) { - struct seq_parameter_set_rbsp *sps = nal->sps; - struct pic_parameter_set_rbsp *pps = nal->pps; struct slice_header *slc = nal->slc; - if (!sps || !pps) - return; if (slc->slice_type != SLICE_I && slc->slice_type != SLICE_SI) { slc->ref_pic_list_reordering.ref_pic_list_reordering_flag_l0 = read_bits( @@ -922,7 +920,11 @@ void parse_pred_weight_table(struct buf_reader *buf, struct nal_unit *nal) nal->slc->pred_weight_table.luma_log2_weight_denom = read_exp_golomb(buf); - if (sps->chroma_format_idc != 0) + uint32_t ChromaArrayType = sps->chroma_format_idc; + if(sps->separate_colour_plane_flag) + ChromaArrayType = 0; + + if (ChromaArrayType != 0) nal->slc->pred_weight_table.chroma_log2_weight_denom = read_exp_golomb(buf); int i; @@ -934,7 +936,7 @@ void parse_pred_weight_table(struct buf_reader *buf, struct nal_unit *nal) nal->slc->pred_weight_table.luma_offset_l0[i] = read_exp_golomb_s(buf); } - if (sps->chroma_format_idc != 0) { + if (ChromaArrayType != 0) { uint8_t chroma_weight_l0_flag = read_bits(buf, 1); if (chroma_weight_l0_flag == 1) { @@ -958,7 +960,7 @@ void parse_pred_weight_table(struct buf_reader *buf, struct nal_unit *nal) nal->slc->pred_weight_table.luma_offset_l1[i] = read_exp_golomb_s(buf); } - if (sps->chroma_format_idc != 0) { + if (ChromaArrayType != 0) { uint8_t chroma_weight_l1_flag = read_bits(buf, 1); if (chroma_weight_l1_flag == 1) { @@ -980,17 +982,15 @@ void decode_ref_pic_marking(struct nal_unit *nal, uint32_t marking_nr, struct nal_parser *parser) { - struct seq_parameter_set_rbsp *sps = nal->sps; - struct pic_parameter_set_rbsp *pps = nal->pps; struct slice_header *slc = nal->slc; struct dpb *dpb = &parser->dpb; - if (!sps || !pps || !slc) + if (!slc) return; if (memory_management_control_operation == 1) { // short-term -> unused for reference uint32_t pic_num_x = (nal->curr_pic_num - - (slc->dec_ref_pic_marking[marking_nr].difference_of_pic_nums_minus1 + 1))%nal->max_pic_num; + - (slc->dec_ref_pic_marking[marking_nr].difference_of_pic_nums_minus1 + 1))%(nal->max_pic_num+1); struct decoded_picture* pic = NULL; if ((pic = dpb_get_picture(dpb, pic_num_x)) != NULL) { if (pic->nal->slc->field_pic_flag == 0) { @@ -1083,10 +1083,9 @@ void parse_dec_ref_pic_marking(struct buf_reader *buf, struct nal_parser *parser) { struct nal_unit *nal = parser->current_nal; - struct seq_parameter_set_rbsp *sps = nal->sps; - struct pic_parameter_set_rbsp *pps = nal->pps; struct slice_header *slc = nal->slc; - if (!sps || !pps) + + if (!slc) return; slc->dec_ref_pic_marking_count = 0; @@ -1095,8 +1094,7 @@ void parse_dec_ref_pic_marking(struct buf_reader *buf, if (nal->nal_unit_type == NAL_SLICE_IDR) { slc->dec_ref_pic_marking[i].no_output_of_prior_pics_flag = read_bits(buf, 1); slc->dec_ref_pic_marking[i].long_term_reference_flag = read_bits(buf, 1); - } - else { + } else { slc->dec_ref_pic_marking[i].adaptive_ref_pic_marking_mode_flag = read_bits( buf, 1); @@ -1133,7 +1131,7 @@ void parse_dec_ref_pic_marking(struct buf_reader *buf, } } - slc->dec_ref_pic_marking_count = i; + slc->dec_ref_pic_marking_count = (i>0) ? (i-1) : 0; } /* ----------------- NAL parser ----------------- */ @@ -1238,17 +1236,19 @@ int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, uint8_t *prebuf = parser->prebuf; if(parser->nal_size_length > 0) - start_seq_len = 4-parser->have_nal_size_length_buf; + start_seq_len = parser->nal_size_length-parser->have_nal_size_length_buf; if(parser->last_nal_res == 1 && parser->current_nal && parser->current_nal->slc) { int i; for(i = 0; i < parser->current_nal->slc->dec_ref_pic_marking_count; i++) { - decode_ref_pic_marking( - parser->current_nal, - parser->current_nal->slc->dec_ref_pic_marking[i].memory_management_control_operation, - i, - parser); + if(parser->current_nal->slc->dec_ref_pic_marking[i].adaptive_ref_pic_marking_mode_flag) { + decode_ref_pic_marking( + parser->current_nal, + parser->current_nal->slc->dec_ref_pic_marking[i].memory_management_control_operation, + i, + parser); + } } if (parser->last_nal->slc != NULL) @@ -1260,7 +1260,7 @@ int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, while ((next_nal = seek_for_nal(inbuf+search_offset, inbuf_len-parsed_len-search_offset, parser)) >= 0) { next_nal += search_offset; if(parser->nal_size_length > 0) - start_seq_len = 4-parser->have_nal_size_length_buf; + start_seq_len = parser->nal_size_length-parser->have_nal_size_length_buf; if(parser->incomplete_nal || completed_nal || next_nal == 0 || parser->nal_size_length) { diff --git a/src/libvdpau/nal.h b/src/libvdpau/nal.h index e03a69242..4e039b8b8 100644 --- a/src/libvdpau/nal.h +++ b/src/libvdpau/nal.h @@ -164,7 +164,7 @@ struct seq_parameter_set_rbsp uint8_t level_idc; // 0xff uint32_t seq_parameter_set_id; uint32_t chroma_format_idc; - uint8_t residual_colour_transform_flag; // 0x01 + uint8_t separate_colour_plane_flag; // 0x01 uint32_t bit_depth_luma_minus8; uint32_t bit_depth_chroma_minus8; uint8_t qpprime_y_zero_transform_bypass_flag; @@ -350,6 +350,7 @@ struct slice_header uint32_t first_mb_in_slice; uint32_t slice_type; uint32_t pic_parameter_set_id; + uint8_t colour_plane_id; uint32_t frame_num; uint8_t field_pic_flag; uint8_t bottom_field_flag; diff --git a/src/libvdpau/vdpau_h264.c b/src/libvdpau/vdpau_h264.c index 16d8e3fb9..8197a936a 100644 --- a/src/libvdpau/vdpau_h264.c +++ b/src/libvdpau/vdpau_h264.c @@ -626,7 +626,7 @@ static void vdpau_h264_decode_data (video_decoder_t *this_gen, while(len < buf->size && !(this->wait_for_frame_start && !(buf->decoder_flags & BUF_FLAG_FRAME_START))) { this->wait_for_frame_start = 0; len += parse_frame(this->nal_parser, buf->content + len, buf->size - len, - (void*)&vdp_buffer.bitstream, &vdp_buffer.bitstream_bytes, &slice_count); + (uint8_t*)&vdp_buffer.bitstream, &vdp_buffer.bitstream_bytes, &slice_count); if(this->decoder == VDP_INVALID_HANDLE && this->nal_parser->current_nal->sps != NULL && -- cgit v1.2.3