changeset 331:853e1eb30468 libavcodec

fix b-frame MB skip
author michaelni
date Sun, 21 Apr 2002 23:47:27 +0000
parents 54d86f074a4b
children 207cc56d18f8
files h263.c
diffstat 1 files changed, 28 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/h263.c	Sun Apr 21 22:41:49 2002 +0000
+++ b/h263.c	Sun Apr 21 23:47:27 2002 +0000
@@ -351,13 +351,32 @@
             s->last_bits=bits;
         }else{ /* s->pict_type==B_TYPE */
             if ((cbp | motion_x | motion_y) == 0 && s->mv_type==MV_TYPE_16X16) {
-                /* skip macroblock */
-                put_bits(&s->pb, 1, 1);
-                s->misc_bits++;
-                s->last_bits++;
-                s->skip_count++;
-                s->mb_skiped=1; // we need that for b-frames
-                return;
+                /* check if the B frames can skip it too, as we must skip it if we skip here 
+                   why didnt they just compress the skip-mb bits instead of reusing them ?! */
+                if(s->max_b_frames>0){
+                    int i;
+                    const int offset= (s->mb_x + s->mb_y*s->linesize)*16;
+                    uint8_t *p_pic= s->new_picture[0] + offset;
+                    s->mb_skiped=1;
+                    for(i=0; i<s->max_b_frames; i++){
+                        uint8_t *b_pic= s->coded_order[i+1].picture[0] + offset;
+                        int diff= pix_abs16x16(p_pic, b_pic, s->linesize);
+                        if(diff>s->qscale*70){
+                            s->mb_skiped=0;
+                            break;
+                        }
+                    }
+                }else
+                    s->mb_skiped=1; 
+
+                if(s->mb_skiped==1){
+                    /* skip macroblock */
+                    put_bits(&s->pb, 1, 1);
+                    s->misc_bits++;
+                    s->last_bits++;
+                    s->skip_count++;
+                    return;
+                }
             }
             put_bits(&s->pb, 1, 0);	/* mb coded */
             if(s->mv_type==MV_TYPE_16X16){
@@ -2602,7 +2621,7 @@
                 if(width && height){ /* they should be non zero but who knows ... */
                     s->width = width;
                     s->height = height;
-//                    printf("%d %d\n", width, height);
+//                    printf("width/height: %d %d\n", width, height);
                 }
             }
             
@@ -2860,7 +2879,7 @@
              s->b_code = get_bits(&s->gb, 3);
 //printf("b-code %d\n", s->b_code);
          }
-//printf("quant:%d fcode:%d\n", s->qscale, s->f_code);
+//printf("quant:%d fcode:%d bcode:%d type:%d\n", s->qscale, s->f_code, s->b_code, s->pict_type);
          if(!s->scalability){
              if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
                  skip_bits1(&s->gb); // vop shape coding type