diff options
-rw-r--r-- | src/libvdpau/h264_parser.c | 31 | ||||
-rw-r--r-- | src/libvdpau/h264_parser.h | 5 | ||||
-rw-r--r-- | src/libvdpau/vdpau_h264.c | 2 |
3 files changed, 24 insertions, 14 deletions
diff --git a/src/libvdpau/h264_parser.c b/src/libvdpau/h264_parser.c index ed186d383..d7c268fcc 100644 --- a/src/libvdpau/h264_parser.c +++ b/src/libvdpau/h264_parser.c @@ -1011,6 +1011,7 @@ void decode_ref_pic_marking(struct nal_unit *nal, dpb_set_unused_ref_picture_a(dpb, pic); else pic->top_is_reference = 0; + //printf("FIXME: We might need do delete more from the DPB...\n"); // FIXME: some more handling needed here?! See 8.2.5.4.1, p. 120 } @@ -1235,21 +1236,10 @@ void parse_codec_private(struct nal_parser *parser, uint8_t *inbuf, int inbuf_le printf("done parsing extradata\n"); } - -int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, - uint8_t **ret_buf, uint32_t *ret_len, uint32_t *ret_slice_cnt) +void process_mmc_operations(struct nal_parser *parser) { - int32_t next_nal = 0; - int parsed_len = 0; - int search_offset = 0; - int start_seq_len = 3; - uint8_t completed_nal = 0; - - if(parser->nal_size_length > 0) - 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) { + parser->current_nal->slc) { int i; for(i = 0; i < parser->current_nal->slc->dec_ref_pic_marking_count; i++) { decode_ref_pic_marking( @@ -1264,6 +1254,19 @@ int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, = parser->last_nal->slc->pic_order_cnt_lsb; parser->prev_pic_order_cnt_msb = parser->pic_order_cnt_msb; } +} + +int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, + uint8_t **ret_buf, uint32_t *ret_len, uint32_t *ret_slice_cnt) +{ + int32_t next_nal = 0; + int parsed_len = 0; + int search_offset = 0; + int start_seq_len = 3; + uint8_t completed_nal = 0; + + if(parser->nal_size_length > 0) + start_seq_len = parser->nal_size_length-parser->have_nal_size_length_buf; /* seek for nal start sequences split across buffer boundaries */ if(!parser->nal_size_length) { @@ -1407,8 +1410,8 @@ int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, parser->incomplete_nal = 1; xine_fast_memcpy(parser->prebuf + parser->prebuf_len, inbuf, inbuf_len-parsed_len); parser->prebuf_len += inbuf_len-parsed_len; - parsed_len += inbuf_len-parsed_len; inbuf += inbuf_len-parsed_len; + parsed_len += inbuf_len-parsed_len; } *ret_len = 0; diff --git a/src/libvdpau/h264_parser.h b/src/libvdpau/h264_parser.h index c726f7b90..bf3d34100 100644 --- a/src/libvdpau/h264_parser.h +++ b/src/libvdpau/h264_parser.h @@ -88,6 +88,11 @@ void free_parser(struct nal_parser *parser); int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, uint8_t **ret_buf, uint32_t *ret_len, uint32_t *ret_slice_cnt); +/* this has to be called after decoding the frame delivered by parse_frame, + * but before adding a decoded frame to the dpb. + */ +void process_mmc_operations(struct nal_parser *parser); + void parse_codec_private(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len); #endif diff --git a/src/libvdpau/vdpau_h264.c b/src/libvdpau/vdpau_h264.c index 8a88dde13..a8d4093d9 100644 --- a/src/libvdpau/vdpau_h264.c +++ b/src/libvdpau/vdpau_h264.c @@ -466,6 +466,8 @@ static int vdpau_decoder_render(video_decoder_t *this_gen, VdpBitstreamBuffer *v this->curr_pts = this->next_pts; this->next_pts = 0; + process_mmc_operations(this->nal_parser); + if(status != VDP_STATUS_OK) { xprintf(this->xine, XINE_VERBOSITY_LOG, "vdpau_h264: Decoder failure: %s\n", this->vdpau_accel->vdp_get_error_string(status)); |