diff options
Diffstat (limited to 'src')
75 files changed, 5477 insertions, 3502 deletions
diff --git a/src/libffmpeg/libavcodec/Makefile.am b/src/libffmpeg/libavcodec/Makefile.am index c54f72ae8..c45f91a27 100644 --- a/src/libffmpeg/libavcodec/Makefile.am +++ b/src/libffmpeg/libavcodec/Makefile.am @@ -40,6 +40,7 @@ libavcodec_la_SOURCES = \ mpegaudiodec.c \ mpegvideo.c \ msmpeg4.c \ + opts.c \ ratecontrol.c \ rv10.c \ simple_idct.c \ @@ -69,6 +70,7 @@ noinst_HEADERS = \ mpegaudiotab.h \ mpegvideo.h \ msmpeg4data.h \ + os_support.h \ simple_idct.h \ svq1_cb.h \ wmadata.h diff --git a/src/libffmpeg/libavcodec/alpha/dsputil_alpha.c b/src/libffmpeg/libavcodec/alpha/dsputil_alpha.c index 5cbc00167..cdc8a6d5a 100644 --- a/src/libffmpeg/libavcodec/alpha/dsputil_alpha.c +++ b/src/libffmpeg/libavcodec/alpha/dsputil_alpha.c @@ -20,6 +20,9 @@ #include "asm.h" #include "../dsputil.h" +extern void simple_idct_put_axp(uint8_t *dest, int line_size, DCTELEM *block); +extern void simple_idct_add_axp(uint8_t *dest, int line_size, DCTELEM *block); + void put_pixels_axp_asm(uint8_t *block, const uint8_t *pixels, int line_size, int h); void put_pixels_clamped_mvi_asm(const DCTELEM *block, uint8_t *pixels, @@ -295,7 +298,7 @@ static int sad8x8_mvi(void *s, uint8_t *a, uint8_t *b, int stride) return pix_abs8x8_mvi(a, b, stride); } -void dsputil_init_alpha(DSPContext* c, unsigned mask) +void dsputil_init_alpha(DSPContext* c, AVCodecContext *avctx) { c->put_pixels_tab[0][0] = put_pixels16_axp_asm; c->put_pixels_tab[0][1] = put_pixels16_x2_axp; @@ -357,4 +360,7 @@ void dsputil_init_alpha(DSPContext* c, unsigned mask) put_pixels_clamped_axp_p = c->put_pixels_clamped; add_pixels_clamped_axp_p = c->add_pixels_clamped; + + c->idct_put = simple_idct_put_axp; + c->idct_add = simple_idct_add_axp; } diff --git a/src/libffmpeg/libavcodec/alpha/mpegvideo_alpha.c b/src/libffmpeg/libavcodec/alpha/mpegvideo_alpha.c index 350b53f62..1a58e5dfd 100644 --- a/src/libffmpeg/libavcodec/alpha/mpegvideo_alpha.c +++ b/src/libffmpeg/libavcodec/alpha/mpegvideo_alpha.c @@ -21,9 +21,6 @@ #include "../dsputil.h" #include "../mpegvideo.h" -extern void simple_idct_put_axp(uint8_t *dest, int line_size, DCTELEM *block); -extern void simple_idct_add_axp(uint8_t *dest, int line_size, DCTELEM *block); - static void dct_unquantize_h263_axp(MpegEncContext *s, DCTELEM *block, int n, int qscale) { @@ -97,6 +94,4 @@ static void dct_unquantize_h263_axp(MpegEncContext *s, DCTELEM *block, void MPV_common_init_axp(MpegEncContext *s) { s->dct_unquantize_h263 = dct_unquantize_h263_axp; - s->idct_put = simple_idct_put_axp; - s->idct_add = simple_idct_add_axp; } diff --git a/src/libffmpeg/libavcodec/alpha/simple_idct_alpha.c b/src/libffmpeg/libavcodec/alpha/simple_idct_alpha.c index 5ce017740..889fd2ae1 100644 --- a/src/libffmpeg/libavcodec/alpha/simple_idct_alpha.c +++ b/src/libffmpeg/libavcodec/alpha/simple_idct_alpha.c @@ -49,7 +49,7 @@ extern void (*add_pixels_clamped_axp_p)(const DCTELEM *block, uint8_t *pixels, static inline int idct_row(DCTELEM *row) { int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3, t; - uint64_t l, r; + uint64_t l, r, t2; l = ldq(row); r = ldq(row + 4); @@ -60,12 +60,12 @@ static inline int idct_row(DCTELEM *row) if (((l & ~0xffffUL) | r) == 0) { a0 >>= ROW_SHIFT; - a0 = (uint16_t) a0; - a0 |= a0 << 16; - a0 |= a0 << 32; + t2 = (uint16_t) a0; + t2 |= t2 << 16; + t2 |= t2 << 32; - stq(a0, row); - stq(a0, row + 4); + stq(t2, row); + stq(t2, row + 4); return 1; } diff --git a/src/libffmpeg/libavcodec/armv4l/dsputil_arm.c b/src/libffmpeg/libavcodec/armv4l/dsputil_arm.c index e459b3391..e3cc05f63 100644 --- a/src/libffmpeg/libavcodec/armv4l/dsputil_arm.c +++ b/src/libffmpeg/libavcodec/armv4l/dsputil_arm.c @@ -21,7 +21,33 @@ extern void j_rev_dct_ARM(DCTELEM *data); -void dsputil_init_armv4l(DSPContext* c, unsigned mask) +/* XXX: local hack */ +static void (*ff_put_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size); +static void (*ff_add_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size); + +/* XXX: those functions should be suppressed ASAP when all IDCTs are + converted */ +static void arm_idct_put(uint8_t *dest, int line_size, DCTELEM *block) +{ + j_rev_dct_ARM (block); + ff_put_pixels_clamped(block, dest, line_size); +} +static void arm_idct_add(uint8_t *dest, int line_size, DCTELEM *block) +{ + j_rev_dct_ARM (block); + ff_add_pixels_clamped(block, dest, line_size); +} + +void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx) { -// ff_idct = j_rev_dct_ARM; + const int idct_algo= avctx->idct_algo; + + ff_put_pixels_clamped = c->put_pixels_clamped; + ff_add_pixels_clamped = c->add_pixels_clamped; + + if(idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_ARM){ + c->idct_put= arm_idct_put; + c->idct_add= arm_idct_add; + c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM;/* FF_NO_IDCT_PERM */ + } } diff --git a/src/libffmpeg/libavcodec/avcodec.h b/src/libffmpeg/libavcodec/avcodec.h index 06b348fa7..c8b48c072 100644 --- a/src/libffmpeg/libavcodec/avcodec.h +++ b/src/libffmpeg/libavcodec/avcodec.h @@ -1,6 +1,12 @@ #ifndef AVCODEC_H #define AVCODEC_H +/** + * @file avcodec.h + * external api header. + */ + + #ifdef __cplusplus extern "C" { #endif @@ -9,8 +15,10 @@ extern "C" { #define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION "0.4.6" -#define LIBAVCODEC_BUILD 4654 -#define LIBAVCODEC_BUILD_STR "4654" +#define LIBAVCODEC_BUILD 4663 +#define LIBAVCODEC_BUILD_STR "4663" + +#define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR enum CodecID { CODEC_ID_NONE, @@ -40,6 +48,7 @@ enum CodecID { CODEC_ID_MACE3, CODEC_ID_MACE6, CODEC_ID_HUFFYUV, + CODEC_ID_CYUV, /* various pcm "codecs" */ CODEC_ID_PCM_S16LE, @@ -63,27 +72,31 @@ enum CodecType { CODEC_TYPE_AUDIO, }; +/** + * Pixel format. + */ enum PixelFormat { PIX_FMT_YUV420P, PIX_FMT_YUV422, - PIX_FMT_RGB24, /* 3 bytes, R is first */ - PIX_FMT_BGR24, /* 3 bytes, B is first */ + PIX_FMT_RGB24, ///< 3 bytes, R is first + PIX_FMT_BGR24, ///< 3 bytes, B is first PIX_FMT_YUV422P, PIX_FMT_YUV444P, - PIX_FMT_RGBA32, /* always stored in cpu endianness */ + PIX_FMT_RGBA32, ///< always stored in cpu endianness PIX_FMT_YUV410P, PIX_FMT_YUV411P, - PIX_FMT_RGB565, /* always stored in cpu endianness */ - PIX_FMT_RGB555, /* always stored in cpu endianness, most significant bit to 1 */ + PIX_FMT_RGB565, ///< always stored in cpu endianness + PIX_FMT_RGB555, ///< always stored in cpu endianness, most significant bit to 1 PIX_FMT_GRAY8, - PIX_FMT_MONOWHITE, /* 0 is white */ - PIX_FMT_MONOBLACK, /* 0 is black */ + PIX_FMT_MONOWHITE, ///< 0 is white + PIX_FMT_MONOBLACK, ///< 0 is black + PIX_FMT_PAL8, ///< 8 bit with RGBA palette PIX_FMT_NB, }; /* currently unused, may be used if 24/32 bits samples ever supported */ enum SampleFormat { - SAMPLE_FMT_S16 = 0, /* signed 16 bits */ + SAMPLE_FMT_S16 = 0, ///< signed 16 bits }; /* in bytes */ @@ -127,154 +140,180 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, Note: note not everything is supported yet */ -#define CODEC_FLAG_HQ 0x0001 /* brute force MB-type decission mode (slow) */ -#define CODEC_FLAG_QSCALE 0x0002 /* use fixed qscale */ -#define CODEC_FLAG_4MV 0x0004 /* 4 MV per MB allowed */ -#define CODEC_FLAG_QPEL 0x0010 /* use qpel MC */ -#define CODEC_FLAG_GMC 0x0020 /* use GMC */ -#define CODEC_FLAG_PART 0x0080 /* use data partitioning */ +#define CODEC_FLAG_HQ 0x0001 ///< brute force MB-type decission mode (slow) +#define CODEC_FLAG_QSCALE 0x0002 ///< use fixed qscale +#define CODEC_FLAG_4MV 0x0004 ///< 4 MV per MB allowed +#define CODEC_FLAG_QPEL 0x0010 ///< use qpel MC +#define CODEC_FLAG_GMC 0x0020 ///< use GMC +#define CODEC_FLAG_PART 0x0080 ///< use data partitioning /* parent program gurantees that the input for b-frame containing streams is not written to for at least s->max_b_frames+1 frames, if this is not set than the input will be copied */ #define CODEC_FLAG_INPUT_PRESERVED 0x0100 -#define CODEC_FLAG_PASS1 0x0200 /* use internal 2pass ratecontrol in first pass mode */ -#define CODEC_FLAG_PASS2 0x0400 /* use internal 2pass ratecontrol in second pass mode */ -#define CODEC_FLAG_EXTERN_HUFF 0x1000 /* use external huffman table (for mjpeg) */ -#define CODEC_FLAG_GRAY 0x2000 /* only decode/encode grayscale */ -#define CODEC_FLAG_EMU_EDGE 0x4000/* dont draw edges */ -#define CODEC_FLAG_PSNR 0x8000 /* error[?] variables will be set during encoding */ -#define CODEC_FLAG_TRUNCATED 0x00010000 /* input bitstream might be truncated at a random location instead +#define CODEC_FLAG_PASS1 0x0200 ///< use internal 2pass ratecontrol in first pass mode +#define CODEC_FLAG_PASS2 0x0400 ///< use internal 2pass ratecontrol in second pass mode +#define CODEC_FLAG_EXTERN_HUFF 0x1000 ///< use external huffman table (for mjpeg) +#define CODEC_FLAG_GRAY 0x2000 ///< only decode/encode grayscale +#define CODEC_FLAG_EMU_EDGE 0x4000///< dont draw edges +#define CODEC_FLAG_PSNR 0x8000 ///< error[?] variables will be set during encoding +#define CODEC_FLAG_TRUNCATED 0x00010000 /** input bitstream might be truncated at a random location instead of only at frame boundaries */ -#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 */ -#define CODEC_FLAG_TRELLIS_QUANT 0x00200000 /* use trellis quantization */ -#define CODEC_FLAG_GLOBAL_HEADER 0x00400000 /* place global headers in extradata instead of every keyframe */ - +#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 +#define CODEC_FLAG_TRELLIS_QUANT 0x00200000 ///< use trellis quantization +#define CODEC_FLAG_GLOBAL_HEADER 0x00400000 ///< place global headers in extradata instead of every keyframe +#define CODEC_FLAG_BITEXACT 0x00800000 ///< use only bitexact stuff (except (i)dct) +/* Fx : Flag for h263+ extra options */ +#define CODEC_FLAG_H263P_AIC 0x01000000 ///< Advanced intra coding +#define CODEC_FLAG_H263P_UMV 0x02000000 ///< Unlimited motion vector +/* For advanced prediction mode, we reuse the 4MV flag */ +/* Unsupported options : + * Syntax Arithmetic coding (SAC) + * Deblocking filter internal loop + * Slice structured + * Reference Picture Selection + * Independant Segment Decoding + * Alternative Inter * VLC + * Modified Quantization */ +/* /Fx */ /* codec capabilities */ -#define CODEC_CAP_DRAW_HORIZ_BAND 0x0001 /* decoder can use draw_horiz_band callback */ -#define CODEC_CAP_DR1 0x0002 /* direct rendering method 1 */ +#define CODEC_CAP_DRAW_HORIZ_BAND 0x0001 ///< decoder can use draw_horiz_band callback +#define CODEC_CAP_DR1 0x0002 ///< direct rendering method 1 /* if 'parse_only' field is true, then avcodec_parse_frame() can be used */ #define CODEC_CAP_PARSE_ONLY 0x0004 #define CODEC_CAP_TRUNCATED 0x0008 -#define FRAME_RATE_BASE 10000 - #define FF_COMMON_FRAME \ + /**\ + * pointer to the picture planes.\ + * this might be different from the first allocated byte\ + * - encoding: \ + * - decoding: \ + */\ uint8_t *data[4];\ int linesize[4];\ /**\ * pointer to the first allocated byte of the picture. can be used in get_buffer/release_buffer\ * this isnt used by lavc unless the default get/release_buffer() is used\ - * encoding: \ - * decoding: \ + * - encoding: \ + * - decoding: \ */\ uint8_t *base[4];\ /**\ * 1 -> keyframe, 0-> not\ - * encoding: set by lavc\ - * decoding: set by lavc\ + * - encoding: set by lavc\ + * - decoding: set by lavc\ */\ int key_frame;\ \ /**\ * picture type of the frame, see ?_TYPE below\ - * encoding: set by lavc for coded_picture (and set by user for input)\ - * decoding: set by lavc\ + * - encoding: set by lavc for coded_picture (and set by user for input)\ + * - decoding: set by lavc\ */\ int pict_type;\ \ /**\ * presentation timestamp in micro seconds (time when frame should be shown to user)\ * if 0 then the frame_rate will be used as reference\ - * encoding: MUST be set by user\ - * decoding: set by lavc\ + * - encoding: MUST be set by user\ + * - decoding: set by lavc\ */\ long long int pts;\ \ /**\ * picture number in bitstream order.\ - * encoding: set by\ - * decoding: set by lavc\ + * - encoding: set by\ + * - decoding: set by lavc\ */\ int coded_picture_number;\ /**\ - * encoding: set by\ - * decoding: set by lavc\ * picture number in display order.\ + * - encoding: set by\ + * - decoding: set by lavc\ */\ int display_picture_number;\ \ /**\ * quality (between 1 (good) and 31 (bad)) \ - * encoding: set by lavc for coded_picture (and set by user for input)\ - * decoding: set by lavc\ + * - encoding: set by lavc for coded_picture (and set by user for input)\ + * - decoding: set by lavc\ */\ float quality; \ \ /**\ * buffer age (1->was last buffer and dint change, 2->..., ...).\ * set to something large if the buffer has not been used yet \ - * encoding: unused\ - * decoding: MUST be set by get_buffer()\ + * - encoding: unused\ + * - decoding: MUST be set by get_buffer()\ */\ int age;\ \ /**\ * is this picture used as reference\ - * encoding: unused\ - * decoding: set by lavc (before get_buffer() call))\ + * - encoding: unused\ + * - decoding: set by lavc (before get_buffer() call))\ */\ int reference;\ \ /**\ * QP table\ - * encoding: unused\ - * decoding: set by lavc\ + * - encoding: unused\ + * - decoding: set by lavc\ */\ int8_t *qscale_table;\ /**\ * QP store stride\ - * encoding: unused\ - * decoding: set by lavc\ + * - encoding: unused\ + * - decoding: set by lavc\ */\ int qstride;\ \ /**\ * mbskip_table[mb]>=1 if MB didnt change\ * stride= mb_width = (width+15)>>4\ - * encoding: unused\ - * decoding: set by lavc\ + * - encoding: unused\ + * - decoding: set by lavc\ */\ uint8_t *mbskip_table;\ \ /**\ * for some private data of the user\ - * encoding: unused\ - * decoding: set by user\ + * - encoding: unused\ + * - decoding: set by user\ */\ void *opaque;\ \ /**\ * error\ - * encoding: set by lavc if flags&CODEC_FLAG_PSNR\ - * decoding: unused\ + * - encoding: set by lavc if flags&CODEC_FLAG_PSNR\ + * - decoding: unused\ */\ uint64_t error[4];\ \ /**\ * type of the buffer (to keep track of who has to dealloc data[*])\ - * encoding: set by the one who allocs it\ - * decoding: set by the one who allocs it\ + * - encoding: set by the one who allocs it\ + * - decoding: set by the one who allocs it\ * Note: user allocated (direct rendering) & internal buffers can not coexist currently\ */\ int type;\ + \ + /**\ + * when decoding, this signal how much the picture must be delayed.\ + * extra_delay = repeat_pict / (2*fps)\ + * - encoding: unused\ + * - decoding: set by lavc\ + */\ + int repeat_pict; + #define FF_BUFFER_TYPE_INTERNAL 1 -#define FF_BUFFER_TYPE_USER 2 // Direct rendering buffers -#define FF_BUFFER_TYPE_SHARED 4 // input frame for encoding(wont be dealloced) +#define FF_BUFFER_TYPE_USER 2 ///< Direct rendering buffers +#define FF_BUFFER_TYPE_SHARED 4 ///< buffer from somewher else, dont dealloc #define FF_I_TYPE 1 // Intra @@ -286,67 +325,73 @@ typedef struct AVFrame { FF_COMMON_FRAME } AVFrame; +#define DEFAULT_FRAME_RATE_BASE 1001000 + +/** + * main external api structure. + */ typedef struct AVCodecContext { /** - * the average bitrate - * encoding: set by user. unused for constant quantizer encoding - * decoding: set by lavc. 0 or some bitrate if this info is available in the stream + * the average bitrate. + * - encoding: set by user. unused for constant quantizer encoding + * - decoding: set by lavc. 0 or some bitrate if this info is available in the stream */ int bit_rate; /** - * number of bits the bitstream is allowed to diverge from the reference + * number of bits the bitstream is allowed to diverge from the reference. * the reference can be CBR (for CBR pass1) or VBR (for pass2) - * encoding: set by user. unused for constant quantizer encoding - * decoding: unused + * - encoding: set by user. unused for constant quantizer encoding + * - decoding: unused */ int bit_rate_tolerance; /** - * CODEC_FLAG_* - * encoding: set by user. - * decoding: set by user. + * CODEC_FLAG_*. + * - encoding: set by user. + * - decoding: set by user. */ int flags; /** * some codecs needs additionnal format info. It is stored here - * encoding: set by user. - * decoding: set by lavc. (FIXME is this ok?) + * - encoding: set by user. + * - decoding: set by lavc. (FIXME is this ok?) */ int sub_id; /** - * motion estimation algorithm used for video coding - * encoding: MUST be set by user. - * decoding: unused + * motion estimation algorithm used for video coding. + * - encoding: MUST be set by user. + * - decoding: unused */ int me_method; /** - * some codecs need / can use extra-data like huffman tables + * some codecs need / can use extra-data like huffman tables. * mjpeg: huffman tables * rv10: additional flags * mpeg4: global headers (they can be in the bitstream or here) - * encoding: set/allocated/freed by lavc. - * decoding: set/allocated/freed by user. + * - encoding: set/allocated/freed by lavc. + * - decoding: set/allocated/freed by user. */ void *extradata; int extradata_size; /* video only */ /** - * frames per sec multiplied by FRAME_RATE_BASE + * frames per sec multiplied by frame_rate_base. * for variable fps this is the precission, so if the timestamps - * can be specified in msec precssion then this is 1000*FRAME_RATE_BASE - * encoding: MUST be set by user - * decoding: set by lavc. 0 or the frame_rate if available + * can be specified in msec precssion then this is 1000*frame_rate_base + * - encoding: MUST be set by user + * - decoding: set by lavc. 0 or the frame_rate if available */ int frame_rate; - + /** - * encoding: MUST be set by user. - * decoding: set by user, some codecs might override / change it during playback + * width / height. + * - encoding: MUST be set by user. + * - decoding: set by user, some codecs might override / change it during playback */ int width, height; @@ -358,91 +403,94 @@ typedef struct AVCodecContext { #define FF_ASPECT_EXTENDED 15 /** - * the number of pictures in a group of pitures, or 0 for intra_only - * encoding: set by user. - * decoding: unused + * the number of pictures in a group of pitures, or 0 for intra_only. + * - encoding: set by user. + * - decoding: unused */ int gop_size; /** - * pixel format, see PIX_FMT_xxx - * encoding: unused - * decoding: set by lavc. + * pixel format, see PIX_FMT_xxx. + * - encoding: unused + * - decoding: set by lavc. */ enum PixelFormat pix_fmt; - - int repeat_pict; /* when decoding, this signal how much the picture */ - /* must be delayed. */ - /* extra_delay = (repeat_pict / 2) * (1/fps) */ - + + /** + * Frame rate emulation. If not zero lower layer (i.e. format handler) + * has to read frames at native frame rate. + * - encoding: set by user. + * - decoding: unused. + */ + int rate_emu; + /** * if non NULL, 'draw_horiz_band' is called by the libavcodec * decoder to draw an horizontal band. It improve cache usage. Not * all codecs can do that. You must check the codec capabilities * before - * encoding: unused - * decoding: set by user. + * - encoding: unused + * - decoding: set by user. */ void (*draw_horiz_band)(struct AVCodecContext *s, - UINT8 **src_ptr, int linesize, + uint8_t **src_ptr, int linesize, int y, int width, int height); /* audio only */ - int sample_rate; /* samples per sec */ + int sample_rate; ///< samples per sec int channels; - int sample_fmt; /* sample format, currenly unused */ + int sample_fmt; ///< sample format, currenly unused /* the following data should not be initialized */ - int frame_size; /* in samples, initialized when calling 'init' */ - int frame_number; /* audio or video frame number */ - int real_pict_num; /* returns the real picture number of - previous encoded frame */ + int frame_size; ///< in samples, initialized when calling 'init' + int frame_number; ///< audio or video frame number + int real_pict_num; ///< returns the real picture number of previous encoded frame /** * number of frames the decoded output will be delayed relative to - * the encoded input - * encoding: set by lavc. - * decoding: unused + * the encoded input. + * - encoding: set by lavc. + * - decoding: unused */ int delay; - /* encoding parameters */ - float qcompress; /* amount of qscale change between easy & hard scenes (0.0-1.0)*/ - float qblur; /* amount of qscale smoothing over time (0.0-1.0) */ + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) /** - * minimum quantizer - * encoding: set by user. - * decoding: unused + * minimum quantizer. + * - encoding: set by user. + * - decoding: unused */ int qmin; /** - * maximum quantizer - * encoding: set by user. - * decoding: unused + * maximum quantizer. + * - encoding: set by user. + * - decoding: unused */ int qmax; /** - * maximum quantizer difference etween frames - * encoding: set by user. - * decoding: unused + * maximum quantizer difference etween frames. + * - encoding: set by user. + * - decoding: unused */ int max_qdiff; /** - * maximum number of b frames between non b frames + * maximum number of b frames between non b frames. * note: the output will be delayed by max_b_frames+1 relative to the input - * encoding: set by user. - * decoding: unused + * - encoding: set by user. + * - decoding: unused */ int max_b_frames; /** - * qscale factor between ip and b frames - * encoding: set by user. - * decoding: unused + * qscale factor between ip and b frames. + * - encoding: set by user. + * - decoding: unused */ float b_quant_factor; @@ -451,8 +499,9 @@ typedef struct AVCodecContext { int b_frame_strategy; /** - * encoding: unused - * decoding: set by user. 1-> skip b frames, 2-> skip idct/dequant too, 5-> skip everything except header + * hurry up amount. + * - encoding: unused + * - decoding: set by user. 1-> skip b frames, 2-> skip idct/dequant too, 5-> skip everything except header */ int hurry_up; @@ -491,31 +540,38 @@ typedef struct AVCodecContext { int misc_bits; /** - * number of bits used for the previously encoded frame - * encoding: set by lavc - * decoding: - for audio - bits_per_sample + * number of bits used for the previously encoded frame. + * - encoding: set by lavc + * - decoding: unused */ int frame_bits; - + /** - * private data of the user, can be used to carry app specific stuff - * encoding: set by user - * decoding: set by user + * private data of the user, can be used to carry app specific stuff. + * - encoding: set by user + * - decoding: set by user */ void *opaque; char codec_name[32]; enum CodecType codec_type; /* see CODEC_TYPE_xxx */ enum CodecID codec_id; /* see CODEC_ID_xxx */ - unsigned int codec_tag; /* codec tag, only used if unknown codec */ /** - * workaround bugs in encoders which sometimes cannot be detected automatically - * encoding: unused - * decoding: set by user + * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * this is used to workaround some encoder bugs + * - encoding: unused + * - decoding: set by user, will be converted to upper case by lavc during init + */ + unsigned int codec_tag; + + /** + * workaround bugs in encoders which sometimes cannot be detected automatically. + * - encoding: unused + * - decoding: set by user */ int workaround_bugs; -#define FF_BUG_AUTODETECT 1 //autodetection +#define FF_BUG_AUTODETECT 1 ///< autodetection #define FF_BUG_OLD_MSMPEG4 2 #define FF_BUG_XVID_ILACE 4 #define FF_BUG_UMP4 8 @@ -524,41 +580,45 @@ typedef struct AVCodecContext { #define FF_BUG_QPEL_CHROMA 64 #define FF_BUG_STD_QPEL 128 #define FF_BUG_QPEL_CHROMA2 256 +#define FF_BUG_DIRECT_BLOCKSIZE 512 +#define FF_BUG_EDGE 1024 //#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100% /** - * encoding: set by user - * decoding: unused + * luma single coeff elimination threshold. + * - encoding: set by user + * - decoding: unused */ int luma_elim_threshold; /** - * encoding: set by user - * decoding: unused + * chroma single coeff elimination threshold. + * - encoding: set by user + * - decoding: unused */ int chroma_elim_threshold; /** - * strictly follow the std (MPEG4, ...) - * encoding: set by user - * decoding: unused + * strictly follow the std (MPEG4, ...). + * - encoding: set by user + * - decoding: unused */ int strict_std_compliance; /** - * qscale offset between ip and b frames + * qscale offset between ip and b frames. * if > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset) * if < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset) - * encoding: set by user. - * decoding: unused + * - encoding: set by user. + * - decoding: unused */ float b_quant_offset; /** * error resilience higher values will detect more errors but may missdetect - * some more or less valid parts as errors - * encoding: unused - * decoding: set by user + * some more or less valid parts as errors. + * - encoding: unused + * - decoding: set by user */ int error_resilience; #define FF_ER_CAREFULL 1 @@ -569,8 +629,8 @@ typedef struct AVCodecContext { /** * called at the beginning of each frame to get a buffer for it. * if pic.reference is set then the frame will be read later by lavc - * encoding: unused - * decoding: set by lavc, user can override + * - encoding: unused + * - decoding: set by lavc, user can override */ int (*get_buffer)(struct AVCodecContext *c, AVFrame *pic); @@ -578,51 +638,51 @@ typedef struct AVCodecContext { * called to release buffers which where allocated with get_buffer. * a released buffer can be reused in get_buffer() * pic.data[*] must be set to NULL - * encoding: unused - * decoding: set by lavc, user can override + * - encoding: unused + * - decoding: set by lavc, user can override */ void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic); /** - * is 1 if the decoded stream contains b frames, 0 otherwise - * encoding: unused - * decoding: set by lavc + * is 1 if the decoded stream contains b frames, 0 otherwise. + * - encoding: unused + * - decoding: set by lavc */ int has_b_frames; - int block_align; /* used by some WAV based audio codecs */ + int block_align; ///< used by some WAV based audio codecs - int parse_only; /* decoding only: if true, only parsing is done + int parse_only; /* - decoding only: if true, only parsing is done (function avcodec_parse_frame()). The frame data is returned. Only MPEG codecs support this now. */ /** - * 0-> h263 quant 1-> mpeg quant - * encoding: set by user. - * decoding: unused + * 0-> h263 quant 1-> mpeg quant. + * - encoding: set by user. + * - decoding: unused */ int mpeg_quant; /** - * pass1 encoding statistics output buffer - * encoding: set by lavc - * decoding: unused + * pass1 encoding statistics output buffer. + * - encoding: set by lavc + * - decoding: unused */ - char *stats_out; /* encoding statistics output buffer */ + char *stats_out; /** * pass2 encoding statistics input buffer. * concatenated stuff from stats_out of pass1 should be placed here - * encoding: allocated/set/freed by user - * decoding: unused + * - encoding: allocated/set/freed by user + * - decoding: unused */ char *stats_in; /** - * ratecontrol qmin qmax limiting method + * ratecontrol qmin qmax limiting method. * 0-> clipping, 1-> use a nice continous function to limit qscale wthin qmin/qmax - * encoding: set by user. - * decoding: unused + * - encoding: set by user. + * - decoding: unused */ float rc_qsquish; @@ -630,69 +690,69 @@ typedef struct AVCodecContext { int rc_qmod_freq; /** - * ratecontrol override, see RcOverride - * encoding: allocated/set/freed by user. - * decoding: unused + * ratecontrol override, see RcOverride. + * - encoding: allocated/set/freed by user. + * - decoding: unused */ RcOverride *rc_override; int rc_override_count; /** - * rate control equation - * encoding: set by user - * decoding: unused + * rate control equation. + * - encoding: set by user + * - decoding: unused */ char *rc_eq; /** - * maximum bitrate - * encoding: set by user. - * decoding: unused + * maximum bitrate. + * - encoding: set by user. + * - decoding: unused */ int rc_max_rate; /** - * minimum bitrate - * encoding: set by user. - * decoding: unused + * minimum bitrate. + * - encoding: set by user. + * - decoding: unused */ int rc_min_rate; /** - * decoder bitstream buffer size - * encoding: set by user. - * decoding: unused + * decoder bitstream buffer size. + * - encoding: set by user. + * - decoding: unused */ int rc_buffer_size; float rc_buffer_aggressivity; /** - * qscale factor between p and i frames - * encoding: set by user. - * decoding: unused + * qscale factor between p and i frames. + * - encoding: set by user. + * - decoding: unused */ float i_quant_factor; /** - * qscale offset between p and i frames + * qscale offset between p and i frames. * if > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset) * if < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset) - * encoding: set by user. - * decoding: unused + * - encoding: set by user. + * - decoding: unused */ float i_quant_offset; /** - * initial complexity for pass1 ratecontrol - * encoding: set by user. - * decoding: unused + * initial complexity for pass1 ratecontrol. + * - encoding: set by user. + * - decoding: unused */ float rc_initial_cplx; /** - * dct algorithm, see FF_DCT_* below - * encoding: set by user - * decoding: unused + * dct algorithm, see FF_DCT_* below. + * - encoding: set by user + * - decoding: unused */ int dct_algo; #define FF_DCT_AUTO 0 @@ -703,52 +763,48 @@ typedef struct AVCodecContext { #define FF_DCT_ALTIVEC 5 /** - * luminance masking (0-> disabled) - * encoding: set by user - * decoding: unused + * luminance masking (0-> disabled). + * - encoding: set by user + * - decoding: unused */ float lumi_masking; /** - * temporary complexity masking (0-> disabled) - * encoding: set by user - * decoding: unused + * temporary complexity masking (0-> disabled). + * - encoding: set by user + * - decoding: unused */ float temporal_cplx_masking; /** - * spatial complexity masking (0-> disabled) - * encoding: set by user - * decoding: unused + * spatial complexity masking (0-> disabled). + * - encoding: set by user + * - decoding: unused */ float spatial_cplx_masking; /** - * p block masking (0-> disabled) - * encoding: set by user - * decoding: unused + * p block masking (0-> disabled). + * - encoding: set by user + * - decoding: unused */ float p_masking; /** - * darkness masking (0-> disabled) - * encoding: set by user - * decoding: unused + * darkness masking (0-> disabled). + * - encoding: set by user + * - decoding: unused */ float dark_masking; + + /* for binary compatibility */ + int unused; + /** - * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A') - * this is used to workaround some encoder bugs - * encoding: unused - * decoding: set by user, will be converted to upper case by lavc during init - */ - int fourcc; - - /** - * idct algorithm, see FF_IDCT_* below - * encoding: set by user - * decoding: set by user + * idct algorithm, see FF_IDCT_* below. + * - encoding: set by user + * - decoding: set by user */ int idct_algo; #define FF_IDCT_AUTO 0 @@ -762,44 +818,57 @@ typedef struct AVCodecContext { #define FF_IDCT_ALTIVEC 8 /** - * slice count - * encoding: set by lavc - * decoding: set by user (or 0) + * slice count. + * - encoding: set by lavc + * - decoding: set by user (or 0) */ int slice_count; /** - * slice offsets in the frame in bytes - * encoding: set/allocated by lavc - * decoding: set/allocated by user (or NULL) + * slice offsets in the frame in bytes. + * - encoding: set/allocated by lavc + * - decoding: set/allocated by user (or NULL) */ int *slice_offset; /** - * error concealment flags - * encoding: unused - * decoding: set by user + * error concealment flags. + * - encoding: unused + * - decoding: set by user */ int error_concealment; #define FF_EC_GUESS_MVS 1 #define FF_EC_DEBLOCK 2 /** - * dsp_mask could be used to disable unwanted + * dsp_mask could be add used to disable unwanted CPU features * CPU features (i.e. MMX, SSE. ...) - */ - unsigned dsp_mask; - - /** - * bits per sample/pixel from the demuxer (needed for huffyuv) - * encoding: set by lavc - * decoding: set by user + * + * with FORCE flag you may instead enable given CPU features + * (Dangerous: usable in case of misdetection, improper usage however will + * result into program crash) + */ + unsigned dsp_mask; +#define FF_MM_FORCE 0x80000000 /* force usage of selected flags (OR) */ + /* lower 16 bits - CPU features */ +#ifdef HAVE_MMX +#define FF_MM_MMX 0x0001 /* standard MMX */ +#define FF_MM_3DNOW 0x0004 /* AMD 3DNOW */ +#define FF_MM_MMXEXT 0x0002 /* SSE integer functions or AMD MMX ext */ +#define FF_MM_SSE 0x0008 /* SSE functions */ +#define FF_MM_SSE2 0x0010 /* PIV SSE2 functions */ +#endif /* HAVE_MMX */ + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: set by lavc + * - decoding: set by user */ int bits_per_sample; /** - * prediction method (needed for huffyuv) - * encoding: set by user - * decoding: unused + * prediction method (needed for huffyuv). + * - encoding: set by user + * - decoding: unused */ int prediction_method; #define FF_PRED_LEFT 0 @@ -807,23 +876,23 @@ typedef struct AVCodecContext { #define FF_PRED_MEDIAN 2 /** - * aspect ratio. (0 if unknown) - * encoding: set by user. - * decoding: set by lavc. + * aspect ratio (0 if unknown). + * - encoding: set by user. + * - decoding: set by lavc. */ float aspect_ratio; /** - * the picture in the bitstream - * encoding: set by lavc - * decoding: set by lavc + * the picture in the bitstream. + * - encoding: set by lavc + * - decoding: set by lavc */ AVFrame *coded_frame; /** - * debug - * encoding: set by user. - * decoding: set by user. + * debug. + * - encoding: set by user. + * - decoding: set by user. */ int debug; #define FF_DEBUG_PICT_INFO 1 @@ -836,44 +905,45 @@ typedef struct AVCodecContext { #define FF_DEBUG_SKIP 0x00000080 #define FF_DEBUG_STARTCODE 0x00000100 #define FF_DEBUG_PTS 0x00000200 +#define FF_DEBUG_ER 0x00000400 /** - * error - * encoding: set by lavc if flags&CODEC_FLAG_PSNR - * decoding: unused + * error. + * - encoding: set by lavc if flags&CODEC_FLAG_PSNR + * - decoding: unused */ uint64_t error[4]; /** - * minimum MB quantizer - * encoding: set by user. - * decoding: unused + * minimum MB quantizer. + * - encoding: set by user. + * - decoding: unused */ int mb_qmin; /** - * maximum MB quantizer - * encoding: set by user. - * decoding: unused + * maximum MB quantizer. + * - encoding: set by user. + * - decoding: unused */ int mb_qmax; /** - * motion estimation compare function - * encoding: set by user. - * decoding: unused + * motion estimation compare function. + * - encoding: set by user. + * - decoding: unused */ int me_cmp; /** - * subpixel motion estimation compare function - * encoding: set by user. - * decoding: unused + * subpixel motion estimation compare function. + * - encoding: set by user. + * - decoding: unused */ int me_sub_cmp; /** - * macroblock compare function (not supported yet) - * encoding: set by user. - * decoding: unused + * macroblock compare function (not supported yet). + * - encoding: set by user. + * - decoding: unused */ int mb_cmp; #define FF_CMP_SAD 0 @@ -887,79 +957,179 @@ typedef struct AVCodecContext { #define FF_CMP_CHROMA 256 /** - * ME diamond size & shape - * encoding: set by user. - * decoding: unused + * ME diamond size & shape. + * - encoding: set by user. + * - decoding: unused */ int dia_size; /** - * amount of previous MV predictors (2a+1 x 2a+1 square) - * encoding: set by user. - * decoding: unused + * amount of previous MV predictors (2a+1 x 2a+1 square). + * - encoding: set by user. + * - decoding: unused */ int last_predictor_count; /** - * pre pass for motion estimation - * encoding: set by user. - * decoding: unused + * pre pass for motion estimation. + * - encoding: set by user. + * - decoding: unused */ int pre_me; /** - * motion estimation pre pass compare function - * encoding: set by user. - * decoding: unused + * motion estimation pre pass compare function. + * - encoding: set by user. + * - decoding: unused */ int me_pre_cmp; /** - * ME pre pass diamond size & shape - * encoding: set by user. - * decoding: unused + * ME pre pass diamond size & shape. + * - encoding: set by user. + * - decoding: unused */ int pre_dia_size; /** - * subpel ME quality - * encoding: set by user. - * decoding: unused + * subpel ME quality. + * - encoding: set by user. + * - decoding: unused */ int me_subpel_quality; /** - * callback to negotiate the pixelFormat + * callback to negotiate the pixelFormat. * @param fmt is the list of formats which are supported by the codec, * its terminated by -1 as 0 is a valid format, the formats are ordered by quality * the first is allways the native one * @return the choosen format - * encoding: unused - * decoding: set by user, if not set then the native format will always be choosen + * - encoding: unused + * - decoding: set by user, if not set then the native format will always be choosen */ enum PixelFormat (*get_format)(struct AVCodecContext *s, enum PixelFormat * fmt); + + /** + * DTG active format information (additionnal aspect ratio + * information only used in DVB MPEG2 transport streams). 0 if + * not set. + * + * - encoding: unused. + * - decoding: set by decoder + */ + int dtg_active_format; +#define FF_DTG_AFD_SAME 8 +#define FF_DTG_AFD_4_3 9 +#define FF_DTG_AFD_16_9 10 +#define FF_DTG_AFD_14_9 11 +#define FF_DTG_AFD_4_3_SP_14_9 13 +#define FF_DTG_AFD_16_9_SP_14_9 14 +#define FF_DTG_AFD_SP_4_3 15 + + /** + * Maximum motion estimation search range in subpel units. + * if 0 then no limit + * + * - encoding: set by user. + * - decoding: unused. + */ + int me_range; + + /** + * frame_rate_base. + * for variable fps this is 1 + * - encoding: set by user. + * - decoding: set by lavc. + * @todo move this after frame_rate + */ + + int frame_rate_base; + /** + * intra quantizer bias. + * - encoding: set by user. + * - decoding: unused + */ + int intra_quant_bias; +#define FF_DEFAULT_QUANT_BIAS 999999 + + /** + * inter quantizer bias. + * - encoding: set by user. + * - decoding: unused + */ + int inter_quant_bias; + } AVCodecContext; + +/** + * AVOption. + */ +typedef struct AVOption { + /** options' name */ + const char *name; /* if name is NULL, it indicates a link to next */ + /** short English text help or const struct AVOption* subpointer */ + const char *help; // const struct AVOption* sub; + /** offset to context structure where the parsed value should be stored */ + int offset; + /** options' type */ + int type; +#define FF_OPT_TYPE_BOOL 1 ///< boolean - true,1,on (or simply presence) +#define FF_OPT_TYPE_DOUBLE 2 ///< double +#define FF_OPT_TYPE_INT 3 ///< integer +#define FF_OPT_TYPE_STRING 4 ///< string (finished with \0) +#define FF_OPT_TYPE_MASK 0x1f ///< mask for types - upper bits are various flags +//#define FF_OPT_TYPE_EXPERT 0x20 // flag for expert option +#define FF_OPT_TYPE_FLAG (FF_OPT_TYPE_BOOL | 0x40) +#define FF_OPT_TYPE_RCOVERRIDE (FF_OPT_TYPE_STRING | 0x80) + /** min value (min == max -> no limits) */ + double min; + /** maximum value for double/int */ + double max; + /** default boo [0,1]l/double/int value */ + double defval; + /** + * default string value (with optional semicolon delimited extra option-list + * i.e. option1;option2;option3 + * defval might select other then first argument as default + */ + const char *defstr; +#define FF_OPT_MAX_DEPTH 10 +} AVOption; + +/** + * Parse option(s) and sets fields in passed structure + * @param strct structure where the parsed results will be written + * @param list list with AVOptions + * @param opts string with options for parsing + */ +int avoption_parse(void* strct, const AVOption* list, const char* opts); + + +/** + * AVCodec. + */ typedef struct AVCodec { const char *name; int type; int id; int priv_data_size; int (*init)(AVCodecContext *); - int (*encode)(AVCodecContext *, UINT8 *buf, int buf_size, void *data); + int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data); int (*close)(AVCodecContext *); int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, - UINT8 *buf, int buf_size); + uint8_t *buf, int buf_size); int capabilities; + const AVOption *options; struct AVCodec *next; } AVCodec; -/** +/** * four components are given, that's all. * the last component is alpha */ typedef struct AVPicture { - UINT8 *data[4]; + uint8_t *data[4]; int linesize[4]; } AVPicture; @@ -1003,6 +1173,7 @@ extern AVCodec mace3_decoder; extern AVCodec mace6_decoder; extern AVCodec huffyuv_decoder; extern AVCodec oggvorbis_decoder; +extern AVCodec cyuv_decoder; /* pcm codecs */ #define PCM_CODEC(id, name) \ @@ -1062,7 +1233,7 @@ void img_resample(ImgReSampleContext *s, void img_resample_close(ImgReSampleContext *s); -int avpicture_fill(AVPicture *picture, UINT8 *ptr, +int avpicture_fill(AVPicture *picture, uint8_t *ptr, int pix_fmt, int width, int height); int avpicture_get_size(int pix_fmt, int width, int height); void avcodec_get_chroma_sub_sample(int pix_fmt, int *h_shift, int *v_shift); @@ -1087,8 +1258,6 @@ unsigned avcodec_version(void); unsigned avcodec_build(void); void avcodec_init(void); -void avcodec_set_bit_exact(void); - void register_avcodec(AVCodec *format); AVCodec *avcodec_find_encoder(enum CodecID id); AVCodec *avcodec_find_encoder_by_name(const char *name); @@ -1104,18 +1273,18 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic); void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic); int avcodec_open(AVCodecContext *avctx, AVCodec *codec); -int avcodec_decode_audio(AVCodecContext *avctx, INT16 *samples, +int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, - UINT8 *buf, int buf_size); + uint8_t *buf, int buf_size); int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, - UINT8 *buf, int buf_size); -int avcodec_parse_frame(AVCodecContext *avctx, UINT8 **pdata, + uint8_t *buf, int buf_size); +int avcodec_parse_frame(AVCodecContext *avctx, uint8_t **pdata, int *data_size_ptr, - UINT8 *buf, int buf_size); -int avcodec_encode_audio(AVCodecContext *avctx, UINT8 *buf, int buf_size, + uint8_t *buf, int buf_size); +int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples); -int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size, +int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, const AVFrame *pict); int avcodec_close(AVCodecContext *avctx); @@ -1124,40 +1293,21 @@ void avcodec_register_all(void); void avcodec_flush_buffers(AVCodecContext *avctx); -typedef struct { - /** options' name with default value*/ - const char* name; - /** English text help */ - const char* help; - /** type of variable */ - int type; -#define FF_CONF_TYPE_BOOL 1 // boolean - true,1,on (or simply presence) -#define FF_CONF_TYPE_DOUBLE 2 // double -#define FF_CONF_TYPE_INT 3 // integer -#define FF_CONF_TYPE_STRING 4 // string (finished with \0) -#define FF_CONF_TYPE_MASK 0x1f // mask for types - upper bits are various flags -#define FF_CONF_TYPE_EXPERT 0x20 // flag for expert option -#define FF_CONF_TYPE_FLAG (FF_CONF_TYPE_BOOL | 0x40) -#define FF_CONF_TYPE_RCOVERIDE (FF_CONF_TYPE_STRING | 0x80) - /** where the parsed value should be stored */ - void* val; - /** min value (min == max -> no limits) */ - double min; - /** maximum value for double/int */ - double max; - /** default boo [0,1]l/double/int value */ - double defval; - /** - * default string value (with optional semicolon delimited extra option-list - * i.e. option1;option2;option3 - * defval might select other then first argument as default - */ - const char* defstr; - /** char* list of supported codecs (i.e. ",msmpeg4,h263," NULL - everything */ - const char* supported; -} avc_config_t; +/* misc usefull functions */ +/** + * reduce a fraction. + * this is usefull for framerate calculations + * @param max the maximum allowed for dst_nom & dst_den + * @return 1 if exact, 0 otherwise + */ +int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max); + +/** + * rescale a 64bit integer. + * a simple a*b/c isnt possible as it can overflow + */ +int64_t av_rescale(int64_t a, int b, int c); -void avcodec_getopt(AVCodecContext* avctx, const char* str, avc_config_t** config); /** * Interface for 0.5.0 version @@ -1166,7 +1316,7 @@ void avcodec_getopt(AVCodecContext* avctx, const char* str, avc_config_t** confi */ typedef struct { - // compressed size used from given memory buffer + /// compressed size used from given memory buffer int size; /// I/P/B frame type int frame_type; @@ -1243,7 +1393,7 @@ void av_free(void *ptr); char *av_strdup(const char *s); void __av_freep(void **ptr); #define av_freep(p) __av_freep((void **)(p)) -void *av_fast_realloc(void *ptr, int *size, int min_size); +void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size); /* for static data only */ /* call av_free_static to release all staticaly allocated tables */ void av_free_static(void); diff --git a/src/libffmpeg/libavcodec/common.c b/src/libffmpeg/libavcodec/common.c index aa766280b..068195384 100644 --- a/src/libffmpeg/libavcodec/common.c +++ b/src/libffmpeg/libavcodec/common.c @@ -18,9 +18,15 @@ * * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at> */ + +/** + * @file common.c + * common internal api. + */ + #include "avcodec.h" -const UINT8 ff_sqrt_tab[128]={ +const uint8_t ff_sqrt_tab[128]={ 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -39,9 +45,9 @@ const uint8_t ff_log2_tab[256]={ }; void init_put_bits(PutBitContext *s, - UINT8 *buffer, int buffer_size, + uint8_t *buffer, int buffer_size, void *opaque, - void (*write_data)(void *, UINT8 *, int)) + void (*write_data)(void *, uint8_t *, int)) { s->buf = buffer; s->buf_end = s->buf + buffer_size; @@ -62,12 +68,12 @@ void init_put_bits(PutBitContext *s, } /* return the number of bits output */ -INT64 get_bit_count(PutBitContext *s) +int64_t get_bit_count(PutBitContext *s) { #ifdef ALT_BITSTREAM_WRITER return s->data_out_size * 8 + s->index; #else - return (s->buf_ptr - s->buf + s->data_out_size) * 8 + 32 - (INT64)s->bit_left; + return (s->buf_ptr - s->buf + s->data_out_size) * 8 + 32 - (int64_t)s->bit_left; #endif } @@ -110,7 +116,7 @@ void put_string(PutBitContext * pbc, char *s) /* bit input functions */ void init_get_bits(GetBitContext *s, - UINT8 *buffer, int bit_size) + const uint8_t *buffer, int bit_size) { const int buffer_size= (bit_size+7)>>3; @@ -160,16 +166,16 @@ int check_marker(GetBitContext *s, const char *msg) #define GET_DATA(v, table, i, wrap, size) \ {\ - const UINT8 *ptr = (UINT8 *)table + i * wrap;\ + const uint8_t *ptr = (const uint8_t *)table + i * wrap;\ switch(size) {\ case 1:\ - v = *(UINT8 *)ptr;\ + v = *(const uint8_t *)ptr;\ break;\ case 2:\ - v = *(UINT16 *)ptr;\ + v = *(const uint16_t *)ptr;\ break;\ default:\ - v = *(UINT32 *)ptr;\ + v = *(const uint32_t *)ptr;\ break;\ }\ } @@ -194,10 +200,10 @@ static int build_table(VLC *vlc, int table_nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, - UINT32 code_prefix, int n_prefix) + uint32_t code_prefix, int n_prefix) { int i, j, k, n, table_size, table_index, nb, n1, index; - UINT32 code; + uint32_t code; VLC_TYPE (*table)[2]; table_size = 1 << table_nb_bits; @@ -335,7 +341,7 @@ void free_vlc(VLC *vlc) av_free(vlc->table); } -int ff_gcd(int a, int b){ +int64_t ff_gcd(int64_t a, int64_t b){ if(b) return ff_gcd(b, a%b); else return a; } diff --git a/src/libffmpeg/libavcodec/common.h b/src/libffmpeg/libavcodec/common.h index 893b7ed64..6c0271916 100644 --- a/src/libffmpeg/libavcodec/common.h +++ b/src/libffmpeg/libavcodec/common.h @@ -1,9 +1,11 @@ +/** + * @file common.h + * common internal api header. + */ + #ifndef COMMON_H #define COMMON_H -#define FFMPEG_VERSION_INT 0x000406 -#define FFMPEG_VERSION "0.4.6" - #if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) # define CONFIG_WIN32 #endif @@ -37,6 +39,34 @@ #define M_PI 3.14159265358979323846 #endif +#include <stddef.h> +#ifndef offsetof +# define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F)) +#endif + +#define AVOPTION_CODEC_BOOL(name, help, field) \ + { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_BOOL } +#define AVOPTION_CODEC_DOUBLE(name, help, field, minv, maxv, defval) \ + { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_DOUBLE, minv, maxv, defval } +#define AVOPTION_CODEC_FLAG(name, help, field, flag, defval) \ + { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_FLAG, flag, 0, defval } +#define AVOPTION_CODEC_INT(name, help, field, minv, maxv, defval) \ + { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_INT, minv, maxv, defval } +#define AVOPTION_CODEC_STRING(name, help, field, str, val) \ + { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_STRING, .defval = val, .defstr = str } +#define AVOPTION_CODEC_RCOVERRIDE(name, help, field) \ + { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_RCOVERRIDE, .defval = 0, .defstr = NULL } +#define AVOPTION_SUB(ptr) { .name = NULL, .help = (const char*)ptr } +#define AVOPTION_END() AVOPTION_SUB(NULL) + +struct AVOption; +#ifdef HAVE_MMX +extern const struct AVOption avoptions_common[3 + 5]; +#else +extern const struct AVOption avoptions_common[3]; +#endif +extern const struct AVOption avoptions_workaround_bug[11]; + #endif /* HAVE_AV_CONFIG_H */ /* Suppress restrict if it was not defined in config.h. */ @@ -54,33 +84,24 @@ /* windows */ -typedef unsigned short UINT16; -typedef signed short INT16; -typedef unsigned char UINT8; -typedef unsigned int UINT32; -typedef unsigned __int64 UINT64; -typedef signed char INT8; -typedef signed int INT32; -typedef signed __int64 INT64; - -typedef UINT8 uint8_t; -typedef INT8 int8_t; -typedef UINT16 uint16_t; -typedef INT16 int16_t; -typedef UINT32 uint32_t; -typedef INT32 int32_t; -typedef UINT64 uint64_t; -typedef INT64 int64_t; +typedef unsigned short uint16_t; +typedef signed short int16_t; +typedef unsigned char uint8_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; +typedef signed char int8_t; +typedef signed int int32_t; +typedef signed __int64 int64_t; # ifndef __MINGW32__ -# define INT64_C(c) (c ## i64) -# define UINT64_C(c) (c ## i64) +# define int64_t_C(c) (c ## i64) +# define uint64_t_C(c) (c ## i64) # define inline __inline # else -# define INT64_C(c) (c ## LL) -# define UINT64_C(c) (c ## ULL) +# define int64_t_C(c) (c ## LL) +# define uint64_t_C(c) (c ## ULL) # endif /* __MINGW32__ */ # ifdef _DEBUG @@ -96,20 +117,11 @@ typedef INT64 int64_t; #include <inttypes.h> -typedef unsigned char UINT8; -typedef unsigned short UINT16; -typedef unsigned int UINT32; -typedef unsigned long long UINT64; -typedef signed char INT8; -typedef signed short INT16; -typedef signed int INT32; -typedef signed long long INT64; - #ifdef HAVE_AV_CONFIG_H -#ifndef INT64_C -#define INT64_C(c) (c ## LL) -#define UINT64_C(c) (c ## ULL) +#ifndef int64_t_C +#define int64_t_C(c) (c ## LL) +#define uint64_t_C(c) (c ## ULL) #endif #ifdef USE_FASTMEMCPY @@ -127,23 +139,10 @@ typedef signed long long INT64; # include <inttypes.h> -# ifndef __WINE_WINDEF16_H -/* workaround for typedef conflict in MPlayer (wine typedefs) */ -typedef unsigned short UINT16; -typedef signed short INT16; -# endif - -typedef unsigned char UINT8; -typedef unsigned int UINT32; -typedef unsigned long long UINT64; -typedef signed char INT8; -typedef signed int INT32; -typedef signed long long INT64; - # ifdef HAVE_AV_CONFIG_H -# ifndef INT64_C -# define INT64_C(c) (c ## LL) -# define UINT64_C(c) (c ## ULL) +# ifndef int64_t_C +# define int64_t_C(c) (c ## LL) +# define uint64_t_C(c) (c ## ULL) # endif # ifdef USE_FASTMEMCPY @@ -169,6 +168,7 @@ typedef signed long long INT64; # ifndef DEBUG # define NDEBUG # endif +# include <assert.h> /* dprintf macros */ # if defined(CONFIG_WIN32) && !defined(__MINGW32__) @@ -229,26 +229,26 @@ static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ struct PutBitContext; -typedef void (*WriteDataFunc)(void *, UINT8 *, int); +typedef void (*WriteDataFunc)(void *, uint8_t *, int); typedef struct PutBitContext { #ifdef ALT_BITSTREAM_WRITER - UINT8 *buf, *buf_end; + uint8_t *buf, *buf_end; int index; #else - UINT32 bit_buf; + uint32_t bit_buf; int bit_left; - UINT8 *buf, *buf_ptr, *buf_end; + uint8_t *buf, *buf_ptr, *buf_end; #endif - INT64 data_out_size; /* in bytes */ + int64_t data_out_size; /* in bytes */ } PutBitContext; void init_put_bits(PutBitContext *s, - UINT8 *buffer, int buffer_size, + uint8_t *buffer, int buffer_size, void *opaque, - void (*write_data)(void *, UINT8 *, int)); + void (*write_data)(void *, uint8_t *, int)); -INT64 get_bit_count(PutBitContext *s); /* XXX: change function name */ +int64_t get_bit_count(PutBitContext *s); /* XXX: change function name */ void align_put_bits(PutBitContext *s); void flush_put_bits(PutBitContext *s); void put_string(PutBitContext * pbc, char *s); @@ -256,17 +256,17 @@ void put_string(PutBitContext * pbc, char *s); /* bit input */ typedef struct GetBitContext { - UINT8 *buffer, *buffer_end; + const uint8_t *buffer, *buffer_end; #ifdef ALT_BITSTREAM_READER int index; #elif defined LIBMPEG2_BITSTREAM_READER - UINT8 *buffer_ptr; - UINT32 cache; + uint8_t *buffer_ptr; + uint32_t cache; int bit_count; #elif defined A32_BITSTREAM_READER - UINT32 *buffer_ptr; - UINT32 cache0; - UINT32 cache1; + uint32_t *buffer_ptr; + uint32_t cache0; + uint32_t cache1; int bit_count; #endif int size_in_bits; @@ -274,11 +274,11 @@ typedef struct GetBitContext { static inline int get_bits_count(GetBitContext *s); -#define VLC_TYPE INT16 +#define VLC_TYPE int16_t typedef struct VLC { int bits; - VLC_TYPE (*table)[2]; // code, bits + VLC_TYPE (*table)[2]; ///< code, bits int table_size, table_allocated; } VLC; @@ -294,7 +294,7 @@ typedef struct RL_VLC_ELEM { /* used to avoid missaligned exceptions on some archs (alpha, ...) */ #ifdef ARCH_X86 -# define unaligned32(a) (*(UINT32*)(a)) +# define unaligned32(a) (*(uint32_t*)(a)) #else # ifdef __GNUC__ static inline uint32_t unaligned32(const void *v) { @@ -325,7 +325,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) st_out_bit_counts[st_current_index] += n; #endif // printf("put_bits=%d %x\n", n, value); - XINE_ASSERT((n == 32 || value < (1U << n)), "?"); + assert(n == 32 || value < (1U << n)); bit_buf = s->bit_buf; bit_left = s->bit_left; @@ -346,7 +346,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) s->buf_ptr[3] = bit_buf ; } else #endif - *(UINT32 *)s->buf_ptr = be2me_32(bit_buf); + *(uint32_t *)s->buf_ptr = be2me_32(bit_buf); //printf("bitbuf = %08x\n", bit_buf); s->buf_ptr+=4; bit_left+=32 - n; @@ -689,7 +689,7 @@ static inline void skip_bits1(GetBitContext *s){ } void init_get_bits(GetBitContext *s, - UINT8 *buffer, int buffer_size); + const uint8_t *buffer, int buffer_size); int check_marker(GetBitContext *s, const char *msg); void align_get_bits(GetBitContext *s); @@ -772,6 +772,14 @@ static inline int get_vlc(GetBitContext *s, VLC *vlc) return code; } +/** + * parses a vlc code, faster then get_vlc() + * @param bits is the number of bits which will be read at once, must be + * identical to nb_bits in init_vlc() + * @param max_depth is the number of times bits bits must be readed to completly + * read the longest vlc code + * = (max_vlc_length + bits - 1) / bits + */ static always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth) { @@ -786,6 +794,46 @@ static always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], return code; } +//#define TRACE + +#ifdef TRACE + +static inline void print_bin(int bits, int n){ + int i; + + for(i=n-1; i>=0; i--){ + printf("%d", (bits>>i)&1); + } + for(i=n; i<24; i++) + printf(" "); +} + +static inline int get_bits_trace(GetBitContext *s, int n, char *file, char *func, int line){ + int r= get_bits(s, n); + + print_bin(r, n); + printf("%5d %2d %3d bit @%5d in %s %s:%d\n", r, n, r, get_bits_count(s)-n, file, func, line); + return r; +} +static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth, char *file, char *func, int line){ + int show= show_bits(s, 24); + int pos= get_bits_count(s); + int r= get_vlc2(s, table, bits, max_depth); + int len= get_bits_count(s) - pos; + int bits2= show>>(24-len); + + print_bin(bits2, len); + + printf("%5d %2d %3d vlc @%5d in %s %s:%d\n", bits2, len, r, pos, file, func, line); + return r; +} + +#define get_bits(s, n) get_bits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__) +#define get_bits1(s) get_bits_trace(s, 1, __FILE__, __PRETTY_FUNCTION__, __LINE__) +#define get_vlc(s, vlc) get_vlc_trace(s, (vlc)->table, (vlc)->bits, 3, __FILE__, __PRETTY_FUNCTION__, __LINE__) +#define get_vlc2(s, tab, bits, max) get_vlc_trace(s, tab, bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__) + +#endif //TRACE /* define it to include statistics code (useful only for optimizing codec efficiency */ @@ -878,7 +926,7 @@ static inline int clip(int a, int amin, int amax) /* math */ extern const uint8_t ff_sqrt_tab[128]; -int ff_gcd(int a, int b); +int64_t ff_gcd(int64_t a, int64_t b); static inline int ff_sqrt(int a) { @@ -902,11 +950,15 @@ static inline int ff_sqrt(int a) * converts fourcc string to int */ static inline int ff_get_fourcc(const char *s){ - XINE_ASSERT( strlen(s)==4, "lenght of value 's' != 4: %d", strlen(s) ); + assert( strlen(s)==4 ); return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24); } +#define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24)) +#define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24)) + + void ff_float2fraction(int *nom_arg, int *denom_arg, double f, int max); diff --git a/src/libffmpeg/libavcodec/dsputil.c b/src/libffmpeg/libavcodec/dsputil.c index 01bc84a86..5f4190f75 100644 --- a/src/libffmpeg/libavcodec/dsputil.c +++ b/src/libffmpeg/libavcodec/dsputil.c @@ -18,17 +18,22 @@ * * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer <michaelni@gmx.at> */ + +/** + * @file dsputil.c + * DSP utils + */ + #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" -#include "xineutils.h" +#include "simple_idct.h" -int ff_bit_exact=0; -UINT8 cropTbl[256 + 2 * MAX_NEG_CROP]; -UINT32 squareTbl[512]; +uint8_t cropTbl[256 + 2 * MAX_NEG_CROP]; +uint32_t squareTbl[512]; -const UINT8 ff_zigzag_direct[64] = { +const uint8_t ff_zigzag_direct[64] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, @@ -40,9 +45,9 @@ const UINT8 ff_zigzag_direct[64] = { }; /* not permutated inverse zigzag_direct + 1 for MMX quantizer */ -UINT16 __align8 inv_zigzag_direct16[64]; +uint16_t __align8 inv_zigzag_direct16[64]; -const UINT8 ff_alternate_horizontal_scan[64] = { +const uint8_t ff_alternate_horizontal_scan[64] = { 0, 1, 2, 3, 8, 9, 16, 17, 10, 11, 4, 5, 6, 7, 15, 14, 13, 12, 19, 18, 24, 25, 32, 33, @@ -53,7 +58,7 @@ const UINT8 ff_alternate_horizontal_scan[64] = { 52, 53, 54, 55, 60, 61, 62, 63, }; -const UINT8 ff_alternate_vertical_scan[64] = { +const uint8_t ff_alternate_vertical_scan[64] = { 0, 8, 16, 24, 1, 9, 2, 10, 17, 25, 32, 40, 48, 56, 57, 49, 41, 33, 26, 18, 3, 11, 4, 12, @@ -65,7 +70,7 @@ const UINT8 ff_alternate_vertical_scan[64] = { }; /* a*inverse[b]>>32 == a/b for all 0<=a<=65536 && 2<=b<=255 */ -const UINT32 inverse[256]={ +const uint32_t inverse[256]={ 0, 4294967295U,2147483648U,1431655766, 1073741824, 858993460, 715827883, 613566757, 536870912, 477218589, 429496730, 390451573, 357913942, 330382100, 306783379, 286331154, 268435456, 252645136, 238609295, 226050911, 214748365, 204522253, 195225787, 186737709, @@ -100,7 +105,19 @@ const UINT32 inverse[256]={ 17318417, 17248865, 17179870, 17111424, 17043522, 16976156, 16909321, 16843010, }; -static int pix_sum_c(UINT8 * pix, int line_size) +/* Input permutation for the simple_idct_mmx */ +static const uint8_t simple_mmx_permutation[64]={ + 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, + 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, + 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, + 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, + 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, + 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, + 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, + 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, +}; + +static int pix_sum_c(uint8_t * pix, int line_size) { int s, i, j; @@ -122,10 +139,10 @@ static int pix_sum_c(UINT8 * pix, int line_size) return s; } -static int pix_norm1_c(UINT8 * pix, int line_size) +static int pix_norm1_c(uint8_t * pix, int line_size) { int s, i, j; - UINT32 *sq = squareTbl + 256; + uint32_t *sq = squareTbl + 256; s = 0; for (i = 0; i < 16; i++) { @@ -171,10 +188,10 @@ static int pix_norm1_c(UINT8 * pix, int line_size) } -static int sse8_c(void *v, UINT8 * pix1, UINT8 * pix2, int line_size) +static int sse8_c(void *v, uint8_t * pix1, uint8_t * pix2, int line_size) { int s, i; - UINT32 *sq = squareTbl + 256; + uint32_t *sq = squareTbl + 256; s = 0; for (i = 0; i < 8; i++) { @@ -222,7 +239,7 @@ static int sse16_c(void *v, uint8_t *pix1, uint8_t *pix2, int line_size) return s; } -static void get_pixels_c(DCTELEM *restrict block, const UINT8 *pixels, int line_size) +static void get_pixels_c(DCTELEM *restrict block, const uint8_t *pixels, int line_size) { int i; @@ -241,8 +258,8 @@ static void get_pixels_c(DCTELEM *restrict block, const UINT8 *pixels, int line_ } } -static void diff_pixels_c(DCTELEM *restrict block, const UINT8 *s1, - const UINT8 *s2, int stride){ +static void diff_pixels_c(DCTELEM *restrict block, const uint8_t *s1, + const uint8_t *s2, int stride){ int i; /* read the pixels */ @@ -262,11 +279,11 @@ static void diff_pixels_c(DCTELEM *restrict block, const UINT8 *s1, } -static void put_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels, +static void put_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels, int line_size) { int i; - UINT8 *cm = cropTbl + MAX_NEG_CROP; + uint8_t *cm = cropTbl + MAX_NEG_CROP; /* read the pixels */ for(i=0;i<8;i++) { @@ -284,11 +301,11 @@ static void put_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels, } } -static void add_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels, +static void add_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels, int line_size) { int i; - UINT8 *cm = cropTbl + MAX_NEG_CROP; + uint8_t *cm = cropTbl + MAX_NEG_CROP; /* read the pixels */ for(i=0;i<8;i++) { @@ -703,7 +720,7 @@ PIXOP2(put, op_put) #define avg4(a,b,c,d) ((a+b+c+d+2)>>2) -static void gmc1_c(UINT8 *dst, UINT8 *src, int stride, int h, int x16, int y16, int rounder) +static void gmc1_c(uint8_t *dst, uint8_t *src, int stride, int h, int x16, int y16, int rounder) { const int A=(16-x16)*(16-y16); const int B=( x16)*(16-y16); @@ -726,7 +743,7 @@ static void gmc1_c(UINT8 *dst, UINT8 *src, int stride, int h, int x16, int y16, } } -static void gmc_c(UINT8 *dst, UINT8 *src, int stride, int h, int ox, int oy, +static void gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy, int dxx, int dxy, int dyx, int dyy, int shift, int r, int width, int height) { int y, vx, vy; @@ -784,7 +801,7 @@ static void gmc_c(UINT8 *dst, UINT8 *src, int stride, int h, int ox, int oy, } } -static inline void copy_block17(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h) +static inline void copy_block17(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h) { int i; for(i=0; i<h; i++) @@ -799,7 +816,7 @@ static inline void copy_block17(UINT8 *dst, UINT8 *src, int dstStride, int srcSt } } -static inline void copy_block9(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h) +static inline void copy_block9(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h) { int i; for(i=0; i<h; i++) @@ -814,8 +831,8 @@ static inline void copy_block9(UINT8 *dst, UINT8 *src, int dstStride, int srcStr #define QPEL_MC(r, OPNAME, RND, OP) \ -static void OPNAME ## mpeg4_qpel8_h_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h){\ - UINT8 *cm = cropTbl + MAX_NEG_CROP;\ +static void OPNAME ## mpeg4_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\ + uint8_t *cm = cropTbl + MAX_NEG_CROP;\ int i;\ for(i=0; i<h; i++)\ {\ @@ -832,9 +849,9 @@ static void OPNAME ## mpeg4_qpel8_h_lowpass(UINT8 *dst, UINT8 *src, int dstStrid }\ }\ \ -static void OPNAME ## mpeg4_qpel8_v_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride){\ +static void OPNAME ## mpeg4_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ const int w=8;\ - UINT8 *cm = cropTbl + MAX_NEG_CROP;\ + uint8_t *cm = cropTbl + MAX_NEG_CROP;\ int i;\ for(i=0; i<w; i++)\ {\ @@ -860,8 +877,8 @@ static void OPNAME ## mpeg4_qpel8_v_lowpass(UINT8 *dst, UINT8 *src, int dstStrid }\ }\ \ -static void OPNAME ## mpeg4_qpel16_h_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int h){\ - UINT8 *cm = cropTbl + MAX_NEG_CROP;\ +static void OPNAME ## mpeg4_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\ + uint8_t *cm = cropTbl + MAX_NEG_CROP;\ int i;\ \ for(i=0; i<h; i++)\ @@ -887,8 +904,8 @@ static void OPNAME ## mpeg4_qpel16_h_lowpass(UINT8 *dst, UINT8 *src, int dstStri }\ }\ \ -static void OPNAME ## mpeg4_qpel16_v_lowpass(UINT8 *dst, UINT8 *src, int dstStride, int srcStride){\ - UINT8 *cm = cropTbl + MAX_NEG_CROP;\ +static void OPNAME ## mpeg4_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ + uint8_t *cm = cropTbl + MAX_NEG_CROP;\ int i;\ const int w=16;\ for(i=0; i<w; i++)\ @@ -931,367 +948,367 @@ static void OPNAME ## mpeg4_qpel16_v_lowpass(UINT8 *dst, UINT8 *src, int dstStri }\ }\ \ -static void OPNAME ## qpel8_mc00_c (UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc00_c (uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## pixels8_c(dst, src, stride, 8);\ }\ \ -static void OPNAME ## qpel8_mc10_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 half[64];\ +static void OPNAME ## qpel8_mc10_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t half[64];\ put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8);\ OPNAME ## pixels8_l2(dst, src, half, stride, stride, 8, 8);\ }\ \ -static void OPNAME ## qpel8_mc20_c(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc20_c(uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## mpeg4_qpel8_h_lowpass(dst, src, stride, stride, 8);\ }\ \ -static void OPNAME ## qpel8_mc30_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 half[64];\ +static void OPNAME ## qpel8_mc30_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t half[64];\ put ## RND ## mpeg4_qpel8_h_lowpass(half, src, 8, stride, 8);\ OPNAME ## pixels8_l2(dst, src+1, half, stride, stride, 8, 8);\ }\ \ -static void OPNAME ## qpel8_mc01_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 half[64];\ +static void OPNAME ## qpel8_mc01_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t half[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16);\ OPNAME ## pixels8_l2(dst, full, half, stride, 16, 8, 8);\ }\ \ -static void OPNAME ## qpel8_mc02_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ +static void OPNAME ## qpel8_mc02_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ copy_block9(full, src, 16, stride, 9);\ OPNAME ## mpeg4_qpel8_v_lowpass(dst, full, stride, 16);\ }\ \ -static void OPNAME ## qpel8_mc03_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 half[64];\ +static void OPNAME ## qpel8_mc03_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t half[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(half, full, 8, 16);\ OPNAME ## pixels8_l2(dst, full+16, half, stride, 16, 8, 8);\ }\ -void ff_ ## OPNAME ## qpel8_mc11_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfV[64];\ - UINT8 halfHV[64];\ +void ff_ ## OPNAME ## qpel8_mc11_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfV[64];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l4(dst, full, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);\ }\ -static void OPNAME ## qpel8_mc11_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfHV[64];\ +static void OPNAME ## qpel8_mc11_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);\ }\ -void ff_ ## OPNAME ## qpel8_mc31_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfV[64];\ - UINT8 halfHV[64];\ +void ff_ ## OPNAME ## qpel8_mc31_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfV[64];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l4(dst, full+1, halfH, halfV, halfHV, stride, 16, 8, 8, 8, 8);\ }\ -static void OPNAME ## qpel8_mc31_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfHV[64];\ +static void OPNAME ## qpel8_mc31_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);\ }\ -void ff_ ## OPNAME ## qpel8_mc13_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfV[64];\ - UINT8 halfHV[64];\ +void ff_ ## OPNAME ## qpel8_mc13_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfV[64];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l4(dst, full+16, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);\ }\ -static void OPNAME ## qpel8_mc13_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfHV[64];\ +static void OPNAME ## qpel8_mc13_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);\ }\ -void ff_ ## OPNAME ## qpel8_mc33_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfV[64];\ - UINT8 halfHV[64];\ +void ff_ ## OPNAME ## qpel8_mc33_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfV[64];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full , 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l4(dst, full+17, halfH+8, halfV, halfHV, stride, 16, 8, 8, 8, 8);\ }\ -static void OPNAME ## qpel8_mc33_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfHV[64];\ +static void OPNAME ## qpel8_mc33_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);\ }\ -static void OPNAME ## qpel8_mc21_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 halfH[72];\ - UINT8 halfHV[64];\ +static void OPNAME ## qpel8_mc21_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t halfH[72];\ + uint8_t halfHV[64];\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2(dst, halfH, halfHV, stride, 8, 8, 8);\ }\ -static void OPNAME ## qpel8_mc23_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 halfH[72];\ - UINT8 halfHV[64];\ +static void OPNAME ## qpel8_mc23_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t halfH[72];\ + uint8_t halfHV[64];\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2(dst, halfH+8, halfHV, stride, 8, 8, 8);\ }\ -void ff_ ## OPNAME ## qpel8_mc12_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfV[64];\ - UINT8 halfHV[64];\ +void ff_ ## OPNAME ## qpel8_mc12_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfV[64];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full, 8, 16);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);\ }\ -static void OPNAME ## qpel8_mc12_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ +static void OPNAME ## qpel8_mc12_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## pixels8_l2(halfH, halfH, full, 8, 8, 16, 9);\ OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);\ }\ -void ff_ ## OPNAME ## qpel8_mc32_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ - UINT8 halfV[64];\ - UINT8 halfHV[64];\ +void ff_ ## OPNAME ## qpel8_mc32_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ + uint8_t halfV[64];\ + uint8_t halfHV[64];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfV, full+1, 8, 16);\ put ## RND ## mpeg4_qpel8_v_lowpass(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2(dst, halfV, halfHV, stride, 8, 8, 8);\ }\ -static void OPNAME ## qpel8_mc32_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[16*9];\ - UINT8 halfH[72];\ +static void OPNAME ## qpel8_mc32_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[16*9];\ + uint8_t halfH[72];\ copy_block9(full, src, 16, stride, 9);\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, full, 8, 16, 9);\ put ## RND ## pixels8_l2(halfH, halfH, full+1, 8, 8, 16, 9);\ OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);\ }\ -static void OPNAME ## qpel8_mc22_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 halfH[72];\ +static void OPNAME ## qpel8_mc22_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t halfH[72];\ put ## RND ## mpeg4_qpel8_h_lowpass(halfH, src, 8, stride, 9);\ OPNAME ## mpeg4_qpel8_v_lowpass(dst, halfH, stride, 8);\ }\ -static void OPNAME ## qpel16_mc00_c (UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc00_c (uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## pixels16_c(dst, src, stride, 16);\ }\ \ -static void OPNAME ## qpel16_mc10_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 half[256];\ +static void OPNAME ## qpel16_mc10_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t half[256];\ put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);\ OPNAME ## pixels16_l2(dst, src, half, stride, stride, 16, 16);\ }\ \ -static void OPNAME ## qpel16_mc20_c(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc20_c(uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## mpeg4_qpel16_h_lowpass(dst, src, stride, stride, 16);\ }\ \ -static void OPNAME ## qpel16_mc30_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 half[256];\ +static void OPNAME ## qpel16_mc30_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t half[256];\ put ## RND ## mpeg4_qpel16_h_lowpass(half, src, 16, stride, 16);\ OPNAME ## pixels16_l2(dst, src+1, half, stride, stride, 16, 16);\ }\ \ -static void OPNAME ## qpel16_mc01_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 half[256];\ +static void OPNAME ## qpel16_mc01_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t half[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);\ OPNAME ## pixels16_l2(dst, full, half, stride, 24, 16, 16);\ }\ \ -static void OPNAME ## qpel16_mc02_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ +static void OPNAME ## qpel16_mc02_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ copy_block17(full, src, 24, stride, 17);\ OPNAME ## mpeg4_qpel16_v_lowpass(dst, full, stride, 24);\ }\ \ -static void OPNAME ## qpel16_mc03_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 half[256];\ +static void OPNAME ## qpel16_mc03_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t half[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(half, full, 16, 24);\ OPNAME ## pixels16_l2(dst, full+24, half, stride, 24, 16, 16);\ }\ -void ff_ ## OPNAME ## qpel16_mc11_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfV[256];\ - UINT8 halfHV[256];\ +void ff_ ## OPNAME ## qpel16_mc11_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfV[256];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l4(dst, full, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ }\ -static void OPNAME ## qpel16_mc11_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfHV[256];\ +static void OPNAME ## qpel16_mc11_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\ }\ -void ff_ ## OPNAME ## qpel16_mc31_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfV[256];\ - UINT8 halfHV[256];\ +void ff_ ## OPNAME ## qpel16_mc31_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfV[256];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l4(dst, full+1, halfH, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ }\ -static void OPNAME ## qpel16_mc31_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfHV[256];\ +static void OPNAME ## qpel16_mc31_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\ }\ -void ff_ ## OPNAME ## qpel16_mc13_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfV[256];\ - UINT8 halfHV[256];\ +void ff_ ## OPNAME ## qpel16_mc13_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfV[256];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l4(dst, full+24, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ }\ -static void OPNAME ## qpel16_mc13_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfHV[256];\ +static void OPNAME ## qpel16_mc13_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\ }\ -void ff_ ## OPNAME ## qpel16_mc33_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfV[256];\ - UINT8 halfHV[256];\ +void ff_ ## OPNAME ## qpel16_mc33_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfV[256];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full , 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l4(dst, full+25, halfH+16, halfV, halfHV, stride, 24, 16, 16, 16, 16);\ }\ -static void OPNAME ## qpel16_mc33_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfHV[256];\ +static void OPNAME ## qpel16_mc33_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\ }\ -static void OPNAME ## qpel16_mc21_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 halfH[272];\ - UINT8 halfHV[256];\ +static void OPNAME ## qpel16_mc21_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t halfH[272];\ + uint8_t halfHV[256];\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2(dst, halfH, halfHV, stride, 16, 16, 16);\ }\ -static void OPNAME ## qpel16_mc23_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 halfH[272];\ - UINT8 halfHV[256];\ +static void OPNAME ## qpel16_mc23_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t halfH[272];\ + uint8_t halfHV[256];\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2(dst, halfH+16, halfHV, stride, 16, 16, 16);\ }\ -void ff_ ## OPNAME ## qpel16_mc12_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfV[256];\ - UINT8 halfHV[256];\ +void ff_ ## OPNAME ## qpel16_mc12_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfV[256];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full, 16, 24);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\ }\ -static void OPNAME ## qpel16_mc12_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ +static void OPNAME ## qpel16_mc12_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## pixels16_l2(halfH, halfH, full, 16, 16, 24, 17);\ OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);\ }\ -void ff_ ## OPNAME ## qpel16_mc32_old_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ - UINT8 halfV[256];\ - UINT8 halfHV[256];\ +void ff_ ## OPNAME ## qpel16_mc32_old_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ + uint8_t halfV[256];\ + uint8_t halfHV[256];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfV, full+1, 16, 24);\ put ## RND ## mpeg4_qpel16_v_lowpass(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2(dst, halfV, halfHV, stride, 16, 16, 16);\ }\ -static void OPNAME ## qpel16_mc32_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 full[24*17];\ - UINT8 halfH[272];\ +static void OPNAME ## qpel16_mc32_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t full[24*17];\ + uint8_t halfH[272];\ copy_block17(full, src, 24, stride, 17);\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, full, 16, 24, 17);\ put ## RND ## pixels16_l2(halfH, halfH, full+1, 16, 16, 24, 17);\ OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);\ }\ -static void OPNAME ## qpel16_mc22_c(UINT8 *dst, UINT8 *src, int stride){\ - UINT8 halfH[272];\ +static void OPNAME ## qpel16_mc22_c(uint8_t *dst, uint8_t *src, int stride){\ + uint8_t halfH[272];\ put ## RND ## mpeg4_qpel16_h_lowpass(halfH, src, 16, stride, 17);\ OPNAME ## mpeg4_qpel16_v_lowpass(dst, halfH, stride, 16);\ } @@ -1406,7 +1423,7 @@ static void put_mspel8_mc22_c(uint8_t *dst, uint8_t *src, int stride){ } -static inline int pix_abs16x16_c(UINT8 *pix1, UINT8 *pix2, int line_size) +static inline int pix_abs16x16_c(uint8_t *pix1, uint8_t *pix2, int line_size) { int s, i; @@ -1434,7 +1451,7 @@ static inline int pix_abs16x16_c(UINT8 *pix1, UINT8 *pix2, int line_size) return s; } -static int pix_abs16x16_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size) +static int pix_abs16x16_x2_c(uint8_t *pix1, uint8_t *pix2, int line_size) { int s, i; @@ -1462,10 +1479,10 @@ static int pix_abs16x16_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size) return s; } -static int pix_abs16x16_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size) +static int pix_abs16x16_y2_c(uint8_t *pix1, uint8_t *pix2, int line_size) { int s, i; - UINT8 *pix3 = pix2 + line_size; + uint8_t *pix3 = pix2 + line_size; s = 0; for(i=0;i<16;i++) { @@ -1492,10 +1509,10 @@ static int pix_abs16x16_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size) return s; } -static int pix_abs16x16_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size) +static int pix_abs16x16_xy2_c(uint8_t *pix1, uint8_t *pix2, int line_size) { int s, i; - UINT8 *pix3 = pix2 + line_size; + uint8_t *pix3 = pix2 + line_size; s = 0; for(i=0;i<16;i++) { @@ -1522,7 +1539,7 @@ static int pix_abs16x16_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size) return s; } -static inline int pix_abs8x8_c(UINT8 *pix1, UINT8 *pix2, int line_size) +static inline int pix_abs8x8_c(uint8_t *pix1, uint8_t *pix2, int line_size) { int s, i; @@ -1542,7 +1559,7 @@ static inline int pix_abs8x8_c(UINT8 *pix1, UINT8 *pix2, int line_size) return s; } -static int pix_abs8x8_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size) +static int pix_abs8x8_x2_c(uint8_t *pix1, uint8_t *pix2, int line_size) { int s, i; @@ -1562,10 +1579,10 @@ static int pix_abs8x8_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size) return s; } -static int pix_abs8x8_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size) +static int pix_abs8x8_y2_c(uint8_t *pix1, uint8_t *pix2, int line_size) { int s, i; - UINT8 *pix3 = pix2 + line_size; + uint8_t *pix3 = pix2 + line_size; s = 0; for(i=0;i<8;i++) { @@ -1584,10 +1601,10 @@ static int pix_abs8x8_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size) return s; } -static int pix_abs8x8_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size) +static int pix_abs8x8_xy2_c(uint8_t *pix1, uint8_t *pix2, int line_size) { int s, i; - UINT8 *pix3 = pix2 + line_size; + uint8_t *pix3 = pix2 + line_size; s = 0; for(i=0;i<8;i++) { @@ -1614,7 +1631,15 @@ static int sad8x8_c(void *s, uint8_t *a, uint8_t *b, int stride){ return pix_abs8x8_c(a,b,stride); } -void ff_block_permute(DCTELEM *block, UINT8 *permutation, const UINT8 *scantable, int last) +/** + * permutes an 8x8 block. + * @param block the block which will be permuted according to the given permutation vector + * @param permutation the permutation vector + * @param last the last non zero coefficient in scantable order, used to speed the permutation up + * @param scantable the used scantable, this is only used to speed the permutation up, the block is not + * (inverse) permutated to scantable order! + */ +void ff_block_permute(DCTELEM *block, uint8_t *permutation, const uint8_t *scantable, int last) { int i; DCTELEM temp[64]; @@ -1635,6 +1660,9 @@ void ff_block_permute(DCTELEM *block, UINT8 *permutation, const UINT8 *scantable } } +/** + * memset(blocks, 0, sizeof(DCTELEM)*6*64) + */ static void clear_blocks_c(DCTELEM *blocks) { memset(blocks, 0, sizeof(DCTELEM)*6*64); @@ -1788,7 +1816,7 @@ static int dct_sad8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2 int sum=0, i; s->dsp.diff_pixels(temp, src1, src2, stride); - s->fdct(temp); + s->dsp.fdct(temp); for(i=0; i<64; i++) sum+= ABS(temp[i]); @@ -1823,7 +1851,7 @@ static int quant_psnr8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *s static int rd8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride){ MpegEncContext * const s= (MpegEncContext *)c; - const UINT8 *scantable= s->intra_scantable.permutated; + const uint8_t *scantable= s->intra_scantable.permutated; uint64_t __align8 aligned_temp[sizeof(DCTELEM)*64/8]; uint64_t __align8 aligned_bak[stride]; DCTELEM * const temp= (DCTELEM*)aligned_temp; @@ -1875,7 +1903,7 @@ static int rd8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int level= temp[i] + 64; - XINE_ASSERT(level - 64,"?"); + assert(level - 64); if((level&(~127)) == 0){ bits+= last_length[UNI_AC_ENC_INDEX(run, level)]; @@ -1888,7 +1916,7 @@ static int rd8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int s->dct_unquantize(s, temp, 0, s->qscale); } - s->idct_add(bak, stride, temp); + s->dsp.idct_add(bak, stride, temp); distoration= s->dsp.sse[1](NULL, bak, src1, stride); @@ -1897,7 +1925,7 @@ static int rd8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int static int bit8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, int stride){ MpegEncContext * const s= (MpegEncContext *)c; - const UINT8 *scantable= s->intra_scantable.permutated; + const uint8_t *scantable= s->intra_scantable.permutated; uint64_t __align8 aligned_temp[sizeof(DCTELEM)*64/8]; DCTELEM * const temp= (DCTELEM*)aligned_temp; int i, last, run, bits, level, start_i; @@ -1942,7 +1970,7 @@ static int bit8x8_c(/*MpegEncContext*/ void *c, uint8_t *src1, uint8_t *src2, in level= temp[i] + 64; - XINE_ASSERT(level - 64,"?"); + assert(level - 64); if((level&(~127)) == 0){ bits+= last_length[UNI_AC_ENC_INDEX(run, level)]; @@ -1960,7 +1988,20 @@ WARPER88_1616(quant_psnr8x8_c, quant_psnr16x16_c) WARPER88_1616(rd8x8_c, rd16x16_c) WARPER88_1616(bit8x8_c, bit16x16_c) -void dsputil_init(DSPContext* c, unsigned mask) +/* XXX: those functions should be suppressed ASAP when all IDCTs are + converted */ +static void ff_jref_idct_put(uint8_t *dest, int line_size, DCTELEM *block) +{ + j_rev_dct (block); + put_pixels_clamped_c(block, dest, line_size); +} +static void ff_jref_idct_add(uint8_t *dest, int line_size, DCTELEM *block) +{ + j_rev_dct (block); + add_pixels_clamped_c(block, dest, line_size); +} + +void dsputil_init(DSPContext* c, AVCodecContext *avctx) { static int init_done = 0; int i; @@ -1981,6 +2022,23 @@ void dsputil_init(DSPContext* c, unsigned mask) init_done = 1; } +#ifdef CONFIG_ENCODERS + if(avctx->dct_algo==FF_DCT_FASTINT) + c->fdct = fdct_ifast; + else + c->fdct = ff_jpeg_fdct_islow; //slow/accurate/default +#endif //CONFIG_ENCODERS + + if(avctx->idct_algo==FF_IDCT_INT){ + c->idct_put= ff_jref_idct_put; + c->idct_add= ff_jref_idct_add; + c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; + }else{ //accurate/default + c->idct_put= simple_idct_put; + c->idct_add= simple_idct_add; + c->idct_permutation_type= FF_NO_IDCT_PERM; + } + c->get_pixels = get_pixels_c; c->diff_pixels = diff_pixels_c; c->put_pixels_clamped = put_pixels_clamped_c; @@ -2083,37 +2141,43 @@ void dsputil_init(DSPContext* c, unsigned mask) c->diff_bytes= diff_bytes_c; #ifdef HAVE_MMX - dsputil_init_mmx(c, mask); - if (ff_bit_exact) - { - /* FIXME - AVCodec context should have flag for bitexact match */ - /* fprintf(stderr, "\n\n\nff_bit_exact %d\n\n\n\n", ff_bit_exact); */ - dsputil_set_bit_exact_mmx(c, mask); - } + dsputil_init_mmx(c, avctx); #endif #ifdef ARCH_ARMV4L - dsputil_init_armv4l(c, mask); + dsputil_init_armv4l(c, avctx); #endif #ifdef HAVE_MLIB - dsputil_init_mlib(c, mask); + dsputil_init_mlib(c, avctx); #endif #ifdef ARCH_ALPHA - dsputil_init_alpha(c, mask); + dsputil_init_alpha(c, avctx); #endif #ifdef ARCH_POWERPC - dsputil_init_ppc(c, mask); + dsputil_init_ppc(c, avctx); #endif #ifdef HAVE_MMI - dsputil_init_mmi(c, mask); + dsputil_init_mmi(c, avctx); #endif -} -/* remove any non bit exact operation (testing purpose) */ -void avcodec_set_bit_exact(void) -{ - ff_bit_exact=1; -#ifdef HAVE_MMX -// FIXME - better set_bit_exact -// dsputil_set_bit_exact_mmx(); -#endif + switch(c->idct_permutation_type){ + case FF_NO_IDCT_PERM: + for(i=0; i<64; i++) + c->idct_permutation[i]= i; + break; + case FF_LIBMPEG2_IDCT_PERM: + for(i=0; i<64; i++) + c->idct_permutation[i]= (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2); + break; + case FF_SIMPLE_IDCT_PERM: + for(i=0; i<64; i++) + c->idct_permutation[i]= simple_mmx_permutation[i]; + break; + case FF_TRANSPOSE_IDCT_PERM: + for(i=0; i<64; i++) + c->idct_permutation[i]= ((i&7)<<3) | (i>>3); + break; + default: + fprintf(stderr, "Internal error, IDCT permutation not set\n"); + } } + diff --git a/src/libffmpeg/libavcodec/dsputil.h b/src/libffmpeg/libavcodec/dsputil.h index 2220b4871..2cdb256f9 100644 --- a/src/libffmpeg/libavcodec/dsputil.h +++ b/src/libffmpeg/libavcodec/dsputil.h @@ -16,6 +16,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file dsputil.h + * DSP utils. + */ + #ifndef DSPUTIL_H #define DSPUTIL_H @@ -28,6 +34,7 @@ #endif #undef DEBUG + /* dct code */ typedef short DCTELEM; //typedef int DCTELEM; @@ -40,16 +47,16 @@ void j_rev_dct (DCTELEM *data); void ff_fdct_mmx(DCTELEM *block); /* encoding scans */ -extern const UINT8 ff_alternate_horizontal_scan[64]; -extern const UINT8 ff_alternate_vertical_scan[64]; -extern const UINT8 ff_zigzag_direct[64]; +extern const uint8_t ff_alternate_horizontal_scan[64]; +extern const uint8_t ff_alternate_vertical_scan[64]; +extern const uint8_t ff_zigzag_direct[64]; /* pixel operations */ #define MAX_NEG_CROP 384 /* temporary */ -extern UINT32 squareTbl[512]; -extern UINT8 cropTbl[256 + 2 * MAX_NEG_CROP]; +extern uint32_t squareTbl[512]; +extern uint8_t cropTbl[256 + 2 * MAX_NEG_CROP]; /* minimum alignment rules ;) @@ -63,22 +70,22 @@ i (michael) didnt check them, these are just the alignents which i think could b */ /* -void get_pixels_c(DCTELEM *block, const UINT8 *pixels, int line_size); -void diff_pixels_c(DCTELEM *block, const UINT8 *s1, const UINT8 *s2, int stride); -void put_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size); -void add_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size); +void get_pixels_c(DCTELEM *block, const uint8_t *pixels, int line_size); +void diff_pixels_c(DCTELEM *block, const uint8_t *s1, const uint8_t *s2, int stride); +void put_pixels_clamped_c(const DCTELEM *block, uint8_t *pixels, int line_size); +void add_pixels_clamped_c(const DCTELEM *block, uint8_t *pixels, int line_size); void clear_blocks_c(DCTELEM *blocks); */ /* add and put pixel (decoding) */ // blocksizes for op_pixels_func are 8x4,8x8 16x8 16x16 -typedef void (*op_pixels_func)(UINT8 *block/*align width (8 or 16)*/, const UINT8 *pixels/*align 1*/, int line_size, int h); -typedef void (*qpel_mc_func)(UINT8 *dst/*align width (8 or 16)*/, UINT8 *src/*align 1*/, int stride); +typedef void (*op_pixels_func)(uint8_t *block/*align width (8 or 16)*/, const uint8_t *pixels/*align 1*/, int line_size, int h); +typedef void (*qpel_mc_func)(uint8_t *dst/*align width (8 or 16)*/, uint8_t *src/*align 1*/, int stride); #define DEF_OLD_QPEL(name)\ -void ff_put_ ## name (UINT8 *dst/*align width (8 or 16)*/, UINT8 *src/*align 1*/, int stride);\ -void ff_put_no_rnd_ ## name (UINT8 *dst/*align width (8 or 16)*/, UINT8 *src/*align 1*/, int stride);\ -void ff_avg_ ## name (UINT8 *dst/*align width (8 or 16)*/, UINT8 *src/*align 1*/, int stride); +void ff_put_ ## name (uint8_t *dst/*align width (8 or 16)*/, uint8_t *src/*align 1*/, int stride);\ +void ff_put_no_rnd_ ## name (uint8_t *dst/*align width (8 or 16)*/, uint8_t *src/*align 1*/, int stride);\ +void ff_avg_ ## name (uint8_t *dst/*align width (8 or 16)*/, uint8_t *src/*align 1*/, int stride); DEF_OLD_QPEL(qpel16_mc11_old_c) DEF_OLD_QPEL(qpel16_mc31_old_c) @@ -101,22 +108,31 @@ static void a(uint8_t *block, const uint8_t *pixels, int line_size, int h){\ /* motion estimation */ -typedef int (*op_pixels_abs_func)(UINT8 *blk1/*align width (8 or 16)*/, UINT8 *blk2/*align 1*/, int line_size)/* __attribute__ ((const))*/; +typedef int (*op_pixels_abs_func)(uint8_t *blk1/*align width (8 or 16)*/, uint8_t *blk2/*align 1*/, int line_size)/* __attribute__ ((const))*/; -typedef int (*me_cmp_func)(void /*MpegEncContext*/ *s, UINT8 *blk1/*align width (8 or 16)*/, UINT8 *blk2/*align 1*/, int line_size)/* __attribute__ ((const))*/; +typedef int (*me_cmp_func)(void /*MpegEncContext*/ *s, uint8_t *blk1/*align width (8 or 16)*/, uint8_t *blk2/*align 1*/, int line_size)/* __attribute__ ((const))*/; +/** + * DSPContext. + */ typedef struct DSPContext { /* pixel ops : interface with DCT */ - void (*get_pixels)(DCTELEM *block/*align 16*/, const UINT8 *pixels/*align 8*/, int line_size); - void (*diff_pixels)(DCTELEM *block/*align 16*/, const UINT8 *s1/*align 8*/, const UINT8 *s2/*align 8*/, int stride); - void (*put_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size); - void (*add_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size); - void (*gmc1)(UINT8 *dst/*align 8*/, UINT8 *src/*align 1*/, int srcStride, int h, int x16, int y16, int rounder); - void (*gmc )(UINT8 *dst/*align 8*/, UINT8 *src/*align 1*/, int stride, int h, int ox, int oy, + void (*get_pixels)(DCTELEM *block/*align 16*/, const uint8_t *pixels/*align 8*/, int line_size); + void (*diff_pixels)(DCTELEM *block/*align 16*/, const uint8_t *s1/*align 8*/, const uint8_t *s2/*align 8*/, int stride); + void (*put_pixels_clamped)(const DCTELEM *block/*align 16*/, uint8_t *pixels/*align 8*/, int line_size); + void (*add_pixels_clamped)(const DCTELEM *block/*align 16*/, uint8_t *pixels/*align 8*/, int line_size); + /** + * translational global motion compensation. + */ + void (*gmc1)(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int srcStride, int h, int x16, int y16, int rounder); + /** + * global motion compensation. + */ + void (*gmc )(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int ox, int oy, int dxx, int dxy, int dyx, int dyy, int shift, int r, int width, int height); void (*clear_blocks)(DCTELEM *blocks/*align 16*/); - int (*pix_sum)(UINT8 * pix, int line_size); - int (*pix_norm1)(UINT8 * pix, int line_size); + int (*pix_sum)(uint8_t * pix, int line_size); + int (*pix_norm1)(uint8_t * pix, int line_size); me_cmp_func sad[2]; /* identical to pix_absAxA except additional void * */ me_cmp_func sse[2]; me_cmp_func hadamard8_diff[2]; @@ -132,9 +148,44 @@ typedef struct DSPContext { me_cmp_func mb_cmp[11]; /* maybe create an array for 16/8 functions */ + /** + * Halfpel motion compensation with rounding (a+b+1)>>1. + * *pixels_tab[ 0->16x16 1->8x8 ][ xhalfpel + 2*yhalfpel ] + * @param block destination where the result is stored + * @param pixels source + * @param line_size number of bytes in a horizontal line of block + * @param h height + */ op_pixels_func put_pixels_tab[2][4]; + + /** + * Halfpel motion compensation with rounding (a+b+1)>>1. + * *pixels_tab[ 0->16x16 1->8x8 ][ xhalfpel + 2*yhalfpel ] + * @param block destination into which the result is averaged (a+b+1)>>1 + * @param pixels source + * @param line_size number of bytes in a horizontal line of block + * @param h height + */ op_pixels_func avg_pixels_tab[2][4]; + + /** + * Halfpel motion compensation with no rounding (a+b)>>1. + * *pixels_tab[ 0->16x16 1->8x8 ][ xhalfpel + 2*yhalfpel ] + * @param block destination where the result is stored + * @param pixels source + * @param line_size number of bytes in a horizontal line of block + * @param h height + */ op_pixels_func put_no_rnd_pixels_tab[2][4]; + + /** + * Halfpel motion compensation with no rounding (a+b)>>1. + * *pixels_tab[ 0->16x16 1->8x8 ][ xhalfpel + 2*yhalfpel ] + * @param block destination into which the result is averaged (a+b)>>1 + * @param pixels source + * @param line_size number of bytes in a horizontal line of block + * @param h height + */ op_pixels_func avg_no_rnd_pixels_tab[2][4]; qpel_mc_func put_qpel_pixels_tab[2][16]; qpel_mc_func avg_qpel_pixels_tab[2][16]; @@ -154,16 +205,53 @@ typedef struct DSPContext { /* huffyuv specific */ void (*add_bytes)(uint8_t *dst/*align 16*/, uint8_t *src/*align 16*/, int w); void (*diff_bytes)(uint8_t *dst/*align 16*/, uint8_t *src1/*align 16*/, uint8_t *src2/*align 1*/,int w); + + /* (I)DCT */ + void (*fdct)(DCTELEM *block/* align 16*/); + + /** + * block -> idct -> clip to unsigned 8 bit -> dest. + * (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...) + * @param line_size size in bytes of a horizotal line of dest + */ + void (*idct_put)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); + + /** + * block -> idct -> add dest -> clip to unsigned 8 bit -> dest. + * @param line_size size in bytes of a horizotal line of dest + */ + void (*idct_add)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); + + /** + * idct input permutation. + * an example to avoid confusion: + * - (->decode coeffs -> zigzag reorder -> dequant -> reference idct ->...) + * - (x -> referece dct -> reference idct -> x) + * - (x -> referece dct -> simple_mmx_perm = idct_permutation -> simple_idct_mmx -> x) + * - (->decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant -> simple_idct_mmx ->...) + */ + uint8_t idct_permutation[64]; + int idct_permutation_type; +#define FF_NO_IDCT_PERM 1 +#define FF_LIBMPEG2_IDCT_PERM 2 +#define FF_SIMPLE_IDCT_PERM 3 +#define FF_TRANSPOSE_IDCT_PERM 4 + } DSPContext; -void dsputil_init(DSPContext* p, unsigned mask); +void dsputil_init(DSPContext* p, AVCodecContext *avctx); /** * permute block according to permuatation. * @param last last non zero element in scantable order */ -void ff_block_permute(DCTELEM *block, UINT8 *permutation, const UINT8 *scantable, int last); +void ff_block_permute(DCTELEM *block, uint8_t *permutation, const uint8_t *scantable, int last); +/** + * Empty mmx state. + * this must be called between any dsp function and float/double code. + * for example sin(); dsp->idct_put(); emms_c(); cos() + */ #define emms_c() /* should be defined by architectures supporting @@ -184,8 +272,8 @@ int mm_support(void); extern int mm_flags; -void add_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size); -void put_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size); +void add_pixels_clamped_mmx(const DCTELEM *block, uint8_t *pixels, int line_size); +void put_pixels_clamped_mmx(const DCTELEM *block, uint8_t *pixels, int line_size); #if 0 static inline void emms(void) @@ -203,8 +291,8 @@ static inline void emms(void) #define __align8 __attribute__ ((aligned (8))) -void dsputil_init_mmx(DSPContext* c, unsigned mask); -void dsputil_set_bit_exact_mmx(DSPContext* c, unsigned mask); +void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx); +void dsputil_init_pix_mmx(DSPContext* c, AVCodecContext *avctx); #elif defined(ARCH_ARMV4L) @@ -212,20 +300,20 @@ void dsputil_set_bit_exact_mmx(DSPContext* c, unsigned mask); line ptimizations */ #define __align8 __attribute__ ((aligned (4))) -void dsputil_init_armv4l(DSPContext* c, unsigned mask); +void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx); #elif defined(HAVE_MLIB) /* SPARC/VIS IDCT needs 8-byte aligned DCT blocks */ #define __align8 __attribute__ ((aligned (8))) -void dsputil_init_mlib(DSPContext* c, unsigned mask); +void dsputil_init_mlib(DSPContext* c, AVCodecContext *avctx); #elif defined(ARCH_ALPHA) #define __align8 __attribute__ ((aligned (8))) -void dsputil_init_alpha(DSPContext* c, unsigned mask); +void dsputil_init_alpha(DSPContext* c, AVCodecContext *avctx); #elif defined(ARCH_POWERPC) @@ -239,13 +327,13 @@ extern int mm_flags; #define __align8 __attribute__ ((aligned (16))) -void dsputil_init_ppc(DSPContext* c, unsigned mask); +void dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx); #elif defined(HAVE_MMI) #define __align8 __attribute__ ((aligned (16))) -void dsputil_init_mmi(DSPContext* c, unsigned mask); +void dsputil_init_mmi(DSPContext* c, AVCodecContext *avctx); #else @@ -273,7 +361,7 @@ struct unaligned_32 { uint32_t l; } __attribute__((packed)); #endif /* !__GNUC__ */ /* PSNR */ -void get_psnr(UINT8 *orig_image[3], UINT8 *coded_image[3], +void get_psnr(uint8_t *orig_image[3], uint8_t *coded_image[3], int orig_linesize[3], int coded_linesize, AVCodecContext *avctx); diff --git a/src/libffmpeg/libavcodec/dv.c b/src/libffmpeg/libavcodec/dv.c index 554b593e7..6d661f4cf 100644 --- a/src/libffmpeg/libavcodec/dv.c +++ b/src/libffmpeg/libavcodec/dv.c @@ -16,6 +16,11 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file dv.c + * DV decoder. + */ #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" @@ -32,15 +37,15 @@ typedef struct DVVideoDecodeContext { VLC *vlc; int sampling_411; /* 0 = 420, 1 = 411 */ int width, height; - UINT8 *current_picture[3]; /* picture structure */ + uint8_t *current_picture[3]; /* picture structure */ AVFrame picture; int linesize[3]; DCTELEM block[5*6][64] __align8; - UINT8 dv_zigzag[2][64]; - UINT8 idct_permutation[64]; + uint8_t dv_zigzag[2][64]; + uint8_t idct_permutation[64]; /* XXX: move it to static storage ? */ - UINT8 dv_shift[2][22][64]; - void (*idct_put[2])(UINT8 *dest, int line_size, DCTELEM *block); + uint8_t dv_shift[2][22][64]; + void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block); } DVVideoDecodeContext; #include "dvdata.h" @@ -76,7 +81,7 @@ static int dvvideo_decode_init(AVCodecContext *avctx) { DVVideoDecodeContext *s = avctx->priv_data; MpegEncContext s2; - static int done; + static int done=0; if (!done) { int i; @@ -115,12 +120,12 @@ static int dvvideo_decode_init(AVCodecContext *avctx) /* XXX: fix it */ memset(&s2, 0, sizeof(MpegEncContext)); s2.avctx = avctx; - dsputil_init(&s2.dsp, avctx->dsp_mask); + dsputil_init(&s2.dsp, avctx); if (DCT_common_init(&s2) < 0) return -1; - s->idct_put[0] = s2.idct_put; - memcpy(s->idct_permutation, s2.idct_permutation, 64); + s->idct_put[0] = s2.dsp.idct_put; + memcpy(s->idct_permutation, s2.dsp.idct_permutation, 64); memcpy(s->dv_zigzag[0], s2.intra_scantable.permutated, 64); /* XXX: use MMX also for idct248 */ @@ -136,18 +141,18 @@ static int dvvideo_decode_init(AVCodecContext *avctx) //#define VLC_DEBUG typedef struct BlockInfo { - const UINT8 *shift_table; - const UINT8 *scan_table; - UINT8 pos; /* position in block */ - UINT8 eob_reached; /* true if EOB has been reached */ - UINT8 dct_mode; - UINT8 partial_bit_count; - UINT16 partial_bit_buffer; + const uint8_t *shift_table; + const uint8_t *scan_table; + uint8_t pos; /* position in block */ + uint8_t eob_reached; /* true if EOB has been reached */ + uint8_t dct_mode; + uint8_t partial_bit_count; + uint16_t partial_bit_buffer; int shift_offset; } BlockInfo; /* block size in bits */ -static const UINT16 block_sizes[6] = { +static const uint16_t block_sizes[6] = { 112, 112, 112, 112, 80, 80 }; @@ -161,8 +166,8 @@ static void dv_decode_ac(DVVideoDecodeContext *s, { int last_re_index; int shift_offset = mb->shift_offset; - const UINT8 *scan_table = mb->scan_table; - const UINT8 *shift_table = mb->shift_table; + const uint8_t *scan_table = mb->scan_table; + const uint8_t *shift_table = mb->shift_table; int pos = mb->pos; int level, pos1, sign, run; int partial_bit_count; @@ -176,8 +181,8 @@ static void dv_decode_ac(DVVideoDecodeContext *s, /* if we must parse a partial vlc, we do it here */ partial_bit_count = mb->partial_bit_count; if (partial_bit_count > 0) { - UINT8 buf[4]; - UINT32 v; + uint8_t buf[4]; + uint32_t v; int l, l1; GetBitContext gb1; @@ -298,21 +303,21 @@ static inline void bit_copy(PutBitContext *pb, GetBitContext *gb, int bits_left) /* mb_x and mb_y are in units of 8 pixels */ static inline void dv_decode_video_segment(DVVideoDecodeContext *s, - UINT8 *buf_ptr1, - const UINT16 *mb_pos_ptr) + uint8_t *buf_ptr1, + const uint16_t *mb_pos_ptr) { int quant, dc, dct_mode, class1, j; int mb_index, mb_x, mb_y, v, last_index; DCTELEM *block, *block1; int c_offset, bits_left; - UINT8 *y_ptr; + uint8_t *y_ptr; BlockInfo mb_data[5 * 6], *mb, *mb1; - void (*idct_put)(UINT8 *dest, int line_size, DCTELEM *block); - UINT8 *buf_ptr; + void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block); + uint8_t *buf_ptr; PutBitContext pb, vs_pb; - UINT8 mb_bit_buffer[80 + 4]; /* allow some slack */ + uint8_t mb_bit_buffer[80 + 4]; /* allow some slack */ int mb_bit_count; - UINT8 vs_bit_buffer[5 * 80 + 4]; /* allow some slack */ + uint8_t vs_bit_buffer[5 * 80 + 4]; /* allow some slack */ int vs_bit_count; memset(s->block, 0, sizeof(s->block)); @@ -493,12 +498,12 @@ static inline void dv_decode_video_segment(DVVideoDecodeContext *s, 144000 bytes for PAL) */ static int dvvideo_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { DVVideoDecodeContext *s = avctx->priv_data; int sct, dsf, apt, ds, nb_dif_segs, vs, width, height, i, packet_size; - UINT8 *buf_ptr; - const UINT16 *mb_pos_ptr; + uint8_t *buf_ptr; + const uint16_t *mb_pos_ptr; /* parse id */ init_get_bits(&s->gb, buf, buf_size*8); @@ -532,25 +537,28 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, /* init size */ width = 720; if (dsf) { - avctx->frame_rate = 25 * FRAME_RATE_BASE; + avctx->frame_rate = 25; packet_size = PAL_FRAME_SIZE; height = 576; nb_dif_segs = 12; } else { - avctx->frame_rate = 30 * FRAME_RATE_BASE; + avctx->frame_rate = 30; packet_size = NTSC_FRAME_SIZE; height = 480; nb_dif_segs = 10; } + avctx->frame_rate_base= 1; /* NOTE: we only accept several full frames */ if (buf_size < packet_size) return -1; - /* XXX: is it correct to assume that 420 is always used in PAL - mode ? */ - s->sampling_411 = !dsf; + /* NTSC[dsf == 0] is always 720x480, 4:1:1 + * PAL[dsf == 1] is always 720x576, 4:2:0 for IEC 68134[apt == 0] + * but for the SMPTE 314M[apt == 1] it is 720x576, 4:1:1 + */ + s->sampling_411 = !dsf || apt; if (s->sampling_411) { - mb_pos_ptr = dv_place_411; + mb_pos_ptr = dsf ? dv_place_411P : dv_place_411; avctx->pix_fmt = PIX_FMT_YUV411P; } else { mb_pos_ptr = dv_place_420; @@ -642,9 +650,9 @@ static int dvaudio_decode_init(AVCodecContext *avctx) return 0; } -static UINT16 dv_audio_12to16(UINT16 sample) +static uint16_t dv_audio_12to16(uint16_t sample) { - UINT16 shift, result; + uint16_t shift, result; sample = (sample < 0x800) ? sample : sample | 0xf000; shift = (sample & 0xf00) >> 8; @@ -676,13 +684,13 @@ static UINT16 dv_audio_12to16(UINT16 sample) */ static int dvaudio_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { DVVideoDecodeContext *s = avctx->priv_data; - const UINT16 (*unshuffle)[9]; + const uint16_t (*unshuffle)[9]; int smpls, freq, quant, sys, stride, difseg, ad, dp, nb_dif_segs, i; - UINT16 lc, rc; - UINT8 *buf_ptr; + uint16_t lc, rc; + uint8_t *buf_ptr; /* parse id */ init_get_bits(&s->gb, &buf[AAUX_OFFSET], 5*8); @@ -742,10 +750,10 @@ static int dvaudio_decode_frame(AVCodecContext *avctx, if (difseg >= nb_dif_segs/2) goto out; /* We're not doing 4ch at this time */ - lc = ((UINT16)buf_ptr[dp] << 4) | - ((UINT16)buf_ptr[dp+2] >> 4); - rc = ((UINT16)buf_ptr[dp+1] << 4) | - ((UINT16)buf_ptr[dp+2] & 0x0f); + lc = ((uint16_t)buf_ptr[dp] << 4) | + ((uint16_t)buf_ptr[dp+2] >> 4); + rc = ((uint16_t)buf_ptr[dp+1] << 4) | + ((uint16_t)buf_ptr[dp+2] & 0x0f); lc = dv_audio_12to16(lc); rc = dv_audio_12to16(rc); diff --git a/src/libffmpeg/libavcodec/dvdata.h b/src/libffmpeg/libavcodec/dvdata.h index 4e1fc39c7..29aea4022 100644 --- a/src/libffmpeg/libavcodec/dvdata.h +++ b/src/libffmpeg/libavcodec/dvdata.h @@ -17,10 +17,15 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + * @file dvdata.h + * Constants for DV codec. + */ + #define NB_DV_VLC 409 #define AAUX_OFFSET (80*6 + 80*16*3 + 3) -static const UINT16 dv_vlc_bits[409] = { +static const uint16_t dv_vlc_bits[409] = { 0x0000, 0x0002, 0x0007, 0x0008, 0x0009, 0x0014, 0x0015, 0x0016, 0x0017, 0x0030, 0x0031, 0x0032, 0x0033, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x00e0, 0x00e1, 0x00e2, @@ -75,7 +80,7 @@ static const UINT16 dv_vlc_bits[409] = { 0x0006, }; -static const UINT8 dv_vlc_len[409] = { +static const uint8_t dv_vlc_len[409] = { 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, @@ -130,7 +135,7 @@ static const UINT8 dv_vlc_len[409] = { 4, }; -static const UINT8 dv_vlc_run[409] = { +static const uint8_t dv_vlc_run[409] = { 0, 0, 1, 0, 0, 2, 1, 0, 0, 3, 4, 0, 0, 5, 6, 2, 1, 1, 0, 0, 0, 7, 8, 9, @@ -185,7 +190,7 @@ static const UINT8 dv_vlc_run[409] = { 0, }; -static const UINT8 dv_vlc_level[409] = { +static const uint8_t dv_vlc_level[409] = { 1, 2, 1, 3, 4, 1, 2, 5, 6, 1, 1, 7, 8, 1, 1, 2, 3, 4, 9, 10, 11, 1, 1, 1, @@ -242,7 +247,7 @@ static const UINT8 dv_vlc_level[409] = { /* Specific zigzag scan for 248 idct. NOTE that unlike the specification, we interleave the fields */ -static const UINT8 dv_248_zigzag[64] = { +static const uint8_t dv_248_zigzag[64] = { 0, 8, 1, 9, 16, 24, 2, 10, 17, 25, 32, 40, 48, 56, 33, 41, 18, 26, 3, 11, 4, 12, 19, 27, @@ -254,7 +259,7 @@ static const UINT8 dv_248_zigzag[64] = { }; /* unquant tables (not used directly) */ -static const UINT8 dv_88_areas[64] = { +static const uint8_t dv_88_areas[64] = { 0,0,0,1,1,1,2,2, 0,0,1,1,1,2,2,2, 0,1,1,1,2,2,2,3, @@ -265,7 +270,7 @@ static const UINT8 dv_88_areas[64] = { 2,2,3,3,3,3,3,3, }; -static const UINT8 dv_248_areas[64] = { +static const uint8_t dv_248_areas[64] = { 0,0,1,1,1,2,2,3, 0,0,1,1,2,2,2,3, 0,1,1,2,2,2,3,3, @@ -276,7 +281,7 @@ static const UINT8 dv_248_areas[64] = { 1,2,2,3,3,3,3,3, }; -static UINT8 dv_quant_shifts[22][4] = { +static uint8_t dv_quant_shifts[22][4] = { { 3,3,4,4 }, { 3,3,4,4 }, { 2,3,3,4 }, @@ -301,12 +306,12 @@ static UINT8 dv_quant_shifts[22][4] = { { 0,0,0,0 }, }; -static const UINT8 dv_quant_offset[4] = { 6, 3, 0, 1 }; +static const uint8_t dv_quant_offset[4] = { 6, 3, 0, 1 }; /* NOTE: I prefer hardcoding the positionning of dv blocks, it is simpler :-) */ -static const UINT16 dv_place_420[1620] = { +static const uint16_t dv_place_420[1620] = { 0x0c24, 0x2412, 0x3036, 0x0000, 0x1848, 0x0e24, 0x2612, 0x3236, 0x0200, 0x1a48, 0x1024, 0x2812, 0x3436, 0x0400, 0x1c48, @@ -633,7 +638,334 @@ static const UINT16 dv_place_420[1620] = { 0x0a34, 0x2222, 0x2e46, 0x4610, 0x1658, }; -static const UINT16 dv_place_411[1350] = { +static const uint16_t dv_place_411P[1620] = { + 0x0c24, 0x2710, 0x3334, 0x0000, 0x1848, + 0x0d24, 0x2810, 0x3434, 0x0100, 0x1948, + 0x0e24, 0x2910, 0x3534, 0x0200, 0x1a48, + 0x0f24, 0x2914, 0x3538, 0x0300, 0x1b48, + 0x1024, 0x2814, 0x3438, 0x0400, 0x1c48, + 0x1124, 0x2714, 0x3338, 0x0500, 0x1d48, + 0x1128, 0x2614, 0x3238, 0x0504, 0x1d4c, + 0x1028, 0x2514, 0x3138, 0x0404, 0x1c4c, + 0x0f28, 0x2414, 0x3038, 0x0304, 0x1b4c, + 0x0e28, 0x2418, 0x303c, 0x0204, 0x1a4c, + 0x0d28, 0x2518, 0x313c, 0x0104, 0x194c, + 0x0c28, 0x2618, 0x323c, 0x0004, 0x184c, + 0x0c2c, 0x2718, 0x333c, 0x0008, 0x1850, + 0x0d2c, 0x2818, 0x343c, 0x0108, 0x1950, + 0x0e2c, 0x2918, 0x353c, 0x0208, 0x1a50, + 0x0f2c, 0x291c, 0x3540, 0x0308, 0x1b50, + 0x102c, 0x281c, 0x3440, 0x0408, 0x1c50, + 0x112c, 0x271c, 0x3340, 0x0508, 0x1d50, + 0x1130, 0x261c, 0x3240, 0x050c, 0x1d54, + 0x1030, 0x251c, 0x3140, 0x040c, 0x1c54, + 0x0f30, 0x241c, 0x3040, 0x030c, 0x1b54, + 0x0e30, 0x2420, 0x3044, 0x020c, 0x1a54, + 0x0d30, 0x2520, 0x3144, 0x010c, 0x1954, + 0x0c30, 0x2620, 0x3244, 0x000c, 0x1854, + 0x0c34, 0x2720, 0x3344, 0x0010, 0x1858, + 0x0d34, 0x2820, 0x3444, 0x0110, 0x1a58, + 0x0e34, 0x2920, 0x3544, 0x0210, 0x1c58, + 0x1224, 0x2d10, 0x3934, 0x0600, 0x1e48, + 0x1324, 0x2e10, 0x3a34, 0x0700, 0x1f48, + 0x1424, 0x2f10, 0x3b34, 0x0800, 0x2048, + 0x1524, 0x2f14, 0x3b38, 0x0900, 0x2148, + 0x1624, 0x2e14, 0x3a38, 0x0a00, 0x2248, + 0x1724, 0x2d14, 0x3938, 0x0b00, 0x2348, + 0x1728, 0x2c14, 0x3838, 0x0b04, 0x234c, + 0x1628, 0x2b14, 0x3738, 0x0a04, 0x224c, + 0x1528, 0x2a14, 0x3638, 0x0904, 0x214c, + 0x1428, 0x2a18, 0x363c, 0x0804, 0x204c, + 0x1328, 0x2b18, 0x373c, 0x0704, 0x1f4c, + 0x1228, 0x2c18, 0x383c, 0x0604, 0x1e4c, + 0x122c, 0x2d18, 0x393c, 0x0608, 0x1e50, + 0x132c, 0x2e18, 0x3a3c, 0x0708, 0x1f50, + 0x142c, 0x2f18, 0x3b3c, 0x0808, 0x2050, + 0x152c, 0x2f1c, 0x3b40, 0x0908, 0x2150, + 0x162c, 0x2e1c, 0x3a40, 0x0a08, 0x2250, + 0x172c, 0x2d1c, 0x3940, 0x0b08, 0x2350, + 0x1730, 0x2c1c, 0x3840, 0x0b0c, 0x2354, + 0x1630, 0x2b1c, 0x3740, 0x0a0c, 0x2254, + 0x1530, 0x2a1c, 0x3640, 0x090c, 0x2154, + 0x1430, 0x2a20, 0x3644, 0x080c, 0x2054, + 0x1330, 0x2b20, 0x3744, 0x070c, 0x1f54, + 0x1230, 0x2c20, 0x3844, 0x060c, 0x1e54, + 0x1234, 0x2d20, 0x3944, 0x0610, 0x1e58, + 0x1334, 0x2e20, 0x3a44, 0x0710, 0x2058, + 0x1434, 0x2f20, 0x3b44, 0x0810, 0x2258, + 0x1824, 0x3310, 0x3f34, 0x0c00, 0x2448, + 0x1924, 0x3410, 0x4034, 0x0d00, 0x2548, + 0x1a24, 0x3510, 0x4134, 0x0e00, 0x2648, + 0x1b24, 0x3514, 0x4138, 0x0f00, 0x2748, + 0x1c24, 0x3414, 0x4038, 0x1000, 0x2848, + 0x1d24, 0x3314, 0x3f38, 0x1100, 0x2948, + 0x1d28, 0x3214, 0x3e38, 0x1104, 0x294c, + 0x1c28, 0x3114, 0x3d38, 0x1004, 0x284c, + 0x1b28, 0x3014, 0x3c38, 0x0f04, 0x274c, + 0x1a28, 0x3018, 0x3c3c, 0x0e04, 0x264c, + 0x1928, 0x3118, 0x3d3c, 0x0d04, 0x254c, + 0x1828, 0x3218, 0x3e3c, 0x0c04, 0x244c, + 0x182c, 0x3318, 0x3f3c, 0x0c08, 0x2450, + 0x192c, 0x3418, 0x403c, 0x0d08, 0x2550, + 0x1a2c, 0x3518, 0x413c, 0x0e08, 0x2650, + 0x1b2c, 0x351c, 0x4140, 0x0f08, 0x2750, + 0x1c2c, 0x341c, 0x4040, 0x1008, 0x2850, + 0x1d2c, 0x331c, 0x3f40, 0x1108, 0x2950, + 0x1d30, 0x321c, 0x3e40, 0x110c, 0x2954, + 0x1c30, 0x311c, 0x3d40, 0x100c, 0x2854, + 0x1b30, 0x301c, 0x3c40, 0x0f0c, 0x2754, + 0x1a30, 0x3020, 0x3c44, 0x0e0c, 0x2654, + 0x1930, 0x3120, 0x3d44, 0x0d0c, 0x2554, + 0x1830, 0x3220, 0x3e44, 0x0c0c, 0x2454, + 0x1834, 0x3320, 0x3f44, 0x0c10, 0x2458, + 0x1934, 0x3420, 0x4044, 0x0d10, 0x2658, + 0x1a34, 0x3520, 0x4144, 0x0e10, 0x2858, + 0x1e24, 0x3910, 0x4534, 0x1200, 0x2a48, + 0x1f24, 0x3a10, 0x4634, 0x1300, 0x2b48, + 0x2024, 0x3b10, 0x4734, 0x1400, 0x2c48, + 0x2124, 0x3b14, 0x4738, 0x1500, 0x2d48, + 0x2224, 0x3a14, 0x4638, 0x1600, 0x2e48, + 0x2324, 0x3914, 0x4538, 0x1700, 0x2f48, + 0x2328, 0x3814, 0x4438, 0x1704, 0x2f4c, + 0x2228, 0x3714, 0x4338, 0x1604, 0x2e4c, + 0x2128, 0x3614, 0x4238, 0x1504, 0x2d4c, + 0x2028, 0x3618, 0x423c, 0x1404, 0x2c4c, + 0x1f28, 0x3718, 0x433c, 0x1304, 0x2b4c, + 0x1e28, 0x3818, 0x443c, 0x1204, 0x2a4c, + 0x1e2c, 0x3918, 0x453c, 0x1208, 0x2a50, + 0x1f2c, 0x3a18, 0x463c, 0x1308, 0x2b50, + 0x202c, 0x3b18, 0x473c, 0x1408, 0x2c50, + 0x212c, 0x3b1c, 0x4740, 0x1508, 0x2d50, + 0x222c, 0x3a1c, 0x4640, 0x1608, 0x2e50, + 0x232c, 0x391c, 0x4540, 0x1708, 0x2f50, + 0x2330, 0x381c, 0x4440, 0x170c, 0x2f54, + 0x2230, 0x371c, 0x4340, 0x160c, 0x2e54, + 0x2130, 0x361c, 0x4240, 0x150c, 0x2d54, + 0x2030, 0x3620, 0x4244, 0x140c, 0x2c54, + 0x1f30, 0x3720, 0x4344, 0x130c, 0x2b54, + 0x1e30, 0x3820, 0x4444, 0x120c, 0x2a54, + 0x1e34, 0x3920, 0x4544, 0x1210, 0x2a58, + 0x1f34, 0x3a20, 0x4644, 0x1310, 0x2c58, + 0x2034, 0x3b20, 0x4744, 0x1410, 0x2e58, + 0x2424, 0x3f10, 0x0334, 0x1800, 0x3048, + 0x2524, 0x4010, 0x0434, 0x1900, 0x3148, + 0x2624, 0x4110, 0x0534, 0x1a00, 0x3248, + 0x2724, 0x4114, 0x0538, 0x1b00, 0x3348, + 0x2824, 0x4014, 0x0438, 0x1c00, 0x3448, + 0x2924, 0x3f14, 0x0338, 0x1d00, 0x3548, + 0x2928, 0x3e14, 0x0238, 0x1d04, 0x354c, + 0x2828, 0x3d14, 0x0138, 0x1c04, 0x344c, + 0x2728, 0x3c14, 0x0038, 0x1b04, 0x334c, + 0x2628, 0x3c18, 0x003c, 0x1a04, 0x324c, + 0x2528, 0x3d18, 0x013c, 0x1904, 0x314c, + 0x2428, 0x3e18, 0x023c, 0x1804, 0x304c, + 0x242c, 0x3f18, 0x033c, 0x1808, 0x3050, + 0x252c, 0x4018, 0x043c, 0x1908, 0x3150, + 0x262c, 0x4118, 0x053c, 0x1a08, 0x3250, + 0x272c, 0x411c, 0x0540, 0x1b08, 0x3350, + 0x282c, 0x401c, 0x0440, 0x1c08, 0x3450, + 0x292c, 0x3f1c, 0x0340, 0x1d08, 0x3550, + 0x2930, 0x3e1c, 0x0240, 0x1d0c, 0x3554, + 0x2830, 0x3d1c, 0x0140, 0x1c0c, 0x3454, + 0x2730, 0x3c1c, 0x0040, 0x1b0c, 0x3354, + 0x2630, 0x3c20, 0x0044, 0x1a0c, 0x3254, + 0x2530, 0x3d20, 0x0144, 0x190c, 0x3154, + 0x2430, 0x3e20, 0x0244, 0x180c, 0x3054, + 0x2434, 0x3f20, 0x0344, 0x1810, 0x3058, + 0x2534, 0x4020, 0x0444, 0x1910, 0x3258, + 0x2634, 0x4120, 0x0544, 0x1a10, 0x3458, + 0x2a24, 0x4510, 0x0934, 0x1e00, 0x3648, + 0x2b24, 0x4610, 0x0a34, 0x1f00, 0x3748, + 0x2c24, 0x4710, 0x0b34, 0x2000, 0x3848, + 0x2d24, 0x4714, 0x0b38, 0x2100, 0x3948, + 0x2e24, 0x4614, 0x0a38, 0x2200, 0x3a48, + 0x2f24, 0x4514, 0x0938, 0x2300, 0x3b48, + 0x2f28, 0x4414, 0x0838, 0x2304, 0x3b4c, + 0x2e28, 0x4314, 0x0738, 0x2204, 0x3a4c, + 0x2d28, 0x4214, 0x0638, 0x2104, 0x394c, + 0x2c28, 0x4218, 0x063c, 0x2004, 0x384c, + 0x2b28, 0x4318, 0x073c, 0x1f04, 0x374c, + 0x2a28, 0x4418, 0x083c, 0x1e04, 0x364c, + 0x2a2c, 0x4518, 0x093c, 0x1e08, 0x3650, + 0x2b2c, 0x4618, 0x0a3c, 0x1f08, 0x3750, + 0x2c2c, 0x4718, 0x0b3c, 0x2008, 0x3850, + 0x2d2c, 0x471c, 0x0b40, 0x2108, 0x3950, + 0x2e2c, 0x461c, 0x0a40, 0x2208, 0x3a50, + 0x2f2c, 0x451c, 0x0940, 0x2308, 0x3b50, + 0x2f30, 0x441c, 0x0840, 0x230c, 0x3b54, + 0x2e30, 0x431c, 0x0740, 0x220c, 0x3a54, + 0x2d30, 0x421c, 0x0640, 0x210c, 0x3954, + 0x2c30, 0x4220, 0x0644, 0x200c, 0x3854, + 0x2b30, 0x4320, 0x0744, 0x1f0c, 0x3754, + 0x2a30, 0x4420, 0x0844, 0x1e0c, 0x3654, + 0x2a34, 0x4520, 0x0944, 0x1e10, 0x3658, + 0x2b34, 0x4620, 0x0a44, 0x1f10, 0x3858, + 0x2c34, 0x4720, 0x0b44, 0x2010, 0x3a58, + 0x3024, 0x0310, 0x0f34, 0x2400, 0x3c48, + 0x3124, 0x0410, 0x1034, 0x2500, 0x3d48, + 0x3224, 0x0510, 0x1134, 0x2600, 0x3e48, + 0x3324, 0x0514, 0x1138, 0x2700, 0x3f48, + 0x3424, 0x0414, 0x1038, 0x2800, 0x4048, + 0x3524, 0x0314, 0x0f38, 0x2900, 0x4148, + 0x3528, 0x0214, 0x0e38, 0x2904, 0x414c, + 0x3428, 0x0114, 0x0d38, 0x2804, 0x404c, + 0x3328, 0x0014, 0x0c38, 0x2704, 0x3f4c, + 0x3228, 0x0018, 0x0c3c, 0x2604, 0x3e4c, + 0x3128, 0x0118, 0x0d3c, 0x2504, 0x3d4c, + 0x3028, 0x0218, 0x0e3c, 0x2404, 0x3c4c, + 0x302c, 0x0318, 0x0f3c, 0x2408, 0x3c50, + 0x312c, 0x0418, 0x103c, 0x2508, 0x3d50, + 0x322c, 0x0518, 0x113c, 0x2608, 0x3e50, + 0x332c, 0x051c, 0x1140, 0x2708, 0x3f50, + 0x342c, 0x041c, 0x1040, 0x2808, 0x4050, + 0x352c, 0x031c, 0x0f40, 0x2908, 0x4150, + 0x3530, 0x021c, 0x0e40, 0x290c, 0x4154, + 0x3430, 0x011c, 0x0d40, 0x280c, 0x4054, + 0x3330, 0x001c, 0x0c40, 0x270c, 0x3f54, + 0x3230, 0x0020, 0x0c44, 0x260c, 0x3e54, + 0x3130, 0x0120, 0x0d44, 0x250c, 0x3d54, + 0x3030, 0x0220, 0x0e44, 0x240c, 0x3c54, + 0x3034, 0x0320, 0x0f44, 0x2410, 0x3c58, + 0x3134, 0x0420, 0x1044, 0x2510, 0x3e58, + 0x3234, 0x0520, 0x1144, 0x2610, 0x4058, + 0x3624, 0x0910, 0x1534, 0x2a00, 0x4248, + 0x3724, 0x0a10, 0x1634, 0x2b00, 0x4348, + 0x3824, 0x0b10, 0x1734, 0x2c00, 0x4448, + 0x3924, 0x0b14, 0x1738, 0x2d00, 0x4548, + 0x3a24, 0x0a14, 0x1638, 0x2e00, 0x4648, + 0x3b24, 0x0914, 0x1538, 0x2f00, 0x4748, + 0x3b28, 0x0814, 0x1438, 0x2f04, 0x474c, + 0x3a28, 0x0714, 0x1338, 0x2e04, 0x464c, + 0x3928, 0x0614, 0x1238, 0x2d04, 0x454c, + 0x3828, 0x0618, 0x123c, 0x2c04, 0x444c, + 0x3728, 0x0718, 0x133c, 0x2b04, 0x434c, + 0x3628, 0x0818, 0x143c, 0x2a04, 0x424c, + 0x362c, 0x0918, 0x153c, 0x2a08, 0x4250, + 0x372c, 0x0a18, 0x163c, 0x2b08, 0x4350, + 0x382c, 0x0b18, 0x173c, 0x2c08, 0x4450, + 0x392c, 0x0b1c, 0x1740, 0x2d08, 0x4550, + 0x3a2c, 0x0a1c, 0x1640, 0x2e08, 0x4650, + 0x3b2c, 0x091c, 0x1540, 0x2f08, 0x4750, + 0x3b30, 0x081c, 0x1440, 0x2f0c, 0x4754, + 0x3a30, 0x071c, 0x1340, 0x2e0c, 0x4654, + 0x3930, 0x061c, 0x1240, 0x2d0c, 0x4554, + 0x3830, 0x0620, 0x1244, 0x2c0c, 0x4454, + 0x3730, 0x0720, 0x1344, 0x2b0c, 0x4354, + 0x3630, 0x0820, 0x1444, 0x2a0c, 0x4254, + 0x3634, 0x0920, 0x1544, 0x2a10, 0x4258, + 0x3734, 0x0a20, 0x1644, 0x2b10, 0x4458, + 0x3834, 0x0b20, 0x1744, 0x2c10, 0x4658, + 0x3c24, 0x0f10, 0x1b34, 0x3000, 0x0048, + 0x3d24, 0x1010, 0x1c34, 0x3100, 0x0148, + 0x3e24, 0x1110, 0x1d34, 0x3200, 0x0248, + 0x3f24, 0x1114, 0x1d38, 0x3300, 0x0348, + 0x4024, 0x1014, 0x1c38, 0x3400, 0x0448, + 0x4124, 0x0f14, 0x1b38, 0x3500, 0x0548, + 0x4128, 0x0e14, 0x1a38, 0x3504, 0x054c, + 0x4028, 0x0d14, 0x1938, 0x3404, 0x044c, + 0x3f28, 0x0c14, 0x1838, 0x3304, 0x034c, + 0x3e28, 0x0c18, 0x183c, 0x3204, 0x024c, + 0x3d28, 0x0d18, 0x193c, 0x3104, 0x014c, + 0x3c28, 0x0e18, 0x1a3c, 0x3004, 0x004c, + 0x3c2c, 0x0f18, 0x1b3c, 0x3008, 0x0050, + 0x3d2c, 0x1018, 0x1c3c, 0x3108, 0x0150, + 0x3e2c, 0x1118, 0x1d3c, 0x3208, 0x0250, + 0x3f2c, 0x111c, 0x1d40, 0x3308, 0x0350, + 0x402c, 0x101c, 0x1c40, 0x3408, 0x0450, + 0x412c, 0x0f1c, 0x1b40, 0x3508, 0x0550, + 0x4130, 0x0e1c, 0x1a40, 0x350c, 0x0554, + 0x4030, 0x0d1c, 0x1940, 0x340c, 0x0454, + 0x3f30, 0x0c1c, 0x1840, 0x330c, 0x0354, + 0x3e30, 0x0c20, 0x1844, 0x320c, 0x0254, + 0x3d30, 0x0d20, 0x1944, 0x310c, 0x0154, + 0x3c30, 0x0e20, 0x1a44, 0x300c, 0x0054, + 0x3c34, 0x0f20, 0x1b44, 0x3010, 0x0058, + 0x3d34, 0x1020, 0x1c44, 0x3110, 0x0258, + 0x3e34, 0x1120, 0x1d44, 0x3210, 0x0458, + 0x4224, 0x1510, 0x2134, 0x3600, 0x0648, + 0x4324, 0x1610, 0x2234, 0x3700, 0x0748, + 0x4424, 0x1710, 0x2334, 0x3800, 0x0848, + 0x4524, 0x1714, 0x2338, 0x3900, 0x0948, + 0x4624, 0x1614, 0x2238, 0x3a00, 0x0a48, + 0x4724, 0x1514, 0x2138, 0x3b00, 0x0b48, + 0x4728, 0x1414, 0x2038, 0x3b04, 0x0b4c, + 0x4628, 0x1314, 0x1f38, 0x3a04, 0x0a4c, + 0x4528, 0x1214, 0x1e38, 0x3904, 0x094c, + 0x4428, 0x1218, 0x1e3c, 0x3804, 0x084c, + 0x4328, 0x1318, 0x1f3c, 0x3704, 0x074c, + 0x4228, 0x1418, 0x203c, 0x3604, 0x064c, + 0x422c, 0x1518, 0x213c, 0x3608, 0x0650, + 0x432c, 0x1618, 0x223c, 0x3708, 0x0750, + 0x442c, 0x1718, 0x233c, 0x3808, 0x0850, + 0x452c, 0x171c, 0x2340, 0x3908, 0x0950, + 0x462c, 0x161c, 0x2240, 0x3a08, 0x0a50, + 0x472c, 0x151c, 0x2140, 0x3b08, 0x0b50, + 0x4730, 0x141c, 0x2040, 0x3b0c, 0x0b54, + 0x4630, 0x131c, 0x1f40, 0x3a0c, 0x0a54, + 0x4530, 0x121c, 0x1e40, 0x390c, 0x0954, + 0x4430, 0x1220, 0x1e44, 0x380c, 0x0854, + 0x4330, 0x1320, 0x1f44, 0x370c, 0x0754, + 0x4230, 0x1420, 0x2044, 0x360c, 0x0654, + 0x4234, 0x1520, 0x2144, 0x3610, 0x0658, + 0x4334, 0x1620, 0x2244, 0x3710, 0x0858, + 0x4434, 0x1720, 0x2344, 0x3810, 0x0a58, + 0x0024, 0x1b10, 0x2734, 0x3c00, 0x0c48, + 0x0124, 0x1c10, 0x2834, 0x3d00, 0x0d48, + 0x0224, 0x1d10, 0x2934, 0x3e00, 0x0e48, + 0x0324, 0x1d14, 0x2938, 0x3f00, 0x0f48, + 0x0424, 0x1c14, 0x2838, 0x4000, 0x1048, + 0x0524, 0x1b14, 0x2738, 0x4100, 0x1148, + 0x0528, 0x1a14, 0x2638, 0x4104, 0x114c, + 0x0428, 0x1914, 0x2538, 0x4004, 0x104c, + 0x0328, 0x1814, 0x2438, 0x3f04, 0x0f4c, + 0x0228, 0x1818, 0x243c, 0x3e04, 0x0e4c, + 0x0128, 0x1918, 0x253c, 0x3d04, 0x0d4c, + 0x0028, 0x1a18, 0x263c, 0x3c04, 0x0c4c, + 0x002c, 0x1b18, 0x273c, 0x3c08, 0x0c50, + 0x012c, 0x1c18, 0x283c, 0x3d08, 0x0d50, + 0x022c, 0x1d18, 0x293c, 0x3e08, 0x0e50, + 0x032c, 0x1d1c, 0x2940, 0x3f08, 0x0f50, + 0x042c, 0x1c1c, 0x2840, 0x4008, 0x1050, + 0x052c, 0x1b1c, 0x2740, 0x4108, 0x1150, + 0x0530, 0x1a1c, 0x2640, 0x410c, 0x1154, + 0x0430, 0x191c, 0x2540, 0x400c, 0x1054, + 0x0330, 0x181c, 0x2440, 0x3f0c, 0x0f54, + 0x0230, 0x1820, 0x2444, 0x3e0c, 0x0e54, + 0x0130, 0x1920, 0x2544, 0x3d0c, 0x0d54, + 0x0030, 0x1a20, 0x2644, 0x3c0c, 0x0c54, + 0x0034, 0x1b20, 0x2744, 0x3c10, 0x0c58, + 0x0134, 0x1c20, 0x2844, 0x3d10, 0x0e58, + 0x0234, 0x1d20, 0x2944, 0x3e10, 0x1058, + 0x0624, 0x2110, 0x2d34, 0x4200, 0x1248, + 0x0724, 0x2210, 0x2e34, 0x4300, 0x1348, + 0x0824, 0x2310, 0x2f34, 0x4400, 0x1448, + 0x0924, 0x2314, 0x2f38, 0x4500, 0x1548, + 0x0a24, 0x2214, 0x2e38, 0x4600, 0x1648, + 0x0b24, 0x2114, 0x2d38, 0x4700, 0x1748, + 0x0b28, 0x2014, 0x2c38, 0x4704, 0x174c, + 0x0a28, 0x1f14, 0x2b38, 0x4604, 0x164c, + 0x0928, 0x1e14, 0x2a38, 0x4504, 0x154c, + 0x0828, 0x1e18, 0x2a3c, 0x4404, 0x144c, + 0x0728, 0x1f18, 0x2b3c, 0x4304, 0x134c, + 0x0628, 0x2018, 0x2c3c, 0x4204, 0x124c, + 0x062c, 0x2118, 0x2d3c, 0x4208, 0x1250, + 0x072c, 0x2218, 0x2e3c, 0x4308, 0x1350, + 0x082c, 0x2318, 0x2f3c, 0x4408, 0x1450, + 0x092c, 0x231c, 0x2f40, 0x4508, 0x1550, + 0x0a2c, 0x221c, 0x2e40, 0x4608, 0x1650, + 0x0b2c, 0x211c, 0x2d40, 0x4708, 0x1750, + 0x0b30, 0x201c, 0x2c40, 0x470c, 0x1754, + 0x0a30, 0x1f1c, 0x2b40, 0x460c, 0x1654, + 0x0930, 0x1e1c, 0x2a40, 0x450c, 0x1554, + 0x0830, 0x1e20, 0x2a44, 0x440c, 0x1454, + 0x0730, 0x1f20, 0x2b44, 0x430c, 0x1354, + 0x0630, 0x2020, 0x2c44, 0x420c, 0x1254, + 0x0634, 0x2120, 0x2d44, 0x4210, 0x1258, + 0x0734, 0x2220, 0x2e44, 0x4310, 0x1458, + 0x0834, 0x2320, 0x2f44, 0x4410, 0x1658, +}; + +static const uint16_t dv_place_411[1350] = { 0x0c24, 0x2710, 0x3334, 0x0000, 0x1848, 0x0d24, 0x2810, 0x3434, 0x0100, 0x1948, 0x0e24, 0x2910, 0x3534, 0x0200, 0x1a48, @@ -906,7 +1238,7 @@ static const UINT16 dv_place_411[1350] = { 0x0834, 0x2320, 0x2f44, 0x3810, 0x1658, }; -static const UINT16 dv_place_audio60[10][9] = { +static const uint16_t dv_place_audio60[10][9] = { { 0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */ { 6, 36, 66, 26, 56, 86, 16, 46, 76 }, { 12, 42, 72, 2, 32, 62, 22, 52, 82 }, @@ -920,7 +1252,7 @@ static const UINT16 dv_place_audio60[10][9] = { { 25, 55, 85, 15, 45, 75, 5, 35, 65 }, }; -static const UINT16 dv_place_audio50[12][9] = { +static const uint16_t dv_place_audio50[12][9] = { { 0, 36, 72, 26, 62, 98, 16, 52, 88}, /* 1st channel */ { 6, 42, 78, 32, 68, 104, 22, 58, 94}, { 12, 48, 84, 2, 38, 74, 28, 64, 100}, diff --git a/src/libffmpeg/libavcodec/error_resilience.c b/src/libffmpeg/libavcodec/error_resilience.c index 3cb8d40bc..77488cd58 100644 --- a/src/libffmpeg/libavcodec/error_resilience.c +++ b/src/libffmpeg/libavcodec/error_resilience.c @@ -17,10 +17,16 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file error_resilience.c + * Error resilience / concealment. + */ #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" +#include "common.h" /** * replaces the current MB with a flat dc only version. @@ -54,7 +60,7 @@ static void put_dc(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t } } -static void filter181(INT16 *data, int width, int height, int stride){ +static void filter181(int16_t *data, int width, int height, int stride){ int x,y; /* horizontal filter */ @@ -95,7 +101,7 @@ static void filter181(INT16 *data, int width, int height, int stride){ * @param w width in 8 pixel blocks * @param h height in 8 pixel blocks */ -static void guess_dc(MpegEncContext *s, INT16 *dc, int w, int h, int stride, int is_luma){ +static void guess_dc(MpegEncContext *s, int16_t *dc, int w, int h, int stride, int is_luma){ int b_x, b_y; for(b_y=0; b_y<h; b_y++){ @@ -103,7 +109,7 @@ static void guess_dc(MpegEncContext *s, INT16 *dc, int w, int h, int stride, int int color[4]={1024,1024,1024,1024}; int distance[4]={9999,9999,9999,9999}; int mb_index, error, j; - INT64 guess, weight_sum; + int64_t guess, weight_sum; mb_index= (b_x>>is_luma) + (b_y>>is_luma)*s->mb_width; @@ -163,8 +169,8 @@ static void guess_dc(MpegEncContext *s, INT16 *dc, int w, int h, int stride, int weight_sum=0; guess=0; for(j=0; j<4; j++){ - INT64 weight= 256*256*256*16/distance[j]; - guess+= weight*(INT64)color[j]; + int64_t weight= 256*256*256*16/distance[j]; + guess+= weight*(int64_t)color[j]; weight_sum+= weight; } guess= (guess + weight_sum/2) / weight_sum; @@ -179,9 +185,9 @@ static void guess_dc(MpegEncContext *s, INT16 *dc, int w, int h, int stride, int * @param w width in 8 pixel blocks * @param h height in 8 pixel blocks */ -static void h_block_filter(MpegEncContext *s, UINT8 *dst, int w, int h, int stride, int is_luma){ +static void h_block_filter(MpegEncContext *s, uint8_t *dst, int w, int h, int stride, int is_luma){ int b_x, b_y; - UINT8 *cm = cropTbl + MAX_NEG_CROP; + uint8_t *cm = cropTbl + MAX_NEG_CROP; for(b_y=0; b_y<h; b_y++){ for(b_x=0; b_x<w-1; b_x++){ @@ -193,8 +199,8 @@ static void h_block_filter(MpegEncContext *s, UINT8 *dst, int w, int h, int stri int left_damage = left_status&(DC_ERROR|AC_ERROR|MV_ERROR); int right_damage= right_status&(DC_ERROR|AC_ERROR|MV_ERROR); int offset= b_x*8 + b_y*stride*8; - INT16 *left_mv= s->motion_val[s->block_wrap[0]*((b_y<<(1-is_luma)) + 1) + ( b_x <<(1-is_luma))]; - INT16 *right_mv= s->motion_val[s->block_wrap[0]*((b_y<<(1-is_luma)) + 1) + ((b_x+1)<<(1-is_luma))]; + int16_t *left_mv= s->motion_val[s->block_wrap[0]*((b_y<<(1-is_luma)) + 1) + ( b_x <<(1-is_luma))]; + int16_t *right_mv= s->motion_val[s->block_wrap[0]*((b_y<<(1-is_luma)) + 1) + ((b_x+1)<<(1-is_luma))]; if(!(left_damage||right_damage)) continue; // both undamaged @@ -239,9 +245,9 @@ static void h_block_filter(MpegEncContext *s, UINT8 *dst, int w, int h, int stri * @param w width in 8 pixel blocks * @param h height in 8 pixel blocks */ -static void v_block_filter(MpegEncContext *s, UINT8 *dst, int w, int h, int stride, int is_luma){ +static void v_block_filter(MpegEncContext *s, uint8_t *dst, int w, int h, int stride, int is_luma){ int b_x, b_y; - UINT8 *cm = cropTbl + MAX_NEG_CROP; + uint8_t *cm = cropTbl + MAX_NEG_CROP; for(b_y=0; b_y<h-1; b_y++){ for(b_x=0; b_x<w; b_x++){ @@ -253,8 +259,8 @@ static void v_block_filter(MpegEncContext *s, UINT8 *dst, int w, int h, int stri int top_damage = top_status&(DC_ERROR|AC_ERROR|MV_ERROR); int bottom_damage= bottom_status&(DC_ERROR|AC_ERROR|MV_ERROR); int offset= b_x*8 + b_y*stride*8; - INT16 *top_mv= s->motion_val[s->block_wrap[0]*(( b_y <<(1-is_luma)) + 1) + (b_x<<(1-is_luma))]; - INT16 *bottom_mv= s->motion_val[s->block_wrap[0]*(((b_y+1)<<(1-is_luma)) + 1) + (b_x<<(1-is_luma))]; + int16_t *top_mv= s->motion_val[s->block_wrap[0]*(( b_y <<(1-is_luma)) + 1) + (b_x<<(1-is_luma))]; + int16_t *bottom_mv= s->motion_val[s->block_wrap[0]*(((b_y+1)<<(1-is_luma)) + 1) + (b_x<<(1-is_luma))]; if(!(top_damage||bottom_damage)) continue; // both undamaged @@ -295,7 +301,7 @@ static void v_block_filter(MpegEncContext *s, UINT8 *dst, int w, int h, int stri } static void guess_mv(MpegEncContext *s){ - UINT8 fixed[s->mb_num]; + uint8_t fixed[s->mb_num]; #define MV_FROZEN 3 #define MV_CHANGED 2 #define MV_UNCHANGED 1 @@ -464,7 +470,7 @@ int score_sum=0; s->mb_y= mb_y; for(j=0; j<pred_count; j++){ int score=0; - UINT8 *src= s->current_picture.data[0] + mb_x*16 + mb_y*16*s->linesize; + uint8_t *src= s->current_picture.data[0] + mb_x*16 + mb_y*16*s->linesize; s->motion_val[mot_index][0]= s->mv[0][0][0]= mv_predictor[j][0]; s->motion_val[mot_index][1]= s->mv[0][0][1]= mv_predictor[j][1]; @@ -529,7 +535,7 @@ score_sum+= best_score; static int is_intra_more_likely(MpegEncContext *s){ int is_intra_likely, i, j, undamaged_count, skip_amount, mb_x, mb_y; - if(s->last_picture.data[0]==NULL) return 1; //no previous frame available -> use spatial prediction + if(s->last_picture_ptr==NULL) return 1; //no previous frame available -> use spatial prediction undamaged_count=0; for(i=0; i<s->mb_num; i++){ @@ -558,8 +564,8 @@ static int is_intra_more_likely(MpegEncContext *s){ if((j%skip_amount) != 0) continue; //skip a few to speed things up if(s->pict_type==I_TYPE){ - UINT8 *mb_ptr = s->current_picture.data[0] + mb_x*16 + mb_y*16*s->linesize; - UINT8 *last_mb_ptr= s->last_picture.data [0] + mb_x*16 + mb_y*16*s->linesize; + uint8_t *mb_ptr = s->current_picture.data[0] + mb_x*16 + mb_y*16*s->linesize; + uint8_t *last_mb_ptr= s->last_picture.data [0] + mb_x*16 + mb_y*16*s->linesize; is_intra_likely += s->dsp.pix_abs16x16(last_mb_ptr, mb_ptr , s->linesize); is_intra_likely -= s->dsp.pix_abs16x16(last_mb_ptr, last_mb_ptr+s->linesize*16, s->linesize); @@ -575,12 +581,91 @@ static int is_intra_more_likely(MpegEncContext *s){ return is_intra_likely > 0; } -void ff_error_resilience(MpegEncContext *s){ +void ff_er_frame_start(MpegEncContext *s){ + if(!s->error_resilience) return; + + memset(s->error_status_table, MV_ERROR|AC_ERROR|DC_ERROR|VP_START|AC_END|DC_END|MV_END, s->mb_num*sizeof(uint8_t)); +} + +/** + * adds a slice. + * @param endx x component of the last macroblock, can be -1 for the last of the previous line + * @param status the status at the end (MV_END, AC_ERROR, ...), it is assumed that no earlier end or + * error of the same type occured + */ +void ff_er_add_slice(MpegEncContext *s, int startx, int starty, int endx, int endy, int status){ + const int start_xy= clip(startx + starty * s->mb_width, 0, s->mb_num-1); + const int end_xy = clip(endx + endy * s->mb_width, 0, s->mb_num); + const int mb_count= end_xy - start_xy; + int mask= -1; + + if(!s->error_resilience) return; + + mask &= ~VP_START; + if(status & (AC_ERROR|AC_END)) mask &= ~(AC_ERROR|AC_END); + if(status & (DC_ERROR|DC_END)) mask &= ~(DC_ERROR|DC_END); + if(status & (MV_ERROR|MV_END)) mask &= ~(MV_ERROR|MV_END); + + if(mask == ~0x7F){ + memset(&s->error_status_table[start_xy], 0, mb_count * sizeof(uint8_t)); + }else{ + int i; + for(i=start_xy; i<end_xy; i++){ + s->error_status_table[i] &= mask; + } + } + + s->error_status_table[start_xy] |= VP_START; + + if(end_xy < s->mb_num){ + s->error_status_table[end_xy] &= mask; + s->error_status_table[end_xy] |= status; + } +} + +void ff_er_frame_end(MpegEncContext *s){ int i, mb_x, mb_y, error, error_type; int distance; int threshold_part[4]= {100,100,100}; int threshold= 50; int is_intra_likely; + int num_end_markers=0; + + if(!s->error_resilience) return; + + error=0; + for(i=0; i<s->mb_num; i++){ + int status= s->error_status_table[i]; + + if(status==0) continue; + + if(status&(DC_ERROR|AC_ERROR|MV_ERROR)) + error=1; + if(status&VP_START){ + if(num_end_markers) + error=1; + num_end_markers=3; + } + if(status&AC_END) + num_end_markers--; + if(status&DC_END) + num_end_markers--; + if(status&MV_END) + num_end_markers--; + } + if(num_end_markers==0 && error==0) + return; + + fprintf(stderr, "concealing errors\n"); + + if(s->avctx->debug&FF_DEBUG_ER){ + for(i=0; i<s->mb_num; i++){ + int status= s->error_status_table[i]; + + if(i%s->mb_width == 0) printf("\n"); + printf("%2X ", status); + } + } #if 1 /* handle overlapping slices */ @@ -795,8 +880,8 @@ void ff_error_resilience(MpegEncContext *s){ for(mb_y=0; mb_y<s->mb_height; mb_y++){ for(mb_x=0; mb_x<s->mb_width; mb_x++){ int dc, dcu, dcv, y, n; - INT16 *dc_ptr; - UINT8 *dest_y, *dest_cb, *dest_cr; + int16_t *dc_ptr; + uint8_t *dest_y, *dest_cb, *dest_cr; i++; error= s->error_status_table[i]; @@ -846,7 +931,7 @@ void ff_error_resilience(MpegEncContext *s){ i= -1; for(mb_y=0; mb_y<s->mb_height; mb_y++){ for(mb_x=0; mb_x<s->mb_width; mb_x++){ - UINT8 *dest_y, *dest_cb, *dest_cr; + uint8_t *dest_y, *dest_cb, *dest_cr; i++; error= s->error_status_table[i]; diff --git a/src/libffmpeg/libavcodec/eval.c b/src/libffmpeg/libavcodec/eval.c index bcaf4f59b..28a492cd4 100644 --- a/src/libffmpeg/libavcodec/eval.c +++ b/src/libffmpeg/libavcodec/eval.c @@ -19,10 +19,16 @@ * */ - /* +/** + * @file eval.c + * simple arithmetic expression evaluator. + * * see http://joe.hotchkiss.com/programming/eval/eval.html */ +#include "avcodec.h" +#include "mpegvideo.h" + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -43,9 +49,9 @@ typedef struct Parser{ int stack_index; char *s; double *const_value; - char **const_name; // NULL terminated + const char **const_name; // NULL terminated double (**func1)(void *, double a); // NULL terminated - char **func1_name; // NULL terminated + const char **func1_name; // NULL terminated double (**func2)(void *, double a, double b); // NULL terminated char **func2_name; // NULL terminated void *opaque; @@ -71,7 +77,7 @@ static double pop(Parser *p){ return p->stack[ --p->stack_index ]; } -static int strmatch(char *s, char *prefix){ +static int strmatch(const char *s, const char *prefix){ int i; for(i=0; prefix[i]; i++){ if(prefix[i] != s[i]) return 0; @@ -126,7 +132,7 @@ static void evalPrimary(Parser *p){ else if( strmatch(next, "log" ) ) d= log(d); else if( strmatch(next, "squish") ) d= 1/(1+exp(4*d)); else if( strmatch(next, "gauss" ) ) d= exp(-d*d/2)/sqrt(2*M_PI); - else if( strmatch(next, "abs" ) ) d= abs(d); + else if( strmatch(next, "abs" ) ) d= fabs(d); else if( strmatch(next, "max" ) ) d= d > d2 ? d : d2; else if( strmatch(next, "min" ) ) d= d < d2 ? d : d2; else if( strmatch(next, "gt" ) ) d= d > d2 ? 1.0 : 0.0; @@ -228,8 +234,8 @@ static void evalExpression(Parser *p){ } } -double ff_eval(char *s, double *const_value, char **const_name, - double (**func1)(void *, double), char **func1_name, +double ff_eval(char *s, double *const_value, const char **const_name, + double (**func1)(void *, double), const char **func1_name, double (**func2)(void *, double, double), char **func2_name, void *opaque){ Parser p; diff --git a/src/libffmpeg/libavcodec/fdctref.c b/src/libffmpeg/libavcodec/fdctref.c index ae376f794..d728727ce 100644 --- a/src/libffmpeg/libavcodec/fdctref.c +++ b/src/libffmpeg/libavcodec/fdctref.c @@ -1,4 +1,7 @@ -/* fdctref.c, forward discrete cosine transform, double precision */ +/** + * @file fdctref.c + * forward discrete cosine transform, double precision. + */ /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */ diff --git a/src/libffmpeg/libavcodec/fft.c b/src/libffmpeg/libavcodec/fft.c index 65eb575f3..3b5244a07 100644 --- a/src/libffmpeg/libavcodec/fft.c +++ b/src/libffmpeg/libavcodec/fft.c @@ -16,6 +16,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file fft.c + * FFT/IFFT transforms. + */ + #include "dsputil.h" /** diff --git a/src/libffmpeg/libavcodec/h263.c b/src/libffmpeg/libavcodec/h263.c index f50920011..a054ebfb0 100644 --- a/src/libffmpeg/libavcodec/h263.c +++ b/src/libffmpeg/libavcodec/h263.c @@ -25,8 +25,7 @@ /** * @file h263.c - * @brief h263/mpeg4 codec - * + * h263/mpeg4 codec. */ //#define DEBUG @@ -36,7 +35,9 @@ #include "mpegvideo.h" #include "h263data.h" #include "mpeg4data.h" -#include "xineutils.h" + +//#undef NDEBUG +//#include <assert.h> #if 1 #define PRINT_MB_TYPE(a) {} @@ -59,7 +60,7 @@ static void h263_encode_block(MpegEncContext * s, DCTELEM * block, static void h263_encode_motion(MpegEncContext * s, int val, int fcode); 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, + int n, int dc, uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb); #endif @@ -69,24 +70,26 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, int n, int coded); static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, - int n, int coded, int intra); -static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr); + int n, int coded, int intra, int rvlc); +static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr); +#ifdef CONFIG_ENCODERS static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, int dir); +#endif //CONFIG_ENCODERS 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 inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr); -static UINT8 uni_DCtab_lum_len[512]; -static UINT8 uni_DCtab_chrom_len[512]; -static UINT16 uni_DCtab_lum_bits[512]; -static UINT16 uni_DCtab_chrom_bits[512]; +extern uint32_t inverse[256]; #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 uint8_t uni_DCtab_lum_len[512]; +static uint8_t uni_DCtab_chrom_len[512]; +static uint16_t uni_DCtab_lum_bits[512]; +static uint16_t uni_DCtab_chrom_bits[512]; + +static uint16_t (*mv_penalty)[MAX_MV*2+1]= NULL; +static uint8_t fcode_tab[MAX_MV*2+1]; +static uint8_t umv_fcode_tab[MAX_MV*2+1]; static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2]; static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2]; @@ -127,6 +130,8 @@ int h263_get_picture_format(int width, int height) return format; } +#ifdef CONFIG_ENCODERS + static void float_aspect_to_info(MpegEncContext * s, float aspect){ int i; @@ -159,8 +164,8 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) s->gob_number = 0; put_bits(&s->pb, 22, 0x20); /* PSC */ - put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) / - s->frame_rate) & 0xff); + put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) / + s->avctx->frame_rate) & 0xff); put_bits(&s->pb, 1, 1); /* marker */ put_bits(&s->pb, 1, 0); /* h263 id */ @@ -193,7 +198,7 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) put_bits(&s->pb, 3, format); put_bits(&s->pb,1,0); /* Custom PCF: off */ - s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv; + s->umvplus = s->unrestricted_mv; put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */ put_bits(&s->pb,1,0); /* SAC: off */ put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */ @@ -235,7 +240,9 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ if (s->umvplus) - put_bits(&s->pb,1,1); /* Limited according tables of Annex D */ +// put_bits(&s->pb,1,1); /* Limited according tables of Annex D */ + put_bits(&s->pb,2,1); /* unlimited */ + put_bits(&s->pb, 5, s->qscale); } @@ -278,7 +285,7 @@ static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int d int8_t * const qscale_table= s->current_picture.qscale_table; for(n=0; n<6; n++){ - INT16 *ac_val, *ac_val1; + int16_t *ac_val, *ac_val1; ac_val = s->ac_val[0][0] + s->block_index[n] * 16; ac_val1= ac_val; @@ -289,19 +296,19 @@ static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int d if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){ /* same qscale */ for(i=1; i<8; i++){ - const int level= block[n][s->idct_permutation[i ]]; + const int level= block[n][s->dsp.idct_permutation[i ]]; score0+= ABS(level); score1+= ABS(level - ac_val[i+8]); - ac_val1[i ]= block[n][s->idct_permutation[i<<3]]; + ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]]; ac_val1[i+8]= level; } }else{ /* different qscale, we must rescale */ for(i=1; i<8; i++){ - const int level= block[n][s->idct_permutation[i ]]; + const int level= block[n][s->dsp.idct_permutation[i ]]; score0+= ABS(level); score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale)); - ac_val1[i ]= block[n][s->idct_permutation[i<<3]]; + ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]]; ac_val1[i+8]= level; } } @@ -312,20 +319,20 @@ static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int d if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){ /* same qscale */ for(i=1; i<8; i++){ - const int level= block[n][s->idct_permutation[i<<3]]; + const int level= block[n][s->dsp.idct_permutation[i<<3]]; score0+= ABS(level); score1+= ABS(level - ac_val[i]); ac_val1[i ]= level; - ac_val1[i+8]= block[n][s->idct_permutation[i ]]; + ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]]; } }else{ /* different qscale, we must rescale */ for(i=1; i<8; i++){ - const int level= block[n][s->idct_permutation[i<<3]]; + const int level= block[n][s->dsp.idct_permutation[i<<3]]; score0+= ABS(level); score1+= ABS(level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale)); ac_val1[i ]= level; - ac_val1[i+8]= block[n][s->idct_permutation[i ]]; + ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]]; } } } @@ -395,23 +402,28 @@ void ff_clean_mpeg4_qscales(MpegEncContext *s){ } } +#endif //CONFIG_ENCODERS + void ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){ const int mb_index= s->mb_x + s->mb_y*s->mb_width; int xy= s->block_index[0]; uint16_t time_pp= s->pp_time; uint16_t time_pb= s->pb_time; int i; - + //FIXME avoid divides switch(s->co_located_type_table[mb_index]){ case 0: - s->mv_type= MV_TYPE_16X16; - s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx; - s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my; - s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0] + s->mv[0][0][0] = s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->motion_val[xy][0]*time_pb/time_pp + mx; + s->mv[0][0][1] = s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->motion_val[xy][1]*time_pb/time_pp + my; + s->mv[1][0][0] = s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0] : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp; - s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] + s->mv[1][0][1] = s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp; + if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample) + s->mv_type= MV_TYPE_16X16; + else + s->mv_type= MV_TYPE_8X8; break; case CO_LOCATED_TYPE_4MV: s->mv_type = MV_TYPE_8X8; @@ -451,7 +463,7 @@ void mpeg4_encode_mb(MpegEncContext * s, DCTELEM block[6][64], int motion_x, int motion_y) { - int cbpc, cbpy, i, pred_x, pred_y; + int cbpc, cbpy, pred_x, pred_y; int bits; PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb; PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb; @@ -462,7 +474,7 @@ void mpeg4_encode_mb(MpegEncContext * s, // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); if (!s->mb_intra) { /* compute cbp */ - int cbp = 0; + int i, cbp = 0; for (i = 0; i < 6; i++) { if (s->block_last_index[i] >= 0) cbp |= 1 << (5 - i); @@ -479,11 +491,9 @@ void mpeg4_encode_mb(MpegEncContext * s, s->last_mv[1][0][1]= 0; } - XINE_ASSERT(s->dquant>=-2 && s->dquant<=2, - "value 's->dquant' is not within rang of -2 to 2: %d", - s->dquant); - XINE_ASSERT((s->dquant&1)==0,"?"); - XINE_ASSERT(mb_type>=0, "value 'mb_type' is < 0: %d", mb_type); + assert(s->dquant>=-2 && s->dquant<=2); + assert((s->dquant&1)==0); + assert(mb_type>=0); /* nothing to do if this MB was skiped in the next P Frame */ if(s->next_picture.mbskip_table[s->mb_y * s->mb_width + s->mb_x]){ //FIXME avoid DCT & ... @@ -501,9 +511,7 @@ void mpeg4_encode_mb(MpegEncContext * s, if ((cbp | motion_x | motion_y | mb_type) ==0) { /* direct MB with MV={0,0} */ - XINE_ASSERT(s->dquant==0, - "value 's->dquant' is not 0: %d", - s->dquant); + assert(s->dquant==0); put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */ @@ -727,11 +735,12 @@ void mpeg4_encode_mb(MpegEncContext * s, int dc_diff[6]; //dc values with the dc prediction subtracted int dir[6]; //prediction direction int zigzag_last_index[6]; - UINT8 *scan_table[6]; + uint8_t *scan_table[6]; + int i; for(i=0; i<6; i++){ const int level= block[i][0]; - UINT16 *dc_ptr; + uint16_t *dc_ptr; dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]); if (i < 4) { @@ -745,7 +754,7 @@ void mpeg4_encode_mb(MpegEncContext * s, if(s->ac_pred){ for(i=0; i<6; i++){ - UINT8 *st; + uint8_t *st; int last_index; mpeg4_inv_pred_ac(s, block[i], i, dir[i]); @@ -815,16 +824,16 @@ void mpeg4_encode_mb(MpegEncContext * s, if(s->ac_pred){ for(i=0; i<6; i++){ int j; - INT16 *ac_val; + int16_t *ac_val; ac_val = s->ac_val[0][0] + s->block_index[i] * 16; if(dir[i]){ for(j=1; j<8; j++) - block[i][s->idct_permutation[j ]]= ac_val[j+8]; + block[i][s->dsp.idct_permutation[j ]]= ac_val[j+8]; }else{ for(j=1; j<8; j++) - block[i][s->idct_permutation[j<<3]]= ac_val[j ]; + block[i][s->dsp.idct_permutation[j<<3]]= ac_val[j ]; } s->block_last_index[i]= zigzag_last_index[i]; } @@ -837,9 +846,9 @@ void h263_encode_mb(MpegEncContext * s, int motion_x, int motion_y) { int cbpc, cbpy, i, cbp, pred_x, pred_y; - INT16 pred_dc; - INT16 rec_intradc[6]; - UINT16 *dc_ptr[6]; + int16_t pred_dc; + int16_t rec_intradc[6]; + uint16_t *dc_ptr[6]; const int dquant_code[5]= {1,0,9,2,3}; //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); @@ -888,7 +897,7 @@ void h263_encode_mb(MpegEncContext * s, for(i=0; i<6; i++) { /* Predict DC */ if (s->h263_aic && s->mb_intra) { - INT16 level = block[i][0]; + int16_t level = block[i][0]; pred_dc = h263_pred_dc(s, i, &dc_ptr[i]); level -= pred_dc; @@ -963,10 +972,10 @@ void h263_encode_mb(MpegEncContext * s, } #endif -static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr) +static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr) { int x, y, wrap, a, c, pred_dc, scale; - INT16 *dc_val, *ac_val; + int16_t *dc_val, *ac_val; /* find prediction */ if (n < 4) { @@ -1008,11 +1017,10 @@ static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr) return pred_dc; } - -void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) +static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) { int x, y, wrap, a, c, pred_dc, scale, i; - INT16 *dc_val, *ac_val, *ac_val1; + int16_t *dc_val, *ac_val, *ac_val1; /* find prediction */ if (n < 4) { @@ -1050,7 +1058,7 @@ void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) if (a != 1024) { ac_val -= 16; for(i=1;i<8;i++) { - block[s->idct_permutation[i<<3]] += ac_val[i]; + block[s->dsp.idct_permutation[i<<3]] += ac_val[i]; } pred_dc = a; } @@ -1059,7 +1067,7 @@ void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) if (c != 1024) { ac_val -= 16 * wrap; for(i=1;i<8;i++) { - block[s->idct_permutation[i ]] += ac_val[i + 8]; + block[s->dsp.idct_permutation[i ]] += ac_val[i + 8]; } pred_dc = c; } @@ -1087,17 +1095,17 @@ void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) /* left copy */ for(i=1;i<8;i++) - ac_val1[i ] = block[s->idct_permutation[i<<3]]; + ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]]; /* top copy */ for(i=1;i<8;i++) - ac_val1[8 + i] = block[s->idct_permutation[i ]]; + ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]]; } -INT16 *h263_pred_motion(MpegEncContext * s, int block, +int16_t *h263_pred_motion(MpegEncContext * s, int block, int *px, int *py) { int xy, wrap; - INT16 *A, *B, *C, *mot_val; + int16_t *A, *B, *C, *mot_val; static const int off[4]= {2, 1, 1, -1}; wrap = s->block_wrap[0]; @@ -1181,7 +1189,7 @@ static void h263_encode_motion(MpegEncContext * s, int val, int f_code) val -= 2*l; } - XINE_ASSERT(val>=-l && val<l); + assert(val>=-l && val<l); if (val >= 0) { sign = 0; @@ -1247,7 +1255,7 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s) int mv; if(mv_penalty==NULL) - mv_penalty= av_mallocz( sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1) ); + mv_penalty= av_mallocz( sizeof(uint16_t)*(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++){ @@ -1288,6 +1296,8 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s) } #endif +#ifdef CONFIG_ENCODERS + static void init_uni_dc_tab(void) { int level, uni_code, uni_len; @@ -1340,12 +1350,14 @@ static void init_uni_dc_tab(void) } } +#endif //CONFIG_ENCODERS + #ifdef CONFIG_ENCODERS -static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){ +static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){ int slevel, run, last; - XINE_ASSERT(MAX_LEVEL >= 64, "MAX_LEVEL is < 64: %d", MAX_LEVEL); - XINE_ASSERT(MAX_RUN >= 63, "MAX_RUN is < 63: %d", MAX_RUN); + assert(MAX_LEVEL >= 64); + assert(MAX_RUN >= 63); for(slevel=-64; slevel<64; slevel++){ if(slevel==0) continue; @@ -1462,24 +1474,16 @@ void h263_encode_init(MpegEncContext *s) break; case CODEC_ID_H263P: s->fcode_tab= umv_fcode_tab; - s->min_qcoeff= -128; + s->min_qcoeff= -127; s->max_qcoeff= 127; break; //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later default: //nothing needed default table allready set in mpegvideo.c - s->min_qcoeff= -128; + s->min_qcoeff= -127; s->max_qcoeff= 127; s->y_dc_scale_table= s->c_dc_scale_table= ff_mpeg1_dc_scale_table; } - - if(s->mpeg_quant){ - s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x - s->inter_quant_bias= 0; - }else{ - s->intra_quant_bias=0; - s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x - } } /** @@ -1495,26 +1499,26 @@ static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n) rl = &rl_inter; if (s->mb_intra && !s->h263_aic) { /* DC coef */ - level = block[0]; + level = block[0]; /* 255 cannot be represented, so we clamp */ if (level > 254) { level = 254; block[0] = 254; } /* 0 cannot be represented also */ - else if (!level) { + else if (level < 1) { level = 1; block[0] = 1; } - if (level == 128) - put_bits(&s->pb, 8, 0xff); - else - put_bits(&s->pb, 8, level & 0xff); - i = 1; + if (level == 128) //FIXME check rv10 + put_bits(&s->pb, 8, 0xff); + else + put_bits(&s->pb, 8, level & 0xff); + i = 1; } else { - i = 0; - if (s->h263_aic && s->mb_intra) - rl = &rl_intra_aic; + i = 0; + if (s->h263_aic && s->mb_intra) + rl = &rl_intra_aic; } /* AC coefs */ @@ -1537,7 +1541,16 @@ static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n) if (code == rl->n) { put_bits(&s->pb, 1, last); put_bits(&s->pb, 6, run); - put_bits(&s->pb, 8, slevel & 0xff); + + assert(slevel != 0); + + if(slevel < 128 && slevel > -128) + put_bits(&s->pb, 8, slevel & 0xff); + else{ + put_bits(&s->pb, 8, 128); + put_bits(&s->pb, 5, slevel & 0x1f); + put_bits(&s->pb, 6, (slevel>>5)&0x3f); + } } else { put_bits(&s->pb, 1, sign); } @@ -1547,6 +1560,8 @@ static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n) } #endif +#ifdef CONFIG_ENCODERS + /***************************************************/ /** * add mpeg4 stuffing bits (01...1) @@ -1564,16 +1579,16 @@ void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){ int time_div, time_mod; if(s->pict_type==I_TYPE){ //we will encode a vol header - s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE); - if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128; - + int dummy; + av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1); + s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1; } if(s->current_picture.pts) s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000); else - s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate; + s->time= av_rescale(picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->frame_rate); time_div= s->time/s->time_increment_resolution; time_mod= s->time%s->time_increment_resolution; @@ -1644,7 +1659,6 @@ static void mpeg4_encode_visual_object_header(MpegEncContext * s){ static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number) { int vo_ver_id; - char buf[255]; if(s->max_b_frames || s->quarter_sample){ vo_ver_id= 5; @@ -1728,11 +1742,10 @@ static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_n ff_mpeg4_stuffing(&s->pb); /* user data */ - if(!ff_bit_exact){ + if(!(s->flags & CODEC_FLAG_BITEXACT)){ put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, 0x1B2); /* user_data */ - sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR); - put_string(&s->pb, buf); + put_string(&s->pb, LIBAVCODEC_IDENT); ff_mpeg4_stuffing(&s->pb); } } @@ -1796,6 +1809,8 @@ void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number) s->v_edge_pos= s->height; } +#endif //CONFIG_ENCODERS + /** * change qscale by given dquant and update qscale dependant variables. */ @@ -1819,10 +1834,10 @@ static void change_qscale(MpegEncContext * s, int dquant) * @param dir_ptr pointer to an integer where the prediction direction will be stored * @return the quantized predicted dc */ -static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr) +static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr) { int a, b, c, wrap, pred, scale; - UINT16 *dc_val; + uint16_t *dc_val; int dummy; /* find prediction */ @@ -1885,7 +1900,7 @@ void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, int dir) { int i; - INT16 *ac_val, *ac_val1; + int16_t *ac_val, *ac_val1; int8_t * const qscale_table= s->current_picture.qscale_table; /* find prediction */ @@ -1900,12 +1915,12 @@ void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){ /* same qscale */ for(i=1;i<8;i++) { - block[s->idct_permutation[i<<3]] += ac_val[i]; + block[s->dsp.idct_permutation[i<<3]] += ac_val[i]; } }else{ /* different qscale, we must rescale */ for(i=1;i<8;i++) { - block[s->idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); + block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); } } } else { @@ -1916,31 +1931,33 @@ void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){ /* same qscale */ for(i=1;i<8;i++) { - block[s->idct_permutation[i]] += ac_val[i + 8]; + block[s->dsp.idct_permutation[i]] += ac_val[i + 8]; } }else{ /* different qscale, we must rescale */ for(i=1;i<8;i++) { - block[s->idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); + block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); } } } } /* left copy */ for(i=1;i<8;i++) - ac_val1[i ] = block[s->idct_permutation[i<<3]]; + ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]]; /* top copy */ for(i=1;i<8;i++) - ac_val1[8 + i] = block[s->idct_permutation[i ]]; + ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]]; } +#ifdef CONFIG_ENCODERS + static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, int dir) { int i; - INT16 *ac_val; + int16_t *ac_val; int8_t * const qscale_table= s->current_picture.qscale_table; /* find prediction */ @@ -1953,12 +1970,12 @@ static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){ /* same qscale */ for(i=1;i<8;i++) { - block[s->idct_permutation[i<<3]] -= ac_val[i]; + block[s->dsp.idct_permutation[i<<3]] -= ac_val[i]; } }else{ /* different qscale, we must rescale */ for(i=1;i<8;i++) { - block[s->idct_permutation[i<<3]] -= ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); + block[s->dsp.idct_permutation[i<<3]] -= ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); } } } else { @@ -1968,12 +1985,12 @@ static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){ /* same qscale */ for(i=1;i<8;i++) { - block[s->idct_permutation[i]] -= ac_val[i + 8]; + block[s->dsp.idct_permutation[i]] -= ac_val[i + 8]; } }else{ /* different qscale, we must rescale */ for(i=1;i<8;i++) { - block[s->idct_permutation[i]] -= ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); + block[s->dsp.idct_permutation[i]] -= ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); } } } @@ -2023,21 +2040,21 @@ static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) } #endif } -#ifdef CONFIG_ENCODERS + /** * encodes a 8x8 block * @param n block index (0-3 are luma, 4-5 are chroma) */ static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, - UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) + uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) { int i, last_non_zero; #if 0 //variables for the outcommented version int code, sign, last; #endif const RLTable *rl; - UINT32 *bits_tab; - UINT8 *len_tab; + uint32_t *bits_tab; + uint8_t *len_tab; const int last_index = s->block_last_index[n]; if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away @@ -2145,11 +2162,11 @@ static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n } static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, - UINT8 *scan_table) + uint8_t *scan_table) { int i, last_non_zero; const RLTable *rl; - UINT8 *len_tab; + uint8_t *len_tab; const int last_index = s->block_last_index[n]; int len=0; @@ -2283,9 +2300,13 @@ void h263_decode_init_vlc(MpegEncContext *s) &mvtab[0][0], 2, 1); init_rl(&rl_inter); init_rl(&rl_intra); + init_rl(&rvlc_rl_inter); + init_rl(&rvlc_rl_intra); init_rl(&rl_intra_aic); init_vlc_rl(&rl_inter); init_vlc_rl(&rl_intra); + init_vlc_rl(&rvlc_rl_inter); + init_vlc_rl(&rvlc_rl_intra); init_vlc_rl(&rl_intra_aic); init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */, &DCtab_lum[0][1], 2, 1, @@ -2361,6 +2382,8 @@ static inline void memsetw(short *tab, int val, int n) tab[i] = val; } +#ifdef CONFIG_ENCODERS + void ff_mpeg4_init_partitions(MpegEncContext *s) { init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL); @@ -2392,6 +2415,8 @@ void ff_mpeg4_merge_partitions(MpegEncContext *s) s->last_bits= get_bit_count(&s->pb); } +#endif //CONFIG_ENCODERS + int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){ switch(s->pict_type){ case I_TYPE: @@ -2406,6 +2431,8 @@ int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){ } } +#ifdef CONFIG_ENCODERS + void ff_mpeg4_encode_video_packet_header(MpegEncContext *s) { int mb_num_bits= av_log2(s->mb_num - 1) + 1; @@ -2419,6 +2446,8 @@ void ff_mpeg4_encode_video_packet_header(MpegEncContext *s) put_bits(&s->pb, 1, 0); /* no HEC */ } +#endif //CONFIG_ENCODERS + /** * check if the next stuff is a resync marker or the end. * @return 0 if not @@ -2562,14 +2591,14 @@ void ff_mpeg4_clean_buffers(MpegEncContext *s) #endif /* clean AC */ - memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16)); - memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16)); - memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(INT16)); + memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t)); + memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); + memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); /* clean MV */ // we cant clear the MVs as they might be needed by a b frame -// memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16)); -// memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); +// memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t)); +// memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); s->last_mv[0][0][0]= s->last_mv[0][0][1]= s->last_mv[1][0][0]= @@ -2669,7 +2698,7 @@ static inline int get_amv(MpegEncContext *s, int n){ */ static int mpeg4_decode_partition_a(MpegEncContext *s){ int mb_num; - static const INT8 quant_tab[4] = { -1, -2, 1, 2 }; + static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; /* decode first partition */ mb_num=0; @@ -2723,11 +2752,9 @@ static int mpeg4_decode_partition_a(MpegEncContext *s){ if(dc_pred_dir) dir|=1; } s->pred_dir_table[xy]= dir; - - s->error_status_table[xy]= AC_ERROR; }else{ /* P/S_TYPE */ int mx, my, pred_x, pred_y, bits; - INT16 * const mot_val= s->motion_val[s->block_index[0]]; + int16_t * const mot_val= s->motion_val[s->block_index[0]]; const int stride= s->block_wrap[0]*2; bits= show_bits(&s->gb, 17); @@ -2753,8 +2780,6 @@ static int mpeg4_decode_partition_a(MpegEncContext *s){ if(s->mbintra_table[xy]) ff_clean_intra_table_entries(s); - - s->error_status_table[xy]= AC_ERROR; continue; } cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); @@ -2778,7 +2803,6 @@ static int mpeg4_decode_partition_a(MpegEncContext *s){ mot_val[0+stride]= mot_val[2+stride]= 0; mot_val[1 ]= mot_val[3 ]= mot_val[1+stride]= mot_val[3+stride]= 0; - s->error_status_table[xy]= DC_ERROR|AC_ERROR; }else{ if(s->mbintra_table[xy]) ff_clean_intra_table_entries(s); @@ -2815,7 +2839,7 @@ static int mpeg4_decode_partition_a(MpegEncContext *s){ PRINT_MB_TYPE("4"); s->mb_type[xy]= MB_TYPE_INTER4V; for(i=0;i<4;i++) { - INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y); + int16_t *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y); mx = h263_decode_motion(s, pred_x, s->f_code); if (mx >= 0xffff) return -1; @@ -2827,7 +2851,6 @@ static int mpeg4_decode_partition_a(MpegEncContext *s){ mot_val[1] = my; } } - s->error_status_table[xy]= AC_ERROR; } } } @@ -2843,7 +2866,7 @@ static int mpeg4_decode_partition_a(MpegEncContext *s){ */ static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){ int mb_num=0; - static const INT8 quant_tab[4] = { -1, -2, 1, 2 }; + static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; s->mb_x= s->resync_mb_x; s->first_slice_line=1; @@ -2896,7 +2919,6 @@ static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){ s->cbp_table[xy]&= 3; //remove dquant s->cbp_table[xy]|= cbpy<<2; s->pred_dir_table[xy]= dir | (ac_pred<<7); - s->error_status_table[xy]&= ~DC_ERROR; }else if(s->mb_type[xy]&MB_TYPE_SKIPED){ s->current_picture.qscale_table[xy]= s->qscale; s->cbp_table[xy]= 0; @@ -2931,13 +2953,18 @@ static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){ int ff_mpeg4_decode_partitions(MpegEncContext *s) { int mb_num; + const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR; + const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END; mb_num= mpeg4_decode_partition_a(s); - if(mb_num<0) + if(mb_num<0){ + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error); return -1; + } if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){ fprintf(stderr, "slice below monitor ...\n"); + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error); return -1; } @@ -2947,21 +2974,23 @@ int ff_mpeg4_decode_partitions(MpegEncContext *s) if(get_bits(&s->gb, 19)!=DC_MARKER){ fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y); return -1; - }else - s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END|DC_END; + } }else{ if(get_bits(&s->gb, 17)!=MOTION_MARKER){ fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y); return -1; - }else - s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END; + } } + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end); if( mpeg4_decode_partition_b(s, mb_num) < 0){ + if(s->pict_type==P_TYPE) + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR); return -1; + }else{ + if(s->pict_type==P_TYPE) + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END); } - - s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= DC_END; return 0; } @@ -3007,15 +3036,6 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) } }else if(s->mb_intra){ s->ac_pred = s->pred_dir_table[xy]>>7; - - /* decode each block */ - for (i = 0; i < 6; i++) { - if(mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0){ - fprintf(stderr, "texture corrupted at %d %d\n", s->mb_x, s->mb_y); - return -1; - } - cbp+=cbp; - } }else if(!s->mb_intra){ // s->mcsel= 0; //FIXME do we need to init that @@ -3025,32 +3045,24 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) } else { s->mv_type = MV_TYPE_16X16; } - /* decode each block */ - for (i = 0; i < 6; i++) { - if(mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0){ - fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y); - return -1; - } - cbp+=cbp; - } } } else { /* I-Frame */ - int i; s->mb_intra = 1; s->ac_pred = s->pred_dir_table[xy]>>7; - + } + + if (!(mb_type&MB_TYPE_SKIPED)) { + int i; /* decode each block */ for (i = 0; i < 6; i++) { - if(mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0){ - fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y); + if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ + fprintf(stderr, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); return -1; } cbp+=cbp; } } - s->error_status_table[xy]&= ~AC_ERROR; - /* per-MB end of slice check */ if(--s->mb_num_left <= 0){ @@ -3071,10 +3083,8 @@ int ff_h263_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) { int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; - INT16 *mot_val; - static INT8 quant_tab[4] = { -1, -2, 1, 2 }; - - s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0; + int16_t *mot_val; + static int8_t quant_tab[4] = { -1, -2, 1, 2 }; if(s->mb_x==0) PRINT_MB_TYPE("\n"); @@ -3163,7 +3173,7 @@ int ff_h263_decode_mb(MpegEncContext *s, /* 16x16 motion prediction */ s->mv_type = MV_TYPE_16X16; h263_pred_motion(s, 0, &pred_x, &pred_y); - if (s->umvplus_dec) + if (s->umvplus) mx = h263p_decode_umotion(s, pred_x); else mx = h263_decode_motion(s, pred_x, s->f_code); @@ -3171,7 +3181,7 @@ int ff_h263_decode_mb(MpegEncContext *s, if (mx >= 0xffff) return -1; - if (s->umvplus_dec) + if (s->umvplus) my = h263p_decode_umotion(s, pred_y); else my = h263_decode_motion(s, pred_y, s->f_code); @@ -3181,7 +3191,7 @@ int ff_h263_decode_mb(MpegEncContext *s, s->mv[0][0][0] = mx; s->mv[0][0][1] = my; - if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1) + if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ } } else { @@ -3189,14 +3199,14 @@ int ff_h263_decode_mb(MpegEncContext *s, s->mv_type = MV_TYPE_8X8; for(i=0;i<4;i++) { mot_val = h263_pred_motion(s, i, &pred_x, &pred_y); - if (s->umvplus_dec) + if (s->umvplus) mx = h263p_decode_umotion(s, pred_x); else mx = h263_decode_motion(s, pred_x, s->f_code); if (mx >= 0xffff) return -1; - if (s->umvplus_dec) + if (s->umvplus) my = h263p_decode_umotion(s, pred_y); else my = h263_decode_motion(s, pred_y, s->f_code); @@ -3204,7 +3214,7 @@ int ff_h263_decode_mb(MpegEncContext *s, return -1; s->mv[0][i][0] = mx; s->mv[0][i][1] = my; - if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1) + if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ mot_val[0] = mx; mot_val[1] = my; @@ -3214,7 +3224,7 @@ int ff_h263_decode_mb(MpegEncContext *s, int modb1; // first bit of modb int modb2; // second bit of modb int mb_type; - + s->mb_intra = 0; //B-frames never contain intra blocks s->mcsel=0; // ... true gmc blocks @@ -3377,7 +3387,7 @@ intra: /* decode each block */ if (s->h263_pred) { for (i = 0; i < 6; i++) { - if (mpeg4_decode_block(s, block[i], i, cbp&32, 1) < 0) + if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0) return -1; cbp+=cbp; } @@ -3394,7 +3404,7 @@ intra: /* decode each block */ if (s->h263_pred) { for (i = 0; i < 6; i++) { - if (mpeg4_decode_block(s, block[i], i, cbp&32, 0) < 0) + if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0) return -1; cbp+=cbp; } @@ -3498,7 +3508,7 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, { int code, level, i, j, last, run; RLTable *rl = &rl_inter; - const UINT8 *scan_table; + const uint8_t *scan_table; scan_table = s->intra_scantable.permutated; if (s->h263_aic && s->mb_intra) { @@ -3512,7 +3522,8 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, } } else if (s->mb_intra) { /* DC coef */ - if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) { + if(s->h263_rv10){ + if (s->rv10_version == 3 && s->pict_type == I_TYPE) { int component, diff; component = (n <= 3 ? 0 : n - 4 + 1); level = s->last_dc[component]; @@ -3526,8 +3537,15 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, } else { s->rv10_first_dc_coded[component] = 1; } - } else { + } else { + level = get_bits(&s->gb, 8); + } + }else{ level = get_bits(&s->gb, 8); + if((level&0x7F) == 0){ + fprintf(stderr, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y); + return -1; + } if (level == 255) level = 128; } @@ -3553,11 +3571,17 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, /* escape */ last = get_bits1(&s->gb); run = get_bits(&s->gb, 6); - level = (INT8)get_bits(&s->gb, 8); - if (s->h263_rv10 && level == -128) { - /* XXX: should patch encoder too */ - level = get_bits(&s->gb, 12); - level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension + level = (int8_t)get_bits(&s->gb, 8); + if(level == -128){ + if (s->h263_rv10) { + /* XXX: should patch encoder too */ + level = get_bits(&s->gb, 12); + level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension + }else{ + level = get_bits(&s->gb, 5); + level += get_bits(&s->gb, 6)<<5; + level= (level + ((-1)<<10)) ^ ((-1)<<10); //sign extension + } } } else { run = rl->table_run[code]; @@ -3595,7 +3619,7 @@ not_coded: static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) { int level, pred, code; - UINT16 *dc_val; + uint16_t *dc_val; if (n < 4) code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); @@ -3648,15 +3672,17 @@ static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) * @return <0 if an error occured */ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, - int n, int coded, int intra) + int n, int coded, int intra, int rvlc) { int level, i, last, run; int dc_pred_dir; RLTable * rl; RL_VLC_ELEM * rl_vlc; - const UINT8 * scan_table; + const uint8_t * scan_table; int qmul, qadd; + //Note intra & rvlc should be optimized away if this is inlined + if(intra) { /* DC coef */ if(s->partitioned_frame){ @@ -3673,8 +3699,14 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, i = 0; if (!coded) goto not_coded; - rl = &rl_intra; - rl_vlc = rl_intra.rl_vlc[0]; + + if(rvlc){ + rl = &rvlc_rl_intra; + rl_vlc = rvlc_rl_intra.rl_vlc[0]; + }else{ + rl = &rl_intra; + rl_vlc = rl_intra.rl_vlc[0]; + } if (s->ac_pred) { if (dc_pred_dir == 0) scan_table = s->intra_v_scantable.permutated; /* left */ @@ -3691,18 +3723,27 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, s->block_last_index[n] = i; return 0; } - rl = &rl_inter; + if(rvlc) rl = &rvlc_rl_inter; + else rl = &rl_inter; scan_table = s->intra_scantable.permutated; if(s->mpeg_quant){ qmul=1; qadd=0; - rl_vlc = rl_inter.rl_vlc[0]; + if(rvlc){ + rl_vlc = rvlc_rl_inter.rl_vlc[0]; + }else{ + rl_vlc = rl_inter.rl_vlc[0]; + } }else{ qmul = s->qscale << 1; qadd = (s->qscale - 1) | 1; - rl_vlc = rl_inter.rl_vlc[s->qscale]; + if(rvlc){ + rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; + }else{ + rl_vlc = rl_inter.rl_vlc[s->qscale]; + } } } { @@ -3711,9 +3752,39 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, UPDATE_CACHE(re, &s->gb); GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2); if (level==0) { + /* escape */ + if(rvlc){ + if(SHOW_UBITS(re, &s->gb, 1)==0){ + fprintf(stderr, "1. marker bit missing in rvlc esc\n"); + return -1; + }; SKIP_CACHE(re, &s->gb, 1); + + last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); + run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); + SKIP_COUNTER(re, &s->gb, 1+1+6); + UPDATE_CACHE(re, &s->gb); + + if(SHOW_UBITS(re, &s->gb, 1)==0){ + fprintf(stderr, "2. marker bit missing in rvlc esc\n"); + return -1; + }; SKIP_CACHE(re, &s->gb, 1); + + level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); + + if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ + fprintf(stderr, "reverse esc missing\n"); + return -1; + }; SKIP_CACHE(re, &s->gb, 5); + + level= level * qmul + qadd; + level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); + SKIP_COUNTER(re, &s->gb, 1+11+5+1); + + i+= run + 1; + if(last) i+=192; + }else{ int cache; cache= GET_CACHE(re, &s->gb); - /* escape */ if (cache&0x80000000) { if (cache&0x40000000) { /* third escape */ @@ -3795,6 +3866,7 @@ static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_BITS(re, &s->gb, 1); } + } } else { i+= run; level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); @@ -3906,7 +3978,7 @@ int h263_decode_picture_header(MpegEncContext *s) format = get_bits(&s->gb, 3); dprintf("ufep=1, format: %d\n", format); skip_bits(&s->gb,1); /* Custom PCF */ - s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */ + s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */ skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */ if (get_bits1(&s->gb) != 0) { s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */ @@ -3977,8 +4049,9 @@ int h263_decode_picture_header(MpegEncContext *s) return -1; s->width = width; s->height = height; - if (s->umvplus_dec) { - skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ + if (s->umvplus) { + if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ + skip_bits1(&s->gb); } } @@ -4007,7 +4080,7 @@ static void mpeg4_decode_sprite_trajectory(MpegEncContext * s) int a= 2<<s->sprite_warping_accuracy; int rho= 3-s->sprite_warping_accuracy; int r=16/a; - int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes + 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]; @@ -4351,11 +4424,11 @@ static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){ // FIXME a bunch of grayscale shape things if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */ - int i, j, v; + int i, v; /* load default matrixes */ for(i=0; i<64; i++){ - int j= s->idct_permutation[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; @@ -4368,19 +4441,20 @@ static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){ /* load custom intra matrix */ if(get_bits1(gb)){ int last=0; - for(i=0; i<64; i++){ + for(i=0; i<64; i++){ + int j; v= get_bits(gb, 8); if(v==0) break; last= v; - j= s->idct_permutation[ ff_zigzag_direct[i] ]; + 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++){ - j= s->idct_permutation[ ff_zigzag_direct[i] ]; + int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; s->intra_matrix[j]= v; s->chroma_intra_matrix[j]= v; } @@ -4389,19 +4463,20 @@ static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){ /* load custom non intra matrix */ if(get_bits1(gb)){ int last=0; - for(i=0; i<64; i++){ + for(i=0; i<64; i++){ + int j; v= get_bits(gb, 8); if(v==0) break; last= v; - j= s->idct_permutation[ ff_zigzag_direct[i] ]; + 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++){ - j= s->idct_permutation[ ff_zigzag_direct[i] ]; + int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; s->inter_matrix[j]= last; s->chroma_inter_matrix[j]= last; } @@ -4421,9 +4496,6 @@ static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){ s->data_partitioning= get_bits1(gb); if(s->data_partitioning){ s->rvlc= get_bits1(gb); - if(s->rvlc){ - printf("reversible vlc not supported\n"); - } } if(vo_ver_id != 1) { @@ -4486,6 +4558,7 @@ static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ int i; int e; int ver, build, ver2, ver3; + char last; buf[0]= show_bits(gb, 8); for(i=1; i<256; i++){ @@ -4494,16 +4567,21 @@ static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ skip_bits(gb, 8); } buf[255]=0; - + /* divx detection */ - e=sscanf(buf, "DivX%dBuild%d", &ver, &build); - if(e!=2) - e=sscanf(buf, "DivX%db%d", &ver, &build); - if(e==2){ + 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'; if(s->picture_number==0){ - printf("This file was encoded with DivX%d Build%d\n", ver, build); + printf("This file was encoded with DivX%d Build%d", ver, build); + if(s->divx_packed) + printf("p\n"); + else + printf("\n"); } } @@ -4560,6 +4638,17 @@ static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){ time_incr++; check_marker(gb, "before time_increment"); + + if(s->picture_number==0 && (show_bits(gb, s->time_increment_bits+1)&1)==0){ + printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n"); + + + 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; + } + printf("my guess is %d bits ;)\n",s->time_increment_bits); + } + time_increment= get_bits(gb, s->time_increment_bits); //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment); if(s->pict_type!=B_TYPE){ @@ -4596,13 +4685,8 @@ static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){ if(s->avctx->debug&FF_DEBUG_PTS) printf("MPEG4 PTS: %f\n", s->current_picture.pts/(1000.0*1000.0)); - if(check_marker(gb, "before vop_coded")==0 && s->picture_number==0){ - printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n"); - for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){ - if(get_bits1(gb)) break; - } - printf("my guess is %d bits ;)\n",s->time_increment_bits); - } + check_marker(gb, "before vop_coded"); + /* vop coded */ if (get_bits1(gb) != 1){ printf("vop not coded\n"); @@ -4724,7 +4808,7 @@ static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){ 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->divx_version==0 || s->divx_version < 500){ + if(!(s->workaround_bugs&FF_BUG_EDGE)){ s->h_edge_pos= s->width; s->v_edge_pos= s->height; } diff --git a/src/libffmpeg/libavcodec/h263data.h b/src/libffmpeg/libavcodec/h263data.h index 5aa1e18db..132ed98a9 100644 --- a/src/libffmpeg/libavcodec/h263data.h +++ b/src/libffmpeg/libavcodec/h263data.h @@ -1,11 +1,16 @@ +/** + * @file h263data.h + * H.263 tables. + */ + /* intra MCBPC, mb_type = (intra), then (intraq) */ -const UINT8 intra_MCBPC_code[8] = { 1, 1, 2, 3, 1, 1, 2, 3 }; -const UINT8 intra_MCBPC_bits[8] = { 1, 3, 3, 3, 4, 6, 6, 6 }; +const uint8_t intra_MCBPC_code[8] = { 1, 1, 2, 3, 1, 1, 2, 3 }; +const uint8_t intra_MCBPC_bits[8] = { 1, 3, 3, 3, 4, 6, 6, 6 }; /* inter MCBPC, mb_type = (inter), (intra), (interq), (intraq), (inter4v) */ /* Changed the tables for interq and inter4v+q, following the standard ** Juanjo ** */ -const UINT8 inter_MCBPC_code[25] = { +const uint8_t inter_MCBPC_code[25] = { 1, 3, 2, 5, 3, 4, 3, 3, 3, 7, 6, 5, @@ -14,7 +19,7 @@ const UINT8 inter_MCBPC_code[25] = { 1, /* Stuffing */ 2, 12, 14, 15, }; -const UINT8 inter_MCBPC_bits[25] = { +const uint8_t inter_MCBPC_bits[25] = { 1, 4, 4, 6, 5, 8, 8, 7, 3, 7, 7, 9, @@ -25,14 +30,14 @@ const UINT8 inter_MCBPC_bits[25] = { }; /* This is the old table -static const UINT8 inter_MCBPC_code[20] = { +static const uint8_t inter_MCBPC_code[20] = { 1, 3, 2, 5, 3, 4, 3, 3, 0, 1, 2, 3, 4, 4, 3, 2, 2, 5, 4, 5, }; -static const UINT8 inter_MCBPC_bits[20] = { +static const uint8_t inter_MCBPC_bits[20] = { 1, 4, 4, 6, 5, 8, 8, 7, 12, 12, 12, 12, @@ -40,13 +45,13 @@ static const UINT8 inter_MCBPC_bits[20] = { 3, 7, 7, 8, };*/ -const UINT8 cbpy_tab[16][2] = +const uint8_t cbpy_tab[16][2] = { {3,4}, {5,5}, {4,5}, {9,4}, {3,5}, {7,4}, {2,6}, {11,4}, {2,5}, {3,6}, {5,4}, {10,4}, {4,4}, {8,4}, {6,4}, {3,2} }; -const UINT8 mvtab[33][2] = +const uint8_t mvtab[33][2] = { {1,1}, {1,2}, {1,3}, {1,4}, {3,6}, {5,7}, {4,7}, {3,7}, {11,9}, {10,9}, {9,9}, {17,10}, {16,10}, {15,10}, {14,10}, {13,10}, @@ -56,7 +61,7 @@ const UINT8 mvtab[33][2] = }; /* third non intra table */ -const UINT16 inter_vlc[103][2] = { +const uint16_t inter_vlc[103][2] = { { 0x2, 2 },{ 0xf, 4 },{ 0x15, 6 },{ 0x17, 7 }, { 0x1f, 8 },{ 0x25, 9 },{ 0x24, 9 },{ 0x21, 10 }, { 0x20, 10 },{ 0x7, 11 },{ 0x6, 11 },{ 0x20, 11 }, @@ -85,7 +90,7 @@ const UINT16 inter_vlc[103][2] = { { 0x5e, 12 },{ 0x5f, 12 },{ 0x3, 7 }, }; -const INT8 inter_level[102] = { +const int8_t inter_level[102] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 1, 2, @@ -101,7 +106,7 @@ const INT8 inter_level[102] = { 1, 1, 1, 1, 1, 1, }; -const INT8 inter_run[102] = { +const int8_t inter_run[102] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, @@ -125,7 +130,7 @@ static RLTable rl_inter = { inter_level, }; -const UINT16 intra_vlc_aic[103][2] = { +const uint16_t intra_vlc_aic[103][2] = { { 0x2, 2 }, { 0x6, 3 }, { 0xe, 4 }, { 0xc, 5 }, { 0xd, 5 }, { 0x10, 6 }, { 0x11, 6 }, { 0x12, 6 }, { 0x16, 7 }, { 0x1b, 8 }, { 0x20, 9 }, { 0x21, 9 }, @@ -154,7 +159,7 @@ const UINT16 intra_vlc_aic[103][2] = { { 0x59, 12 }, { 0x5a, 12 }, { 0x3, 7 }, }; -const INT8 intra_run_aic[102] = { +const int8_t intra_run_aic[102] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -170,7 +175,7 @@ const INT8 intra_run_aic[102] = { 18, 19, 20, 21, 22, 23, }; -const INT8 intra_level_aic[102] = { +const int8_t intra_level_aic[102] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, @@ -194,7 +199,7 @@ static RLTable rl_intra_aic = { intra_level_aic, }; -static const UINT16 h263_format[8][2] = { +static const uint16_t h263_format[8][2] = { { 0, 0 }, { 128, 96 }, { 176, 144 }, @@ -203,7 +208,7 @@ static const UINT16 h263_format[8][2] = { { 1408, 1152 }, }; -static UINT8 h263_aic_dc_scale_table[32]={ +static uint8_t h263_aic_dc_scale_table[32]={ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0, 2, 4, 6, 8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62 }; diff --git a/src/libffmpeg/libavcodec/h263dec.c b/src/libffmpeg/libavcodec/h263dec.c index 5f6454d5a..2b9443908 100644 --- a/src/libffmpeg/libavcodec/h263dec.c +++ b/src/libffmpeg/libavcodec/h263dec.c @@ -1,5 +1,5 @@ /* - * H263 decoder + * H.263 decoder * Copyright (c) 2001 Fabrice Bellard. * * This library is free software; you can redistribute it and/or @@ -16,16 +16,15 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file h263dec.c + * H.263 decoder. + */ + #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" -#include "xineutils.h" - -#if 1 -#define PRINT_QP(a, b) {} -#else -#define PRINT_QP(a, b) printf(a, b) -#endif //#define DEBUG //#define PRINT_FRAME_TIME @@ -129,7 +128,7 @@ int ff_h263_decode_end(AVCodecContext *avctx) static int get_consumed_bytes(MpegEncContext *s, int buf_size){ int pos= (get_bits_count(&s->gb)+7)>>3; - if(s->divx_version>=500){ + if(s->divx_packed){ //we would have to scan through the whole buf to handle the weird reordering ... return buf_size; }else if(s->flags&CODEC_FLAG_TRUNCATED){ @@ -145,6 +144,7 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size){ } static int decode_slice(MpegEncContext *s){ + const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F; s->last_resync_gb= s->gb; s->first_slice_line= 1; @@ -175,8 +175,8 @@ static int decode_slice(MpegEncContext *s){ /* per-row end of slice checks */ if(s->msmpeg4_version){ if(s->resync_mb_y + s->slice_height == s->mb_y){ - const int xy= s->mb_x + s->mb_y*s->mb_width; - s->error_status_table[xy-1]|= AC_END|DC_END|MV_END; + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); + return 0; } } @@ -206,47 +206,40 @@ static int decode_slice(MpegEncContext *s){ //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24)); ret= s->decode_mb(s, s->block); - PRINT_QP("%2d", s->qscale); MPV_decode_mb(s, s->block); if(ret<0){ const int xy= s->mb_x + s->mb_y*s->mb_width; if(ret==SLICE_END){ //printf("%d %d %d %06X\n", s->mb_x, s->mb_y, s->gb.size*8 - get_bits_count(&s->gb), show_bits(&s->gb, 24)); - s->error_status_table[xy]|= AC_END; - if(!s->partitioned_frame) - s->error_status_table[xy]|= MV_END|DC_END; + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); s->padding_bug_score--; if(++s->mb_x >= s->mb_width){ s->mb_x=0; - ff_draw_horiz_band(s); + ff_draw_horiz_band(s, s->mb_y*16, 16); s->mb_y++; } return 0; }else if(ret==SLICE_NOEND){ fprintf(stderr,"Slice mismatch at MB: %d\n", xy); + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); return -1; } fprintf(stderr,"Error at MB: %d\n", xy); - s->error_status_table[xy]|= AC_ERROR; - if(!s->partitioned_frame) - s->error_status_table[xy]|= DC_ERROR|MV_ERROR; + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); return -1; } } - ff_draw_horiz_band(s); - - PRINT_QP("%s", "\n"); + ff_draw_horiz_band(s, s->mb_y*16, 16); s->mb_x= 0; } - XINE_ASSERT(s->mb_x==0, "s->mb_x (%d) != 0", s->mb_x); - XINE_ASSERT(s->mb_y==s->mb_height, "s->mb_y (%d) != s->mb_height (%d)", s->mb_y, s->mb_height); + assert(s->mb_x==0 && s->mb_y==s->mb_height); /* try to detect the padding bug */ if( s->codec_id==CODEC_ID_MPEG4 @@ -295,7 +288,7 @@ static int decode_slice(MpegEncContext *s){ else if(left<0){ fprintf(stderr, "overreading %d bits\n", -left); }else - s->error_status_table[s->mb_num-1]|= AC_END|MV_END|DC_END; + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); return 0; } @@ -303,6 +296,9 @@ static int decode_slice(MpegEncContext *s){ fprintf(stderr, "slice end not reached but screenspace end (%d left %06X)\n", s->gb.size_in_bits - get_bits_count(&s->gb), show_bits(&s->gb, 24)); + + ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); + return -1; } @@ -310,7 +306,7 @@ static int decode_slice(MpegEncContext *s){ * finds the end of the current frame in the bitstream. * @return the position of the first byte of the next frame, or -1 */ -static int mpeg4_find_frame_end(MpegEncContext *s, UINT8 *buf, int buf_size){ +static int mpeg4_find_frame_end(MpegEncContext *s, uint8_t *buf, int buf_size){ ParseContext *pc= &s->parse_context; int vop_found, i; uint32_t state; @@ -343,6 +339,13 @@ static int mpeg4_find_frame_end(MpegEncContext *s, UINT8 *buf, int buf_size){ return -1; } +/** + * draws an line from (ex, ey) -> (sx, sy). + * @param w width of the image + * @param h height of the image + * @param stride stride/linesize of the image + * @param color color of the arrow + */ static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){ int t, x, y, f; @@ -379,6 +382,13 @@ static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h } } +/** + * draws an arrow from (ex, ey) -> (sx, sy). + * @param w width of the image + * @param h height of the image + * @param stride stride/linesize of the image + * @param color color of the arrow + */ static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){ int dx= ex - sx; int dy= ey - sy; @@ -400,7 +410,7 @@ static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { MpegEncContext *s = avctx->priv_data; int ret,i; @@ -479,16 +489,16 @@ retry: else s->workaround_bugs &= ~FF_BUG_NO_PADDING; - if(s->avctx->fourcc == ff_get_fourcc("XVIX")) + if(s->avctx->codec_tag == ff_get_fourcc("XVIX")) s->workaround_bugs|= FF_BUG_XVID_ILACE; #if 0 - if(s->avctx->fourcc == ff_get_fourcc("MP4S")) + if(s->avctx->codec_tag == ff_get_fourcc("MP4S")) s->workaround_bugs|= FF_BUG_AC_VLC; - if(s->avctx->fourcc == ff_get_fourcc("M4S2")) + if(s->avctx->codec_tag == ff_get_fourcc("M4S2")) s->workaround_bugs|= FF_BUG_AC_VLC; #endif - if(s->avctx->fourcc == ff_get_fourcc("UMP4")){ + if(s->avctx->codec_tag == ff_get_fourcc("UMP4")){ s->workaround_bugs|= FF_BUG_UMP4; s->workaround_bugs|= FF_BUG_AC_VLC; } @@ -501,10 +511,10 @@ retry: s->workaround_bugs|= FF_BUG_QPEL_CHROMA2; } - if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0) + if(s->avctx->codec_tag == ff_get_fourcc("XVID") && s->xvid_build==0) s->workaround_bugs|= FF_BUG_QPEL_CHROMA; - if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0) + if(s->avctx->codec_tag == ff_get_fourcc("XVID") && s->xvid_build==0) s->padding_bug_score= 256*256*256*64; if(s->xvid_build && s->xvid_build<=3) @@ -513,9 +523,6 @@ retry: if(s->xvid_build && s->xvid_build<=1) s->workaround_bugs|= FF_BUG_QPEL_CHROMA; - if(s->xvid_build && s->xvid_build>=8) - s->workaround_bugs|= FF_BUG_QPEL_CHROMA2; - #define SET_QPEL_FUNC(postfix1, postfix2) \ s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\ s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\ @@ -524,10 +531,22 @@ retry: if(s->lavc_build && s->lavc_build<4653) s->workaround_bugs|= FF_BUG_STD_QPEL; + if(s->lavc_build && s->lavc_build<4655) + s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE; + + if(s->divx_version) + s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE; //printf("padding_bug_score: %d\n", s->padding_bug_score); + if(s->divx_version==501 && s->divx_build==20020416) + s->padding_bug_score= 256*256*256*64; + + if(s->divx_version>=500){ + s->workaround_bugs|= FF_BUG_EDGE; + } + #if 0 if(s->divx_version==500) - s->workaround_bugs|= FF_BUG_NO_PADDING; + s->padding_bug_score= 256*256*256*64; /* very ugly XVID padding bug detection FIXME/XXX solve this differently * lets hope this at least works @@ -578,7 +597,6 @@ retry: || 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; @@ -603,7 +621,7 @@ retry: s->current_picture.key_frame= s->pict_type == I_TYPE; /* skip b frames if we dont have reference frames */ - if(s->last_picture.data[0]==NULL && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size); + if(s->last_picture_ptr==NULL && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size); /* skip b frames if we are in a hurry */ if(avctx->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size); /* skip everything if we are in a hurry>=5 */ @@ -623,8 +641,7 @@ retry: printf("qscale=%d\n", s->qscale); #endif - if(s->error_resilience) - memset(s->error_status_table, MV_ERROR|AC_ERROR|DC_ERROR|VP_START|AC_END|DC_END|MV_END, s->mb_num*sizeof(UINT8)); + ff_er_frame_start(s); /* decode each macroblock */ s->block_wrap[0]= @@ -637,7 +654,6 @@ retry: s->mb_y=0; decode_slice(s); - s->error_status_table[0]|= VP_START; while(s->mb_y<s->mb_height && s->gb.size_in_bits - get_bits_count(&s->gb)>16){ if(s->msmpeg4_version){ if(s->mb_x!=0 || (s->mb_y%s->slice_height)!=0) @@ -651,8 +667,6 @@ retry: ff_mpeg4_clean_buffers(s); decode_slice(s); - - s->error_status_table[s->resync_mb_x + s->resync_mb_y*s->mb_width]|= VP_START; } if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE) @@ -661,7 +675,7 @@ retry: } /* divx 5.01+ bistream reorder stuff */ - if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_version>=500){ + if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_packed){ int current_pos= get_bits_count(&s->gb)>>3; if( buf_size - current_pos > 5 @@ -681,39 +695,11 @@ retry: } } - if(s->error_resilience){ - int error=0, num_end_markers=0; - for(i=0; i<s->mb_num; i++){ - int status= s->error_status_table[i]; -#if 0 - if(i%s->mb_width == 0) printf("\n"); - printf("%2X ", status); -#endif - if(status==0) continue; - - if(status&(DC_ERROR|AC_ERROR|MV_ERROR)) - error=1; - if(status&VP_START){ - if(num_end_markers) - error=1; - num_end_markers=3; - } - if(status&AC_END) - num_end_markers--; - if(status&DC_END) - num_end_markers--; - if(status&MV_END) - num_end_markers--; - } - if(num_end_markers || error){ - fprintf(stderr, "concealing errors\n"); - ff_error_resilience(s); - } - } + ff_er_frame_end(s); MPV_frame_end(s); - if((avctx->debug&FF_DEBUG_VIS_MV) && s->last_picture.data[0]){ + if((avctx->debug&FF_DEBUG_VIS_MV) && s->last_picture_ptr){ const int shift= 1 + s->quarter_sample; int mb_y; uint8_t *ptr= s->last_picture.data[0]; @@ -771,7 +757,7 @@ retry: avctx->frame_number = s->picture_number - 1; /* dont output the last pic after seeking */ - if(s->last_picture.data[0] || s->low_delay) + if(s->last_picture_ptr || s->low_delay) *data_size = sizeof(AVFrame); #ifdef PRINT_FRAME_TIME printf("%Ld\n", rdtsc()-time); @@ -779,6 +765,12 @@ printf("%Ld\n", rdtsc()-time); return get_consumed_bytes(s, buf_size); } +static const AVOption mpeg4_decoptions[] = +{ + AVOPTION_SUB(avoptions_workaround_bug), + AVOPTION_END() +}; + AVCodec mpeg4_decoder = { "mpeg4", CODEC_TYPE_VIDEO, @@ -789,6 +781,7 @@ AVCodec mpeg4_decoder = { ff_h263_decode_end, ff_h263_decode_frame, CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED, + .options = mpeg4_decoptions, }; AVCodec h263_decoder = { @@ -813,6 +806,7 @@ AVCodec msmpeg4v1_decoder = { ff_h263_decode_end, ff_h263_decode_frame, CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, + mpeg4_decoptions, }; AVCodec msmpeg4v2_decoder = { @@ -825,6 +819,7 @@ AVCodec msmpeg4v2_decoder = { ff_h263_decode_end, ff_h263_decode_frame, CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, + mpeg4_decoptions, }; AVCodec msmpeg4v3_decoder = { @@ -837,6 +832,7 @@ AVCodec msmpeg4v3_decoder = { ff_h263_decode_end, ff_h263_decode_frame, CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, + .options = mpeg4_decoptions, }; AVCodec wmv1_decoder = { @@ -849,6 +845,7 @@ AVCodec wmv1_decoder = { ff_h263_decode_end, ff_h263_decode_frame, CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, + mpeg4_decoptions, }; AVCodec h263i_decoder = { @@ -861,5 +858,6 @@ AVCodec h263i_decoder = { ff_h263_decode_end, ff_h263_decode_frame, CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, + mpeg4_decoptions, }; diff --git a/src/libffmpeg/libavcodec/huffyuv.c b/src/libffmpeg/libavcodec/huffyuv.c index eccb57983..eb4dc8387 100644 --- a/src/libffmpeg/libavcodec/huffyuv.c +++ b/src/libffmpeg/libavcodec/huffyuv.c @@ -67,19 +67,19 @@ typedef struct HYuvContext{ DSPContext dsp; }HYuvContext; -static unsigned char classic_shift_luma[] = { +static const unsigned char classic_shift_luma[] = { 34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8, 16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70, 69,68, 0 }; -static unsigned char classic_shift_chroma[] = { +static const unsigned char classic_shift_chroma[] = { 66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183, 56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119, 214,245,116,83,82,49,80,79,78,77,44,75,41,40,39,38,37,36,34, 0 }; -static unsigned char classic_add_luma[256] = { +static const unsigned char classic_add_luma[256] = { 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37, 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36, 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36, @@ -98,7 +98,7 @@ static unsigned char classic_add_luma[256] = { 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8, }; -static unsigned char classic_add_chroma[256] = { +static const unsigned char classic_add_chroma[256] = { 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9, 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7, 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77, @@ -383,19 +383,16 @@ static int decode_init(AVCodecContext *avctx) s->avctx= avctx; s->flags= avctx->flags; - dsputil_init(&s->dsp, avctx->dsp_mask); + dsputil_init(&s->dsp, avctx); width= s->width= avctx->width; height= s->height= avctx->height; avctx->coded_frame= &s->picture; - s->bgr32=1; - XINE_ASSERT(width,"value 'width' is not defined"); - XINE_ASSERT(height, "value 'height' is not defined"); - - //if(avctx->extradata) - // printf("extradata:%X, extradata_size:%d\n", *(uint32_t*)avctx->extradata, avctx->extradata_size); - +s->bgr32=1; + assert(width && height); +//if(avctx->extradata) +// printf("extradata:%X, extradata_size:%d\n", *(uint32_t*)avctx->extradata, avctx->extradata_size); if(avctx->extradata_size){ if((avctx->bits_per_sample&7) && avctx->bits_per_sample != 12) s->version=1; // do such files exist at all? @@ -467,7 +464,7 @@ static int decode_init(AVCodecContext *avctx) } break; default: - XINE_ASSERT(0,"We do not have a default action."); + assert(0); } // printf("pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced); @@ -507,13 +504,12 @@ static int encode_init(AVCodecContext *avctx) s->avctx= avctx; s->flags= avctx->flags; - dsputil_init(&s->dsp, avctx->dsp_mask); + dsputil_init(&s->dsp, avctx); width= s->width= avctx->width; height= s->height= avctx->height; - XINE_ASSERT(width, "value 'width' is not defined"); - XINE_ASSERT(height, "value 'height' is not defined"); + assert(width && height); avctx->extradata= av_mallocz(1024*10); avctx->stats_out= av_mallocz(1024*10); @@ -697,7 +693,7 @@ static void decode_bgr_bitstream(HYuvContext *s, int count){ static void draw_slice(HYuvContext *s, int y){ int h, cy; - UINT8 *src_ptr[3]; + uint8_t *src_ptr[3]; if(s->avctx->draw_horiz_band==NULL) return; @@ -952,7 +948,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8 *data_size = sizeof(AVFrame); - return (((get_bits_count(&s->gb)+7)>>3) + 3) & ~3; + return (get_bits_count(&s->gb)+31)/32*4; } static int decode_end(AVCodecContext *avctx) @@ -1136,6 +1132,12 @@ static int encode_end(AVCodecContext *avctx) return 0; } +static const AVOption huffyuv_options[] = +{ + AVOPTION_CODEC_INT("prediction_method", "prediction_method", prediction_method, 0, 2, 0), + AVOPTION_END() +}; + AVCodec huffyuv_decoder = { "huffyuv", CODEC_TYPE_VIDEO, @@ -1157,4 +1159,5 @@ AVCodec huffyuv_encoder = { encode_init, encode_frame, encode_end, + .options = huffyuv_options, }; diff --git a/src/libffmpeg/libavcodec/i386/dsputil_mmx.c b/src/libffmpeg/libavcodec/i386/dsputil_mmx.c index 857f1d398..d5a2d3734 100644 --- a/src/libffmpeg/libavcodec/i386/dsputil_mmx.c +++ b/src/libffmpeg/libavcodec/i386/dsputil_mmx.c @@ -20,33 +20,9 @@ */ #include "../dsputil.h" +#include "../simple_idct.h" int mm_flags; /* multimedia extension flags */ -/* FIXME use them in static form */ -int pix_abs16x16_mmx(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs16x16_x2_mmx(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs16x16_y2_mmx(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs16x16_xy2_mmx(UINT8 *blk1, UINT8 *blk2, int lx); - -int pix_abs16x16_mmx2(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs16x16_x2_mmx2(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs16x16_y2_mmx2(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs16x16_xy2_mmx2(UINT8 *blk1, UINT8 *blk2, int lx); - -int pix_abs8x8_mmx(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs8x8_x2_mmx(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs8x8_y2_mmx(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs8x8_xy2_mmx(UINT8 *blk1, UINT8 *blk2, int lx); - -int pix_abs8x8_mmx2(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs8x8_x2_mmx2(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs8x8_y2_mmx2(UINT8 *blk1, UINT8 *blk2, int lx); -int pix_abs8x8_xy2_mmx2(UINT8 *blk1, UINT8 *blk2, int lx); - -int sad16x16_mmx(void *s, UINT8 *blk1, UINT8 *blk2, int lx); -int sad8x8_mmx(void *s, UINT8 *blk1, UINT8 *blk2, int lx); -int sad16x16_mmx2(void *s, UINT8 *blk1, UINT8 *blk2, int lx); -int sad8x8_mmx2(void *s, UINT8 *blk1, UINT8 *blk2, int lx); /* pixel operations */ static const uint64_t mm_bone __attribute__ ((aligned(8))) = 0x0101010101010101ULL; @@ -195,7 +171,7 @@ static const uint64_t ff_pw_15 __attribute__ ((aligned(8))) = 0x000F000F000F000F /***********************************/ /* standard MMX */ -static void get_pixels_mmx(DCTELEM *block, const UINT8 *pixels, int line_size) +static void get_pixels_mmx(DCTELEM *block, const uint8_t *pixels, int line_size) { asm volatile( "movl $-128, %%eax \n\t" @@ -223,7 +199,7 @@ static void get_pixels_mmx(DCTELEM *block, const UINT8 *pixels, int line_size) ); } -static inline void diff_pixels_mmx(DCTELEM *block, const UINT8 *s1, const UINT8 *s2, int stride) +static inline void diff_pixels_mmx(DCTELEM *block, const uint8_t *s1, const uint8_t *s2, int stride) { asm volatile( "pxor %%mm7, %%mm7 \n\t" @@ -252,10 +228,10 @@ static inline void diff_pixels_mmx(DCTELEM *block, const UINT8 *s1, const UINT8 ); } -void put_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size) +void put_pixels_clamped_mmx(const DCTELEM *block, uint8_t *pixels, int line_size) { const DCTELEM *p; - UINT8 *pix; + uint8_t *pix; /* read the pixels */ p = block; @@ -307,10 +283,10 @@ void put_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size) :"memory"); } -void add_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size) +void add_pixels_clamped_mmx(const DCTELEM *block, uint8_t *pixels, int line_size) { const DCTELEM *p; - UINT8 *pix; + uint8_t *pix; int i; /* read the pixels */ @@ -348,7 +324,7 @@ void add_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size) } while (--i); } -static void put_pixels8_mmx(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void put_pixels8_mmx(uint8_t *block, const uint8_t *pixels, int line_size, int h) { __asm __volatile( "lea (%3, %3), %%eax \n\t" @@ -374,7 +350,7 @@ static void put_pixels8_mmx(UINT8 *block, const UINT8 *pixels, int line_size, in ); } -static void put_pixels16_mmx(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void put_pixels16_mmx(uint8_t *block, const uint8_t *pixels, int line_size, int h) { __asm __volatile( "lea (%3, %3), %%eax \n\t" @@ -425,7 +401,7 @@ static void clear_blocks_mmx(DCTELEM *blocks) ); } -static int pix_sum16_mmx(UINT8 * pix, int line_size){ +static int pix_sum16_mmx(uint8_t * pix, int line_size){ const int h=16; int sum; int index= -line_size*h; @@ -528,7 +504,7 @@ static int pix_norm1_mmx(uint8_t *pix, int line_size) { return tmp; } -static int sse16_mmx(void *v, UINT8 * pix1, UINT8 * pix2, int line_size) { +static int sse16_mmx(void *v, uint8_t * pix1, uint8_t * pix2, int line_size) { int tmp; asm volatile ( "movl $16,%%ecx\n" @@ -607,26 +583,21 @@ static void diff_bytes_mmx(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){ for(; i<w; i++) dst[i+0] = src1[i+0]-src2[i+0]; } -#define LBUTTERFLY(a,b)\ - "paddw " #b ", " #a " \n\t"\ - "paddw " #b ", " #b " \n\t"\ - "psubw " #a ", " #b " \n\t" +#define LBUTTERFLY2(a1,b1,a2,b2)\ + "paddw " #b1 ", " #a1 " \n\t"\ + "paddw " #b2 ", " #a2 " \n\t"\ + "paddw " #b1 ", " #b1 " \n\t"\ + "paddw " #b2 ", " #b2 " \n\t"\ + "psubw " #a1 ", " #b1 " \n\t"\ + "psubw " #a2 ", " #b1 " \n\t" #define HADAMARD48\ - LBUTTERFLY(%%mm0, %%mm1)\ - LBUTTERFLY(%%mm2, %%mm3)\ - LBUTTERFLY(%%mm4, %%mm5)\ - LBUTTERFLY(%%mm6, %%mm7)\ - \ - LBUTTERFLY(%%mm0, %%mm2)\ - LBUTTERFLY(%%mm1, %%mm3)\ - LBUTTERFLY(%%mm4, %%mm6)\ - LBUTTERFLY(%%mm5, %%mm7)\ - \ - LBUTTERFLY(%%mm0, %%mm4)\ - LBUTTERFLY(%%mm1, %%mm5)\ - LBUTTERFLY(%%mm2, %%mm6)\ - LBUTTERFLY(%%mm3, %%mm7) + LBUTTERFLY2(%%mm0, %%mm1, %%mm2, %%mm3)\ + LBUTTERFLY2(%%mm4, %%mm5, %%mm6, %%mm7)\ + LBUTTERFLY2(%%mm0, %%mm2, %%mm1, %%mm3)\ + LBUTTERFLY2(%%mm4, %%mm6, %%mm5, %%mm7)\ + LBUTTERFLY2(%%mm0, %%mm4, %%mm1, %%mm5)\ + LBUTTERFLY2(%%mm2, %%mm6, %%mm3, %%mm7)\ #define MMABS(a,z)\ "pxor " #z ", " #z " \n\t"\ @@ -641,12 +612,22 @@ static void diff_bytes_mmx(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){ "psubw " #z ", " #a " \n\t"\ "paddusw " #a ", " #sum " \n\t" - +#define MMABS_MMX2(a,z)\ + "pxor " #z ", " #z " \n\t"\ + "psubw " #a ", " #z " \n\t"\ + "pmaxsw " #z ", " #a " \n\t" + +#define MMABS_SUM_MMX2(a,z, sum)\ + "pxor " #z ", " #z " \n\t"\ + "psubw " #a ", " #z " \n\t"\ + "pmaxsw " #z ", " #a " \n\t"\ + "paddusw " #a ", " #sum " \n\t" + #define SBUTTERFLY(a,b,t,n)\ "movq " #a ", " #t " \n\t" /* abcd */\ "punpckl" #n " " #b ", " #a " \n\t" /* aebf */\ "punpckh" #n " " #b ", " #t " \n\t" /* cgdh */\ - + #define TRANSPOSE4(a,b,c,d,t)\ SBUTTERFLY(a,b,t,wd) /* a=aebf t=cgdh */\ SBUTTERFLY(c,d,b,wd) /* c=imjn b=kolp */\ @@ -750,7 +731,94 @@ static int hadamard8_diff_mmx(void *s, uint8_t *src1, uint8_t *src2, int stride) return sum&0xFFFF; } +static int hadamard8_diff_mmx2(void *s, uint8_t *src1, uint8_t *src2, int stride){ + uint64_t temp[16] __align8; + int sum=0; + + diff_pixels_mmx((DCTELEM*)temp, src1, src2, stride); + + asm volatile( + LOAD4(0 , %%mm0, %%mm1, %%mm2, %%mm3) + LOAD4(64, %%mm4, %%mm5, %%mm6, %%mm7) + + HADAMARD48 + + "movq %%mm7, 112(%1) \n\t" + + TRANSPOSE4(%%mm0, %%mm1, %%mm2, %%mm3, %%mm7) + STORE4(0 , %%mm0, %%mm3, %%mm7, %%mm2) + + "movq 112(%1), %%mm7 \n\t" + TRANSPOSE4(%%mm4, %%mm5, %%mm6, %%mm7, %%mm0) + STORE4(64, %%mm4, %%mm7, %%mm0, %%mm6) + + LOAD4(8 , %%mm0, %%mm1, %%mm2, %%mm3) + LOAD4(72, %%mm4, %%mm5, %%mm6, %%mm7) + + HADAMARD48 + + "movq %%mm7, 120(%1) \n\t" + + TRANSPOSE4(%%mm0, %%mm1, %%mm2, %%mm3, %%mm7) + STORE4(8 , %%mm0, %%mm3, %%mm7, %%mm2) + + "movq 120(%1), %%mm7 \n\t" + TRANSPOSE4(%%mm4, %%mm5, %%mm6, %%mm7, %%mm0) + "movq %%mm7, %%mm5 \n\t"//FIXME remove + "movq %%mm6, %%mm7 \n\t" + "movq %%mm0, %%mm6 \n\t" +// STORE4(72, %%mm4, %%mm7, %%mm0, %%mm6) //FIXME remove + + LOAD4(64, %%mm0, %%mm1, %%mm2, %%mm3) +// LOAD4(72, %%mm4, %%mm5, %%mm6, %%mm7) + + HADAMARD48 + "movq %%mm7, 64(%1) \n\t" + MMABS_MMX2(%%mm0, %%mm7) + MMABS_SUM_MMX2(%%mm1, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm2, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm3, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm4, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm5, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm6, %%mm7, %%mm0) + "movq 64(%1), %%mm1 \n\t" + MMABS_SUM_MMX2(%%mm1, %%mm7, %%mm0) + "movq %%mm0, 64(%1) \n\t" + + LOAD4(0 , %%mm0, %%mm1, %%mm2, %%mm3) + LOAD4(8 , %%mm4, %%mm5, %%mm6, %%mm7) + + HADAMARD48 + "movq %%mm7, (%1) \n\t" + MMABS_MMX2(%%mm0, %%mm7) + MMABS_SUM_MMX2(%%mm1, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm2, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm3, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm4, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm5, %%mm7, %%mm0) + MMABS_SUM_MMX2(%%mm6, %%mm7, %%mm0) + "movq (%1), %%mm1 \n\t" + MMABS_SUM_MMX2(%%mm1, %%mm7, %%mm0) + "movq 64(%1), %%mm1 \n\t" + MMABS_SUM_MMX2(%%mm1, %%mm7, %%mm0) + + "movq %%mm0, %%mm1 \n\t" + "psrlq $32, %%mm0 \n\t" + "paddusw %%mm1, %%mm0 \n\t" + "movq %%mm0, %%mm1 \n\t" + "psrlq $16, %%mm0 \n\t" + "paddusw %%mm1, %%mm0 \n\t" + "movd %%mm0, %0 \n\t" + + : "=r" (sum) + : "r"(temp) + ); + return sum&0xFFFF; +} + + WARPER88_1616(hadamard8_diff_mmx, hadamard8_diff16_mmx) +WARPER88_1616(hadamard8_diff_mmx2, hadamard8_diff16_mmx2) #define put_no_rnd_pixels8_mmx(a,b,c,d) put_pixels8_mmx(a,b,c,d) #define put_no_rnd_pixels16_mmx(a,b,c,d) put_pixels16_mmx(a,b,c,d) @@ -777,7 +845,7 @@ WARPER88_1616(hadamard8_diff_mmx, hadamard8_diff16_mmx) OP(%%mm5, out, %%mm7, d) #define QPEL_BASE(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)\ -void OPNAME ## mpeg4_qpel16_h_lowpass_mmx2(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\ +static void OPNAME ## mpeg4_qpel16_h_lowpass_mmx2(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\ uint64_t temp;\ \ asm volatile(\ @@ -944,7 +1012,7 @@ static void OPNAME ## mpeg4_qpel16_h_lowpass_3dnow(uint8_t *dst, uint8_t *src, i }\ }\ \ -void OPNAME ## mpeg4_qpel8_h_lowpass_mmx2(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\ +static void OPNAME ## mpeg4_qpel8_h_lowpass_mmx2(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\ uint64_t temp;\ \ asm volatile(\ @@ -1121,7 +1189,7 @@ static void OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, );\ }\ \ -void OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ +static void OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ uint64_t temp[9*4];\ uint64_t *temp_ptr= temp;\ int count= 9;\ @@ -1181,46 +1249,46 @@ void OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dst );\ }\ \ -static void OPNAME ## qpel8_mc00_ ## MMX (UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc00_ ## MMX (uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## pixels8_mmx(dst, src, stride, 8);\ }\ \ -static void OPNAME ## qpel8_mc10_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc10_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t temp[8];\ uint8_t * const half= (uint8_t*)temp;\ put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(half, src, 8, stride, 8);\ OPNAME ## pixels8_l2_mmx(dst, src, half, stride, stride, 8);\ }\ \ -static void OPNAME ## qpel8_mc20_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc20_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## mpeg4_qpel8_h_lowpass_ ## MMX(dst, src, stride, stride, 8);\ }\ \ -static void OPNAME ## qpel8_mc30_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc30_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t temp[8];\ uint8_t * const half= (uint8_t*)temp;\ put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(half, src, 8, stride, 8);\ OPNAME ## pixels8_l2_mmx(dst, src+1, half, stride, stride, 8);\ }\ \ -static void OPNAME ## qpel8_mc01_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc01_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t temp[8];\ uint8_t * const half= (uint8_t*)temp;\ put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(half, src, 8, stride);\ OPNAME ## pixels8_l2_mmx(dst, src, half, stride, stride, 8);\ }\ \ -static void OPNAME ## qpel8_mc02_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc02_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, src, stride, stride);\ }\ \ -static void OPNAME ## qpel8_mc03_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc03_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t temp[8];\ uint8_t * const half= (uint8_t*)temp;\ put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(half, src, 8, stride);\ OPNAME ## pixels8_l2_mmx(dst, src+stride, half, stride, stride, 8);\ }\ -static void OPNAME ## qpel8_mc11_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc11_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[8 + 9];\ uint8_t * const halfH= ((uint8_t*)half) + 64;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1229,7 +1297,7 @@ static void OPNAME ## qpel8_mc11_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2_mmx(dst, halfH, halfHV, stride, 8, 8);\ }\ -static void OPNAME ## qpel8_mc31_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc31_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[8 + 9];\ uint8_t * const halfH= ((uint8_t*)half) + 64;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1238,7 +1306,7 @@ static void OPNAME ## qpel8_mc31_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2_mmx(dst, halfH, halfHV, stride, 8, 8);\ }\ -static void OPNAME ## qpel8_mc13_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc13_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[8 + 9];\ uint8_t * const halfH= ((uint8_t*)half) + 64;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1247,7 +1315,7 @@ static void OPNAME ## qpel8_mc13_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2_mmx(dst, halfH+8, halfHV, stride, 8, 8);\ }\ -static void OPNAME ## qpel8_mc33_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc33_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[8 + 9];\ uint8_t * const halfH= ((uint8_t*)half) + 64;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1256,7 +1324,7 @@ static void OPNAME ## qpel8_mc33_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2_mmx(dst, halfH+8, halfHV, stride, 8, 8);\ }\ -static void OPNAME ## qpel8_mc21_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc21_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[8 + 9];\ uint8_t * const halfH= ((uint8_t*)half) + 64;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1264,7 +1332,7 @@ static void OPNAME ## qpel8_mc21_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2_mmx(dst, halfH, halfHV, stride, 8, 8);\ }\ -static void OPNAME ## qpel8_mc23_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc23_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[8 + 9];\ uint8_t * const halfH= ((uint8_t*)half) + 64;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1272,66 +1340,66 @@ static void OPNAME ## qpel8_mc23_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\ OPNAME ## pixels8_l2_mmx(dst, halfH+8, halfHV, stride, 8, 8);\ }\ -static void OPNAME ## qpel8_mc12_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc12_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[8 + 9];\ uint8_t * const halfH= ((uint8_t*)half);\ put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, stride, 9);\ put ## RND ## pixels8_l2_mmx(halfH, src, halfH, 8, stride, 9);\ OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, stride, 8);\ }\ -static void OPNAME ## qpel8_mc32_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc32_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[8 + 9];\ uint8_t * const halfH= ((uint8_t*)half);\ put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, stride, 9);\ put ## RND ## pixels8_l2_mmx(halfH, src+1, halfH, 8, stride, 9);\ OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, stride, 8);\ }\ -static void OPNAME ## qpel8_mc22_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel8_mc22_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[9];\ uint8_t * const halfH= ((uint8_t*)half);\ put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, stride, 9);\ OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, stride, 8);\ }\ -static void OPNAME ## qpel16_mc00_ ## MMX (UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc00_ ## MMX (uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## pixels16_mmx(dst, src, stride, 16);\ }\ \ -static void OPNAME ## qpel16_mc10_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc10_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t temp[32];\ uint8_t * const half= (uint8_t*)temp;\ put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(half, src, 16, stride, 16);\ OPNAME ## pixels16_l2_mmx(dst, src, half, stride, stride, 16);\ }\ \ -static void OPNAME ## qpel16_mc20_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc20_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## mpeg4_qpel16_h_lowpass_ ## MMX(dst, src, stride, stride, 16);\ }\ \ -static void OPNAME ## qpel16_mc30_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc30_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t temp[32];\ uint8_t * const half= (uint8_t*)temp;\ put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(half, src, 16, stride, 16);\ OPNAME ## pixels16_l2_mmx(dst, src+1, half, stride, stride, 16);\ }\ \ -static void OPNAME ## qpel16_mc01_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc01_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t temp[32];\ uint8_t * const half= (uint8_t*)temp;\ put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(half, src, 16, stride);\ OPNAME ## pixels16_l2_mmx(dst, src, half, stride, stride, 16);\ }\ \ -static void OPNAME ## qpel16_mc02_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc02_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, src, stride, stride);\ }\ \ -static void OPNAME ## qpel16_mc03_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc03_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t temp[32];\ uint8_t * const half= (uint8_t*)temp;\ put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(half, src, 16, stride);\ OPNAME ## pixels16_l2_mmx(dst, src+stride, half, stride, stride, 16);\ }\ -static void OPNAME ## qpel16_mc11_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc11_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[16*2 + 17*2];\ uint8_t * const halfH= ((uint8_t*)half) + 256;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1340,7 +1408,7 @@ static void OPNAME ## qpel16_mc11_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2_mmx(dst, halfH, halfHV, stride, 16, 16);\ }\ -static void OPNAME ## qpel16_mc31_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc31_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[16*2 + 17*2];\ uint8_t * const halfH= ((uint8_t*)half) + 256;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1349,7 +1417,7 @@ static void OPNAME ## qpel16_mc31_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2_mmx(dst, halfH, halfHV, stride, 16, 16);\ }\ -static void OPNAME ## qpel16_mc13_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc13_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[16*2 + 17*2];\ uint8_t * const halfH= ((uint8_t*)half) + 256;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1358,7 +1426,7 @@ static void OPNAME ## qpel16_mc13_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2_mmx(dst, halfH+16, halfHV, stride, 16, 16);\ }\ -static void OPNAME ## qpel16_mc33_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc33_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[16*2 + 17*2];\ uint8_t * const halfH= ((uint8_t*)half) + 256;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1367,7 +1435,7 @@ static void OPNAME ## qpel16_mc33_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2_mmx(dst, halfH+16, halfHV, stride, 16, 16);\ }\ -static void OPNAME ## qpel16_mc21_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc21_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[16*2 + 17*2];\ uint8_t * const halfH= ((uint8_t*)half) + 256;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1375,7 +1443,7 @@ static void OPNAME ## qpel16_mc21_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2_mmx(dst, halfH, halfHV, stride, 16, 16);\ }\ -static void OPNAME ## qpel16_mc23_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc23_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[16*2 + 17*2];\ uint8_t * const halfH= ((uint8_t*)half) + 256;\ uint8_t * const halfHV= ((uint8_t*)half);\ @@ -1383,21 +1451,21 @@ static void OPNAME ## qpel16_mc23_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, 16, 16);\ OPNAME ## pixels16_l2_mmx(dst, halfH+16, halfHV, stride, 16, 16);\ }\ -static void OPNAME ## qpel16_mc12_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc12_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[17*2];\ uint8_t * const halfH= ((uint8_t*)half);\ put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, stride, 17);\ put ## RND ## pixels16_l2_mmx(halfH, src, halfH, 16, stride, 17);\ OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, halfH, stride, 16);\ }\ -static void OPNAME ## qpel16_mc32_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc32_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[17*2];\ uint8_t * const halfH= ((uint8_t*)half);\ put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, stride, 17);\ put ## RND ## pixels16_l2_mmx(halfH, src+1, halfH, 16, stride, 17);\ OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, halfH, stride, 16);\ }\ -static void OPNAME ## qpel16_mc22_ ## MMX(UINT8 *dst, UINT8 *src, int stride){\ +static void OPNAME ## qpel16_mc22_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\ uint64_t half[17*2];\ uint8_t * const halfH= ((uint8_t*)half);\ put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, stride, 17);\ @@ -1433,10 +1501,45 @@ static void just_return() { return; } c->put_ ## postfix1 = put_ ## postfix2;\ c->put_no_rnd_ ## postfix1 = put_no_rnd_ ## postfix2;\ c->avg_ ## postfix1 = avg_ ## postfix2; + +/* external functions, from idct_mmx.c */ +void ff_mmx_idct(DCTELEM *block); +void ff_mmxext_idct(DCTELEM *block); + +/* XXX: those functions should be suppressed ASAP when all IDCTs are + converted */ +static void ff_libmpeg2mmx_idct_put(uint8_t *dest, int line_size, DCTELEM *block) +{ + ff_mmx_idct (block); + put_pixels_clamped_mmx(block, dest, line_size); +} +static void ff_libmpeg2mmx_idct_add(uint8_t *dest, int line_size, DCTELEM *block) +{ + ff_mmx_idct (block); + add_pixels_clamped_mmx(block, dest, line_size); +} +static void ff_libmpeg2mmx2_idct_put(uint8_t *dest, int line_size, DCTELEM *block) +{ + ff_mmxext_idct (block); + put_pixels_clamped_mmx(block, dest, line_size); +} +static void ff_libmpeg2mmx2_idct_add(uint8_t *dest, int line_size, DCTELEM *block) +{ + ff_mmxext_idct (block); + add_pixels_clamped_mmx(block, dest, line_size); +} -void dsputil_init_mmx(DSPContext* c, unsigned mask) +void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) { mm_flags = mm_support(); + + if (avctx->dsp_mask) { + if (avctx->dsp_mask & FF_MM_FORCE) + mm_flags |= (avctx->dsp_mask & 0xffff); + else + mm_flags &= ~(avctx->dsp_mask & 0xffff); + } + #if 0 fprintf(stderr, "libavcodec: CPU flags:"); if (mm_flags & MM_MMX) @@ -1453,6 +1556,27 @@ void dsputil_init_mmx(DSPContext* c, unsigned mask) #endif if (mm_flags & MM_MMX) { + const int dct_algo = avctx->dct_algo; + const int idct_algo= avctx->idct_algo; + + if(dct_algo==FF_DCT_AUTO || dct_algo==FF_DCT_MMX) + c->fdct = ff_fdct_mmx; + + if(idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_SIMPLEMMX){ + c->idct_put= ff_simple_idct_put_mmx; + c->idct_add= ff_simple_idct_add_mmx; + c->idct_permutation_type= FF_SIMPLE_IDCT_PERM; + }else if(idct_algo==FF_IDCT_LIBMPEG2MMX){ + if(mm_flags & MM_MMXEXT){ + c->idct_put= ff_libmpeg2mmx2_idct_put; + c->idct_add= ff_libmpeg2mmx2_idct_add; + }else{ + c->idct_put= ff_libmpeg2mmx_idct_put; + c->idct_add= ff_libmpeg2mmx_idct_add; + } + c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; + } + c->get_pixels = get_pixels_mmx; c->diff_pixels = diff_pixels_mmx; c->put_pixels_clamped = put_pixels_clamped_mmx; @@ -1460,15 +1584,6 @@ void dsputil_init_mmx(DSPContext* c, unsigned mask) c->clear_blocks = clear_blocks_mmx; c->pix_sum = pix_sum16_mmx; - c->pix_abs16x16 = pix_abs16x16_mmx; - c->pix_abs16x16_x2 = pix_abs16x16_x2_mmx; - c->pix_abs16x16_y2 = pix_abs16x16_y2_mmx; - c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx; - c->pix_abs8x8 = pix_abs8x8_mmx; - c->pix_abs8x8_x2 = pix_abs8x8_x2_mmx; - c->pix_abs8x8_y2 = pix_abs8x8_y2_mmx; - c->pix_abs8x8_xy2 = pix_abs8x8_xy2_mmx; - c->put_pixels_tab[0][0] = put_pixels16_mmx; c->put_pixels_tab[0][1] = put_pixels16_x2_mmx; c->put_pixels_tab[0][2] = put_pixels16_y2_mmx; @@ -1515,45 +1630,35 @@ void dsputil_init_mmx(DSPContext* c, unsigned mask) c->hadamard8_diff[0]= hadamard8_diff16_mmx; c->hadamard8_diff[1]= hadamard8_diff_mmx; - c->sad[0]= sad16x16_mmx; - c->sad[1]= sad8x8_mmx; - c->pix_norm1 = pix_norm1_mmx; c->sse[0] = sse16_mmx; if (mm_flags & MM_MMXEXT) { - c->pix_abs16x16 = pix_abs16x16_mmx2; - c->pix_abs16x16_x2 = pix_abs16x16_x2_mmx2; - c->pix_abs16x16_y2 = pix_abs16x16_y2_mmx2; - c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx2; - - c->pix_abs8x8 = pix_abs8x8_mmx2; - c->pix_abs8x8_x2 = pix_abs8x8_x2_mmx2; - c->pix_abs8x8_y2 = pix_abs8x8_y2_mmx2; - c->pix_abs8x8_xy2 = pix_abs8x8_xy2_mmx2; - - c->sad[0]= sad16x16_mmx2; - c->sad[1]= sad8x8_mmx2; - c->put_pixels_tab[0][1] = put_pixels16_x2_mmx2; c->put_pixels_tab[0][2] = put_pixels16_y2_mmx2; - c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx2; - c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx2; c->avg_pixels_tab[0][0] = avg_pixels16_mmx2; c->avg_pixels_tab[0][1] = avg_pixels16_x2_mmx2; c->avg_pixels_tab[0][2] = avg_pixels16_y2_mmx2; - c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx2; c->put_pixels_tab[1][1] = put_pixels8_x2_mmx2; c->put_pixels_tab[1][2] = put_pixels8_y2_mmx2; - c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx2; - c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx2; c->avg_pixels_tab[1][0] = avg_pixels8_mmx2; c->avg_pixels_tab[1][1] = avg_pixels8_x2_mmx2; c->avg_pixels_tab[1][2] = avg_pixels8_y2_mmx2; - c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx2; + + c->hadamard8_diff[0]= hadamard8_diff16_mmx2; + c->hadamard8_diff[1]= hadamard8_diff_mmx2; + + if(!(avctx->flags & CODEC_FLAG_BITEXACT)){ + c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx2; + c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx2; + c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx2; + c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx2; + c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx2; + c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx2; + } #if 1 SET_QPEL_FUNC(qpel_pixels_tab[0][ 0], qpel16_mc00_mmx2) @@ -1592,23 +1697,26 @@ void dsputil_init_mmx(DSPContext* c, unsigned mask) } else if (mm_flags & MM_3DNOW) { c->put_pixels_tab[0][1] = put_pixels16_x2_3dnow; c->put_pixels_tab[0][2] = put_pixels16_y2_3dnow; - c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_3dnow; - c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_3dnow; c->avg_pixels_tab[0][0] = avg_pixels16_3dnow; c->avg_pixels_tab[0][1] = avg_pixels16_x2_3dnow; c->avg_pixels_tab[0][2] = avg_pixels16_y2_3dnow; - c->avg_pixels_tab[0][3] = avg_pixels16_xy2_3dnow; c->put_pixels_tab[1][1] = put_pixels8_x2_3dnow; c->put_pixels_tab[1][2] = put_pixels8_y2_3dnow; - c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_3dnow; - c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_3dnow; c->avg_pixels_tab[1][0] = avg_pixels8_3dnow; c->avg_pixels_tab[1][1] = avg_pixels8_x2_3dnow; c->avg_pixels_tab[1][2] = avg_pixels8_y2_3dnow; - c->avg_pixels_tab[1][3] = avg_pixels8_xy2_3dnow; + + if(!(avctx->flags & CODEC_FLAG_BITEXACT)){ + c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_3dnow; + c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_3dnow; + c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_3dnow; + c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_3dnow; + c->avg_pixels_tab[0][3] = avg_pixels16_xy2_3dnow; + c->avg_pixels_tab[1][3] = avg_pixels8_xy2_3dnow; + } SET_QPEL_FUNC(qpel_pixels_tab[0][ 0], qpel16_mc00_3dnow) SET_QPEL_FUNC(qpel_pixels_tab[0][ 1], qpel16_mc10_3dnow) @@ -1644,7 +1752,8 @@ void dsputil_init_mmx(DSPContext* c, unsigned mask) SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_3dnow) } } - + + dsputil_init_pix_mmx(c, avctx); #if 0 // for speed testing get_pixels = just_return; @@ -1680,28 +1789,3 @@ void dsputil_init_mmx(DSPContext* c, unsigned mask) //ff_idct = just_return; #endif } - -/* remove any non bit exact operation (testing purpose). NOTE that - this function should be kept as small as possible because it is - always difficult to test automatically non bit exact cases. */ -void dsputil_set_bit_exact_mmx(DSPContext* c, unsigned mask) -{ - if (mm_flags & MM_MMX) { - /* MMX2 & 3DNOW */ - c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx; - c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx; - c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx; - c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx; - c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx; - c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx; - - if (mm_flags & MM_MMXEXT) { - c->pix_abs16x16_x2 = pix_abs16x16_x2_mmx; - c->pix_abs16x16_y2 = pix_abs16x16_y2_mmx; - c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx; - c->pix_abs8x8_x2 = pix_abs8x8_x2_mmx; - c->pix_abs8x8_y2 = pix_abs8x8_y2_mmx; - c->pix_abs8x8_xy2= pix_abs8x8_xy2_mmx; - } - } -} diff --git a/src/libffmpeg/libavcodec/i386/dsputil_mmx_avg.h b/src/libffmpeg/libavcodec/i386/dsputil_mmx_avg.h index 4a8841156..8418123ac 100644 --- a/src/libffmpeg/libavcodec/i386/dsputil_mmx_avg.h +++ b/src/libffmpeg/libavcodec/i386/dsputil_mmx_avg.h @@ -25,7 +25,7 @@ /* XXX: we use explicit registers to avoid a gcc 2.95.2 register asm clobber bug - now it will work with 2.95.2 and also with -fPIC */ -static void DEF(put_pixels8_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put_pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { __asm __volatile( "lea (%3, %3), %%eax \n\t" @@ -85,7 +85,7 @@ static void DEF(put_pixels8_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int :"memory"); } -static void DEF(put_pixels16_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put_pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { __asm __volatile( "lea (%3, %3), %%eax \n\t" @@ -154,7 +154,7 @@ static void DEF(put_pixels16_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int } /* GL: this function does incorrect rounding if overflow */ -static void DEF(put_no_rnd_pixels8_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put_no_rnd_pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BONE(mm6); __asm __volatile( @@ -191,7 +191,7 @@ static void DEF(put_no_rnd_pixels8_x2)(UINT8 *block, const UINT8 *pixels, int li :"%eax", "memory"); } -static void DEF(put_pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put_pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { __asm __volatile( "lea (%3, %3), %%eax \n\t" @@ -222,7 +222,7 @@ static void DEF(put_pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_size } /* GL: this function does incorrect rounding if overflow */ -static void DEF(put_no_rnd_pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put_no_rnd_pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BONE(mm6); __asm __volatile( @@ -255,7 +255,7 @@ static void DEF(put_no_rnd_pixels8_y2)(UINT8 *block, const UINT8 *pixels, int li :"%eax", "memory"); } -static void DEF(avg_pixels8)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg_pixels8)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { __asm __volatile( "lea (%3, %3), %%eax \n\t" @@ -283,7 +283,7 @@ static void DEF(avg_pixels8)(UINT8 *block, const UINT8 *pixels, int line_size, i :"%eax", "memory"); } -static void DEF(avg_pixels8_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg_pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { __asm __volatile( "lea (%3, %3), %%eax \n\t" @@ -315,7 +315,7 @@ static void DEF(avg_pixels8_x2)(UINT8 *block, const UINT8 *pixels, int line_size :"%eax", "memory"); } -static void DEF(avg_pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg_pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { __asm __volatile( "lea (%3, %3), %%eax \n\t" @@ -354,7 +354,7 @@ static void DEF(avg_pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_size } // Note this is not correctly rounded, but this function is only used for b frames so it doesnt matter -static void DEF(avg_pixels8_xy2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg_pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BONE(mm6); __asm __volatile( @@ -396,31 +396,31 @@ static void DEF(avg_pixels8_xy2)(UINT8 *block, const UINT8 *pixels, int line_siz } //FIXME the following could be optimized too ... -static void DEF(put_no_rnd_pixels16_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(put_no_rnd_pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(put_no_rnd_pixels8_x2)(block , pixels , line_size, h); DEF(put_no_rnd_pixels8_x2)(block+8, pixels+8, line_size, h); } -static void DEF(put_pixels16_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(put_pixels16_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(put_pixels8_y2)(block , pixels , line_size, h); DEF(put_pixels8_y2)(block+8, pixels+8, line_size, h); } -static void DEF(put_no_rnd_pixels16_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(put_no_rnd_pixels16_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(put_no_rnd_pixels8_y2)(block , pixels , line_size, h); DEF(put_no_rnd_pixels8_y2)(block+8, pixels+8, line_size, h); } -static void DEF(avg_pixels16)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(avg_pixels16)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(avg_pixels8)(block , pixels , line_size, h); DEF(avg_pixels8)(block+8, pixels+8, line_size, h); } -static void DEF(avg_pixels16_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(avg_pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(avg_pixels8_x2)(block , pixels , line_size, h); DEF(avg_pixels8_x2)(block+8, pixels+8, line_size, h); } -static void DEF(avg_pixels16_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(avg_pixels16_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(avg_pixels8_y2)(block , pixels , line_size, h); DEF(avg_pixels8_y2)(block+8, pixels+8, line_size, h); } -static void DEF(avg_pixels16_xy2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(avg_pixels16_xy2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(avg_pixels8_xy2)(block , pixels , line_size, h); DEF(avg_pixels8_xy2)(block+8, pixels+8, line_size, h); } diff --git a/src/libffmpeg/libavcodec/i386/dsputil_mmx_rnd.h b/src/libffmpeg/libavcodec/i386/dsputil_mmx_rnd.h index 956edf798..bbd5aec97 100644 --- a/src/libffmpeg/libavcodec/i386/dsputil_mmx_rnd.h +++ b/src/libffmpeg/libavcodec/i386/dsputil_mmx_rnd.h @@ -22,7 +22,7 @@ */ // put_pixels -static void DEF(put, pixels8_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put, pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BFE(mm6); __asm __volatile( @@ -104,7 +104,7 @@ static void DEF(put, pixels8_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int :"memory"); } -static void DEF(put, pixels16_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put, pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BFE(mm6); __asm __volatile( @@ -199,7 +199,7 @@ static void DEF(put, pixels16_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, in :"memory"); } -static void DEF(put, pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put, pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BFE(mm6); __asm __volatile( @@ -228,7 +228,7 @@ static void DEF(put, pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_siz :"eax", "memory"); } -static void DEF(put, pixels8_xy2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(put, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_ZERO(mm7); SET_RND(mm6); // =2 for rnd and =1 for no_rnd version @@ -296,7 +296,7 @@ static void DEF(put, pixels8_xy2)(UINT8 *block, const UINT8 *pixels, int line_si // avg_pixels // in case more speed is needed - unroling would certainly help -static void DEF(avg, pixels8)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg, pixels8)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BFE(mm6); JUMPALIGN(); @@ -315,7 +315,7 @@ static void DEF(avg, pixels8)(UINT8 *block, const UINT8 *pixels, int line_size, while (--h); } -static void DEF(avg, pixels16)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg, pixels16)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BFE(mm6); JUMPALIGN(); @@ -338,7 +338,7 @@ static void DEF(avg, pixels16)(UINT8 *block, const UINT8 *pixels, int line_size, while (--h); } -static void DEF(avg, pixels8_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg, pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BFE(mm6); JUMPALIGN(); @@ -379,7 +379,7 @@ static void DEF(avg, pixels8_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int } while (--h); } -static void DEF(avg, pixels16_x2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg, pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BFE(mm6); JUMPALIGN(); @@ -432,7 +432,7 @@ static void DEF(avg, pixels16_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, in } while (--h); } -static void DEF(avg, pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg, pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_BFE(mm6); __asm __volatile( @@ -472,7 +472,7 @@ static void DEF(avg, pixels8_y2)(UINT8 *block, const UINT8 *pixels, int line_siz } // this routine is 'slightly' suboptimal but mostly unused -static void DEF(avg, pixels8_xy2)(UINT8 *block, const UINT8 *pixels, int line_size, int h) +static void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int line_size, int h) { MOVQ_ZERO(mm7); SET_RND(mm6); // =2 for rnd and =1 for no_rnd version @@ -547,22 +547,22 @@ static void DEF(avg, pixels8_xy2)(UINT8 *block, const UINT8 *pixels, int line_si } //FIXME optimize -static void DEF(put, pixels16_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(put, pixels16_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(put, pixels8_y2)(block , pixels , line_size, h); DEF(put, pixels8_y2)(block+8, pixels+8, line_size, h); } -static void DEF(put, pixels16_xy2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(put, pixels16_xy2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(put, pixels8_xy2)(block , pixels , line_size, h); DEF(put, pixels8_xy2)(block+8, pixels+8, line_size, h); } -static void DEF(avg, pixels16_y2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(avg, pixels16_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(avg, pixels8_y2)(block , pixels , line_size, h); DEF(avg, pixels8_y2)(block+8, pixels+8, line_size, h); } -static void DEF(avg, pixels16_xy2)(UINT8 *block, const UINT8 *pixels, int line_size, int h){ +static void DEF(avg, pixels16_xy2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){ DEF(avg, pixels8_xy2)(block , pixels , line_size, h); DEF(avg, pixels8_xy2)(block+8, pixels+8, line_size, h); } diff --git a/src/libffmpeg/libavcodec/i386/motion_est_mmx.c b/src/libffmpeg/libavcodec/i386/motion_est_mmx.c index fa85db67b..5c4b32dcd 100644 --- a/src/libffmpeg/libavcodec/i386/motion_est_mmx.c +++ b/src/libffmpeg/libavcodec/i386/motion_est_mmx.c @@ -20,7 +20,7 @@ */ #include "../dsputil.h" -static const __attribute__ ((aligned(8))) UINT64 round_tab[3]={ +static const __attribute__ ((aligned(8))) uint64_t round_tab[3]={ 0x0000000000000000, 0x0001000100010001, 0x0002000200020002, @@ -28,7 +28,7 @@ static const __attribute__ ((aligned(8))) UINT64 round_tab[3]={ static __attribute__ ((aligned(8))) uint64_t bone= 0x0101010101010101LL; -static inline void sad8_mmx(UINT8 *blk1, UINT8 *blk2, int stride, int h) +static inline void sad8_mmx(uint8_t *blk1, uint8_t *blk2, int stride, int h) { int len= -(stride<<h); asm volatile( @@ -64,7 +64,7 @@ static inline void sad8_mmx(UINT8 *blk1, UINT8 *blk2, int stride, int h) ); } -static inline void sad8_mmx2(UINT8 *blk1, UINT8 *blk2, int stride, int h) +static inline void sad8_mmx2(uint8_t *blk1, uint8_t *blk2, int stride, int h) { int len= -(stride<<h); asm volatile( @@ -86,7 +86,7 @@ static inline void sad8_mmx2(UINT8 *blk1, UINT8 *blk2, int stride, int h) ); } -static inline void sad8_2_mmx2(UINT8 *blk1a, UINT8 *blk1b, UINT8 *blk2, int stride, int h) +static inline void sad8_2_mmx2(uint8_t *blk1a, uint8_t *blk1b, uint8_t *blk2, int stride, int h) { int len= -(stride<<h); asm volatile( @@ -112,13 +112,13 @@ static inline void sad8_2_mmx2(UINT8 *blk1a, UINT8 *blk1b, UINT8 *blk2, int stri ); } -static inline void sad8_4_mmx2(UINT8 *blk1, UINT8 *blk2, int stride, int h) +static inline void sad8_4_mmx2(uint8_t *blk1, uint8_t *blk2, int stride, int h) { //FIXME reuse src int len= -(stride<<h); asm volatile( ".balign 16 \n\t" "movq "MANGLE(bone)", %%mm5 \n\t" - "1: \n\t" + "1: \n\t" "movq (%1, %%eax), %%mm0 \n\t" "movq (%2, %%eax), %%mm2 \n\t" "movq 1(%1, %%eax), %%mm1 \n\t" @@ -149,7 +149,7 @@ static inline void sad8_4_mmx2(UINT8 *blk1, UINT8 *blk2, int stride, int h) ); } -static inline void sad8_2_mmx(UINT8 *blk1a, UINT8 *blk1b, UINT8 *blk2, int stride, int h) +static inline void sad8_2_mmx(uint8_t *blk1a, uint8_t *blk1b, uint8_t *blk2, int stride, int h) { int len= -(stride<<h); asm volatile( @@ -165,7 +165,7 @@ static inline void sad8_2_mmx(UINT8 *blk1a, UINT8 *blk1b, UINT8 *blk2, int strid "punpckhbw %%mm7, %%mm3 \n\t" "paddw %%mm0, %%mm1 \n\t" "paddw %%mm2, %%mm3 \n\t" - "movq (%3, %%eax), %%mm4 \n\t" + "movq (%3, %%eax), %%mm4 \n\t" "movq (%3, %%eax), %%mm2 \n\t" "paddw %%mm5, %%mm1 \n\t" "paddw %%mm5, %%mm3 \n\t" @@ -187,7 +187,7 @@ static inline void sad8_2_mmx(UINT8 *blk1a, UINT8 *blk1b, UINT8 *blk2, int strid ); } -static inline void sad8_4_mmx(UINT8 *blk1, UINT8 *blk2, int stride, int h) +static inline void sad8_4_mmx(uint8_t *blk1, uint8_t *blk2, int stride, int h) { int len= -(stride<<h); asm volatile( @@ -215,8 +215,8 @@ static inline void sad8_4_mmx(UINT8 *blk1, UINT8 *blk2, int stride, int h) "punpckhbw %%mm7, %%mm4 \n\t" "paddw %%mm3, %%mm2 \n\t" "paddw %%mm4, %%mm1 \n\t" - "movq (%3, %%eax), %%mm3 \n\t" - "movq (%3, %%eax), %%mm4 \n\t" + "movq (%3, %%eax), %%mm3 \n\t" + "movq (%3, %%eax), %%mm4 \n\t" "paddw %%mm5, %%mm2 \n\t" "paddw %%mm5, %%mm1 \n\t" "psrlw $2, %%mm2 \n\t" @@ -237,7 +237,7 @@ static inline void sad8_4_mmx(UINT8 *blk1, UINT8 *blk2, int stride, int h) ); } -static inline int sum_mmx() +static inline int sum_mmx(void) { int ret; asm volatile( @@ -253,7 +253,7 @@ static inline int sum_mmx() return ret&0xFFFF; } -static inline int sum_mmx2() +static inline int sum_mmx2(void) { int ret; asm volatile( @@ -265,7 +265,7 @@ static inline int sum_mmx2() #define PIX_SAD(suf)\ -int pix_abs8x8_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ +static int pix_abs8x8_ ## suf(uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t":);\ @@ -274,7 +274,7 @@ int pix_abs8x8_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ \ return sum_ ## suf();\ }\ -int sad8x8_ ## suf(void *s, UINT8 *blk2, UINT8 *blk1, int stride)\ +static int sad8x8_ ## suf(void *s, uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t":);\ @@ -284,7 +284,7 @@ int sad8x8_ ## suf(void *s, UINT8 *blk2, UINT8 *blk1, int stride)\ return sum_ ## suf();\ }\ \ -int pix_abs8x8_x2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ +static int pix_abs8x8_x2_ ## suf(uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t"\ @@ -297,7 +297,7 @@ int pix_abs8x8_x2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ return sum_ ## suf();\ }\ \ -int pix_abs8x8_y2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ +static int pix_abs8x8_y2_ ## suf(uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t"\ @@ -310,7 +310,7 @@ int pix_abs8x8_y2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ return sum_ ## suf();\ }\ \ -int pix_abs8x8_xy2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ +static int pix_abs8x8_xy2_ ## suf(uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t"\ @@ -323,7 +323,7 @@ int pix_abs8x8_xy2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ return sum_ ## suf();\ }\ \ -int pix_abs16x16_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ +static int pix_abs16x16_ ## suf(uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t":);\ @@ -333,7 +333,7 @@ int pix_abs16x16_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ \ return sum_ ## suf();\ }\ -int sad16x16_ ## suf(void *s, UINT8 *blk2, UINT8 *blk1, int stride)\ +static int sad16x16_ ## suf(void *s, uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t":);\ @@ -343,7 +343,7 @@ int sad16x16_ ## suf(void *s, UINT8 *blk2, UINT8 *blk1, int stride)\ \ return sum_ ## suf();\ }\ -int pix_abs16x16_x2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ +static int pix_abs16x16_x2_ ## suf(uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t"\ @@ -356,7 +356,7 @@ int pix_abs16x16_x2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ \ return sum_ ## suf();\ }\ -int pix_abs16x16_y2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ +static int pix_abs16x16_y2_ ## suf(uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t"\ @@ -369,7 +369,7 @@ int pix_abs16x16_y2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ \ return sum_ ## suf();\ }\ -int pix_abs16x16_xy2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ +static int pix_abs16x16_xy2_ ## suf(uint8_t *blk2, uint8_t *blk1, int stride)\ {\ asm volatile("pxor %%mm7, %%mm7 \n\t"\ "pxor %%mm6, %%mm6 \n\t"\ @@ -385,3 +385,36 @@ int pix_abs16x16_xy2_ ## suf(UINT8 *blk2, UINT8 *blk1, int stride)\ PIX_SAD(mmx) PIX_SAD(mmx2) + +void dsputil_init_pix_mmx(DSPContext* c, AVCodecContext *avctx) +{ + if (mm_flags & MM_MMX) { + c->pix_abs16x16 = pix_abs16x16_mmx; + c->pix_abs16x16_x2 = pix_abs16x16_x2_mmx; + c->pix_abs16x16_y2 = pix_abs16x16_y2_mmx; + c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx; + c->pix_abs8x8 = pix_abs8x8_mmx; + c->pix_abs8x8_x2 = pix_abs8x8_x2_mmx; + c->pix_abs8x8_y2 = pix_abs8x8_y2_mmx; + c->pix_abs8x8_xy2 = pix_abs8x8_xy2_mmx; + + c->sad[0]= sad16x16_mmx; + c->sad[1]= sad8x8_mmx; + } + if (mm_flags & MM_MMXEXT) { + c->pix_abs16x16 = pix_abs16x16_mmx2; + c->pix_abs8x8 = pix_abs8x8_mmx2; + + c->sad[0]= sad16x16_mmx2; + c->sad[1]= sad8x8_mmx2; + + if(!(avctx->flags & CODEC_FLAG_BITEXACT)){ + c->pix_abs16x16_x2 = pix_abs16x16_x2_mmx2; + c->pix_abs16x16_y2 = pix_abs16x16_y2_mmx2; + c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx2; + c->pix_abs8x8_x2 = pix_abs8x8_x2_mmx2; + c->pix_abs8x8_y2 = pix_abs8x8_y2_mmx2; + c->pix_abs8x8_xy2 = pix_abs8x8_xy2_mmx2; + } + } +} diff --git a/src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c b/src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c index be8015dd3..8e452b499 100644 --- a/src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c +++ b/src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c @@ -23,12 +23,10 @@ #include "../dsputil.h" #include "../mpegvideo.h" #include "../avcodec.h" -#include "../simple_idct.h" -#include "xineutils.h" -extern UINT8 zigzag_direct_noperm[64]; -extern UINT16 inv_zigzag_direct16[64]; -extern UINT32 inverse[256]; +extern uint8_t zigzag_direct_noperm[64]; +extern uint16_t inv_zigzag_direct16[64]; +extern uint32_t inverse[256]; static const unsigned long long int mm_wabs __attribute__ ((aligned(8))) = 0xffffffffffffffffULL; static const unsigned long long int mm_wone __attribute__ ((aligned(8))) = 0x0001000100010001ULL; @@ -42,9 +40,7 @@ static void dct_unquantize_h263_mmx(MpegEncContext *s, qmul = qscale << 1; qadd = (qscale - 1) | 1; - XINE_ASSERT(s->block_last_index[n]>=0, - "value 's->block_last_index[%d] is < 0: %d", - n, s->block_last_index[n]); + assert(s->block_last_index[n]>=0); if (s->mb_intra) { if (!s->h263_aic) { @@ -147,11 +143,9 @@ static void dct_unquantize_mpeg1_mmx(MpegEncContext *s, DCTELEM *block, int n, int qscale) { int nCoeffs; - const UINT16 *quant_matrix; + const uint16_t *quant_matrix; - XINE_ASSERT(s->block_last_index[n]>=0, - "value 's->block_last_index[%d] is < 0: %d", - n, s->block_last_index[n]); + assert(s->block_last_index[n]>=0); nCoeffs= s->intra_scantable.raster_end[ s->block_last_index[n] ]+1; @@ -277,11 +271,9 @@ static void dct_unquantize_mpeg2_mmx(MpegEncContext *s, DCTELEM *block, int n, int qscale) { int nCoeffs; - const UINT16 *quant_matrix; + const uint16_t *quant_matrix; - XINE_ASSERT(s->block_last_index[n]>=0, - "value 's->block_last_index[%d] is < 0: %d", - n, s->block_last_index[n]); + assert(s->block_last_index[n]>=0); if(s->alternate_scan) nCoeffs= 63; //FIXME else nCoeffs= s->intra_scantable.raster_end[ s->block_last_index[n] ]; @@ -411,9 +403,9 @@ asm volatile( /* draw the edges of width 'w' of an image of size width, height this mmx version can only handle w==8 || w==16 */ -static void draw_edges_mmx(UINT8 *buf, int wrap, int width, int height, int w) +static void draw_edges_mmx(uint8_t *buf, int wrap, int width, int height, int w) { - UINT8 *ptr, *last_line; + uint8_t *ptr, *last_line; int i; last_line = buf + (height - 1) * wrap; @@ -506,38 +498,10 @@ static void draw_edges_mmx(UINT8 *buf, int wrap, int width, int height, int w) #define RENAME(a) a ## _MMX2 #include "mpegvideo_mmx_template.c" -/* external functions, from idct_mmx.c */ -void ff_mmx_idct(DCTELEM *block); -void ff_mmxext_idct(DCTELEM *block); - -/* XXX: those functions should be suppressed ASAP when all IDCTs are - converted */ -static void ff_libmpeg2mmx_idct_put(UINT8 *dest, int line_size, DCTELEM *block) -{ - ff_mmx_idct (block); - put_pixels_clamped_mmx(block, dest, line_size); -} -static void ff_libmpeg2mmx_idct_add(UINT8 *dest, int line_size, DCTELEM *block) -{ - ff_mmx_idct (block); - add_pixels_clamped_mmx(block, dest, line_size); -} -static void ff_libmpeg2mmx2_idct_put(UINT8 *dest, int line_size, DCTELEM *block) -{ - ff_mmxext_idct (block); - put_pixels_clamped_mmx(block, dest, line_size); -} -static void ff_libmpeg2mmx2_idct_add(UINT8 *dest, int line_size, DCTELEM *block) -{ - ff_mmxext_idct (block); - add_pixels_clamped_mmx(block, dest, line_size); -} - void MPV_common_init_mmx(MpegEncContext *s) { if (mm_flags & MM_MMX) { const int dct_algo = s->avctx->dct_algo; - const int idct_algo= s->avctx->idct_algo; s->dct_unquantize_h263 = dct_unquantize_h263_mmx; s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_mmx; @@ -546,28 +510,11 @@ void MPV_common_init_mmx(MpegEncContext *s) draw_edges = draw_edges_mmx; if(dct_algo==FF_DCT_AUTO || dct_algo==FF_DCT_MMX){ - s->fdct = ff_fdct_mmx; - if(mm_flags & MM_MMXEXT){ s->dct_quantize= dct_quantize_MMX2; } else { s->dct_quantize= dct_quantize_MMX; } } - - if(idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_SIMPLEMMX){ - s->idct_put= ff_simple_idct_put_mmx; - s->idct_add= ff_simple_idct_add_mmx; - s->idct_permutation_type= FF_SIMPLE_IDCT_PERM; - }else if(idct_algo==FF_IDCT_LIBMPEG2MMX){ - if(mm_flags & MM_MMXEXT){ - s->idct_put= ff_libmpeg2mmx2_idct_put; - s->idct_add= ff_libmpeg2mmx2_idct_add; - }else{ - s->idct_put= ff_libmpeg2mmx_idct_put; - s->idct_add= ff_libmpeg2mmx_idct_add; - } - s->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; - } } } diff --git a/src/libffmpeg/libavcodec/i386/mpegvideo_mmx_template.c b/src/libffmpeg/libavcodec/i386/mpegvideo_mmx_template.c index ead30ed31..8cd91024b 100644 --- a/src/libffmpeg/libavcodec/i386/mpegvideo_mmx_template.c +++ b/src/libffmpeg/libavcodec/i386/mpegvideo_mmx_template.c @@ -37,8 +37,8 @@ static int RENAME(dct_quantize)(MpegEncContext *s, int qscale, int *overflow) { int level=0, last_non_zero_p1, q; //=0 is cuz gcc says uninitalized ... - const UINT16 *qmat, *bias; - static __align8 INT16 temp_block[64]; + const uint16_t *qmat, *bias; + static __align8 int16_t temp_block[64]; //s->fdct (block); ff_fdct_mmx (block); //cant be anything else ... @@ -207,7 +207,7 @@ static int RENAME(dct_quantize)(MpegEncContext *s, if(s->mb_intra) block[0]= level; else block[0]= temp_block[0]; - if(s->idct_permutation[1]==8){ + if(s->dsp.idct_permutation_type == FF_SIMPLE_IDCT_PERM){ if(last_non_zero_p1 <= 1) goto end; block[0x08] = temp_block[0x01]; block[0x10] = temp_block[0x08]; block[0x20] = temp_block[0x10]; @@ -251,7 +251,7 @@ static int RENAME(dct_quantize)(MpegEncContext *s, block[0x3E] = temp_block[0x3D]; block[0x27] = temp_block[0x36]; block[0x3D] = temp_block[0x2F]; block[0x2F] = temp_block[0x37]; block[0x37] = temp_block[0x3E]; block[0x3F] = temp_block[0x3F]; - }else if(s->idct_permutation[1]==4){ + }else if(s->dsp.idct_permutation_type == FF_LIBMPEG2_IDCT_PERM){ if(last_non_zero_p1 <= 1) goto end; block[0x04] = temp_block[0x01]; block[0x08] = temp_block[0x08]; block[0x10] = temp_block[0x10]; diff --git a/src/libffmpeg/libavcodec/i386/simple_idct_mmx.c b/src/libffmpeg/libavcodec/i386/simple_idct_mmx.c index 9dfd5f149..836403ca5 100644 --- a/src/libffmpeg/libavcodec/i386/simple_idct_mmx.c +++ b/src/libffmpeg/libavcodec/i386/simple_idct_mmx.c @@ -1298,12 +1298,12 @@ void ff_simple_idct_mmx(int16_t *block) //FIXME merge add/put into the idct -void ff_simple_idct_put_mmx(UINT8 *dest, int line_size, DCTELEM *block) +void ff_simple_idct_put_mmx(uint8_t *dest, int line_size, DCTELEM *block) { idct(block); put_pixels_clamped_mmx(block, dest, line_size); } -void ff_simple_idct_add_mmx(UINT8 *dest, int line_size, DCTELEM *block) +void ff_simple_idct_add_mmx(uint8_t *dest, int line_size, DCTELEM *block) { idct(block); add_pixels_clamped_mmx(block, dest, line_size); diff --git a/src/libffmpeg/libavcodec/imgconvert.c b/src/libffmpeg/libavcodec/imgconvert.c index cace55a94..cfb21a477 100644 --- a/src/libffmpeg/libavcodec/imgconvert.c +++ b/src/libffmpeg/libavcodec/imgconvert.c @@ -1,4 +1,3 @@ - /* * Misc image convertion routines * Copyright (c) 2001, 2002, 2003 Fabrice Bellard. @@ -17,6 +16,13 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file imgconvert.c + * Misc image convertion routines. + */ + + #include "avcodec.h" #include "dsputil.h" @@ -30,59 +36,90 @@ typedef struct PixFmtInfo { const char *name; - UINT8 nb_components; /* number of components in AVPicture array */ - UINT8 is_yuv : 1; /* true if YUV instead of RGB color space */ - UINT8 is_packed : 1; /* true if multiple components in same word */ - UINT8 is_paletted : 1; /* true if paletted */ - UINT8 is_alpha : 1; /* true if alpha can be specified */ - UINT8 is_gray : 1; /* true if gray or monochrome format */ - UINT8 x_chroma_shift; /* X chroma subsampling factor is 2 ^ shift */ - UINT8 y_chroma_shift; /* Y chroma subsampling factor is 2 ^ shift */ + uint8_t nb_components; /* number of components in AVPicture array */ + uint8_t is_yuv : 1; /* true if YUV instead of RGB color space */ + uint8_t is_packed : 1; /* true if multiple components in same word */ + uint8_t is_paletted : 1; /* true if paletted */ + uint8_t is_alpha : 1; /* true if alpha can be specified */ + uint8_t is_gray : 1; /* true if gray or monochrome format */ + uint8_t x_chroma_shift; /* X chroma subsampling factor is 2 ^ shift */ + uint8_t y_chroma_shift; /* Y chroma subsampling factor is 2 ^ shift */ } PixFmtInfo; /* this table gives more information about formats */ static PixFmtInfo pix_fmt_info[PIX_FMT_NB] = { - { /*PIX_FMT_YUV420P*/ - "yuv420p", 3, 1, 0, 0, 0, 0, 1, 1, + /* YUV formats */ + [PIX_FMT_YUV420P] = { + .name = "yuv420p", + .nb_components = 3, .is_yuv = 1, + .x_chroma_shift = 1, .y_chroma_shift = 1, }, - { /*PIX_FMT_YUV422*/ - "yuv422", 1, 1, 1, 0, 0, 0, 1, 0, + [PIX_FMT_YUV422P] = { + .name = "yuv422p", + .nb_components = 3, .is_yuv = 1, + .x_chroma_shift = 1, .y_chroma_shift = 0, }, - { /*PIX_FMT_RGB24*/ - "rgb24", 1, 0, 1, 0, 0, 0, 0, 0, + [PIX_FMT_YUV444P] = { + .name = "yuv444p", + .nb_components = 3, .is_yuv = 1, + .x_chroma_shift = 0, .y_chroma_shift = 0, }, - { /*PIX_FMT_BGR24*/ - "bgr24", 1, 0, 1, 0, 0, 0, 0, 0, + [PIX_FMT_YUV422] = { + .name = "yuv422", + .nb_components = 1, .is_yuv = 1, .is_packed = 1, + .x_chroma_shift = 1, .y_chroma_shift = 0, }, - { /*PIX_FMT_YUV422P*/ - "yuv422p", 3, 1, 0, 0, 0, 0, 1, 0, + [PIX_FMT_YUV410P] = { + .name = "yuv410p", + .nb_components = 3, .is_yuv = 1, + .x_chroma_shift = 2, .y_chroma_shift = 2, }, - { /*PIX_FMT_YUV444P*/ - "yuv444p", 3, 1, 0, 0, 0, 0, 0, 0, + [PIX_FMT_YUV411P] = { + .name = "yuv411p", + .nb_components = 3, .is_yuv = 1, + .x_chroma_shift = 2, .y_chroma_shift = 0, }, - { /*PIX_FMT_RGBA32*/ - "rgba32", 1, 0, 1, 0, 1, 0, 0, 0, + + /* RGB formats */ + [PIX_FMT_RGB24] = { + .name = "rgb24", + .nb_components = 1, .is_packed = 1, }, - { /*PIX_FMT_YUV410P*/ - "yuv410p", 3, 1, 0, 0, 0, 0, 2, 2, + [PIX_FMT_BGR24] = { + .name = "bgr24", + .nb_components = 1, .is_packed = 1, }, - { /*PIX_FMT_YUV411P*/ - "yuv411p", 3, 1, 0, 0, 0, 0, 2, 0, + [PIX_FMT_RGBA32] = { + .name = "rgba32", + .nb_components = 1, .is_packed = 1, .is_alpha = 1, }, - { /*PIX_FMT_RGB565*/ - "rgb565", 1, 0, 1, 0, 0, 0, 0, 0, + [PIX_FMT_RGB565] = { + .name = "rgb565", + .nb_components = 1, .is_packed = 1, }, - { /*PIX_FMT_RGB555*/ - "rgb555", 1, 0, 1, 0, 1, 0, 0, 0, + [PIX_FMT_RGB555] = { + .name = "rgb555", + .nb_components = 1, .is_packed = 1, .is_alpha = 1, }, - { /*PIX_FMT_GRAY8*/ - "gray", 1, 0, 0, 0, 0, 1, 0, 0, + + /* gray / mono formats */ + [PIX_FMT_GRAY8] = { + .name = "gray", + .nb_components = 1, .is_gray = 1, }, - { /*PIX_FMT_MONOWHITE*/ - "monow", 1, 0, 1, 0, 0, 1, 0, 0, + [PIX_FMT_MONOWHITE] = { + .name = "monow", + .nb_components = 1, .is_packed = 1, .is_gray = 1, }, - { /*PIX_FMT_MONOBLACK*/ - "monob", 1, 0, 1, 0, 0, 1, 0, 0, + [PIX_FMT_MONOBLACK] = { + .name = "monob", + .nb_components = 1, .is_packed = 1, .is_gray = 1, + }, + + /* paletted formats */ + [PIX_FMT_PAL8] = { + .name = "pal8", + .nb_components = 1, .is_packed = 1, .is_paletted = 1, }, }; @@ -106,21 +143,30 @@ const char *avcodec_get_pix_fmt_name(int pix_fmt) } /* Picture field are filled with 'ptr' addresses. Also return size */ -int avpicture_fill(AVPicture *picture, UINT8 *ptr, +int avpicture_fill(AVPicture *picture, uint8_t *ptr, int pix_fmt, int width, int height) { - int size; - + int size, w2, h2, size2; + PixFmtInfo *pinfo; + + pinfo = &pix_fmt_info[pix_fmt]; size = width * height; switch(pix_fmt) { case PIX_FMT_YUV420P: + case PIX_FMT_YUV422P: + case PIX_FMT_YUV444P: + case PIX_FMT_YUV410P: + case PIX_FMT_YUV411P: + w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift; + h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; + size2 = w2 * h2; picture->data[0] = ptr; picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size / 4; + picture->data[2] = picture->data[1] + size2; picture->linesize[0] = width; - picture->linesize[1] = width / 2; - picture->linesize[2] = width / 2; - return (size * 3) / 2; + picture->linesize[1] = w2; + picture->linesize[2] = w2; + return size + 2 * size2; case PIX_FMT_RGB24: case PIX_FMT_BGR24: picture->data[0] = ptr; @@ -128,44 +174,12 @@ int avpicture_fill(AVPicture *picture, UINT8 *ptr, picture->data[2] = NULL; picture->linesize[0] = width * 3; return size * 3; - case PIX_FMT_YUV422P: - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size / 2; - picture->linesize[0] = width; - picture->linesize[1] = width / 2; - picture->linesize[2] = width / 2; - return (size * 2); - case PIX_FMT_YUV444P: - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size; - picture->linesize[0] = width; - picture->linesize[1] = width; - picture->linesize[2] = width; - return size * 3; case PIX_FMT_RGBA32: picture->data[0] = ptr; picture->data[1] = NULL; picture->data[2] = NULL; picture->linesize[0] = width * 4; return size * 4; - case PIX_FMT_YUV410P: - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size / 16; - picture->linesize[0] = width; - picture->linesize[1] = width / 4; - picture->linesize[2] = width / 4; - return size + (size / 8); - case PIX_FMT_YUV411P: - picture->data[0] = ptr; - picture->data[1] = picture->data[0] + size; - picture->data[2] = picture->data[1] + size / 4; - picture->linesize[0] = width; - picture->linesize[1] = width / 4; - picture->linesize[2] = width / 4; - return size + (size / 2); case PIX_FMT_RGB555: case PIX_FMT_RGB565: case PIX_FMT_YUV422: @@ -187,10 +201,19 @@ int avpicture_fill(AVPicture *picture, UINT8 *ptr, picture->data[2] = NULL; picture->linesize[0] = (width + 7) >> 3; return picture->linesize[0] * height; + case PIX_FMT_PAL8: + size2 = (size + 3) & ~3; + picture->data[0] = ptr; + picture->data[1] = ptr + size2; /* palette is stored here as 256 32 bit words */ + picture->data[2] = NULL; + picture->linesize[0] = width; + picture->linesize[1] = 4; + return size2 + 256 * 4; default: picture->data[0] = NULL; picture->data[1] = NULL; picture->data[2] = NULL; + picture->data[3] = NULL; return -1; } } @@ -207,9 +230,9 @@ int avpicture_get_size(int pix_fmt, int width, int height) static void yuv422_to_yuv420p(AVPicture *dst, AVPicture *src, int width, int height) { - UINT8 *lum, *cb, *cr; + uint8_t *lum, *cb, *cr; int x, y; - const UINT8 *p; + const uint8_t *p; lum = dst->data[0]; cb = dst->data[1]; @@ -242,12 +265,12 @@ static void yuv422_to_yuv420p(AVPicture *dst, AVPicture *src, /* XXX: use generic filter ? */ /* 1x2 -> 1x1 */ -static void shrink2(UINT8 *dst, int dst_wrap, - UINT8 *src, int src_wrap, +static void shrink2(uint8_t *dst, int dst_wrap, + uint8_t *src, int src_wrap, int width, int height) { int w; - UINT8 *s1, *s2, *d; + uint8_t *s1, *s2, *d; for(;height > 0; height--) { s1 = src; @@ -274,12 +297,12 @@ static void shrink2(UINT8 *dst, int dst_wrap, } /* 2x2 -> 1x1 */ -static void shrink22(UINT8 *dst, int dst_wrap, - UINT8 *src, int src_wrap, +static void shrink22(uint8_t *dst, int dst_wrap, + uint8_t *src, int src_wrap, int width, int height) { int w; - UINT8 *s1, *s2, *d; + uint8_t *s1, *s2, *d; for(;height > 0; height--) { s1 = src; @@ -306,12 +329,12 @@ static void shrink22(UINT8 *dst, int dst_wrap, } /* 1x1 -> 2x2 */ -static void grow22(UINT8 *dst, int dst_wrap, - UINT8 *src, int src_wrap, +static void grow22(uint8_t *dst, int dst_wrap, + uint8_t *src, int src_wrap, int width, int height) { int w; - UINT8 *s1, *d; + uint8_t *s1, *d; for(;height > 0; height--) { s1 = src; @@ -334,12 +357,12 @@ static void grow22(UINT8 *dst, int dst_wrap, } /* 1x2 -> 2x1 */ -static void conv411(UINT8 *dst, int dst_wrap, - UINT8 *src, int src_wrap, +static void conv411(uint8_t *dst, int dst_wrap, + uint8_t *src, int src_wrap, int width, int height) { int w, c; - UINT8 *s1, *s2, *d; + uint8_t *s1, *s2, *d; for(;height > 0; height--) { s1 = src; @@ -358,8 +381,8 @@ static void conv411(UINT8 *dst, int dst_wrap, } } -static void img_copy(UINT8 *dst, int dst_wrap, - UINT8 *src, int src_wrap, +static void img_copy(uint8_t *dst, int dst_wrap, + uint8_t *src, int src_wrap, int width, int height) { for(;height > 0; height--) { @@ -391,21 +414,21 @@ static void img_copy(UINT8 *dst, int dst_wrap, static void yuv420p_to_ ## rgb_name (AVPicture *dst, AVPicture *src, \ int width, int height) \ { \ - UINT8 *y1_ptr, *y2_ptr, *cb_ptr, *cr_ptr, *d, *d1, *d2; \ + uint8_t *y1_ptr, *y2_ptr, *cb_ptr, *cr_ptr, *d, *d1, *d2; \ int w, y, cb, cr, r_add, g_add, b_add, width2; \ - UINT8 *cm = cropTbl + MAX_NEG_CROP; \ + uint8_t *cm = cropTbl + MAX_NEG_CROP; \ unsigned int r, g, b; \ \ d = dst->data[0]; \ y1_ptr = src->data[0]; \ cb_ptr = src->data[1]; \ cr_ptr = src->data[2]; \ - width2 = width >> 1; \ - for(;height > 0; height -= 2) { \ + width2 = (width + 1) >> 1; \ + for(;height >= 2; height -= 2) { \ d1 = d; \ d2 = d + dst->linesize[0]; \ y2_ptr = y1_ptr + src->linesize[0]; \ - for(w = width2; w > 0; w --) { \ + for(w = width; w >= 2; w -= 2) { \ cb = cb_ptr[0] - 128; \ cr = cr_ptr[0] - 128; \ r_add = C_RV * cr + (1 << (SCALE_BITS - 1)); \ @@ -433,30 +456,91 @@ static void yuv420p_to_ ## rgb_name (AVPicture *dst, AVPicture *src, \ cb_ptr++; \ cr_ptr++; \ } \ + /* handle odd width */ \ + if (w) { \ + cb = cb_ptr[0] - 128; \ + cr = cr_ptr[0] - 128; \ + r_add = C_RV * cr + (1 << (SCALE_BITS - 1)); \ + g_add = - C_GU * cb - C_GV * cr + (1 << (SCALE_BITS - 1)); \ + b_add = C_BU * cb + (1 << (SCALE_BITS - 1)); \ + \ + YUV_TO_RGB2(r, g, b, y1_ptr[0]); \ + RGB_OUT(d1, r, g, b); \ + \ + YUV_TO_RGB2(r, g, b, y2_ptr[0]); \ + RGB_OUT(d2, r, g, b); \ + d1 += BPP; \ + d2 += BPP; \ + y1_ptr++; \ + y2_ptr++; \ + cb_ptr++; \ + cr_ptr++; \ + } \ d += 2 * dst->linesize[0]; \ y1_ptr += 2 * src->linesize[0] - width; \ cb_ptr += src->linesize[1] - width2; \ cr_ptr += src->linesize[2] - width2; \ } \ + /* handle odd height */ \ + if (height) { \ + d1 = d; \ + for(w = width; w >= 2; w -= 2) { \ + cb = cb_ptr[0] - 128; \ + cr = cr_ptr[0] - 128; \ + r_add = C_RV * cr + (1 << (SCALE_BITS - 1)); \ + g_add = - C_GU * cb - C_GV * cr + (1 << (SCALE_BITS - 1)); \ + b_add = C_BU * cb + (1 << (SCALE_BITS - 1)); \ + \ + /* output 2 pixels */ \ + YUV_TO_RGB2(r, g, b, y1_ptr[0]); \ + RGB_OUT(d1, r, g, b); \ + \ + YUV_TO_RGB2(r, g, b, y1_ptr[1]); \ + RGB_OUT(d1 + BPP, r, g, b); \ + \ + d1 += 2 * BPP; \ + \ + y1_ptr += 2; \ + cb_ptr++; \ + cr_ptr++; \ + } \ + /* handle width */ \ + if (w) { \ + cb = cb_ptr[0] - 128; \ + cr = cr_ptr[0] - 128; \ + r_add = C_RV * cr + (1 << (SCALE_BITS - 1)); \ + g_add = - C_GU * cb - C_GV * cr + (1 << (SCALE_BITS - 1)); \ + b_add = C_BU * cb + (1 << (SCALE_BITS - 1)); \ + \ + /* output 2 pixels */ \ + YUV_TO_RGB2(r, g, b, y1_ptr[0]); \ + RGB_OUT(d1, r, g, b); \ + d1 += BPP; \ + \ + y1_ptr++; \ + cb_ptr++; \ + cr_ptr++; \ + } \ + } \ } \ \ /* XXX: no chroma interpolating is done */ \ static void yuv422p_to_ ## rgb_name (AVPicture *dst, AVPicture *src, \ int width, int height) \ { \ - UINT8 *y1_ptr, *cb_ptr, *cr_ptr, *d, *d1; \ + uint8_t *y1_ptr, *cb_ptr, *cr_ptr, *d, *d1; \ int w, y, cb, cr, r_add, g_add, b_add, width2; \ - UINT8 *cm = cropTbl + MAX_NEG_CROP; \ + uint8_t *cm = cropTbl + MAX_NEG_CROP; \ unsigned int r, g, b; \ \ d = dst->data[0]; \ y1_ptr = src->data[0]; \ cb_ptr = src->data[1]; \ cr_ptr = src->data[2]; \ - width2 = width >> 1; \ + width2 = (width + 1) >> 1; \ for(;height > 0; height --) { \ d1 = d; \ - for(w = width2; w > 0; w --) { \ + for(w = width; w >= 2; w -= 2) { \ cb = cb_ptr[0] - 128; \ cr = cr_ptr[0] - 128; \ r_add = C_RV * cr + (1 << (SCALE_BITS - 1)); \ @@ -465,17 +549,34 @@ static void yuv422p_to_ ## rgb_name (AVPicture *dst, AVPicture *src, \ \ /* output 2 pixels */ \ YUV_TO_RGB2(r, g, b, y1_ptr[0]); \ - RGB_OUT(d, r, g, b); \ + RGB_OUT(d1, r, g, b); \ \ YUV_TO_RGB2(r, g, b, y1_ptr[1]); \ - RGB_OUT(d + BPP, r, g, b); \ + RGB_OUT(d1 + BPP, r, g, b); \ \ - d += 2 * BPP; \ + d1 += 2 * BPP; \ \ y1_ptr += 2; \ cb_ptr++; \ cr_ptr++; \ } \ + /* handle width */ \ + if (w) { \ + cb = cb_ptr[0] - 128; \ + cr = cr_ptr[0] - 128; \ + r_add = C_RV * cr + (1 << (SCALE_BITS - 1)); \ + g_add = - C_GU * cb - C_GV * cr + (1 << (SCALE_BITS - 1)); \ + b_add = C_BU * cb + (1 << (SCALE_BITS - 1)); \ + \ + /* output 2 pixels */ \ + YUV_TO_RGB2(r, g, b, y1_ptr[0]); \ + RGB_OUT(d1, r, g, b); \ + d1 += BPP; \ + \ + y1_ptr++; \ + cb_ptr++; \ + cr_ptr++; \ + } \ d += dst->linesize[0]; \ y1_ptr += src->linesize[0] - width; \ cb_ptr += src->linesize[1] - width2; \ @@ -488,15 +589,15 @@ static void rgb_name ## _to_yuv420p(AVPicture *dst, AVPicture *src, \ { \ int wrap, wrap3, x, y; \ int r, g, b, r1, g1, b1; \ - UINT8 *lum, *cb, *cr; \ - const UINT8 *p; \ + uint8_t *lum, *cb, *cr; \ + const uint8_t *p; \ \ lum = dst->data[0]; \ cb = dst->data[1]; \ cr = dst->data[2]; \ \ - wrap = width; \ - wrap3 = width * BPP; \ + wrap = dst->linesize[0]; \ + wrap3 = src->linesize[0]; \ p = src->data[0]; \ for(y=0;y<height;y+=2) { \ for(x=0;x<width;x+=2) { \ @@ -541,8 +642,10 @@ static void rgb_name ## _to_yuv420p(AVPicture *dst, AVPicture *src, \ p += -wrap3 + 2 * BPP; \ lum += -wrap + 2; \ } \ - p += wrap3; \ - lum += wrap; \ + p += wrap3 + (wrap3 - width * BPP); \ + lum += wrap + (wrap - width); \ + cb += dst->linesize[1] - width / 2; \ + cr += dst->linesize[2] - width / 2; \ } \ } \ \ @@ -597,6 +700,38 @@ static void gray_to_ ## rgb_name(AVPicture *dst, AVPicture *src, \ p += src_wrap; \ q += dst_wrap; \ } \ +} \ + \ +static void pal8_to_ ## rgb_name(AVPicture *dst, AVPicture *src, \ + int width, int height) \ +{ \ + const unsigned char *p; \ + unsigned char *q; \ + int r, g, b, dst_wrap, src_wrap; \ + int x, y; \ + uint32_t v;\ + const uint32_t *palette;\ +\ + p = src->data[0]; \ + src_wrap = src->linesize[0] - width; \ + palette = (uint32_t *)src->data[1];\ + \ + q = dst->data[0]; \ + dst_wrap = dst->linesize[0] - BPP * width; \ + \ + for(y=0;y<height;y++) { \ + for(x=0;x<width;x++) { \ + v = palette[p[0]];\ + r = (v >> 16) & 0xff;\ + g = (v >> 8) & 0xff;\ + b = (v) & 0xff;\ + RGB_OUT(q, r, g, b); \ + q += BPP; \ + p ++; \ + } \ + p += src_wrap; \ + q += dst_wrap; \ + } \ } /* copy bit n to bits 0 ... n - 1 */ @@ -611,7 +746,7 @@ static inline unsigned int bitcopy_n(unsigned int a, int n) #define RGB_IN(r, g, b, s)\ {\ - unsigned int v = ((UINT16 *)(s))[0];\ + unsigned int v = ((const uint16_t *)(s))[0];\ r = bitcopy_n(v >> (10 - 3), 3);\ g = bitcopy_n(v >> (5 - 3), 3);\ b = bitcopy_n(v << 3, 3);\ @@ -619,7 +754,7 @@ static inline unsigned int bitcopy_n(unsigned int a, int n) #define RGB_OUT(d, r, g, b)\ {\ - ((UINT16 *)(d))[0] = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3) | 0x8000;\ + ((uint16_t *)(d))[0] = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3) | 0x8000;\ } #define BPP 2 @@ -634,7 +769,7 @@ RGB_FUNCTIONS(rgb555) #define RGB_IN(r, g, b, s)\ {\ - unsigned int v = ((UINT16 *)(s))[0];\ + unsigned int v = ((const uint16_t *)(s))[0];\ r = bitcopy_n(v >> (11 - 3), 3);\ g = bitcopy_n(v >> (5 - 2), 2);\ b = bitcopy_n(v << 3, 3);\ @@ -642,7 +777,7 @@ RGB_FUNCTIONS(rgb555) #define RGB_OUT(d, r, g, b)\ {\ - ((UINT16 *)(d))[0] = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);\ + ((uint16_t *)(d))[0] = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);\ } #define BPP 2 @@ -705,7 +840,7 @@ RGB_FUNCTIONS(rgb24) #define RGB_IN(r, g, b, s)\ {\ - unsigned int v = ((UINT32 *)(s))[0];\ + unsigned int v = ((const uint32_t *)(s))[0];\ r = (v >> 16) & 0xff;\ g = (v >> 8) & 0xff;\ b = v & 0xff;\ @@ -713,7 +848,7 @@ RGB_FUNCTIONS(rgb24) #define RGB_OUT(d, r, g, b)\ {\ - ((UINT32 *)(d))[0] = (0xff << 24) | (r << 16) | (g << 8) | b;\ + ((uint32_t *)(d))[0] = (0xff << 24) | (r << 16) | (g << 8) | b;\ } #define BPP 4 @@ -843,8 +978,8 @@ static void gray_to_mono(AVPicture *dst, AVPicture *src, int width, int height, int xor_mask) { int n; - const UINT8 *s; - UINT8 *d; + const uint8_t *s; + uint8_t *d; int j, b, v, n1, src_wrap, dst_wrap, y; s = src->data[0]; @@ -896,6 +1031,58 @@ static void gray_to_monoblack(AVPicture *dst, AVPicture *src, gray_to_mono(dst, src, width, height, 0x00); } +/* this is maybe slow, but allows for extensions */ +static inline unsigned char gif_clut_index(uint8_t r, uint8_t g, uint8_t b) +{ + return ((((r)/47)%6)*6*6+(((g)/47)%6)*6+(((b)/47)%6)); +} + +/* XXX: put jpeg quantize code instead */ +static void rgb24_to_pal8(AVPicture *dst, AVPicture *src, + int width, int height) +{ + const unsigned char *p; + unsigned char *q; + int r, g, b, dst_wrap, src_wrap; + int x, y, i; + static const uint8_t pal_value[6] = { 0x00, 0x33, 0x66, 0x99, 0xcc, 0xff }; + uint32_t *pal; + + p = src->data[0]; + src_wrap = src->linesize[0] - 3 * width; + + q = dst->data[0]; + dst_wrap = dst->linesize[0] - width; + + for(y=0;y<height;y++) { + for(x=0;x<width;x++) { + r = p[0]; + g = p[1]; + b = p[2]; + + q[0] = gif_clut_index(r, g, b); + q++; + p += 3; + } + p += src_wrap; + q += dst_wrap; + } + + /* build palette */ + pal = (uint32_t *)dst->data[1]; + i = 0; + for(r = 0; r < 6; r++) { + for(g = 0; g < 6; g++) { + for(b = 0; b < 6; b++) { + pal[i++] = (0xff << 24) | (pal_value[r] << 16) | + (pal_value[g] << 8) | pal_value[b]; + } + } + } + while (i < 256) + pal[i++] = 0; +} + typedef struct ConvertEntry { void (*convert)(AVPicture *dst, AVPicture *src, int width, int height); } ConvertEntry; @@ -905,614 +1092,143 @@ typedef struct ConvertEntry { - all non YUV modes must convert at least to and from PIX_FMT_RGB24 */ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = { - { /*PIX_FMT_YUV420P*/ - { /*PIX_FMT_YUV420P*/ - NULL - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - yuv420p_to_rgb24 - }, - { /*PIX_FMT_BGR24*/ - yuv420p_to_bgr24 - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL + [PIX_FMT_YUV420P] = { + [PIX_FMT_RGB555] = { + .convert = yuv420p_to_rgb555 }, - { /*PIX_FMT_RGBA32]*/ - yuv420p_to_rgba32 + [PIX_FMT_RGB565] = { + .convert = yuv420p_to_rgb565 }, - { /*PIX_FMT_YUV410P*/ - NULL + [PIX_FMT_BGR24] = { + .convert = yuv420p_to_bgr24 }, - { /*PIX_FMT_YUV411P*/ - NULL + [PIX_FMT_RGB24] = { + .convert = yuv420p_to_rgb24 }, - { /*PIX_FMT_RGB565*/ - yuv420p_to_rgb565 - }, - { /*PIX_FMT_RGB555*/ - yuv420p_to_rgb555 - }, - { /*PIX_FMT_GRAY8*/ - NULL - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_RGBA32] = { + .convert = yuv420p_to_rgba32 }, }, - { /*PIX_FMT_YUV422*/ - { /*PIX_FMT_YUV420P*/ - yuv422_to_yuv420p - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL + [PIX_FMT_YUV422P] = { + [PIX_FMT_RGB555] = { + .convert = yuv422p_to_rgb555 }, - { /*PIX_FMT_YUV410P*/ - NULL + [PIX_FMT_RGB565] = { + .convert = yuv422p_to_rgb565 }, - { /*PIX_FMT_YUV411P*/ - NULL + [PIX_FMT_BGR24] = { + .convert = yuv422p_to_bgr24 }, - { /*PIX_FMT_RGB565*/ - NULL + [PIX_FMT_RGB24] = { + .convert = yuv422p_to_rgb24 }, - { /*PIX_FMT_RGB555*/ - NULL - }, - { /*PIX_FMT_GRAY8*/ - NULL - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_RGBA32] = { + .convert = yuv422p_to_rgba32 }, }, - { /*PIX_FMT_RGB24*/ - { /*PIX_FMT_YUV420P*/ - rgb24_to_yuv420p - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - rgb24_to_rgb565 - }, - { /*PIX_FMT_RGB555*/ - rgb24_to_rgb555 - }, - { /*PIX_FMT_GRAY8*/ - rgb24_to_gray - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_YUV422] = { + [PIX_FMT_YUV420P] = { + .convert = yuv422_to_yuv420p, }, }, - { /*PIX_FMT_BGR24*/ - { /*PIX_FMT_YUV420P*/ - bgr24_to_yuv420p - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - NULL - }, - { /*PIX_FMT_RGB555*/ - NULL - }, - { /*PIX_FMT_GRAY8*/ - bgr24_to_gray - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL - }, - }, - { /*PIX_FMT_YUV422P*/ - { /*PIX_FMT_YUV420P*/ - NULL - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - yuv422p_to_bgr24 - }, - { /*PIX_FMT_RGB24*/ - yuv422p_to_rgb24 - }, - { /*PIX_FMT_RGBA32*/ - yuv422p_to_rgba32 - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB555*/ - yuv422p_to_rgb555 - }, - { /*PIX_FMT_RGB565*/ - yuv422p_to_rgb565 - }, - { /*PIX_FMT_GRAY8*/ - NULL - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL - }, - }, - { /*PIX_FMT_YUV444P*/ - { /*PIX_FMT_YUV420P*/ - NULL - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - NULL + + [PIX_FMT_RGB24] = { + [PIX_FMT_YUV420P] = { + .convert = rgb24_to_yuv420p }, - { /*PIX_FMT_RGB555*/ - NULL + [PIX_FMT_RGB565] = { + .convert = rgb24_to_rgb565 }, - { /*PIX_FMT_GRAY8*/ - NULL + [PIX_FMT_RGB555] = { + .convert = rgb24_to_rgb555 }, - { /*PIX_FMT_MONOWHITE*/ - NULL + [PIX_FMT_GRAY8] = { + .convert = rgb24_to_gray }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_PAL8] = { + .convert = rgb24_to_pal8 }, }, - { /*PIX_FMT_RGBA32*/ - { /*PIX_FMT_YUV420P*/ - rgba32_to_yuv420p - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL + [PIX_FMT_RGBA32] = { + [PIX_FMT_YUV420P] = { + .convert = rgba32_to_yuv420p }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - NULL - }, - { /*PIX_FMT_RGB555*/ - NULL - }, - { /*PIX_FMT_GRAY8*/ - rgba32_to_gray - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_GRAY8] = { + .convert = rgba32_to_gray }, }, - { /*PIX_FMT_YUV410P*/ - { /*PIX_FMT_YUV420P*/ - NULL - }, - { /*PIX_FMT_YUV422*/ - NULL + [PIX_FMT_BGR24] = { + [PIX_FMT_YUV420P] = { + .convert = bgr24_to_yuv420p }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - NULL - }, - { /*PIX_FMT_RGB555*/ - NULL - }, - { /*PIX_FMT_GRAY8*/ - NULL - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_GRAY8] = { + .convert = bgr24_to_gray }, }, - { /*PIX_FMT_YUV411P*/ - { /*PIX_FMT_YUV420P*/ - NULL - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - NULL + [PIX_FMT_RGB555] = { + [PIX_FMT_YUV420P] = { + .convert = rgb555_to_yuv420p }, - { /*PIX_FMT_RGB555*/ - NULL - }, - { /*PIX_FMT_GRAY8*/ - NULL - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_GRAY8] = { + .convert = rgb555_to_gray }, }, - { /*PIX_FMT_RGB565*/ - { /*PIX_FMT_YUV420P*/ - rgb565_to_yuv420p - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL + [PIX_FMT_RGB565] = { + [PIX_FMT_YUV420P] = { + .convert = rgb565_to_yuv420p }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - NULL - }, - { /*PIX_FMT_RGB555*/ - NULL - }, - { /*PIX_FMT_GRAY8*/ - rgb565_to_gray - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_GRAY8] = { + .convert = rgb565_to_gray }, }, - { /*PIX_FMT_RGB555*/ - { /*PIX_FMT_YUV420P*/ - rgb555_to_yuv420p - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL + [PIX_FMT_GRAY8] = { + [PIX_FMT_RGB555] = { + .convert = gray_to_rgb555 }, - { /*PIX_FMT_YUV444P*/ - NULL + [PIX_FMT_RGB565] = { + .convert = gray_to_rgb565 }, - { /*PIX_FMT_RGBA32*/ - NULL + [PIX_FMT_RGB24] = { + .convert = gray_to_rgb24 }, - { /*PIX_FMT_YUV410P*/ - NULL + [PIX_FMT_BGR24] = { + .convert = gray_to_bgr24 }, - { /*PIX_FMT_YUV411P*/ - NULL + [PIX_FMT_RGBA32] = { + .convert = gray_to_rgba32 }, - { /*PIX_FMT_RGB565*/ - NULL + [PIX_FMT_MONOWHITE] = { + .convert = gray_to_monowhite }, - { /*PIX_FMT_RGB555*/ - NULL - }, - { /*PIX_FMT_GRAY8*/ - rgb555_to_gray - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_MONOBLACK] = { + .convert = gray_to_monoblack }, }, - { /*PIX_FMT_GRAY8*/ - { /*PIX_FMT_YUV420P*/ - NULL - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - gray_to_rgb24 - }, - { /*PIX_FMT_BGR24*/ - gray_to_bgr24 - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - gray_to_rgba32 - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - gray_to_rgb565 - }, - { /*PIX_FMT_RGB555*/ - gray_to_rgb555 - }, - { /*PIX_FMT_GRAY8*/ - NULL - }, - { /*PIX_FMT_MONOWHITE*/ - gray_to_monowhite - }, - { /*PIX_FMT_MONOBLACK*/ - gray_to_monoblack + [PIX_FMT_MONOWHITE] = { + [PIX_FMT_GRAY8] = { + .convert = monowhite_to_gray }, }, - { /*PIX_FMT_MONOWHITE*/ - { /*PIX_FMT_YUV420P*/ - NULL - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - NULL - }, - { /*PIX_FMT_RGB555*/ - NULL - }, - { /*PIX_FMT_GRAY8*/ - monowhite_to_gray - }, - { /*PIX_FMT_MONOWHITE*/ - NULL - }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_MONOBLACK] = { + [PIX_FMT_GRAY8] = { + .convert = monoblack_to_gray }, }, - { /*PIX_FMT_MONOBLACK*/ - { /*PIX_FMT_YUV420P*/ - NULL - }, - { /*PIX_FMT_YUV422*/ - NULL - }, - { /*PIX_FMT_RGB24*/ - NULL - }, - { /*PIX_FMT_BGR24*/ - NULL - }, - { /*PIX_FMT_YUV422P*/ - NULL - }, - { /*PIX_FMT_YUV444P*/ - NULL - }, - { /*PIX_FMT_RGBA32*/ - NULL - }, - { /*PIX_FMT_YUV410P*/ - NULL - }, - { /*PIX_FMT_YUV411P*/ - NULL - }, - { /*PIX_FMT_RGB565*/ - NULL + [PIX_FMT_PAL8] = { + [PIX_FMT_RGB555] = { + .convert = pal8_to_rgb555 }, - { /*PIX_FMT_RGB555*/ - NULL + [PIX_FMT_RGB565] = { + .convert = pal8_to_rgb565 }, - { /*PIX_FMT_GRAY8*/ - monoblack_to_gray + [PIX_FMT_BGR24] = { + .convert = pal8_to_bgr24 }, - { /*PIX_FMT_MONOWHITE*/ - NULL + [PIX_FMT_RGB24] = { + .convert = pal8_to_rgb24 }, - { /*PIX_FMT_MONOBLACK*/ - NULL + [PIX_FMT_RGBA32] = { + .convert = pal8_to_rgba32 }, }, }; @@ -1520,7 +1236,7 @@ static ConvertEntry convert_table[PIX_FMT_NB][PIX_FMT_NB] = { static int avpicture_alloc(AVPicture *picture, int pix_fmt, int width, int height) { - int size; + unsigned int size; void *ptr; size = avpicture_get_size(pix_fmt, width, height); @@ -1621,8 +1337,8 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, /* YUV to YUV */ if (dst_pix->is_yuv && src_pix->is_yuv) { int x_shift, y_shift, w, h; - void (*resize_func)(UINT8 *dst, int dst_wrap, - UINT8 *src, int src_wrap, + void (*resize_func)(uint8_t *dst, int dst_wrap, + uint8_t *src, int src_wrap, int width, int height); /* compute chroma size of the smallest dimensions */ @@ -1661,7 +1377,7 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, for(i = 1;i <= 2; i++) resize_func(dst->data[i], dst->linesize[i], src->data[i], src->linesize[i], - w, h); + dst_width>>dst_pix->x_chroma_shift, dst_height>>dst_pix->y_chroma_shift); return 0; } @@ -1738,11 +1454,11 @@ int img_convert(AVPicture *dst, int dst_pix_fmt, #endif /* filter parameters: [-1 4 2 4 -1] // 8 */ -static void deinterlace_line(UINT8 *dst, UINT8 *lum_m4, UINT8 *lum_m3, UINT8 *lum_m2, UINT8 *lum_m1, UINT8 *lum, +static void deinterlace_line(uint8_t *dst, uint8_t *lum_m4, uint8_t *lum_m3, uint8_t *lum_m2, uint8_t *lum_m1, uint8_t *lum, int size) { #ifndef HAVE_MMX - UINT8 *cm = cropTbl + MAX_NEG_CROP; + uint8_t *cm = cropTbl + MAX_NEG_CROP; int sum; for(;size > 0;size--) { @@ -1781,11 +1497,11 @@ static void deinterlace_line(UINT8 *dst, UINT8 *lum_m4, UINT8 *lum_m3, UINT8 *lu } #endif } -static void deinterlace_line_inplace(UINT8 *lum_m4, UINT8 *lum_m3, UINT8 *lum_m2, UINT8 *lum_m1, UINT8 *lum, +static void deinterlace_line_inplace(uint8_t *lum_m4, uint8_t *lum_m3, uint8_t *lum_m2, uint8_t *lum_m1, uint8_t *lum, int size) { #ifndef HAVE_MMX - UINT8 *cm = cropTbl + MAX_NEG_CROP; + uint8_t *cm = cropTbl + MAX_NEG_CROP; int sum; for(;size > 0;size--) { @@ -1827,11 +1543,11 @@ static void deinterlace_line_inplace(UINT8 *lum_m4, UINT8 *lum_m3, UINT8 *lum_m2 /* deinterlacing : 2 temporal taps, 3 spatial taps linear filter. The top field is copied as is, but the bottom field is deinterlaced against the top field. */ -static void deinterlace_bottom_field(UINT8 *dst, int dst_wrap, - UINT8 *src1, int src_wrap, +static void deinterlace_bottom_field(uint8_t *dst, int dst_wrap, + uint8_t *src1, int src_wrap, int width, int height) { - UINT8 *src_m2, *src_m1, *src_0, *src_p1, *src_p2; + uint8_t *src_m2, *src_m1, *src_0, *src_p1, *src_p2; int y; src_m2 = src1; @@ -1856,13 +1572,13 @@ static void deinterlace_bottom_field(UINT8 *dst, int dst_wrap, deinterlace_line(dst,src_m2,src_m1,src_0,src_0,src_0,width); } -static void deinterlace_bottom_field_inplace(UINT8 *src1, int src_wrap, +static void deinterlace_bottom_field_inplace(uint8_t *src1, int src_wrap, int width, int height) { - UINT8 *src_m1, *src_0, *src_p1, *src_p2; + uint8_t *src_m1, *src_0, *src_p1, *src_p2; int y; - UINT8 *buf; - buf = (UINT8*)av_malloc(width); + uint8_t *buf; + buf = (uint8_t*)av_malloc(width); src_m1 = src1; memcpy(buf,src_m1,width); diff --git a/src/libffmpeg/libavcodec/imgresample.c b/src/libffmpeg/libavcodec/imgresample.c index 28147fc72..140894d36 100644 --- a/src/libffmpeg/libavcodec/imgresample.c +++ b/src/libffmpeg/libavcodec/imgresample.c @@ -16,13 +16,18 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file imgresample.c + * High quality image resampling with polyphase filters . + */ + #include "avcodec.h" #include "dsputil.h" #ifdef USE_FASTMEMCPY #include "fastmemcpy.h" #endif -extern int mm_flags; #define NB_COMPONENTS 3 @@ -42,9 +47,9 @@ extern int mm_flags; struct ImgReSampleContext { int iwidth, iheight, owidth, oheight, topBand, bottomBand, leftBand, rightBand; int h_incr, v_incr; - INT16 h_filters[NB_PHASES][NB_TAPS] __align8; /* horizontal filters */ - INT16 v_filters[NB_PHASES][NB_TAPS] __align8; /* vertical filters */ - UINT8 *line_buf; + int16_t h_filters[NB_PHASES][NB_TAPS] __align8; /* horizontal filters */ + int16_t v_filters[NB_PHASES][NB_TAPS] __align8; /* vertical filters */ + uint8_t *line_buf; }; static inline int get_phase(int pos) @@ -53,12 +58,12 @@ static inline int get_phase(int pos) } /* This function must be optimized */ -static void h_resample_fast(UINT8 *dst, int dst_width, UINT8 *src, int src_width, - int src_start, int src_incr, INT16 *filters) +static void h_resample_fast(uint8_t *dst, int dst_width, uint8_t *src, int src_width, + int src_start, int src_incr, int16_t *filters) { int src_pos, phase, sum, i; - UINT8 *s; - INT16 *filter; + uint8_t *s; + int16_t *filter; src_pos = src_start; for(i=0;i<dst_width;i++) { @@ -96,11 +101,11 @@ static void h_resample_fast(UINT8 *dst, int dst_width, UINT8 *src, int src_width } /* This function must be optimized */ -static void v_resample(UINT8 *dst, int dst_width, UINT8 *src, int wrap, - INT16 *filter) +static void v_resample(uint8_t *dst, int dst_width, uint8_t *src, int wrap, + int16_t *filter) { int sum, i; - UINT8 *s; + uint8_t *s; s = src; for(i=0;i<dst_width;i++) { @@ -112,7 +117,7 @@ static void v_resample(UINT8 *dst, int dst_width, UINT8 *src, int wrap, #else { int j; - UINT8 *s1 = s; + uint8_t *s1 = s; sum = 0; for(j=0;j<NB_TAPS;j++) { @@ -155,12 +160,12 @@ static void v_resample(UINT8 *dst, int dst_width, UINT8 *src, int wrap, #define DUMP(reg) movq_r2m(reg, tmp); printf(#reg "=%016Lx\n", tmp.uq); /* XXX: do four pixels at a time */ -static void h_resample_fast4_mmx(UINT8 *dst, int dst_width, UINT8 *src, int src_width, - int src_start, int src_incr, INT16 *filters) +static void h_resample_fast4_mmx(uint8_t *dst, int dst_width, uint8_t *src, int src_width, + int src_start, int src_incr, int16_t *filters) { int src_pos, phase; - UINT8 *s; - INT16 *filter; + uint8_t *s; + int16_t *filter; mmx_t tmp; src_pos = src_start; @@ -199,11 +204,11 @@ static void h_resample_fast4_mmx(UINT8 *dst, int dst_width, UINT8 *src, int src_ emms(); } -static void v_resample4_mmx(UINT8 *dst, int dst_width, UINT8 *src, int wrap, - INT16 *filter) +static void v_resample4_mmx(uint8_t *dst, int dst_width, uint8_t *src, int wrap, + int16_t *filter) { int sum, i, v; - UINT8 *s; + uint8_t *s; mmx_t tmp; mmx_t coefs[4]; @@ -240,7 +245,7 @@ static void v_resample4_mmx(UINT8 *dst, int dst_width, UINT8 *src, int wrap, packuswb_r2r(mm7, mm0); movq_r2m(mm0, tmp); - *(UINT32 *)dst = tmp.ud[0]; + *(uint32_t *)dst = tmp.ud[0]; dst += 4; s += 4; dst_width -= 4; @@ -275,8 +280,8 @@ typedef union { signed short s[8]; } vec_ss_t; -void v_resample16_altivec(UINT8 *dst, int dst_width, UINT8 *src, int wrap, - INT16 *filter) +void v_resample16_altivec(uint8_t *dst, int dst_width, uint8_t *src, int wrap, + int16_t *filter) { int sum, i; uint8_t *s; @@ -392,12 +397,12 @@ void v_resample16_altivec(UINT8 *dst, int dst_width, UINT8 *src, int wrap, #endif /* slow version to handle limit cases. Does not need optimisation */ -static void h_resample_slow(UINT8 *dst, int dst_width, UINT8 *src, int src_width, - int src_start, int src_incr, INT16 *filters) +static void h_resample_slow(uint8_t *dst, int dst_width, uint8_t *src, int src_width, + int src_start, int src_incr, int16_t *filters) { int src_pos, phase, sum, j, v, i; - UINT8 *s, *src_end; - INT16 *filter; + uint8_t *s, *src_end; + int16_t *filter; src_end = src + src_width; src_pos = src_start; @@ -427,8 +432,8 @@ static void h_resample_slow(UINT8 *dst, int dst_width, UINT8 *src, int src_width } } -static void h_resample(UINT8 *dst, int dst_width, UINT8 *src, int src_width, - int src_start, int src_incr, INT16 *filters) +static void h_resample(uint8_t *dst, int dst_width, uint8_t *src, int src_width, + int src_start, int src_incr, int16_t *filters) { int n, src_end; @@ -464,11 +469,11 @@ static void h_resample(UINT8 *dst, int dst_width, UINT8 *src, int src_width, } static void component_resample(ImgReSampleContext *s, - UINT8 *output, int owrap, int owidth, int oheight, - UINT8 *input, int iwrap, int iwidth, int iheight) + uint8_t *output, int owrap, int owidth, int oheight, + uint8_t *input, int iwrap, int iwidth, int iheight) { int src_y, src_y1, last_src_y, ring_y, phase_y, y1, y; - UINT8 *new_line, *src_line; + uint8_t *new_line, *src_line; last_src_y = - FCENTER - 1; /* position of the bottom of the filter in the source image */ @@ -529,7 +534,7 @@ static void component_resample(ImgReSampleContext *s, /* XXX: the following filter is quite naive, but it seems to suffice for 4 taps */ -static void build_filter(INT16 *filter, float factor) +static void build_filter(int16_t *filter, float factor) { int ph, i, v; float x, y, tab[NB_TAPS], norm, mult; @@ -642,15 +647,15 @@ void av_free(void *ptr) /* input */ #define XSIZE 256 #define YSIZE 256 -UINT8 img[XSIZE * YSIZE]; +uint8_t img[XSIZE * YSIZE]; /* output */ #define XSIZE1 512 #define YSIZE1 512 -UINT8 img1[XSIZE1 * YSIZE1]; -UINT8 img2[XSIZE1 * YSIZE1]; +uint8_t img1[XSIZE1 * YSIZE1]; +uint8_t img2[XSIZE1 * YSIZE1]; -void save_pgm(const char *filename, UINT8 *img, int xsize, int ysize) +void save_pgm(const char *filename, uint8_t *img, int xsize, int ysize) { FILE *f; f=fopen(filename,"w"); @@ -659,7 +664,7 @@ void save_pgm(const char *filename, UINT8 *img, int xsize, int ysize) fclose(f); } -static void dump_filter(INT16 *filter) +static void dump_filter(int16_t *filter) { int i, ph; diff --git a/src/libffmpeg/libavcodec/jfdctfst.c b/src/libffmpeg/libavcodec/jfdctfst.c index 4e3b55bb5..899768d36 100644 --- a/src/libffmpeg/libavcodec/jfdctfst.c +++ b/src/libffmpeg/libavcodec/jfdctfst.c @@ -30,6 +30,11 @@ * quality-setting files than with low-quality ones. */ +/** + * @file jfdctfst.c + * Independent JPEG Group's fast AAN dct. + */ + #include <stdlib.h> #include <stdio.h> #include "common.h" @@ -78,10 +83,10 @@ */ #if CONST_BITS == 8 -#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */ -#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */ -#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */ -#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */ +#define FIX_0_382683433 ((int32_t) 98) /* FIX(0.382683433) */ +#define FIX_0_541196100 ((int32_t) 139) /* FIX(0.541196100) */ +#define FIX_0_707106781 ((int32_t) 181) /* FIX(0.707106781) */ +#define FIX_1_306562965 ((int32_t) 334) /* FIX(1.306562965) */ #else #define FIX_0_382683433 FIX(0.382683433) #define FIX_0_541196100 FIX(0.541196100) @@ -101,7 +106,7 @@ #endif -/* Multiply a DCTELEM variable by an INT32 constant, and immediately +/* Multiply a DCTELEM variable by an int32_t constant, and immediately * descale to yield a DCTELEM result. */ diff --git a/src/libffmpeg/libavcodec/jfdctint.c b/src/libffmpeg/libavcodec/jfdctint.c index 6b0d4cadb..702d0a947 100644 --- a/src/libffmpeg/libavcodec/jfdctint.c +++ b/src/libffmpeg/libavcodec/jfdctint.c @@ -23,6 +23,11 @@ * scaled fixed-point arithmetic, with a minimal number of shifts. */ +/** + * @file jfdctint.c + * Independent JPEG Group's slow & accurate dct. + */ + #include <stdlib.h> #include <stdio.h> #include "common.h" @@ -78,7 +83,7 @@ * they are represented to better-than-integral precision. These outputs * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word * with the recommended scaling. (For 12-bit sample data, the intermediate - * array is INT32 anyway.) + * array is int32_t anyway.) * * To avoid overflow of the 32-bit intermediate results in pass 2, we must * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis @@ -101,18 +106,18 @@ */ #if CONST_BITS == 13 -#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#define FIX_0_298631336 ((int32_t) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((int32_t) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((int32_t) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((int32_t) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((int32_t) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((int32_t) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((int32_t) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((int32_t) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((int32_t) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((int32_t) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((int32_t) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((int32_t) 25172) /* FIX(3.072711026) */ #else #define FIX_0_298631336 FIX(0.298631336) #define FIX_0_390180644 FIX(0.390180644) @@ -129,7 +134,7 @@ #endif -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. +/* Multiply an int32_t variable by an int32_t constant to yield an int32_t result. * For 8-bit samples with the recommended scaling, all the variable * and constant values involved are no more than 16 bits wide, so a * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. @@ -150,9 +155,9 @@ GLOBAL(void) ff_jpeg_fdct_islow (DCTELEM * data) { - INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; + int32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + int32_t tmp10, tmp11, tmp12, tmp13; + int32_t z1, z2, z3, z4, z5; DCTELEM *dataptr; int ctr; SHIFT_TEMPS diff --git a/src/libffmpeg/libavcodec/jrevdct.c b/src/libffmpeg/libavcodec/jrevdct.c index 3ba91543d..3bd78c192 100644 --- a/src/libffmpeg/libavcodec/jrevdct.c +++ b/src/libffmpeg/libavcodec/jrevdct.c @@ -25,6 +25,12 @@ * A better way to do this would be to pass in the DCT block as a sparse * matrix, perhaps with the difference cases encoded. */ + +/** + * @file jrevdct.c + * Independent JPEG Group's LLM idct. + */ + #include "common.h" #include "dsputil.h" @@ -92,7 +98,7 @@ typedef DCTELEM DCTBLOCK[DCTSIZE2]; #define PASS1_BITS 1 /* lose a little precision to avoid overflow */ #endif -#define ONE ((INT32) 1) +#define ONE ((int32_t) 1) #define CONST_SCALE (ONE << CONST_BITS) @@ -103,16 +109,16 @@ typedef DCTELEM DCTBLOCK[DCTSIZE2]; */ /* Actually FIX is no longer used, we precomputed them all */ -#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) +#define FIX(x) ((int32_t) ((x) * CONST_SCALE + 0.5)) -/* Descale and correctly round an INT32 value that's scaled by N bits. +/* Descale and correctly round an int32_t value that's scaled by N bits. * We assume RIGHT_SHIFT rounds towards minus infinity, so adding * the fudge factor is correct for either sign of X. */ #define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. +/* Multiply an int32_t variable by an int32_t constant to yield an int32_t result. * For 8-bit samples with the recommended scaling, all the variable * and constant values involved are no more than 16 bits wide, so a * 16x16->32 bit multiply can be used instead of a full 32x32 multiply; @@ -125,10 +131,10 @@ typedef DCTELEM DCTBLOCK[DCTSIZE2]; #ifdef EIGHT_BIT_SAMPLES #ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ -#define MULTIPLY(var,const) (((INT16) (var)) * ((INT16) (const))) +#define MULTIPLY(var,const) (((int16_t) (var)) * ((int16_t) (const))) #endif #ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ -#define MULTIPLY(var,const) (((INT16) (var)) * ((INT32) (const))) +#define MULTIPLY(var,const) (((int16_t) (var)) * ((int32_t) (const))) #endif #endif @@ -172,10 +178,10 @@ ones here or successive P-frames will drift too much with Reference frame coding void j_rev_dct(DCTBLOCK data) { - INT32 tmp0, tmp1, tmp2, tmp3; - INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; - INT32 d0, d1, d2, d3, d4, d5, d6, d7; + int32_t tmp0, tmp1, tmp2, tmp3; + int32_t tmp10, tmp11, tmp12, tmp13; + int32_t z1, z2, z3, z4, z5; + int32_t d0, d1, d2, d3, d4, d5, d6, d7; register DCTELEM *dataptr; int rowctr; diff --git a/src/libffmpeg/libavcodec/libpostproc/postprocess.c b/src/libffmpeg/libavcodec/libpostproc/postprocess.c index 130bb36c6..8668b530f 100644 --- a/src/libffmpeg/libavcodec/libpostproc/postprocess.c +++ b/src/libffmpeg/libavcodec/libpostproc/postprocess.c @@ -16,6 +16,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + * @file postprocess.c + * postprocessing. + */ + /* C MMX MMX2 3DNow isVertDC Ec Ec @@ -62,10 +67,8 @@ try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks //Changelog: use the CVS log -#ifdef HAVE_CONFIG_H #include "config.h" -#endif - +#include <inttypes.h> #include <stdio.h> #include "xineutils.h" @@ -152,7 +155,6 @@ static inline void unusedVariableWarningFixer() } #endif - // The horizontal Functions exist only in C cuz the MMX code is faster with vertical filters and transposing /** diff --git a/src/libffmpeg/libavcodec/libpostproc/postprocess.h b/src/libffmpeg/libavcodec/libpostproc/postprocess.h index 8c3c7b143..fd8a42c13 100644 --- a/src/libffmpeg/libavcodec/libpostproc/postprocess.h +++ b/src/libffmpeg/libavcodec/libpostproc/postprocess.h @@ -36,7 +36,7 @@ extern "C" { typedef void pp_context_t; typedef void pp_mode_t; -extern char *pp_help; /* a simple help text */ +extern char *pp_help; ///< a simple help text void pp_postprocess(uint8_t * src[3], int srcStride[3], uint8_t * dst[3], int dstStride[3], diff --git a/src/libffmpeg/libavcodec/libpostproc/postprocess_internal.h b/src/libffmpeg/libavcodec/libpostproc/postprocess_internal.h index f45a0cf85..1956180b7 100644 --- a/src/libffmpeg/libavcodec/libpostproc/postprocess_internal.h +++ b/src/libffmpeg/libavcodec/libpostproc/postprocess_internal.h @@ -16,10 +16,15 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + * @file postprocess_internal.h + * internal api header. + */ + #define V_DEBLOCK 0x01 #define H_DEBLOCK 0x02 #define DERING 0x04 -#define LEVEL_FIX 0x08 /* Brightness & Contrast */ +#define LEVEL_FIX 0x08 ///< Brightness & Contrast #define LUM_V_DEBLOCK V_DEBLOCK // 1 #define LUM_H_DEBLOCK H_DEBLOCK // 2 @@ -36,7 +41,7 @@ // Experimental horizontal filters #define H_X1_FILTER 0x2000 // 8192 -// select between full y range (255-0) or standart one (234-16) +/// select between full y range (255-0) or standart one (234-16) #define FULL_Y_RANGE 0x8000 // 32768 //Deinterlacing Filters @@ -56,47 +61,59 @@ //filters on //#define COMPILE_TIME_MODE 0x77 +/** + * Postprocessng filter. + */ struct PPFilter{ char *shortName; char *longName; - int chromDefault; // is chrominance filtering on by default if this filter is manually activated - int minLumQuality; // minimum quality to turn luminance filtering on - int minChromQuality; // minimum quality to turn chrominance filtering on - int mask; // Bitmask to turn this filter on + int chromDefault; ///< is chrominance filtering on by default if this filter is manually activated + int minLumQuality; ///< minimum quality to turn luminance filtering on + int minChromQuality; ///< minimum quality to turn chrominance filtering on + int mask; ///< Bitmask to turn this filter on }; +/** + * Postprocessng mode. + */ typedef struct PPMode{ - int lumMode; // acivates filters for luminance - int chromMode; // acivates filters for chrominance - int error; // non zero on error + int lumMode; ///< acivates filters for luminance + int chromMode; ///< acivates filters for chrominance + int error; ///< non zero on error - int minAllowedY; // for brigtness correction - int maxAllowedY; // for brihtness correction - float maxClippedThreshold; // amount of "black" u r willing to loose to get a brightness corrected picture + int minAllowedY; ///< for brigtness correction + int maxAllowedY; ///< for brihtness correction + float maxClippedThreshold; ///< amount of "black" u r willing to loose to get a brightness corrected picture - int maxTmpNoise[3]; // for Temporal Noise Reducing filter (Maximal sum of abs differences) + int maxTmpNoise[3]; ///< for Temporal Noise Reducing filter (Maximal sum of abs differences) int baseDcDiff; int flatnessThreshold; - int forcedQuant; // quantizer if FORCE_QUANT is used + int forcedQuant; ///< quantizer if FORCE_QUANT is used } PPMode; +/** + * postprocess context. + */ typedef struct PPContext{ - uint8_t *tempBlocks; //used for the horizontal code + uint8_t *tempBlocks; ///<used for the horizontal code - /* we need 64bit here otherwise we´ll going to have a problem - after watching a black picture for 5 hours*/ + /** + * luma histogram. + * we need 64bit here otherwise we'll going to have a problem + * after watching a black picture for 5 hours + */ uint64_t *yHistogram; uint64_t __attribute__((aligned(8))) packedYOffset; uint64_t __attribute__((aligned(8))) packedYScale; - /* Temporal noise reducing buffers */ + /** Temporal noise reducing buffers */ uint8_t *tempBlured[3]; int32_t *tempBluredPast[3]; - /* Temporary buffers for handling the last row(s) */ + /** Temporary buffers for handling the last row(s) */ uint8_t *tempDst; uint8_t *tempSrc; @@ -118,7 +135,7 @@ typedef struct PPContext{ int cpuCaps; - int stride; //size of some buffers (needed to realloc them if needed) + int stride; ///<size of some buffers (needed to realloc them if needed) int hChromaSubSample; int vChromaSubSample; diff --git a/src/libffmpeg/libavcodec/libpostproc/postprocess_template.c b/src/libffmpeg/libavcodec/libpostproc/postprocess_template.c index af48cdcba..fc8cde56c 100644 --- a/src/libffmpeg/libavcodec/libpostproc/postprocess_template.c +++ b/src/libffmpeg/libavcodec/libpostproc/postprocess_template.c @@ -16,6 +16,12 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + * @file postprocess_template.c + * mmx/mmx2/3dnow postprocess code. + */ + + #undef PAVGB #undef PMINUB #undef PMAXUB @@ -1523,7 +1529,7 @@ DERING_CORE((%0, %1, 8),(%%edx, %1, 4) ,%%mm2,%%mm4,%%mm0,%%mm3,%%mm5,%%mm1,%%mm } /** - * Deinterlaces the given block + * Deinterlaces the given block by linearly interpolating every second line. * will be called for every 8x8 block and can read & write from line 4-15 * lines 0-3 have been passed through the deblock / dering filters allready, but can be read too * lines 4-12 will be read into the deblocking filter and should be deinterlaced @@ -1570,7 +1576,7 @@ static inline void RENAME(deInterlaceInterpolateLinear)(uint8_t src[], int strid } /** - * Deinterlaces the given block + * Deinterlaces the given block by cubic interpolating every second line. * will be called for every 8x8 block and can read & write from line 4-15 * lines 0-3 have been passed through the deblock / dering filters allready, but can be read too * lines 4-12 will be read into the deblocking filter and should be deinterlaced @@ -1635,7 +1641,7 @@ DEINT_CUBIC((%%edx, %1), (%0, %1, 8), (%%edx, %1, 4), (%%ecx), (%%ecx, %1, 2)) } /** - * Deinterlaces the given block + * Deinterlaces the given block by filtering every second line with a (-1 4 2 4 -1) filter. * will be called for every 8x8 block and can read & write from line 4-15 * lines 0-3 have been passed through the deblock / dering filters allready, but can be read too * lines 4-12 will be read into the deblocking filter and should be deinterlaced @@ -1714,7 +1720,7 @@ DEINT_FF((%%edx, %1), (%%edx, %1, 2), (%0, %1, 8), (%%edx, %1, 4)) } /** - * Deinterlaces the given block + * Deinterlaces the given block by filtering all lines with a (1 2 1) filter. * will be called for every 8x8 block and can read & write from line 4-15 * lines 0-3 have been passed through the deblock / dering filters allready, but can be read too * lines 4-12 will be read into the deblocking filter and should be deinterlaced @@ -1789,7 +1795,7 @@ static inline void RENAME(deInterlaceBlendLinear)(uint8_t src[], int stride) } /** - * Deinterlaces the given block + * Deinterlaces the given block by applying a median filter to every second line. * will be called for every 8x8 block and can read & write from line 4-15, * lines 0-3 have been passed through the deblock / dering filters allready, but can be read too * lines 4-12 will be read into the deblocking filter and should be deinterlaced diff --git a/src/libffmpeg/libavcodec/mace.c b/src/libffmpeg/libavcodec/mace.c index 18aaacaf1..91a37452b 100644 --- a/src/libffmpeg/libavcodec/mace.c +++ b/src/libffmpeg/libavcodec/mace.c @@ -16,6 +16,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file mace.c + * MACE decoder. + */ + #include "avcodec.h" /* @@ -24,11 +30,11 @@ * libavcodec api, context stuff, interlaced stereo out). */ -static const UINT16 MACEtab1[] = { 0xfff3, 0x0008, 0x004c, 0x00de, 0x00de, 0x004c, 0x0008, 0xfff3 }; +static const uint16_t MACEtab1[] = { 0xfff3, 0x0008, 0x004c, 0x00de, 0x00de, 0x004c, 0x0008, 0xfff3 }; -static const UINT16 MACEtab3[] = { 0xffee, 0x008c, 0x008c, 0xffee }; +static const uint16_t MACEtab3[] = { 0xffee, 0x008c, 0x008c, 0xffee }; -static const UINT16 MACEtab2[][8] = { +static const uint16_t MACEtab2[][8] = { { 0x0025, 0x0074, 0x00CE, 0x014A, 0xFEB5, 0xFF31, 0xFF8B, 0xFFDA }, { 0x0027, 0x0079, 0x00D8, 0x015A, 0xFEA5, 0xFF27, 0xFF86, 0xFFD8 }, { 0x0029, 0x007F, 0x00E1, 0x0169, 0xFE96, 0xFF1E, 0xFF80, 0xFFD6 }, @@ -159,7 +165,7 @@ static const UINT16 MACEtab2[][8] = { { 0x25A7, 0x741F, 0x7FFF, 0x7FFF, 0x8000, 0x8000, 0x8BE0, 0xDA58 }, }; -static const UINT16 MACEtab4[][8] = { +static const uint16_t MACEtab4[][8] = { { 0x0040, 0x00D8, 0xFF27, 0xFFBF, 0, 0, 0, 0 }, { 0x0043, 0x00E2, 0xFF1D, 0xFFBC, 0, 0, 0, 0 }, { 0x0046, 0x00EC, 0xFF13, 0xFFB9, 0, 0, 0, 0 }, { 0x004A, 0x00F6, 0xFF09, 0xFFB5, 0, 0, 0, 0 }, { 0x004D, 0x0101, 0xFEFE, 0xFFB2, 0, 0, 0, 0 }, { 0x0050, 0x010C, 0xFEF3, 0xFFAF, 0, 0, 0, 0 }, @@ -234,9 +240,9 @@ typedef struct MACEContext { /* /// "chomp3()" */ static void chomp3(MACEContext *ctx, - UINT8 val, - const UINT16 tab1[], - const UINT16 tab2[][8]) + uint8_t val, + const uint16_t tab1[], + const uint16_t tab2[][8]) { short current; @@ -253,13 +259,13 @@ static void chomp3(MACEContext *ctx, /* /// "Exp1to3()" */ static void Exp1to3(MACEContext *ctx, - UINT8 *inBuffer, + uint8_t *inBuffer, void *outBuffer, - UINT32 cnt, - UINT32 numChannels, - UINT32 whichChannel) + uint32_t cnt, + uint32_t numChannels, + uint32_t whichChannel) { - UINT8 pkt; + uint8_t pkt; /* if (inState) { @@ -298,9 +304,9 @@ static void Exp1to3(MACEContext *ctx, /* /// "chomp6()" */ static void chomp6(MACEContext *ctx, - UINT8 val, - const UINT16 tab1[], - const UINT16 tab2[][8]) + uint8_t val, + const uint16_t tab1[], + const uint16_t tab2[][8]) { short current; @@ -335,13 +341,13 @@ static void chomp6(MACEContext *ctx, /* /// "Exp1to6()" */ static void Exp1to6(MACEContext *ctx, - UINT8 *inBuffer, + uint8_t *inBuffer, void *outBuffer, - UINT32 cnt, - UINT32 numChannels, - UINT32 whichChannel) + uint32_t cnt, + uint32_t numChannels, + uint32_t whichChannel) { - UINT8 pkt; + uint8_t pkt; /* if (inState) { @@ -389,7 +395,7 @@ static int mace_decode_init(AVCodecContext * avctx) static int mace_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { short *samples; MACEContext *c = avctx->priv_data; diff --git a/src/libffmpeg/libavcodec/mdct.c b/src/libffmpeg/libavcodec/mdct.c index 91a927cb0..a0f567177 100644 --- a/src/libffmpeg/libavcodec/mdct.c +++ b/src/libffmpeg/libavcodec/mdct.c @@ -18,8 +18,13 @@ */ #include "dsputil.h" -/* - * init MDCT or IMDCT computation +/** + * @file mdct.c + * MDCT/IMDCT transforms. + */ + +/** + * init MDCT or IMDCT computation. */ int ff_mdct_init(MDCTContext *s, int nbits, int inverse) { diff --git a/src/libffmpeg/libavcodec/mem.c b/src/libffmpeg/libavcodec/mem.c index a36952fd7..c5ca166d3 100644 --- a/src/libffmpeg/libavcodec/mem.c +++ b/src/libffmpeg/libavcodec/mem.c @@ -16,6 +16,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file mem.c + * default memory allocator for libavcodec. + */ + #include "avcodec.h" /* here we can use OS dependant allocation functions */ diff --git a/src/libffmpeg/libavcodec/mjpeg.c b/src/libffmpeg/libavcodec/mjpeg.c index 8df477afa..135066796 100644 --- a/src/libffmpeg/libavcodec/mjpeg.c +++ b/src/libffmpeg/libavcodec/mjpeg.c @@ -20,26 +20,31 @@ * aspecting, new decode_frame mechanism and apple mjpeg-b support * by Alex Beregszaszi <alex@naxine.org> */ + +/** + * @file mjpeg.c + * MJPEG encoder and decoder. + */ + //#define DEBUG #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" -#include "xineutils.h" /* use two quantizer tables (one for luminance and one for chrominance) */ /* not yet working */ #undef TWOMATRIXES typedef struct MJpegContext { - UINT8 huff_size_dc_luminance[12]; - UINT16 huff_code_dc_luminance[12]; - UINT8 huff_size_dc_chrominance[12]; - UINT16 huff_code_dc_chrominance[12]; - - UINT8 huff_size_ac_luminance[256]; - UINT16 huff_code_ac_luminance[256]; - UINT8 huff_size_ac_chrominance[256]; - UINT16 huff_code_ac_chrominance[256]; + uint8_t huff_size_dc_luminance[12]; + uint16_t huff_code_dc_luminance[12]; + uint8_t huff_size_dc_chrominance[12]; + uint16_t huff_code_dc_chrominance[12]; + + uint8_t huff_size_ac_luminance[256]; + uint16_t huff_code_ac_luminance[256]; + uint8_t huff_size_ac_chrominance[256]; + uint16_t huff_code_ac_chrominance[256]; } MJpegContext; /* JPEG marker codes */ @@ -153,19 +158,19 @@ static const unsigned char std_chrominance_quant_tbl[64] = { /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ /* IMPORTANT: these are only valid for 8-bit data precision! */ -static const UINT8 bits_dc_luminance[17] = +static const uint8_t bits_dc_luminance[17] = { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; -static const UINT8 val_dc_luminance[] = +static const uint8_t val_dc_luminance[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; -static const UINT8 bits_dc_chrominance[17] = +static const uint8_t bits_dc_chrominance[17] = { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; -static const UINT8 val_dc_chrominance[] = +static const uint8_t val_dc_chrominance[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; -static const UINT8 bits_ac_luminance[17] = +static const uint8_t bits_ac_luminance[17] = { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; -static const UINT8 val_ac_luminance[] = +static const uint8_t val_ac_luminance[] = { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, @@ -189,10 +194,10 @@ static const UINT8 val_ac_luminance[] = 0xf9, 0xfa }; -static const UINT8 bits_ac_chrominance[17] = +static const uint8_t bits_ac_chrominance[17] = { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; -static const UINT8 val_ac_chrominance[] = +static const uint8_t val_ac_chrominance[] = { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, @@ -217,8 +222,8 @@ static const UINT8 val_ac_chrominance[] = }; /* isn't this function nicer than the one in the libjpeg ? */ -static void build_huffman_codes(UINT8 *huff_size, UINT16 *huff_code, - const UINT8 *bits_table, const UINT8 *val_table) +static void build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code, + const uint8_t *bits_table, const uint8_t *val_table) { int i, j, k,nb, code, sym; @@ -246,7 +251,6 @@ int mjpeg_init(MpegEncContext *s) s->min_qcoeff=-1023; s->max_qcoeff= 1023; - s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x /* build all the huffman tables */ build_huffman_codes(m->huff_size_dc_luminance, @@ -283,7 +287,7 @@ static inline void put_marker(PutBitContext *p, int code) /* table_class: 0 = DC coef, 1 = AC coefs */ static int put_huffman_table(MpegEncContext *s, int table_class, int table_id, - const UINT8 *bits_table, const UINT8 *value_table) + const uint8_t *bits_table, const uint8_t *value_table) { PutBitContext *p = &s->pb; int n, i; @@ -307,7 +311,7 @@ static void jpeg_table_header(MpegEncContext *s) { PutBitContext *p = &s->pb; int i, j, size; - UINT8 *ptr; + uint8_t *ptr; /* quant matrixes */ put_marker(p, DQT); @@ -350,7 +354,7 @@ static void jpeg_put_comments(MpegEncContext *s) { PutBitContext *p = &s->pb; int size; - UINT8 *ptr; + uint8_t *ptr; if (s->aspect_ratio_info) { @@ -387,15 +391,13 @@ static void jpeg_put_comments(MpegEncContext *s) } /* comment */ - if(!ff_bit_exact){ + if(!(s->flags & CODEC_FLAG_BITEXACT)){ put_marker(p, COM); flush_put_bits(p); ptr = pbBufPtr(p); put_bits(p, 16, 0); /* patched later */ -#define MJPEG_VERSION "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR - put_string(p, MJPEG_VERSION); - size = strlen(MJPEG_VERSION)+3; -#undef MJPEG_VERSION + put_string(p, LIBAVCODEC_IDENT); + size = strlen(LIBAVCODEC_IDENT)+3; ptr[0] = size >> 8; ptr[1] = size; } @@ -478,7 +480,7 @@ static void escape_FF(MpegEncContext *s, int start) uint8_t *buf= s->pb.buf + start; int align= (-(int)(buf))&3; - XINE_ASSERT((size&7) == 0,"?"); + assert((size&7) == 0); size >>= 3; ff_count=0; @@ -534,7 +536,7 @@ void mjpeg_picture_trailer(MpegEncContext *s) put_bits(&s->pb, pad,0xFF>>(8-pad)); flush_put_bits(&s->pb); - XINE_ASSERT((s->header_bits&7)==0, "?"); + assert((s->header_bits&7)==0); escape_FF(s, s->header_bits>>3); @@ -542,7 +544,7 @@ void mjpeg_picture_trailer(MpegEncContext *s) } static inline void mjpeg_encode_dc(MpegEncContext *s, int val, - UINT8 *huff_size, UINT16 *huff_code) + uint8_t *huff_size, uint16_t *huff_code) { int mant, nbits; @@ -573,8 +575,8 @@ static void encode_block(MpegEncContext *s, DCTELEM *block, int n) int mant, nbits, code, i, j; int component, dc, run, last_index, val; MJpegContext *m = s->mjpeg_ctx; - UINT8 *huff_size_ac; - UINT16 *huff_code_ac; + uint8_t *huff_size_ac; + uint16_t *huff_code_ac; /* DC coef */ component = (n <= 3 ? 0 : n - 4 + 1); @@ -652,9 +654,9 @@ typedef struct MJpegDecodeContext { int start_code; /* current start code */ int buffer_size; - UINT8 *buffer; + uint8_t *buffer; - INT16 quant_matrixes[4][64]; + int16_t quant_matrixes[4][64]; VLC vlcs[2][4]; int org_width, org_height; /* size given at codec init */ @@ -670,11 +672,11 @@ typedef struct MJpegDecodeContext { int h_max, v_max; /* maximum h and v counts */ int quant_index[4]; /* quant table index for each component */ int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */ - UINT8 *current_picture[MAX_COMPONENTS]; /* picture structure */ + uint8_t *current_picture[MAX_COMPONENTS]; /* picture structure */ int linesize[MAX_COMPONENTS]; DCTELEM block[64] __align8; ScanTable scantable; - void (*idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); + void (*idct_put)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); int restart_interval; int restart_count; @@ -685,11 +687,11 @@ typedef struct MJpegDecodeContext { static int mjpeg_decode_dht(MJpegDecodeContext *s); -static void build_vlc(VLC *vlc, const UINT8 *bits_table, const UINT8 *val_table, +static void build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table, int nb_codes) { - UINT8 huff_size[256]; - UINT16 huff_code[256]; + uint8_t huff_size[256]; + uint16_t huff_code[256]; memset(huff_size, 0, sizeof(huff_size)); build_huffman_codes(huff_size, huff_code, bits_table, val_table); @@ -704,7 +706,7 @@ static int mjpeg_decode_init(AVCodecContext *avctx) s->avctx = avctx; - /* ugly way to get the idct & scantable */ + /* ugly way to get the idct & scantable FIXME */ memset(&s2, 0, sizeof(MpegEncContext)); s2.flags= avctx->flags; s2.avctx= avctx; @@ -714,7 +716,7 @@ static int mjpeg_decode_init(AVCodecContext *avctx) if (MPV_common_init(&s2) < 0) return -1; s->scantable= s2.intra_scantable; - s->idct_put= s2.idct_put; + s->idct_put= s2.dsp.idct_put; MPV_common_end(&s2); s->mpeg_enc_ctx_allocated = 0; @@ -777,8 +779,8 @@ static int mjpeg_decode_dqt(MJpegDecodeContext *s) static int mjpeg_decode_dht(MJpegDecodeContext *s) { int len, index, i, class, n, v, code_max; - UINT8 bits_table[17]; - UINT8 val_table[256]; + uint8_t bits_table[17]; + uint8_t val_table[256]; len = get_bits(&s->gb, 16) - 2; @@ -929,7 +931,7 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block, int nbits, code, i, j, level; int run, val; VLC *ac_vlc; - INT16 *quant_matrix; + int16_t *quant_matrix; /* DC coef */ val = mjpeg_decode_dc(s, dc_index); @@ -1072,7 +1074,7 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s) for(mb_y = 0; mb_y < mb_height; mb_y++) { for(mb_x = 0; mb_x < mb_width; mb_x++) { for(i=0;i<nb_components;i++) { - UINT8 *ptr; + uint8_t *ptr; int x, y, c; n = nb_blocks[i]; c = comp_index[i]; @@ -1263,31 +1265,33 @@ out: static int mjpeg_decode_com(MJpegDecodeContext *s) { - int len, i; - UINT8 *cbuf; - /* XXX: verify len field validity */ - len = get_bits(&s->gb, 16)-2; - cbuf = av_malloc(len+1); - - for (i = 0; i < len; i++) - cbuf[i] = get_bits(&s->gb, 8); - if (cbuf[i-1] == '\n') - cbuf[i-1] = 0; - else - cbuf[i] = 0; - - printf("mjpeg comment: '%s'\n", cbuf); + unsigned int len = get_bits(&s->gb, 16); + if (len >= 2 && len < 32768) { + /* XXX: any better upper bound */ + uint8_t *cbuf = av_malloc(len - 1); + if (cbuf) { + int i; + for (i = 0; i < len - 2; i++) + cbuf[i] = get_bits(&s->gb, 8); + if (i > 0 && cbuf[i-1] == '\n') + cbuf[i-1] = 0; + else + cbuf[i] = 0; + + printf("mjpeg comment: '%s'\n", cbuf); + + /* buggy avid, it puts EOI only at every 10th frame */ + if (!strcmp(cbuf, "AVID")) + { + s->buggy_avid = 1; + // if (s->first_picture) + // printf("mjpeg: workarounding buggy AVID\n"); + } - /* buggy avid, it puts EOI only at every 10th frame */ - if (!strcmp(cbuf, "AVID")) - { - s->buggy_avid = 1; -// if (s->first_picture) -// printf("mjpeg: workarounding buggy AVID\n"); + av_free(cbuf); + } } - - av_free(cbuf); return 0; } @@ -1317,9 +1321,9 @@ static int valid_marker_list[] = /* return the 8 bit start code value and update the search state. Return -1 if no start code found */ -static int find_marker(UINT8 **pbuf_ptr, UINT8 *buf_end) +static int find_marker(uint8_t **pbuf_ptr, uint8_t *buf_end) { - UINT8 *buf_ptr; + uint8_t *buf_ptr; unsigned int v, v2; int val; #ifdef DEBUG @@ -1349,10 +1353,10 @@ found: static int mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { MJpegDecodeContext *s = avctx->priv_data; - UINT8 *buf_end, *buf_ptr; + uint8_t *buf_end, *buf_ptr; int i, start_code; AVPicture *picture = data; @@ -1386,12 +1390,12 @@ static int mjpeg_decode_frame(AVCodecContext *avctx, /* unescape buffer of SOS */ if (start_code == SOS) { - UINT8 *src = buf_ptr; - UINT8 *dst = s->buffer; + uint8_t *src = buf_ptr; + uint8_t *dst = s->buffer; while (src<buf_end) { - UINT8 x = *(src++); + uint8_t x = *(src++); *(dst++) = x; if (x == 0xff) @@ -1526,10 +1530,10 @@ the_end: static int mjpegb_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { MJpegDecodeContext *s = avctx->priv_data; - UINT8 *buf_end, *buf_ptr; + uint8_t *buf_end, *buf_ptr; int i; AVPicture *picture = data; GetBitContext hgb; /* for the header */ diff --git a/src/libffmpeg/libavcodec/mlib/dsputil_mlib.c b/src/libffmpeg/libavcodec/mlib/dsputil_mlib.c index 14e001316..7a0f9d564 100644 --- a/src/libffmpeg/libavcodec/mlib/dsputil_mlib.c +++ b/src/libffmpeg/libavcodec/mlib/dsputil_mlib.c @@ -19,7 +19,6 @@ #include "../dsputil.h" #include "../mpegvideo.h" -#include "xineutils.h" #include <mlib_types.h> #include <mlib_status.h> @@ -32,7 +31,7 @@ static void put_pixels16_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoCopyRef_U8_U8_16x16(dest, (uint8_t *)ref, stride); else @@ -42,7 +41,7 @@ static void put_pixels16_mlib (uint8_t * dest, const uint8_t * ref, static void put_pixels16_x2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpX_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride); else @@ -52,7 +51,7 @@ static void put_pixels16_x2_mlib (uint8_t * dest, const uint8_t * ref, static void put_pixels16_y2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride); else @@ -62,7 +61,7 @@ static void put_pixels16_y2_mlib (uint8_t * dest, const uint8_t * ref, static void put_pixels16_xy2_mlib(uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpXY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride); else @@ -75,7 +74,7 @@ static void put_pixels16_xy2_mlib(uint8_t * dest, const uint8_t * ref, static void put_pixels8_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoCopyRef_U8_U8_8x16(dest, (uint8_t *)ref, stride); else @@ -85,7 +84,7 @@ static void put_pixels8_mlib (uint8_t * dest, const uint8_t * ref, static void put_pixels8_x2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpX_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride); else @@ -95,7 +94,7 @@ static void put_pixels8_x2_mlib (uint8_t * dest, const uint8_t * ref, static void put_pixels8_y2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride); else @@ -105,7 +104,7 @@ static void put_pixels8_y2_mlib (uint8_t * dest, const uint8_t * ref, static void put_pixels8_xy2_mlib(uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpXY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride); else @@ -118,7 +117,7 @@ static void put_pixels8_xy2_mlib(uint8_t * dest, const uint8_t * ref, static void avg_pixels16_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoCopyRefAve_U8_U8_16x16(dest, (uint8_t *)ref, stride); else @@ -128,7 +127,7 @@ static void avg_pixels16_mlib (uint8_t * dest, const uint8_t * ref, static void avg_pixels16_x2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpAveX_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride); else @@ -138,7 +137,7 @@ static void avg_pixels16_x2_mlib (uint8_t * dest, const uint8_t * ref, static void avg_pixels16_y2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpAveY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride); else @@ -148,7 +147,7 @@ static void avg_pixels16_y2_mlib (uint8_t * dest, const uint8_t * ref, static void avg_pixels16_xy2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpAveXY_U8_U8_16x16(dest, (uint8_t *)ref, stride, stride); else @@ -161,7 +160,7 @@ static void avg_pixels16_xy2_mlib (uint8_t * dest, const uint8_t * ref, static void avg_pixels8_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoCopyRefAve_U8_U8_8x16(dest, (uint8_t *)ref, stride); else @@ -171,7 +170,7 @@ static void avg_pixels8_mlib (uint8_t * dest, const uint8_t * ref, static void avg_pixels8_x2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpAveX_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride); else @@ -181,7 +180,7 @@ static void avg_pixels8_x2_mlib (uint8_t * dest, const uint8_t * ref, static void avg_pixels8_y2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpAveY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride); else @@ -191,7 +190,7 @@ static void avg_pixels8_y2_mlib (uint8_t * dest, const uint8_t * ref, static void avg_pixels8_xy2_mlib (uint8_t * dest, const uint8_t * ref, int stride, int height) { - XINE_ASSERT((height == 16 || height == 8),"value 'height' is not equal to 8 or 16: %d", height); + assert(height == 16 || height == 8); if (height == 16) mlib_VideoInterpAveXY_U8_U8_8x16(dest, (uint8_t *)ref, stride, stride); else @@ -199,10 +198,10 @@ static void avg_pixels8_xy2_mlib (uint8_t * dest, const uint8_t * ref, } -static void (*put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); +static void (*put_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size); -static void add_pixels_clamped_mlib(const DCTELEM *block, UINT8 *pixels, int line_size) +static void add_pixels_clamped_mlib(const DCTELEM *block, uint8_t *pixels, int line_size) { mlib_VideoAddBlock_U8_S16(pixels, (mlib_s16 *)block, line_size); } @@ -210,13 +209,13 @@ static void add_pixels_clamped_mlib(const DCTELEM *block, UINT8 *pixels, int lin /* XXX: those functions should be suppressed ASAP when all IDCTs are converted */ -static void ff_idct_put_mlib(UINT8 *dest, int line_size, DCTELEM *data) +static void ff_idct_put_mlib(uint8_t *dest, int line_size, DCTELEM *data) { mlib_VideoIDCT8x8_S16_S16 (data, data); put_pixels_clamped(data, dest, line_size); } -static void ff_idct_add_mlib(UINT8 *dest, int line_size, DCTELEM *data) +static void ff_idct_add_mlib(uint8_t *dest, int line_size, DCTELEM *data) { mlib_VideoIDCT8x8_S16_S16 (data, data); mlib_VideoAddBlock_U8_S16(dest, (mlib_s16 *)data, line_size); diff --git a/src/libffmpeg/libavcodec/motion_est.c b/src/libffmpeg/libavcodec/motion_est.c index 8d004a7c0..5bc37fa03 100644 --- a/src/libffmpeg/libavcodec/motion_est.c +++ b/src/libffmpeg/libavcodec/motion_est.c @@ -20,12 +20,21 @@ * * new Motion Estimation (X1/EPZS) by Michael Niedermayer <michaelni@gmx.at> */ + +/** + * @file motion_est.c + * Motion estimation. + */ + #include <stdlib.h> #include <stdio.h> #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" +//#undef NDEBUG +//#include <assert.h> + #define SQ(a) ((a)*(a)) #define P_LEFT P[1] @@ -58,8 +67,8 @@ typedef struct Minima{ }Minima; static int minima_cmp(const void *a, const void *b){ - Minima *da = (Minima *) a; - Minima *db = (Minima *) b; + const Minima *da = (const Minima *) a; + const Minima *db = (const Minima *) b; return da->height - db->height; } @@ -173,10 +182,19 @@ if((x) >= xmin && 2*(x) + (dx) <= 2*xmax && (y) >= ymin && 2*(y) + (dy) <= 2*yma }else{\ int fx = s->me.direct_basis_mv[0][0] + hx;\ int fy = s->me.direct_basis_mv[0][1] + hy;\ - int bx = hx ? fx - s->me.co_located_mv[0][0] : s->me.co_located_mv[0][0]*(time_pb - time_pp)/time_pp;\ - int by = hy ? fy - s->me.co_located_mv[0][1] : s->me.co_located_mv[0][1]*(time_pb - time_pp)/time_pp;\ + int bx = hx ? fx - s->me.co_located_mv[0][0] : (s->me.co_located_mv[0][0]*(time_pb - time_pp)/time_pp);\ + int by = hy ? fy - s->me.co_located_mv[0][1] : (s->me.co_located_mv[0][1]*(time_pb - time_pp)/time_pp);\ int fxy= (fx&1) + 2*(fy&1);\ int bxy= (bx&1) + 2*(by&1);\ + \ + assert((fx>>1) + 16*s->mb_x >= -16);\ + assert((fy>>1) + 16*s->mb_y >= -16);\ + assert((fx>>1) + 16*s->mb_x <= s->width);\ + assert((fy>>1) + 16*s->mb_y <= s->height);\ + assert((bx>>1) + 16*s->mb_x >= -16);\ + assert((by>>1) + 16*s->mb_y >= -16);\ + assert((bx>>1) + 16*s->mb_x <= s->width);\ + assert((by>>1) + 16*s->mb_y <= s->height);\ \ hpel_put[0][fxy](s->me.scratchpad, (ref_y ) + (fx>>1) + (fy>>1)*(stride), stride, 16);\ hpel_avg[0][bxy](s->me.scratchpad, (ref2_y) + (bx>>1) + (by>>1)*(stride), stride, 16);\ @@ -229,8 +247,14 @@ if((x) >= xmin && 4*(x) + (dx) <= 4*xmax && (y) >= ymin && 4*(y) + (dy) <= 4*yma int fxy= (fx&3) + 4*(fy&3);\ int bxy= (bx&3) + 4*(by&3);\ \ - qpel_put[0][fxy](s->me.scratchpad, (ref_y ) + (fx>>2) + (fy>>2)*(stride), stride);\ - qpel_avg[0][bxy](s->me.scratchpad, (ref2_y) + (bx>>2) + (by>>2)*(stride), stride);\ + qpel_put[1][fxy](s->me.scratchpad , (ref_y ) + (fx>>2) + (fy>>2)*(stride) , stride);\ + qpel_put[1][fxy](s->me.scratchpad + 8 , (ref_y ) + (fx>>2) + (fy>>2)*(stride) + 8 , stride);\ + qpel_put[1][fxy](s->me.scratchpad + 8*stride, (ref_y ) + (fx>>2) + (fy>>2)*(stride) + 8*stride, stride);\ + qpel_put[1][fxy](s->me.scratchpad + 8 + 8*stride, (ref_y ) + (fx>>2) + (fy>>2)*(stride) + 8 + 8*stride, stride);\ + qpel_avg[1][bxy](s->me.scratchpad , (ref2_y) + (bx>>2) + (by>>2)*(stride) , stride);\ + qpel_avg[1][bxy](s->me.scratchpad + 8 , (ref2_y) + (bx>>2) + (by>>2)*(stride) + 8 , stride);\ + qpel_avg[1][bxy](s->me.scratchpad + 8*stride, (ref2_y) + (bx>>2) + (by>>2)*(stride) + 8*stride, stride);\ + qpel_avg[1][bxy](s->me.scratchpad + 8 + 8*stride, (ref2_y) + (bx>>2) + (by>>2)*(stride) + 8 + 8*stride, stride);\ }\ d = cmp_func(s, s->me.scratchpad, src_y, stride);\ }else\ @@ -369,7 +393,7 @@ void ff_init_me(MpegEncContext *s){ } } -static int pix_dev(UINT8 * pix, int line_size, int mean) +static int pix_dev(uint8_t * pix, int line_size, int mean) { int s, i, j; @@ -404,7 +428,7 @@ static int full_motion_search(MpegEncContext * s, { int x1, y1, x2, y2, xx, yy, x, y; int mx, my, dmin, d; - UINT8 *pix; + uint8_t *pix; xx = 16 * s->mb_x; yy = 16 * s->mb_y; @@ -458,7 +482,7 @@ static int log_motion_search(MpegEncContext * s, { int x1, y1, x2, y2, xx, yy, x, y; int mx, my, dmin, d; - UINT8 *pix; + uint8_t *pix; xx = s->mb_x << 4; yy = s->mb_y << 4; @@ -534,7 +558,7 @@ static int phods_motion_search(MpegEncContext * s, { int x1, y1, x2, y2, xx, yy, x, y, lastx, d; int mx, my, dminx, dminy; - UINT8 *pix; + uint8_t *pix; xx = s->mb_x << 4; yy = s->mb_y << 4; @@ -639,7 +663,7 @@ static inline int sad_hpel_motion_search(MpegEncContext * s, uint32_t *score_map= s->me.score_map; const int penalty_factor= s->me.sub_penalty_factor; int mx, my, xx, yy, dminh; - UINT8 *pix, *ptr; + uint8_t *pix, *ptr; op_pixels_abs_func pix_abs_x2; op_pixels_abs_func pix_abs_y2; op_pixels_abs_func pix_abs_xy2; @@ -773,18 +797,18 @@ static inline void set_p_mv_tables(MpegEncContext * s, int mx, int my, int mv4) } } -static inline void get_limits(MpegEncContext *s, int *range, int *xmin, int *ymin, int *xmax, int *ymax, int f_code) +/** + * get fullpel ME search limits. + * @param range the approximate search range for the old ME code, unused for EPZS and newer + */ +static inline void get_limits(MpegEncContext *s, int *range, int *xmin, int *ymin, int *xmax, int *ymax) { - *range = 8 * (1 << (f_code - 1)); - /* XXX: temporary kludge to avoid overflow for msmpeg4 */ - if (s->out_format == FMT_H263 && !s->h263_msmpeg4) - *range *= 2; + if(s->avctx->me_range) *range= s->avctx->me_range >> 1; + else *range= 16; if (s->unrestricted_mv) { *xmin = -16; *ymin = -16; - if (s->h263_plus) - *range *= 2; if(s->avctx->codec->id!=CODEC_ID_MPEG4){ *xmax = s->mb_width*16; *ymax = s->mb_height*16; @@ -798,6 +822,8 @@ static inline void get_limits(MpegEncContext *s, int *range, int *xmin, int *ymi *xmax = s->mb_width*16 - 16; *ymax = s->mb_height*16 - 16; } + + //FIXME try to limit x/y min/max if me_range is set } static inline int h263_mv4_search(MpegEncContext *s, int xmin, int ymin, int xmax, int ymax, int mx, int my, int shift) @@ -946,7 +972,7 @@ static inline int h263_mv4_search(MpegEncContext *s, int xmin, int ymin, int xma void ff_estimate_p_frame_motion(MpegEncContext * s, int mb_x, int mb_y) { - UINT8 *pix, *ppix; + uint8_t *pix, *ppix; int sum, varc, vard, mx, my, range, dmin, xx, yy; int xmin, ymin, xmax, ymax; int rel_xmin, rel_ymin, rel_xmax, rel_ymax; @@ -958,13 +984,13 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, Picture * const pic= &s->current_picture; uint16_t * const mv_penalty= s->me.mv_penalty[s->f_code] + MAX_MV; - XINE_ASSERT(s->quarter_sample==0 || s->quarter_sample==1, "value out of range: %d", s->quarter_sample); + assert(s->quarter_sample==0 || s->quarter_sample==1); s->me.penalty_factor = get_penalty_factor(s, s->avctx->me_cmp); s->me.sub_penalty_factor= get_penalty_factor(s, s->avctx->me_sub_cmp); s->me.mb_penalty_factor = get_penalty_factor(s, s->avctx->mb_cmp); - get_limits(s, &range, &xmin, &ymin, &xmax, &ymax, s->f_code); + get_limits(s, &range, &xmin, &ymin, &xmax, &ymax); rel_xmin= xmin - mb_x*16; rel_xmax= xmax - mb_x*16; rel_ymin= ymin - mb_y*16; @@ -1129,12 +1155,11 @@ int ff_pre_estimate_p_frame_motion(MpegEncContext * s, const int mv_stride= s->mb_width + 2; const int xy= mb_x + 1 + (mb_y + 1)*mv_stride; - XINE_ASSERT((s->quarter_sample==0 || s->quarter_sample==1), - "value out of range: %d", s->quarter_sample); + assert(s->quarter_sample==0 || s->quarter_sample==1); s->me.pre_penalty_factor = get_penalty_factor(s, s->avctx->me_pre_cmp); - get_limits(s, &range, &xmin, &ymin, &xmax, &ymax, s->f_code); + get_limits(s, &range, &xmin, &ymin, &xmax, &ymax); rel_xmin= xmin - mb_x*16; rel_xmax= xmax - mb_x*16; rel_ymin= ymin - mb_y*16; @@ -1176,7 +1201,7 @@ int ff_pre_estimate_p_frame_motion(MpegEncContext * s, return dmin; } -int ff_estimate_motion_b(MpegEncContext * s, +static int ff_estimate_motion_b(MpegEncContext * s, int mb_x, int mb_y, int16_t (*mv_table)[2], Picture *picture, int f_code) { int mx, my, range, dmin; @@ -1195,7 +1220,7 @@ int ff_estimate_motion_b(MpegEncContext * s, s->me.sub_penalty_factor= get_penalty_factor(s, s->avctx->me_sub_cmp); s->me.mb_penalty_factor = get_penalty_factor(s, s->avctx->mb_cmp); - get_limits(s, &range, &xmin, &ymin, &xmax, &ymax, f_code); + get_limits(s, &range, &xmin, &ymin, &xmax, &ymax); rel_xmin= xmin - mb_x*16; rel_xmax= xmax - mb_x*16; rel_ymin= ymin - mb_y*16; @@ -1285,7 +1310,7 @@ static inline int check_bidir_mv(MpegEncContext * s, //FIXME optimize? //FIXME move into template? //FIXME better f_code prediction (max mv & distance) - UINT16 *mv_penalty= s->me.mv_penalty[s->f_code] + MAX_MV; // f_code of the prev frame + uint16_t *mv_penalty= s->me.mv_penalty[s->f_code] + MAX_MV; // f_code of the prev frame uint8_t *dest_y = s->me.scratchpad; uint8_t *ptr; int dxy; @@ -1296,8 +1321,8 @@ static inline int check_bidir_mv(MpegEncContext * s, dxy = ((motion_fy & 3) << 2) | (motion_fx & 3); src_x = mb_x * 16 + (motion_fx >> 2); src_y = mb_y * 16 + (motion_fy >> 2); - XINE_ASSERT(src_x >=-16 && src_x<=s->width, "value (%d) is not within range %d to %d", src_x, -16, s->width); - XINE_ASSERT(src_y >=-16 && src_y<=s->height, "value (%d) is not within range %d to %d", src_y, -16, s->height); + assert(src_x >=-16 && src_x<=s->width); + assert(src_y >=-16 && src_y<=s->height); ptr = s->last_picture.data[0] + (src_y * s->linesize) + src_x; s->dsp.put_qpel_pixels_tab[0][dxy](dest_y , ptr , s->linesize); @@ -1305,8 +1330,8 @@ static inline int check_bidir_mv(MpegEncContext * s, dxy = ((motion_by & 3) << 2) | (motion_bx & 3); src_x = mb_x * 16 + (motion_bx >> 2); src_y = mb_y * 16 + (motion_by >> 2); - XINE_ASSERT(src_x >=-16 && src_x<=s->width, "value (%d) is not within range %d to %d", src_x, -16, s->width); - XINE_ASSERT(src_y >=-16 && src_y<=s->height, "value (%d) is not within range %d to %d", src_y, -16, s->height); + assert(src_x >=-16 && src_x<=s->width); + assert(src_y >=-16 && src_y<=s->height); ptr = s->next_picture.data[0] + (src_y * s->linesize) + src_x; s->dsp.avg_qpel_pixels_tab[0][dxy](dest_y , ptr , s->linesize); @@ -1314,8 +1339,8 @@ static inline int check_bidir_mv(MpegEncContext * s, dxy = ((motion_fy & 1) << 1) | (motion_fx & 1); src_x = mb_x * 16 + (motion_fx >> 1); src_y = mb_y * 16 + (motion_fy >> 1); - XINE_ASSERT(src_x >=-16 && src_x<=s->width, "value (%d) is not within range %d to %d", src_x, -16, s->width); - XINE_ASSERT(src_y >=-16 && src_y<=s->height, "value (%d) is not within range %d to %d", src_y, -16, s->height); + assert(src_x >=-16 && src_x<=s->width); + assert(src_y >=-16 && src_y<=s->height); ptr = s->last_picture.data[0] + (src_y * s->linesize) + src_x; s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); @@ -1323,8 +1348,8 @@ static inline int check_bidir_mv(MpegEncContext * s, dxy = ((motion_by & 1) << 1) | (motion_bx & 1); src_x = mb_x * 16 + (motion_bx >> 1); src_y = mb_y * 16 + (motion_by >> 1); - XINE_ASSERT(src_x >=-16 && src_x<=s->width, "value (%d) is not within range %d to %d", src_x, -16, s->width); - XINE_ASSERT(src_y >=-16 && src_y<=s->height, "value (%d) is not within range %d to %d", src_y, -16, s->height); + assert(src_x >=-16 && src_x<=s->width); + assert(src_y >=-16 && src_y<=s->height); ptr = s->next_picture.data[0] + (src_y * s->linesize) + src_x; s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16); @@ -1404,24 +1429,22 @@ static inline int direct_search(MpegEncContext * s, max= FFMAX(s->me.direct_basis_mv[i][0], s->me.direct_basis_mv[i][0] - s->me.co_located_mv[i][0])>>shift; min= FFMIN(s->me.direct_basis_mv[i][0], s->me.direct_basis_mv[i][0] - s->me.co_located_mv[i][0])>>shift; - max+= (2*mb_x + (i& 1))*8 - 1; // +-1 is for the simpler rounding - min+= (2*mb_x + (i& 1))*8 + 1; + max+= (2*mb_x + (i& 1))*8 + 1; // +-1 is for the simpler rounding + min+= (2*mb_x + (i& 1))*8 - 1; xmax= FFMIN(xmax, s->width - max); xmin= FFMAX(xmin, - 16 - min); max= FFMAX(s->me.direct_basis_mv[i][1], s->me.direct_basis_mv[i][1] - s->me.co_located_mv[i][1])>>shift; min= FFMIN(s->me.direct_basis_mv[i][1], s->me.direct_basis_mv[i][1] - s->me.co_located_mv[i][1])>>shift; - max+= (2*mb_y + (i>>1))*8 - 1; // +-1 is for the simpler rounding - min+= (2*mb_y + (i>>1))*8 + 1; + max+= (2*mb_y + (i>>1))*8 + 1; // +-1 is for the simpler rounding + min+= (2*mb_y + (i>>1))*8 - 1; ymax= FFMIN(ymax, s->height - max); ymin= FFMAX(ymin, - 16 - min); if(s->mv_type == MV_TYPE_16X16) break; } - XINE_ASSERT(xmax <= 15 && ymax <= 15 && xmin >= -16 && ymin >= -16, - "xmax (%d) > 15\nymax (%d) >15\nxmin (%d) < -16\nymin (%d) < -16", - xmax, ymax, xmin, ymin); + assert(xmax <= 15 && ymax <= 15 && xmin >= -16 && ymin >= -16); if(xmax < 0 || xmin >0 || ymax < 0 || ymin > 0){ s->b_direct_mv_table[mot_xy][0]= 0; @@ -1484,12 +1507,13 @@ void ff_estimate_b_frame_motion(MpegEncContext * s, fbmin= bidir_refine(s, mb_x, mb_y) + penalty_factor; //printf("%d %d %d %d\n", dmin, fmin, bmin, fbmin); { - int score= dmin; - type=MB_TYPE_DIRECT; + int score= fmin; + type = MB_TYPE_FORWARD; - if(fmin<score){ - score=fmin; - type= MB_TYPE_FORWARD; + // RAL: No MB_TYPE_DIRECT in MPEG-1 video (only MPEG-4) + if (s->codec_id != CODEC_ID_MPEG1VIDEO && dmin <= score){ + score = dmin; + type = MB_TYPE_DIRECT; } if(bmin<score){ score=bmin; @@ -1519,7 +1543,7 @@ int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type) if(s->me_method>=ME_EPZS){ int score[8]; int i, y; - UINT8 * fcode_tab= s->fcode_tab; + uint8_t * fcode_tab= s->fcode_tab; int best_fcode=-1; int best_score=-10000000; @@ -1567,10 +1591,14 @@ int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type) void ff_fix_long_p_mvs(MpegEncContext * s) { const int f_code= s->f_code; - int y; - UINT8 * fcode_tab= s->fcode_tab; -//int clip=0; -//int noclip=0; + int y, range; + + range = (((s->codec_id == CODEC_ID_MPEG1VIDEO) ? 8 : 16) << f_code); + + if(s->msmpeg4_version) range= 16; + + if(s->avctx->me_range && range > s->avctx->me_range) range= s->avctx->me_range; + /* clip / convert to intra 16x16 type MVs */ for(y=0; y<s->mb_height; y++){ int x; @@ -1578,10 +1606,8 @@ void ff_fix_long_p_mvs(MpegEncContext * s) int i= y*s->mb_width; for(x=0; x<s->mb_width; x++){ if(s->mb_type[i]&MB_TYPE_INTER){ - if( fcode_tab[s->p_mv_table[xy][0] + MAX_MV] > f_code - || fcode_tab[s->p_mv_table[xy][0] + MAX_MV] == 0 - || fcode_tab[s->p_mv_table[xy][1] + MAX_MV] > f_code - || fcode_tab[s->p_mv_table[xy][1] + MAX_MV] == 0 ){ + if( s->p_mv_table[xy][0] >=range || s->p_mv_table[xy][0] <-range + || s->p_mv_table[xy][1] >=range || s->p_mv_table[xy][1] <-range){ s->mb_type[i] &= ~MB_TYPE_INTER; s->mb_type[i] |= MB_TYPE_INTRA; s->p_mv_table[xy][0] = 0; @@ -1613,10 +1639,8 @@ void ff_fix_long_p_mvs(MpegEncContext * s) int mx= s->motion_val[ xy + off ][0]; int my= s->motion_val[ xy + off ][1]; - if( fcode_tab[mx + MAX_MV] > f_code - || fcode_tab[mx + MAX_MV] == 0 - || fcode_tab[my + MAX_MV] > f_code - || fcode_tab[my + MAX_MV] == 0 ){ + if( mx >=range || mx <-range + || my >=range || my <-range){ s->mb_type[i] &= ~MB_TYPE_INTER4V; s->mb_type[i] |= MB_TYPE_INTRA; } @@ -1632,7 +1656,11 @@ void ff_fix_long_p_mvs(MpegEncContext * s) void ff_fix_long_b_mvs(MpegEncContext * s, int16_t (*mv_table)[2], int f_code, int type) { int y; - UINT8 * fcode_tab= s->fcode_tab; + + // RAL: 8 in MPEG-1, 16 in MPEG-4 + int range = (((s->codec_id == CODEC_ID_MPEG1VIDEO) ? 8 : 16) << f_code); + + if(s->avctx->me_range && range > s->avctx->me_range) range= s->avctx->me_range; /* clip / convert to intra 16x16 type MVs */ for(y=0; y<s->mb_height; y++){ @@ -1640,15 +1668,18 @@ void ff_fix_long_b_mvs(MpegEncContext * s, int16_t (*mv_table)[2], int f_code, i int xy= (y+1)* (s->mb_width+2)+1; int i= y*s->mb_width; for(x=0; x<s->mb_width; x++){ - if( fcode_tab[mv_table[xy][0] + MAX_MV] > f_code - || fcode_tab[mv_table[xy][0] + MAX_MV] == 0){ - if(mv_table[xy][0]>0) mv_table[xy][0]= (16<<f_code)-1; - else mv_table[xy][0]= -(16<<f_code); - } - if( fcode_tab[mv_table[xy][1] + MAX_MV] > f_code - || fcode_tab[mv_table[xy][1] + MAX_MV] == 0){ - if(mv_table[xy][1]>0) mv_table[xy][1]= (16<<f_code)-1; - else mv_table[xy][1]= -(16<<f_code); + if (s->mb_type[i] & type){ // RAL: "type" test added... + if( mv_table[xy][0] >=range || mv_table[xy][0] <-range + || mv_table[xy][1] >=range || mv_table[xy][1] <-range){ + + if(s->codec_id == CODEC_ID_MPEG1VIDEO && 0){ + }else{ + if (mv_table[xy][0] > range-1) mv_table[xy][0]= range-1; + else if(mv_table[xy][0] < -range ) mv_table[xy][0]= -range; + if (mv_table[xy][1] > range-1) mv_table[xy][1]= range-1; + else if(mv_table[xy][1] < -range ) mv_table[xy][1]= -range; + } + } } xy++; i++; diff --git a/src/libffmpeg/libavcodec/motion_est_template.c b/src/libffmpeg/libavcodec/motion_est_template.c index f1ce615ae..f393fd88a 100644 --- a/src/libffmpeg/libavcodec/motion_est_template.c +++ b/src/libffmpeg/libavcodec/motion_est_template.c @@ -17,8 +17,11 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ - -#include "xineutils.h" + +/** + * @file motion_est_template.c + * Motion estimation template. + */ //lets hope gcc will remove the unused vars ...(gcc 3.2.2 seems to do it ...) //Note, the last line is there to kill these ugly unused var warnings @@ -121,9 +124,7 @@ static int RENAME(hpel_motion_search)(MpegEncContext * s, CHECK_HALF_MV(0, 1, mx , my ) CHECK_HALF_MV(1, 1, mx , my ) - XINE_ASSERT((bx >= xmin*2 || bx <= xmax*2 || by >= ymin*2 || by <= ymax*2), - "bx (%d) is not wihtin range %d to %d.\nby (%d) is not within range %d to %d", - bx, xmin*2, xmax*2, by, ymin*2, ymax*2); + assert(bx >= xmin*2 || bx <= xmax*2 || by >= ymin*2 || by <= ymax*2); *mx_ptr = bx; *my_ptr = by; @@ -187,14 +188,13 @@ static int RENAME(hpel_motion_search)(MpegEncContext * s, int map_generation= s->me.map_generation; uint32_t *map= s->me.map; key= ((my-1)<<ME_MAP_MV_BITS) + (mx) + map_generation; - - XINE_ASSERT(map[(index-(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)] == key,"map[%d] != %d",(index-(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1), key ); + assert(map[(index-(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)] == key); key= ((my+1)<<ME_MAP_MV_BITS) + (mx) + map_generation; - XINE_ASSERT(map[(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)] == key,"map[%d] != %d",(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1), key); + assert(map[(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)] == key); key= ((my)<<ME_MAP_MV_BITS) + (mx+1) + map_generation; - XINE_ASSERT(map[(index+1)&(ME_MAP_SIZE-1)] == key, "map[%d] != %d",(index+1)&(ME_MAP_SIZE-1), key); + assert(map[(index+1)&(ME_MAP_SIZE-1)] == key); key= ((my)<<ME_MAP_MV_BITS) + (mx-1) + map_generation; - XINE_ASSERT(map[(index-1)&(ME_MAP_SIZE-1)] == key, "map[%d] != %d",(index-1)&(ME_MAP_SIZE-1), key); + assert(map[(index-1)&(ME_MAP_SIZE-1)] == key); #endif if(t<=b){ CHECK_HALF_MV(0, 1, mx ,my-1) @@ -235,9 +235,7 @@ static int RENAME(hpel_motion_search)(MpegEncContext * s, } CHECK_HALF_MV(0, 1, mx , my) } - XINE_ASSERT((bx >= xmin*2 && bx <= xmax*2 && by >= ymin*2 && by <= ymax*2), - "bx (%d) is not wihtin range %d to %d.\nby (%d) is not within range %d to %d", - bx, xmin*2, xmax*2, by, ymin*2, ymax*2); + assert(bx >= xmin*2 && bx <= xmax*2 && by >= ymin*2 && by <= ymax*2); } *mx_ptr = bx; @@ -267,9 +265,8 @@ static int RENAME(hpel_get_mb_score)(MpegEncContext * s, int mx, int my, int pre cmp_sub= s->dsp.mb_cmp[size]; chroma_cmp_sub= s->dsp.mb_cmp[size+1]; - XINE_ASSERT(!s->me.skip,"s->me.skip is not NULL"); - XINE_ASSERT((s->avctx->me_sub_cmp != s->avctx->mb_cmp), "s->avctx->me_sub_cmp (%d) != s->avctx->mb_cmp (%d)", - s->avctx->me_sub_cmp, s->avctx->mb_cmp ); + assert(!s->me.skip); + assert(s->avctx->me_sub_cmp != s->avctx->mb_cmp); CMP_HPEL(d, mx&1, my&1, mx>>1, my>>1, size); //FIXME check cbp before adding penalty for (0,0) vector @@ -397,12 +394,11 @@ static int RENAME(qpel_motion_search)(MpegEncContext * s, cxy= 2*tl + (cx + cy)/4 - (cx2 + cy2) - 2*c; - XINE_ASSERT(16*cx2 + 4*cx + 32*c == 32*r, "%d != %d",16*cx2 + 4*cx + 32*c, 32*r); - XINE_ASSERT(16*cx2 - 4*cx + 32*c == 32*l, "%d != %d",16*cx2 - 4*cx + 32*c, 32*l); - XINE_ASSERT(16*cy2 + 4*cy + 32*c == 32*b, "%d != %d",16*cy2 + 4*cy + 32*c, 32*b); - XINE_ASSERT(16*cy2 - 4*cy + 32*c == 32*t, "%d != %d",16*cy2 - 4*cy + 32*c, 32*t); - XINE_ASSERT(16*cxy + 16*cy2 + 16*cx2 - 4*cy - 4*cx + 32*c == 32*tl, "%d != %d", - 16*cxy + 16*cy2 + 16*cx2 - 4*cy - 4*cx + 32*c, 32*tl); + assert(16*cx2 + 4*cx + 32*c == 32*r); + assert(16*cx2 - 4*cx + 32*c == 32*l); + assert(16*cy2 + 4*cy + 32*c == 32*b); + assert(16*cy2 - 4*cy + 32*c == 32*t); + assert(16*cxy + 16*cy2 + 16*cx2 - 4*cy - 4*cx + 32*c == 32*tl); for(ny= -3; ny <= 3; ny++){ for(nx= -3; nx <= 3; nx++){ @@ -504,9 +500,7 @@ static int RENAME(qpel_motion_search)(MpegEncContext * s, CHECK_QUARTER_MV(1, 1, mx-1, my ) CHECK_QUARTER_MV(1, 0, mx-1, my ) #endif - XINE_ASSERT(bx >= xmin*4 && bx <= xmax*4 && by >= ymin*4 && by <= ymax*4, - "bx (%d) is not wihtin range %d to %d.\nby (%d) is not within range %d to %d", - bx, xmin*4, xmax*4, by, ymin*4, ymax*4); + assert(bx >= xmin*4 && bx <= xmax*4 && by >= ymin*4 && by <= ymax*4); *mx_ptr = bx; *my_ptr = by; @@ -537,8 +531,8 @@ static int RENAME(qpel_get_mb_score)(MpegEncContext * s, int mx, int my, int pre cmp_sub= s->dsp.mb_cmp[size]; chroma_cmp_sub= s->dsp.mb_cmp[size+1]; - XINE_ASSERT(!s->me.skip, "value 's->me.skip' is not NULL"); - XINE_ASSERT(s->avctx->me_sub_cmp != s->avctx->mb_cmp, "%d != %d", s->avctx->me_sub_cmp, s->avctx->mb_cmp ); + assert(!s->me.skip); + assert(s->avctx->me_sub_cmp != s->avctx->mb_cmp); CMP_QPEL(d, mx&3, my&3, mx>>2, my>>2, size); //FIXME check cbp before adding penalty for (0,0) vector @@ -756,7 +750,7 @@ static inline int RENAME(sab_diamond_search)(MpegEncContext * s, int *best, int if((key&((-1)<<(2*ME_MAP_MV_BITS))) != map_generation) continue; - XINE_ASSERT(j<MAX_SAB_SIZE, "%d >= %d", j, MAX_SAB_SIZE); //max j = number of predictors + assert(j<MAX_SAB_SIZE); //max j = number of predictors minima[j].height= score_map[i]; minima[j].x= key & ((1<<ME_MAP_MV_BITS)-1); key>>=ME_MAP_MV_BITS; diff --git a/src/libffmpeg/libavcodec/mpeg12.c b/src/libffmpeg/libavcodec/mpeg12.c index 907b141e9..729b2f04f 100644 --- a/src/libffmpeg/libavcodec/mpeg12.c +++ b/src/libffmpeg/libavcodec/mpeg12.c @@ -1,5 +1,5 @@ /* - * MPEG1 encoder / MPEG2 decoder + * MPEG1 codec / MPEG2 decoder * Copyright (c) 2000,2001 Fabrice Bellard. * * This library is free software; you can redistribute it and/or @@ -16,6 +16,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file mpeg12.c + * MPEG1 codec / MPEG2 decoder. + */ + //#define DEBUG #include "avcodec.h" #include "dsputil.h" @@ -50,7 +56,7 @@ static void mpeg1_encode_block(MpegEncContext *s, DCTELEM *block, int component); -static void mpeg1_encode_motion(MpegEncContext *s, int val); +static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code); // RAL: f_code parameter added static void mpeg1_skip_picture(MpegEncContext *s, int pict_num); static inline int mpeg1_decode_block_inter(MpegEncContext *s, DCTELEM *block, @@ -67,8 +73,8 @@ static inline int mpeg2_decode_block_intra(MpegEncContext *s, static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred); #ifdef CONFIG_ENCODERS -static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1]; -static UINT8 fcode_tab[MAX_MV*2+1]; +static uint16_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1]; +static uint8_t fcode_tab[MAX_MV*2+1]; static uint32_t uni_mpeg1_ac_vlc_bits[64*64*2]; static uint8_t uni_mpeg1_ac_vlc_len [64*64*2]; @@ -182,7 +188,7 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) unsigned int vbv_buffer_size; unsigned int fps, v; int n, i; - UINT64 time_code; + uint64_t time_code; float best_aspect_error= 1E10; float aspect_ratio= s->avctx->aspect_ratio; @@ -197,8 +203,10 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) int i, dmin, d; s->frame_rate_index = 0; dmin = 0x7fffffff; - for(i=1;i<9;i++) { - d = abs(s->frame_rate - frame_rate_tab[i]); + for(i=1;i<14;i++) { + if(s->avctx->strict_std_compliance >= 0 && i>=9) break; + + d = abs(MPEG1_FRAME_RATE_BASE*(int64_t)s->avctx->frame_rate/s->avctx->frame_rate_base - frame_rate_tab[i]); if (d < dmin) { dmin = d; s->frame_rate_index = i; @@ -221,7 +229,7 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) put_bits(&s->pb, 4, s->aspect_ratio_info); put_bits(&s->pb, 4, s->frame_rate_index); - v = s->bit_rate / 400; + v = (s->bit_rate + 399) / 400; if (v > 0x3ffff) v = 0x3ffff; put_bits(&s->pb, 18, v); @@ -242,22 +250,22 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) /* time code : we must convert from the real frame rate to a fake mpeg frame rate in case of low frame rate */ fps = frame_rate_tab[s->frame_rate_index]; - time_code = (INT64)s->fake_picture_number * FRAME_RATE_BASE; + time_code = (int64_t)s->fake_picture_number * MPEG1_FRAME_RATE_BASE; s->gop_picture_number = s->fake_picture_number; - put_bits(&s->pb, 5, (UINT32)((time_code / (fps * 3600)) % 24)); - put_bits(&s->pb, 6, (UINT32)((time_code / (fps * 60)) % 60)); + put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); + put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); put_bits(&s->pb, 1, 1); - put_bits(&s->pb, 6, (UINT32)((time_code / fps) % 60)); - put_bits(&s->pb, 6, (UINT32)((time_code % fps) / FRAME_RATE_BASE)); + put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60)); + put_bits(&s->pb, 6, (uint32_t)((time_code % fps) / MPEG1_FRAME_RATE_BASE)); put_bits(&s->pb, 1, 1); /* closed gop */ put_bits(&s->pb, 1, 0); /* broken link */ } - if (s->frame_rate < (24 * FRAME_RATE_BASE) && s->picture_number > 0) { + if (s->avctx->frame_rate < (24 * s->avctx->frame_rate_base) && s->picture_number > 0) { /* insert empty P pictures to slow down to the desired frame rate. Each fake pictures takes about 20 bytes */ fps = frame_rate_tab[s->frame_rate_index]; - n = (((INT64)s->picture_number * fps) / s->frame_rate) - 1; + n = av_rescale((int64_t)s->picture_number * s->avctx->frame_rate_base, fps, s->avctx->frame_rate) / MPEG1_FRAME_RATE_BASE - 1; while (s->fake_picture_number < n) { mpeg1_skip_picture(s, s->fake_picture_number - s->gop_picture_number); @@ -325,6 +333,7 @@ static void common_init(MpegEncContext *s) s->c_dc_scale_table= ff_mpeg1_dc_scale_table; } +#ifdef CONFIG_ENCODERS void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) { mpeg1_encode_sequence_header(s); @@ -332,18 +341,27 @@ void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) /* mpeg1 picture header */ put_header(s, PICTURE_START_CODE); /* temporal reference */ - put_bits(&s->pb, 10, (s->fake_picture_number - + + // RAL: s->picture_number instead of s->fake_picture_number + put_bits(&s->pb, 10, (s->picture_number - s->gop_picture_number) & 0x3ff); s->fake_picture_number++; put_bits(&s->pb, 3, s->pict_type); put_bits(&s->pb, 16, 0xffff); /* non constant bit rate */ - if (s->pict_type == P_TYPE) { + // RAL: Forward f_code also needed for B frames + if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { put_bits(&s->pb, 1, 0); /* half pel coordinates */ put_bits(&s->pb, 3, s->f_code); /* forward_f_code */ } + // RAL: Backward f_code necessary for B frames + if (s->pict_type == B_TYPE) { + put_bits(&s->pb, 1, 0); /* half pel coordinates */ + put_bits(&s->pb, 3, s->b_code); /* backward_f_code */ + } + put_bits(&s->pb, 1, 0); /* extra bit picture */ /* only one slice */ @@ -368,10 +386,11 @@ void mpeg1_encode_mb(MpegEncContext *s, cbp |= 1 << (5 - i); } - /* skip macroblock, except if first or last macroblock of a slice */ - if ((cbp | motion_x | motion_y) == 0 && - (!((mb_x | mb_y) == 0 || - (mb_x == s->mb_width - 1 && mb_y == s->mb_height - 1)))) { + // RAL: Skipped macroblocks for B frames... + if (cbp == 0 && (!((mb_x | mb_y) == 0 || (mb_x == s->mb_width - 1 && mb_y == s->mb_height - 1))) && + ((s->pict_type == P_TYPE && (motion_x | motion_y) == 0) || + (s->pict_type == B_TYPE && s->mv_dir == s->last_mv_dir && (((s->mv_dir & MV_DIR_FORWARD) ? ((s->mv[0][0][0] - s->last_mv[0][0][0])|(s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) | + ((s->mv_dir & MV_DIR_BACKWARD) ? ((s->mv[1][0][0] - s->last_mv[1][0][0])|(s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) { s->mb_incr++; s->qscale -= s->dquant; s->skip_count++; @@ -398,18 +417,19 @@ void mpeg1_encode_mb(MpegEncContext *s, } s->misc_bits+= get_bits_diff(s); s->i_count++; - } else { - if (s->mb_intra) { - if(s->dquant && cbp){ - put_bits(&s->pb, 6, 0x01); - put_bits(&s->pb, 5, s->qscale); - }else{ - put_bits(&s->pb, 5, 0x03); - s->qscale -= s->dquant; - } - s->misc_bits+= get_bits_diff(s); - s->i_count++; - } else { + } else if (s->mb_intra) { + if(s->dquant && cbp){ + put_bits(&s->pb, 6, 0x01); + put_bits(&s->pb, 5, s->qscale); + }else{ + put_bits(&s->pb, 5, 0x03); + s->qscale -= s->dquant; + } + s->misc_bits+= get_bits_diff(s); + s->i_count++; + s->last_mv[0][0][0] = + s->last_mv[0][0][1] = 0; + } else if (s->pict_type == P_TYPE) { if (cbp != 0) { if (motion_x == 0 && motion_y == 0) { if(s->dquant){ @@ -428,21 +448,106 @@ void mpeg1_encode_mb(MpegEncContext *s, put_bits(&s->pb, 1, 1); /* motion + cbp */ } s->misc_bits+= get_bits_diff(s); - mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0]); - mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1]); + mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); // RAL: f_code parameter added + mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); // RAL: f_code parameter added s->mv_bits+= get_bits_diff(s); put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]); } } else { put_bits(&s->pb, 3, 1); /* motion only */ - mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0]); - mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1]); + mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); // RAL: f_code parameter added + mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); // RAL: f_code parameter added s->qscale -= s->dquant; s->mv_bits+= get_bits_diff(s); } s->f_count++; + } else + { // RAL: All the following bloc added for B frames: + if (cbp != 0) + { // With coded bloc pattern + if (s->mv_dir == (MV_DIR_FORWARD | MV_DIR_BACKWARD)) + { // Bi-directional motion + if (s->dquant) + { // With QScale + put_bits(&s->pb, 5, 2); + put_bits(&s->pb, 5, s->qscale); + } + else // Without QScale + put_bits(&s->pb, 2, 3); + s->misc_bits += get_bits_diff(s); + mpeg1_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code); + mpeg1_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code); + mpeg1_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code); + mpeg1_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code); + s->b_count++; + s->f_count++; + s->mv_bits += get_bits_diff(s); + put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]); + } + else if (s->mv_dir == MV_DIR_BACKWARD) + { // Backward motion + if (s->dquant) + { // With QScale + put_bits(&s->pb, 6, 2); + put_bits(&s->pb, 5, s->qscale); + } + else // Without QScale + put_bits(&s->pb, 3, 3); + s->misc_bits += get_bits_diff(s); + mpeg1_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code); + mpeg1_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code); + s->b_count++; + s->mv_bits += get_bits_diff(s); + put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]); + } + else if (s->mv_dir == MV_DIR_FORWARD) + { // Forward motion + if (s->dquant) + { // With QScale + put_bits(&s->pb, 6, 3); + put_bits(&s->pb, 5, s->qscale); + } + else // Without QScale + put_bits(&s->pb, 4, 3); + s->misc_bits += get_bits_diff(s); + mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); + mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); + s->f_count++; + s->mv_bits += get_bits_diff(s); + put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]); + } + } + else + { // No coded bloc pattern + if (s->mv_dir == (MV_DIR_FORWARD | MV_DIR_BACKWARD)) + { // Bi-directional motion + put_bits(&s->pb, 2, 2); /* backward & forward motion */ + mpeg1_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code); + mpeg1_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code); + mpeg1_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code); + mpeg1_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code); + s->b_count++; + s->f_count++; + } + else if (s->mv_dir == MV_DIR_BACKWARD) + { // Backward motion + put_bits(&s->pb, 3, 2); /* backward motion only */ + mpeg1_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code); + mpeg1_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code); + s->b_count++; + } + else if (s->mv_dir == MV_DIR_FORWARD) + { // Forward motion + put_bits(&s->pb, 4, 2); /* forward motion only */ + mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); + mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); + s->f_count++; + } + s->qscale -= s->dquant; + s->mv_bits += get_bits_diff(s); + } + // End of bloc from RAL } - } for(i=0;i<6;i++) { if (cbp & (1 << (5 - i))) { mpeg1_encode_block(s, block[i], i); @@ -454,11 +559,22 @@ void mpeg1_encode_mb(MpegEncContext *s, else s->p_tex_bits+= get_bits_diff(s); } - s->last_mv[0][0][0] = motion_x; - s->last_mv[0][0][1] = motion_y; + + // RAL: By this: + if (s->mv_dir & MV_DIR_FORWARD) + { + s->last_mv[0][0][0]= s->mv[0][0][0]; + s->last_mv[0][0][1]= s->mv[0][0][1]; + } + if (s->mv_dir & MV_DIR_BACKWARD) + { + s->last_mv[1][0][0]= s->mv[1][0][0]; + s->last_mv[1][0][1]= s->mv[1][0][1]; + } } -static void mpeg1_encode_motion(MpegEncContext *s, int val) +// RAL: Parameter added: f_or_b_code +static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code) { int code, bit_size, l, m, bits, range, sign; @@ -469,7 +585,7 @@ static void mpeg1_encode_motion(MpegEncContext *s, int val) mbMotionVectorTable[0][1], mbMotionVectorTable[0][0]); } else { - bit_size = s->f_code - 1; + bit_size = f_or_b_code - 1; range = 1 << bit_size; /* modulo encoding */ l = 16 * range; @@ -492,9 +608,13 @@ static void mpeg1_encode_motion(MpegEncContext *s, int val) bits = val & (range - 1); sign = 1; } + + assert(code > 0 && code <= 16); + put_bits(&s->pb, mbMotionVectorTable[code][1], mbMotionVectorTable[code][0]); + put_bits(&s->pb, 1, sign); if (bit_size > 0) { put_bits(&s->pb, bit_size, bits); @@ -504,7 +624,6 @@ static void mpeg1_encode_motion(MpegEncContext *s, int val) void ff_mpeg1_encode_init(MpegEncContext *s) { -#if 0 static int done=0; common_init(s); @@ -583,11 +702,8 @@ void ff_mpeg1_encode_init(MpegEncContext *s) s->fcode_tab= fcode_tab; s->min_qcoeff=-255; s->max_qcoeff= 255; - s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x - s->inter_quant_bias= 0; s->intra_ac_vlc_length= s->inter_ac_vlc_length= uni_mpeg1_ac_vlc_len; -#endif } static inline void encode_dc(MpegEncContext *s, int diff, int component) @@ -628,7 +744,7 @@ static void mpeg1_encode_block(MpegEncContext *s, it is handled slightly differently */ level = block[0]; if (abs(level) == 1) { - code = ((UINT32)level >> 31); /* the sign bit */ + code = ((uint32_t)level >> 31); /* the sign bit */ put_bits(&s->pb, 2, code | 0x02); i = 1; } else { @@ -683,6 +799,7 @@ static void mpeg1_encode_block(MpegEncContext *s, /* end of block */ put_bits(&s->pb, 2, 0x2); } +#endif //CONFIG_ENCODERS /******************************************/ /* decoding */ @@ -769,7 +886,7 @@ static int mpeg_decode_mb(MpegEncContext *s, dprintf("decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y); - XINE_ASSERT(s->mb_skiped==0, "s->mp_skiped is not 0: %d", s->mb_skiped); + assert(s->mb_skiped==0); if (--s->mb_incr != 0) { /* skip mb */ @@ -912,8 +1029,8 @@ static int mpeg_decode_mb(MpegEncContext *s, } break; case MT_FIELD: + s->mv_type = MV_TYPE_FIELD; if (s->picture_structure == PICT_FRAME) { - s->mv_type = MV_TYPE_FIELD; for(j=0;j<2;j++) { s->field_select[i][j] = get_bits1(&s->gb); val = mpeg_decode_motion(s, s->mpeg_f_code[i][0], @@ -928,7 +1045,6 @@ static int mpeg_decode_mb(MpegEncContext *s, dprintf("fmy=%d\n", val); } } else { - s->mv_type = MV_TYPE_16X16; s->field_select[i][0] = get_bits1(&s->gb); for(k=0;k<2;k++) { val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], @@ -1099,8 +1215,8 @@ static inline int mpeg1_decode_block_intra(MpegEncContext *s, int level, dc, diff, i, j, run; int component; RLTable *rl = &rl_mpeg1; - UINT8 * const scantable= s->intra_scantable.permutated; - const UINT16 *quant_matrix= s->intra_matrix; + uint8_t * const scantable= s->intra_scantable.permutated; + const uint16_t *quant_matrix= s->intra_matrix; const int qscale= s->qscale; /* DC coef */ @@ -1171,8 +1287,8 @@ static inline int mpeg1_decode_block_inter(MpegEncContext *s, { int level, i, j, run; RLTable *rl = &rl_mpeg1; - UINT8 * const scantable= s->intra_scantable.permutated; - const UINT16 *quant_matrix= s->inter_matrix; + uint8_t * const scantable= s->intra_scantable.permutated; + const uint16_t *quant_matrix= s->inter_matrix; const int qscale= s->qscale; { @@ -1249,8 +1365,8 @@ static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, { int level, i, j, run; RLTable *rl = &rl_mpeg1; - UINT8 * const scantable= s->intra_scantable.permutated; - const UINT16 *quant_matrix; + uint8_t * const scantable= s->intra_scantable.permutated; + const uint16_t *quant_matrix; const int qscale= s->qscale; int mismatch; @@ -1329,8 +1445,8 @@ static inline int mpeg2_decode_block_intra(MpegEncContext *s, int level, dc, diff, i, j, run; int component; RLTable *rl; - UINT8 * const scantable= s->intra_scantable.permutated; - const UINT16 *quant_matrix; + uint8_t * const scantable= s->intra_scantable.permutated; + const uint16_t *quant_matrix; const int qscale= s->qscale; int mismatch; @@ -1407,10 +1523,10 @@ static inline int mpeg2_decode_block_intra(MpegEncContext *s, typedef struct Mpeg1Context { MpegEncContext mpeg_enc_ctx; - UINT32 header_state; + uint32_t header_state; int start_code; /* current start code */ - UINT8 buffer[PICTURE_BUFFER_SIZE]; - UINT8 *buf_ptr; + uint8_t buffer[PICTURE_BUFFER_SIZE]; + uint8_t *buf_ptr; int buffer_size; int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ int repeat_field; /* true if we must repeat the field */ @@ -1437,10 +1553,10 @@ static int mpeg_decode_init(AVCodecContext *avctx) /* return the 8 bit start code value and update the search state. Return -1 if no start code found */ -static int find_start_code(UINT8 **pbuf_ptr, UINT8 *buf_end, - UINT32 *header_state) +static int find_start_code(uint8_t **pbuf_ptr, uint8_t *buf_end, + uint32_t *header_state) { - UINT8 *buf_ptr; + uint8_t *buf_ptr; unsigned int state, v; int val; @@ -1463,7 +1579,7 @@ static int find_start_code(UINT8 **pbuf_ptr, UINT8 *buf_end, } static int mpeg1_decode_picture(AVCodecContext *avctx, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { Mpeg1Context *s1 = avctx->priv_data; MpegEncContext *s = &s1->mpeg_enc_ctx; @@ -1522,8 +1638,13 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s) s->low_delay = get_bits1(&s->gb); frame_rate_ext_n = get_bits(&s->gb, 2); frame_rate_ext_d = get_bits(&s->gb, 5); - if (frame_rate_ext_d >= 1) - s->frame_rate = (s->frame_rate * frame_rate_ext_n) / frame_rate_ext_d; + av_reduce( + &s->avctx->frame_rate, + &s->avctx->frame_rate_base, + frame_rate_tab[s->frame_rate_index] * (frame_rate_ext_n+1), + MPEG1_FRAME_RATE_BASE * (frame_rate_ext_d+1), + 1<<30); + dprintf("sequence extension\n"); s->mpeg2 = 1; s->avctx->sub_id = 2; /* indicates mpeg2 found */ @@ -1542,7 +1663,7 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) if (get_bits1(&s->gb)) { for(i=0;i<64;i++) { v = get_bits(&s->gb, 8); - j= s->idct_permutation[ ff_zigzag_direct[i] ]; + j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; s->intra_matrix[j] = v; s->chroma_intra_matrix[j] = v; } @@ -1550,7 +1671,7 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) if (get_bits1(&s->gb)) { for(i=0;i<64;i++) { v = get_bits(&s->gb, 8); - j= s->idct_permutation[ ff_zigzag_direct[i] ]; + j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; s->inter_matrix[j] = v; s->chroma_inter_matrix[j] = v; } @@ -1558,14 +1679,14 @@ static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) if (get_bits1(&s->gb)) { for(i=0;i<64;i++) { v = get_bits(&s->gb, 8); - j= s->idct_permutation[ ff_zigzag_direct[i] ]; + j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; s->chroma_intra_matrix[j] = v; } } if (get_bits1(&s->gb)) { for(i=0;i<64;i++) { v = get_bits(&s->gb, 8); - j= s->idct_permutation[ ff_zigzag_direct[i] ]; + j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; s->chroma_inter_matrix[j] = v; } } @@ -1590,6 +1711,13 @@ static void mpeg_decode_picture_coding_extension(MpegEncContext *s) s->chroma_420_type = get_bits1(&s->gb); s->progressive_frame = get_bits1(&s->gb); + if(s->picture_structure == PICT_FRAME) + s->first_field=0; + else{ + s->first_field ^= 1; + memset(s->mbskip_table, 0, s->mb_width*s->mb_height); + } + if(s->alternate_scan){ ff_init_scantable(s, &s->inter_scantable , ff_alternate_vertical_scan); ff_init_scantable(s, &s->intra_scantable , ff_alternate_vertical_scan); @@ -1615,7 +1743,7 @@ static void mpeg_decode_picture_coding_extension(MpegEncContext *s) } static void mpeg_decode_extension(AVCodecContext *avctx, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { Mpeg1Context *s1 = avctx->priv_data; MpegEncContext *s = &s1->mpeg_enc_ctx; @@ -1655,11 +1783,12 @@ static void mpeg_decode_extension(AVCodecContext *avctx, static int mpeg_decode_slice(AVCodecContext *avctx, AVFrame *pict, int start_code, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { Mpeg1Context *s1 = avctx->priv_data; MpegEncContext *s = &s1->mpeg_enc_ctx; int ret; + const int field_pic= s->picture_structure != PICT_FRAME; start_code = (start_code - 1) & 0xff; if (start_code >= s->mb_height){ @@ -1670,12 +1799,27 @@ static int mpeg_decode_slice(AVCodecContext *avctx, s->last_dc[1] = s->last_dc[0]; s->last_dc[2] = s->last_dc[0]; memset(s->last_mv, 0, sizeof(s->last_mv)); + /* start frame decoding */ if (s->first_slice) { - s->first_slice = 0; + if(s->first_field || s->picture_structure==PICT_FRAME){ if(MPV_frame_start(s, avctx) < 0) return DECODE_SLICE_FATAL_ERROR; - + /* first check if we must repeat the frame */ + s->current_picture.repeat_pict = 0; + + if (s->repeat_first_field) { + if (s->progressive_sequence) { + if (s->top_field_first) + s->current_picture.repeat_pict = 4; + else + s->current_picture.repeat_pict = 2; + } else if (s->progressive_frame) { + s->current_picture.repeat_pict = 1; + } + } +// printf("%d \n", s->current_picture.repeat_pict); + if(s->avctx->debug&FF_DEBUG_PICT_INFO){ printf("qp:%d fc:%2d%2d%2d%2d %s %s %s %s dc:%d pstruct:%d fdct:%d cmv:%d qtype:%d ivlc:%d rff:%d %s\n", s->qscale, s->mpeg_f_code[0][0],s->mpeg_f_code[0][1],s->mpeg_f_code[1][0],s->mpeg_f_code[1][1], @@ -1684,7 +1828,17 @@ static int mpeg_decode_slice(AVCodecContext *avctx, s->intra_dc_precision, s->picture_structure, s->frame_pred_frame_dct, s->concealment_motion_vectors, s->q_scale_type, s->intra_vlc_format, s->repeat_first_field, s->chroma_420_type ? "420" :""); } + }else{ //second field + int i; + for(i=0; i<4; i++){ + s->current_picture.data[i] = s->current_picture_ptr->data[i]; + if(s->picture_structure == PICT_BOTTOM_FIELD){ + s->current_picture.data[i] += s->current_picture_ptr->linesize[i]; + } + } + } } + s->first_slice = 0; init_get_bits(&s->gb, buf, buf_size*8); @@ -1719,11 +1873,17 @@ static int mpeg_decode_slice(AVCodecContext *avctx, dprintf("ret=%d\n", ret); if (ret < 0) return -1; - + MPV_decode_mb(s, s->block); if (++s->mb_x >= s->mb_width) { - ff_draw_horiz_band(s); + if(s->picture_structure==PICT_FRAME){ + ff_draw_horiz_band(s, 16*s->mb_y, 16); + }else{ + if(!s->first_field){ + ff_draw_horiz_band(s, 32*s->mb_y, 32); + } + } s->mb_x = 0; s->mb_y++; @@ -1750,7 +1910,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx, } } } - if(s->mb_y >= s->mb_height){ + if(s->mb_y<<field_pic >= s->mb_height){ fprintf(stderr, "slice too long\n"); return DECODE_SLICE_ERROR; } @@ -1758,10 +1918,9 @@ static int mpeg_decode_slice(AVCodecContext *avctx, eos: //end of slice emms_c(); - +//intf("%d %d %d %d\n", s->mb_y, s->mb_height, s->pict_type, s->picture_number); /* end of slice reached */ - if (/*s->mb_x == 0 &&*/ - s->mb_y == s->mb_height) { + if (s->mb_y<<field_pic == s->mb_height && !s->first_field) { /* end of image */ if(s->mpeg2) @@ -1775,7 +1934,7 @@ eos: //end of slice s->picture_number++; /* latency of 1 frame for I and P frames */ /* XXX: use another variable than picture_number */ - if (s->last_picture.data[0] == NULL) { + if (s->last_picture_ptr == NULL) { return DECODE_SLICE_OK; } else { *pict= *(AVFrame*)&s->last_picture; @@ -1788,7 +1947,7 @@ eos: //end of slice } static int mpeg1_decode_sequence(AVCodecContext *avctx, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { Mpeg1Context *s1 = avctx->priv_data; MpegEncContext *s = &s1->mpeg_enc_ctx; @@ -1827,13 +1986,13 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, s->avctx = avctx; avctx->width = width; avctx->height = height; - if (s->frame_rate_index >= 9) { - /* at least give a valid frame rate (some old mpeg1 have this) */ - avctx->frame_rate = 25 * FRAME_RATE_BASE; - } else { - avctx->frame_rate = frame_rate_tab[s->frame_rate_index]; - } - s->frame_rate = avctx->frame_rate; + av_reduce( + &avctx->frame_rate, + &avctx->frame_rate_base, + frame_rate_tab[s->frame_rate_index], + MPEG1_FRAME_RATE_BASE, //FIXME store in allready reduced form + 1<<30 + ); avctx->bit_rate = s->bit_rate; if (MPV_common_init(s) < 0) @@ -1860,7 +2019,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, #endif } else { for(i=0;i<64;i++) { - int j= s->idct_permutation[i]; + int j= s->dsp.idct_permutation[i]; v = ff_mpeg1_default_intra_matrix[i]; s->intra_matrix[j] = v; s->chroma_intra_matrix[j] = v; @@ -1881,7 +2040,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, #endif } else { for(i=0;i<64;i++) { - int j= s->idct_permutation[i]; + int j= s->dsp.idct_permutation[i]; v = ff_mpeg1_default_non_intra_matrix[i]; s->inter_matrix[j] = v; s->chroma_inter_matrix[j] = v; @@ -1898,13 +2057,42 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, return 0; } +static void mpeg_decode_user_data(AVCodecContext *avctx, + const uint8_t *buf, int buf_size) +{ + const uint8_t *p; + int len, flags; + p = buf; + len = buf_size; + + /* we parse the DTG active format information */ + if (len >= 5 && + p[0] == 'D' && p[1] == 'T' && p[2] == 'G' && p[3] == '1') { + flags = p[4]; + p += 5; + len -= 5; + if (flags & 0x80) { + /* skip event id */ + if (len < 2) + return; + p += 2; + len -= 2; + } + if (flags & 0x40) { + if (len < 1) + return; + avctx->dtg_active_format = p[0] & 0x0f; + } + } +} + /* handle buffering and image synchronisation */ static int mpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { Mpeg1Context *s = avctx->priv_data; - UINT8 *buf_end, *buf_ptr, *buf_start; + uint8_t *buf_end, *buf_ptr, *buf_start; int len, start_code_found, ret, code, start_code, input_size; AVFrame *picture = data; MpegEncContext *s2 = &s->mpeg_enc_ctx; @@ -1988,12 +2176,16 @@ static int mpeg_decode_frame(AVCodecContext *avctx, mpeg_decode_extension(avctx, s->buffer, input_size); break; + case USER_START_CODE: + mpeg_decode_user_data(avctx, + s->buffer, input_size); + break; default: if (start_code >= SLICE_MIN_START_CODE && start_code <= SLICE_MAX_START_CODE) { /* skip b frames if we dont have reference frames */ - if(s2->last_picture.data[0]==NULL && s2->pict_type==B_TYPE) break; + if(s2->last_picture_ptr==NULL && s2->pict_type==B_TYPE) break; /* skip b frames if we are in a hurry */ if(avctx->hurry_up && s2->pict_type==B_TYPE) break; /* skip everything if we are in a hurry>=5 */ @@ -2001,30 +2193,8 @@ static int mpeg_decode_frame(AVCodecContext *avctx, ret = mpeg_decode_slice(avctx, picture, start_code, s->buffer, input_size); + if (ret == DECODE_SLICE_EOP) { - /* got a picture: exit */ - /* first check if we must repeat the frame */ - avctx->repeat_pict = 0; -#if 0 - if (s2->progressive_frame && s2->repeat_first_field) { - //fprintf(stderr,"\nRepeat this frame: %d! pict: %d",avctx->frame_number,s2->picture_number); - //s2->repeat_first_field = 0; - //s2->progressive_frame = 0; - if (++s->repeat_field > 2) - s->repeat_field = 0; - avctx->repeat_pict = 1; - } -#endif - if (s2->repeat_first_field) { - if (s2->progressive_sequence) { - if (s2->top_field_first) - avctx->repeat_pict = 4; - else - avctx->repeat_pict = 2; - } else if (s2->progressive_frame) { - avctx->repeat_pict = 1; - } - } *data_size = sizeof(AVPicture); goto the_end; }else if(ret<0){ diff --git a/src/libffmpeg/libavcodec/mpeg12data.h b/src/libffmpeg/libavcodec/mpeg12data.h index 8bf063ec1..16d607067 100644 --- a/src/libffmpeg/libavcodec/mpeg12data.h +++ b/src/libffmpeg/libavcodec/mpeg12data.h @@ -1,8 +1,9 @@ -/* - * MPEG1/2 tables +/** + * @file mpeg12data.h + * MPEG1/2 tables. */ -const INT16 ff_mpeg1_default_intra_matrix[64] = { +const int16_t ff_mpeg1_default_intra_matrix[64] = { 8, 16, 19, 22, 26, 27, 29, 34, 16, 16, 22, 24, 27, 29, 34, 37, 19, 22, 26, 27, 29, 34, 34, 38, @@ -13,7 +14,7 @@ const INT16 ff_mpeg1_default_intra_matrix[64] = { 27, 29, 35, 38, 46, 56, 69, 83 }; -const INT16 ff_mpeg1_default_non_intra_matrix[64] = { +const int16_t ff_mpeg1_default_non_intra_matrix[64] = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, @@ -47,14 +48,14 @@ const unsigned char vlc_dc_table[256] = { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, }; -const UINT16 vlc_dc_lum_code[12] = { +const uint16_t vlc_dc_lum_code[12] = { 0x4, 0x0, 0x1, 0x5, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe, 0x1ff, }; const unsigned char vlc_dc_lum_bits[12] = { 3, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 9, }; -const UINT16 vlc_dc_chroma_code[12] = { +const uint16_t vlc_dc_chroma_code[12] = { 0x0, 0x1, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe, 0x3fe, 0x3ff, }; const unsigned char vlc_dc_chroma_bits[12] = { @@ -62,10 +63,10 @@ const unsigned char vlc_dc_chroma_bits[12] = { }; /* simple include everything table for dc, first byte is bits number next 3 are code*/ -static UINT32 mpeg1_lum_dc_uni[512]; -static UINT32 mpeg1_chr_dc_uni[512]; +static uint32_t mpeg1_lum_dc_uni[512]; +static uint32_t mpeg1_chr_dc_uni[512]; -static const UINT16 mpeg1_vlc[113][2] = { +static const uint16_t mpeg1_vlc[113][2] = { { 0x3, 2 }, { 0x4, 4 }, { 0x5, 5 }, { 0x6, 7 }, { 0x26, 8 }, { 0x21, 8 }, { 0xa, 10 }, { 0x1d, 12 }, { 0x18, 12 }, { 0x13, 12 }, { 0x10, 12 }, { 0x1a, 13 }, @@ -98,7 +99,7 @@ static const UINT16 mpeg1_vlc[113][2] = { { 0x2, 2 }, /* EOB */ }; -static const UINT16 mpeg2_vlc[113][2] = { +static const uint16_t mpeg2_vlc[113][2] = { {0x02, 2}, {0x06, 3}, {0x07, 4}, {0x1c, 5}, {0x1d, 5}, {0x05, 6}, {0x04, 6}, {0x7b, 7}, {0x7c, 7}, {0x23, 8}, {0x22, 8}, {0xfa, 8}, @@ -131,7 +132,7 @@ static const UINT16 mpeg2_vlc[113][2] = { {0x06,4}, /* EOB */ }; -static const INT8 mpeg1_level[111] = { +static const int8_t mpeg1_level[111] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, @@ -148,7 +149,7 @@ static const INT8 mpeg1_level[111] = { 1, 1, 1, 1, 1, 1, 1, }; -static const INT8 mpeg1_run[111] = { +static const int8_t mpeg1_run[111] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -165,8 +166,8 @@ static const INT8 mpeg1_run[111] = { 25, 26, 27, 28, 29, 30, 31, }; -static UINT8 mpeg1_index_run[2][64]; -static INT8 mpeg1_max_level[2][64]; +static uint8_t mpeg1_index_run[2][64]; +static int8_t mpeg1_max_level[2][64]; static RLTable rl_mpeg1 = { 111, @@ -184,7 +185,7 @@ static RLTable rl_mpeg2 = { mpeg1_level, }; -static const UINT8 mbAddrIncrTable[35][2] = { +static const uint8_t mbAddrIncrTable[35][2] = { {0x1, 1}, {0x3, 3}, {0x2, 3}, @@ -222,7 +223,7 @@ static const UINT8 mbAddrIncrTable[35][2] = { {0xf, 11}, /* stuffing */ }; -static const UINT8 mbPatTable[63][2] = { +static const uint8_t mbPatTable[63][2] = { {0xb, 5}, {0x9, 5}, {0xd, 6}, @@ -294,7 +295,7 @@ static const UINT8 mbPatTable[63][2] = { #define MB_FOR 0x08 #define MB_QUANT 0x10 -static const UINT8 table_mb_ptype[32][2] = { +static const uint8_t table_mb_ptype[32][2] = { { 0, 0 }, // 0x00 { 3, 5 }, // 0x01 MB_INTRA { 1, 2 }, // 0x02 MB_PAT @@ -329,7 +330,7 @@ static const UINT8 table_mb_ptype[32][2] = { { 0, 0 }, // 0x1F }; -static const UINT8 table_mb_btype[32][2] = { +static const uint8_t table_mb_btype[32][2] = { { 0, 0 }, // 0x00 { 3, 5 }, // 0x01 MB_INTRA { 0, 0 }, // 0x02 @@ -364,7 +365,7 @@ static const UINT8 table_mb_btype[32][2] = { { 0, 0 }, // 0x1F }; -static const UINT8 mbMotionVectorTable[17][2] = { +static const uint8_t mbMotionVectorTable[17][2] = { { 0x1, 1 }, { 0x1, 2 }, { 0x1, 3 }, @@ -384,26 +385,38 @@ static const UINT8 mbMotionVectorTable[17][2] = { { 0xc, 10 }, }; -static const int frame_rate_tab[9] = { - 0, - (int)(23.976 * FRAME_RATE_BASE), - (int)(24 * FRAME_RATE_BASE), - (int)(25 * FRAME_RATE_BASE), - (int)(29.97 * FRAME_RATE_BASE), - (int)(30 * FRAME_RATE_BASE), - (int)(50 * FRAME_RATE_BASE), - (int)(59.94 * FRAME_RATE_BASE), - (int)(60 * FRAME_RATE_BASE), +#define MPEG1_FRAME_RATE_BASE 1001 + +static const int frame_rate_tab[16] = { + 0, + 24000, + 24024, + 25025, + 30000, + 30030, + 50050, + 60000, + 60060, + // Xing's 15fps: (9) + 15015, + // libmpeg3's "Unofficial economy rates": (10-13) + 5005, + 10010, + 12012, + 15015, + // random, just to avoid segfault !never encode these + 25025, + 25025, }; -static const UINT8 non_linear_qscale[32] = { +static const uint8_t non_linear_qscale[32] = { 0, 1, 2, 3, 4, 5, 6, 7, 8,10,12,14,16,18,20,22, 24,28,32,36,40,44,48,52, 56,64,72,80,88,96,104,112, }; -UINT8 ff_mpeg1_dc_scale_table[128]={ // MN: mpeg2 really can have such large qscales? +uint8_t ff_mpeg1_dc_scale_table[128]={ // MN: mpeg2 really can have such large qscales? // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, diff --git a/src/libffmpeg/libavcodec/mpeg4data.h b/src/libffmpeg/libavcodec/mpeg4data.h index 54a280d07..fbaca8d5e 100644 --- a/src/libffmpeg/libavcodec/mpeg4data.h +++ b/src/libffmpeg/libavcodec/mpeg4data.h @@ -1,3 +1,8 @@ +/** + * @file mpeg4data.h + * mpeg4 tables. + */ + // shapes #define RECT_SHAPE 0 #define BIN_SHAPE 1 @@ -34,19 +39,19 @@ #define VOP_STARTCODE 0x1B6 /* dc encoding for mpeg4 */ -const UINT8 DCtab_lum[13][2] = +const uint8_t DCtab_lum[13][2] = { {3,3}, {3,2}, {2,2}, {2,3}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7}, {1,8}, {1,9}, {1,10}, {1,11}, }; -const UINT8 DCtab_chrom[13][2] = +const uint8_t DCtab_chrom[13][2] = { {3,2}, {2,2}, {1,2}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7}, {1,8}, {1,9}, {1,10}, {1,11}, {1,12}, }; -const UINT16 intra_vlc[103][2] = { +const uint16_t intra_vlc[103][2] = { { 0x2, 2 }, { 0x6, 3 },{ 0xf, 4 },{ 0xd, 5 },{ 0xc, 5 }, { 0x15, 6 },{ 0x13, 6 },{ 0x12, 6 },{ 0x17, 7 }, @@ -76,7 +81,7 @@ const UINT16 intra_vlc[103][2] = { { 0x5f, 12 },{ 0x3, 7 }, }; -const INT8 intra_level[102] = { +const int8_t intra_level[102] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, @@ -92,7 +97,7 @@ const INT8 intra_level[102] = { 1, 1, 1, 1, 1, 1, }; -const INT8 intra_run[102] = { +const int8_t intra_run[102] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -116,17 +121,225 @@ static RLTable rl_intra = { intra_level, }; -static const UINT16 sprite_trajectory_tab[15][2] = { +static const uint16_t inter_rvlc[170][2]={ //note this is identical to the intra rvlc except that its reordered +{0x0006, 3},{0x0001, 4},{0x0004, 5},{0x001C, 7}, +{0x003C, 8},{0x003D, 8},{0x007C, 9},{0x00FC, 10}, +{0x00FD, 10},{0x01FC, 11},{0x01FD, 11},{0x03FC, 12}, +{0x07FC, 13},{0x07FD, 13},{0x0BFC, 13},{0x0BFD, 13}, +{0x0FFC, 14},{0x0FFD, 14},{0x1FFC, 15},{0x0007, 3}, +{0x000C, 6},{0x005C, 8},{0x007D, 9},{0x017C, 10}, +{0x02FC, 11},{0x03FD, 12},{0x0DFC, 13},{0x17FC, 14}, +{0x17FD, 14},{0x000A, 4},{0x001D, 7},{0x00BC, 9}, +{0x02FD, 11},{0x05FC, 12},{0x1BFC, 14},{0x1BFD, 14}, +{0x0005, 5},{0x005D, 8},{0x017D, 10},{0x05FD, 12}, +{0x0DFD, 13},{0x1DFC, 14},{0x1FFD, 15},{0x0008, 5}, +{0x006C, 8},{0x037C, 11},{0x0EFC, 13},{0x2FFC, 15}, +{0x0009, 5},{0x00BD, 9},{0x037D, 11},{0x0EFD, 13}, +{0x000D, 6},{0x01BC, 10},{0x06FC, 12},{0x1DFD, 14}, +{0x0014, 6},{0x01BD, 10},{0x06FD, 12},{0x2FFD, 15}, +{0x0015, 6},{0x01DC, 10},{0x0F7C, 13},{0x002C, 7}, +{0x01DD, 10},{0x1EFC, 14},{0x002D, 7},{0x03BC, 11}, +{0x0034, 7},{0x077C, 12},{0x006D, 8},{0x0F7D, 13}, +{0x0074, 8},{0x1EFD, 14},{0x0075, 8},{0x1F7C, 14}, +{0x00DC, 9},{0x1F7D, 14},{0x00DD, 9},{0x1FBC, 14}, +{0x00EC, 9},{0x37FC, 15},{0x01EC, 10},{0x01ED, 10}, +{0x01F4, 10},{0x03BD, 11},{0x03DC, 11},{0x03DD, 11}, +{0x03EC, 11},{0x03ED, 11},{0x03F4, 11},{0x077D, 12}, +{0x07BC, 12},{0x07BD, 12},{0x0FBC, 13},{0x0FBD, 13}, +{0x0FDC, 13},{0x0FDD, 13},{0x1FBD, 14},{0x1FDC, 14}, +{0x1FDD, 14},{0x37FD, 15},{0x3BFC, 15}, +{0x000B, 4},{0x0078, 8},{0x03F5, 11},{0x0FEC, 13}, +{0x1FEC, 14},{0x0012, 5},{0x00ED, 9},{0x07DC, 12}, +{0x1FED, 14},{0x3BFD, 15},{0x0013, 5},{0x03F8, 11}, +{0x3DFC, 15},{0x0018, 6},{0x07DD, 12},{0x0019, 6}, +{0x07EC, 12},{0x0022, 6},{0x0FED, 13},{0x0023, 6}, +{0x0FF4, 13},{0x0035, 7},{0x0FF5, 13},{0x0038, 7}, +{0x0FF8, 13},{0x0039, 7},{0x0FF9, 13},{0x0042, 7}, +{0x1FF4, 14},{0x0043, 7},{0x1FF5, 14},{0x0079, 8}, +{0x1FF8, 14},{0x0082, 8},{0x3DFD, 15},{0x0083, 8}, +{0x00F4, 9},{0x00F5, 9},{0x00F8, 9},{0x00F9, 9}, +{0x0102, 9},{0x0103, 9},{0x01F5, 10},{0x01F8, 10}, +{0x01F9, 10},{0x0202, 10},{0x0203, 10},{0x03F9, 11}, +{0x0402, 11},{0x0403, 11},{0x07ED, 12},{0x07F4, 12}, +{0x07F5, 12},{0x07F8, 12},{0x07F9, 12},{0x0802, 12}, +{0x0803, 12},{0x1002, 13},{0x1003, 13},{0x1FF9, 14}, +{0x2002, 14},{0x2003, 14},{0x3EFC, 15},{0x3EFD, 15}, +{0x3F7C, 15},{0x3F7D, 15},{0x0000, 4} +}; + +static const uint8_t inter_rvlc_run[169]={ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 6, 6, 6, 6, + 7, 7, 7, 7, 8, 8, 8, 9, + 9, 9, 10, 10, 11, 11, 12, 12, +13, 13, 14, 14, 15, 15, 16, 16, +17, 17, 18, 19, 20, 21, 22, 23, +24, 25, 26, 27, 28, 29, 30, 31, +32, 33, 34, 35, 36, 37, 38, + 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 4, + 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, +12, 13, 13, 14, 15, 16, 17, 18, +19, 20, 21, 22, 23, 24, 25, 26, +27, 28, 29, 30, 31, 32, 33, 34, +35, 36, 37, 38, 39, 40, 41, 42, +43, 44, +}; + +static const uint8_t inter_rvlc_level[169]={ + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, +17, 18, 19, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 1, 2, 3, + 4, 5, 6, 7, 1, 2, 3, 4, + 5, 6, 7, 1, 2, 3, 4, 5, + 1, 2, 3, 4, 1, 2, 3, 4, + 1, 2, 3, 4, 1, 2, 3, 1, + 2, 3, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + 1, 2, 3, 4, 5, 1, 2, 3, + 4, 5, 1, 2, 3, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, +}; + +static RLTable rvlc_rl_inter = { + 169, + 103, + inter_rvlc, + inter_rvlc_run, + inter_rvlc_level, +}; + +static const uint16_t intra_rvlc[170][2]={ +{0x0006, 3},{0x0007, 3},{0x000A, 4},{0x0009, 5}, +{0x0014, 6},{0x0015, 6},{0x0034, 7},{0x0074, 8}, +{0x0075, 8},{0x00DD, 9},{0x00EC, 9},{0x01EC, 10}, +{0x01ED, 10},{0x01F4, 10},{0x03EC, 11},{0x03ED, 11}, +{0x03F4, 11},{0x077D, 12},{0x07BC, 12},{0x0FBD, 13}, +{0x0FDC, 13},{0x07BD, 12},{0x0FDD, 13},{0x1FBD, 14}, +{0x1FDC, 14},{0x1FDD, 14},{0x1FFC, 15},{0x0001, 4}, +{0x0008, 5},{0x002D, 7},{0x006C, 8},{0x006D, 8}, +{0x00DC, 9},{0x01DD, 10},{0x03DC, 11},{0x03DD, 11}, +{0x077C, 12},{0x0FBC, 13},{0x1F7D, 14},{0x1FBC, 14}, +{0x0004, 5},{0x002C, 7},{0x00BC, 9},{0x01DC, 10}, +{0x03BC, 11},{0x03BD, 11},{0x0EFD, 13},{0x0F7C, 13}, +{0x0F7D, 13},{0x1EFD, 14},{0x1F7C, 14},{0x0005, 5}, +{0x005C, 8},{0x00BD, 9},{0x037D, 11},{0x06FC, 12}, +{0x0EFC, 13},{0x1DFD, 14},{0x1EFC, 14},{0x1FFD, 15}, +{0x000C, 6},{0x005D, 8},{0x01BD, 10},{0x03FD, 12}, +{0x06FD, 12},{0x1BFD, 14},{0x000D, 6},{0x007D, 9}, +{0x02FC, 11},{0x05FC, 12},{0x1BFC, 14},{0x1DFC, 14}, +{0x001C, 7},{0x017C, 10},{0x02FD, 11},{0x05FD, 12}, +{0x2FFC, 15},{0x001D, 7},{0x017D, 10},{0x037C, 11}, +{0x0DFD, 13},{0x2FFD, 15},{0x003C, 8},{0x01BC, 10}, +{0x0BFD, 13},{0x17FD, 14},{0x003D, 8},{0x01FD, 11}, +{0x0DFC, 13},{0x37FC, 15},{0x007C, 9},{0x03FC, 12}, +{0x00FC, 10},{0x0BFC, 13},{0x00FD, 10},{0x37FD, 15}, +{0x01FC, 11},{0x07FC, 13},{0x07FD, 13},{0x0FFC, 14}, +{0x0FFD, 14},{0x17FC, 14},{0x3BFC, 15}, +{0x000B, 4},{0x0078, 8},{0x03F5, 11},{0x0FEC, 13}, +{0x1FEC, 14},{0x0012, 5},{0x00ED, 9},{0x07DC, 12}, +{0x1FED, 14},{0x3BFD, 15},{0x0013, 5},{0x03F8, 11}, +{0x3DFC, 15},{0x0018, 6},{0x07DD, 12},{0x0019, 6}, +{0x07EC, 12},{0x0022, 6},{0x0FED, 13},{0x0023, 6}, +{0x0FF4, 13},{0x0035, 7},{0x0FF5, 13},{0x0038, 7}, +{0x0FF8, 13},{0x0039, 7},{0x0FF9, 13},{0x0042, 7}, +{0x1FF4, 14},{0x0043, 7},{0x1FF5, 14},{0x0079, 8}, +{0x1FF8, 14},{0x0082, 8},{0x3DFD, 15},{0x0083, 8}, +{0x00F4, 9},{0x00F5, 9},{0x00F8, 9},{0x00F9, 9}, +{0x0102, 9},{0x0103, 9},{0x01F5, 10},{0x01F8, 10}, +{0x01F9, 10},{0x0202, 10},{0x0203, 10},{0x03F9, 11}, +{0x0402, 11},{0x0403, 11},{0x07ED, 12},{0x07F4, 12}, +{0x07F5, 12},{0x07F8, 12},{0x07F9, 12},{0x0802, 12}, +{0x0803, 12},{0x1002, 13},{0x1003, 13},{0x1FF9, 14}, +{0x2002, 14},{0x2003, 14},{0x3EFC, 15},{0x3EFD, 15}, +{0x3F7C, 15},{0x3F7D, 15},{0x0000, 4} +}; + +static const uint8_t intra_rvlc_run[169]={ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 4, 4, 4, 4, + 4, 4, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 7, 7, 7, + 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 10, 10, 11, 11, 12, 12, +13, 14, 15, 16, 17, 18, 19, + 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 2, 2, 2, 3, 3, 4, + 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, +12, 13, 13, 14, 15, 16, 17, 18, +19, 20, 21, 22, 23, 24, 25, 26, +27, 28, 29, 30, 31, 32, 33, 34, +35, 36, 37, 38, 39, 40, 41, 42, +43, 44, +}; + +static const uint8_t intra_rvlc_level[169]={ + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, +17, 18, 19, 20, 21, 22, 23, 24, +25, 26, 27, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 1, 2, 3, 4, + 5, 6, 1, 2, 3, 4, 5, 6, + 1, 2, 3, 4, 5, 1, 2, 3, + 4, 5, 1, 2, 3, 4, 1, 2, + 3, 4, 1, 2, 1, 2, 1, 2, + 1, 1, 1, 1, 1, 1, 1, + 1, 2, 3, 4, 5, 1, 2, 3, + 4, 5, 1, 2, 3, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, +}; + +static RLTable rvlc_rl_intra = { + 169, + 103, + intra_rvlc, + intra_rvlc_run, + intra_rvlc_level, +}; + +static const uint16_t sprite_trajectory_tab[15][2] = { {0x00, 2}, {0x02, 3}, {0x03, 3}, {0x04, 3}, {0x05, 3}, {0x06, 3}, {0x0E, 4}, {0x1E, 5}, {0x3E, 6}, {0x7E, 7}, {0xFE, 8}, {0x1FE, 9},{0x3FE, 10},{0x7FE, 11},{0xFFE, 12}, }; -static const UINT8 mb_type_b_tab[4][2] = { +static const uint8_t mb_type_b_tab[4][2] = { {1, 1}, {1, 2}, {1, 3}, {1, 4}, }; -static const UINT16 pixel_aspect[16][2]={ +static const uint16_t pixel_aspect[16][2]={ {0, 0}, {1, 1}, {12, 11}, @@ -146,7 +359,7 @@ static const UINT16 pixel_aspect[16][2]={ }; /* these matrixes will be permuted for the idct */ -const INT16 ff_mpeg4_default_intra_matrix[64] = { +const int16_t ff_mpeg4_default_intra_matrix[64] = { 8, 17, 18, 19, 21, 23, 25, 27, 17, 18, 19, 21, 23, 25, 27, 28, 20, 21, 22, 23, 24, 26, 28, 30, @@ -157,7 +370,7 @@ const INT16 ff_mpeg4_default_intra_matrix[64] = { 27, 28, 30, 32, 35, 38, 41, 45, }; -const INT16 ff_mpeg4_default_non_intra_matrix[64] = { +const int16_t ff_mpeg4_default_non_intra_matrix[64] = { 16, 17, 18, 19, 20, 21, 22, 23, 17, 18, 19, 20, 21, 22, 23, 24, 18, 19, 20, 21, 22, 23, 24, 25, @@ -168,15 +381,15 @@ const INT16 ff_mpeg4_default_non_intra_matrix[64] = { 23, 24, 25, 27, 28, 30, 31, 33, }; -UINT8 ff_mpeg4_y_dc_scale_table[32]={ +uint8_t ff_mpeg4_y_dc_scale_table[32]={ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0, 8, 8, 8, 8,10,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,36,38,40,42,44,46 }; -UINT8 ff_mpeg4_c_dc_scale_table[32]={ +uint8_t ff_mpeg4_c_dc_scale_table[32]={ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0, 8, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,20,21,22,23,24,25 }; -const UINT16 ff_mpeg4_resync_prefix[8]={ +const uint16_t ff_mpeg4_resync_prefix[8]={ 0x7F00, 0x7E00, 0x7C00, 0x7800, 0x7000, 0x6000, 0x4000, 0x0000 }; diff --git a/src/libffmpeg/libavcodec/mpegaudio.h b/src/libffmpeg/libavcodec/mpegaudio.h index 3381dbed2..7aba13200 100644 --- a/src/libffmpeg/libavcodec/mpegaudio.h +++ b/src/libffmpeg/libavcodec/mpegaudio.h @@ -1,4 +1,7 @@ -/* mpeg audio declarations for both encoder and decoder */ +/** + * @file mpegaudio.h + * mpeg audio declarations for both encoder and decoder. + */ /* max frame size, in samples */ #define MPA_FRAME_SIZE 1152 @@ -17,11 +20,11 @@ int l2_select_table(int bitrate, int nb_channels, int freq, int lsf); -extern const UINT16 mpa_bitrate_tab[2][3][15]; -extern const UINT16 mpa_freq_tab[3]; +extern const uint16_t mpa_bitrate_tab[2][3][15]; +extern const uint16_t mpa_freq_tab[3]; extern const unsigned char *alloc_tables[5]; extern const double enwindow[512]; extern const int sblimit_table[5]; extern const int quant_steps[17]; extern const int quant_bits[17]; -extern const INT32 mpa_enwindow[257]; +extern const int32_t mpa_enwindow[257]; diff --git a/src/libffmpeg/libavcodec/mpegaudiodec.c b/src/libffmpeg/libavcodec/mpegaudiodec.c index 9a066c905..1d1074aa7 100644 --- a/src/libffmpeg/libavcodec/mpegaudiodec.c +++ b/src/libffmpeg/libavcodec/mpegaudiodec.c @@ -16,6 +16,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file mpegaudiodec.c + * MPEG Audio decoder. + */ + //#define DEBUG #include "avcodec.h" #include "mpegaudio.h" @@ -42,17 +48,17 @@ #define FRAC_ONE (1 << FRAC_BITS) -#define MULL(a,b) (((INT64)(a) * (INT64)(b)) >> FRAC_BITS) -#define MUL64(a,b) ((INT64)(a) * (INT64)(b)) +#define MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> FRAC_BITS) +#define MUL64(a,b) ((int64_t)(a) * (int64_t)(b)) #define FIX(a) ((int)((a) * FRAC_ONE)) /* WARNING: only correct for posititive numbers */ #define FIXR(a) ((int)((a) * FRAC_ONE + 0.5)) #define FRAC_RND(a) (((a) + (FRAC_ONE/2)) >> FRAC_BITS) #if FRAC_BITS <= 15 -typedef INT16 MPA_INT; +typedef int16_t MPA_INT; #else -typedef INT32 MPA_INT; +typedef int32_t MPA_INT; #endif /****************/ @@ -61,14 +67,14 @@ typedef INT32 MPA_INT; #define BACKSTEP_SIZE 512 typedef struct MPADecodeContext { - UINT8 inbuf1[2][MPA_MAX_CODED_FRAME_SIZE + BACKSTEP_SIZE]; /* input buffer */ + uint8_t inbuf1[2][MPA_MAX_CODED_FRAME_SIZE + BACKSTEP_SIZE]; /* input buffer */ int inbuf_index; - UINT8 *inbuf_ptr, *inbuf; + uint8_t *inbuf_ptr, *inbuf; int frame_size; int free_format_frame_size; /* frame size in case of free format (zero if currently unknown) */ /* next header (used in free format parsing) */ - UINT32 free_format_next_header; + uint32_t free_format_next_header; int error_protection; int layer; int sample_rate; @@ -80,10 +86,10 @@ typedef struct MPADecodeContext { int mode; int mode_ext; int lsf; - MPA_INT synth_buf[MPA_MAX_CHANNELS][512 * 2]; + MPA_INT synth_buf[MPA_MAX_CHANNELS][512 * 2] __attribute__((aligned(16))); int synth_buf_offset[MPA_MAX_CHANNELS]; - INT32 sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT]; - INT32 mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ + int32_t sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT] __attribute__((aligned(16))); + int32_t mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ #ifdef DEBUG int frame_count; #endif @@ -91,22 +97,22 @@ typedef struct MPADecodeContext { /* layer 3 "granule" */ typedef struct GranuleDef { - UINT8 scfsi; + uint8_t scfsi; int part2_3_length; int big_values; int global_gain; int scalefac_compress; - UINT8 block_type; - UINT8 switch_point; + uint8_t block_type; + uint8_t switch_point; int table_select[3]; int subblock_gain[3]; - UINT8 scalefac_scale; - UINT8 count1table_select; + uint8_t scalefac_scale; + uint8_t count1table_select; int region_size[3]; /* number of huffman codes in each region */ int preflag; int short_start, long_end; /* long/short band indexes */ - UINT8 scale_factors[40]; - INT32 sb_hybrid[SBLIMIT * 18]; /* 576 samples */ + uint8_t scale_factors[40]; + int32_t sb_hybrid[SBLIMIT * 18]; /* 576 samples */ } GranuleDef; #define MODE_EXT_MS_STEREO 2 @@ -115,63 +121,63 @@ typedef struct GranuleDef { /* layer 3 huffman tables */ typedef struct HuffTable { int xsize; - const UINT8 *bits; - const UINT16 *codes; + const uint8_t *bits; + const uint16_t *codes; } HuffTable; #include "mpegaudiodectab.h" /* vlc structure for decoding layer 3 huffman tables */ static VLC huff_vlc[16]; -static UINT8 *huff_code_table[16]; +static uint8_t *huff_code_table[16]; static VLC huff_quad_vlc[2]; /* computed from band_size_long */ -static UINT16 band_index_long[9][23]; +static uint16_t band_index_long[9][23]; /* XXX: free when all decoders are closed */ #define TABLE_4_3_SIZE (8191 + 16) -static INT8 *table_4_3_exp; +static int8_t *table_4_3_exp; #if FRAC_BITS <= 15 -static UINT16 *table_4_3_value; +static uint16_t *table_4_3_value; #else -static UINT32 *table_4_3_value; +static uint32_t *table_4_3_value; #endif /* intensity stereo coef table */ -static INT32 is_table[2][16]; -static INT32 is_table_lsf[2][2][16]; -static INT32 csa_table[8][2]; -static INT32 mdct_win[8][36]; +static int32_t is_table[2][16]; +static int32_t is_table_lsf[2][2][16]; +static int32_t csa_table[8][2]; +static int32_t mdct_win[8][36]; /* lower 2 bits: modulo 3, higher bits: shift */ -static UINT16 scale_factor_modshift[64]; +static uint16_t scale_factor_modshift[64]; /* [i][j]: 2^(-j/3) * FRAC_ONE * 2^(i+2) / (2^(i+2) - 1) */ -static INT32 scale_factor_mult[15][3]; +static int32_t scale_factor_mult[15][3]; /* mult table for layer 2 group quantization */ #define SCALE_GEN(v) \ { FIXR(1.0 * (v)), FIXR(0.7937005259 * (v)), FIXR(0.6299605249 * (v)) } -static INT32 scale_factor_mult2[3][3] = { +static int32_t scale_factor_mult2[3][3] = { SCALE_GEN(4.0 / 3.0), /* 3 steps */ SCALE_GEN(4.0 / 5.0), /* 5 steps */ SCALE_GEN(4.0 / 9.0), /* 9 steps */ }; /* 2^(n/4) */ -static UINT32 scale_factor_mult3[4] = { +static uint32_t scale_factor_mult3[4] = { FIXR(1.0), FIXR(1.18920711500272106671), FIXR(1.41421356237309504880), FIXR(1.68179283050742908605), }; -static MPA_INT window[512]; +static MPA_INT window[512] __attribute__((aligned(16))); /* layer 1 unscaling */ /* n = number of bits of the mantissa minus 1 */ static inline int l1_unscale(int n, int mant, int scale_factor) { int shift, mod; - INT64 val; + int64_t val; shift = scale_factor_modshift[scale_factor]; mod = shift & 3; @@ -203,7 +209,7 @@ static inline int l3_unscale(int value, int exponent) #if FRAC_BITS <= 15 unsigned int m; #else - UINT64 m; + uint64_t m; #endif int e; @@ -221,7 +227,7 @@ static inline int l3_unscale(int value, int exponent) return m; #else m = MUL64(m, scale_factor_mult3[exponent & 3]); - m = (m + (UINT64_C(1) << (e-1))) >> e; + m = (m + (uint64_t_C(1) << (e-1))) >> e; return m; #endif } @@ -232,7 +238,7 @@ static inline int l3_unscale(int value, int exponent) #define POW_FRAC_BITS 24 #define POW_FRAC_ONE (1 << POW_FRAC_BITS) #define POW_FIX(a) ((int)((a) * POW_FRAC_ONE)) -#define POW_MULL(a,b) (((INT64)(a) * (INT64)(b)) >> POW_FRAC_BITS) +#define POW_MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> POW_FRAC_BITS) static int dev_4_3_coefs[DEV_ORDER]; @@ -318,7 +324,7 @@ static int decode_init(AVCodecContext * avctx) for(i=0;i<15;i++) { int n, norm; n = i + 2; - norm = ((INT64_C(1) << n) * FRAC_ONE) / ((1 << n) - 1); + norm = ((int64_t_C(1) << n) * FRAC_ONE) / ((1 << n) - 1); scale_factor_mult[i][0] = MULL(FIXR(1.0 * 2.0), norm); scale_factor_mult[i][1] = MULL(FIXR(0.7937005259 * 2.0), norm); scale_factor_mult[i][2] = MULL(FIXR(0.6299605249 * 2.0), norm); @@ -348,8 +354,9 @@ static int decode_init(AVCodecContext * avctx) huff_code_table[0] = NULL; for(i=1;i<16;i++) { const HuffTable *h = &mpa_huff_tables[i]; - int xsize, n, x, y; - UINT8 *code_table; + int xsize, x, y; + unsigned int n; + uint8_t *code_table; xsize = h->xsize; n = xsize * xsize; @@ -576,7 +583,7 @@ static int decode_init(AVCodecContext * avctx) #define ADD(a, b) tab[a] += tab[b] /* DCT32 without 1/sqrt(2) coef zero scaling. */ -static void dct32(INT32 *out, INT32 *tab) +static void dct32(int32_t *out, int32_t *tab) { int tmp0, tmp1; @@ -759,7 +766,7 @@ static void dct32(INT32 *out, INT32 *tab) #define OUT_SAMPLE(sum)\ {\ int sum1;\ - sum1 = (int)((sum + (INT64_C(1) << (OUT_SHIFT - 1))) >> OUT_SHIFT);\ + sum1 = (int)((sum + (int64_t_C(1) << (OUT_SHIFT - 1))) >> OUT_SHIFT);\ if (sum1 < -32768)\ sum1 = -32768;\ else if (sum1 > 32767)\ @@ -786,17 +793,17 @@ static void dct32(INT32 *out, INT32 *tab) 32 samples. */ /* XXX: optimize by avoiding ring buffer usage */ static void synth_filter(MPADecodeContext *s1, - int ch, INT16 *samples, int incr, - INT32 sb_samples[SBLIMIT]) + int ch, int16_t *samples, int incr, + int32_t sb_samples[SBLIMIT]) { - INT32 tmp[32]; + int32_t tmp[32]; register MPA_INT *synth_buf, *p; register MPA_INT *w; int j, offset, v; #if FRAC_BITS <= 15 int sum; #else - INT64 sum; + int64_t sum; #endif dct32(tmp, sb_samples); @@ -862,7 +869,7 @@ static void synth_filter(MPADecodeContext *s1, static void imdct12(int *out, int *in) { int tmp; - INT64 in1_3, in1_9, in4_3, in4_9; + int64_t in1_3, in1_9, in4_3, in4_9; in1_3 = MUL64(in[1], C3); in1_9 = MUL64(in[1], C9); @@ -954,7 +961,7 @@ static void imdct36(int *out, int *in) { int i, j, t0, t1, t2, t3, s0, s1, s2, s3; int tmp[18], *tmp1, *in1; - INT64 in3_3, in6_6; + int64_t in3_3, in6_6; for(i=17;i>=1;i--) in[i] += in[i-1]; @@ -1029,7 +1036,7 @@ static void imdct36(int *out, int *in) } /* fast header check for resync */ -static int check_header(UINT32 header) +static int check_header(uint32_t header) { /* header */ if ((header & 0xffe00000) != 0xffe00000) @@ -1053,7 +1060,7 @@ static int check_header(UINT32 header) /* header decoding. MUST check the header before because no consistency check is done there. Return 1 if free format found and that the frame size must be computed externally */ -static int decode_header(MPADecodeContext *s, UINT32 header) +static int decode_header(MPADecodeContext *s, uint32_t header) { int sample_rate, frame_size, mpeg25, padding; int sample_rate_index, bitrate_index; @@ -1154,8 +1161,8 @@ static int decode_header(MPADecodeContext *s, UINT32 header) static int mp_decode_layer1(MPADecodeContext *s) { int bound, i, v, n, ch, j, mant; - UINT8 allocation[MPA_MAX_CHANNELS][SBLIMIT]; - UINT8 scale_factors[MPA_MAX_CHANNELS][SBLIMIT]; + uint8_t allocation[MPA_MAX_CHANNELS][SBLIMIT]; + uint8_t scale_factors[MPA_MAX_CHANNELS][SBLIMIT]; if (s->mode == MPA_JSTEREO) bound = (s->mode_ext + 1) * 4; @@ -1448,9 +1455,9 @@ static int mp_decode_layer2(MPADecodeContext *s) /* * Seek back in the stream for backstep bytes (at most 511 bytes) */ -static void seek_to_maindata(MPADecodeContext *s, long backstep) +static void seek_to_maindata(MPADecodeContext *s, unsigned int backstep) { - UINT8 *ptr; + uint8_t *ptr; /* compute current position in stream */ ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3); @@ -1490,11 +1497,11 @@ static inline void lsf_sf_expand(int *slen, static void exponents_from_scale_factors(MPADecodeContext *s, GranuleDef *g, - INT16 *exponents) + int16_t *exponents) { - const UINT8 *bstab, *pretab; + const uint8_t *bstab, *pretab; int len, i, j, k, l, v0, shift, gain, gains[3]; - INT16 *exp_ptr; + int16_t *exp_ptr; exp_ptr = exponents; gain = g->global_gain - 210; @@ -1536,13 +1543,13 @@ static inline int get_bitsz(GetBitContext *s, int n) } static int huffman_decode(MPADecodeContext *s, GranuleDef *g, - INT16 *exponents, int end_pos) + int16_t *exponents, int end_pos) { int s_index; int linbits, code, x, y, l, v, i, j, k, pos; GetBitContext last_gb; VLC *vlc; - UINT8 *code_table; + uint8_t *code_table; /* low frequencies (called big values) */ s_index = 0; @@ -1641,8 +1648,8 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g, static void reorder_block(MPADecodeContext *s, GranuleDef *g) { int i, j, k, len; - INT32 *ptr, *dst, *ptr1; - INT32 tmp[576]; + int32_t *ptr, *dst, *ptr1; + int32_t tmp[576]; if (g->block_type != 2) return; @@ -1667,7 +1674,7 @@ static void reorder_block(MPADecodeContext *s, GranuleDef *g) dst += 3; } } - memcpy(ptr1, tmp, len * 3 * sizeof(INT32)); + memcpy(ptr1, tmp, len * 3 * sizeof(int32_t)); } } @@ -1677,10 +1684,10 @@ static void compute_stereo(MPADecodeContext *s, GranuleDef *g0, GranuleDef *g1) { int i, j, k, l; - INT32 v1, v2; + int32_t v1, v2; int sf_max, tmp0, tmp1, sf, len, non_zero_found; - INT32 (*is_tab)[16]; - INT32 *tab0, *tab1; + int32_t (*is_tab)[16]; + int32_t *tab0, *tab1; int non_zero_found_short[3]; /* intensity stereo */ @@ -1803,7 +1810,7 @@ static void compute_stereo(MPADecodeContext *s, static void compute_antialias(MPADecodeContext *s, GranuleDef *g) { - INT32 *ptr, *p0, *p1, *csa; + int32_t *ptr, *p0, *p1, *csa; int n, tmp0, tmp1, i, j; /* we antialias only "long" bands */ @@ -1836,13 +1843,13 @@ static void compute_antialias(MPADecodeContext *s, static void compute_imdct(MPADecodeContext *s, GranuleDef *g, - INT32 *sb_samples, - INT32 *mdct_buf) + int32_t *sb_samples, + int32_t *mdct_buf) { - INT32 *ptr, *win, *win1, *buf, *buf2, *out_ptr, *ptr1; - INT32 in[6]; - INT32 out[36]; - INT32 out2[12]; + int32_t *ptr, *win, *win1, *buf, *buf2, *out_ptr, *ptr1; + int32_t in[6]; + int32_t out[36]; + int32_t out2[12]; int i, j, k, mdct_long_end, v, sblimit; /* find last non zero block */ @@ -1935,12 +1942,12 @@ static void compute_imdct(MPADecodeContext *s, } #if defined(DEBUG) -void sample_dump(int fnum, INT32 *tab, int n) +void sample_dump(int fnum, int32_t *tab, int n) { static FILE *files[16], *f; char buf[512]; int i; - INT32 v; + int32_t v; f = files[fnum]; if (!f) { @@ -1971,7 +1978,7 @@ void sample_dump(int fnum, INT32 *tab, int n) for(i=0;i<n;i++) { /* normalize to 23 frac bits */ v = tab[i] << (23 - FRAC_BITS); - fwrite(&v, 1, sizeof(INT32), f); + fwrite(&v, 1, sizeof(int32_t), f); } } #endif @@ -1983,7 +1990,7 @@ static int mp_decode_layer3(MPADecodeContext *s) int nb_granules, main_data_begin, private_bits; int gr, ch, blocksplit_flag, i, j, k, n, bits_pos, bits_left; GranuleDef granules[2][2], *g; - INT16 exponents[576]; + int16_t exponents[576]; /* read side info */ if (s->lsf) { @@ -2123,7 +2130,7 @@ static int mp_decode_layer3(MPADecodeContext *s) bits_pos = get_bits_count(&s->gb); if (!s->lsf) { - UINT8 *sc; + uint8_t *sc; int slen, slen1, slen2; /* MPEG1 scale factors */ @@ -2327,11 +2334,11 @@ static int mp_decode_frame(MPADecodeContext *s, static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, - UINT8 * buf, int buf_size) + uint8_t * buf, int buf_size) { MPADecodeContext *s = avctx->priv_data; - UINT32 header; - UINT8 *buf_ptr; + uint32_t header; + uint8_t *buf_ptr; int len, out_size; short *out_samples = data; @@ -2398,8 +2405,8 @@ static int decode_frame(AVCodecContext * avctx, memcpy(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1); s->inbuf_ptr--; } else { - UINT8 *p, *pend; - UINT32 header1; + uint8_t *p, *pend; + uint32_t header1; int padding; memcpy(s->inbuf_ptr, buf_ptr, len); diff --git a/src/libffmpeg/libavcodec/mpegaudiodectab.h b/src/libffmpeg/libavcodec/mpegaudiodectab.h index 7cec73ebe..8a13127ad 100644 --- a/src/libffmpeg/libavcodec/mpegaudiodectab.h +++ b/src/libffmpeg/libavcodec/mpegaudiodectab.h @@ -1,5 +1,9 @@ +/** + * @file mpegaudiodectab.h + * mpeg audio layer decoder tables. + */ -const UINT16 mpa_bitrate_tab[2][3][15] = { +const uint16_t mpa_bitrate_tab[2][3][15] = { { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 }, {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 }, {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 } }, @@ -9,11 +13,11 @@ const UINT16 mpa_bitrate_tab[2][3][15] = { } }; -const UINT16 mpa_freq_tab[3] = { 44100, 48000, 32000 }; +const uint16_t mpa_freq_tab[3] = { 44100, 48000, 32000 }; /*******************************************************/ /* half mpeg encoding window (full precision) */ -const INT32 mpa_enwindow[257] = { +const int32_t mpa_enwindow[257] = { 0, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -3, -3, -4, -4, -5, -5, -6, -7, -7, -8, -9, -10, -11, @@ -200,13 +204,13 @@ const unsigned char *alloc_tables[5] = /* layer 3 tables */ /* layer3 scale factor size */ -static const UINT8 slen_table[2][16] = { +static const uint8_t slen_table[2][16] = { { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }, { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 }, }; /* number of lsf scale factors for a given size */ -static const UINT8 lsf_nsf_table[6][3][4] = { +static const uint8_t lsf_nsf_table[6][3][4] = { { { 6, 5, 5, 5 }, { 9, 9, 9, 9 }, { 6, 9, 9, 9 } }, { { 6, 5, 7, 3 }, { 9, 9, 12, 6 }, { 6, 9, 12, 6 } }, { { 11, 10, 0, 0 }, { 18, 18, 0, 0 }, { 15, 18, 0, 0 } }, @@ -217,55 +221,55 @@ static const UINT8 lsf_nsf_table[6][3][4] = { /* mpegaudio layer 3 huffman tables */ -const UINT16 mpa_huffcodes_1[4] = { +const uint16_t mpa_huffcodes_1[4] = { 0x0001, 0x0001, 0x0001, 0x0000, }; -const UINT8 mpa_huffbits_1[4] = { +const uint8_t mpa_huffbits_1[4] = { 1, 3, 2, 3, }; -const UINT16 mpa_huffcodes_2[9] = { +const uint16_t mpa_huffcodes_2[9] = { 0x0001, 0x0002, 0x0001, 0x0003, 0x0001, 0x0001, 0x0003, 0x0002, 0x0000, }; -const UINT8 mpa_huffbits_2[9] = { +const uint8_t mpa_huffbits_2[9] = { 1, 3, 6, 3, 3, 5, 5, 5, 6, }; -const UINT16 mpa_huffcodes_3[9] = { +const uint16_t mpa_huffcodes_3[9] = { 0x0003, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0003, 0x0002, 0x0000, }; -const UINT8 mpa_huffbits_3[9] = { +const uint8_t mpa_huffbits_3[9] = { 2, 2, 6, 3, 2, 5, 5, 5, 6, }; -const UINT16 mpa_huffcodes_5[16] = { +const uint16_t mpa_huffcodes_5[16] = { 0x0001, 0x0002, 0x0006, 0x0005, 0x0003, 0x0001, 0x0004, 0x0004, 0x0007, 0x0005, 0x0007, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000, }; -const UINT8 mpa_huffbits_5[16] = { +const uint8_t mpa_huffbits_5[16] = { 1, 3, 6, 7, 3, 3, 6, 7, 6, 6, 7, 8, 7, 6, 7, 8, }; -const UINT16 mpa_huffcodes_6[16] = { +const uint16_t mpa_huffcodes_6[16] = { 0x0007, 0x0003, 0x0005, 0x0001, 0x0006, 0x0002, 0x0003, 0x0002, 0x0005, 0x0004, 0x0004, 0x0001, 0x0003, 0x0003, 0x0002, 0x0000, }; -const UINT8 mpa_huffbits_6[16] = { +const uint8_t mpa_huffbits_6[16] = { 3, 3, 5, 7, 3, 2, 4, 5, 4, 4, 5, 6, 6, 5, 6, 7, }; -const UINT16 mpa_huffcodes_7[36] = { +const uint16_t mpa_huffcodes_7[36] = { 0x0001, 0x0002, 0x000a, 0x0013, 0x0010, 0x000a, 0x0003, 0x0003, 0x0007, 0x000a, 0x0005, 0x0003, 0x000b, 0x0004, 0x000d, 0x0011, 0x0008, 0x0004, 0x000c, 0x000b, 0x0012, 0x000f, 0x000b, 0x0002, @@ -273,7 +277,7 @@ const UINT16 mpa_huffcodes_7[36] = { 0x0005, 0x0003, 0x0002, 0x0000, }; -const UINT8 mpa_huffbits_7[36] = { +const uint8_t mpa_huffbits_7[36] = { 1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8, 6, 5, 7, 8, 8, 9, 7, 7, 8, 9, 9, 9, @@ -281,7 +285,7 @@ const UINT8 mpa_huffbits_7[36] = { 9, 10, 10, 10, }; -const UINT16 mpa_huffcodes_8[36] = { +const uint16_t mpa_huffcodes_8[36] = { 0x0003, 0x0004, 0x0006, 0x0012, 0x000c, 0x0005, 0x0005, 0x0001, 0x0002, 0x0010, 0x0009, 0x0003, 0x0007, 0x0003, 0x0005, 0x000e, 0x0007, 0x0003, 0x0013, 0x0011, 0x000f, 0x000d, 0x000a, 0x0004, @@ -289,7 +293,7 @@ const UINT16 mpa_huffcodes_8[36] = { 0x0004, 0x0001, 0x0001, 0x0000, }; -const UINT8 mpa_huffbits_8[36] = { +const uint8_t mpa_huffbits_8[36] = { 2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8, 6, 4, 6, 8, 8, 9, 8, 8, 8, 9, 9, 10, @@ -297,7 +301,7 @@ const UINT8 mpa_huffbits_8[36] = { 9, 9, 11, 11, }; -const UINT16 mpa_huffcodes_9[36] = { +const uint16_t mpa_huffcodes_9[36] = { 0x0007, 0x0005, 0x0009, 0x000e, 0x000f, 0x0007, 0x0006, 0x0004, 0x0005, 0x0005, 0x0006, 0x0007, 0x0007, 0x0006, 0x0008, 0x0008, 0x0008, 0x0005, 0x000f, 0x0006, 0x0009, 0x000a, 0x0005, 0x0001, @@ -305,7 +309,7 @@ const UINT16 mpa_huffcodes_9[36] = { 0x0006, 0x0002, 0x0006, 0x0000, }; -const UINT8 mpa_huffbits_9[36] = { +const uint8_t mpa_huffbits_9[36] = { 3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8, 4, 4, 5, 6, 7, 8, 6, 5, 6, 7, 7, 8, @@ -313,7 +317,7 @@ const UINT8 mpa_huffbits_9[36] = { 8, 8, 9, 9, }; -const UINT16 mpa_huffcodes_10[64] = { +const uint16_t mpa_huffcodes_10[64] = { 0x0001, 0x0002, 0x000a, 0x0017, 0x0023, 0x001e, 0x000c, 0x0011, 0x0003, 0x0003, 0x0008, 0x000c, 0x0012, 0x0015, 0x000c, 0x0007, 0x000b, 0x0009, 0x000f, 0x0015, 0x0020, 0x0028, 0x0013, 0x0006, @@ -324,7 +328,7 @@ const UINT16 mpa_huffcodes_10[64] = { 0x0009, 0x0008, 0x0007, 0x0008, 0x0004, 0x0004, 0x0002, 0x0000, }; -const UINT8 mpa_huffbits_10[64] = { +const uint8_t mpa_huffbits_10[64] = { 1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8, 6, 6, 7, 8, 9, 10, 9, 9, @@ -335,7 +339,7 @@ const UINT8 mpa_huffbits_10[64] = { 9, 8, 9, 10, 10, 11, 11, 11, }; -const UINT16 mpa_huffcodes_11[64] = { +const uint16_t mpa_huffcodes_11[64] = { 0x0003, 0x0004, 0x000a, 0x0018, 0x0022, 0x0021, 0x0015, 0x000f, 0x0005, 0x0003, 0x0004, 0x000a, 0x0020, 0x0011, 0x000b, 0x000a, 0x000b, 0x0007, 0x000d, 0x0012, 0x001e, 0x001f, 0x0014, 0x0005, @@ -346,7 +350,7 @@ const UINT16 mpa_huffcodes_11[64] = { 0x000b, 0x0004, 0x0006, 0x0006, 0x0006, 0x0003, 0x0002, 0x0000, }; -const UINT8 mpa_huffbits_11[64] = { +const uint8_t mpa_huffbits_11[64] = { 2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8, 5, 5, 6, 7, 8, 9, 8, 8, @@ -357,7 +361,7 @@ const UINT8 mpa_huffbits_11[64] = { 8, 7, 8, 9, 10, 10, 10, 10, }; -const UINT16 mpa_huffcodes_12[64] = { +const uint16_t mpa_huffcodes_12[64] = { 0x0009, 0x0006, 0x0010, 0x0021, 0x0029, 0x0027, 0x0026, 0x001a, 0x0007, 0x0005, 0x0006, 0x0009, 0x0017, 0x0010, 0x001a, 0x000b, 0x0011, 0x0007, 0x000b, 0x000e, 0x0015, 0x001e, 0x000a, 0x0007, @@ -368,7 +372,7 @@ const UINT16 mpa_huffcodes_12[64] = { 0x001b, 0x000c, 0x0008, 0x000c, 0x0006, 0x0003, 0x0001, 0x0000, }; -const UINT8 mpa_huffbits_12[64] = { +const uint8_t mpa_huffbits_12[64] = { 4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8, 5, 4, 5, 6, 7, 8, 7, 8, @@ -379,7 +383,7 @@ const UINT8 mpa_huffbits_12[64] = { 9, 8, 8, 9, 9, 9, 9, 10, }; -const UINT16 mpa_huffcodes_13[256] = { +const uint16_t mpa_huffcodes_13[256] = { 0x0001, 0x0005, 0x000e, 0x0015, 0x0022, 0x0033, 0x002e, 0x0047, 0x002a, 0x0034, 0x0044, 0x0034, 0x0043, 0x002c, 0x002b, 0x0013, 0x0003, 0x0004, 0x000c, 0x0013, 0x001f, 0x001a, 0x002c, 0x0021, @@ -414,7 +418,7 @@ const UINT16 mpa_huffcodes_13[256] = { 0x0011, 0x000c, 0x0010, 0x0008, 0x0001, 0x0001, 0x0000, 0x0001, }; -const UINT8 mpa_huffbits_13[256] = { +const uint8_t mpa_huffbits_13[256] = { 1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6, 7, 8, 8, 9, 9, @@ -449,7 +453,7 @@ const UINT8 mpa_huffbits_13[256] = { 15, 15, 16, 16, 19, 18, 19, 16, }; -const UINT16 mpa_huffcodes_15[256] = { +const uint16_t mpa_huffcodes_15[256] = { 0x0007, 0x000c, 0x0012, 0x0035, 0x002f, 0x004c, 0x007c, 0x006c, 0x0059, 0x007b, 0x006c, 0x0077, 0x006b, 0x0051, 0x007a, 0x003f, 0x000d, 0x0005, 0x0010, 0x001b, 0x002e, 0x0024, 0x003d, 0x0033, @@ -484,7 +488,7 @@ const UINT16 mpa_huffcodes_15[256] = { 0x0015, 0x0010, 0x000a, 0x0006, 0x0008, 0x0006, 0x0002, 0x0000, }; -const UINT8 mpa_huffbits_15[256] = { +const uint8_t mpa_huffbits_15[256] = { 3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5, 6, 7, 7, 8, 8, @@ -519,7 +523,7 @@ const UINT8 mpa_huffbits_15[256] = { 12, 12, 12, 12, 13, 13, 13, 13, }; -const UINT16 mpa_huffcodes_16[256] = { +const uint16_t mpa_huffcodes_16[256] = { 0x0001, 0x0005, 0x000e, 0x002c, 0x004a, 0x003f, 0x006e, 0x005d, 0x00ac, 0x0095, 0x008a, 0x00f2, 0x00e1, 0x00c3, 0x0178, 0x0011, 0x0003, 0x0004, 0x000c, 0x0014, 0x0023, 0x003e, 0x0035, 0x002f, @@ -554,7 +558,7 @@ const UINT16 mpa_huffcodes_16[256] = { 0x000d, 0x000c, 0x000a, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003, }; -const UINT8 mpa_huffbits_16[256] = { +const uint8_t mpa_huffbits_16[256] = { 1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6, 7, 8, 9, 9, 9, @@ -589,7 +593,7 @@ const UINT8 mpa_huffbits_16[256] = { 11, 11, 11, 11, 11, 11, 11, 8, }; -const UINT16 mpa_huffcodes_24[256] = { +const uint16_t mpa_huffcodes_24[256] = { 0x000f, 0x000d, 0x002e, 0x0050, 0x0092, 0x0106, 0x00f8, 0x01b2, 0x01aa, 0x029d, 0x028d, 0x0289, 0x026d, 0x0205, 0x0408, 0x0058, 0x000e, 0x000c, 0x0015, 0x0026, 0x0047, 0x0082, 0x007a, 0x00d8, @@ -624,7 +628,7 @@ const UINT16 mpa_huffcodes_24[256] = { 0x0007, 0x0006, 0x0004, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003, }; -const UINT8 mpa_huffbits_24[256] = { +const uint8_t mpa_huffbits_24[256] = { 4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5, 6, 7, 8, 8, 9, @@ -678,7 +682,7 @@ const HuffTable mpa_huff_tables[16] = { { 16, mpa_huffbits_24, mpa_huffcodes_24 }, }; -const UINT8 mpa_huff_data[32][2] = { +const uint8_t mpa_huff_data[32][2] = { { 0, 0 }, { 1, 0 }, { 2, 0 }, @@ -715,18 +719,18 @@ const UINT8 mpa_huff_data[32][2] = { /* huffman tables for quadrules */ -static UINT8 mpa_quad_codes[2][16] = { +static uint8_t mpa_quad_codes[2][16] = { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1, }, { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, }, }; -static UINT8 mpa_quad_bits[2][16] = { +static uint8_t mpa_quad_bits[2][16] = { { 1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6, }, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }, }; /* band size tables */ -const UINT8 band_size_long[9][22] = { +const uint8_t band_size_long[9][22] = { { 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158, }, /* 44100 */ { 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, @@ -747,7 +751,7 @@ const UINT8 band_size_long[9][22] = { 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2, }, /* 8000 */ }; -const UINT8 band_size_short[9][13] = { +const uint8_t band_size_short[9][13] = { { 4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56, }, /* 44100 */ { 4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66, }, /* 48000 */ { 4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12, }, /* 32000 */ @@ -759,7 +763,7 @@ const UINT8 band_size_short[9][13] = { { 8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26, }, /* 8000 */ }; -const UINT8 mpa_pretab[2][22] = { +const uint8_t mpa_pretab[2][22] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 }, }; diff --git a/src/libffmpeg/libavcodec/mpegaudiotab.h b/src/libffmpeg/libavcodec/mpegaudiotab.h index 41fb0fdbd..59bf86893 100644 --- a/src/libffmpeg/libavcodec/mpegaudiotab.h +++ b/src/libffmpeg/libavcodec/mpegaudiotab.h @@ -8,6 +8,12 @@ * same archive */ +/** + * @file mpegaudiotab.h + * mpeg audio layer 2 tables. + * Most of them come from the mpeg audio specification. + */ + #define SQRT2 1.41421356237309514547 static const int costab32[30] = { @@ -54,13 +60,13 @@ static const int bitinv32[32] = { }; -static INT16 filter_bank[512]; +static int16_t filter_bank[512]; static int scale_factor_table[64]; #ifdef USE_FLOATS static float scale_factor_inv_table[64]; #else -static INT8 scale_factor_shift[64]; +static int8_t scale_factor_shift[64]; static unsigned short scale_factor_mult[64]; #endif static unsigned char scale_diff_table[128]; diff --git a/src/libffmpeg/libavcodec/mpegvideo.c b/src/libffmpeg/libavcodec/mpegvideo.c index 31535c263..393e3828b 100644 --- a/src/libffmpeg/libavcodec/mpegvideo.c +++ b/src/libffmpeg/libavcodec/mpegvideo.c @@ -19,12 +19,16 @@ * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at> */ +/** + * @file mpegvideo.c + * The simplest mpeg encoder (well, it was the simplest!). + */ + #include <ctype.h> #include <limits.h> #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" -#include "simple_idct.h" #ifdef USE_FASTMEMCPY #include "fastmemcpy.h" @@ -32,18 +36,22 @@ #define CONFIG_RISKY +#ifdef CONFIG_ENCODERS static void encode_picture(MpegEncContext *s, int picture_number); +#endif //CONFIG_ENCODERS static void dct_unquantize_mpeg1_c(MpegEncContext *s, DCTELEM *block, int n, int qscale); static void dct_unquantize_mpeg2_c(MpegEncContext *s, DCTELEM *block, int n, int qscale); static void dct_unquantize_h263_c(MpegEncContext *s, DCTELEM *block, int n, int qscale); -static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w); +static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w); +#ifdef CONFIG_ENCODERS static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow); static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow); +#endif //CONFIG_ENCODERS -void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c; +void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c; /* enable all paranoid tests for rounding, overflows, etc... */ @@ -67,66 +75,55 @@ static const uint16_t aanscales[64] = { 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247 }; -/* Input permutation for the simple_idct_mmx */ -static const uint8_t simple_mmx_permutation[64]={ - 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, - 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, - 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, - 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, - 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, - 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, - 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, - 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, -}; - static const uint8_t h263_chroma_roundtab[16] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, }; -static UINT16 (*default_mv_penalty)[MAX_MV*2+1]=NULL; -static UINT8 default_fcode_tab[MAX_MV*2+1]; +#ifdef CONFIG_ENCODERS +static uint16_t (*default_mv_penalty)[MAX_MV*2+1]=NULL; +static uint8_t default_fcode_tab[MAX_MV*2+1]; enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1}; static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[64], uint16_t (*qmat16_bias)[64], - const UINT16 *quant_matrix, int bias, int qmin, int qmax) + const uint16_t *quant_matrix, int bias, int qmin, int qmax) { int qscale; for(qscale=qmin; qscale<=qmax; qscale++){ int i; - if (s->fdct == ff_jpeg_fdct_islow) { + if (s->dsp.fdct == ff_jpeg_fdct_islow) { for(i=0;i<64;i++) { - const int j= s->idct_permutation[i]; + const int j= s->dsp.idct_permutation[i]; /* 16 <= qscale * quant_matrix[i] <= 7905 */ /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */ /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */ /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ - qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / + qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j])); } - } else if (s->fdct == fdct_ifast) { + } else if (s->dsp.fdct == fdct_ifast) { for(i=0;i<64;i++) { - const int j= s->idct_permutation[i]; + const int j= s->dsp.idct_permutation[i]; /* 16 <= qscale * quant_matrix[i] <= 7905 */ /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */ /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */ /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ - qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) / + qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) / (aanscales[i] * qscale * quant_matrix[j])); } } else { for(i=0;i<64;i++) { - const int j= s->idct_permutation[i]; + const int j= s->dsp.idct_permutation[i]; /* We can safely suppose that 16 <= quant_matrix[i] <= 255 So 16 <= qscale * quant_matrix[i] <= 7905 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67 */ - qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j])); + qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j])); // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]); qmat16[qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]); @@ -136,6 +133,8 @@ static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16 } } } +#endif //CONFIG_ENCODERS + // move into common.c perhaps #define CHECKED_ALLOCZ(p, size)\ {\ @@ -146,7 +145,7 @@ static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16 }\ } -void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scantable){ +void ff_init_scantable(MpegEncContext *s, ScanTable *st, const uint8_t *src_scantable){ int i; int end; @@ -155,7 +154,7 @@ void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scanta for(i=0; i<64; i++){ int j; j = src_scantable[i]; - st->permutated[i] = s->idct_permutation[j]; + st->permutated[i] = s->dsp.idct_permutation[j]; #ifdef ARCH_POWERPC st->inverse[j] = i; #endif @@ -170,49 +169,16 @@ void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scanta } } -/* XXX: those functions should be suppressed ASAP when all IDCTs are - converted */ -// *FIXME* this is ugly hack using local static -static void (*ff_put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); -static void (*ff_add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); -static void ff_jref_idct_put(UINT8 *dest, int line_size, DCTELEM *block) -{ - j_rev_dct (block); - ff_put_pixels_clamped(block, dest, line_size); -} -static void ff_jref_idct_add(UINT8 *dest, int line_size, DCTELEM *block) -{ - j_rev_dct (block); - ff_add_pixels_clamped(block, dest, line_size); -} - /* init common dct for both encoder and decoder */ int DCT_common_init(MpegEncContext *s) { - int i; - - ff_put_pixels_clamped = s->dsp.put_pixels_clamped; - ff_add_pixels_clamped = s->dsp.add_pixels_clamped; - s->dct_unquantize_h263 = dct_unquantize_h263_c; s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_c; s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_c; - s->dct_quantize= dct_quantize_c; - - if(s->avctx->dct_algo==FF_DCT_FASTINT) - s->fdct = fdct_ifast; - else - s->fdct = ff_jpeg_fdct_islow; //slow/accurate/default - if(s->avctx->idct_algo==FF_IDCT_INT){ - s->idct_put= ff_jref_idct_put; - s->idct_add= ff_jref_idct_add; - s->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; - }else{ //accurate/default - s->idct_put= simple_idct_put; - s->idct_add= simple_idct_add; - s->idct_permutation_type= FF_NO_IDCT_PERM; - } +#ifdef CONFIG_ENCODERS + s->dct_quantize= dct_quantize_c; +#endif #ifdef HAVE_MMX MPV_common_init_mmx(s); @@ -233,34 +199,14 @@ int DCT_common_init(MpegEncContext *s) MPV_common_init_ppc(s); #endif +#ifdef CONFIG_ENCODERS s->fast_dct_quantize= s->dct_quantize; if(s->flags&CODEC_FLAG_TRELLIS_QUANT){ s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_* } - switch(s->idct_permutation_type){ - case FF_NO_IDCT_PERM: - for(i=0; i<64; i++) - s->idct_permutation[i]= i; - break; - case FF_LIBMPEG2_IDCT_PERM: - for(i=0; i<64; i++) - s->idct_permutation[i]= (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2); - break; - case FF_SIMPLE_IDCT_PERM: - for(i=0; i<64; i++) - s->idct_permutation[i]= simple_mmx_permutation[i]; - break; - case FF_TRANSPOSE_IDCT_PERM: - for(i=0; i<64; i++) - s->idct_permutation[i]= ((i&7)<<3) | (i>>3); - break; - default: - fprintf(stderr, "Internal error, IDCT permutation not set\n"); - return -1; - } - +#endif //CONFIG_ENCODERS /* load & permutate scantables note: only wmv uses differnt ones @@ -270,6 +216,8 @@ int DCT_common_init(MpegEncContext *s) ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_horizontal_scan); ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan); + s->picture_structure= PICT_FRAME; + return 0; } @@ -280,13 +228,13 @@ int DCT_common_init(MpegEncContext *s) static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ if(shared){ - XINE_ASSERT(pic->data[0], "pic->data[0] is NULL."); - XINE_ASSERT((pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED), "Invalid pic->type: %d", pic->type); + assert(pic->data[0]); + assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED); pic->type= FF_BUFFER_TYPE_SHARED; }else{ int r; - XINE_ASSERT(!pic->data[0],"pic->data[0] is not NULL."); + assert(!pic->data[0]); r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic); @@ -311,14 +259,14 @@ static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ if(pic->qscale_table==NULL){ if (s->encoding) { - CHECKED_ALLOCZ(pic->mb_var , s->mb_num * sizeof(INT16)) - CHECKED_ALLOCZ(pic->mc_mb_var, s->mb_num * sizeof(INT16)) - CHECKED_ALLOCZ(pic->mb_mean , s->mb_num * sizeof(INT8)) + CHECKED_ALLOCZ(pic->mb_var , s->mb_num * sizeof(int16_t)) + CHECKED_ALLOCZ(pic->mc_mb_var, s->mb_num * sizeof(int16_t)) + CHECKED_ALLOCZ(pic->mb_mean , s->mb_num * sizeof(int8_t)) CHECKED_ALLOCZ(pic->mb_cmp_score, s->mb_num * sizeof(int32_t)) } - CHECKED_ALLOCZ(pic->mbskip_table , s->mb_num * sizeof(UINT8)+1) //the +1 is for the slice end check - CHECKED_ALLOCZ(pic->qscale_table , s->mb_num * sizeof(UINT8)) + CHECKED_ALLOCZ(pic->mbskip_table , s->mb_num * sizeof(uint8_t)+1) //the +1 is for the slice end check + CHECKED_ALLOCZ(pic->qscale_table , s->mb_num * sizeof(uint8_t)) pic->qstride= s->mb_width; } @@ -371,7 +319,7 @@ int MPV_common_init(MpegEncContext *s) { int y_size, c_size, yc_size, i; - dsputil_init(&s->dsp, s->avctx->dsp_mask); + dsputil_init(&s->dsp, s->avctx); DCT_common_init(s); s->flags= s->avctx->flags; @@ -390,10 +338,10 @@ int MPV_common_init(MpegEncContext *s) yc_size = y_size + 2 * c_size; /* convert fourcc to upper case */ - s->avctx->fourcc= toupper( s->avctx->fourcc &0xFF) - + (toupper((s->avctx->fourcc>>8 )&0xFF)<<8 ) - + (toupper((s->avctx->fourcc>>16)&0xFF)<<16) - + (toupper((s->avctx->fourcc>>24)&0xFF)<<24); + s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF) + + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 ) + + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16) + + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24); CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17; @@ -404,12 +352,12 @@ int MPV_common_init(MpegEncContext *s) int mv_table_size= (s->mb_width+2)*(s->mb_height+2); /* Allocate MV tables */ - CHECKED_ALLOCZ(s->p_mv_table , mv_table_size * 2 * sizeof(INT16)) - CHECKED_ALLOCZ(s->b_forw_mv_table , mv_table_size * 2 * sizeof(INT16)) - CHECKED_ALLOCZ(s->b_back_mv_table , mv_table_size * 2 * sizeof(INT16)) - CHECKED_ALLOCZ(s->b_bidir_forw_mv_table , mv_table_size * 2 * sizeof(INT16)) - CHECKED_ALLOCZ(s->b_bidir_back_mv_table , mv_table_size * 2 * sizeof(INT16)) - CHECKED_ALLOCZ(s->b_direct_mv_table , mv_table_size * 2 * sizeof(INT16)) + CHECKED_ALLOCZ(s->p_mv_table , mv_table_size * 2 * sizeof(int16_t)) + CHECKED_ALLOCZ(s->b_forw_mv_table , mv_table_size * 2 * sizeof(int16_t)) + CHECKED_ALLOCZ(s->b_back_mv_table , mv_table_size * 2 * sizeof(int16_t)) + CHECKED_ALLOCZ(s->b_bidir_forw_mv_table , mv_table_size * 2 * sizeof(int16_t)) + CHECKED_ALLOCZ(s->b_bidir_back_mv_table , mv_table_size * 2 * sizeof(int16_t)) + CHECKED_ALLOCZ(s->b_direct_mv_table , mv_table_size * 2 * sizeof(int16_t)) //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer() CHECKED_ALLOCZ(s->me.scratchpad, s->width*2*16*3*sizeof(uint8_t)) @@ -428,29 +376,29 @@ int MPV_common_init(MpegEncContext *s) CHECKED_ALLOCZ(s->avctx->stats_out, 256); } - CHECKED_ALLOCZ(s->error_status_table, s->mb_num*sizeof(UINT8)) + CHECKED_ALLOCZ(s->error_status_table, s->mb_num*sizeof(uint8_t)) if (s->out_format == FMT_H263 || s->encoding) { int size; /* Allocate MB type table */ - CHECKED_ALLOCZ(s->mb_type , s->mb_num * sizeof(UINT8)) + CHECKED_ALLOCZ(s->mb_type , s->mb_num * sizeof(uint8_t)) /* MV prediction */ size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2); - CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(INT16)); + CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(int16_t)); } if(s->codec_id==CODEC_ID_MPEG4){ /* interlaced direct mode decoding tables */ - CHECKED_ALLOCZ(s->field_mv_table, s->mb_num*2*2 * sizeof(INT16)) - CHECKED_ALLOCZ(s->field_select_table, s->mb_num*2* sizeof(INT8)) + CHECKED_ALLOCZ(s->field_mv_table, s->mb_num*2*2 * sizeof(int16_t)) + CHECKED_ALLOCZ(s->field_select_table, s->mb_num*2* sizeof(int8_t)) } /* 4mv b frame decoding table */ //note this is needed for h263 without b frames too (segfault on damaged streams otherwise) - CHECKED_ALLOCZ(s->co_located_type_table, s->mb_num * sizeof(UINT8)) + CHECKED_ALLOCZ(s->co_located_type_table, s->mb_num * sizeof(uint8_t)) if (s->out_format == FMT_H263) { /* ac values */ - CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(INT16) * 16); + CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(int16_t) * 16); s->ac_val[1] = s->ac_val[0] + y_size; s->ac_val[2] = s->ac_val[1] + c_size; @@ -461,14 +409,14 @@ int MPV_common_init(MpegEncContext *s) CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE); /* cbp, ac_pred, pred_dir */ - CHECKED_ALLOCZ(s->cbp_table , s->mb_num * sizeof(UINT8)) - CHECKED_ALLOCZ(s->pred_dir_table, s->mb_num * sizeof(UINT8)) + CHECKED_ALLOCZ(s->cbp_table , s->mb_num * sizeof(uint8_t)) + CHECKED_ALLOCZ(s->pred_dir_table, s->mb_num * sizeof(uint8_t)) } if (s->h263_pred || s->h263_plus || !s->encoding) { /* dc values */ //MN: we need these for error resilience of intra-frames - CHECKED_ALLOCZ(s->dc_val[0], yc_size * sizeof(INT16)); + CHECKED_ALLOCZ(s->dc_val[0], yc_size * sizeof(int16_t)); s->dc_val[1] = s->dc_val[0] + y_size; s->dc_val[2] = s->dc_val[1] + c_size; for(i=0;i<yc_size;i++) @@ -543,6 +491,8 @@ void MPV_common_end(MpegEncContext *s) s->context_initialized = 0; } +#ifdef CONFIG_ENCODERS + /* init video encoder */ int MPV_encode_init(AVCodecContext *avctx) { @@ -553,7 +503,6 @@ int MPV_encode_init(AVCodecContext *avctx) s->bit_rate = avctx->bit_rate; s->bit_rate_tolerance = avctx->bit_rate_tolerance; - s->frame_rate = avctx->frame_rate; s->width = avctx->width; s->height = avctx->height; if(avctx->gop_size > 600){ @@ -565,8 +514,6 @@ int MPV_encode_init(AVCodecContext *avctx) s->rtp_payload_size = avctx->rtp_payload_size; if (avctx->rtp_callback) s->rtp_callback = avctx->rtp_callback; - s->qmin= avctx->qmin; - s->qmax= avctx->qmax; s->max_qdiff= avctx->max_qdiff; s->qcompress= avctx->qcompress; s->qblur= avctx->qblur; @@ -603,10 +550,27 @@ int MPV_encode_init(AVCodecContext *avctx) s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT); + if(s->codec_id==CODEC_ID_MJPEG){ + s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x + s->inter_quant_bias= 0; + }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO){ + s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x + s->inter_quant_bias= 0; + }else{ + s->intra_quant_bias=0; + s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x + } + + if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS) + s->intra_quant_bias= avctx->intra_quant_bias; + if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS) + s->inter_quant_bias= avctx->inter_quant_bias; + switch(avctx->codec->id) { case CODEC_ID_MPEG1VIDEO: s->out_format = FMT_MPEG1; - avctx->delay=0; //FIXME not sure, should check the spec + s->low_delay= 0; //s->max_b_frames ? 0 : 1; + avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); break; case CODEC_ID_MJPEG: s->out_format = FMT_MJPEG; @@ -637,12 +601,12 @@ int MPV_encode_init(AVCodecContext *avctx) case CODEC_ID_H263P: s->out_format = FMT_H263; s->h263_plus = 1; - s->unrestricted_mv = 1; - s->h263_aic = 1; - + /* Fx */ + s->unrestricted_mv=(avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0; + s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0; + /* /Fx */ /* These are just to be sure */ - s->umvplus = 0; - s->umvplus_dec = 0; + s->umvplus = 1; avctx->delay=0; s->low_delay=1; break; @@ -715,9 +679,9 @@ int MPV_encode_init(AVCodecContext *avctx) int i; done=1; - default_mv_penalty= av_mallocz( sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1) ); - memset(default_mv_penalty, 0, sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1)); - memset(default_fcode_tab , 0, sizeof(UINT8)*(2*MAX_MV+1)); + default_mv_penalty= av_mallocz( sizeof(uint16_t)*(MAX_FCODE+1)*(2*MAX_MV+1) ); + memset(default_mv_penalty, 0, sizeof(uint16_t)*(MAX_FCODE+1)*(2*MAX_MV+1)); + memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1)); for(i=-16; i<16; i++){ default_fcode_tab[i + MAX_MV]= 1; @@ -754,7 +718,7 @@ int MPV_encode_init(AVCodecContext *avctx) /* init default q matrix */ for(i=0;i<64;i++) { - int j= s->idct_permutation[i]; + int j= s->dsp.idct_permutation[i]; #ifdef CONFIG_RISKY if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){ s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i]; @@ -809,10 +773,12 @@ int MPV_encode_end(AVCodecContext *avctx) return 0; } +#endif //CONFIG_ENCODERS + void init_rl(RLTable *rl) { - INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1]; - UINT8 index_run[MAX_RUN+1]; + int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1]; + uint8_t index_run[MAX_RUN+1]; int last, run, level, start, end, i; /* compute max_level[], max_run[] and index_run[] */ @@ -849,9 +815,9 @@ void init_rl(RLTable *rl) /* draw the edges of width 'w' of an image of size width, height */ //FIXME check that this is ok for mpeg4 interlaced -static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w) +static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w) { - UINT8 *ptr, *last_line; + uint8_t *ptr, *last_line; int i; last_line = buf + (height - 1) * wrap; @@ -892,7 +858,7 @@ static int find_unused_picture(MpegEncContext *s, int shared){ } } - XINE_ASSERT(i<MAX_PICTURE_COUNT,"value 'i' is >= MAX_PICTURE_COUNT: %d >= %d", i, MAX_PICTURE_COUNT); + assert(i<MAX_PICTURE_COUNT); return i; } @@ -900,57 +866,66 @@ static int find_unused_picture(MpegEncContext *s, int shared){ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) { int i; - AVFrame *pic = NULL; + AVFrame *pic; s->mb_skiped = 0; /* mark&release old frames */ - if (s->pict_type != B_TYPE && s->last_picture.data[0]) { - for(i=0; i<MAX_PICTURE_COUNT; i++){ -//printf("%8X %d %d %X %X\n", s->picture[i].data[0], s->picture[i].type, i, s->next_picture.data[0], s->last_picture.data[0]); - if(s->picture[i].data[0] == s->last_picture.data[0]){ -// s->picture[i].reference=0; - avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]); - break; - } - } - XINE_ASSERT(i<MAX_PICTURE_COUNT,"value 'i' is >= MAX_PICTURE_COUNT: %d >= %d", i, MAX_PICTURE_COUNT); + if (s->pict_type != B_TYPE && s->last_picture_ptr) { + avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr); /* release forgotten pictures */ /* if(mpeg124/h263) */ if(!s->encoding){ for(i=0; i<MAX_PICTURE_COUNT; i++){ - if(s->picture[i].data[0] && s->picture[i].data[0] != s->next_picture.data[0] && s->picture[i].reference){ + if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){ fprintf(stderr, "releasing zombie picture\n"); avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]); } } } } - + +alloc: if(!s->encoding){ i= find_unused_picture(s, 0); pic= (AVFrame*)&s->picture[i]; pic->reference= s->pict_type != B_TYPE; - pic->coded_picture_number= s->current_picture.coded_picture_number+1; + + if(s->current_picture_ptr) + pic->coded_picture_number= s->current_picture_ptr->coded_picture_number+1; alloc_picture(s, (Picture*)pic, 0); - s->current_picture= s->picture[i]; + s->current_picture_ptr= &s->picture[i]; } if (s->pict_type != B_TYPE) { - s->last_picture= s->next_picture; - s->next_picture= s->current_picture; + s->last_picture_ptr= s->next_picture_ptr; + s->next_picture_ptr= s->current_picture_ptr; + } + s->current_picture= *s->current_picture_ptr; + if(s->last_picture_ptr) s->last_picture= *s->last_picture_ptr; + if(s->next_picture_ptr) s->next_picture= *s->next_picture_ptr; + if(s->new_picture_ptr ) s->new_picture = *s->new_picture_ptr; + + if(s->picture_structure!=PICT_FRAME){ + int i; + for(i=0; i<4; i++){ + if(s->picture_structure == PICT_BOTTOM_FIELD){ + s->current_picture.data[i] += s->current_picture.linesize[i]; + } + s->current_picture.linesize[i] *= 2; + s->last_picture.linesize[i] *=2; + s->next_picture.linesize[i] *=2; + } } - if(s->pict_type != I_TYPE && s->last_picture.data[0]==NULL){ + if(s->pict_type != I_TYPE && s->last_picture_ptr==NULL){ fprintf(stderr, "warning: first frame is no keyframe\n"); - XINE_ASSERT(s->pict_type != B_TYPE, "These should have been dropped if we dont have a reference"); - free_picture(s, (Picture*) pic); - s->last_picture.data[0] = s->next_picture.data[0] = NULL; - return -1; + assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference + goto alloc; } s->hurry_up= s->avctx->hurry_up; @@ -987,19 +962,19 @@ void MPV_frame_end(MpegEncContext *s) if(s->pict_type!=B_TYPE){ s->last_non_b_pict_type= s->pict_type; } - - s->current_picture.quality= s->qscale; //FIXME get average of qscale_table - s->current_picture.pict_type= s->pict_type; - s->current_picture.key_frame= s->pict_type == I_TYPE; - - /* copy back current_picture variables */ +#if 0 + /* copy back current_picture variables */ for(i=0; i<MAX_PICTURE_COUNT; i++){ if(s->picture[i].data[0] == s->current_picture.data[0]){ s->picture[i]= s->current_picture; break; } } - XINE_ASSERT(i<MAX_PICTURE_COUNT,"value 'i' is >= MAX_PICTURE_COUNT: %d >= %d", i, MAX_PICTURE_COUNT); + assert(i<MAX_PICTURE_COUNT); +#endif + s->current_picture_ptr->quality= s->qscale; //FIXME get average of qscale_table + s->current_picture_ptr->pict_type= s->pict_type; + s->current_picture_ptr->key_frame= s->pict_type == I_TYPE; /* release non refernce frames */ for(i=0; i<MAX_PICTURE_COUNT; i++){ @@ -1018,8 +993,17 @@ void MPV_frame_end(MpegEncContext *s) } printf("pict type: %d\n", s->pict_type); } + + // clear copies, to avoid confusion +#if 0 + memset(&s->last_picture, 0, sizeof(Picture)); + memset(&s->next_picture, 0, sizeof(Picture)); + memset(&s->current_picture, 0, sizeof(Picture)); +#endif } +#ifdef CONFIG_ENCODERS + static int get_sae(uint8_t *src, int ref, int stride){ int x,y; int acc=0; @@ -1085,6 +1069,12 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){ pic->reference= 1; alloc_picture(s, (Picture*)pic, 0); + for(i=0; i<4; i++){ + /* the input will be 16 pixels to the right relative to the actual buffer start + * and the current_pic, so the buffer can be reused, yes its not beatifull + */ + pic->data[i]+= 16; + } if( pic->data[0] == pic_arg->data[0] && pic->data[1] == pic_arg->data[1] @@ -1135,7 +1125,7 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){ static void select_input_picture(MpegEncContext *s){ int i; - + const int encoding_delay= s->max_b_frames; int coded_pic_num=0; if(s->reordered_input_picture[0]) @@ -1147,7 +1137,7 @@ static void select_input_picture(MpegEncContext *s){ /* set next picture types & ordering */ if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){ - if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture.data[0]==NULL || s->intra_only){ + if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){ s->reordered_input_picture[0]= s->input_picture[0]; s->reordered_input_picture[0]->pict_type= I_TYPE; s->reordered_input_picture[0]->coded_picture_number= coded_pic_num; @@ -1221,19 +1211,22 @@ static void select_input_picture(MpegEncContext *s){ } if(s->reordered_input_picture[0]){ - s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE; + s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE; + + s->new_picture= *s->reordered_input_picture[0]; if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){ + // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable + int i= find_unused_picture(s, 0); Picture *pic= &s->picture[i]; - s->new_picture= *s->reordered_input_picture[0]; - /* mark us unused / free shared pic */ for(i=0; i<4; i++) s->reordered_input_picture[0]->data[i]= NULL; s->reordered_input_picture[0]->type= 0; + //FIXME bad, copy * except pic->pict_type = s->reordered_input_picture[0]->pict_type; pic->quality = s->reordered_input_picture[0]->quality; pic->coded_picture_number = s->reordered_input_picture[0]->coded_picture_number; @@ -1241,21 +1234,20 @@ static void select_input_picture(MpegEncContext *s){ alloc_picture(s, pic, 0); - s->current_picture= *pic; + s->current_picture_ptr= pic; }else{ - XINE_ASSERT( - (s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER - || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL), - "s->reordered_input_picture[0]->type is incorrect: %d", - s->reordered_input_picture[0]->type); - - s->new_picture= *s->reordered_input_picture[0]; + // input is not a shared pix -> reuse buffer for current_pix + assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER + || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL); + + s->current_picture_ptr= s->reordered_input_picture[0]; for(i=0; i<4; i++){ - s->reordered_input_picture[0]->data[i]-=16; //FIXME dirty + //reverse the +16 we did before storing the input + s->current_picture_ptr->data[i]-=16; } - s->current_picture= *s->reordered_input_picture[0]; } + s->current_picture= *s->current_picture_ptr; s->picture_number= s->new_picture.display_picture_number; //printf("dpn:%d\n", s->picture_number); @@ -1285,7 +1277,7 @@ int MPV_encode_picture(AVCodecContext *avctx, s->pict_type= s->new_picture.pict_type; if (s->fixed_qscale){ /* the ratecontrol needs the last qscale so we dont touch it for CBR */ s->qscale= (int)(s->new_picture.quality+0.5); - XINE_ASSERT(s->qscale,"s->qscale is NULL"); + assert(s->qscale); } //emms_c(); //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale); @@ -1310,6 +1302,10 @@ int MPV_encode_picture(AVCodecContext *avctx, if(s->flags&CODEC_FLAG_PASS1) ff_write_pass1_stats(s); + + for(i=0; i<4; i++){ + avctx->error[i] += s->current_picture_ptr->error[i]; + } } s->input_picture_number++; @@ -1319,20 +1315,18 @@ int MPV_encode_picture(AVCodecContext *avctx, s->total_bits += s->frame_bits; avctx->frame_bits = s->frame_bits; - - for(i=0; i<4; i++){ - avctx->error[i] += s->current_picture.error[i]; - } return pbBufPtr(&s->pb) - s->pb.buf; } +#endif //CONFIG_ENCODERS + static inline void gmc1_motion(MpegEncContext *s, - UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int dest_offset, - UINT8 **ref_picture, int src_offset) + uint8_t **ref_picture, int src_offset) { - UINT8 *ptr; + uint8_t *ptr; int offset, src_x, src_y, linesize, uvlinesize; int motion_x, motion_y; int emu=0; @@ -1416,11 +1410,11 @@ static inline void gmc1_motion(MpegEncContext *s, } static inline void gmc_motion(MpegEncContext *s, - UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int dest_offset, - UINT8 **ref_picture, int src_offset) + uint8_t **ref_picture, int src_offset) { - UINT8 *ptr; + uint8_t *ptr; int linesize, uvlinesize; const int a= s->sprite_warping_accuracy; int ox, oy; @@ -1479,11 +1473,11 @@ static inline void gmc_motion(MpegEncContext *s, } -void ff_emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h, +void ff_emulated_edge_mc(MpegEncContext *s, uint8_t *src, int linesize, int block_w, int block_h, int src_x, int src_y, int w, int h){ int x, y; int start_y, start_x, end_y, end_x; - UINT8 *buf= s->edge_emu_buffer; + uint8_t *buf= s->edge_emu_buffer; if(src_y>= h){ src+= (h-1-src_y)*linesize; @@ -1542,13 +1536,13 @@ void ff_emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_ /* apply one mpeg motion vector to the three components */ static inline void mpeg_motion(MpegEncContext *s, - UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int dest_offset, - UINT8 **ref_picture, int src_offset, + uint8_t **ref_picture, int src_offset, int field_based, op_pixels_func (*pix_op)[4], int motion_x, int motion_y, int h) { - UINT8 *ptr; + uint8_t *ptr; int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize; int emu=0; #if 0 @@ -1571,15 +1565,15 @@ if(s->quarter_sample) src_y = clip(src_y, -16, height); if (src_y == height) dxy &= ~2; - linesize = s->linesize << field_based; - uvlinesize = s->uvlinesize << field_based; + linesize = s->current_picture.linesize[0] << field_based; + uvlinesize = s->current_picture.linesize[1] << field_based; ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset; dest_y += dest_offset; if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos || src_y + (motion_y&1) + h > v_edge_pos){ - ff_emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based, + ff_emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based, //FIXME linesize? and uv below src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos); ptr= s->edge_emu_buffer + src_offset; emu=1; @@ -1632,14 +1626,14 @@ if(s->quarter_sample) } static inline void qpel_motion(MpegEncContext *s, - UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int dest_offset, - UINT8 **ref_picture, int src_offset, + uint8_t **ref_picture, int src_offset, int field_based, op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16], int motion_x, int motion_y, int h) { - UINT8 *ptr; + uint8_t *ptr; int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize; int emu=0; @@ -1697,6 +1691,7 @@ static inline void qpel_motion(MpegEncContext *s, } mx= (mx>>1)|(mx&1); my= (my>>1)|(my&1); + dxy= (mx&1) | ((my&1)<<1); mx>>=1; my>>=1; @@ -1738,13 +1733,13 @@ inline int ff_h263_round_chroma(int x){ } static inline void MPV_motion(MpegEncContext *s, - UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, - int dir, UINT8 **ref_picture, + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, + int dir, uint8_t **ref_picture, op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16]) { int dxy, offset, mx, my, src_x, src_y, motion_x, motion_y; int mb_x, mb_y, i; - UINT8 *ptr, *dest; + uint8_t *ptr, *dest; int emu=0; mb_x = s->mb_x; @@ -1909,8 +1904,18 @@ static inline void MPV_motion(MpegEncContext *s, s->mv[dir][1][0], s->mv[dir][1][1], 8); } } else { - + int offset; + if(s->picture_structure == s->field_select[dir][0] + 1 || s->pict_type == B_TYPE || s->first_field){ + offset= s->field_select[dir][0] ? s->linesize : 0; + }else{ + ref_picture= s->current_picture.data; + offset= s->field_select[dir][0] ? s->linesize : -s->linesize; + } + mpeg_motion(s, dest_y, dest_cb, dest_cr, 0, + ref_picture, offset, + 0, pix_op, + s->mv[dir][0][0], s->mv[dir][0][1], 16); } break; } @@ -1919,28 +1924,28 @@ static inline void MPV_motion(MpegEncContext *s, /* put block[] to dest[] */ static inline void put_dct(MpegEncContext *s, - DCTELEM *block, int i, UINT8 *dest, int line_size) + DCTELEM *block, int i, uint8_t *dest, int line_size) { s->dct_unquantize(s, block, i, s->qscale); - s->idct_put (dest, line_size, block); + s->dsp.idct_put (dest, line_size, block); } /* add block[] to dest[] */ static inline void add_dct(MpegEncContext *s, - DCTELEM *block, int i, UINT8 *dest, int line_size) + DCTELEM *block, int i, uint8_t *dest, int line_size) { if (s->block_last_index[i] >= 0) { - s->idct_add (dest, line_size, block); + s->dsp.idct_add (dest, line_size, block); } } static inline void add_dequant_dct(MpegEncContext *s, - DCTELEM *block, int i, UINT8 *dest, int line_size) + DCTELEM *block, int i, uint8_t *dest, int line_size) { if (s->block_last_index[i] >= 0) { s->dct_unquantize(s, block, i, s->qscale); - s->idct_add (dest, line_size, block); + s->dsp.idct_add (dest, line_size, block); } } @@ -1957,8 +1962,8 @@ void ff_clean_intra_table_entries(MpegEncContext *s) s->dc_val[0][xy + wrap] = s->dc_val[0][xy + 1 + wrap] = 1024; /* ac pred */ - memset(s->ac_val[0][xy ], 0, 32 * sizeof(INT16)); - memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(INT16)); + memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t)); + memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t)); if (s->msmpeg4_version>=3) { s->coded_block[xy ] = s->coded_block[xy + 1 ] = @@ -1971,8 +1976,8 @@ void ff_clean_intra_table_entries(MpegEncContext *s) s->dc_val[1][xy] = s->dc_val[2][xy] = 1024; /* ac pred */ - memset(s->ac_val[1][xy], 0, 16 * sizeof(INT16)); - memset(s->ac_val[2][xy], 0, 16 * sizeof(INT16)); + memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t)); + memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t)); s->mbintra_table[s->mb_x + s->mb_y*s->mb_width]= 0; } @@ -2056,10 +2061,12 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) } if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc - UINT8 *dest_y, *dest_cb, *dest_cr; + uint8_t *dest_y, *dest_cb, *dest_cr; int dct_linesize, dct_offset; op_pixels_func (*op_pix)[4]; qpel_mc_func (*op_qpix)[16]; + const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics + const int uvlinesize= s->current_picture.linesize[1]; /* avoid copy if macroblock skipped in last frame too */ if (s->pict_type != B_TYPE) { @@ -2068,14 +2075,14 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) /* skip only during decoding as we might trash the buffers during encoding a bit */ if(!s->encoding){ - UINT8 *mbskip_ptr = &s->mbskip_table[mb_xy]; + uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy]; const int age= s->current_picture.age; - XINE_ASSERT(age, "value 'age' is NULL"); + assert(age); if (s->mb_skiped) { s->mb_skiped= 0; - XINE_ASSERT(s->pict_type!=I_TYPE, "s->pict_type (%d) != I_TYPE (%d)", s->pict_type, I_TYPE); + assert(s->pict_type!=I_TYPE); (*mbskip_ptr) ++; /* indicate that this time we skiped it */ if(*mbskip_ptr >99) *mbskip_ptr= 99; @@ -2093,22 +2100,22 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) }else s->mb_skiped= 0; - if(s->pict_type==B_TYPE && s->avctx->draw_horiz_band){ + if(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME){ //FIXME precalc dest_y = s->current_picture.data[0] + mb_x * 16; dest_cb = s->current_picture.data[1] + mb_x * 8; dest_cr = s->current_picture.data[2] + mb_x * 8; }else{ - dest_y = s->current_picture.data[0] + (mb_y * 16* s->linesize ) + mb_x * 16; - dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8; - dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8; + dest_y = s->current_picture.data[0] + (mb_y * 16* linesize ) + mb_x * 16; + dest_cb = s->current_picture.data[1] + (mb_y * 8 * uvlinesize) + mb_x * 8; + dest_cr = s->current_picture.data[2] + (mb_y * 8 * uvlinesize) + mb_x * 8; } if (s->interlaced_dct) { - dct_linesize = s->linesize * 2; - dct_offset = s->linesize; + dct_linesize = linesize * 2; + dct_offset = linesize; } else { - dct_linesize = s->linesize; - dct_offset = s->linesize * 8; + dct_linesize = linesize; + dct_offset = linesize * 8; } if (!s->mb_intra) { @@ -2145,8 +2152,8 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize); if(!(s->flags&CODEC_FLAG_GRAY)){ - add_dequant_dct(s, block[4], 4, dest_cb, s->uvlinesize); - add_dequant_dct(s, block[5], 5, dest_cr, s->uvlinesize); + add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize); + add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize); } } else if(s->codec_id != CODEC_ID_WMV2){ add_dct(s, block[0], 0, dest_y, dct_linesize); @@ -2155,8 +2162,8 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize); if(!(s->flags&CODEC_FLAG_GRAY)){ - add_dct(s, block[4], 4, dest_cb, s->uvlinesize); - add_dct(s, block[5], 5, dest_cr, s->uvlinesize); + add_dct(s, block[4], 4, dest_cb, uvlinesize); + add_dct(s, block[5], 5, dest_cr, uvlinesize); } } #ifdef CONFIG_RISKY @@ -2173,24 +2180,26 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize); if(!(s->flags&CODEC_FLAG_GRAY)){ - put_dct(s, block[4], 4, dest_cb, s->uvlinesize); - put_dct(s, block[5], 5, dest_cr, s->uvlinesize); + put_dct(s, block[4], 4, dest_cb, uvlinesize); + put_dct(s, block[5], 5, dest_cr, uvlinesize); } }else{ - s->idct_put(dest_y , dct_linesize, block[0]); - s->idct_put(dest_y + 8, dct_linesize, block[1]); - s->idct_put(dest_y + dct_offset , dct_linesize, block[2]); - s->idct_put(dest_y + dct_offset + 8, dct_linesize, block[3]); + s->dsp.idct_put(dest_y , dct_linesize, block[0]); + s->dsp.idct_put(dest_y + 8, dct_linesize, block[1]); + s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]); + s->dsp.idct_put(dest_y + dct_offset + 8, dct_linesize, block[3]); if(!(s->flags&CODEC_FLAG_GRAY)){ - s->idct_put(dest_cb, s->uvlinesize, block[4]); - s->idct_put(dest_cr, s->uvlinesize, block[5]); + s->dsp.idct_put(dest_cb, uvlinesize, block[4]); + s->dsp.idct_put(dest_cr, uvlinesize, block[5]); } } } } } +#ifdef CONFIG_ENCODERS + static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold) { static const char tab[64]= @@ -2257,80 +2266,13 @@ static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index if (level>maxlevel) level=maxlevel; else if(level<minlevel) level=minlevel; - block[j]= level; - } -} - -static inline void requantize_coeffs(MpegEncContext *s, DCTELEM block[64], int oldq, int newq, int n) -{ - int i; - if(s->mb_intra){ - i=1; //skip clipping of intra dc - //FIXME requantize, note (mpeg1/h263/h263p-aic dont need it,...) - }else - i=0; - - for(;i<=s->block_last_index[n]; i++){ - const int j = s->intra_scantable.permutated[i]; - int level = block[j]; - - block[j]= ROUNDED_DIV(level*oldq, newq); - } - - for(i=s->block_last_index[n]; i>=0; i--){ - const int j = s->intra_scantable.permutated[i]; - if(block[j]) break; + block[j]= level; } - s->block_last_index[n]= i; } -static inline void auto_requantize_coeffs(MpegEncContext *s, DCTELEM block[6][64]) -{ - int i,n, newq; - const int maxlevel= s->max_qcoeff; - const int minlevel= s->min_qcoeff; - int largest=0, smallest=0; - - XINE_ASSERT(s->adaptive_quant, "s->adaptive_quant is NULL"); - - for(n=0; n<6; n++){ - if(s->mb_intra){ - i=1; //skip clipping of intra dc - //FIXME requantize, note (mpeg1/h263/h263p-aic dont need it,...) - }else - i=0; - - for(;i<=s->block_last_index[n]; i++){ - const int j = s->intra_scantable.permutated[i]; - int level = block[n][j]; - if(largest < level) largest = level; - if(smallest > level) smallest= level; - } - } - - for(newq=s->qscale+1; newq<32; newq++){ - if( ROUNDED_DIV(smallest*s->qscale, newq) >= minlevel - && ROUNDED_DIV(largest *s->qscale, newq) <= maxlevel) - break; - } - - if(s->out_format==FMT_H263){ - /* h263 like formats cannot change qscale by more than 2 easiely */ - if(s->avctx->qmin + 2 < newq) - newq= s->avctx->qmin + 2; - } - - for(n=0; n<6; n++){ - requantize_coeffs(s, block[n], s->qscale, newq, n); - clip_coeffs(s, block[n], s->block_last_index[n]); - } - - s->dquant+= newq - s->qscale; - s->qscale= newq; -} #if 0 -static int pix_vcmp16x8(UINT8 *s, int stride){ //FIXME move to dsputil & optimize +static int pix_vcmp16x8(uint8_t *s, int stride){ //FIXME move to dsputil & optimize int score=0; int x,y; @@ -2345,7 +2287,7 @@ static int pix_vcmp16x8(UINT8 *s, int stride){ //FIXME move to dsputil & optimiz return score; } -static int pix_diff_vcmp16x8(UINT8 *s1, UINT8*s2, int stride){ //FIXME move to dsputil & optimize +static int pix_diff_vcmp16x8(uint8_t *s1, uint8_t*s2, int stride){ //FIXME move to dsputil & optimize int score=0; int x,y; @@ -2362,7 +2304,7 @@ static int pix_diff_vcmp16x8(UINT8 *s1, UINT8*s2, int stride){ //FIXME move to d #else #define SQ(a) ((a)*(a)) -static int pix_vcmp16x8(UINT8 *s, int stride){ //FIXME move to dsputil & optimize +static int pix_vcmp16x8(uint8_t *s, int stride){ //FIXME move to dsputil & optimize int score=0; int x,y; @@ -2377,7 +2319,7 @@ static int pix_vcmp16x8(UINT8 *s, int stride){ //FIXME move to dsputil & optimiz return score; } -static int pix_diff_vcmp16x8(UINT8 *s1, UINT8*s2, int stride){ //FIXME move to dsputil & optimize +static int pix_diff_vcmp16x8(uint8_t *s1, uint8_t*s2, int stride){ //FIXME move to dsputil & optimize int score=0; int x,y; @@ -2394,17 +2336,20 @@ static int pix_diff_vcmp16x8(UINT8 *s1, UINT8*s2, int stride){ //FIXME move to d #endif -void ff_draw_horiz_band(MpegEncContext *s){ +#endif //CONFIG_ENCODERS + +/** + * + * @param h is the normal height, this will be reduced automatically if needed for the last row + */ +void ff_draw_horiz_band(MpegEncContext *s, int y, int h){ if ( s->avctx->draw_horiz_band - && (s->last_picture.data[0] || s->low_delay) ) { - UINT8 *src_ptr[3]; - int y, h, offset; - y = s->mb_y * 16; - h = s->height - y; - if (h > 16) - h = 16; - - if(s->pict_type==B_TYPE) + && (s->last_picture_ptr || s->low_delay) ) { + uint8_t *src_ptr[3]; + int offset; + h= FFMIN(h, s->height - y); + + if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME) offset = 0; else offset = y * s->linesize; @@ -2425,6 +2370,8 @@ void ff_draw_horiz_band(MpegEncContext *s){ } } +#ifdef CONFIG_ENCODERS + static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) { const int mb_x= s->mb_x; @@ -2445,7 +2392,7 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) if(s->codec_id==CODEC_ID_MPEG4){ if(!s->mb_intra){ - XINE_ASSERT((s->dquant==0 || s->mv_type!=MV_TYPE_8X8), "?"); + assert(s->dquant==0 || s->mv_type!=MV_TYPE_8X8); if(s->mv_dir&MV_DIRECT) s->dquant=0; @@ -2457,7 +2404,7 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) } if (s->mb_intra) { - UINT8 *ptr; + uint8_t *ptr; int wrap_y; int emu=0; @@ -2512,8 +2459,8 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) }else{ op_pixels_func (*op_pix)[4]; qpel_mc_func (*op_qpix)[16]; - UINT8 *dest_y, *dest_cb, *dest_cr; - UINT8 *ptr_y, *ptr_cb, *ptr_cr; + uint8_t *dest_y, *dest_cb, *dest_cr; + uint8_t *ptr_y, *ptr_cb, *ptr_cr; int wrap_y, wrap_c; int emu=0; @@ -2661,7 +2608,6 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale; } -#ifdef CONFIG_ENCODERS /* huffman encode */ switch(s->codec_id){ //FIXME funct ptr could be slightly faster case CODEC_ID_MPEG1VIDEO: @@ -2683,11 +2629,12 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) case CODEC_ID_MJPEG: mjpeg_encode_mb(s, s->block); break; default: - XINE_ASSERT(0, "We have no default case. So if program control reaches here something is really wrong"); + assert(0); } -#endif } +#endif //CONFIG_ENCODERS + /** * combines the (truncated) bitstream to a complete frame * @returns -1 if no complete frame could be created @@ -2717,7 +2664,8 @@ int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size) return 0; } -void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length) +#ifdef CONFIG_ENCODERS +void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length) { int bytes= length>>4; int bits= length&15; @@ -2838,7 +2786,7 @@ static inline int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, in } } - XINE_ASSERT(acc>=0,"value 'acc' is < 0: %d", acc); + assert(acc>=0); return acc; } @@ -2849,9 +2797,9 @@ static void encode_picture(MpegEncContext *s, int picture_number) int i; int bits; MpegEncContext best_s, backup_s; - UINT8 bit_buf[2][3000]; - UINT8 bit_buf2[2][3000]; - UINT8 bit_buf_tex[2][3000]; + uint8_t bit_buf[2][3000]; + uint8_t bit_buf2[2][3000]; + uint8_t bit_buf_tex[2][3000]; PutBitContext pb[2], pb2[2], tex_pb[2]; for(i=0; i<2; i++){ @@ -2875,7 +2823,8 @@ static void encode_picture(MpegEncContext *s, int picture_number) #ifdef CONFIG_RISKY /* we need to initialize some time vars before we can encode b-frames */ - if (s->h263_pred && !s->h263_msmpeg4) + // RAL: Condition added for MPEG1VIDEO + if (s->codec_id == CODEC_ID_MPEG1VIDEO || (s->h263_pred && !s->h263_msmpeg4)) ff_set_mpeg4_time(s, s->picture_number); #endif @@ -2883,17 +2832,14 @@ static void encode_picture(MpegEncContext *s, int picture_number) s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration - if(s->msmpeg4_version){ - if(s->pict_type==I_TYPE) - s->no_rounding=1; - else if(s->flipflop_rounding) - s->no_rounding ^= 1; - }else if(s->out_format == FMT_H263){ - if(s->pict_type==I_TYPE) - s->no_rounding=0; - else if(s->pict_type!=B_TYPE) + if(s->pict_type==I_TYPE){ + if(s->msmpeg4_version) s->no_rounding=1; + else s->no_rounding=0; + }else if(s->pict_type!=B_TYPE){ + if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4) s->no_rounding ^= 1; } + /* Estimate motion for every MB */ s->mb_intra=0; //for the rate distoration & bit compare functions if(s->pict_type != I_TYPE){ @@ -2937,9 +2883,9 @@ static void encode_picture(MpegEncContext *s, int picture_number) }else /* if(s->pict_type == I_TYPE) */{ /* I-Frame */ //FIXME do we need to zero them? - memset(s->motion_val[0], 0, sizeof(INT16)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2); - memset(s->p_mv_table , 0, sizeof(INT16)*(s->mb_width+2)*(s->mb_height+2)*2); - memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height); + memset(s->motion_val[0], 0, sizeof(int16_t)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2); + memset(s->p_mv_table , 0, sizeof(int16_t)*(s->mb_width+2)*(s->mb_height+2)*2); + memset(s->mb_type , MB_TYPE_INTRA, sizeof(uint8_t)*s->mb_width*s->mb_height); if(!s->fixed_qscale){ /* finding spatial complexity for I-frame rate control */ @@ -2964,21 +2910,33 @@ static void encode_picture(MpegEncContext *s, int picture_number) if(s->scene_change_score > 0 && s->pict_type == P_TYPE){ s->pict_type= I_TYPE; - memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height); + memset(s->mb_type , MB_TYPE_INTRA, sizeof(uint8_t)*s->mb_width*s->mb_height); //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum); } - if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) - s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER); - ff_fix_long_p_mvs(s); - if(s->pict_type==B_TYPE){ - s->f_code= ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD); - s->b_code= ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD); + if(!s->umvplus){ + if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) { + s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER); + + ff_fix_long_p_mvs(s); + } + + if(s->pict_type==B_TYPE){ + int a, b; + + a = ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD); + b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, MB_TYPE_BIDIR); + s->f_code = FFMAX(a, b); - ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD); - ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD); - ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR); - ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR); + a = ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD); + b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, MB_TYPE_BIDIR); + s->b_code = FFMAX(a, b); + + ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD); + ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD); + ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR); + ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR); + } } if (s->fixed_qscale) @@ -3007,7 +2965,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) /* for mjpeg, we do include qscale in the matrix */ s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0]; for(i=1;i<64;i++){ - int j= s->idct_permutation[i]; + int j= s->dsp.idct_permutation[i]; s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3); } @@ -3062,11 +3020,15 @@ static void encode_picture(MpegEncContext *s, int picture_number) /* note: quant matrix value (8) is implied here */ s->last_dc[i] = 128; - s->current_picture.error[i] = 0; + s->current_picture_ptr->error[i] = 0; } s->mb_incr = 1; s->last_mv[0][0][0] = 0; s->last_mv[0][0][1] = 0; + s->last_mv[1][0][0] = 0; + s->last_mv[1][0][1] = 0; + + s->last_mv_dir = 0; #ifdef CONFIG_RISKY if (s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P) @@ -3230,7 +3192,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) &dmin, &next_block, mx, my); } if(mb_type&MB_TYPE_INTRA){ - s->mv_dir = MV_DIR_FORWARD; + s->mv_dir = 0; s->mv_type = MV_TYPE_16X16; s->mb_intra= 1; s->mv[0][0][0] = 0; @@ -3351,7 +3313,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) switch(mb_type){ case MB_TYPE_INTRA: - s->mv_dir = MV_DIR_FORWARD; + s->mv_dir = 0; s->mb_intra= 1; motion_x= s->mv[0][0][0] = 0; motion_y= s->mv[0][0][1] = 0; @@ -3408,8 +3370,13 @@ static void encode_picture(MpegEncContext *s, int picture_number) motion_x=motion_y=0; //gcc warning fix printf("illegal MB type\n"); } + encode_mb(s, motion_x, motion_y); + + // RAL: Update last macrobloc type + s->last_mv_dir = s->mv_dir; } + /* clean the MV table in IPS frames for direct mode in B frames */ if(s->mb_intra /* && I,P,S_TYPE */){ s->p_mv_table[xy][0]=0; @@ -3425,17 +3392,17 @@ static void encode_picture(MpegEncContext *s, int picture_number) if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16; if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16; - s->current_picture.error[0] += sse( + s->current_picture_ptr->error[0] += sse( s, s->new_picture .data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->current_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, w, h, s->linesize); - s->current_picture.error[1] += sse( + s->current_picture_ptr->error[1] += sse( s, s->new_picture .data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8, s->current_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8, w>>1, h>>1, s->uvlinesize); - s->current_picture.error[2] += sse( + s->current_picture_ptr->error[2] += sse( s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8, s->current_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8, @@ -3487,7 +3454,7 @@ static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow){ const int *qmat; - const UINT8 *scantable= s->intra_scantable.scantable; + const uint8_t *scantable= s->intra_scantable.scantable; int max=0; unsigned int threshold1, threshold2; int bias=0; @@ -3507,7 +3474,7 @@ static int dct_quantize_trellis_c(MpegEncContext *s, int score_limit=0; int left_limit= 0; - s->fdct (block); + s->dsp.fdct (block); qmul= qscale*16; qadd= ((qscale-1)|1)*8; @@ -3597,7 +3564,7 @@ static int dct_quantize_trellis_c(MpegEncContext *s, int level= coeff[level_index][i]; int unquant_coeff; - XINE_ASSERT(level, "value 'level' is NULL"); + assert(level); if(s->out_format == FMT_H263){ if(level>0){ @@ -3606,7 +3573,7 @@ static int dct_quantize_trellis_c(MpegEncContext *s, unquant_coeff= level*qmul - qadd; } }else{ //MPEG1 - j= s->idct_permutation[ scantable[i + start_i] ]; //FIXME optimize + j= s->dsp.idct_permutation[ scantable[i + start_i] ]; //FIXME optimize if(s->mb_intra){ if (level < 0) { unquant_coeff = (int)((-level) * qscale * s->intra_matrix[j]) >> 3; @@ -3716,16 +3683,16 @@ static int dct_quantize_trellis_c(MpegEncContext *s, return last_non_zero; i= last_i; - XINE_ASSERT(last_level, "value 'last_level' is NULL"); + assert(last_level); //FIXME use permutated scantable - block[ s->idct_permutation[ scantable[last_non_zero] ] ]= last_level; + block[ s->dsp.idct_permutation[ scantable[last_non_zero] ] ]= last_level; i -= last_run + 1; for(;i>0 ; i -= run_tab[i] + 1){ - const int j= s->idct_permutation[ scantable[i - 1 + start_i] ]; + const int j= s->dsp.idct_permutation[ scantable[i - 1 + start_i] ]; block[j]= level_tab[i]; - XINE_ASSERT(block[j], "value 'block[j]' is NULL"); + assert(block[j]); } return last_non_zero; @@ -3737,12 +3704,12 @@ static int dct_quantize_c(MpegEncContext *s, { int i, j, level, last_non_zero, q; const int *qmat; - const UINT8 *scantable= s->intra_scantable.scantable; + const uint8_t *scantable= s->intra_scantable.scantable; int bias; int max=0; unsigned int threshold1, threshold2; - s->fdct (block); + s->dsp.fdct (block); if (s->mb_intra) { if (!s->h263_aic) { @@ -3794,17 +3761,19 @@ static int dct_quantize_c(MpegEncContext *s, *overflow= s->max_qcoeff < max; //overflow might have happend /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */ - if (s->idct_permutation_type != FF_NO_IDCT_PERM) - ff_block_permute(block, s->idct_permutation, scantable, last_non_zero); + if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM) + ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero); return last_non_zero; } +#endif //CONFIG_ENCODERS + static void dct_unquantize_mpeg1_c(MpegEncContext *s, DCTELEM *block, int n, int qscale) { int i, level, nCoeffs; - const UINT16 *quant_matrix; + const uint16_t *quant_matrix; nCoeffs= s->block_last_index[n]; @@ -3867,7 +3836,7 @@ static void dct_unquantize_mpeg2_c(MpegEncContext *s, DCTELEM *block, int n, int qscale) { int i, level, nCoeffs; - const UINT16 *quant_matrix; + const uint16_t *quant_matrix; if(s->alternate_scan) nCoeffs= 63; else nCoeffs= s->block_last_index[n]; @@ -3932,7 +3901,7 @@ static void dct_unquantize_h263_c(MpegEncContext *s, int i, level, qmul, qadd; int nCoeffs; - XINE_ASSERT(s->block_last_index[n]>=0 , "s->block_last_index[%d] is < 0: %d", n, s->block_last_index[n]); + assert(s->block_last_index[n]>=0); qadd = (qscale - 1) | 1; qmul = qscale << 1; @@ -3949,7 +3918,7 @@ static void dct_unquantize_h263_c(MpegEncContext *s, nCoeffs= 63; //does not allways use zigzag table } else { i = 0; - nCoeffs= s->intra_scantable.raster_end[ s->block_last_index[n] ]; + nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ]; } for(;i<=nCoeffs;i++) { @@ -3969,6 +3938,7 @@ static void dct_unquantize_h263_c(MpegEncContext *s, } } + char ff_get_pict_type_char(int pict_type){ switch(pict_type){ case I_TYPE: return 'I'; @@ -3979,6 +3949,83 @@ char ff_get_pict_type_char(int pict_type){ } } +static const AVOption mpeg4_options[] = +{ + AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000), + AVOPTION_CODEC_FLAG("vhq", "very high quality", flags, CODEC_FLAG_HQ, 0), + AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference" + "the reference can be CBR (for CBR pass1) or VBR (for pass2)", + bit_rate_tolerance, 4, 240000000, 8000), + AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2), + AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31), + AVOPTION_CODEC_STRING("rc_eq", "rate control equation", + rc_eq, "tex^qComp,option1,options2", 0), + AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate", + rc_min_rate, 4, 24000000, 0), + AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate", + rc_max_rate, 4, 24000000, 0), + AVOPTION_CODEC_DOUBLE("rc_buf_aggresivity", "rate control buffer aggresivity", + rc_buffer_aggressivity, 4, 24000000, 0), + AVOPTION_CODEC_DOUBLE("rc_initial_cplx", "initial complexity for pass1 ratecontrol", + rc_initial_cplx, 0., 9999999., 0), + AVOPTION_CODEC_DOUBLE("i_quant_factor", "qscale factor between p and i frames", + i_quant_factor, 0., 0., 0), + AVOPTION_CODEC_DOUBLE("i_quant_offset", "qscale offset between p and i frames", + i_quant_factor, -999999., 999999., 0), + AVOPTION_CODEC_INT("dct_algo", "dct alghorithm", + dct_algo, 0, 5, 0), // fixme - "Auto,FastInt,Int,MMX,MLib,Altivec" + AVOPTION_CODEC_DOUBLE("lumi_masking", "luminance masking", + lumi_masking, 0., 999999., 0), + AVOPTION_CODEC_DOUBLE("temporal_cplx_masking", "temporary complexity masking", + temporal_cplx_masking, 0., 999999., 0), + AVOPTION_CODEC_DOUBLE("spatial_cplx_masking", "spatial complexity masking", + spatial_cplx_masking, 0., 999999., 0), + AVOPTION_CODEC_DOUBLE("p_masking", "p block masking", + p_masking, 0., 999999., 0), + AVOPTION_CODEC_DOUBLE("dark_masking", "darkness masking", + dark_masking, 0., 999999., 0), + AVOPTION_CODEC_INT("idct_algo", "idct alghorithm", + idct_algo, 0, 8, 0), // fixme - "Auto,Int,Simple,SimpleMMX,LibMPEG2MMX,PS2,MLib,ARM,Altivec" + + AVOPTION_CODEC_INT("mb_qmin", "minimum MB quantizer", + mb_qmin, 0, 8, 0), + AVOPTION_CODEC_INT("mb_qmax", "maximum MB quantizer", + mb_qmin, 0, 8, 0), + + AVOPTION_CODEC_INT("me_cmp", "ME compare function", + me_cmp, 0, 24000000, 0), + AVOPTION_CODEC_INT("me_sub_cmp", "subpixel ME compare function", + me_sub_cmp, 0, 24000000, 0), + + + AVOPTION_CODEC_INT("dia_size", "ME diamond size & shape", + dia_size, 0, 24000000, 0), + AVOPTION_CODEC_INT("last_predictor_count", "amount of previous MV predictors", + last_predictor_count, 0, 24000000, 0), + + AVOPTION_CODEC_INT("pre_me", "pre pass for ME", + pre_me, 0, 24000000, 0), + AVOPTION_CODEC_INT("me_pre_cmp", "ME pre pass compare function", + me_pre_cmp, 0, 24000000, 0), + + AVOPTION_CODEC_INT("me_range", "maximum ME search range", + me_range, 0, 24000000, 0), + AVOPTION_CODEC_INT("pre_dia_size", "ME pre pass diamod size & shape", + pre_dia_size, 0, 24000000, 0), + AVOPTION_CODEC_INT("me_subpel_quality", "subpel ME quality", + me_subpel_quality, 0, 24000000, 0), + AVOPTION_CODEC_INT("me_range", "maximum ME search range", + me_range, 0, 24000000, 0), + AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames", + flags, CODEC_FLAG_PSNR, 0), + AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)", + rc_override), + AVOPTION_SUB(avoptions_common), + AVOPTION_END() +}; + +#ifdef CONFIG_ENCODERS + AVCodec mpeg1video_encoder = { "mpeg1video", CODEC_TYPE_VIDEO, @@ -4029,6 +4076,7 @@ AVCodec mpeg4_encoder = { MPV_encode_init, MPV_encode_picture, MPV_encode_end, + .options = mpeg4_options, }; AVCodec msmpeg4v1_encoder = { @@ -4039,6 +4087,7 @@ AVCodec msmpeg4v1_encoder = { MPV_encode_init, MPV_encode_picture, MPV_encode_end, + .options = mpeg4_options, }; AVCodec msmpeg4v2_encoder = { @@ -4049,6 +4098,7 @@ AVCodec msmpeg4v2_encoder = { MPV_encode_init, MPV_encode_picture, MPV_encode_end, + .options = mpeg4_options, }; AVCodec msmpeg4v3_encoder = { @@ -4059,6 +4109,7 @@ AVCodec msmpeg4v3_encoder = { MPV_encode_init, MPV_encode_picture, MPV_encode_end, + .options = mpeg4_options, }; AVCodec wmv1_encoder = { @@ -4069,6 +4120,7 @@ AVCodec wmv1_encoder = { MPV_encode_init, MPV_encode_picture, MPV_encode_end, + .options = mpeg4_options, }; #endif @@ -4082,3 +4134,6 @@ AVCodec mjpeg_encoder = { MPV_encode_picture, MPV_encode_end, }; + +#endif //CONFIG_ENCODERS + diff --git a/src/libffmpeg/libavcodec/mpegvideo.h b/src/libffmpeg/libavcodec/mpegvideo.h index 7ecc6fd38..eb45fe7b7 100644 --- a/src/libffmpeg/libavcodec/mpegvideo.h +++ b/src/libffmpeg/libavcodec/mpegvideo.h @@ -17,10 +17,17 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/** + * @file mpegvideo.h + * mpegvideo header. + */ + #ifndef AVCODEC_MPEGVIDEO_H #define AVCODEC_MPEGVIDEO_H -#define FRAME_SKIPED 100 // return value for header parsers if frame is not coded +#include "dsputil.h" + +#define FRAME_SKIPED 100 ///< return value for header parsers if frame is not coded enum OutputFormat { FMT_MPEG1, @@ -48,10 +55,10 @@ enum OutputFormat { #define MAX_RUN 64 #define MAX_LEVEL 64 -#define I_TYPE FF_I_TYPE // Intra -#define P_TYPE FF_P_TYPE // Predicted -#define B_TYPE FF_B_TYPE // Bi-dir predicted -#define S_TYPE FF_S_TYPE // S(GMC)-VOP MPEG4 +#define I_TYPE FF_I_TYPE ///< Intra +#define P_TYPE FF_P_TYPE ///< Predicted +#define B_TYPE FF_B_TYPE ///< Bi-dir predicted +#define S_TYPE FF_S_TYPE ///< S(GMC)-VOP MPEG4 typedef struct Predictor{ double coeff; @@ -66,7 +73,7 @@ typedef struct RateControlEntry{ int i_tex_bits; int p_tex_bits; int misc_bits; - UINT64 expected_bits; + uint64_t expected_bits; int new_pict_type; float new_qscale; int mc_mb_var_sum; @@ -76,52 +83,61 @@ typedef struct RateControlEntry{ int b_code; }RateControlEntry; +/** + * rate control context. + */ typedef struct RateControlContext{ FILE *stats_file; - int num_entries; /* number of RateControlEntries */ + int num_entries; ///< number of RateControlEntries RateControlEntry *entry; - int buffer_index; /* amount of bits in the video/audio buffer */ + int buffer_index; ///< amount of bits in the video/audio buffer Predictor pred[5]; - double short_term_qsum; /* sum of recent qscales */ - double short_term_qcount; /* count of recent qscales */ - double pass1_rc_eq_output_sum;/* sum of the output of the rc equation, this is used for normalization */ - double pass1_wanted_bits; /* bits which should have been outputed by the pass1 code (including complexity init) */ + double short_term_qsum; ///< sum of recent qscales + double short_term_qcount; ///< count of recent qscales + double pass1_rc_eq_output_sum;///< sum of the output of the rc equation, this is used for normalization + double pass1_wanted_bits; ///< bits which should have been outputed by the pass1 code (including complexity init) double last_qscale; - double last_qscale_for[5]; /* last qscale for a specific pict type, used for max_diff & ipb factor stuff */ + double last_qscale_for[5]; ///< last qscale for a specific pict type, used for max_diff & ipb factor stuff int last_mc_mb_var_sum; int last_mb_var_sum; - UINT64 i_cplx_sum[5]; - UINT64 p_cplx_sum[5]; - UINT64 mv_bits_sum[5]; - UINT64 qscale_sum[5]; + uint64_t i_cplx_sum[5]; + uint64_t p_cplx_sum[5]; + uint64_t mv_bits_sum[5]; + uint64_t qscale_sum[5]; int frame_count[5]; int last_non_b_pict_type; }RateControlContext; +/** + * Scantable. + */ typedef struct ScanTable{ - const UINT8 *scantable; - UINT8 permutated[64]; - UINT8 raster_end[64]; + const uint8_t *scantable; + uint8_t permutated[64]; + uint8_t raster_end[64]; #ifdef ARCH_POWERPC - /* Used by dct_quantise_alitvec to find last-non-zero */ - UINT8 __align8 inverse[64]; + /** Used by dct_quantise_alitvec to find last-non-zero */ + uint8_t __align8 inverse[64]; #endif } ScanTable; +/** + * Picture. + */ typedef struct Picture{ FF_COMMON_FRAME - int mb_var_sum; /* sum of MB variance for current frame */ - int mc_mb_var_sum; /* motion compensated MB variance for current frame */ - uint16_t *mb_var; /* Table for MB variances */ - uint16_t *mc_mb_var; /* Table for motion compensated MB variances */ - uint8_t *mb_mean; /* Table for MB luminance */ - int32_t *mb_cmp_score; /* Table for MB cmp scores, for mb decission */ + int mb_var_sum; ///< sum of MB variance for current frame + int mc_mb_var_sum; ///< motion compensated MB variance for current frame + uint16_t *mb_var; ///< Table for MB variances + uint16_t *mc_mb_var; ///< Table for motion compensated MB variances + uint8_t *mb_mean; ///< Table for MB luminance + int32_t *mb_cmp_score; ///< Table for MB cmp scores, for mb decission int b_frame_score; /* */ } Picture; typedef struct ParseContext{ - UINT8 *buffer; + uint8_t *buffer; int index; int last_index; int buffer_size; @@ -131,21 +147,24 @@ typedef struct ParseContext{ struct MpegEncContext; +/** + * Motion estimation context. + */ typedef struct MotionEstContext{ - int skip; /* set if ME is skiped for the current MB */ - int co_located_mv[4][2]; /* mv from last p frame for direct mode ME */ + int skip; ///< set if ME is skiped for the current MB + int co_located_mv[4][2]; ///< mv from last p frame for direct mode ME int direct_basis_mv[4][2]; - uint8_t *scratchpad; /* data area for the me algo, so that the ME doesnt need to malloc/free */ - uint32_t *map; /* map to avoid duplicate evaluations */ - uint32_t *score_map; /* map to store the scores */ + uint8_t *scratchpad; ///< data area for the me algo, so that the ME doesnt need to malloc/free + uint32_t *map; ///< map to avoid duplicate evaluations + uint32_t *score_map; ///< map to store the scores int map_generation; int pre_penalty_factor; int penalty_factor; int sub_penalty_factor; int mb_penalty_factor; - int pre_pass; /* = 1 for the pre pass */ + int pre_pass; ///< = 1 for the pre pass int dia_size; - UINT16 (*mv_penalty)[MAX_MV*2+1]; /* amount of bits needed to encode a MV */ + uint16_t (*mv_penalty)[MAX_MV*2+1]; ///< amount of bits needed to encode a MV int (*sub_motion_search)(struct MpegEncContext * s, int *mx_ptr, int *my_ptr, int dmin, int xmin, int ymin, int xmax, int ymax, @@ -165,138 +184,163 @@ typedef struct MotionEstContext{ uint16_t * const mv_penalty); }MotionEstContext; +/** + * MpegEncContext. + */ typedef struct MpegEncContext { struct AVCodecContext *avctx; /* the following parameters must be initialized before encoding */ - int width, height; /* picture size. must be a multiple of 16 */ + int width, height;///< picture size. must be a multiple of 16 int gop_size; - int frame_rate; /* number of frames per second */ - int intra_only; /* if true, only intra pictures are generated */ - int bit_rate; /* wanted bit rate */ - int bit_rate_tolerance; /* amount of +- bits (>0)*/ - enum OutputFormat out_format; /* output format */ - int h263_pred; /* use mpeg4/h263 ac/dc predictions */ + int intra_only; ///< if true, only intra pictures are generated + int bit_rate; ///< wanted bit rate + int bit_rate_tolerance; ///< amount of +- bits (>0) + enum OutputFormat out_format; ///< output format + int h263_pred; ///< use mpeg4/h263 ac/dc predictions /* the following codec id fields are deprecated in favor of codec_id */ - int h263_plus; /* h263 plus headers */ - int h263_rv10; /* use RV10 variation for H263 */ - int h263_msmpeg4; /* generate MSMPEG4 compatible stream (deprecated, use msmpeg4_version instead)*/ - int h263_intel; /* use I263 intel h263 header */ + int h263_plus; ///< h263 plus headers + int h263_rv10; ///< use RV10 variation for H263 + int h263_msmpeg4; ///< generate MSMPEG4 compatible stream (deprecated, use msmpeg4_version instead) + int h263_intel; ///< use I263 intel h263 header int codec_id; /* see CODEC_ID_xxx */ - int fixed_qscale; /* fixed qscale if non zero */ - float qcompress; /* amount of qscale change between easy & hard scenes (0.0-1.0) */ - float qblur; /* amount of qscale smoothing over time (0.0-1.0) */ - int qmin; /* min qscale */ - int qmax; /* max qscale */ - int max_qdiff; /* max qscale difference between frames */ - int encoding; /* true if we are encoding (vs decoding) */ - int flags; /* AVCodecContext.flags (HQ, MV4, ...) */ - int max_b_frames; /* max number of b-frames for encoding */ + int fixed_qscale; ///< fixed qscale if non zero + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + int max_qdiff; ///< max qscale difference between frames + int encoding; ///< true if we are encoding (vs decoding) + int flags; ///< AVCodecContext.flags (HQ, MV4, ...) + int max_b_frames; ///< max number of b-frames for encoding int b_frame_strategy; int luma_elim_threshold; int chroma_elim_threshold; - int strict_std_compliance; /* strictly follow the std (MPEG4, ...) */ - int workaround_bugs; /* workaround bugs in encoders which cannot be detected automatically */ + int strict_std_compliance; ///< strictly follow the std (MPEG4, ...) + int workaround_bugs; ///< workaround bugs in encoders which cannot be detected automatically /* the following fields are managed internally by the encoder */ - /* bit output */ + /** bit output */ PutBitContext pb; /* sequence parameters */ int context_initialized; int input_picture_number; int picture_number; - int picture_in_gop_number; /* 0-> first pic in gop, ... */ - int b_frames_since_non_b; /* used for encoding, relative to not yet reordered input */ - int mb_width, mb_height; /* number of MBs horizontally & vertically */ - int h_edge_pos, v_edge_pos;/* horizontal / vertical position of the right/bottom edge (pixel replicateion)*/ - int mb_num; /* number of MBs of a picture */ - int linesize; /* line size, in bytes, may be different from width */ - int uvlinesize; /* line size, for chroma in bytes, may be different from width */ - Picture picture[MAX_PICTURE_COUNT]; /* main picture buffer */ - Picture *input_picture[MAX_PICTURE_COUNT]; /* next pictures on display order for encoding*/ - Picture *reordered_input_picture[MAX_PICTURE_COUNT]; /* pointer to the next pictures in codedorder for encoding*/ - Picture last_picture; /* previous picture */ - Picture next_picture; /* previous picture (for bidir pred) */ - Picture new_picture; /* source picture for encoding */ - Picture current_picture; /* buffer to store the decompressed current picture */ - int last_dc[3]; /* last DC values for MPEG1 */ - INT16 *dc_val[3]; /* used for mpeg4 DC prediction, all 3 arrays must be continuous */ + int picture_in_gop_number; ///< 0-> first pic in gop, ... + int b_frames_since_non_b; ///< used for encoding, relative to not yet reordered input + int mb_width, mb_height; ///< number of MBs horizontally & vertically + int h_edge_pos, v_edge_pos;///< horizontal / vertical position of the right/bottom edge (pixel replicateion) + int mb_num; ///< number of MBs of a picture + int linesize; ///< line size, in bytes, may be different from width + int uvlinesize; ///< line size, for chroma in bytes, may be different from width + Picture picture[MAX_PICTURE_COUNT]; ///< main picture buffer + Picture *input_picture[MAX_PICTURE_COUNT]; ///< next pictures on display order for encoding + Picture *reordered_input_picture[MAX_PICTURE_COUNT]; ///< pointer to the next pictures in codedorder for encoding + + /** + * copy of the previous picture structure. + * note, linesize & data, might not match the previous picture (for field pictures) + */ + Picture last_picture; + + /** + * copy of the next picture structure. + * note, linesize & data, might not match the next picture (for field pictures) + */ + Picture next_picture; + + /** + * copy of the source picture structure for encoding. + * note, linesize & data, might not match the source picture (for field pictures) + */ + Picture new_picture; + + /** + * copy of the current picture structure. + * note, linesize & data, might not match the current picture (for field pictures) + */ + Picture current_picture; ///< buffer to store the decompressed current picture + + Picture *last_picture_ptr; ///< pointer to the previous picture. + Picture *next_picture_ptr; ///< pointer to the next picture (for bidir pred) + Picture *new_picture_ptr; ///< pointer to the source picture for encoding + Picture *current_picture_ptr; ///< pointer to the current picture + int last_dc[3]; ///< last DC values for MPEG1 + int16_t *dc_val[3]; ///< used for mpeg4 DC prediction, all 3 arrays must be continuous int y_dc_scale, c_dc_scale; - UINT8 *y_dc_scale_table; /* qscale -> y_dc_scale table */ - UINT8 *c_dc_scale_table; /* qscale -> c_dc_scale table */ - UINT8 *coded_block; /* used for coded block pattern prediction (msmpeg4v3, wmv1)*/ - INT16 (*ac_val[3])[16]; /* used for for mpeg4 AC prediction, all 3 arrays must be continuous */ + uint8_t *y_dc_scale_table; ///< qscale -> y_dc_scale table + uint8_t *c_dc_scale_table; ///< qscale -> c_dc_scale table + uint8_t *coded_block; ///< used for coded block pattern prediction (msmpeg4v3, wmv1) + int16_t (*ac_val[3])[16]; ///< used for for mpeg4 AC prediction, all 3 arrays must be continuous int ac_pred; - uint8_t *prev_pict_types; /* previous picture types in bitstream order, used for mb skip */ + uint8_t *prev_pict_types; ///< previous picture types in bitstream order, used for mb skip #define PREV_PICT_TYPES_BUFFER_SIZE 256 - int mb_skiped; /* MUST BE SET only during DECODING */ - UINT8 *mbskip_table; /* used to avoid copy if macroblock skipped (for black regions for example) + int mb_skiped; ///< MUST BE SET only during DECODING + uint8_t *mbskip_table; /**< used to avoid copy if macroblock skipped (for black regions for example) and used for b-frame encoding & decoding (contains skip table of next P Frame) */ - UINT8 *mbintra_table; /* used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding */ - UINT8 *cbp_table; /* used to store cbp, ac_pred for partitioned decoding */ - UINT8 *pred_dir_table; /* used to store pred_dir for partitioned decoding */ + uint8_t *mbintra_table; ///< used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding + uint8_t *cbp_table; ///< used to store cbp, ac_pred for partitioned decoding + uint8_t *pred_dir_table; ///< used to store pred_dir for partitioned decoding uint8_t *allocated_edge_emu_buffer; - uint8_t *edge_emu_buffer; /* points into the middle of allocated_edge_emu_buffer */ + uint8_t *edge_emu_buffer; ///< points into the middle of allocated_edge_emu_buffer - int qscale; /* QP */ - float frame_qscale; /* qscale from the frame level rc FIXME remove*/ - int adaptive_quant; /* use adaptive quantization */ - int dquant; /* qscale difference to prev qscale */ - int pict_type; /* I_TYPE, P_TYPE, B_TYPE, ... */ + int qscale; ///< QP + float frame_qscale; ///< qscale from the frame level rc FIXME remove + int adaptive_quant; ///< use adaptive quantization + int dquant; ///< qscale difference to prev qscale + int pict_type; ///< I_TYPE, P_TYPE, B_TYPE, ... int last_pict_type; - int last_non_b_pict_type; /* used for mpeg4 gmc b-frames & ratecontrol */ + int last_non_b_pict_type; ///< used for mpeg4 gmc b-frames & ratecontrol int frame_rate_index; /* motion compensation */ - int unrestricted_mv; - int h263_long_vectors; /* use horrible h263v1 long vector mode */ - - DSPContext dsp; /* pointers for accelerated dsp fucntions */ - int f_code; /* forward MV resolution */ - int b_code; /* backward MV resolution for B Frames (mpeg4) */ - INT16 (*motion_val)[2]; /* used for MV prediction (4MV per MB) */ - INT16 (*p_mv_table)[2]; /* MV table (1MV per MB) p-frame encoding */ - INT16 (*b_forw_mv_table)[2]; /* MV table (1MV per MB) forward mode b-frame encoding */ - INT16 (*b_back_mv_table)[2]; /* MV table (1MV per MB) backward mode b-frame encoding */ - INT16 (*b_bidir_forw_mv_table)[2]; /* MV table (1MV per MB) bidir mode b-frame encoding */ - INT16 (*b_bidir_back_mv_table)[2]; /* MV table (1MV per MB) bidir mode b-frame encoding */ - INT16 (*b_direct_mv_table)[2]; /* MV table (1MV per MB) direct mode b-frame encoding */ - int me_method; /* ME algorithm */ + int unrestricted_mv; ///< mv can point outside of the coded picture + int h263_long_vectors; ///< use horrible h263v1 long vector mode + + DSPContext dsp; ///< pointers for accelerated dsp fucntions + int f_code; ///< forward MV resolution + int b_code; ///< backward MV resolution for B Frames (mpeg4) + int16_t (*motion_val)[2]; ///< used for MV prediction (4MV per MB) + int16_t (*p_mv_table)[2]; ///< MV table (1MV per MB) p-frame encoding + int16_t (*b_forw_mv_table)[2]; ///< MV table (1MV per MB) forward mode b-frame encoding + int16_t (*b_back_mv_table)[2]; ///< MV table (1MV per MB) backward mode b-frame encoding + int16_t (*b_bidir_forw_mv_table)[2]; ///< MV table (1MV per MB) bidir mode b-frame encoding + int16_t (*b_bidir_back_mv_table)[2]; ///< MV table (1MV per MB) bidir mode b-frame encoding + int16_t (*b_direct_mv_table)[2]; ///< MV table (1MV per MB) direct mode b-frame encoding + int me_method; ///< ME algorithm int scene_change_score; int mv_dir; #define MV_DIR_BACKWARD 1 #define MV_DIR_FORWARD 2 -#define MV_DIRECT 4 // bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4) +#define MV_DIRECT 4 ///< bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4) int mv_type; -#define MV_TYPE_16X16 0 /* 1 vector for the whole mb */ -#define MV_TYPE_8X8 1 /* 4 vectors (h263, mpeg4 4MV) */ -#define MV_TYPE_16X8 2 /* 2 vectors, one per 16x8 block */ -#define MV_TYPE_FIELD 3 /* 2 vectors, one per field */ -#define MV_TYPE_DMV 4 /* 2 vectors, special mpeg2 Dual Prime Vectors */ - /* motion vectors for a macroblock +#define MV_TYPE_16X16 0 ///< 1 vector for the whole mb +#define MV_TYPE_8X8 1 ///< 4 vectors (h263, mpeg4 4MV) +#define MV_TYPE_16X8 2 ///< 2 vectors, one per 16x8 block +#define MV_TYPE_FIELD 3 ///< 2 vectors, one per field +#define MV_TYPE_DMV 4 ///< 2 vectors, special mpeg2 Dual Prime Vectors + /**motion vectors for a macroblock first coordinate : 0 = forward 1 = backward second " : depend on type third " : 0 = x, 1 = y */ int mv[2][4][2]; int field_select[2][2]; - int last_mv[2][2][2]; /* last MV, used for MV prediction in MPEG1 & B-frame MPEG4 */ - UINT8 *fcode_tab; /* smallest fcode needed for each MV */ + int last_mv[2][2][2]; ///< last MV, used for MV prediction in MPEG1 & B-frame MPEG4 + uint8_t *fcode_tab; ///< smallest fcode needed for each MV MotionEstContext me; - int no_rounding; /* apply no rounding to motion compensation (MPEG4, msmpeg4, ...) + int no_rounding; /**< apply no rounding to motion compensation (MPEG4, msmpeg4, ...) for b-frames rounding mode is allways 0 */ - int hurry_up; /* when set to 1 during decoding, b frames will be skiped + int hurry_up; /**< when set to 1 during decoding, b frames will be skiped when set to 2 idct/dequant will be skipped too */ /* macroblock layer */ int mb_x, mb_y; int mb_incr; int mb_intra; - UINT8 *mb_type; /* Table for MB type */ + uint8_t *mb_type; ///< Table for MB type #define MB_TYPE_INTRA 0x01 #define MB_TYPE_INTER 0x02 #define MB_TYPE_INTER4V 0x04 @@ -308,20 +352,20 @@ typedef struct MpegEncContext { #define MB_TYPE_BACKWARD 0x40 #define MB_TYPE_BIDIR 0x80 - int block_index[6]; /* index to current MB in block based arrays with edges*/ + int block_index[6]; ///< index to current MB in block based arrays with edges int block_wrap[6]; - /* matrix transmitted in the bitstream */ - UINT16 intra_matrix[64]; - UINT16 chroma_intra_matrix[64]; - UINT16 inter_matrix[64]; - UINT16 chroma_inter_matrix[64]; -#define QUANT_BIAS_SHIFT 4 - int intra_quant_bias; /* bias for the quantizer */ - int inter_quant_bias; /* bias for the quantizer */ - int min_qcoeff; /* minimum encodable coefficient */ - int max_qcoeff; /* maximum encodable coefficient */ - int ac_esc_length; /* num of bits needed to encode the longest esc */ + /** matrix transmitted in the bitstream */ + uint16_t intra_matrix[64]; + uint16_t chroma_intra_matrix[64]; + uint16_t inter_matrix[64]; + uint16_t chroma_inter_matrix[64]; +#define QUANT_BIAS_SHIFT 8 + int intra_quant_bias; ///< bias for the quantizer + int inter_quant_bias; ///< bias for the quantizer + int min_qcoeff; ///< minimum encodable coefficient + int max_qcoeff; ///< maximum encodable coefficient + int ac_esc_length; ///< num of bits needed to encode the longest esc uint8_t *intra_ac_vlc_length; uint8_t *intra_ac_vlc_last_length; uint8_t *inter_ac_vlc_length; @@ -330,35 +374,29 @@ typedef struct MpegEncContext { uint8_t *chroma_dc_vlc_length; #define UNI_AC_ENC_INDEX(run,level) ((run)*128 + (level)) - /* precomputed matrix (combine qscale and DCT renorm) */ + /** precomputed matrix (combine qscale and DCT renorm) */ int __align8 q_intra_matrix[32][64]; int __align8 q_inter_matrix[32][64]; - /* identical to the above but for MMX & these are not permutated */ - UINT16 __align8 q_intra_matrix16[32][64]; - UINT16 __align8 q_inter_matrix16[32][64]; - UINT16 __align8 q_intra_matrix16_bias[32][64]; - UINT16 __align8 q_inter_matrix16_bias[32][64]; - int block_last_index[6]; /* last non zero coefficient in block */ + /** identical to the above but for MMX & these are not permutated */ + uint16_t __align8 q_intra_matrix16[32][64]; + uint16_t __align8 q_inter_matrix16[32][64]; + uint16_t __align8 q_intra_matrix16_bias[32][64]; + uint16_t __align8 q_inter_matrix16_bias[32][64]; + int block_last_index[6]; ///< last non zero coefficient in block /* scantables */ ScanTable __align8 intra_scantable; ScanTable intra_h_scantable; ScanTable intra_v_scantable; - ScanTable inter_scantable; // if inter == intra then intra should be used to reduce tha cache usage - UINT8 idct_permutation[64]; - int idct_permutation_type; -#define FF_NO_IDCT_PERM 1 -#define FF_LIBMPEG2_IDCT_PERM 2 -#define FF_SIMPLE_IDCT_PERM 3 -#define FF_TRANSPOSE_IDCT_PERM 4 + ScanTable inter_scantable; ///< if inter == intra then intra should be used to reduce tha cache usage - void *opaque; /* private data for the user */ + void *opaque; ///< private data for the user /* bit rate control */ int I_frame_bits; //FIXME used in mpeg12 ... - INT64 wanted_bits; - INT64 total_bits; - int frame_bits; /* bits used for the current frame */ - RateControlContext rc_context; // contains stuff only accessed in ratecontrol.c + int64_t wanted_bits; + int64_t total_bits; + int frame_bits; ///< bits used for the current frame + RateControlContext rc_context; ///< contains stuff only accessed in ratecontrol.c /* statistics, used for 2-pass encoding */ int mv_bits; @@ -369,12 +407,12 @@ typedef struct MpegEncContext { int f_count; int b_count; int skip_count; - int misc_bits; // cbp, mb_type - int last_bits; //temp var used for calculating the above vars + int misc_bits; ///< cbp, mb_type + int last_bits; ///< temp var used for calculating the above vars /* error concealment / resync */ - UINT8 *error_status_table; /* table of the error status of each MB */ -#define VP_START 1 /* current MB is the first after a resync marker */ + uint8_t *error_status_table; ///< table of the error status of each MB +#define VP_START 1 ///< current MB is the first after a resync marker #define AC_ERROR 2 #define DC_ERROR 4 #define MV_ERROR 8 @@ -383,11 +421,11 @@ typedef struct MpegEncContext { #define MV_END 64 //FIXME some prefix? - int resync_mb_x; /* x position of last resync marker */ - int resync_mb_y; /* y position of last resync marker */ - GetBitContext last_resync_gb; /* used to search for the next resync marker */ - int mb_num_left; /* number of MBs left in this video packet (for partitioned Slices only)*/ - int next_p_frame_damaged; /* set if the next p frame is damaged, to avoid showing trashed b frames */ + int resync_mb_x; ///< x position of last resync marker + int resync_mb_y; ///< y position of last resync marker + GetBitContext last_resync_gb; ///< used to search for the next resync marker + int mb_num_left; ///< number of MBs left in this video packet (for partitioned Slices only) + int next_p_frame_damaged; ///< set if the next p frame is damaged, to avoid showing trashed b frames int error_resilience; ParseContext parse_context; @@ -397,22 +435,21 @@ typedef struct MpegEncContext { int gob_index; /* H.263+ specific */ - int umvplus; - int umvplus_dec; - int h263_aic; /* Advanded INTRA Coding (AIC) */ - int h263_aic_dir; /* AIC direction: 0 = left, 1 = top */ + int umvplus; ///< == H263+ && unrestricted_mv + int h263_aic; ///< Advanded INTRA Coding (AIC) + int h263_aic_dir; ///< AIC direction: 0 = left, 1 = top /* mpeg4 specific */ int time_increment_resolution; - int time_increment_bits; /* number of bits to represent the fractional part of time */ + int time_increment_bits; ///< number of bits to represent the fractional part of time int last_time_base; - int time_base; /* time in seconds of last I,P,S Frame */ - INT64 time; /* time of current frame */ - INT64 last_non_b_time; - UINT16 pp_time; /* time distance between the last 2 p,s,i frames */ - UINT16 pb_time; /* time distance between the last b and p,s,i frame */ - UINT16 pp_field_time; - UINT16 pb_field_time; /* like above, just for interlaced */ + int time_base; ///< time in seconds of last I,P,S Frame + int64_t time; ///< time of current frame + int64_t last_non_b_time; + uint16_t pp_time; ///< time distance between the last 2 p,s,i frames + uint16_t pb_time; ///< time distance between the last b and p,s,i frame + uint16_t pp_field_time; + uint16_t pb_field_time; ///< like above, just for interlaced int shape; int vol_sprite_usage; int sprite_width; @@ -422,12 +459,12 @@ typedef struct MpegEncContext { int sprite_brightness_change; int num_sprite_warping_points; int real_sprite_warping_points; - int sprite_offset[2][2]; /* sprite offset[isChroma][isMVY] */ - int sprite_delta[2][2]; /* sprite_delta [isY][isMVY] */ - int sprite_shift[2]; /* sprite shift [isChroma] */ + int sprite_offset[2][2]; ///< sprite offset[isChroma][isMVY] + int sprite_delta[2][2]; ///< sprite_delta [isY][isMVY] + int sprite_shift[2]; ///< sprite shift [isChroma] int mcsel; int quant_precision; - int quarter_sample; /* 1->qpel, 0->half pel ME/MC */ + int quarter_sample; ///< 1->qpel, 0->half pel ME/MC int scalability; int hierachy_type; int enhancement_type; @@ -438,32 +475,33 @@ typedef struct MpegEncContext { int aspected_height; int sprite_warping_accuracy; int low_latency_sprite; - int data_partitioning; /* data partitioning flag from header */ - int partitioned_frame; /* is current frame partitioned */ - int rvlc; /* reversible vlc */ - int resync_marker; /* could this stream contain resync markers*/ - int low_delay; /* no reordering needed / has no b-frames */ + int data_partitioning; ///< data partitioning flag from header + int partitioned_frame; ///< is current frame partitioned + int rvlc; ///< reversible vlc + int resync_marker; ///< could this stream contain resync markers + int low_delay; ///< no reordering needed / has no b-frames int vo_type; - int vol_control_parameters; /* does the stream contain the low_delay flag, used to workaround buggy encoders */ - PutBitContext tex_pb; /* used for data partitioned VOPs */ - PutBitContext pb2; /* used for data partitioned VOPs */ + int vol_control_parameters; ///< does the stream contain the low_delay flag, used to workaround buggy encoders + PutBitContext tex_pb; ///< used for data partitioned VOPs + PutBitContext pb2; ///< used for data partitioned VOPs #define PB_BUFFER_SIZE 1024*256 uint8_t *tex_pb_buffer; uint8_t *pb2_buffer; int mpeg_quant; #define CO_LOCATED_TYPE_4MV 1 #define CO_LOCATED_TYPE_FIELDMV 2 - INT8 *co_located_type_table; /* 4mv & field_mv info for next b frame */ - INT16 (*field_mv_table)[2][2]; /* used for interlaced b frame decoding */ - INT8 (*field_select_table)[2]; /* wtf, no really another table for interlaced b frames */ - int t_frame; /* time distance of first I -> B, used for interlaced b frames */ - int padding_bug_score; /* used to detect the VERY common padding bug in MPEG4 */ + int8_t *co_located_type_table; ///< 4mv & field_mv info for next b frame + int16_t (*field_mv_table)[2][2]; ///< used for interlaced b frame decoding + int8_t (*field_select_table)[2]; ///< wtf, no really another table for interlaced b frames + int t_frame; ///< time distance of first I -> B, used for interlaced b frames + int padding_bug_score; ///< used to detect the VERY common padding bug in MPEG4 /* divx specific, used to workaround (many) bugs in divx5 */ int divx_version; int divx_build; + int divx_packed; #define BITSTREAM_BUFFER_SIZE 1024*256 - UINT8 *bitstream_buffer; //Divx 5.01 puts several frames in a single one, this is used to reorder them + uint8_t *bitstream_buffer; //Divx 5.01 puts several frames in a single one, this is used to reorder them int bitstream_buffer_size; int xvid_build; @@ -473,16 +511,15 @@ typedef struct MpegEncContext { int lavc_build; /* RV10 specific */ - int rv10_version; /* RV10 version: 0 or 3 */ + int rv10_version; ///< RV10 version: 0 or 3 int rv10_first_dc_coded[3]; /* MJPEG specific */ struct MJpegContext *mjpeg_ctx; - int mjpeg_vsample[3]; /* vertical sampling factors, default = {2, 1, 1} */ - int mjpeg_hsample[3]; /* horizontal sampling factors, default = {2, 1, 1} */ - int mjpeg_write_tables; /* do we want to have quantisation- and - huffmantables in the jpeg file ? */ - int mjpeg_data_only_frames; /* frames only with SOI, SOS and EOI markers */ + int mjpeg_vsample[3]; ///< vertical sampling factors, default = {2, 1, 1} + int mjpeg_hsample[3]; ///< horizontal sampling factors, default = {2, 1, 1} + int mjpeg_write_tables; ///< do we want to have quantisation- and huffmantables in the jpeg file ? + int mjpeg_data_only_frames; ///< frames only with SOI, SOS and EOI markers /* MSMPEG4 specific */ int mv_table_index; @@ -490,14 +527,14 @@ typedef struct MpegEncContext { int rl_chroma_table_index; int dc_table_index; int use_skip_mb_code; - int slice_height; /* in macroblocks */ - int first_slice_line; /* used in mpeg4 too to handle resync markers */ + int slice_height; ///< in macroblocks + int first_slice_line; ///< used in mpeg4 too to handle resync markers int flipflop_rounding; - int msmpeg4_version; /* 0=not msmpeg4, 1=mp41, 2=mp42, 3=mp43/divx3 4=wmv1/7 5=wmv2/8*/ + int msmpeg4_version; ///< 0=not msmpeg4, 1=mp41, 2=mp42, 3=mp43/divx3 4=wmv1/7 5=wmv2/8 int per_mb_rl_table; int esc3_level_length; int esc3_run_length; - /* [mb_intra][isChroma][level][run][last] */ + /** [mb_intra][isChroma][level][run][last] */ int (*ac_stats)[2][MAX_LEVEL+1][MAX_RUN+1][2]; int inter_intra_pred; int mspel; @@ -506,8 +543,9 @@ typedef struct MpegEncContext { GetBitContext gb; /* Mpeg1 specific */ - int fake_picture_number; /* picture number at the bitstream frame rate */ - int gop_picture_number; /* index of the first picture of a GOP based on fake_pic_num & mpeg1 specific */ + int fake_picture_number; ///< picture number at the bitstream frame rate + int gop_picture_number; ///< index of the first picture of a GOP based on fake_pic_num & mpeg1 specific + int last_mv_dir; ///< last mv_dir, used for b frame encoding /* MPEG2 specific - I wish I had not to support this mess. */ int progressive_sequence; @@ -532,17 +570,18 @@ typedef struct MpegEncContext { int full_pel[2]; int interlaced_dct; int first_slice; + int first_field; /* RTP specific */ /* These are explained on avcodec.h */ int rtp_mode; int rtp_payload_size; void (*rtp_callback)(void *data, int size, int packet_number); - UINT8 *ptr_lastgob; - UINT8 *ptr_last_mb_line; - UINT32 mb_line_avgsize; + uint8_t *ptr_lastgob; + uint8_t *ptr_last_mb_line; + uint32_t mb_line_avgsize; - DCTELEM (*block)[64]; /* points to one of the following blocks */ + DCTELEM (*block)[64]; ///< points to one of the following blocks DCTELEM blocks[2][6][64] __align8; // for HQ mode we need to keep the best block int (*decode_mb)(struct MpegEncContext *s, DCTELEM block[6][64]); // used by some codecs to avoid a switch() #define SLICE_OK 0 @@ -560,10 +599,6 @@ typedef struct MpegEncContext { DCTELEM *block/*align 16*/, int n, int qscale); int (*dct_quantize)(struct MpegEncContext *s, DCTELEM *block/*align 16*/, int n, int qscale, int *overflow); int (*fast_dct_quantize)(struct MpegEncContext *s, DCTELEM *block/*align 16*/, int n, int qscale, int *overflow); - void (*fdct)(DCTELEM *block/* align 16*/); - void (*idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); - void (*idct_add)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); - //FIXME move above funcs into dspContext perhaps } MpegEncContext; @@ -594,21 +629,22 @@ void MPV_common_init_armv4l(MpegEncContext *s); #ifdef ARCH_POWERPC void MPV_common_init_ppc(MpegEncContext *s); #endif -extern void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w); -void ff_conceal_past_errors(MpegEncContext *s, int conceal_all); -void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length); +extern void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w); +void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length); void ff_clean_intra_table_entries(MpegEncContext *s); -void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scantable); -void ff_error_resilience(MpegEncContext *s); -void ff_draw_horiz_band(MpegEncContext *s); -void ff_emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h, +void ff_init_scantable(MpegEncContext *s, ScanTable *st, const uint8_t *src_scantable); +void ff_draw_horiz_band(MpegEncContext *s, int y, int h); +void ff_emulated_edge_mc(MpegEncContext *s, uint8_t *src, int linesize, int block_w, int block_h, int src_x, int src_y, int w, int h); char ff_get_pict_type_char(int pict_type); int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size); -extern enum PixelFormat ff_yuv420p_list[2]; +void ff_er_frame_start(MpegEncContext *s); +void ff_er_frame_end(MpegEncContext *s); +void ff_er_add_slice(MpegEncContext *s, int startx, int starty, int endx, int endy, int status); + -extern int ff_bit_exact; +extern enum PixelFormat ff_yuv420p_list[2]; static inline void ff_init_block_index(MpegEncContext *s){ s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2; @@ -642,9 +678,9 @@ int ff_pre_estimate_p_frame_motion(MpegEncContext * s, int mb_x, int mb_y); /* mpeg12.c */ -extern const INT16 ff_mpeg1_default_intra_matrix[64]; -extern const INT16 ff_mpeg1_default_non_intra_matrix[64]; -extern UINT8 ff_mpeg1_dc_scale_table[128]; +extern const int16_t ff_mpeg1_default_intra_matrix[64]; +extern const int16_t ff_mpeg1_default_non_intra_matrix[64]; +extern uint8_t ff_mpeg1_dc_scale_table[128]; void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number); void mpeg1_encode_mb(MpegEncContext *s, @@ -653,18 +689,18 @@ void mpeg1_encode_mb(MpegEncContext *s, void ff_mpeg1_encode_init(MpegEncContext *s); -/* h263enc.c */ +/** RLTable. */ typedef struct RLTable { - int n; /* number of entries of table_vlc minus 1 */ - int last; /* number of values for last = 0 */ - const UINT16 (*table_vlc)[2]; - const INT8 *table_run; - const INT8 *table_level; - UINT8 *index_run[2]; /* encoding only */ - INT8 *max_level[2]; /* encoding & decoding */ - INT8 *max_run[2]; /* encoding & decoding */ - VLC vlc; /* decoding only deprected FIXME remove*/ - RL_VLC_ELEM *rl_vlc[32]; /* decoding only */ + int n; ///< number of entries of table_vlc minus 1 + int last; ///< number of values for last = 0 + const uint16_t (*table_vlc)[2]; + const int8_t *table_run; + const int8_t *table_level; + uint8_t *index_run[2]; ///< encoding only + int8_t *max_level[2]; ///< encoding & decoding + int8_t *max_run[2]; ///< encoding & decoding + VLC vlc; ///< decoding only deprected FIXME remove + RL_VLC_ELEM *rl_vlc[32]; ///< decoding only } RLTable; void init_rl(RLTable *rl); @@ -681,14 +717,14 @@ static inline int get_rl_index(const RLTable *rl, int last, int run, int level) return index + level - 1; } -extern UINT8 ff_mpeg4_y_dc_scale_table[32]; -extern UINT8 ff_mpeg4_c_dc_scale_table[32]; -extern const INT16 ff_mpeg4_default_intra_matrix[64]; -extern const INT16 ff_mpeg4_default_non_intra_matrix[64]; +extern uint8_t ff_mpeg4_y_dc_scale_table[32]; +extern uint8_t ff_mpeg4_c_dc_scale_table[32]; +extern const int16_t ff_mpeg4_default_intra_matrix[64]; +extern const int16_t ff_mpeg4_default_non_intra_matrix[64]; int ff_h263_decode_init(AVCodecContext *avctx); int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size); + uint8_t *buf, int buf_size); int ff_h263_decode_end(AVCodecContext *avctx); void h263_encode_mb(MpegEncContext *s, DCTELEM block[6][64], @@ -698,7 +734,7 @@ void mpeg4_encode_mb(MpegEncContext *s, int motion_x, int motion_y); void h263_encode_picture_header(MpegEncContext *s, int picture_number); int h263_encode_gob_header(MpegEncContext * s, int mb_line); -INT16 *h263_pred_motion(MpegEncContext * s, int block, +int16_t *h263_pred_motion(MpegEncContext * s, int block, int *px, int *py); void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, int dir); @@ -748,8 +784,8 @@ void ff_msmpeg4_encode_init(MpegEncContext *s); int ff_wmv2_decode_picture_header(MpegEncContext * s); void ff_wmv2_add_mb(MpegEncContext *s, DCTELEM block[6][64], uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr); void ff_mspel_motion(MpegEncContext *s, - UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, - UINT8 **ref_picture, op_pixels_func (*pix_op)[4], + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, + uint8_t **ref_picture, op_pixels_func (*pix_op)[4], int motion_x, int motion_y, int h); int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number); void ff_wmv2_encode_mb(MpegEncContext * s, @@ -770,8 +806,8 @@ int ff_rate_control_init(MpegEncContext *s); float ff_rate_estimate_qscale(MpegEncContext *s); void ff_write_pass1_stats(MpegEncContext *s); void ff_rate_control_uninit(MpegEncContext *s); -double ff_eval(char *s, double *const_value, char **const_name, - double (**func1)(void *, double), char **func1_name, +double ff_eval(char *s, double *const_value, const char **const_name, + double (**func1)(void *, double), const char **func1_name, double (**func2)(void *, double, double), char **func2_name, void *opaque); diff --git a/src/libffmpeg/libavcodec/msmpeg4.c b/src/libffmpeg/libavcodec/msmpeg4.c index 2c524a067..4bac6d3b7 100644 --- a/src/libffmpeg/libavcodec/msmpeg4.c +++ b/src/libffmpeg/libavcodec/msmpeg4.c @@ -18,6 +18,12 @@ * * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at> */ + +/** + * @file msmpeg4.c + * MSMPEG4 backend for ffmpeg encoder and decoder. + */ + #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" @@ -50,24 +56,30 @@ #define DEFAULT_INTER_INDEX 3 -static UINT32 v2_dc_lum_table[512][2]; -static UINT32 v2_dc_chroma_table[512][2]; +static uint32_t v2_dc_lum_table[512][2]; +static uint32_t v2_dc_chroma_table[512][2]; +#ifdef CONFIG_ENCODERS static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n); +#endif //CONFIG_ENCODERS static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, int n, int coded, const uint8_t *scantable); static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); static int msmpeg4_decode_motion(MpegEncContext * s, int *mx_ptr, int *my_ptr); +#ifdef CONFIG_ENCODERS static void msmpeg4v2_encode_motion(MpegEncContext * s, int val); +#endif //CONFIG_ENCODERS static void init_h263_dc_for_msmpeg4(void); static inline void msmpeg4_memsetw(short *tab, int val, int n); +#ifdef CONFIG_ENCODERS static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra); +#endif //CONFIG_ENCODERS static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); -extern UINT32 inverse[256]; +extern uint32_t inverse[256]; #ifdef DEBUG @@ -77,7 +89,7 @@ int frame_count = 0; #include "msmpeg4data.h" -static UINT8 rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2]; +static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2]; #ifdef STATS @@ -185,12 +197,14 @@ static void common_init(MpegEncContext * s) } } +#ifdef CONFIG_ENCODERS + /* build the table which associate a (x,y) motion vector to a vlc */ static void init_mv_table(MVTable *tab) { int i, x, y; - tab->table_mv_index = av_malloc(sizeof(UINT16) * 4096); + tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096); /* mark all entries as not used */ for(i=0;i<4096;i++) tab->table_mv_index[i] = tab->n; @@ -421,7 +435,7 @@ void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) void msmpeg4_encode_ext_header(MpegEncContext * s) { - put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29 + put_bits(&s->pb, 5, s->avctx->frame_rate / s->avctx->frame_rate_base); //yes 29.97 -> 29 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047)); @@ -433,8 +447,10 @@ void msmpeg4_encode_ext_header(MpegEncContext * s) } } +#endif //CONFIG_ENCODERS + /* predict coded block */ -static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr) +static inline int coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr) { int xy, wrap, pred, a, b, c; @@ -460,6 +476,8 @@ static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_bloc return pred; } +#ifdef CONFIG_ENCODERS + static void msmpeg4_encode_motion(MpegEncContext * s, int mx, int my) { @@ -518,7 +536,7 @@ void msmpeg4_encode_mb(MpegEncContext * s, { int cbp, coded_cbp, i; int pred_x, pred_y; - UINT8 *coded_block; + uint8_t *coded_block; handle_slices(s); @@ -624,8 +642,10 @@ void msmpeg4_encode_mb(MpegEncContext * s, } } +#endif //CONFIG_ENCODERS + /* old ffmpeg msmpeg4v3 mode */ -void ff_old_msmpeg4_dc_scale(MpegEncContext * s) +static void ff_old_msmpeg4_dc_scale(MpegEncContext * s) { if (s->qscale < 5){ s->y_dc_scale = 8; @@ -640,7 +660,7 @@ void ff_old_msmpeg4_dc_scale(MpegEncContext * s) } static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n, - INT32 **dc_val_ptr) + int32_t **dc_val_ptr) { int i; @@ -669,10 +689,10 @@ static int get_dc(uint8_t *src, int stride, int scale) /* dir = 0: left, dir = 1: top prediction */ static inline int msmpeg4_pred_dc(MpegEncContext * s, int n, - UINT16 **dc_val_ptr, int *dir_ptr) + uint16_t **dc_val_ptr, int *dir_ptr) { int a, b, c, wrap, pred, scale; - INT16 *dc_val; + int16_t *dc_val; /* find prediction */ if (n < 4) { @@ -817,19 +837,21 @@ static inline int msmpeg4_pred_dc(MpegEncContext * s, int n, #define DC_MAX 119 +#ifdef CONFIG_ENCODERS + static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) { int sign, code; int pred; if(s->msmpeg4_version==1){ - INT32 *dc_val; + int32_t *dc_val; pred = msmpeg4v1_pred_dc(s, n, &dc_val); /* update predictor */ *dc_val= level; }else{ - UINT16 *dc_val; + uint16_t *dc_val; pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); /* update predictor */ @@ -895,7 +917,7 @@ static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int int last_non_zero, sign, slevel; int code, run_diff, dc_pred_dir; const RLTable *rl; - const UINT8 *scantable; + const uint8_t *scantable; if (s->mb_intra) { set_stat(ST_DC); @@ -1009,6 +1031,8 @@ else } } +#endif //CONFIG_ENCODERS + /****************************************/ /* decoding stuff */ @@ -1228,6 +1252,10 @@ return -1; } #endif s->qscale = get_bits(&s->gb, 5); + if(s->qscale==0){ + fprintf(stderr, "invalid qscale\n"); + return -1; + } if (s->pict_type == I_TYPE) { code = get_bits(&s->gb, 5); @@ -1387,6 +1415,8 @@ static inline void msmpeg4_memsetw(short *tab, int val, int n) tab[i] = val; } +#ifdef CONFIG_ENCODERS + static void msmpeg4v2_encode_motion(MpegEncContext * s, int val) { int range, bit_size, sign, code, bits; @@ -1420,6 +1450,8 @@ static void msmpeg4v2_encode_motion(MpegEncContext * s, int val) } } +#endif //CONFIG_ENCODERS + /* this is identical to h263 except that its range is multiplied by 2 */ static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code) { @@ -1454,8 +1486,6 @@ static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) { int cbp, code, i; - s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0; - if (s->pict_type == P_TYPE) { if (s->use_skip_mb_code) { if (get_bits1(&s->gb)) { @@ -1540,7 +1570,7 @@ static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) { int cbp, code, i; - UINT8 *coded_val; + uint8_t *coded_val; #ifdef PRINT_MB if(s->mb_x==0){ @@ -1549,8 +1579,6 @@ if(s->mb_x==0){ } #endif - s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0; - if (s->pict_type == P_TYPE) { set_stat(ST_INTER_MB); if (s->use_skip_mb_code) { @@ -1935,14 +1963,14 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) } if(s->msmpeg4_version==1){ - INT32 *dc_val; + int32_t *dc_val; pred = msmpeg4v1_pred_dc(s, n, &dc_val); level += pred; /* update predictor */ *dc_val= level; }else{ - UINT16 *dc_val; + uint16_t *dc_val; pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); level += pred; diff --git a/src/libffmpeg/libavcodec/msmpeg4data.h b/src/libffmpeg/libavcodec/msmpeg4data.h index 2c3a28f0e..69568cbf6 100644 --- a/src/libffmpeg/libavcodec/msmpeg4data.h +++ b/src/libffmpeg/libavcodec/msmpeg4data.h @@ -1,4 +1,5 @@ -/* +/** + * @file msmpeg4data.h * MSMPEG4 data tables. */ diff --git a/src/libffmpeg/libavcodec/opts.c b/src/libffmpeg/libavcodec/opts.c new file mode 100644 index 000000000..44a213397 --- /dev/null +++ b/src/libffmpeg/libavcodec/opts.c @@ -0,0 +1,192 @@ +/* + * LGPL + */ + +/** + * @file opts.c + * options parser. + * typical parsed command line: + * msmpeg4:bitrate=720000:qmax=16 + * + */ + +#include "avcodec.h" +#include "os_support.h" + +const AVOption avoptions_common[] = { + AVOPTION_CODEC_FLAG("bit_exact", "use only bit-exact stuff", flags, CODEC_FLAG_BITEXACT, 0), + AVOPTION_CODEC_FLAG("mm_force", "force mm flags", dsp_mask, FF_MM_FORCE, 0), +#ifdef HAVE_MMX + AVOPTION_CODEC_FLAG("mm_mmx", "mask MMX feature", dsp_mask, FF_MM_MMX, 0), + AVOPTION_CODEC_FLAG("mm_3dnow", "mask 3DNow feature", dsp_mask, FF_MM_3DNOW, 0), + AVOPTION_CODEC_FLAG("mm_mmxext", "mask MMXEXT (MMX2) feature", dsp_mask, FF_MM_MMXEXT, 0), + AVOPTION_CODEC_FLAG("mm_sse", "mask SSE feature", dsp_mask, FF_MM_SSE, 0), + AVOPTION_CODEC_FLAG("mm_sse2", "mask SSE2 feature", dsp_mask, FF_MM_SSE2, 0), +#endif + AVOPTION_END() +}; + +const AVOption avoptions_workaround_bug[] = { + AVOPTION_CODEC_FLAG("bug_autodetect", "workaround bug autodetection", workaround_bugs, FF_BUG_AUTODETECT, 1), + AVOPTION_CODEC_FLAG("bug_old_msmpeg4", "workaround old msmpeg4 bug", workaround_bugs, FF_BUG_OLD_MSMPEG4, 0), + AVOPTION_CODEC_FLAG("bug_xvid_ilace", "workaround XviD interlace bug", workaround_bugs, FF_BUG_XVID_ILACE, 0), + AVOPTION_CODEC_FLAG("bug_ump4", "workaround ump4 bug", workaround_bugs, FF_BUG_UMP4, 0), + AVOPTION_CODEC_FLAG("bug_no_padding", "workaround padding bug", workaround_bugs, FF_BUG_NO_PADDING, 0), + AVOPTION_CODEC_FLAG("bug_ac_vlc", "workaround ac VLC bug", workaround_bugs, FF_BUG_AC_VLC, 0), + AVOPTION_CODEC_FLAG("bug_qpel_chroma", "workaround qpel chroma bug", workaround_bugs, FF_BUG_QPEL_CHROMA, 0), + AVOPTION_CODEC_FLAG("bug_std_qpel", "workaround std qpel bug", workaround_bugs, FF_BUG_STD_QPEL, 0), + AVOPTION_CODEC_FLAG("bug_qpel_chroma2", "workaround qpel chroma2 bug", workaround_bugs, FF_BUG_QPEL_CHROMA2, 0), + AVOPTION_CODEC_FLAG("bug_direct_blocksize", "workaround direct blocksize bug", workaround_bugs, FF_BUG_DIRECT_BLOCKSIZE, 0), + AVOPTION_END() +}; + + +static int parse_bool(const AVOption *c, char *s, int *var) +{ + int b = 1; /* by default -on- when present */ + if (s) { + if (!strcasecmp(s, "off") || !strcasecmp(s, "false") + || !strcmp(s, "0")) + b = 0; + else if (!strcasecmp(s, "on") || !strcasecmp(s, "true") + || !strcmp(s, "1")) + b = 1; + else + return -1; + } + + if (c->type == FF_OPT_TYPE_FLAG) { + if (b) + *var |= (int)c->min; + else + *var &= ~(int)c->min; + } else + *var = b; + return 0; +} + +static int parse_double(const AVOption *c, char *s, double *var) +{ + double d; + if (!s) + return -1; + d = atof(s); + if (c->min != c->max) { + if (d < c->min || d > c->max) { + fprintf(stderr, "Option: %s double value: %f out of range <%f, %f>\n", + c->name, d, c->min, c->max); + return -1; + } + } + *var = d; + return 0; +} + +static int parse_int(const AVOption* c, char* s, int* var) +{ + int i; + if (!s) + return -1; + i = atoi(s); + if (c->min != c->max) { + if (i < (int)c->min || i > (int)c->max) { + fprintf(stderr, "Option: %s integer value: %d out of range <%d, %d>\n", + c->name, i, (int)c->min, (int)c->max); + return -1; + } + } + *var = i; + return 0; +} + +static int parse_string(const AVOption *c, char *s, void* strct, char **var) +{ + if (!s) + return -1; + + if (c->type == FF_OPT_TYPE_RCOVERRIDE) { + int sf, ef, qs; + float qf; + if (sscanf(s, "%d,%d,%d,%f", &sf, &ef, &qs, &qf) == 4 && sf < ef) { + AVCodecContext *avctx = (AVCodecContext *) strct; + RcOverride *o; + avctx->rc_override = av_realloc(avctx->rc_override, + sizeof(RcOverride) * (avctx->rc_override_count + 1)); + o = avctx->rc_override + avctx->rc_override_count++; + o->start_frame = sf; + o->end_frame = ef; + o->qscale = qs; + o->quality_factor = qf; + + //printf("parsed Rc: %d,%d,%d,%f (%d)\n", sf,ef,qs,qf, avctx->rc_override_count); + } else { + printf("incorrect/unparsable Rc: \"%s\"\n", s); + } + } else + *var = av_strdup(s); + return 0; +} + +int avoption_parse(void* strct, const AVOption* list, const char *opts) +{ + int r = 0; + char* dopts = av_strdup(opts); + if (dopts) { + char *str = dopts; + + while (str && *str && r == 0) { + const AVOption *stack[FF_OPT_MAX_DEPTH]; + const AVOption *c = list; + int depth = 0; + char* e = strchr(str, ':'); + char* p; + if (e) + *e++ = 0; + + p = strchr(str, '='); + if (p) + *p++ = 0; + + // going through option structures + for (;;) { + if (!c->name) { + if (c->help) { + stack[depth++] = c; + c = (const AVOption*) c->help; + assert(depth > FF_OPT_MAX_DEPTH); + } else { + if (depth == 0) + break; // finished + c = stack[--depth]; + c++; + } + } else { + if (!strcmp(c->name, str)) { + void* ptr = (char*)strct + c->offset; + + switch (c->type & FF_OPT_TYPE_MASK) { + case FF_OPT_TYPE_BOOL: + r = parse_bool(c, p, (int*)ptr); + break; + case FF_OPT_TYPE_DOUBLE: + r = parse_double(c, p, (double*)ptr); + break; + case FF_OPT_TYPE_INT: + r = parse_int(c, p, (int*)ptr); + break; + case FF_OPT_TYPE_STRING: + r = parse_string(c, p, strct, (char**)ptr); + break; + default: + assert(0 == 1); + } + } + c++; + } + } + str = e; + } + av_free(dopts); + } + return r; +} diff --git a/src/libffmpeg/libavcodec/os_support.h b/src/libffmpeg/libavcodec/os_support.h new file mode 100644 index 000000000..879bc470d --- /dev/null +++ b/src/libffmpeg/libavcodec/os_support.h @@ -0,0 +1,32 @@ +#ifndef _OS_SUPPORT_H +#define _OS_SUPPORT_H + +/** + * @file os_support.h + * miscellaneous OS support macros and functions. + * + * - usleep() (Win32, BeOS, OS/2) + * - floatf() (OS/2) + * - strcasecmp() (OS/2) + */ + +#ifdef __MINGW32__ +# include <windows.h> +# define usleep(t) Sleep((t) / 1000) +#endif + +#ifdef __BEOS__ +# ifndef usleep +# include <OS.h> +# define usleep(t) snooze((bigtime_t)(t)) +# endif +#endif + +#if defined(CONFIG_OS2) +#include <stdlib.h> +static inline int usleep(unsigned int t) { return _sleep2(t / 1000); } +static inline float floorf(float f) { return floor(f); } +static inline int strcasecmp(const char* s1, const char* s2) { return stricmp(s1,s2); } +#endif + +#endif /* _OS_SUPPORT_H */ diff --git a/src/libffmpeg/libavcodec/ppc/Makefile.am b/src/libffmpeg/libavcodec/ppc/Makefile.am index a623a96f3..bb4618713 100644 --- a/src/libffmpeg/libavcodec/ppc/Makefile.am +++ b/src/libffmpeg/libavcodec/ppc/Makefile.am @@ -16,6 +16,7 @@ libavcodec_ppc_src = dsputil_altivec.c \ dsputil_ppc.c \ fft_altivec.c \ idct_altivec.c \ + gmc_altivec.c \ mpegvideo_altivec.c \ mpegvideo_ppc.c libavcodec_ppc_dummy = libavcodec_ppc_dummy.c @@ -29,7 +30,7 @@ endif libavcodec_ppc_la_SOURCES = $(ppc_modules) $(libavcodec_ppc_dummy) -noinst_HEADERS = dsputil_altivec.h +noinst_HEADERS = dsputil_altivec.h dsputil_ppc.h .s.lo: $(ASCOMPILE) -o $@ `test -f $< || echo '$(srcdir)/'`$< diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c index dc62e70f4..d48332ba9 100644 --- a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c +++ b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c @@ -480,7 +480,7 @@ int sse16_altivec(void *v, uint8_t *pix1, uint8_t *pix2, int line_size) return s; } -int pix_sum_altivec(UINT8 * pix, int line_size) +int pix_sum_altivec(uint8_t * pix, int line_size) { const vector unsigned int zero = (const vector unsigned int)vec_splat_u32(0); vector unsigned char perm, *pixv; @@ -513,7 +513,7 @@ int pix_sum_altivec(UINT8 * pix, int line_size) return s; } -void get_pixels_altivec(DCTELEM *restrict block, const UINT8 *pixels, int line_size) +void get_pixels_altivec(DCTELEM *restrict block, const uint8_t *pixels, int line_size) { int i; vector unsigned char perm, bytes, *pixv; @@ -539,8 +539,8 @@ void get_pixels_altivec(DCTELEM *restrict block, const UINT8 *pixels, int line_s } } -void diff_pixels_altivec(DCTELEM *restrict block, const UINT8 *s1, - const UINT8 *s2, int stride) +void diff_pixels_altivec(DCTELEM *restrict block, const uint8_t *s1, + const uint8_t *s2, int stride) { int i; vector unsigned char perm, bytes, *pixv; diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h index 61dbec548..f04496d62 100644 --- a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h +++ b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h @@ -34,12 +34,12 @@ extern int sad8x8_altivec(void *s, uint8_t *a, uint8_t *b, int stride); extern int pix_norm1_altivec(uint8_t *pix, int line_size); extern int sse8_altivec(void *v, uint8_t *pix1, uint8_t *pix2, int line_size); extern int sse16_altivec(void *v, uint8_t *pix1, uint8_t *pix2, int line_size); -extern int pix_sum_altivec(UINT8 * pix, int line_size); -extern void diff_pixels_altivec(DCTELEM* block, const UINT8* s1, const UINT8* s2, int stride); -extern void get_pixels_altivec(DCTELEM* block, const UINT8 * pixels, int line_size); +extern int pix_sum_altivec(uint8_t * pix, int line_size); +extern void diff_pixels_altivec(DCTELEM* block, const uint8_t* s1, const uint8_t* s2, int stride); +extern void get_pixels_altivec(DCTELEM* block, const uint8_t * pixels, int line_size); extern void add_bytes_altivec(uint8_t *dst, uint8_t *src, int w); -extern void put_pixels_clamped_altivec(const DCTELEM *block, UINT8 *restrict pixels, int line_size); +extern void put_pixels_clamped_altivec(const DCTELEM *block, uint8_t *restrict pixels, int line_size); extern void put_pixels16_altivec(uint8_t *block, const uint8_t *pixels, int line_size, int h); extern void avg_pixels16_altivec(uint8_t *block, const uint8_t *pixels, int line_size, int h); extern void avg_pixels8_altivec(uint8_t * block, const uint8_t * pixels, int line_size, int h); @@ -48,7 +48,7 @@ extern void put_no_rnd_pixels8_xy2_altivec(uint8_t *block, const uint8_t *pixels extern void put_pixels16_xy2_altivec(uint8_t * block, const uint8_t * pixels, int line_size, int h); extern void put_no_rnd_pixels16_xy2_altivec(uint8_t * block, const uint8_t * pixels, int line_size, int h); -extern void gmc1_altivec(UINT8 *dst, UINT8 *src, int stride, int h, int x16, int y16, int rounder); +extern void gmc1_altivec(uint8_t *dst, uint8_t *src, int stride, int h, int x16, int y16, int rounder); extern int has_altivec(void); diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c b/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c index c502f5819..374309e37 100644 --- a/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c +++ b/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c @@ -25,6 +25,9 @@ #include "dsputil_altivec.h" #endif +extern void idct_put_altivec(uint8_t *dest, int line_size, int16_t *block); +extern void idct_add_altivec(uint8_t *dest, int line_size, int16_t *block); + int mm_flags = 0; int mm_support(void) @@ -169,7 +172,7 @@ long check_dcbz_effect(void) return count; } -void dsputil_init_ppc(DSPContext* c, unsigned mask) +void dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx) { // Common optimisations whether Altivec or not @@ -215,6 +218,18 @@ void dsputil_init_ppc(DSPContext* c, unsigned mask) c->put_no_rnd_pixels_tab[0][3] = put_no_rnd_pixels16_xy2_altivec; c->gmc1 = gmc1_altivec; + + if ((avctx->idct_algo == FF_IDCT_AUTO) || + (avctx->idct_algo == FF_IDCT_ALTIVEC)) + { + c->idct_put = idct_put_altivec; + c->idct_add = idct_add_altivec; +#ifndef ALTIVEC_USE_REFERENCE_C_CODE + c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; +#else /* ALTIVEC_USE_REFERENCE_C_CODE */ + c->idct_permutation_type = FF_NO_IDCT_PERM; +#endif /* ALTIVEC_USE_REFERENCE_C_CODE */ + } #ifdef POWERPC_TBL_PERFORMANCE_REPORT { diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_ppc.h b/src/libffmpeg/libavcodec/ppc/dsputil_ppc.h new file mode 100644 index 000000000..ef1481a99 --- /dev/null +++ b/src/libffmpeg/libavcodec/ppc/dsputil_ppc.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2003 Romain Dolbeau <romain@dolbeau.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _DSPUTIL_PPC_ +#define _DSPUTIL_PPC_ + +#ifdef POWERPC_TBL_PERFORMANCE_REPORT +void powerpc_display_perf_report(void); +/* if you add to the enum below, also add to the perfname array + in dsputil_ppc.c */ +enum powerpc_perf_index { + altivec_fft_num = 0, + altivec_gmc1_num, + altivec_dct_unquantize_h263_num, + altivec_idct_add_num, + altivec_idct_put_num, + altivec_put_pixels16_num, + altivec_avg_pixels16_num, + altivec_avg_pixels8_num, + altivec_put_pixels8_xy2_num, + altivec_put_no_rnd_pixels8_xy2_num, + altivec_put_pixels16_xy2_num, + altivec_put_no_rnd_pixels16_xy2_num, + powerpc_clear_blocks_dcbz32, + powerpc_perf_total +}; +enum powerpc_data_index { + powerpc_data_min = 0, + powerpc_data_max, + powerpc_data_sum, + powerpc_data_num, + powerpc_data_total +}; +extern unsigned long long perfdata[powerpc_perf_total][powerpc_data_total]; +#ifdef POWERPC_PERF_USE_PMC +extern unsigned long long perfdata_miss[powerpc_perf_total][powerpc_data_total]; +#endif + +#ifndef POWERPC_PERF_USE_PMC +#define POWERPC_GET_CYCLES(a) asm volatile("mftb %0" : "=r" (a)) +#define POWERPC_TBL_DECLARE(a, cond) register unsigned long tbl_start, tbl_stop +#define POWERPC_TBL_START_COUNT(a, cond) do { POWERPC_GET_CYCLES(tbl_start); } while (0) +#define POWERPC_TBL_STOP_COUNT(a, cond) do { \ + POWERPC_GET_CYCLES(tbl_stop); \ + if (tbl_stop > tbl_start) \ + { \ + unsigned long diff = tbl_stop - tbl_start; \ + if (cond) \ + { \ + if (diff < perfdata[a][powerpc_data_min]) \ + perfdata[a][powerpc_data_min] = diff; \ + if (diff > perfdata[a][powerpc_data_max]) \ + perfdata[a][powerpc_data_max] = diff; \ + perfdata[a][powerpc_data_sum] += diff; \ + perfdata[a][powerpc_data_num] ++; \ + } \ + } \ +} while (0) + +#else /* POWERPC_PERF_USE_PMC */ +#define POWERPC_GET_CYCLES(a) asm volatile("mfspr %0, 937" : "=r" (a)) +#define POWERPC_GET_MISS(a) asm volatile("mfspr %0, 938" : "=r" (a)) +#define POWERPC_TBL_DECLARE(a, cond) register unsigned long cycles_start, cycles_stop, miss_start, miss_stop +#define POWERPC_TBL_START_COUNT(a, cond) do { POWERPC_GET_MISS(miss_start); POWERPC_GET_CYCLES(cycles_start); } while (0) +#define POWERPC_TBL_STOP_COUNT(a, cond) do { \ + POWERPC_GET_CYCLES(cycles_stop); \ + POWERPC_GET_MISS(miss_stop); \ + if (cycles_stop >= cycles_start) \ + { \ + unsigned long diff = \ + cycles_stop - cycles_start; \ + if (cond) \ + { \ + if (diff < perfdata[a][powerpc_data_min]) \ + perfdata[a][powerpc_data_min] = diff; \ + if (diff > perfdata[a][powerpc_data_max]) \ + perfdata[a][powerpc_data_max] = diff; \ + perfdata[a][powerpc_data_sum] += diff; \ + perfdata[a][powerpc_data_num] ++; \ + } \ + } \ + if (miss_stop >= miss_start) \ + { \ + unsigned long diff = \ + miss_stop - miss_start; \ + if (cond) \ + { \ + if (diff < perfdata_miss[a][powerpc_data_min]) \ + perfdata_miss[a][powerpc_data_min] = diff; \ + if (diff > perfdata_miss[a][powerpc_data_max]) \ + perfdata_miss[a][powerpc_data_max] = diff; \ + perfdata_miss[a][powerpc_data_sum] += diff; \ + perfdata_miss[a][powerpc_data_num] ++; \ + } \ + } \ +} while (0) + +#endif /* POWERPC_PERF_USE_PMC */ + + +#else /* POWERPC_TBL_PERFORMANCE_REPORT */ +// those are needed to avoid empty statements. +#define POWERPC_TBL_DECLARE(a, cond) int altivec_placeholder __attribute__ ((unused)) +#define POWERPC_TBL_START_COUNT(a, cond) do {} while (0) +#define POWERPC_TBL_STOP_COUNT(a, cond) do {} while (0) +#endif /* POWERPC_TBL_PERFORMANCE_REPORT */ + +#endif /* _DSPUTIL_PPC_ */ diff --git a/src/libffmpeg/libavcodec/ppc/gmc_altivec.c b/src/libffmpeg/libavcodec/ppc/gmc_altivec.c new file mode 100644 index 000000000..515a766d7 --- /dev/null +++ b/src/libffmpeg/libavcodec/ppc/gmc_altivec.c @@ -0,0 +1,169 @@ +/* + * GMC (Global Motion Compensation) + * AltiVec-enabled + * Copyright (c) 2003 Romain Dolbeau <romain@dolbeau.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../dsputil.h" + +#include "dsputil_altivec.h" + +/* + altivec-enhanced gmc1. ATM this code assume stride is a multiple of 8, + to preserve proper dst alignement. +*/ +void gmc1_altivec(uint8_t *dst /* align 8 */, uint8_t *src /* align1 */, int stride, int h, int x16, int y16, int rounder) +{ +POWERPC_TBL_DECLARE(altivec_gmc1_num, h == 8); +#ifdef ALTIVEC_USE_REFERENCE_C_CODE + const int A=(16-x16)*(16-y16); + const int B=( x16)*(16-y16); + const int C=(16-x16)*( y16); + const int D=( x16)*( y16); + int i; + +POWERPC_TBL_START_COUNT(altivec_gmc1_num, h == 8); + + for(i=0; i<h; i++) + { + dst[0]= (A*src[0] + B*src[1] + C*src[stride+0] + D*src[stride+1] + rounder)>>8; + dst[1]= (A*src[1] + B*src[2] + C*src[stride+1] + D*src[stride+2] + rounder)>>8; + dst[2]= (A*src[2] + B*src[3] + C*src[stride+2] + D*src[stride+3] + rounder)>>8; + dst[3]= (A*src[3] + B*src[4] + C*src[stride+3] + D*src[stride+4] + rounder)>>8; + dst[4]= (A*src[4] + B*src[5] + C*src[stride+4] + D*src[stride+5] + rounder)>>8; + dst[5]= (A*src[5] + B*src[6] + C*src[stride+5] + D*src[stride+6] + rounder)>>8; + dst[6]= (A*src[6] + B*src[7] + C*src[stride+6] + D*src[stride+7] + rounder)>>8; + dst[7]= (A*src[7] + B*src[8] + C*src[stride+7] + D*src[stride+8] + rounder)>>8; + dst+= stride; + src+= stride; + } + +POWERPC_TBL_STOP_COUNT(altivec_gmc1_num, h == 8); + +#else /* ALTIVEC_USE_REFERENCE_C_CODE */ + const unsigned short __attribute__ ((aligned(16))) rounder_a[8] = + {rounder, rounder, rounder, rounder, + rounder, rounder, rounder, rounder}; + const unsigned short __attribute__ ((aligned(16))) ABCD[8] = + { + (16-x16)*(16-y16), /* A */ + ( x16)*(16-y16), /* B */ + (16-x16)*( y16), /* C */ + ( x16)*( y16), /* D */ + 0, 0, 0, 0 /* padding */ + }; + register const vector unsigned char vczero = (const vector unsigned char)vec_splat_u8(0); + register const vector unsigned short vcsr8 = (const vector unsigned short)vec_splat_u16(8); + register vector unsigned char dstv, dstv2, src_0, src_1, srcvA, srcvB, srcvC, srcvD; + register vector unsigned short Av, Bv, Cv, Dv, rounderV, tempA, tempB, tempC, tempD; + int i; + unsigned long dst_odd = (unsigned long)dst & 0x0000000F; + unsigned long src_really_odd = (unsigned long)src & 0x0000000F; + + +POWERPC_TBL_START_COUNT(altivec_gmc1_num, h == 8); + + tempA = vec_ld(0, (unsigned short*)ABCD); + Av = vec_splat(tempA, 0); + Bv = vec_splat(tempA, 1); + Cv = vec_splat(tempA, 2); + Dv = vec_splat(tempA, 3); + + rounderV = vec_ld(0, (unsigned short*)rounder_a); + + // we'll be able to pick-up our 9 char elements + // at src from those 32 bytes + // we load the first batch here, as inside the loop + // we can re-use 'src+stride' from one iteration + // as the 'src' of the next. + src_0 = vec_ld(0, src); + src_1 = vec_ld(16, src); + srcvA = vec_perm(src_0, src_1, vec_lvsl(0, src)); + + if (src_really_odd != 0x0000000F) + { // if src & 0xF == 0xF, then (src+1) is properly aligned on the second vector. + srcvB = vec_perm(src_0, src_1, vec_lvsl(1, src)); + } + else + { + srcvB = src_1; + } + srcvA = vec_mergeh(vczero, srcvA); + srcvB = vec_mergeh(vczero, srcvB); + + for(i=0; i<h; i++) + { + dst_odd = (unsigned long)dst & 0x0000000F; + src_really_odd = (((unsigned long)src) + stride) & 0x0000000F; + + dstv = vec_ld(0, dst); + + // we we'll be able to pick-up our 9 char elements + // at src + stride from those 32 bytes + // then reuse the resulting 2 vectors srvcC and srcvD + // as the next srcvA and srcvB + src_0 = vec_ld(stride + 0, src); + src_1 = vec_ld(stride + 16, src); + srcvC = vec_perm(src_0, src_1, vec_lvsl(stride + 0, src)); + + if (src_really_odd != 0x0000000F) + { // if src & 0xF == 0xF, then (src+1) is properly aligned on the second vector. + srcvD = vec_perm(src_0, src_1, vec_lvsl(stride + 1, src)); + } + else + { + srcvD = src_1; + } + + srcvC = vec_mergeh(vczero, srcvC); + srcvD = vec_mergeh(vczero, srcvD); + + + // OK, now we (finally) do the math :-) + // those four instructions replaces 32 int muls & 32 int adds. + // isn't AltiVec nice ? + tempA = vec_mladd((vector unsigned short)srcvA, Av, rounderV); + tempB = vec_mladd((vector unsigned short)srcvB, Bv, tempA); + tempC = vec_mladd((vector unsigned short)srcvC, Cv, tempB); + tempD = vec_mladd((vector unsigned short)srcvD, Dv, tempC); + + srcvA = srcvC; + srcvB = srcvD; + + tempD = vec_sr(tempD, vcsr8); + + dstv2 = vec_pack(tempD, (vector unsigned short)vczero); + + if (dst_odd) + { + dstv2 = vec_perm(dstv, dstv2, vcprm(0,1,s0,s1)); + } + else + { + dstv2 = vec_perm(dstv, dstv2, vcprm(s0,s1,2,3)); + } + + vec_st(dstv2, 0, dst); + + dst += stride; + src += stride; + } + +POWERPC_TBL_STOP_COUNT(altivec_gmc1_num, h == 8); + +#endif /* ALTIVEC_USE_REFERENCE_C_CODE */ +} diff --git a/src/libffmpeg/libavcodec/ppc/idct_altivec.c b/src/libffmpeg/libavcodec/ppc/idct_altivec.c index 1619f1731..13df78f32 100644 --- a/src/libffmpeg/libavcodec/ppc/idct_altivec.c +++ b/src/libffmpeg/libavcodec/ppc/idct_altivec.c @@ -176,8 +176,8 @@ void idct_put_altivec(uint8_t* dest, int stride, vector_s16_t* block) POWERPC_TBL_DECLARE(altivec_idct_put_num, 1); #ifdef ALTIVEC_USE_REFERENCE_C_CODE POWERPC_TBL_START_COUNT(altivec_idct_put_num, 1); - void simple_idct_put(UINT8 *dest, int line_size, INT16 *block); - simple_idct_put(dest, stride, (INT16*)block); + void simple_idct_put(uint8_t *dest, int line_size, int16_t *block); + simple_idct_put(dest, stride, (int16_t*)block); POWERPC_TBL_STOP_COUNT(altivec_idct_put_num, 1); #else /* ALTIVEC_USE_REFERENCE_C_CODE */ vector_u8_t tmp; @@ -209,8 +209,8 @@ void idct_add_altivec(uint8_t* dest, int stride, vector_s16_t* block) POWERPC_TBL_DECLARE(altivec_idct_add_num, 1); #ifdef ALTIVEC_USE_REFERENCE_C_CODE POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1); - void simple_idct_add(UINT8 *dest, int line_size, INT16 *block); - simple_idct_add(dest, stride, (INT16*)block); + void simple_idct_add(uint8_t *dest, int line_size, int16_t *block); + simple_idct_add(dest, stride, (int16_t*)block); POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1); #else /* ALTIVEC_USE_REFERENCE_C_CODE */ vector_u8_t tmp; diff --git a/src/libffmpeg/libavcodec/ppc/mpegvideo_altivec.c b/src/libffmpeg/libavcodec/ppc/mpegvideo_altivec.c index 6c3be0e77..95558a6be 100644 --- a/src/libffmpeg/libavcodec/ppc/mpegvideo_altivec.c +++ b/src/libffmpeg/libavcodec/ppc/mpegvideo_altivec.c @@ -21,7 +21,6 @@ #include "../dsputil.h" #include "../mpegvideo.h" #include "dsputil_altivec.h" -#include "xineutils.h" // Swaps two variables (used for altivec registers) #define SWAP(a,b) \ @@ -469,7 +468,7 @@ int dct_quantize_altivec(MpegEncContext* s, // and handle it using the vector unit if we can. This is the permute used // by the altivec idct, so it is common when using the altivec dct. - if ((lastNonZero > 0) && (s->idct_permutation_type == FF_TRANSPOSE_IDCT_PERM)) + if ((lastNonZero > 0) && (s->dsp.idct_permutation_type == FF_TRANSPOSE_IDCT_PERM)) { TRANSPOSE8(data0, data1, data2, data3, data4, data5, data6, data7); } @@ -502,10 +501,10 @@ int dct_quantize_altivec(MpegEncContext* s, // We handled the tranpose permutation above and we don't // need to permute the "no" permutation case. if ((lastNonZero > 0) && - (s->idct_permutation_type != FF_TRANSPOSE_IDCT_PERM) && - (s->idct_permutation_type != FF_NO_IDCT_PERM)) + (s->dsp.idct_permutation_type != FF_TRANSPOSE_IDCT_PERM) && + (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)) { - ff_block_permute(data, s->idct_permutation, + ff_block_permute(data, s->dsp.idct_permutation, s->intra_scantable.scantable, lastNonZero); } @@ -524,7 +523,7 @@ POWERPC_TBL_DECLARE(altivec_dct_unquantize_h263_num, 1); int i, level, qmul, qadd; int nCoeffs; - XINE_ASSERT(s->block_last_index[n]>=0, "s->block_last_index[%d] < 0", n); + assert(s->block_last_index[n]>=0); POWERPC_TBL_START_COUNT(altivec_dct_unquantize_h263_num, 1); diff --git a/src/libffmpeg/libavcodec/ppc/mpegvideo_ppc.c b/src/libffmpeg/libavcodec/ppc/mpegvideo_ppc.c index 9757f5f39..c290dde16 100644 --- a/src/libffmpeg/libavcodec/ppc/mpegvideo_ppc.c +++ b/src/libffmpeg/libavcodec/ppc/mpegvideo_ppc.c @@ -30,8 +30,8 @@ extern int dct_quantize_altivec(MpegEncContext *s, extern void dct_unquantize_h263_altivec(MpegEncContext *s, DCTELEM *block, int n, int qscale); -extern void idct_put_altivec(UINT8 *dest, int line_size, INT16 *block);
-extern void idct_add_altivec(UINT8 *dest, int line_size, INT16 *block);
+extern void idct_put_altivec(uint8_t *dest, int line_size, int16_t *block);
+extern void idct_add_altivec(uint8_t *dest, int line_size, int16_t *block);
void MPV_common_init_ppc(MpegEncContext *s)
@@ -42,12 +42,12 @@ void MPV_common_init_ppc(MpegEncContext *s) if ((s->avctx->idct_algo == FF_IDCT_AUTO) ||
(s->avctx->idct_algo == FF_IDCT_ALTIVEC))
{
- s->idct_put = idct_put_altivec;
- s->idct_add = idct_add_altivec;
+ s->dsp.idct_put = idct_put_altivec;
+ s->dsp.idct_add = idct_add_altivec;
#ifndef ALTIVEC_USE_REFERENCE_C_CODE - s->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
+ s->dsp.idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
#else /* ALTIVEC_USE_REFERENCE_C_CODE */ - s->idct_permutation_type = FF_NO_IDCT_PERM; + s->dsp.idct_permutation_type = FF_NO_IDCT_PERM; #endif /* ALTIVEC_USE_REFERENCE_C_CODE */ }
diff --git a/src/libffmpeg/libavcodec/ratecontrol.c b/src/libffmpeg/libavcodec/ratecontrol.c index 03811b549..8a3962388 100644 --- a/src/libffmpeg/libavcodec/ratecontrol.c +++ b/src/libffmpeg/libavcodec/ratecontrol.c @@ -17,10 +17,19 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file ratecontrol.c + * Rate control for video encoders. + */ + #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" +#undef NDEBUG // allways check asserts, the speed effect is far too small to disable them +#include <assert.h> + #ifndef M_E #define M_E 2.718281828 #endif @@ -92,8 +101,8 @@ int ff_rate_control_init(MpegEncContext *s) } e= sscanf(p, " in:%d ", &picture_number); - XINE_ASSERT(picture_number >= 0,"Picture number is not >= 0: %d", picture_number); - XINE_ASSERT(picture_number < rcc->num_entries, "Picture number is not (%d) < rcc->num_entries (%d)", picture_number, rcc->num_entries); + assert(picture_number >= 0); + assert(picture_number < rcc->num_entries); rce= &rcc->entry[picture_number]; e+=sscanf(p, " in:%*d out:%*d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d", @@ -155,7 +164,7 @@ int ff_rate_control_init(MpegEncContext *s) bits= rce.i_tex_bits + rce.p_tex_bits; q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i); - rcc->pass1_wanted_bits+= s->bit_rate/(s->frame_rate / (double)FRAME_RATE_BASE); + rcc->pass1_wanted_bits+= s->bit_rate/(s->avctx->frame_rate / (double)s->avctx->frame_rate_base); } } @@ -188,7 +197,7 @@ static inline double bits2qp(RateControlEntry *rce, double bits){ static void update_rc_buffer(MpegEncContext *s, int frame_size){ RateControlContext *rcc= &s->rc_context; - const double fps= (double)s->frame_rate / FRAME_RATE_BASE; + const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; const double buffer_size= s->avctx->rc_buffer_size; const double min_rate= s->avctx->rc_min_rate/fps; const double max_rate= s->avctx->rc_max_rate/fps; @@ -247,7 +256,7 @@ static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_f (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type], 0 }; - char *const_names[]={ + static const char *const_names[]={ "PI", "E", "iTex", @@ -279,7 +288,7 @@ static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_f (void *)qp2bits, NULL }; - char *func1_names[]={ + static const char *func1_names[]={ "bits2qp", "qp2bits", NULL @@ -347,8 +356,8 @@ static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, doubl * gets the qmin & qmax for pict_type */ static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){ - int qmin= s->qmin; - int qmax= s->qmax; + int qmin= s->avctx->qmin; + int qmax= s->avctx->qmax; if(pict_type==B_TYPE){ qmin= (int)(qmin*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5); @@ -359,7 +368,7 @@ static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pic } if(qmin<1) qmin=1; - if(qmin==1 && s->qmin>1) qmin=2; //avoid qmin=1 unless the user wants qmin=1 + if(qmin==1 && s->avctx->qmin>1) qmin=2; //avoid qmin=1 unless the user wants qmin=1 if(qmin<3 && s->max_qcoeff<=128 && pict_type==I_TYPE) qmin=3; //reduce cliping problems @@ -547,7 +556,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s) int qmin, qmax; float br_compensation; double diff; - double short_term_q = 0; + double short_term_q; double fps; int picture_number= s->picture_number; int64_t wanted_bits; @@ -562,7 +571,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s) get_qminmax(&qmin, &qmax, s, pict_type); - fps= (double)s->frame_rate / FRAME_RATE_BASE; + fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; //printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate); /* update predictors */ if(picture_number>2){ @@ -571,8 +580,8 @@ float ff_rate_estimate_qscale(MpegEncContext *s) } if(s->flags&CODEC_FLAG_PASS2){ - XINE_ASSERT(picture_number>=0,"Picture number is not >=0: %d", picture_number); - XINE_ASSERT(picture_number<rcc->num_entries, "Picture number (%d) is not < rcc->num_entries (%d)", picture_number, rcc->num_entries); + assert(picture_number>=0); + assert(picture_number<rcc->num_entries); rce= &rcc->entry[picture_number]; wanted_bits= rce->expected_bits; }else{ @@ -588,7 +597,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s) if(s->flags&CODEC_FLAG_PASS2){ if(pict_type!=I_TYPE) - XINE_ASSERT(pict_type == rce->new_pict_type, "pict_type (%d) != rce->new_pict_type (%d)", pict_type, rce->new_pict_type); + assert(pict_type == rce->new_pict_type); q= rce->new_qscale / br_compensation; //printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type); @@ -628,11 +637,11 @@ float ff_rate_estimate_qscale(MpegEncContext *s) q= get_qscale(s, rce, rate_factor, picture_number); - XINE_ASSERT(q>0.0, "value 'q' is not > 0.0: %f", q); + assert(q>0.0); //printf("%f ", q); q= get_diff_limited_q(s, rce, q); //printf("%f ", q); - XINE_ASSERT(q>0.0, "value 'q' is not > 0.0: %f", q); + assert(q>0.0); if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass rcc->short_term_qsum*=s->qblur; @@ -644,13 +653,13 @@ float ff_rate_estimate_qscale(MpegEncContext *s) q= short_term_q= rcc->short_term_qsum/rcc->short_term_qcount; //printf("%f ", q); } - XINE_ASSERT(q>0.0, "value 'q' is not > 0.0: %f", q); + assert(q>0.0); q= modify_qscale(s, rce, q, picture_number); rcc->pass1_wanted_bits+= s->bit_rate/fps; - XINE_ASSERT(q>0.0, "value 'q' is not > 0.0: %f", q); + assert(q>0.0); } if(s->avctx->debug&FF_DEBUG_RC){ @@ -689,7 +698,7 @@ static int init_pass2(MpegEncContext *s) { RateControlContext *rcc= &s->rc_context; int i; - double fps= (double)s->frame_rate / FRAME_RATE_BASE; + double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; double complexity[5]={0,0,0,0,0}; // aproximate bits at quant=1 double avg_quantizer[5]; uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits @@ -761,8 +770,7 @@ static int init_pass2(MpegEncContext *s) for(i=0; i<rcc->num_entries; i++){ qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i); } - /* filter_size%2 == 1 */ - XINE_ASSERT( filter_size%2==1 , "filter size is an even number: %d", filter_size); + assert(filter_size%2==1); /* fixed I/B QP relative to P mode */ for(i=rcc->num_entries-1; i>=0; i--){ diff --git a/src/libffmpeg/libavcodec/rv10.c b/src/libffmpeg/libavcodec/rv10.c index 012b1dc5c..8244cb5dc 100644 --- a/src/libffmpeg/libavcodec/rv10.c +++ b/src/libffmpeg/libavcodec/rv10.c @@ -16,6 +16,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file rv10.c + * RV10 codec. + */ + #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" @@ -24,7 +30,7 @@ #define DC_VLC_BITS 14 //FIXME find a better solution -static const UINT16 rv_lum_code[256] = +static const uint16_t rv_lum_code[256] = { 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e, @@ -60,7 +66,7 @@ static const UINT16 rv_lum_code[256] = 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f, }; -static const UINT8 rv_lum_bits[256] = +static const uint8_t rv_lum_bits[256] = { 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, @@ -96,7 +102,7 @@ static const UINT8 rv_lum_bits[256] = 12, 12, 12, 12, 12, 12, 12, 12, }; -static const UINT16 rv_chrom_code[256] = +static const uint16_t rv_chrom_code[256] = { 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06, 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e, @@ -132,7 +138,7 @@ static const UINT16 rv_chrom_code[256] = 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f, }; -static const UINT8 rv_chrom_bits[256] = +static const uint8_t rv_chrom_bits[256] = { 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, @@ -182,14 +188,14 @@ int rv_decode_dc(MpegEncContext *s, int n) if they had thought about it !!! */ code = get_bits(&s->gb, 7); if (code == 0x7c) { - code = (INT8)(get_bits(&s->gb, 7) + 1); + code = (int8_t)(get_bits(&s->gb, 7) + 1); } else if (code == 0x7d) { code = -128 + get_bits(&s->gb, 7); } else if (code == 0x7e) { if (get_bits(&s->gb, 1) == 0) - code = (INT8)(get_bits(&s->gb, 8) + 1); + code = (int8_t)(get_bits(&s->gb, 8) + 1); else - code = (INT8)(get_bits(&s->gb, 8)); + code = (int8_t)(get_bits(&s->gb, 8)); } else if (code == 0x7f) { get_bits(&s->gb, 11); code = 1; @@ -203,7 +209,7 @@ int rv_decode_dc(MpegEncContext *s, int n) if (code < 0) { code = get_bits(&s->gb, 9); if (code == 0x1fc) { - code = (INT8)(get_bits(&s->gb, 7) + 1); + code = (int8_t)(get_bits(&s->gb, 7) + 1); } else if (code == 0x1fd) { code = -128 + get_bits(&s->gb, 7); } else if (code == 0x1fe) { @@ -220,6 +226,8 @@ int rv_decode_dc(MpegEncContext *s, int n) return -code; } +#ifdef CONFIG_ENCODERS + /* write RV 1.0 compatible frame header */ void rv10_encode_picture_header(MpegEncContext *s, int picture_number) { @@ -262,6 +270,8 @@ static int get_num(GetBitContext *gb) } } +#endif //CONFIG_ENCODERS + /* read RV 1.0 compatible frame header */ static int rv10_decode_picture_header(MpegEncContext *s) { @@ -330,7 +340,7 @@ static int rv10_decode_picture_header(MpegEncContext *s) static int rv10_decode_init(AVCodecContext *avctx) { MpegEncContext *s = avctx->priv_data; - static int done; + static int done=0; s->avctx= avctx; s->out_format = FMT_H263; @@ -390,7 +400,7 @@ static int rv10_decode_end(AVCodecContext *avctx) } static int rv10_decode_packet(AVCodecContext *avctx, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { MpegEncContext *s = avctx->priv_data; int i, mb_count, mb_pos, left; @@ -468,7 +478,7 @@ static int rv10_decode_packet(AVCodecContext *avctx, static int rv10_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { MpegEncContext *s = avctx->priv_data; int i; diff --git a/src/libffmpeg/libavcodec/simple_idct.c b/src/libffmpeg/libavcodec/simple_idct.c index 703e94f21..4b488197a 100644 --- a/src/libffmpeg/libavcodec/simple_idct.c +++ b/src/libffmpeg/libavcodec/simple_idct.c @@ -17,6 +17,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file simple_idct.c + * simpleidct in C. + */ + /* based upon some outcommented c code from mpeg2dec (idct_mmx.c written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>) @@ -172,11 +178,11 @@ static inline void idctRowCondDC (DCTELEM * row) row[4] = (a3 - b3) >> ROW_SHIFT; } -static inline void idctSparseColPut (UINT8 *dest, int line_size, +static inline void idctSparseColPut (uint8_t *dest, int line_size, DCTELEM * col) { int a0, a1, a2, a3, b0, b1, b2, b3; - UINT8 *cm = cropTbl + MAX_NEG_CROP; + uint8_t *cm = cropTbl + MAX_NEG_CROP; /* XXX: I did that only to give same values as previous code */ a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4)); @@ -244,11 +250,11 @@ static inline void idctSparseColPut (UINT8 *dest, int line_size, dest[0] = cm[(a0 - b0) >> COL_SHIFT]; } -static inline void idctSparseColAdd (UINT8 *dest, int line_size, +static inline void idctSparseColAdd (uint8_t *dest, int line_size, DCTELEM * col) { int a0, a1, a2, a3, b0, b1, b2, b3; - UINT8 *cm = cropTbl + MAX_NEG_CROP; + uint8_t *cm = cropTbl + MAX_NEG_CROP; /* XXX: I did that only to give same values as previous code */ a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4)); @@ -379,7 +385,7 @@ static inline void idctSparseCol (DCTELEM * col) col[56] = ((a0 - b0) >> COL_SHIFT); } -void simple_idct_put(UINT8 *dest, int line_size, DCTELEM *block) +void simple_idct_put(uint8_t *dest, int line_size, DCTELEM *block) { int i; for(i=0; i<8; i++) @@ -389,7 +395,7 @@ void simple_idct_put(UINT8 *dest, int line_size, DCTELEM *block) idctSparseColPut(dest + i, line_size, block + i); } -void simple_idct_add(UINT8 *dest, int line_size, DCTELEM *block) +void simple_idct_add(uint8_t *dest, int line_size, DCTELEM *block) { int i; for(i=0; i<8; i++) @@ -420,10 +426,10 @@ void simple_idct(DCTELEM *block) and the butterfly must be multiplied by 0.5 * sqrt(2.0) */ #define C_SHIFT (4+1+12) -static inline void idct4col(UINT8 *dest, int line_size, const DCTELEM *col) +static inline void idct4col(uint8_t *dest, int line_size, const DCTELEM *col) { int c0, c1, c2, c3, a0, a1, a2, a3; - const UINT8 *cm = cropTbl + MAX_NEG_CROP; + const uint8_t *cm = cropTbl + MAX_NEG_CROP; a0 = col[8*0]; a1 = col[8*2]; @@ -457,7 +463,7 @@ static inline void idct4col(UINT8 *dest, int line_size, const DCTELEM *col) /* XXX: I think a 1.0/sqrt(2) normalization should be needed to compensate the extra butterfly stage - I don't have the full DV specification */ -void simple_idct248_put(UINT8 *dest, int line_size, DCTELEM *block) +void simple_idct248_put(uint8_t *dest, int line_size, DCTELEM *block) { int i; DCTELEM *ptr; @@ -500,10 +506,10 @@ void simple_idct248_put(UINT8 *dest, int line_size, DCTELEM *block) #define C2 C_FIX(0.2705980501) #define C3 C_FIX(0.5) #define C_SHIFT (4+1+12) -static inline void idct4col_add(UINT8 *dest, int line_size, const DCTELEM *col) +static inline void idct4col_add(uint8_t *dest, int line_size, const DCTELEM *col) { int c0, c1, c2, c3, a0, a1, a2, a3; - const UINT8 *cm = cropTbl + MAX_NEG_CROP; + const uint8_t *cm = cropTbl + MAX_NEG_CROP; a0 = col[8*0]; a1 = col[8*1]; @@ -531,7 +537,7 @@ static inline void idct4col_add(UINT8 *dest, int line_size, const DCTELEM *col) static inline void idct4row(DCTELEM *row) { int c0, c1, c2, c3, a0, a1, a2, a3; - const UINT8 *cm = cropTbl + MAX_NEG_CROP; + //const uint8_t *cm = cropTbl + MAX_NEG_CROP; a0 = row[0]; a1 = row[1]; @@ -547,7 +553,7 @@ static inline void idct4row(DCTELEM *row) row[3]= (c0 - c1) >> R_SHIFT; } -void simple_idct84_add(UINT8 *dest, int line_size, DCTELEM *block) +void simple_idct84_add(uint8_t *dest, int line_size, DCTELEM *block) { int i; @@ -562,7 +568,7 @@ void simple_idct84_add(UINT8 *dest, int line_size, DCTELEM *block) } } -void simple_idct48_add(UINT8 *dest, int line_size, DCTELEM *block) +void simple_idct48_add(uint8_t *dest, int line_size, DCTELEM *block) { int i; diff --git a/src/libffmpeg/libavcodec/simple_idct.h b/src/libffmpeg/libavcodec/simple_idct.h index 0ee1e05ed..2da822771 100644 --- a/src/libffmpeg/libavcodec/simple_idct.h +++ b/src/libffmpeg/libavcodec/simple_idct.h @@ -18,14 +18,19 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -void simple_idct_put(UINT8 *dest, int line_size, DCTELEM *block); -void simple_idct_add(UINT8 *dest, int line_size, DCTELEM *block); +/** + * @file simple_idct.h + * simple idct header. + */ + +void simple_idct_put(uint8_t *dest, int line_size, DCTELEM *block); +void simple_idct_add(uint8_t *dest, int line_size, DCTELEM *block); void ff_simple_idct_mmx(int16_t *block); -void ff_simple_idct_add_mmx(UINT8 *dest, int line_size, int16_t *block); -void ff_simple_idct_put_mmx(UINT8 *dest, int line_size, int16_t *block); +void ff_simple_idct_add_mmx(uint8_t *dest, int line_size, int16_t *block); +void ff_simple_idct_put_mmx(uint8_t *dest, int line_size, int16_t *block); void simple_idct(DCTELEM *block); -void simple_idct248_put(UINT8 *dest, int line_size, DCTELEM *block); +void simple_idct248_put(uint8_t *dest, int line_size, DCTELEM *block); -void simple_idct84_add(UINT8 *dest, int line_size, DCTELEM *block); -void simple_idct48_add(UINT8 *dest, int line_size, DCTELEM *block); +void simple_idct84_add(uint8_t *dest, int line_size, DCTELEM *block); +void simple_idct48_add(uint8_t *dest, int line_size, DCTELEM *block); diff --git a/src/libffmpeg/libavcodec/svq1.c b/src/libffmpeg/libavcodec/svq1.c index 5a9a290b8..dbebde0f7 100644 --- a/src/libffmpeg/libavcodec/svq1.c +++ b/src/libffmpeg/libavcodec/svq1.c @@ -21,6 +21,12 @@ * Ported to libavcodec by Nick Kurshev <nickols_k@mail.ru> * */ + +/** + * @file svq1.c + * svq1 decoder. + */ + //#define DEBUG_SVQ1 #include <stdio.h> #include <stdlib.h> @@ -835,7 +841,19 @@ static int svq1_motion_inter_block (MpegEncContext *s, bit_buffer_t *bitbuf, motion[0].y = motion[(x / 8) + 2].y = motion[(x / 8) + 3].y = mv.y; - + + if(y + (mv.y >> 1)<0) + mv.y= 0; + if(x + (mv.x >> 1)<0) + mv.x= 0; + +#if 0 + int w= (s->width+15)&~15; + int h= (s->height+15)&~15; + if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h) + printf("%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1)); +#endif + src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch]; dst = current; @@ -903,18 +921,31 @@ static int svq1_motion_inter_4v_block (MpegEncContext *s, bit_buffer_t *bitbuf, /* form predictions */ for (i=0; i < 4; i++) { - src = &previous[(x + (pmv[i]->x >> 1)) + (y + (pmv[i]->y >> 1))*pitch]; + int mvx= pmv[i]->x + (i&1)*16; + int mvy= pmv[i]->y + (i>>1)*16; + + ///XXX /FIXME cliping or padding? + if(y + (mvy >> 1)<0) + mvy= 0; + if(x + (mvx >> 1)<0) + mvx= 0; + +#if 0 + int w= (s->width+15)&~15; + int h= (s->height+15)&~15; + if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h) + printf("%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1)); +#endif + src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch]; dst = current; - - s->dsp.put_pixels_tab[1][((pmv[i]->y & 1) << 1) | (pmv[i]->x & 1)](dst,src,pitch,8); + + s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8); /* select next block */ if (i & 1) { current += 8*(pitch - 1); - previous += 8*(pitch - 1); } else { current += 8; - previous += 8; } } @@ -1000,7 +1031,7 @@ static int svq1_decode_frame_header (bit_buffer_t *bitbuf,MpegEncContext *s) { s->pict_type= get_bits (bitbuf, 2)+1; if(s->pict_type==4) return -1; - + if (s->pict_type == I_TYPE) { /* unknown fields */ @@ -1058,7 +1089,7 @@ static int svq1_decode_frame_header (bit_buffer_t *bitbuf,MpegEncContext *s) { static int svq1_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { MpegEncContext *s=avctx->priv_data; uint8_t *current, *previous; @@ -1095,7 +1126,7 @@ static int svq1_decode_frame(AVCodecContext *avctx, //FIXME this avoids some confusion for "B frames" without 2 references //this should be removed after libavcodec can handle more flaxible picture types & ordering - if(s->pict_type==B_TYPE && s->last_picture.data[0]==NULL) return buf_size; + if(s->pict_type==B_TYPE && s->last_picture_ptr==NULL) return buf_size; if(avctx->hurry_up && s->pict_type==B_TYPE) return buf_size; diff --git a/src/libffmpeg/libavcodec/svq1_cb.h b/src/libffmpeg/libavcodec/svq1_cb.h index fa1eb3b1f..14372a255 100644 --- a/src/libffmpeg/libavcodec/svq1_cb.h +++ b/src/libffmpeg/libavcodec/svq1_cb.h @@ -22,6 +22,11 @@ * */ +/** + * @file svq1_cb.h + * svq1 code books. + */ + /* 6x16-entry codebook for inter-coded 4x2 vectors */ static const int8_t svq1_inter_codebook_4x2[768] = { 7, 2, -6, -7, 7, 3, -3, -4, -7, -2, 7, 8, -8, -4, 3, 4, diff --git a/src/libffmpeg/libavcodec/utils.c b/src/libffmpeg/libavcodec/utils.c index 0959c0cf4..037abdc00 100644 --- a/src/libffmpeg/libavcodec/utils.c +++ b/src/libffmpeg/libavcodec/utils.c @@ -16,10 +16,15 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file utils.c + * utils. + */ + #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" -#include "xineutils.h" void *av_mallocz(unsigned int size) { @@ -47,7 +52,7 @@ char *av_strdup(const char *s) /** * realloc which does nothing if the block is large enough */ -void *av_fast_realloc(void *ptr, int *size, int min_size) +void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size) { if(min_size < *size) return ptr; @@ -64,7 +69,7 @@ static char*** array_static = NULL; static const unsigned int grow_static = 64; // ^2 void *__av_mallocz_static(void** location, unsigned int size) { - int l = (last_static + grow_static) & ~(grow_static - 1); + unsigned int l = (last_static + grow_static) & ~(grow_static - 1); void *ptr = av_mallocz(size); if (!ptr) return NULL; @@ -124,10 +129,10 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ const int width = s->width; const int height= s->height; DefaultPicOpaque *opaque; -/* - XINE_ASSERT(pic->data[0]==NULL, "pic->data[0] != NULL"); - XINE_ASSERT((pic->type==0) || (pic->type==FF_TYPE_INTERNAL), "pic->type incorrect: %d", pic->type); -*/ + + assert(pic->data[0]==NULL); + assert(pic->type==0 || pic->type==FF_TYPE_INTERNAL); + if(pic->opaque){ opaque= (DefaultPicOpaque *)pic->opaque; for(i=0; i<3; i++) @@ -187,9 +192,9 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ memset(pic->base[i], 128, pic->linesize[i]*h>>v_shift); if(s->flags&CODEC_FLAG_EMU_EDGE) - pic->data[i] = pic->base[i] + 16; //FIXME 16 + pic->data[i] = pic->base[i]; else - pic->data[i] = pic->base[i] + (pic->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift) + 16; //FIXME 16 + pic->data[i] = pic->base[i] + (pic->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift); opaque->data[i]= pic->data[i]; } @@ -203,7 +208,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){ int i; - XINE_ASSERT(pic->type==FF_BUFFER_TYPE_INTERNAL, "pic->type does not equal FF_BUFFER_TYPE_INTERNAL: %d", pic->type); + assert(pic->type==FF_BUFFER_TYPE_INTERNAL); for(i=0; i<3; i++) pic->data[i]=NULL; @@ -231,13 +236,17 @@ void avcodec_get_context_defaults(AVCodecContext *s){ s->error_concealment= 3; s->error_resilience= 1; s->workaround_bugs= FF_BUG_AUTODETECT; - s->frame_rate = 25 * FRAME_RATE_BASE; + s->frame_rate_base= 1; + s->frame_rate = 25; s->gop_size= 50; s->me_method= ME_EPZS; s->get_buffer= avcodec_default_get_buffer; s->release_buffer= avcodec_default_release_buffer; s->get_format= avcodec_default_get_format; s->me_subpel_quality=8; + + s->intra_quant_bias= FF_DEFAULT_QUANT_BIAS; + s->inter_quant_bias= FF_DEFAULT_QUANT_BIAS; } /** @@ -286,7 +295,7 @@ int avcodec_open(AVCodecContext *avctx, AVCodec *codec) return 0; } -int avcodec_encode_audio(AVCodecContext *avctx, UINT8 *buf, int buf_size, +int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples) { int ret; @@ -296,7 +305,7 @@ int avcodec_encode_audio(AVCodecContext *avctx, UINT8 *buf, int buf_size, return ret; } -int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size, +int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, const AVFrame *pict) { int ret; @@ -314,7 +323,7 @@ int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size, zero. Otherwise, it is non zero */ int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { int ret; @@ -332,9 +341,9 @@ int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, *number of bytes used. If no frame could be decompressed, *frame_size_ptr is zero. Otherwise, it is the decompressed frame *size in BYTES. */ -int avcodec_decode_audio(AVCodecContext *avctx, INT16 *samples, +int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { int ret; @@ -458,7 +467,7 @@ void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) snprintf(buf + strlen(buf), buf_size - strlen(buf), ", %dx%d, %0.2f fps", enc->width, enc->height, - (float)enc->frame_rate / FRAME_RATE_BASE); + (float)enc->frame_rate / enc->frame_rate_base); } if (encode) { snprintf(buf + strlen(buf), buf_size - strlen(buf), @@ -575,7 +584,7 @@ void avcodec_flush_buffers(AVCodecContext *avctx) || s->picture[i].type == FF_BUFFER_TYPE_USER)) avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]); } - s->last_picture.data[0] = s->next_picture.data[0] = NULL; + s->last_picture_ptr = s->next_picture_ptr = NULL; break; default: //FIXME @@ -583,31 +592,61 @@ void avcodec_flush_buffers(AVCodecContext *avctx) } } -static int raw_encode_init(AVCodecContext *s) -{ - return 0; -} +int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){ + int exact=1, sign=0; + int64_t gcd, larger; -static int raw_decode_frame(AVCodecContext *avctx, - void *data, int *data_size, - UINT8 *buf, int buf_size) -{ - return -1; -} + assert(den != 0); -static int raw_encode_frame(AVCodecContext *avctx, - unsigned char *frame, int buf_size, void *data) -{ - return -1; + if(den < 0){ + den= -den; + nom= -nom; + } + + if(nom < 0){ + nom= -nom; + sign= 1; + } + + for(;;){ //note is executed 1 or 2 times + gcd = ff_gcd(nom, den); + nom /= gcd; + den /= gcd; + + larger= FFMAX(nom, den); + + if(larger > max){ + int64_t div= (larger + max - 1) / max; + nom = (nom + div/2)/div; + den = (den + div/2)/div; + exact=0; + }else + break; + } + + if(sign) nom= -nom; + + *dst_nom = nom; + *dst_den = den; + + return exact; } -AVCodec rawvideo_codec = { - "rawvideo", - CODEC_TYPE_VIDEO, - CODEC_ID_RAWVIDEO, - 0, - raw_encode_init, - raw_encode_frame, - NULL, - raw_decode_frame, -}; +int64_t av_rescale(int64_t a, int b, int c){ + uint64_t h, l; + assert(c > 0); + assert(b >=0); + + if(a<0) return -av_rescale(-a, b, c); + + h= a>>32; + if(h==0) return a*b/c; + + l= a&0xFFFFFFFF; + l *= b; + h *= b; + + l += (h%c)<<32; + + return ((h/c)<<32) + l/c; +} diff --git a/src/libffmpeg/libavcodec/wmadata.h b/src/libffmpeg/libavcodec/wmadata.h index 12050b2f3..ee1720710 100644 --- a/src/libffmpeg/libavcodec/wmadata.h +++ b/src/libffmpeg/libavcodec/wmadata.h @@ -1,4 +1,7 @@ -/* Various WMA tables */ +/** + * @file wmadata.h + * Various WMA tables. + */ static const uint16_t wma_critical_freqs[25] = { 100, 200, 300, 400, 510, 630, 770, 920, diff --git a/src/libffmpeg/libavcodec/wmadec.c b/src/libffmpeg/libavcodec/wmadec.c index 5305e1c5d..ab02feb72 100644 --- a/src/libffmpeg/libavcodec/wmadec.c +++ b/src/libffmpeg/libavcodec/wmadec.c @@ -16,6 +16,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/** + * @file wmadec.c + * WMA compatible decoder. + */ + #include "avcodec.h" #include "dsputil.h" @@ -1215,7 +1221,7 @@ static int wma_decode_frame(WMADecodeContext *s, int16_t *samples) static int wma_decode_superframe(AVCodecContext *avctx, void *data, int *data_size, - UINT8 *buf, int buf_size) + uint8_t *buf, int buf_size) { WMADecodeContext *s = avctx->priv_data; int nb_frames, bit_offset, i, pos, len; diff --git a/src/libffmpeg/libavcodec/wmv2.c b/src/libffmpeg/libavcodec/wmv2.c index 6def6f2a8..99780f6f4 100644 --- a/src/libffmpeg/libavcodec/wmv2.c +++ b/src/libffmpeg/libavcodec/wmv2.c @@ -17,6 +17,11 @@ * */ +/** + * @file wmv2.c + * wmv2 codec. + */ + #include "simple_idct.h" #define SKIP_TYPE_NONE 0 @@ -61,7 +66,7 @@ static int encode_ext_header(Wmv2Context *w){ init_put_bits(&pb, s->avctx->extradata, s->avctx->extradata_size, NULL, NULL); - put_bits(&pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29 + put_bits(&pb, 5, s->avctx->frame_rate / s->avctx->frame_rate_base); //yes 29.97 -> 29 put_bits(&pb, 11, FFMIN(s->bit_rate/1024, 2047)); put_bits(&pb, 1, w->mspel_bit=1); @@ -79,6 +84,7 @@ static int encode_ext_header(Wmv2Context *w){ return 0; } +#ifdef CONFIG_ENCODERS static int wmv2_encode_init(AVCodecContext *avctx){ Wmv2Context * const w= avctx->priv_data; @@ -192,7 +198,7 @@ void ff_wmv2_encode_mb(MpegEncContext * s, Wmv2Context * const w= (Wmv2Context*)s; int cbp, coded_cbp, i; int pred_x, pred_y; - UINT8 *coded_block; + uint8_t *coded_block; handle_slices(s); @@ -255,6 +261,7 @@ void ff_wmv2_encode_mb(MpegEncContext * s, msmpeg4_encode_block(s, block[i], i); } } +#endif //CONFIG_ENCODERS static void parse_mb_skip(Wmv2Context * w){ int mb_x, mb_y; @@ -326,7 +333,7 @@ static int decode_ext_header(Wmv2Context *w){ code = get_bits(&gb, 3); if(code==0) return -1; - + s->slice_height = s->mb_height / code; if(s->avctx->debug&FF_DEBUG_PICT_INFO){ @@ -467,7 +474,7 @@ s->picture_number++; //FIXME ? return 0; } -void ff_wmv2_decode_init(MpegEncContext *s){ +static void ff_wmv2_decode_init(MpegEncContext *s){ } static inline int wmv2_decode_motion(Wmv2Context *w, int *mx_ptr, int *my_ptr){ @@ -491,7 +498,7 @@ static inline int wmv2_decode_motion(Wmv2Context *w, int *mx_ptr, int *my_ptr){ static int16_t *wmv2_pred_motion(Wmv2Context *w, int *px, int *py){ MpegEncContext * const s= &w->s; int xy, wrap, diff, type; - INT16 *A, *B, *C, *mot_val; + int16_t *A, *B, *C, *mot_val; wrap = s->block_wrap[0]; xy = s->block_index[0]; @@ -576,12 +583,11 @@ static inline int wmv2_decode_inter_block(Wmv2Context *w, DCTELEM *block, int n, static void wmv2_add_block(Wmv2Context *w, DCTELEM *block1, uint8_t *dst, int stride, int n){ MpegEncContext * const s= &w->s; uint8_t temp[2][64]; - int i; - + switch(w->abt_type_table[n]){ case 0: if (s->block_last_index[n] >= 0) { - s->idct_add (dst, stride, block1); + s->dsp.idct_add (dst, stride, block1); } break; case 1: @@ -614,12 +620,12 @@ void ff_wmv2_add_mb(MpegEncContext *s, DCTELEM block1[6][64], uint8_t *dest_y, u } void ff_mspel_motion(MpegEncContext *s, - UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, - UINT8 **ref_picture, op_pixels_func (*pix_op)[4], + uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, + uint8_t **ref_picture, op_pixels_func (*pix_op)[4], int motion_x, int motion_y, int h) { Wmv2Context * const w= (Wmv2Context*)s; - UINT8 *ptr; + uint8_t *ptr; int dxy, offset, mx, my, src_x, src_y, v_edge_pos, linesize, uvlinesize; int emu=0; @@ -700,12 +706,10 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) { Wmv2Context * const w= (Wmv2Context*)s; int cbp, code, i; - UINT8 *coded_val; + uint8_t *coded_val; if(w->j_type) return 0; - s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0; - if (s->pict_type == P_TYPE) { if(s->mb_type[s->mb_y * s->mb_width + s->mb_x]&MB_TYPE_SKIPED){ /* skip mb */ @@ -829,6 +833,7 @@ AVCodec wmv2_decoder = { CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, }; +#ifdef CONFIG_ENCODERS AVCodec wmv2_encoder = { "wmv2", CODEC_TYPE_VIDEO, @@ -838,4 +843,4 @@ AVCodec wmv2_encoder = { MPV_encode_picture, MPV_encode_end, }; - +#endif |