summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libvdpau/dpb.c14
-rw-r--r--src/libvdpau/h264_parser.c36
-rw-r--r--src/libvdpau/nal.c9
-rw-r--r--src/libvdpau/vdpau_h264.c23
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;