summaryrefslogtreecommitdiff
path: root/src/libvdpau/nal_parser.c
diff options
context:
space:
mode:
authorJulian Scheel <julian@jusst.de>2008-12-02 20:08:22 +0000
committerJulian Scheel <julian@jusst.de>2008-12-02 20:08:22 +0000
commit3fe63194a6531eadc2d27126b8b04ce34ffbf522 (patch)
tree3855d31cae2d419cc374dc11128facde53882c21 /src/libvdpau/nal_parser.c
parent564fd8cec68835856a2cfe9f313eb64989e6c6f9 (diff)
downloadxine-lib-3fe63194a6531eadc2d27126b8b04ce34ffbf522.tar.gz
xine-lib-3fe63194a6531eadc2d27126b8b04ce34ffbf522.tar.bz2
Start DPB work.
Diffstat (limited to 'src/libvdpau/nal_parser.c')
-rw-r--r--src/libvdpau/nal_parser.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/libvdpau/nal_parser.c b/src/libvdpau/nal_parser.c
index 9835cb1a4..ef380db36 100644
--- a/src/libvdpau/nal_parser.c
+++ b/src/libvdpau/nal_parser.c
@@ -229,7 +229,11 @@ int parse_nal_header(struct buf_reader *buf, struct nal_unit *nal)
void calculate_pic_order(struct nal_parser *parser)
{
+ return;
+
+
struct nal_unit *nal = parser->current_nal;
+ struct dpb *dpb = parser->dpb;
struct seq_parameter_set_rbsp *sps = nal->sps;
struct pic_parameter_set_rbsp *pps = nal->pps;
@@ -237,6 +241,34 @@ void calculate_pic_order(struct nal_parser *parser)
if(!sps || !pps)
return;
+ uint32_t max_frame_num = pow(2, sps->log2_max_frame_num_minus4+4);
+ if(dpb->max_frame_num == 0)
+ dpb->max_frame_num = max_frame_num;
+
+ if(dpb->max_frame_num != max_frame_num && dpb->max_frame_num != 0)
+ printf("ERROR, FIXME, max_frame_num changed");
+
+ /* calculate frame_num based stuff */
+ if(nal->nal_unit_type == NAL_SLICE_IDR) {
+ dpb->prev_ref_frame_number = 0;
+ } else {
+ // FIXME: understand p92 in h264 spec
+ }
+
+ if(slc->frame_num != dpb->prev_ref_frame_number) {
+ memset(dpb->non_existing_pictures, 0, 32);
+ int i = 0;
+ dpb->unused_short_term_frame_num = (dpb->prev_ref_frame_number + 1) % dpb->max_frame_num;
+ dpb->non_existing_pictures[i] = dpb->unused_short_term_frame_num;
+ i++;
+
+ while(dpb->unused_short_term_frame_num != slc->frame_num) {
+ dpb->unused_short_term_frame_num = (dpb->unused_short_term_frame_num + 1) % dpb->max_frame_num;
+ dpb->non_existing_pictures[i] = dpb->unused_short_term_frame_num;
+ i++;
+ }
+ }
+
if(sps->pic_order_cnt_type == 0) {
if(nal->nal_unit_type == NAL_SLICE_IDR) {
parser->prev_pic_order_cnt_lsb = 0;
@@ -809,6 +841,9 @@ int parse_frame(struct nal_parser *parser, uint8_t *inbuf, int inbuf_len,
if((parser->last_nal_res = parse_nal(inbuf+4, inbuf_len-parsed_len, parser)) == 1
&& parser->buf_len>0) {
// parse_nal returned 1 --> detected a frame_boundary
+ // do the extended parsing stuff...
+ calculate_pic_order(parser);
+
*ret_buf = malloc(parser->buf_len);
xine_fast_memcpy(*ret_buf, parser->buf, parser->buf_len);
*ret_len = parser->buf_len;
@@ -852,8 +887,6 @@ int parse_nal(uint8_t *buf, int buf_len, struct nal_parser *parser)
int res = parse_nal_header(&bufr, nal);
- calculate_pic_order(parser);
-
if(res >= NAL_SLICE && res <= NAL_SLICE_IDR) {
// now detect if it's a new frame!
int ret = 0;