# HG changeset patch # User stefang # Date 1234299095 0 # Node ID e18df479165827711c6d1c2f7eaeefbbc0815231 # Parent 1f98fc269920d314b325dc2ed70e87e60d95e863 fix multiple slices per frame diff -r 1f98fc269920 -r e18df4791658 cavs.c --- a/cavs.c Tue Feb 10 17:08:56 2009 +0000 +++ b/cavs.c Tue Feb 10 20:51:35 2009 +0000 @@ -608,8 +608,6 @@ h->cv = h->picture.data[2] + h->mby*8*h->c_stride; if(h->mby == h->mb_height) { //frame end return 0; - } else { - //check_for_slice(h); } } return 1; diff -r 1f98fc269920 -r e18df4791658 cavsdec.c --- a/cavsdec.c Tue Feb 10 17:08:56 2009 +0000 +++ b/cavsdec.c Tue Feb 10 20:51:35 2009 +0000 @@ -415,6 +415,9 @@ if(h->stc > 0xAF) av_log(h->s.avctx, AV_LOG_ERROR, "unexpected start code 0x%02x\n", h->stc); h->mby = h->stc; + + /* mark top macroblocks as unavailable */ + h->flags &= ~(B_AVAIL|C_AVAIL); if((h->mby == 0) && (!h->qp_fixed)){ h->qp_fixed = get_bits1(gb); h->qp = get_bits(gb,6); @@ -431,6 +434,9 @@ static inline void check_for_slice(AVSContext *h) { GetBitContext *gb = &h->s.gb; int align; + + if(h->mbx) + return; align = (-get_bits_count(gb)) & 7; if((show_bits_long(gb,24+align) & 0xFFFFFF) == 0x000001) { skip_bits_long(gb,24+align); @@ -525,13 +531,14 @@ } else { h->alpha_offset = h->beta_offset = 0; } - check_for_slice(h); if(h->pic_type == FF_I_TYPE) { do { + check_for_slice(h); decode_mb_i(h, 0); } while(ff_cavs_next_mb(h)); } else if(h->pic_type == FF_P_TYPE) { do { + check_for_slice(h); if(h->skip_mode_flag) { skip_count = get_ue_golomb(&s->gb); while(skip_count--) { @@ -539,6 +546,7 @@ if(!ff_cavs_next_mb(h)) goto done; } + check_for_slice(h); mb_type = get_ue_golomb(&s->gb) + P_16X16; } else mb_type = get_ue_golomb(&s->gb) + P_SKIP; @@ -549,6 +557,7 @@ } while(ff_cavs_next_mb(h)); } else { /* FF_B_TYPE */ do { + check_for_slice(h); if(h->skip_mode_flag) { skip_count = get_ue_golomb(&s->gb); while(skip_count--) { @@ -556,6 +565,7 @@ if(!ff_cavs_next_mb(h)) goto done; } + check_for_slice(h); mb_type = get_ue_golomb(&s->gb) + B_DIRECT; } else mb_type = get_ue_golomb(&s->gb) + B_SKIP;