diff options
-rw-r--r-- | src/libvdpau/dpb.c | 14 | ||||
-rw-r--r-- | src/libvdpau/h264_parser.c | 36 | ||||
-rw-r--r-- | src/libvdpau/nal.c | 9 | ||||
-rw-r--r-- | src/libvdpau/vdpau_h264.c | 23 |
4 files changed, 66 insertions, 16 deletions
diff --git a/src/libvdpau/dpb.c b/src/libvdpau/dpb.c index 460149ea3..a13e758bf 100644 --- a/src/libvdpau/dpb.c +++ b/src/libvdpau/dpb.c @@ -219,4 +219,18 @@ void fill_vdpau_reference_list(struct dpb *dpb, VdpReferenceFrameH264 *reflist) } last_pic = pic; } while ((pic = pic->next) != NULL && i < 16); + + printf("Used ref-frames: %d\n", i); + + // fill all other frames with invalid handles + while(i < 16) { + reflist[i].bottom_is_reference = VDP_FALSE; + reflist[i].top_is_reference = VDP_FALSE; + reflist[i].frame_idx = VDP_INVALID_HANDLE; + reflist[i].is_long_term = VDP_FALSE; + reflist[i].surface = VDP_INVALID_HANDLE; + reflist[i].field_order_cnt[0] = 0; + reflist[i].field_order_cnt[1] = 0; + i++; + } } diff --git a/src/libvdpau/h264_parser.c b/src/libvdpau/h264_parser.c index 7ae1cc216..18456d47a 100644 --- a/src/libvdpau/h264_parser.c +++ b/src/libvdpau/h264_parser.c @@ -174,6 +174,9 @@ int parse_nal_header(struct buf_reader *buf, struct nal_parser *parser) decode_nal(&ibuf.buf, &ibuf.len, buf->cur_pos, buf->len - 1); ibuf.cur_pos = ibuf.buf; + if(!nal->sps) + nal->sps = malloc(sizeof(struct seq_parameter_set_rbsp)); + memset(nal->sps, 0x00, sizeof(struct seq_parameter_set_rbsp)); parse_sps(&ibuf, nal->sps); @@ -181,6 +184,8 @@ int parse_nal_header(struct buf_reader *buf, struct nal_parser *parser) ret = NAL_SPS; break; case NAL_PPS: + if(!nal->pps) + nal->pps = malloc(sizeof(struct pic_parameter_set_rbsp)); memset(nal->pps, 0x00, sizeof(struct pic_parameter_set_rbsp)); parse_pps(buf, nal->pps, nal->sps); @@ -192,6 +197,9 @@ int parse_nal_header(struct buf_reader *buf, struct nal_parser *parser) case NAL_PART_C: case NAL_SLICE_IDR: if (nal->sps && nal->pps) { + if(!nal->slc) + nal->slc = malloc(sizeof(struct slice_header)); + memset(nal->slc, 0x00, sizeof(struct slice_header)); parse_slice_header(buf, parser); @@ -818,13 +826,19 @@ void decode_ref_pic_marking(uint32_t memory_management_control_operation, dpb_remove_picture_by_ltidx(dpb, slc->dec_ref_pic_marking.long_term_frame_idx); - if (pic->nal->slc->field_pic_flag == 0) { - pic = dpb_get_picture(dpb, pic_num_x); - pic->nal->long_term_frame_idx - = slc->dec_ref_pic_marking.long_term_frame_idx; + pic = dpb_get_picture(dpb, pic_num_x); + if(pic) { + if (pic->nal->slc->field_pic_flag == 0) { + pic = dpb_get_picture(dpb, pic_num_x); + pic->nal->long_term_frame_idx + = slc->dec_ref_pic_marking.long_term_frame_idx; + } + else + printf("FIXME: B Set frame %d to long-term ref\n", pic_num_x); + } else { + printf("memory_management_control_operation: 3 failed. No such picture."); } - else - printf("FIXME: B Set frame %d to long-term ref\n", pic_num_x); + } else if (memory_management_control_operation == 4) { // set max-long-term frame index, @@ -985,11 +999,11 @@ int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, parser->last_nal_res = 1; parser->slice_cnt = 0; - /*if(parser->current_nal->nal_ref_idc) { - if(parser->current_nal->slc != NULL) - parser->prev_pic_order_cnt_lsb = parser->current_nal->slc->pic_order_cnt_lsb; - parser->prev_pic_order_cnt_msb = parser->pic_order_cnt_msb; - }*/ + if(parser->last_nal->nal_ref_idc) { + if(parser->last_nal->slc != NULL) + parser->prev_pic_order_cnt_lsb = parser->last_nal->slc->pic_order_cnt_lsb; + parser->prev_pic_order_cnt_msb = parser->pic_order_cnt_msb; + } return parsed_len; } diff --git a/src/libvdpau/nal.c b/src/libvdpau/nal.c index a9717d76e..0964c446e 100644 --- a/src/libvdpau/nal.c +++ b/src/libvdpau/nal.c @@ -17,9 +17,12 @@ struct nal_unit* init_nal_unit() struct nal_unit *nal = malloc(sizeof(struct nal_unit)); memset(nal, 0x00, sizeof(struct nal_unit)); - nal->sps = malloc(sizeof(struct seq_parameter_set_rbsp)); + /*nal->sps = malloc(sizeof(struct seq_parameter_set_rbsp)); + memset(nal->sps, 0x00, sizeof(struct seq_parameter_set_rbsp)); nal->pps = malloc(sizeof(struct pic_parameter_set_rbsp)); + memset(nal->pps, 0x00, sizeof(struct pic_parameter_set_rbsp)); nal->slc = malloc(sizeof(struct slice_header)); + memset(nal->slc, 0x00, sizeof(struct slice_header));*/ return nal; } @@ -40,6 +43,10 @@ void copy_nal_unit(struct nal_unit *dest, struct nal_unit *src) xine_fast_memcpy(dest, src, size); + dest->sps = malloc(sizeof(struct seq_parameter_set_rbsp)); + dest->pps = malloc(sizeof(struct pic_parameter_set_rbsp)); + dest->slc = malloc(sizeof(struct slice_header)); + xine_fast_memcpy(dest->sps, src->sps, sizeof(struct seq_parameter_set_rbsp)); xine_fast_memcpy(dest->pps, src->pps, sizeof(struct pic_parameter_set_rbsp)); xine_fast_memcpy(dest->slc, src->slc, sizeof(struct slice_header)); diff --git a/src/libvdpau/vdpau_h264.c b/src/libvdpau/vdpau_h264.c index 4da276101..ac539c985 100644 --- a/src/libvdpau/vdpau_h264.c +++ b/src/libvdpau/vdpau_h264.c @@ -122,7 +122,7 @@ static inline void dump_pictureinfo_h264(VdpPictureInfoH264 *pic) 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); - int i, j; + /*int i, j; for(i = 0; i < 6; i++) { printf("scalint_list4x4[%d]: ", i); for(j = 0; j < 16; j++) { @@ -141,6 +141,18 @@ static inline void dump_pictureinfo_h264(VdpPictureInfoH264 *pic) } printf("\n"); } + + for(i = 0; i < 16; i++) { + 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("-------------------\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));*/ @@ -183,7 +195,10 @@ static void vdpau_h264_decode_data (video_decoder_t *this_gen, (void*)&vdp_buffer.bitstream, &vdp_buffer.bitstream_bytes, &slice_count); if(!this->decoder_initialized && - this->nal_parser->current_nal->sps != NULL) { + this->nal_parser->current_nal != NULL && + this->nal_parser->current_nal->sps != NULL && + this->nal_parser->current_nal->sps->pic_width > 0 && + this->nal_parser->current_nal->sps->pic_height > 0) { this->width = this->nal_parser->current_nal->sps->pic_width; this->height = this->nal_parser->current_nal->sps->pic_height; @@ -277,9 +292,9 @@ static void vdpau_h264_decode_data (video_decoder_t *this_gen, pic.redundant_pic_cnt_present_flag = pps->redundant_pic_cnt_present_flag; memcpy(pic.scaling_lists_4x4, pps->scaling_lists_4x4, sizeof(pic.scaling_lists_4x4)); memcpy(pic.scaling_lists_8x8, pps->scaling_lists_8x8, sizeof(pic.scaling_lists_8x8)); - memcpy(pic.referenceFrames, this->reference_frames, sizeof(pic.referenceFrames)); - memset(pic.referenceFrames, VDP_INVALID_HANDLE, sizeof(pic.referenceFrames)); + 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) { this->nal_parser->is_idr = 0; |