[FFmpeg-cvslog] r17558 - trunk/libavcodec/cavsdec.c

stefang subversion
Tue Feb 24 16:54:51 CET 2009


Author: stefang
Date: Tue Feb 24 16:54:51 2009
New Revision: 17558

Log:
change macroblock loop in inter frames so that after a
slice header the skip count is always parsed first

Modified:
   trunk/libavcodec/cavsdec.c

Modified: trunk/libavcodec/cavsdec.c
==============================================================================
--- trunk/libavcodec/cavsdec.c	Tue Feb 24 16:33:39 2009	(r17557)
+++ trunk/libavcodec/cavsdec.c	Tue Feb 24 16:54:51 2009	(r17558)
@@ -432,18 +432,20 @@ static inline int decode_slice_header(AV
     return 0;
 }
 
-static inline void check_for_slice(AVSContext *h) {
+static inline int check_for_slice(AVSContext *h) {
     GetBitContext *gb = &h->s.gb;
     int align;
 
     if(h->mbx)
-        return;
+        return 0;
     align = (-get_bits_count(gb)) & 7;
     if((show_bits_long(gb,24+align) & 0xFFFFFF) == 0x000001) {
         skip_bits_long(gb,24+align);
         h->stc = get_bits(gb,8);
         decode_slice_header(h,gb);
+        return 1;
     }
+    return 0;
 }
 
 /*****************************************************************************
@@ -454,7 +456,7 @@ static inline void check_for_slice(AVSCo
 
 static int decode_pic(AVSContext *h) {
     MpegEncContext *s = &h->s;
-    int skip_count;
+    int skip_count = -1;
     enum cavs_mb mb_type;
 
     if (!s->context_initialized) {
@@ -539,44 +541,37 @@ static int decode_pic(AVSContext *h) {
         } while(ff_cavs_next_mb(h));
     } else if(h->pic_type == FF_P_TYPE) {
         do {
-            check_for_slice(h);
-            if(h->skip_mode_flag) {
+            if(check_for_slice(h))
+                skip_count = -1;
+            if(h->skip_mode_flag && (skip_count < 0))
                 skip_count = get_ue_golomb(&s->gb);
-                while(skip_count--) {
-                    decode_mb_p(h,P_SKIP);
-                    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;
-            if(mb_type > P_8X8) {
-                decode_mb_i(h, mb_type - P_8X8 - 1);
-            } else
-                decode_mb_p(h,mb_type);
+            if(h->skip_mode_flag && skip_count--) {
+                decode_mb_p(h,P_SKIP);
+            } else {
+                mb_type = get_ue_golomb(&s->gb) + P_SKIP + h->skip_mode_flag;
+                if(mb_type > P_8X8)
+                    decode_mb_i(h, mb_type - P_8X8 - 1);
+                else
+                    decode_mb_p(h,mb_type);
+            }
         } while(ff_cavs_next_mb(h));
     } else { /* FF_B_TYPE */
         do {
-            check_for_slice(h);
-            if(h->skip_mode_flag) {
+            if(check_for_slice(h))
+                skip_count = -1;
+            if(h->skip_mode_flag && (skip_count < 0))
                 skip_count = get_ue_golomb(&s->gb);
-                while(skip_count--) {
-                    decode_mb_b(h,B_SKIP);
-                    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;
-            if(mb_type > B_8X8) {
-                decode_mb_i(h, mb_type - B_8X8 - 1);
-            } else
-                decode_mb_b(h,mb_type);
+            if(h->skip_mode_flag && skip_count--) {
+                decode_mb_b(h,B_SKIP);
+            } else {
+                mb_type = get_ue_golomb(&s->gb) + B_SKIP + h->skip_mode_flag;
+                if(mb_type > B_8X8)
+                    decode_mb_i(h, mb_type - B_8X8 - 1);
+                else
+                    decode_mb_b(h,mb_type);
+            }
         } while(ff_cavs_next_mb(h));
     }
- done:
     if(h->pic_type != FF_B_TYPE) {
         if(h->DPB[1].data[0])
             s->avctx->release_buffer(s->avctx, (AVFrame *)&h->DPB[1]);




More information about the ffmpeg-cvslog mailing list