h263.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:212k
源码类别:

Windows CE

开发平台:

C/C++

  1.     } else {         int ufep;                  /* H.263v2 */         s->h263_plus = 1;         ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */         /* ufep other than 0 and 1 are reserved */                 if (ufep == 1) {             /* OPPTYPE */                    format = get_bits(&s->gb, 3);             dprintf("ufep=1, format: %dn", format);             s->custom_pcf= get_bits1(&s->gb);             s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */             if (get_bits1(&s->gb) != 0) {                 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supportedn");             }             s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */             s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */             s->loop_filter= get_bits1(&s->gb);             s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;                          s->h263_slice_structured= get_bits1(&s->gb);             if (get_bits1(&s->gb) != 0) {                 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supportedn");             }             if (get_bits1(&s->gb) != 0) {                 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supportedn");             }             s->alt_inter_vlc= get_bits1(&s->gb);             s->modified_quant= get_bits1(&s->gb);             if(s->modified_quant)                 s->chroma_qscale_table= ff_h263_chroma_qscale_table;                          skip_bits(&s->gb, 1); /* Prevent start code emulation */             skip_bits(&s->gb, 3); /* Reserved */         } else if (ufep != 0) {             av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)n", ufep);             return -1;         }                      /* MPPTYPE */         s->pict_type = get_bits(&s->gb, 3);         switch(s->pict_type){         case 0: s->pict_type= I_TYPE;break;         case 1: s->pict_type= P_TYPE;break;         case 3: s->pict_type= B_TYPE;break;         case 7: s->pict_type= I_TYPE;break; //ZYGO         default:             return -1;         }         skip_bits(&s->gb, 2);         s->no_rounding = get_bits1(&s->gb);         skip_bits(&s->gb, 4);                  /* Get the picture dimensions */         if (ufep) {             if (format == 6) {                 /* Custom Picture Format (CPFMT) */                 s->aspect_ratio_info = get_bits(&s->gb, 4);                 dprintf("aspect: %dn", s->aspect_ratio_info);                 /* aspect ratios:                 0 - forbidden                 1 - 1:1                 2 - 12:11 (CIF 4:3)                 3 - 10:11 (525-type 4:3)                 4 - 16:11 (CIF 16:9)                 5 - 40:33 (525-type 16:9)                 6-14 - reserved                 */                 width = (get_bits(&s->gb, 9) + 1) * 4;                 skip_bits1(&s->gb);                 height = get_bits(&s->gb, 9) * 4;                 dprintf("nH.263+ Custom picture: %dx%dn",width,height);                 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {                     /* aspected dimensions */                     s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);                     s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);                 }else{                     s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];                 }             } else {                 width = h263_format[format][0];                 height = h263_format[format][1];                 s->avctx->sample_aspect_ratio= _AVRational(12,11); //Picard
  2.             }             if ((width == 0) || (height == 0))                 return -1;             s->width = width;             s->height = height;             if(s->custom_pcf){                 int gcd;                 s->avctx->time_base.den= 1800000;                 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);                 s->avctx->time_base.num*= get_bits(&s->gb, 7);                 if(s->avctx->time_base.num == 0){                     av_log(s->avctx, AV_LOG_ERROR, "zero frameraten");                     return -1;                 }                 gcd= ff_gcd(s->avctx->time_base.den, s->avctx->time_base.num);                 s->avctx->time_base.den /= gcd;                 s->avctx->time_base.num /= gcd; //                av_log(s->avctx, AV_LOG_DEBUG, "%d/%dn", s->avctx->time_base.den, s->avctx->time_base.num);             }else{                 s->avctx->time_base= _AVRational(1001, 30000); //Picard
  3.             }         }                      if(s->custom_pcf){             skip_bits(&s->gb, 2); //extended Temporal reference         }         if (ufep) {             if (s->umvplus) {                 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */                     skip_bits1(&s->gb);              }             if(s->h263_slice_structured){                 if (get_bits1(&s->gb) != 0) {                     av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supportedn");                 }                 if (get_bits1(&s->gb) != 0) {                     av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supportedn");                 }             }         }                      s->qscale = get_bits(&s->gb, 5);     }     s->mb_width = (s->width  + 15) / 16;     s->mb_height = (s->height  + 15) / 16;     s->mb_num = s->mb_width * s->mb_height;     /* PEI */     while (get_bits1(&s->gb) != 0) {         skip_bits(&s->gb, 8);     }     if(s->h263_slice_structured){         if (get_bits1(&s->gb) != 1) {             av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missingn");             return -1;         }         ff_h263_decode_mba(s);         if (get_bits1(&s->gb) != 1) {             av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missingn");             return -1;         }     }     s->f_code = 1;          if(s->h263_aic){          s->y_dc_scale_table=           s->c_dc_scale_table= ff_aic_dc_scale_table;     }else{         s->y_dc_scale_table=         s->c_dc_scale_table= ff_mpeg1_dc_scale_table;     }      if(s->avctx->debug&FF_DEBUG_PICT_INFO){          av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%dn",           s->qscale, av_get_pict_type_char(s->pict_type),          s->gb.size_in_bits, 1-s->no_rounding,          s->obmc ? " AP" : "",          s->umvplus ? " UMV" : "",          s->h263_long_vectors ? " LONG" : "",          s->h263_plus ? " +" : "",          s->h263_aic ? " AIC" : "",          s->alt_inter_vlc ? " AIV" : "",          s->modified_quant ? " MQ" : "",          s->loop_filter ? " LOOP" : "",          s->h263_slice_structured ? " SS" : "",          s->avctx->time_base.den, s->avctx->time_base.num          );       } #if 1     if (s->pict_type == I_TYPE && s->avctx->codec_tag == ff_get_fourcc("ZYGO")){         int i,j;         for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));         av_log(s->avctx, AV_LOG_DEBUG, "n");         for(i=0; i<13; i++){             for(j=0; j<3; j++){                 int v= get_bits(&s->gb, 8);                 v |= get_sbits(&s->gb, 8)<<8;                 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);             }             av_log(s->avctx, AV_LOG_DEBUG, "n");         }         for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));     } #endif     return 0; } static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb) {     int i;     int a= 2<<s->sprite_warping_accuracy;     int rho= 3-s->sprite_warping_accuracy;     int r=16/a;     const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes     int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};     int sprite_ref[4][2];     int virtual_ref[2][2];     int w2, h2, w3, h3;     int alpha=0, beta=0;     int w= s->width;     int h= s->height;     int min_ab;     for(i=0; i<s->num_sprite_warping_points; i++){         int length;         int x=0, y=0;         length= get_vlc(gb, &sprite_trajectory);         if(length){             x= get_xbits(gb, length);         }         if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */                  length= get_vlc(gb, &sprite_trajectory);         if(length){             y=get_xbits(gb, length);         }         skip_bits1(gb); /* marker bit */ //printf("%d %d %d %dn", x, y, i, s->sprite_warping_accuracy);         d[i][0]= x;         d[i][1]= y;     }     while((1<<alpha)<w) alpha++;     while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'     w2= 1<<alpha;     h2= 1<<beta; // Note, the 4th point isn't used for GMC     if(s->divx_version==500 && s->divx_build==413){         sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];         sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];         sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];         sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];         sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];         sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];     } else {         sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);         sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);         sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);         sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);         sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);         sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);     } /*    sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);     sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */      // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...) // perhaps it should be reordered to be more readable ... // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form     virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)          + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w);     virtual_ref[0][1]= 16*vop_ref[0][1]          + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);     virtual_ref[1][0]= 16*vop_ref[0][0]          + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);     virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)          + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);              switch(s->num_sprite_warping_points)     {         case 0:             s->sprite_offset[0][0]= 0;             s->sprite_offset[0][1]= 0;             s->sprite_offset[1][0]= 0;             s->sprite_offset[1][1]= 0;             s->sprite_delta[0][0]= a;             s->sprite_delta[0][1]= 0;             s->sprite_delta[1][0]= 0;             s->sprite_delta[1][1]= a;             s->sprite_shift[0]= 0;             s->sprite_shift[1]= 0;             break;         case 1: //GMC only             s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];             s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];             s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);             s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);             s->sprite_delta[0][0]= a;             s->sprite_delta[0][1]= 0;             s->sprite_delta[1][0]= 0;             s->sprite_delta[1][1]= a;             s->sprite_shift[0]= 0;             s->sprite_shift[1]= 0;             break;         case 2:             s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))                                                   + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])                                                   + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])                                                   + (1<<(alpha+rho-1));             s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))                                                   + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])                                                   + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])                                                   + (1<<(alpha+rho-1));             s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)                                      +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)                                      +2*w2*r*sprite_ref[0][0]                                       - 16*w2                                       + (1<<(alpha+rho+1)));             s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)                                       +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)                                      +2*w2*r*sprite_ref[0][1]                                       - 16*w2                                      + (1<<(alpha+rho+1)));             s->sprite_delta[0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);             s->sprite_delta[0][1]=   (+r*sprite_ref[0][1] - virtual_ref[0][1]);             s->sprite_delta[1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1]);             s->sprite_delta[1][1]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);                          s->sprite_shift[0]= alpha+rho;             s->sprite_shift[1]= alpha+rho+2;             break;         case 3:             min_ab= FFMIN(alpha, beta);             w3= w2>>min_ab;             h3= h2>>min_ab;             s->sprite_offset[0][0]=  (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))                                    + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])                                    + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])                                    + (1<<(alpha+beta+rho-min_ab-1));             s->sprite_offset[0][1]=  (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))                                    + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])                                    + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])                                    + (1<<(alpha+beta+rho-min_ab-1));             s->sprite_offset[1][0]=  (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)                                    + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)                                    + 2*w2*h3*r*sprite_ref[0][0]                                    - 16*w2*h3                                    + (1<<(alpha+beta+rho-min_ab+1));             s->sprite_offset[1][1]=  (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)                                    + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)                                    + 2*w2*h3*r*sprite_ref[0][1]                                    - 16*w2*h3                                    + (1<<(alpha+beta+rho-min_ab+1));             s->sprite_delta[0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;             s->sprite_delta[0][1]=   (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;             s->sprite_delta[1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;             s->sprite_delta[1][1]=   (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;                                                 s->sprite_shift[0]= alpha + beta + rho - min_ab;             s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;             break;     }     /* try to simplify the situation */      if(   s->sprite_delta[0][0] == a<<s->sprite_shift[0]        && s->sprite_delta[0][1] == 0        && s->sprite_delta[1][0] == 0        && s->sprite_delta[1][1] == a<<s->sprite_shift[0])     {         s->sprite_offset[0][0]>>=s->sprite_shift[0];         s->sprite_offset[0][1]>>=s->sprite_shift[0];         s->sprite_offset[1][0]>>=s->sprite_shift[1];         s->sprite_offset[1][1]>>=s->sprite_shift[1];         s->sprite_delta[0][0]= a;         s->sprite_delta[0][1]= 0;         s->sprite_delta[1][0]= 0;         s->sprite_delta[1][1]= a;         s->sprite_shift[0]= 0;         s->sprite_shift[1]= 0;         s->real_sprite_warping_points=1;     }     else{         int shift_y= 16 - s->sprite_shift[0];         int shift_c= 16 - s->sprite_shift[1]; //printf("shifts %d %dn", shift_y, shift_c);         for(i=0; i<2; i++){             s->sprite_offset[0][i]<<= shift_y;             s->sprite_offset[1][i]<<= shift_c;             s->sprite_delta[0][i]<<= shift_y;             s->sprite_delta[1][i]<<= shift_y;             s->sprite_shift[i]= 16;         }         s->real_sprite_warping_points= s->num_sprite_warping_points;     } #if 0 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%dn",     vop_ref[0][0], vop_ref[0][1],     vop_ref[1][0], vop_ref[1][1],     vop_ref[2][0], vop_ref[2][1],     sprite_ref[0][0], sprite_ref[0][1],      sprite_ref[1][0], sprite_ref[1][1],      sprite_ref[2][0], sprite_ref[2][1],      virtual_ref[0][0], virtual_ref[0][1],      virtual_ref[1][0], virtual_ref[1][1]     );      printf("offset: %d:%d , delta: %d %d %d %d, shift %dn",     s->sprite_offset[0][0], s->sprite_offset[0][1],     s->sprite_delta[0][0], s->sprite_delta[0][1],     s->sprite_delta[1][0], s->sprite_delta[1][1],     s->sprite_shift[0]     ); #endif } static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){     int hours, minutes, seconds;     hours= get_bits(gb, 5);     minutes= get_bits(gb, 6);     skip_bits1(gb);     seconds= get_bits(gb, 6);     s->time_base= seconds + 60*(minutes + 60*hours);     skip_bits1(gb);     skip_bits1(gb);          return 0; } static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){     int width, height, vo_ver_id;     /* vol header */     skip_bits(gb, 1); /* random access */     s->vo_type= get_bits(gb, 8);     if (get_bits1(gb) != 0) { /* is_ol_id */         vo_ver_id = get_bits(gb, 4); /* vo_ver_id */         skip_bits(gb, 3); /* vo_priority */     } else {         vo_ver_id = 1;     } //printf("vo type:%dn",s->vo_type);     s->aspect_ratio_info= get_bits(gb, 4);     if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){              s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width         s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height     }else{         s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];     }     if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */         int chroma_format= get_bits(gb, 2);         if(chroma_format!=1){             av_log(s->avctx, AV_LOG_ERROR, "illegal chroma formatn");         }         s->low_delay= get_bits1(gb);         if(get_bits1(gb)){ /* vbv parameters */             get_bits(gb, 15); /* first_half_bitrate */             skip_bits1(gb); /* marker */             get_bits(gb, 15); /* latter_half_bitrate */             skip_bits1(gb); /* marker */             get_bits(gb, 15); /* first_half_vbv_buffer_size */             skip_bits1(gb); /* marker */             get_bits(gb, 3); /* latter_half_vbv_buffer_size */             get_bits(gb, 11); /* first_half_vbv_occupancy */             skip_bits1(gb); /* marker */             get_bits(gb, 15); /* latter_half_vbv_occupancy */             skip_bits1(gb); /* marker */                        }     }else{         // set low delay flag only once the smartest? low delay detection won't be overriden         if(s->picture_number==0)             s->low_delay=0;     }     s->shape = get_bits(gb, 2); /* vol shape */     if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supportedn");     if(s->shape == GRAY_SHAPE && vo_ver_id != 1){         av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supportedn");         skip_bits(gb, 4);  //video_object_layer_shape_extension     }     check_marker(gb, "before time_increment_resolution");          s->avctx->time_base.den = get_bits(gb, 16);     if(!s->avctx->time_base.den){         av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0n");         return -1;     }          s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;     if (s->time_increment_bits < 1)         s->time_increment_bits = 1;              check_marker(gb, "before fixed_vop_rate");     if (get_bits1(gb) != 0) {   /* fixed_vop_rate  */         s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);     }else         s->avctx->time_base.num = 1;     s->t_frame=0;     if (s->shape != BIN_ONLY_SHAPE) {         if (s->shape == RECT_SHAPE) {             skip_bits1(gb);   /* marker */             width = get_bits(gb, 13);             skip_bits1(gb);   /* marker */             height = get_bits(gb, 13);             skip_bits1(gb);   /* marker */             if(width && height && !(s->width && s->avctx->codec_tag == ff_get_fourcc("MP4S"))){ /* they should be non zero but who knows ... */                 s->width = width;                 s->height = height; //                printf("width/height: %d %dn", width, height);             }         }                  s->progressive_sequence=          s->progressive_frame= get_bits1(gb)^1;         if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))              av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)n");   /* OBMC Disable */         if (vo_ver_id == 1) {             s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */         } else {             s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */         }         if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supportedn");         if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){             if(s->vol_sprite_usage==STATIC_SPRITE){                 s->sprite_width = get_bits(gb, 13);                 skip_bits1(gb); /* marker */                 s->sprite_height= get_bits(gb, 13);                 skip_bits1(gb); /* marker */                 s->sprite_left  = get_bits(gb, 13);                 skip_bits1(gb); /* marker */                 s->sprite_top   = get_bits(gb, 13);                 skip_bits1(gb); /* marker */             }             s->num_sprite_warping_points= get_bits(gb, 6);             s->sprite_warping_accuracy = get_bits(gb, 2);             s->sprite_brightness_change= get_bits1(gb);             if(s->vol_sprite_usage==STATIC_SPRITE)                 s->low_latency_sprite= get_bits1(gb);                     }         // FIXME sadct disable bit if verid!=1 && shape not rect                  if (get_bits1(gb) == 1) {   /* not_8_bit */             s->quant_precision = get_bits(gb, 4); /* quant_precision */             if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supportedn"); /* bits_per_pixel */             if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %dn", s->quant_precision);         } else {             s->quant_precision = 5;         }                  // FIXME a bunch of grayscale shape things         if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */             int i, v;                          /* load default matrixes */             for(i=0; i<64; i++){                 int j= s->dsp.idct_permutation[i];                 v= ff_mpeg4_default_intra_matrix[i];                 s->intra_matrix[j]= v;                 s->chroma_intra_matrix[j]= v;                                  v= ff_mpeg4_default_non_intra_matrix[i];                 s->inter_matrix[j]= v;                 s->chroma_inter_matrix[j]= v;             }             /* load custom intra matrix */             if(get_bits1(gb)){                 int last=0; for(i=0; i<64; i++){                     int j;                     v= get_bits(gb, 8);                     if(v==0) break;                                          last= v;                     j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];                     s->intra_matrix[j]= v;                     s->chroma_intra_matrix[j]= v;                 }                 /* replicate last value */                 for(; i<64; i++){     int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];                     s->intra_matrix[j]= last;                     s->chroma_intra_matrix[j]= last;                 }             }             /* load custom non intra matrix */             if(get_bits1(gb)){                 int last=0; for(i=0; i<64; i++){                     int j;                     v= get_bits(gb, 8);                     if(v==0) break;                     last= v;                     j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];                     s->inter_matrix[j]= v;                     s->chroma_inter_matrix[j]= v;                 }                 /* replicate last value */                 for(; i<64; i++){     int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];                     s->inter_matrix[j]= last;                     s->chroma_inter_matrix[j]= last;                 }             }             // FIXME a bunch of grayscale shape things         }         if(vo_ver_id != 1)              s->quarter_sample= get_bits1(gb);         else s->quarter_sample=0;         if(!get_bits1(gb)) av_log(s->avctx, AV_LOG_ERROR, "Complexity estimation not supportedn");         s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */         s->data_partitioning= get_bits1(gb);         if(s->data_partitioning){             s->rvlc= get_bits1(gb);         }                  if(vo_ver_id != 1) {             s->new_pred= get_bits1(gb);             if(s->new_pred){                 av_log(s->avctx, AV_LOG_ERROR, "new pred not supportedn");                 skip_bits(gb, 2); /* requested upstream message type */                 skip_bits1(gb); /* newpred segment type */             }             s->reduced_res_vop= get_bits1(gb);             if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supportedn");         }         else{             s->new_pred=0;             s->reduced_res_vop= 0;         }         s->scalability= get_bits1(gb);         if (s->scalability) {             GetBitContext bak= *gb;             int ref_layer_id;             int ref_layer_sampling_dir;             int h_sampling_factor_n;             int h_sampling_factor_m;             int v_sampling_factor_n;             int v_sampling_factor_m;                          s->hierachy_type= get_bits1(gb);             ref_layer_id= get_bits(gb, 4);             ref_layer_sampling_dir= get_bits1(gb);             h_sampling_factor_n= get_bits(gb, 5);             h_sampling_factor_m= get_bits(gb, 5);             v_sampling_factor_n= get_bits(gb, 5);             v_sampling_factor_m= get_bits(gb, 5);             s->enhancement_type= get_bits1(gb);                          if(   h_sampling_factor_n==0 || h_sampling_factor_m==0                 || v_sampling_factor_n==0 || v_sampling_factor_m==0){                 //                fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaroundn");                 s->scalability=0;                                 *gb= bak;             }else                 av_log(s->avctx, AV_LOG_ERROR, "scalability not supportedn");                          // bin shape stuff FIXME         }     }     return 0; } /**  * decodes the user data stuff in the header.  * allso inits divx/xvid/lavc_version/build  */ static int decode_user_data(MpegEncContext *s, GetBitContext *gb){     char buf[256];     int i;     int e;     int ver = 0, build = 0, ver2 = 0, ver3 = 0;     char last; for(i=0; i<255 && gb->index < gb->size_in_bits; i++){         if(show_bits(gb, 23) == 0) break;         buf[i]= get_bits(gb, 8);     }     buf[i]=0;     /* divx detection */     e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);     if(e<2)         e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);     if(e>=2){         s->divx_version= ver;         s->divx_build= build;         s->divx_packed= e==3 && last=='p';     }          /* ffmpeg detection */     e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;     if(e!=4)         e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);      if(e!=4){         e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1; if (e>1)         build= (ver<<16) + (ver2<<8) + ver3;     }     if(e!=4){         if(strcmp(buf, "ffmpeg")==0){             s->lavc_build= 4600;         }     }     if(e==4){         s->lavc_build= build;     }          /* xvid detection */     e=sscanf(buf, "XviD%d", &build);     if(e==1){         s->xvid_build= build;     } //printf("User Data: %sn", buf);     return 0; } static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){     int time_incr, time_increment;     s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */     if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){         av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing itn");         s->low_delay=0;     }       s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;     if(s->partitioned_frame)         s->decode_mb= mpeg4_decode_partitioned_mb;     else         s->decode_mb= ff_mpeg4_decode_mb;     time_incr=0;     while (get_bits1(gb) != 0)          time_incr++;     check_marker(gb, "before time_increment");     if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){         av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bitsn");         for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){             if(show_bits(gb, s->time_increment_bits+1)&1) break;         }         av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)n",s->time_increment_bits);     }          if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further     else time_increment= get_bits(gb, s->time_increment_bits);      //    printf("%d %Xn", s->time_increment_bits, time_increment); //av_log(s->avctx, AV_LOG_DEBUG, " type:%d modulo_time_base:%d increment:%d t_frame %dn", s->pict_type, time_incr, time_increment, s->t_frame);     if(s->pict_type!=B_TYPE){         s->last_time_base= s->time_base;         s->time_base+= time_incr;         s->time= s->time_base*s->avctx->time_base.den + time_increment;         if(s->workaround_bugs&FF_BUG_UMP4){             if(s->time < s->last_non_b_time){ //                fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaroundn");                 s->time_base++;                 s->time+= s->avctx->time_base.den;             }         }         s->pp_time= s->time - s->last_non_b_time;         s->last_non_b_time= s->time;     }else{         s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;         s->pb_time= s->pp_time - (s->last_non_b_time - s->time);         if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){ //            printf("messed up order, maybe after seeking? skipping current b framen");             return FRAME_SKIPPED;         }                  if(s->t_frame==0) s->t_frame= s->pb_time;         if(s->t_frame==0) s->t_frame=1; // 1/0 protection         s->pp_field_time= (  ROUNDED_DIV(s->last_non_b_time, s->t_frame)                             - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;         s->pb_field_time= (  ROUNDED_DIV(s->time, s->t_frame)                             - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;     } //av_log(s->avctx, AV_LOG_DEBUG, "last nonb %Ld last_base %d time %Ld pp %d pb %d t %d ppf %d pbf %dn", s->last_non_b_time, s->last_time_base, s->time, s->pp_time, s->pb_time, s->t_frame, s->pp_field_time, s->pb_field_time);          if(s->avctx->time_base.num)         s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;     else         s->current_picture_ptr->pts= AV_NOPTS_VALUE;     if(s->avctx->debug&FF_DEBUG_PTS)         av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %Ldn", s->current_picture_ptr->pts);     check_marker(gb, "before vop_coded");          /* vop coded */     if (get_bits1(gb) != 1){         if(s->avctx->debug&FF_DEBUG_PICT_INFO)             av_log(s->avctx, AV_LOG_ERROR, "vop not codedn");         return FRAME_SKIPPED;     } //printf("time %d %d %d || %Ld %Ld %Ldn", s->time_increment_bits, s->avctx->time_base.den, s->time_base, //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);       if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE                           || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {         /* rounding type for motion estimation */ s->no_rounding = get_bits1(gb);     } else { s->no_rounding = 0;     } //FIXME reduced res stuff      if (s->shape != RECT_SHAPE) {          if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {              int width, height, hor_spat_ref, ver_spat_ref;                width = get_bits(gb, 13);              skip_bits1(gb);   /* marker */              height = get_bits(gb, 13);              skip_bits1(gb);   /* marker */              hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */              skip_bits1(gb);   /* marker */              ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */          }          skip_bits1(gb); /* change_CR_disable */            if (get_bits1(gb) != 0) {              skip_bits(gb, 8); /* constant_alpha_value */          }      } //FIXME complexity estimation stuff            if (s->shape != BIN_ONLY_SHAPE) {          s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];          if(!s->progressive_sequence){              s->top_field_first= get_bits1(gb);              s->alternate_scan= get_bits1(gb);          }else              s->alternate_scan= 0;      }      if(s->alternate_scan){          ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_alternate_vertical_scan);          ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_alternate_vertical_scan);          ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);          ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);      } else{          ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_zigzag_direct);          ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_zigzag_direct);          ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);          ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);      }        if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){          mpeg4_decode_sprite_trajectory(s, gb);          if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supportedn");          if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supportedn");      }      if (s->shape != BIN_ONLY_SHAPE) {          s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);          if(s->qscale==0){              av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)n");              return -1; // makes no sense to continue, as there is nothing left from the image then          }             if (s->pict_type != I_TYPE) {              s->f_code = get_bits(gb, 3); /* fcode_for */              if(s->f_code==0){                  av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)n");                  return -1; // makes no sense to continue, as the MV decoding will break very quickly              }          }else              s->f_code=1;                if (s->pict_type == B_TYPE) {              s->b_code = get_bits(gb, 3);          }else              s->b_code=1;          if(s->avctx->debug&FF_DEBUG_PICT_INFO){              av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%dn",                   s->qscale, s->f_code, s->b_code,                   s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),                   gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,                   s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,                  s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold);           }          if(!s->scalability){              if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {                  skip_bits1(gb); // vop shape coding type              }          }else{              if(s->enhancement_type){                  int load_backward_shape= get_bits1(gb);                  if(load_backward_shape){                      av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supportedn");                  }              }              skip_bits(gb, 2); //ref_select_code          }      }      /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/      // note we cannot detect divx5 without b-frames easily (although it's buggy too)      if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){          av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flagn");          s->low_delay=1;      }      s->picture_number++; // better than pic number==0 always ;)      s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support       s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;      if(s->workaround_bugs&FF_BUG_EDGE){          s->h_edge_pos= s->width;          s->v_edge_pos= s->height;      }      return 0; } /**  * decode mpeg4 headers  * @return <0 if no VOP found (or a damaged one)  *         FRAME_SKIPPED if a not coded VOP is found  *         0 if a VOP is found  */ int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb) {     int startcode, v;     /* search next start code */     align_get_bits(gb);     if(s->avctx->codec_tag == ff_get_fourcc("WV1F") && show_bits(gb, 24) == 0x575630){         skip_bits(gb, 24);         if(get_bits(gb, 8) == 0xF0)             return decode_vop_header(s, gb);     }     startcode = 0xff;     for(;;) {         if(get_bits_count(gb) >= gb->size_in_bits){             if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){                 av_log(s->avctx, AV_LOG_ERROR, "frame skip %dn", gb->size_in_bits);                 return FRAME_SKIPPED; //divx bug             }else                 return -1; //end of stream         }         v = get_bits(gb, 8);         startcode = ((startcode << 8) | v) & 0xffffffff;                  if((startcode&0xFFFFFF00) != 0x100)             continue; //no startcode                  if(s->avctx->debug&FF_DEBUG_STARTCODE){             av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);             if     (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");             else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");             else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");             else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");             else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");             else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");             else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");             else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");             else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");             else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");             else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");             else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");             else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");             else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");             else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");             else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");             else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");             else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");             else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");             else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");             else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");             else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");             else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");             else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");             else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");             else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");             else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");             av_log(s->avctx, AV_LOG_DEBUG, " at %dn", get_bits_count(gb));         }         if(startcode >= 0x120 && startcode <= 0x12F){             if(decode_vol_header(s, gb) < 0)                  return -1;         }         else if(startcode == USER_DATA_STARTCODE){             decode_user_data(s, gb);         }         else if(startcode == GOP_STARTCODE){             mpeg4_decode_gop_header(s, gb);         }         else if(startcode == VOP_STARTCODE){             return decode_vop_header(s, gb);         }         align_get_bits(gb);         startcode = 0xff;     } } /* don't understand why they choose a different header ! */ int intel_h263_decode_picture_header(MpegEncContext *s) {     int format;     /* picture header */     if (get_bits_long(&s->gb, 22) != 0x20) {         av_log(s->avctx, AV_LOG_ERROR, "Bad picture start coden");         return -1;     }     s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */     if (get_bits1(&s->gb) != 1) {         av_log(s->avctx, AV_LOG_ERROR, "Bad markern");         return -1; /* marker */     }     if (get_bits1(&s->gb) != 0) {         av_log(s->avctx, AV_LOG_ERROR, "Bad H263 idn");         return -1; /* h263 id */     }     skip_bits1(&s->gb); /* split screen off */     skip_bits1(&s->gb); /* camera  off */     skip_bits1(&s->gb); /* freeze picture release off */     format = get_bits(&s->gb, 3);     if (format != 7) {         av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supportedn");         return -1;     }     s->h263_plus = 0;     s->pict_type = I_TYPE + get_bits1(&s->gb);          s->unrestricted_mv = get_bits1(&s->gb);      s->h263_long_vectors = s->unrestricted_mv;     if (get_bits1(&s->gb) != 0) {         av_log(s->avctx, AV_LOG_ERROR, "SAC not supportedn");         return -1; /* SAC: off */     }     if (get_bits1(&s->gb) != 0) {         s->obmc= 1;         av_log(s->avctx, AV_LOG_ERROR, "Advanced Prediction Mode not supportedn"); //        return -1; /* advanced prediction mode: off */     }     if (get_bits1(&s->gb) != 0) {         av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supportedn");         return -1; /* PB frame mode */     }     /* skip unknown header garbage */     skip_bits(&s->gb, 41);     s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);     skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */     /* PEI */     while (get_bits1(&s->gb) != 0) {         skip_bits(&s->gb, 8);     }     s->f_code = 1;     s->y_dc_scale_table=     s->c_dc_scale_table= ff_mpeg1_dc_scale_table;     return 0; } int flv_h263_decode_picture_header(MpegEncContext *s) {     int format, width, height;     /* picture header */     if (get_bits_long(&s->gb, 17) != 1) {         av_log(s->avctx, AV_LOG_ERROR, "Bad picture start coden");         return -1;     }     format = get_bits(&s->gb, 5);     if (format != 0 && format != 1) {         av_log(s->avctx, AV_LOG_ERROR, "Bad picture formatn");         return -1;     }     s->h263_flv = format+1;     s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */     format = get_bits(&s->gb, 3);     switch (format) {     case 0:         width = get_bits(&s->gb, 8);         height = get_bits(&s->gb, 8);         break;     case 1:         width = get_bits(&s->gb, 16);         height = get_bits(&s->gb, 16);         break;     case 2:         width = 352;         height = 288;         break;     case 3:         width = 176;         height = 144;         break;     case 4:         width = 128;         height = 96;         break;     case 5:         width = 320;         height = 240;         break;     case 6:         width = 160;         height = 120;         break;     default:         width = height = 0;         break;     }     if(avcodec_check_dimensions(s->avctx, width, height))         return -1;     s->width = width;     s->height = height;     s->pict_type = I_TYPE + get_bits(&s->gb, 2);     s->dropable= s->pict_type > P_TYPE;     if (s->dropable)         s->pict_type = P_TYPE;          skip_bits1(&s->gb); /* deblocking flag */     s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);     s->h263_plus = 0;     s->unrestricted_mv = 1;     s->h263_long_vectors = 0;     /* PEI */     while (get_bits1(&s->gb) != 0) {         skip_bits(&s->gb, 8);     }     s->f_code = 1;     if(s->avctx->debug & FF_DEBUG_PICT_INFO){         av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%dn",                s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);     }          s->y_dc_scale_table=     s->c_dc_scale_table= ff_mpeg1_dc_scale_table;     return 0; }