# HG changeset patch # User michaelni # Date 1037797684 0 # Node ID 1c32039e72154cee22716ab1366cd3d55c027a56 # Parent af969e91f4227792d722a9fce231ce91bd25d4a8 aspect ratio cleanup diff -r af969e91f422 -r 1c32039e7215 avcodec.h --- a/avcodec.h Wed Nov 20 07:32:18 2002 +0000 +++ b/avcodec.h Wed Nov 20 13:08:04 2002 +0000 @@ -5,8 +5,8 @@ #define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION "0.4.6" -#define LIBAVCODEC_BUILD 4639 -#define LIBAVCODEC_BUILD_STR "4639" +#define LIBAVCODEC_BUILD 4640 +#define LIBAVCODEC_BUILD_STR "4640" enum CodecID { CODEC_ID_NONE, @@ -145,6 +145,7 @@ #define CODEC_FLAG_NORMALIZE_AQP 0x00020000 /* normalize adaptive quantization */ #define CODEC_FLAG_INTERLACED_DCT 0x00040000 /* use interlaced dct */ #define CODEC_FLAG_LOW_DELAY 0x00080000 /* force low delay / will fail on b frames */ +#define CODEC_FLAG_ALT_SCAN 0x00100000 /* use alternate scan */ /* codec capabilities */ @@ -222,8 +223,7 @@ int width, height; /** - * encoding: set by user. 0 if not known - * decoding: set by lavc. 0 if not known + * Obsolete, will be removed */ int aspect_ratio_info; #define FF_ASPECT_SQUARE 1 @@ -646,9 +646,7 @@ float rc_initial_cplx; /** - * custom aspect ratio, used if aspect_info==FF_ASPECT_EXTENDED - * encoding: set by user. - * decoding: set by lavc. + * Obsolete, will be removed */ int aspected_width; int aspected_height; @@ -795,6 +793,13 @@ #define FF_PRED_LEFT 0 #define FF_PRED_PLANE 1 #define FF_PRED_MEDIAN 2 + + /** + * aspect ratio. (0 if unknown) + * encoding: set by user. + * decoding: set by lavc. + */ + float aspect_ratio; } AVCodecContext; typedef struct AVCodec { diff -r af969e91f422 -r 1c32039e7215 common.c --- a/common.c Wed Nov 20 07:32:18 2002 +0000 +++ b/common.c Wed Nov 20 13:08:04 2002 +0000 @@ -326,3 +326,29 @@ if(b) return ff_gcd(b, a%b); else return a; } + +void ff_float2fraction(int *nom_arg, int *denom_arg, double f, int max){ + double best_diff=1E10, diff; + int best_denom=1, best_nom=1; + int nom, denom, gcd; + + //brute force here, perhaps we should try continued fractions if we need large max ... + for(denom=1; denom<=max; denom++){ + nom= (int)(f*denom + 0.5); + if(nom<=0 || nom>max) continue; + + diff= ABS( f - (double)nom / (double)denom ); + if(diff < best_diff){ + best_diff= diff; + best_nom= nom; + best_denom= denom; + } + } + + gcd= ff_gcd(best_nom, best_denom); + best_nom /= gcd; + best_denom /= gcd; + + *nom_arg= best_nom; + *denom_arg= best_denom; +} diff -r af969e91f422 -r 1c32039e7215 common.h --- a/common.h Wed Nov 20 07:32:18 2002 +0000 +++ b/common.h Wed Nov 20 13:08:04 2002 +0000 @@ -842,6 +842,8 @@ return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24); } +void ff_float2fraction(int *nom_arg, int *denom_arg, double f, int max); + #ifdef ARCH_X86 #define MASK_ABS(mask, level)\ diff -r af969e91f422 -r 1c32039e7215 h263.c --- a/h263.c Wed Nov 20 07:32:18 2002 +0000 +++ b/h263.c Wed Nov 20 13:08:04 2002 +0000 @@ -120,6 +120,26 @@ 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; @@ -196,11 +216,9 @@ 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)); @@ -1508,10 +1526,10 @@ 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); diff -r af969e91f422 -r 1c32039e7215 h263dec.c --- a/h263dec.c Wed Nov 20 07:32:18 2002 +0000 +++ b/h263dec.c Wed Nov 20 13:08:04 2002 +0000 @@ -348,6 +348,8 @@ MpegEncContext *s = avctx->priv_data; int ret,i; AVPicture *pict = data; + float new_aspect; + #ifdef PRINT_FRAME_TIME uint64_t time= rdtsc(); #endif @@ -495,23 +497,19 @@ /* and other parameters. So then we could init the picture */ /* FIXME: By the way H263 decoder is evolving it should have */ /* an H263EncContext */ + if(s->aspected_height) + new_aspect= (float)s->aspected_width / (float)s->aspected_height; + else + new_aspect=0; + if ( s->width != avctx->width || s->height != avctx->height - || avctx->aspect_ratio_info != s->aspect_ratio_info - || avctx->aspected_width != s->aspected_width - || avctx->aspected_height != s->aspected_height) { + || ABS(new_aspect - avctx->aspect_ratio) > 0.001) { /* H.263 could change picture size any time */ MPV_common_end(s); s->context_initialized=0; } if (!s->context_initialized) { - avctx->width = s->width; - avctx->height = s->height; - avctx->aspect_ratio_info= s->aspect_ratio_info; - if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) - { - avctx->aspected_width = s->aspected_width; - avctx->aspected_height = s->aspected_height; - } + avctx->aspect_ratio= new_aspect; goto retry; } diff -r af969e91f422 -r 1c32039e7215 mpegvideo.c --- a/mpegvideo.c Wed Nov 20 07:32:18 2002 +0000 +++ b/mpegvideo.c Wed Nov 20 13:08:04 2002 +0000 @@ -557,12 +557,6 @@ s->qcompress= avctx->qcompress; s->qblur= avctx->qblur; s->avctx = avctx; - s->aspect_ratio_info= avctx->aspect_ratio_info; - if (avctx->aspect_ratio_info == FF_ASPECT_EXTENDED) - { - s->aspected_width = avctx->aspected_width; - s->aspected_height = avctx->aspected_height; - } s->flags= avctx->flags; s->max_b_frames= avctx->max_b_frames; s->b_frame_strategy= avctx->b_frame_strategy;