diff options
-rw-r--r-- | src/libvdpau/nal_parser.c (renamed from src/libxinevdec/nal_parser.c) | 17 | ||||
-rw-r--r-- | src/libvdpau/nal_parser.h (renamed from src/libxinevdec/nal_parser.h) | 3 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/libxinevdec/nal_parser.c b/src/libvdpau/nal_parser.c index 916595cad..8b3265337 100644 --- a/src/libxinevdec/nal_parser.c +++ b/src/libvdpau/nal_parser.c @@ -463,6 +463,7 @@ struct nal_parser* init_parser() parser->last_nal_res = 0; parser->slice = 0; + parser->slice_cnt = 0; parser->field = -1; parser->have_top = 0; @@ -477,7 +478,7 @@ void free_parser(struct nal_parser *parser) } int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, - uint8_t **ret_buf, int *ret_len) + uint8_t **ret_buf, int *ret_len, int *ret_slice_cnt) { int next_nal; int parsed_len = 0; @@ -504,10 +505,12 @@ int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len, *ret_buf = malloc(parser->buf_len); xine_fast_memcpy(*ret_buf, parser->buf, parser->buf_len); *ret_len = parser->buf_len; + *ret_slice_cnt = parser->slice_cnt; //memset(parser->buf, 0x00, parser->buf_len); parser->buf_len = 0; parser->last_nal_res = 0; + parser->slice_cnt = 0; return parsed_len; } @@ -583,13 +586,13 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser) ret = 1; } if(nal->sps && nal->slc && last_nal->slc && - (nal->sps->pic_order_cnt_type == 0 && + (nal->sps->pic_order_cnt_type == 0 && last_nal->sps->pic_order_cnt_type == 0 && (nal->slc->pic_order_cnt_lsb != last_nal->slc->pic_order_cnt_lsb || nal->slc->delta_pic_order_cnt_bottom != last_nal->slc->delta_pic_order_cnt_bottom))) { ret = 1; } if(nal->slc && last_nal->slc && - (nal->sps->pic_order_cnt_type == 1 && + (nal->sps->pic_order_cnt_type == 1 && last_nal->sps->pic_order_cnt_type == 1 && (nal->slc->delta_pic_order_cnt[0] != last_nal->slc->delta_pic_order_cnt[0] || nal->slc->delta_pic_order_cnt[1] != last_nal->slc->delta_pic_order_cnt[1]))) { ret = 1; @@ -612,6 +615,7 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser) parser->current_nal = parser->nal0; parser->last_nal = parser->nal1; } + if(parser->current_nal->sps == NULL) parser->current_nal->sps = parser->last_nal->sps; if(parser->current_nal->pps == NULL) @@ -625,7 +629,12 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser) parser->slice = 0; return ret; }*/ - return 0; + + /* increase the slice_cnt until a new frame is detected */ + if(!ret) + parser->slice_cnt++; + + return ret; } else if(res == NAL_PPS || res == NAL_SPS) { return 1; } else if (res == NAL_AU_DELIMITER || res == NAL_SEI || diff --git a/src/libxinevdec/nal_parser.h b/src/libvdpau/nal_parser.h index 530f6db3e..7a3c4726a 100644 --- a/src/libxinevdec/nal_parser.h +++ b/src/libvdpau/nal_parser.h @@ -193,8 +193,9 @@ struct nal_parser { int found_sps; int found_pps; int last_nal_res; - int field; // 0=top, 1=bottom, -1=both + int field; /* 0=top, 1=bottom, -1=both */ int slice; + int slice_cnt; int have_top; int have_frame; struct nal_unit *nal0; |