#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);
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,
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];
max level: 53/16
max run: 29/41
*/
+#endif
+
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;
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));
}
}
+#ifdef CONFIG_ENCODERS
void mpeg4_encode_mb(MpegEncContext * s,
DCTELEM block[6][64],
int motion_x, int motion_y)
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;
}
}
}
+#endif
static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
{
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;
{
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;
umv_fcode_tab[mv]= 1;
}
}
+#endif
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;
}
}
}
+#endif
/***************************************************/
/**
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);
}
#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)
{
}
#endif
}
-
+#endif
/***********************************************/
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;
}
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");
}
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))
}
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");
}
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;
}