diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libvdpau/h264_parser.c | 16 | ||||
-rw-r--r-- | src/libvdpau/vdpau_h264.c | 80 |
2 files changed, 51 insertions, 45 deletions
diff --git a/src/libvdpau/h264_parser.c b/src/libvdpau/h264_parser.c index c41cb5cf6..c888d9e1d 100644 --- a/src/libvdpau/h264_parser.c +++ b/src/libvdpau/h264_parser.c @@ -976,7 +976,7 @@ int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, } if (parser->last_nal_res != 2) { - /* this is not nal_unit != SLICE, keep it in the buffer */ + /* this is a SLICE, keep it in the buffer */ xine_fast_memcpy(parser->buf + parser->buf_len, inbuf, next_nal + search_offset); parser->buf_len += next_nal + search_offset; @@ -1042,6 +1042,7 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser) if (res >= NAL_SLICE && res <= NAL_SLICE_IDR) { // now detect if it's a new frame! int ret = 0; + uint8_t reason = 0; if (nal->slc->field_pic_flag == 1) parser->field = nal->slc->bottom_field_flag; else { @@ -1056,26 +1057,32 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser) if (nal->slc == NULL || last_nal->slc == NULL) { ret = 1; + reason++; } if (nal->slc && last_nal->slc && (nal->slc->frame_num != last_nal->slc->frame_num)) { ret = 1; + reason++; } if (nal->slc && last_nal->slc && (nal->slc->pic_parameter_set_id != last_nal->slc->pic_parameter_set_id)) { ret = 1; + reason++; } if (nal->slc && last_nal->slc && (nal->slc->field_pic_flag != last_nal->slc->field_pic_flag)) { ret = 1; + reason++; } if (nal->slc && last_nal->slc && nal->slc->bottom_field_flag != last_nal->slc->bottom_field_flag) { ret = 1; + reason++; } if (nal->nal_ref_idc != last_nal->nal_ref_idc && (nal->nal_ref_idc == 0 || last_nal->nal_ref_idc == 0)) { ret = 1; + reason++; } if (nal->sps && nal->slc && last_nal->slc && (nal->sps->pic_order_cnt_type == 0 && last_nal->sps->pic_order_cnt_type == 0 @@ -1083,6 +1090,8 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser) || nal->slc->delta_pic_order_cnt_bottom != last_nal->slc->delta_pic_order_cnt_bottom))) { ret = 1; + reason++; + printf("C: Reason: %d, %d, %d\n", res, nal->slc->pic_order_cnt_lsb, last_nal->slc->pic_order_cnt_lsb); } if (nal->slc && last_nal->slc && (nal->sps->pic_order_cnt_type == 1 && last_nal->sps->pic_order_cnt_type == 1 @@ -1091,15 +1100,18 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser) || nal->slc->delta_pic_order_cnt[1] != last_nal->slc->delta_pic_order_cnt[1]))) { ret = 1; + reason++; } if (nal->nal_unit_type != last_nal->nal_unit_type && (nal->nal_unit_type == 5 || last_nal->nal_unit_type == 5)) { ret = 1; + reason++; } if (nal->slc && last_nal->slc && (nal->nal_unit_type == 5 && last_nal->nal_unit_type == 5 && nal->slc->idr_pic_id != last_nal->slc->idr_pic_id)) { ret = 1; + reason++; } if (parser->current_nal == parser->nal0) { @@ -1129,7 +1141,7 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser) return 2; } - return 1; + return 0; } int seek_for_nal(uint8_t *buf, int buf_len) diff --git a/src/libvdpau/vdpau_h264.c b/src/libvdpau/vdpau_h264.c index f80396ff5..1d988eeeb 100644 --- a/src/libvdpau/vdpau_h264.c +++ b/src/libvdpau/vdpau_h264.c @@ -75,9 +75,6 @@ typedef struct vdpau_h264_decoder_s { VdpPictureInfoH264 vdp_picture_info; vdpau_accel_t *vdpau_accel; - VdpReferenceFrameH264 reference_frames[16]; - int reference_frames_used; - xine_t *xine; } vdpau_h264_decoder_t; @@ -93,34 +90,34 @@ typedef struct vdpau_h264_decoder_s { static inline void dump_pictureinfo_h264(VdpPictureInfoH264 *pic) { - printf("slice_count: %d\n", pic->slice_count); - printf("field_order_cnt[0]: %d\n", pic->field_order_cnt[0]); - printf("field_order_cnt[1]: %d\n", pic->field_order_cnt[1]); - printf("is_reference: %d\n", pic->is_reference); - printf("frame_num: %d\n", pic->frame_num); - printf("field_pic_flag: %d\n", pic->field_pic_flag); - printf("bottom_field_flag: %d\n", pic->bottom_field_flag); - printf("num_ref_frames: %d\n", pic->num_ref_frames); - printf("mb_adaptive_frame_field_flag: %d\n", pic->mb_adaptive_frame_field_flag); - printf("constrained_intra_pred_flag: %d\n", pic->constrained_intra_pred_flag); - printf("weighted_pred_flag: %d\n", pic->weighted_pred_flag); - printf("weighted_bipred_idc: %d\n", pic->weighted_bipred_idc); - printf("frame_mbs_only_flag: %d\n", pic->frame_mbs_only_flag); - printf("transform_8x8_mode_flag: %d\n", pic->transform_8x8_mode_flag); - printf("chroma_qp_index_offset: %d\n", pic->chroma_qp_index_offset); - printf("second_chroma_qp_index_offset: %d\n", pic->second_chroma_qp_index_offset); - printf("pic_init_qp_minus26: %d\n", pic->pic_init_qp_minus26); - printf("num_ref_idx_l0_active_minus1: %d\n", pic->num_ref_idx_l0_active_minus1); - printf("num_ref_idx_l1_active_minus1: %d\n", pic->num_ref_idx_l1_active_minus1); - printf("log2_max_frame_num_minus4: %d\n", pic->log2_max_frame_num_minus4); - printf("pic_order_cnt_type: %d\n", pic->pic_order_cnt_type); - printf("log2_max_pic_order_cnt_lsb_minus4: %d\n", pic->log2_max_pic_order_cnt_lsb_minus4); - printf("delta_pic_order_always_zero_flag: %d\n", pic->delta_pic_order_always_zero_flag); - printf("direct_8x8_inference_flag: %d\n", pic->direct_8x8_inference_flag); - printf("entropy_coding_mode_flag: %d\n", pic->entropy_coding_mode_flag); - printf("pic_order_present_flag: %d\n", pic->pic_order_present_flag); - printf("deblocking_filter_control_present_flag: %d\n", pic->deblocking_filter_control_present_flag); - printf("redundant_pic_cnt_present_flag: %d\n", pic->redundant_pic_cnt_present_flag); + printf("C: slice_count: %d\n", pic->slice_count); + printf("C: field_order_cnt[0]: %d\n", pic->field_order_cnt[0]); + printf("C: field_order_cnt[1]: %d\n", pic->field_order_cnt[1]); + printf("C: is_reference: %d\n", pic->is_reference); + printf("C: frame_num: %d\n", pic->frame_num); + printf("C: field_pic_flag: %d\n", pic->field_pic_flag); + printf("C: bottom_field_flag: %d\n", pic->bottom_field_flag); + printf("C: num_ref_frames: %d\n", pic->num_ref_frames); + printf("C: mb_adaptive_frame_field_flag: %d\n", pic->mb_adaptive_frame_field_flag); + printf("C: constrained_intra_pred_flag: %d\n", pic->constrained_intra_pred_flag); + printf("C: weighted_pred_flag: %d\n", pic->weighted_pred_flag); + printf("C: weighted_bipred_idc: %d\n", pic->weighted_bipred_idc); + printf("C: frame_mbs_only_flag: %d\n", pic->frame_mbs_only_flag); + printf("C: transform_8x8_mode_flag: %d\n", pic->transform_8x8_mode_flag); + printf("C: chroma_qp_index_offset: %d\n", pic->chroma_qp_index_offset); + printf("C: second_chroma_qp_index_offset: %d\n", pic->second_chroma_qp_index_offset); + printf("C: pic_init_qp_minus26: %d\n", pic->pic_init_qp_minus26); + printf("C: num_ref_idx_l0_active_minus1: %d\n", pic->num_ref_idx_l0_active_minus1); + printf("C: num_ref_idx_l1_active_minus1: %d\n", pic->num_ref_idx_l1_active_minus1); + printf("C: log2_max_frame_num_minus4: %d\n", pic->log2_max_frame_num_minus4); + printf("C: pic_order_cnt_type: %d\n", pic->pic_order_cnt_type); + printf("C: log2_max_pic_order_cnt_lsb_minus4: %d\n", pic->log2_max_pic_order_cnt_lsb_minus4); + printf("C: delta_pic_order_always_zero_flag: %d\n", pic->delta_pic_order_always_zero_flag); + printf("C: direct_8x8_inference_flag: %d\n", pic->direct_8x8_inference_flag); + printf("C: entropy_coding_mode_flag: %d\n", pic->entropy_coding_mode_flag); + printf("C: pic_order_present_flag: %d\n", pic->pic_order_present_flag); + printf("C: deblocking_filter_control_present_flag: %d\n", pic->deblocking_filter_control_present_flag); + printf("C: redundant_pic_cnt_present_flag: %d\n", pic->redundant_pic_cnt_present_flag); /*int i, j; for(i = 0; i < 6; i++) { @@ -145,16 +142,17 @@ static inline void dump_pictureinfo_h264(VdpPictureInfoH264 *pic) int i; for(i = 0; i < 16; i++) { if(pic->referenceFrames[i].surface != VDP_INVALID_HANDLE) { - printf("-------------------\n"); - printf("Reference Frame %d:\n", i); - printf("frame_idx: %d\n", pic->referenceFrames[i].frame_idx); - printf("field_order_cnt[0]: %d\n", pic->referenceFrames[i].field_order_cnt[0]); - printf("field_order_cnt[1]: %d\n", pic->referenceFrames[i].field_order_cnt[0]); - printf("is_long_term: %d\n", pic->referenceFrames[i].is_long_term); - printf("top_is_reference: %d\n", pic->referenceFrames[i].top_is_reference); - printf("bottom_is_reference: %d\n", pic->referenceFrames[i].bottom_is_reference); + printf("C: -------------------\n"); + printf("C: Reference Frame %d:\n", i); + printf("C: frame_idx: %d\n", pic->referenceFrames[i].frame_idx); + printf("C: field_order_cnt[0]: %d\n", pic->referenceFrames[i].field_order_cnt[0]); + printf("C: field_order_cnt[1]: %d\n", pic->referenceFrames[i].field_order_cnt[0]); + printf("C: is_long_term: %d\n", pic->referenceFrames[i].is_long_term); + printf("C: top_is_reference: %d\n", pic->referenceFrames[i].top_is_reference); + printf("C: bottom_is_reference: %d\n", pic->referenceFrames[i].bottom_is_reference); } } + printf("C: ---------------------------------------------------------------\n"); /*memcpy(pic.scaling_lists_4x4, pps->scaling_lists_4x4, 6*16); memcpy(pic.scaling_lists_8x8, pps->scaling_lists_8x8, 2*64); memcpy(pic.referenceFrames, this->reference_frames, sizeof(this->reference_frames));*/ @@ -305,7 +303,6 @@ static void vdpau_h264_decode_data (video_decoder_t *this_gen, memcpy(pic.scaling_lists_8x8, pps->scaling_lists_8x8, sizeof(pic.scaling_lists_8x8)); fill_vdpau_reference_list(&(this->nal_parser->dpb), pic.referenceFrames); - //memcpy(pic.referenceFrames, this->reference_frames, sizeof(pic.referenceFrames)); if(this->decoder_started || pic.is_reference) { if(!this->decoder_started) @@ -455,9 +452,6 @@ static video_decoder_t *open_plugin (video_decoder_class_t *class_gen, xine_stre this->nal_parser = init_parser(); this->buf = NULL; - memset(this->reference_frames, VDP_INVALID_HANDLE, sizeof(this->reference_frames)); - this->reference_frames_used = 0; - return &this->video_decoder; } |