]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/h263.c
* Ogg/Vorbis patch by Mark Hills
[ffmpeg] / libavcodec / h263.c
index 09049c1d223ebb99a9c83a8c19be286c0c3cb161..8bb23eac5f01e5e85cd540c94561694c5fd19383 100644 (file)
@@ -49,6 +49,7 @@
 #define MB_TYPE_B_VLC_BITS 4
 #define TEX_VLC_BITS 9
 
+#ifdef CONFIG_ENCODERS
 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
                              int n);
 static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
@@ -56,6 +57,8 @@ static void h263p_encode_umotion(MpegEncContext * s, int val);
 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
                               int n, int dc, UINT8 *scan_table, 
                                PutBitContext *dc_pb, PutBitContext *ac_pb);
+#endif
+
 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
 static int h263p_decode_umotion(MpegEncContext * s, int pred);
 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
@@ -69,15 +72,16 @@ static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
 
-
 extern UINT32 inverse[256];
 
-static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
+static UINT16 uni_DCtab_lum  [512][2];
+static UINT16 uni_DCtab_chrom[512][2];
+
+#ifdef CONFIG_ENCODERS
+static UINT16 (*mv_penalty)[MAX_MV*2+1]= NULL;
 static UINT8 fcode_tab[MAX_MV*2+1];
 static UINT8 umv_fcode_tab[MAX_MV*2+1];
 
-static UINT16 uni_DCtab_lum  [512][2];
-static UINT16 uni_DCtab_chrom[512][2];
 static UINT32 uni_mpeg4_intra_rl_bits[64*64*2*2];
 static UINT8  uni_mpeg4_intra_rl_len [64*64*2*2];
 static UINT32 uni_mpeg4_inter_rl_bits[64*64*2*2];
@@ -94,6 +98,8 @@ intra
 max level: 53/16
 max run: 29/41
 */
+#endif
+
 
 int h263_get_picture_format(int width, int height)
 {
@@ -114,6 +120,26 @@ int h263_get_picture_format(int width, int height)
     return format;
 }
 
+static void init_aspect_info(MpegEncContext * s){
+    double aspect;
+    
+    emms_c(); //paranoia ;)
+    
+    if(s->avctx->aspect_ratio==0) aspect= 1.0;
+    aspect= s->avctx->aspect_ratio;
+    
+    ff_float2fraction(&s->aspected_width, &s->aspected_height, aspect, 255);
+    
+    if(s->aspected_width == 4 && s->aspected_height == 3)
+        s->aspect_ratio_info= FF_ASPECT_4_3_625;
+    else if(s->aspected_width == 16 && s->aspected_height == 9)
+        s->aspect_ratio_info= FF_ASPECT_16_9_625;
+    else if(s->aspected_width == 1 && s->aspected_height == 1)
+        s->aspect_ratio_info= FF_ASPECT_SQUARE;
+    else
+        s->aspect_ratio_info= FF_ASPECT_EXTENDED;
+}
+
 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
 {
     int format;
@@ -190,11 +216,9 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number)
                
                if (format == 7) {
             /* Custom Picture Format (CPFMT) */
-               
-           if (s->aspect_ratio_info)
-               put_bits(&s->pb,4,s->aspect_ratio_info);
-           else
-               put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
+            init_aspect_info(s);
+
+            put_bits(&s->pb,4,s->aspect_ratio_info);
             put_bits(&s->pb,9,(s->width >> 2) - 1);
             put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
             put_bits(&s->pb,9,(s->height >> 2));
@@ -364,6 +388,7 @@ void ff_clean_mpeg4_qscales(MpegEncContext *s){
     }
 }
 
+#ifdef CONFIG_ENCODERS
 void mpeg4_encode_mb(MpegEncContext * s,
                    DCTELEM block[6][64],
                    int motion_x, int motion_y)
@@ -531,7 +556,7 @@ void mpeg4_encode_mb(MpegEncContext * s,
                         if(s->coded_order[i+1].pict_type!=B_TYPE) break;
 
                         b_pic= s->coded_order[i+1].picture[0] + offset;
-                        diff= pix_abs16x16(p_pic, b_pic, s->linesize);
+                       diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize);
                         if(diff>s->qscale*70){ //FIXME check that 70 is optimal
                             s->mb_skiped=0;
                             break;
@@ -870,6 +895,7 @@ void h263_encode_mb(MpegEncContext * s,
         }
     }
 }
+#endif
 
 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
 {
@@ -1061,6 +1087,7 @@ INT16 *h263_pred_motion(MpegEncContext * s, int block,
     return mot_val;
 }
 
+#ifdef CONFIG_ENCODERS
 static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
 {
     int range, l, bit_size, sign, code, bits;
@@ -1152,6 +1179,10 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s)
 {
     int f_code;
     int mv;
+    
+    if(mv_penalty==NULL)
+        mv_penalty= av_mallocz( sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1) );
+    
     for(f_code=1; f_code<=MAX_FCODE; f_code++){
         for(mv=-MAX_MV; mv<=MAX_MV; mv++){
             int len;
@@ -1189,6 +1220,7 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s)
         umv_fcode_tab[mv]= 1;
     }
 }
+#endif
 
 static void init_uni_dc_tab(void)
 {
@@ -1242,6 +1274,7 @@ static void init_uni_dc_tab(void)
     }
 }
 
+#ifdef CONFIG_ENCODERS
 static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){
     int slevel, run, last;
     
@@ -1434,6 +1467,7 @@ static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
            }
     }
 }
+#endif
 
 /***************************************************/
 /**
@@ -1492,10 +1526,10 @@ static void mpeg4_encode_vol_header(MpegEncContext * s)
     put_bits(&s->pb, 1, 1);            /* is obj layer id= yes */
       put_bits(&s->pb, 4, vo_ver_id);  /* is obj layer ver id */
       put_bits(&s->pb, 3, 1);          /* is obj layer priority */
-    if(s->aspect_ratio_info) 
-        put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
-    else
-        put_bits(&s->pb, 4, 1);                /* aspect ratio info= sqare pixel */
+    
+    init_aspect_info(s);
+
+    put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
     if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
     {
        put_bits(&s->pb, 8, s->aspected_width);
@@ -1832,7 +1866,7 @@ static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
     }
 #endif
 }
-
+#ifdef CONFIG_ENCODERS
 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, 
                                UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
 {
@@ -1948,7 +1982,7 @@ static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n
     }
 #endif
 }
-
+#endif
 
 
 /***********************************************/
@@ -2188,7 +2222,7 @@ int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
         case S_TYPE:
             return s->f_code+15;
         case B_TYPE:
-            return MAX(MAX(s->f_code, s->b_code)+15, 17);
+            return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
         default:
             return -1;
     }
@@ -2305,7 +2339,7 @@ static int mpeg4_decode_video_packet_header(MpegEncContext *s)
         if(s->shape != BIN_ONLY_SHAPE){
             skip_bits(&s->gb, 3); /* intra dc vlc threshold */
 //FIXME dont just ignore everything
-            if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){
+            if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
                 mpeg4_decode_sprite_trajectory(s);
                 fprintf(stderr, "untested\n");
             }
@@ -3965,7 +3999,7 @@ static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
             s->sprite_shift[1]= alpha+rho+2;
             break;
         case 3:
-            min_ab= MIN(alpha, beta);
+            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))
@@ -4469,9 +4503,7 @@ static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
      }
  
      if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
-         if(s->num_sprite_warping_points){
-             mpeg4_decode_sprite_trajectory(s);
-         }
+         mpeg4_decode_sprite_trajectory(s);
          if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
          if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
      }
@@ -4644,6 +4676,10 @@ int intel_h263_decode_picture_header(MpegEncContext *s)
         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;
 }