Update of /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18626 Modified Files: Makefile.am adpcm.c asv1.c avcodec.h cabac.h cinepak.c common.c common.h dpcm.c dsputil.c dsputil.h dv.c error_resilience.c eval.c fft.c flicvideo.c golomb.h h263.c h264.c huffyuv.c indeo3.c mdct.c mjpeg.c motion_est.c motion_est_template.c mpeg12.c mpeg12data.h mpegaudiodec.c mpegvideo.c mpegvideo.h msvideo1.c ra144.c ratecontrol.c rpza.c rv10.c smc.c svq3.c truemotion1.c utils.c vmdav.c vp3.c vp3data.h vqavideo.c xan.c Log Message: sync to ffmpeg build 4707 Index: Makefile.am =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/Makefile.am,v retrieving revision 1.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- Makefile.am 4 Feb 2004 01:14:53 -0000 1.53 +++ Makefile.am 14 Mar 2004 21:14:07 -0000 1.54 @@ -53,6 +53,7 @@ msvideo1.c \ opts.c \ pcm.c \ + qtrle.c \ ra144.c \ ra288.c \ ratecontrol.c \ @@ -68,6 +69,7 @@ vcr1.c \ vmdav.c \ vp3.c \ + vp3dsp.c \ vqavideo.c \ wmadec.c \ xan.c Index: adpcm.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/adpcm.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- adpcm.c 3 Feb 2004 04:27:16 -0000 1.3 +++ adpcm.c 14 Mar 2004 21:14:08 -0000 1.4 @@ -45,13 +45,6 @@ #define BLKSIZE 1024 -#define BE_16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1]) -#define LE_16(x) ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0]) -#define LE_32(x) ((((uint8_t*)(x))[3] << 24) | \ - (((uint8_t*)(x))[2] << 16) | \ - (((uint8_t*)(x))[1] << 8) | \ - ((uint8_t*)(x))[0]) - #define CLAMP_TO_SHORT(value) \ if (value > 32767) \ value = 32767; \ @@ -153,8 +146,9 @@ /* seems frame_size isn't taken into account... have to buffer the samples :-( */ break; case CODEC_ID_ADPCM_MS: - av_log(avctx, AV_LOG_ERROR, "ADPCM: codec adpcm_ms unsupported for encoding !\n"); - return -1; + avctx->frame_size = (BLKSIZE - 7 * avctx->channels) * 2 / avctx->channels + 2; /* each 16 bits sample gives one nibble */ + /* and we have 7 bytes per channel overhead */ + avctx->block_align = BLKSIZE; break; default: return -1; @@ -223,16 +217,42 @@ return nibble; } +static inline unsigned char adpcm_ms_compress_sample(ADPCMChannelStatus *c, short sample) +{ + int predictor, nibble, bias; + + predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 256; + + nibble= sample - predictor; + if(nibble>=0) bias= c->idelta/2; + else bias=-c->idelta/2; + + nibble= (nibble + bias) / c->idelta; + nibble= clip(nibble, -8, 7)&0x0F; + + predictor += (signed)((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta; + CLAMP_TO_SHORT(predictor); + + c->sample2 = c->sample1; + c->sample1 = predictor; + + c->idelta = (AdaptationTable[(int)nibble] * c->idelta) >> 8; + if (c->idelta < 16) c->idelta = 16; + + return nibble; +} + static int adpcm_encode_frame(AVCodecContext *avctx, unsigned char *frame, int buf_size, void *data) { - int n; + int n, i, st; short *samples; unsigned char *dst; ADPCMContext *c = avctx->priv_data; dst = frame; samples = (short *)data; + st= avctx->channels == 2; /* n = (BLKSIZE - 4 * avctx->channels) / (2 * 8 * avctx->channels); */ switch(avctx->codec->id) { @@ -289,6 +309,41 @@ samples += 8 * avctx->channels; } break; + case CODEC_ID_ADPCM_MS: + for(i=0; i<avctx->channels; i++){ + int predictor=0; + + *dst++ = predictor; + c->status[i].coeff1 = AdaptCoeff1[predictor]; + c->status[i].coeff2 = AdaptCoeff2[predictor]; + } + for(i=0; i<avctx->channels; i++){ + if (c->status[i].idelta < 16) + c->status[i].idelta = 16; + + *dst++ = c->status[i].idelta & 0xFF; + *dst++ = c->status[i].idelta >> 8; + } + for(i=0; i<avctx->channels; i++){ + c->status[i].sample1= *samples++; + + *dst++ = c->status[i].sample1 & 0xFF; + *dst++ = c->status[i].sample1 >> 8; + } + for(i=0; i<avctx->channels; i++){ + c->status[i].sample2= *samples++; + + *dst++ = c->status[i].sample2 & 0xFF; + *dst++ = c->status[i].sample2 >> 8; + } + + for(i=7*avctx->channels; i<avctx->block_align; i++) { + int nibble; + nibble = adpcm_ms_compress_sample(&c->status[ 0], *samples++)<<4; + nibble|= adpcm_ms_compress_sample(&c->status[st], *samples++); + *dst++ = nibble; + } + break; default: return -1; } @@ -350,7 +405,7 @@ c->sample2 = c->sample1; c->sample1 = predictor; - c->idelta = (AdaptationTable[(int)nibble] * c->idelta) / 256; + c->idelta = (AdaptationTable[(int)nibble] * c->idelta) >> 8; if (c->idelta < 16) c->idelta = 16; return (short)predictor; @@ -585,22 +640,16 @@ n = buf_size - 7 * avctx->channels; if (n < 0) return -1; - block_predictor[0] = (*src++); /* should be bound */ - block_predictor[0] = (block_predictor[0] < 0)?(0):((block_predictor[0] > 7)?(7):(block_predictor[0])); + block_predictor[0] = clip(*src++, 0, 7); block_predictor[1] = 0; if (st) - block_predictor[1] = (*src++); - block_predictor[1] = (block_predictor[1] < 0)?(0):((block_predictor[1] > 7)?(7):(block_predictor[1])); - c->status[0].idelta = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00)); - if (c->status[0].idelta & 0x08000) - c->status[0].idelta -= 0x10000; + block_predictor[1] = clip(*src++, 0, 7); + c->status[0].idelta = (int16_t)((*src & 0xFF) | ((src[1] << 8) & 0xFF00)); src+=2; - if (st) - c->status[1].idelta = ((*src & 0xFF) | ((src[1] << 8) & 0xFF00)); - if (st && c->status[1].idelta & 0x08000) - c->status[1].idelta |= 0xFFFF0000; - if (st) + if (st){ + c->status[1].idelta = (int16_t)((*src & 0xFF) | ((src[1] << 8) & 0xFF00)); src+=2; + } c->status[0].coeff1 = AdaptCoeff1[block_predictor[0]]; c->status[0].coeff2 = AdaptCoeff2[block_predictor[0]]; c->status[1].coeff1 = AdaptCoeff1[block_predictor[1]]; @@ -629,18 +678,14 @@ if (avctx->block_align != 0 && buf_size > avctx->block_align) buf_size = avctx->block_align; - c->status[0].predictor = (src[0] | (src[1] << 8)); + c->status[0].predictor = (int16_t)(src[0] | (src[1] << 8)); c->status[0].step_index = src[2]; src += 4; - if(c->status[0].predictor & 0x8000) - c->status[0].predictor -= 0x10000; *samples++ = c->status[0].predictor; if (st) { - c->status[1].predictor = (src[0] | (src[1] << 8)); + c->status[1].predictor = (int16_t)(src[0] | (src[1] << 8)); c->status[1].step_index = src[2]; src += 4; - if(c->status[1].predictor & 0x8000) - c->status[1].predictor -= 0x10000; *samples++ = c->status[1].predictor; } while (src < buf + buf_size) { @@ -665,15 +710,11 @@ if (avctx->block_align != 0 && buf_size > avctx->block_align) buf_size = avctx->block_align; - c->status[0].predictor = (src[10] | (src[11] << 8)); - c->status[1].predictor = (src[12] | (src[13] << 8)); + c->status[0].predictor = (int16_t)(src[10] | (src[11] << 8)); + c->status[1].predictor = (int16_t)(src[12] | (src[13] << 8)); c->status[0].step_index = src[14]; c->status[1].step_index = src[15]; /* sign extend the predictors */ - if(c->status[0].predictor & 0x8000) - c->status[0].predictor -= 0x10000; - if(c->status[1].predictor & 0x8000) - c->status[1].predictor -= 0x10000; src += 16; diff_channel = c->status[1].predictor; Index: asv1.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/asv1.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- asv1.c 1 Feb 2004 05:31:16 -0000 1.3 +++ asv1.c 14 Mar 2004 21:14:08 -0000 1.4 @@ -519,10 +519,10 @@ emms_c(); align_put_bits(&a->pb); - while(get_bit_count(&a->pb)&31) + while(put_bits_count(&a->pb)&31) put_bits(&a->pb, 8, 0); - size= get_bit_count(&a->pb)/32; + size= put_bits_count(&a->pb)/32; if(avctx->codec_id == CODEC_ID_ASV1) a->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size); Index: avcodec.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/avcodec.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- avcodec.h 3 Feb 2004 04:27:17 -0000 1.31 +++ avcodec.h 14 Mar 2004 21:14:08 -0000 1.32 @@ -24,7 +24,7 @@ #define FFMPEG_VERSION_INT 0x000408 #define FFMPEG_VERSION "0.4.8" -#define LIBAVCODEC_BUILD 4699 +#define LIBAVCODEC_BUILD 4707 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION FFMPEG_VERSION @@ -33,6 +33,9 @@ #define AV_TOSTRING(s) #s #define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" AV_STRINGIFY(LIBAVCODEC_BUILD) +#define AV_NOPTS_VALUE int64_t_C(0x8000000000000000) +#define AV_TIME_BASE 1000000 + enum CodecID { CODEC_ID_NONE, CODEC_ID_MPEG1VIDEO, @@ -100,6 +103,7 @@ CODEC_ID_VMDAUDIO, CODEC_ID_MSZH, CODEC_ID_ZLIB, + CODEC_ID_QTRLE, /* various pcm "codecs" */ CODEC_ID_PCM_S16LE, @@ -123,6 +127,7 @@ CODEC_ID_ADPCM_XA, CODEC_ID_ADPCM_ADX, CODEC_ID_ADPCM_EA, + CODEC_ID_ADPCM_G726, /* AMR */ CODEC_ID_AMR_NB, @@ -137,6 +142,8 @@ CODEC_ID_INTERPLAY_DPCM, CODEC_ID_XAN_DPCM, + CODEC_ID_FLAC, + CODEC_ID_MPEG2TS, /* _FAKE_ codec to indicate a raw MPEG2 transport stream (only used by libavformat) */ }; @@ -230,12 +237,6 @@ /* only for ME compatiblity with old apps */ extern int motion_estimation_method; -/* ME algos sorted by quality */ -//FIXME remove IMHO -static const __attribute__((unused)) int Motion_Est_QTab[] = - { ME_ZERO, ME_PHODS, ME_LOG, ME_X1, ME_EPZS, ME_FULL }; - - #define FF_MAX_B_FRAMES 8 /* encoding support @@ -297,6 +298,8 @@ used */ #define CODEC_CAP_PARSE_ONLY 0x0004 #define CODEC_CAP_TRUNCATED 0x0008 +/* codec can export data for HW decoding (XvMC) */ +#define CODEC_CAP_HWACCEL 0x0010 //the following defines might change, so dont expect compatibility if u use them #define MB_TYPE_INTRA4x4 0x0001 @@ -381,8 +384,8 @@ 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\ + * presentation timestamp in AV_TIME_BASE (=micro seconds currently) (time when frame should be shown to user)\ + * if AV_NOPTS_VALUE then the frame_rate will be used as reference\ * - encoding: MUST be set by user\ * - decoding: set by lavc\ */\ @@ -535,6 +538,13 @@ * - decoding: set by lavc (before get_buffer() call))\ */\ int buffer_hints;\ +\ + /**\ + * DCT coeffitients\ + * - encoding: unused\ + * - decoding: set by lavc\ + */\ + short *dct_coeff;\ #define FF_QSCALE_TYPE_MPEG1 0 #define FF_QSCALE_TYPE_MPEG2 1 @@ -567,10 +577,27 @@ #define DEFAULT_FRAME_RATE_BASE 1001000 /** + * Used by av_log + */ +typedef struct AVCLASS AVClass; +struct AVCLASS { + const char* class_name; + const char* (*item_name)(void*); /* actually passing a pointer to an AVCodecContext + or AVFormatContext, which begin with an AVClass. + Needed because av_log is in libavcodec and has no visibility + of AVIn/OutputFormat */ +}; + +/** * main external api structure. */ typedef struct AVCodecContext { /** + * Info on struct for av_log + * - set by avcodec_alloc_context + */ + AVClass *av_class; + /** * 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 @@ -634,11 +661,6 @@ */ int width, height; -#define FF_ASPECT_SQUARE 1 -#define FF_ASPECT_4_3_625 2 -#define FF_ASPECT_4_3_525 3 -#define FF_ASPECT_16_9_625 4 -#define FF_ASPECT_16_9_525 5 #define FF_ASPECT_EXTENDED 15 /** @@ -1149,7 +1171,7 @@ #define FF_DEBUG_MB_TYPE 8 #define FF_DEBUG_QP 16 #define FF_DEBUG_MV 32 -//#define FF_DEBUG_VIS_MV 0x00000040 +#define FF_DEBUG_DCT_COEFF 0x00000040 #define FF_DEBUG_SKIP 0x00000080 #define FF_DEBUG_STARTCODE 0x00000100 #define FF_DEBUG_PTS 0x00000200 @@ -1277,7 +1299,7 @@ * - 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); + enum PixelFormat (*get_format)(struct AVCodecContext *s, const enum PixelFormat * fmt); /** * DTG active format information (additionnal aspect ratio @@ -1513,6 +1535,38 @@ #define FF_AA_FASTINT 1 //not implemented yet #define FF_AA_INT 2 #define FF_AA_FLOAT 3 + /** + * Quantizer noise shaping. + * - encoding: set by user + * - decoding: unused + */ + int quantizer_noise_shaping; + + /** + * Thread count. + * is used to decide how many independant tasks should be passed to execute() + * - encoding: set by user + * - decoding: set by user + */ + int thread_count; + + /** + * the codec may call this to execute several independant things. it will return only after + * finishing all tasks, the user may replace this with some multithreaded implementation, the + * default implementation will execute the parts serially + * @param count the number of things to execute + * - encoding: set by lavc, user can override + * - decoding: set by lavc, user can override + */ + int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void **arg2, int *ret, int count); + + /** + * Thread opaque. + * can be used by execute() to store some per AVCodecContext stuff. + * - encoding: set by execute() + * - decoding: set by execute() + */ + void *thread_opaque; } AVCodecContext; @@ -1577,6 +1631,7 @@ const AVOption *options; struct AVCodec *next; void (*flush)(AVCodecContext *); + const AVRational *supported_framerates; ///array of supported framerates, or NULL if any, array is terminated by {0,0} } AVCodec; /** @@ -1707,6 +1762,8 @@ extern AVCodec roq_dpcm_decoder; extern AVCodec interplay_dpcm_decoder; extern AVCodec xan_dpcm_decoder; +extern AVCodec qtrle_decoder; +extern AVCodec flac_decoder; /* pcm codecs */ #define PCM_CODEC(id, name) \ @@ -1735,6 +1792,7 @@ PCM_CODEC(CODEC_ID_ADPCM_XA, adpcm_xa); PCM_CODEC(CODEC_ID_ADPCM_ADX, adpcm_adx); PCM_CODEC(CODEC_ID_ADPCM_EA, adpcm_ea); +PCM_CODEC(CODEC_ID_ADPCM_G726, adpcm_g726); #undef PCM_CODEC @@ -1849,6 +1907,11 @@ void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic); void avcodec_default_free_buffers(AVCodecContext *s); +int avcodec_thread_init(AVCodecContext *s, int thread_count); +void avcodec_thread_free(AVCodecContext *s); +int avcodec_thread_execute(AVCodecContext *s, int (*func)(AVCodecContext *c2, void *arg2),void **arg, int *ret, int count); +//FIXME func typedef + /** * opens / inits the AVCodecContext. * not thread save! @@ -2034,8 +2097,7 @@ void *av_realloc(void *ptr, unsigned int size); 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_freep(void *ptr); 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 */ @@ -2057,19 +2119,23 @@ #define AV_LOG_INFO 1 #define AV_LOG_DEBUG 2 -extern void av_log(AVCodecContext*, int level, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); -extern void av_vlog(AVCodecContext*, int level, const char *fmt, va_list); +extern void av_log(void*, int level, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); +extern void av_vlog(void*, int level, const char *fmt, va_list); extern int av_log_get_level(void); extern void av_log_set_level(int); -extern void av_log_set_callback(void (*)(AVCodecContext*, int, const char*, va_list)); +extern void av_log_set_callback(void (*)(void*, int, const char*, va_list)); -#undef AV_LOG_TRAP_PRINTF -#ifdef AV_LOG_TRAP_PRINTF -#define printf DO NOT USE -#define fprintf DO NOT USE -#undef stderr -#define stderr DO NOT USE -#endif +/* endian macros */ +#define BE_16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1]) +#define BE_32(x) ((((uint8_t*)(x))[0] << 24) | \ + (((uint8_t*)(x))[1] << 16) | \ + (((uint8_t*)(x))[2] << 8) | \ + ((uint8_t*)(x))[3]) +#define LE_16(x) ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0]) +#define LE_32(x) ((((uint8_t*)(x))[3] << 24) | \ + (((uint8_t*)(x))[2] << 16) | \ + (((uint8_t*)(x))[1] << 8) | \ + ((uint8_t*)(x))[0]) #ifdef __cplusplus } Index: cabac.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/cabac.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- cabac.h 27 Oct 2003 15:24:38 -0000 1.1 +++ cabac.h 14 Mar 2004 21:14:08 -0000 1.2 @@ -165,7 +165,7 @@ c->symCount++; #endif - return (get_bit_count(&c->pb)+7)>>3; + return (put_bits_count(&c->pb)+7)>>3; } /** Index: cinepak.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/cinepak.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- cinepak.c 1 Feb 2004 05:31:16 -0000 1.3 +++ cinepak.c 14 Mar 2004 21:14:08 -0000 1.4 @@ -37,12 +37,6 @@ #define PALETTE_COUNT 256 -#define BE_16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1]) -#define BE_32(x) ((((uint8_t*)(x))[0] << 24) | \ - (((uint8_t*)(x))[1] << 16) | \ - (((uint8_t*)(x))[2] << 8) | \ - ((uint8_t*)(x))[3]) - typedef struct { uint8_t y0, y1, y2, y3; uint8_t u, v; Index: common.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/common.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- common.c 1 Feb 2004 05:31:16 -0000 1.21 +++ common.c 14 Mar 2004 21:14:08 -0000 1.22 @@ -45,34 +45,6 @@ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 }; -void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size) -{ - s->buf = buffer; - s->buf_end = s->buf + buffer_size; -#ifdef ALT_BITSTREAM_WRITER - s->index=0; - ((uint32_t*)(s->buf))[0]=0; -// memset(buffer, 0, buffer_size); -#else - s->buf_ptr = s->buf; - s->bit_left=32; - s->bit_buf=0; -#endif -} - -//#ifdef CONFIG_ENCODERS -#if 1 - -/* return the number of bits output */ -int get_bit_count(PutBitContext *s) -{ -#ifdef ALT_BITSTREAM_WRITER - return s->index; -#else - return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left; -#endif -} - void align_put_bits(PutBitContext *s) { #ifdef ALT_BITSTREAM_WRITER @@ -82,88 +54,18 @@ #endif } -#endif //CONFIG_ENCODERS - -/* pad the end of the output stream with zeros */ -void flush_put_bits(PutBitContext *s) -{ -#ifdef ALT_BITSTREAM_WRITER - align_put_bits(s); -#else - s->bit_buf<<= s->bit_left; - while (s->bit_left < 32) { - /* XXX: should test end of buffer */ - *s->buf_ptr++=s->bit_buf >> 24; - s->bit_buf<<=8; - s->bit_left+=8; - } - s->bit_left=32; - s->bit_buf=0; -#endif -} - -#if defined(CONFIG_ENCODERS) || defined(XINE_MPEG_ENCODER) - -void put_string(PutBitContext * pbc, char *s) +void put_string(PutBitContext * pbc, char *s, int put_zero) { while(*s){ put_bits(pbc, 8, *s); s++; } - put_bits(pbc, 8, 0); + if(put_zero) + put_bits(pbc, 8, 0); } /* bit input functions */ -#endif //CONFIG_ENCODERS - -/** - * init GetBitContext. - * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits - * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end - * @param bit_size the size of the buffer in bits - */ -void init_get_bits(GetBitContext *s, - const uint8_t *buffer, int bit_size) -{ - const int buffer_size= (bit_size+7)>>3; - - s->buffer= buffer; - s->size_in_bits= bit_size; - s->buffer_end= buffer + buffer_size; -#ifdef ALT_BITSTREAM_READER - s->index=0; -#elif defined LIBMPEG2_BITSTREAM_READER -#ifdef LIBMPEG2_BITSTREAM_READER_HACK - if ((int)buffer&1) { - /* word alignment */ - s->cache = (*buffer++)<<24; - s->buffer_ptr = buffer; - s->bit_count = 16-8; - } else -#endif - { - s->buffer_ptr = buffer; - s->bit_count = 16; - s->cache = 0; - } -#elif defined A32_BITSTREAM_READER - s->buffer_ptr = (uint32_t*)buffer; - s->bit_count = 32; - s->cache0 = 0; - s->cache1 = 0; -#endif - { - OPEN_READER(re, s) - UPDATE_CACHE(re, s) - UPDATE_CACHE(re, s) - CLOSE_READER(re, s) - } -#ifdef A32_BITSTREAM_READER - s->cache1 = 0; -#endif -} - /** * reads 0-32 bits. */ Index: common.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/common.h,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- common.h 1 Feb 2004 05:31:16 -0000 1.33 +++ common.h 14 Mar 2004 21:14:08 -0000 1.34 @@ -82,6 +82,12 @@ # define always_inline inline #endif +#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) +# define attribute_used __attribute__((used)) +#else +# define attribute_used +#endif + #ifndef EMULATE_INTTYPES # include <inttypes.h> #else @@ -102,7 +108,7 @@ #endif /* HAVE_INTTYPES_H */ #ifndef INT64_MAX -#define INT64_MAX 9223372036854775807LL +#define INT64_MAX int64_t_C(9223372036854775807) #endif #ifdef EMULATE_FAST_INT @@ -296,12 +302,56 @@ #endif } PutBitContext; -void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size); +static inline void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size) +{ + s->buf = buffer; + s->buf_end = s->buf + buffer_size; +#ifdef ALT_BITSTREAM_WRITER + s->index=0; + ((uint32_t*)(s->buf))[0]=0; +// memset(buffer, 0, buffer_size); +#else + s->buf_ptr = s->buf; + s->bit_left=32; + s->bit_buf=0; +#endif +} + +/* return the number of bits output */ +static inline int put_bits_count(PutBitContext *s) +{ +#ifdef ALT_BITSTREAM_WRITER + return s->index; +#else + return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left; +#endif +} + +static inline int put_bits_left(PutBitContext* s) +{ + return (s->buf_end - s->buf) * 8 - put_bits_count(s); +} + +/* pad the end of the output stream with zeros */ +static inline void flush_put_bits(PutBitContext *s) +{ +#ifdef ALT_BITSTREAM_WRITER + align_put_bits(s); +#else + s->bit_buf<<= s->bit_left; + while (s->bit_left < 32) { + /* XXX: should test end of buffer */ + *s->buf_ptr++=s->bit_buf >> 24; + s->bit_buf<<=8; + s->bit_left+=8; + } + s->bit_left=32; + s->bit_buf=0; +#endif +} -int 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); +void put_string(PutBitContext * pbc, char *s, int put_zero); /* bit input */ @@ -322,8 +372,6 @@ int size_in_bits; } GetBitContext; -static inline int get_bits_count(GetBitContext *s); - #define VLC_TYPE int16_t typedef struct VLC { @@ -485,6 +533,28 @@ #endif } +/** + * + * PutBitContext must be flushed & aligned to a byte boundary before calling this. + */ +static inline void skip_put_bytes(PutBitContext *s, int n){ + assert((put_bits_count(s)&7)==0); +#ifdef ALT_BITSTREAM_WRITER + FIXME may need some cleaning of the buffer + s->index += n<<3; +#else + assert(s->bit_left==32); + s->buf_ptr += n; +#endif +} + +/** + * Changes the end of the buffer. + */ +static inline void set_put_bits_buffer_size(PutBitContext *s, int size){ + s->buf_end= s->buf + size; +} + /* Bitstream reader API docs: name abritary name which is used as prefix for the internal variables @@ -807,8 +877,57 @@ skip_bits(s, 1); } -void init_get_bits(GetBitContext *s, - const uint8_t *buffer, int buffer_size); +/** + * init GetBitContext. + * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits + * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end + * @param bit_size the size of the buffer in bits + */ +static inline void init_get_bits(GetBitContext *s, + const uint8_t *buffer, int bit_size) +{ + const int buffer_size= (bit_size+7)>>3; + + s->buffer= buffer; + s->size_in_bits= bit_size; + s->buffer_end= buffer + buffer_size; +#ifdef ALT_BITSTREAM_READER + s->index=0; +#elif defined LIBMPEG2_BITSTREAM_READER +#ifdef LIBMPEG2_BITSTREAM_READER_HACK + if ((int)buffer&1) { + /* word alignment */ + s->cache = (*buffer++)<<24; + s->buffer_ptr = buffer; + s->bit_count = 16-8; + } else +#endif + { + s->buffer_ptr = buffer; + s->bit_count = 16; + s->cache = 0; + } +#elif defined A32_BITSTREAM_READER + s->buffer_ptr = (uint32_t*)buffer; + s->bit_count = 32; + s->cache0 = 0; + s->cache1 = 0; +#endif + { + OPEN_READER(re, s) + UPDATE_CACHE(re, s) + UPDATE_CACHE(re, s) + CLOSE_READER(re, s) + } +#ifdef A32_BITSTREAM_READER + s->cache1 = 0; +#endif +} + +static inline int get_bits_left(GetBitContext *s) +{ + return s->size_in_bits - get_bits_count(s); +} int check_marker(GetBitContext *s, const char *msg); void align_get_bits(GetBitContext *s); @@ -964,7 +1083,7 @@ #define tprintf printf #else //TRACE -#define tprintf(_arg...) {} +#define tprintf(...) {} #endif /* define it to include statistics code (useful only for optimizing @@ -1144,21 +1263,23 @@ } #define START_TIMER \ -static uint64_t tsum=0;\ -static int tcount=0;\ -static int tskip_count=0;\ uint64_t tend;\ uint64_t tstart= rdtsc();\ #define STOP_TIMER(id) \ tend= rdtsc();\ -if(tcount<2 || tend - tstart < 4*tsum/tcount){\ - tsum+= tend - tstart;\ - tcount++;\ -}else\ - tskip_count++;\ -if(256*256*256*64%(tcount+tskip_count)==0){\ - fprintf(stderr, "%Ld dezicycles in %s, %d runs, %d skips\n", tsum*10/tcount, id, tcount, tskip_count);\ +{\ + static uint64_t tsum=0;\ + static int tcount=0;\ + static int tskip_count=0;\ + if(tcount<2 || tend - tstart < 8*tsum/tcount){\ + tsum+= tend - tstart;\ + tcount++;\ + }else\ + tskip_count++;\ + if(256*256*256*64%(tcount+tskip_count)==0){\ + av_log(NULL, AV_LOG_DEBUG, "%Ld dezicycles in %s, %d runs, %d skips\n", tsum*10/tcount, id, tcount, tskip_count);\ + }\ } #endif @@ -1168,6 +1289,10 @@ #define malloc please_use_av_malloc #define free please_use_av_free #define realloc please_use_av_realloc +#if !(defined(LIBAVFORMAT_BUILD) || defined(_FRAMEHOOK_H)) +#define printf please_use_av_log +#define fprintf please_use_av_log +#endif #define CHECKED_ALLOCZ(p, size)\ {\ Index: dpcm.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/dpcm.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- dpcm.c 1 Feb 2004 05:31:16 -0000 1.3 +++ dpcm.c 14 Mar 2004 21:14:08 -0000 1.4 @@ -44,11 +44,6 @@ #define SATURATE_S16(x) if (x < -32768) x = -32768; \ else if (x > 32767) x = 32767; #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000; -#define LE_16(x) ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0]) -#define LE_32(x) ((((uint8_t*)(x))[3] << 24) | \ - (((uint8_t*)(x))[2] << 16) | \ - (((uint8_t*)(x))[1] << 8) | \ - ((uint8_t*)(x))[0]) static int interplay_delta_table[] = { 0, 1, 2, 3, 4, 5, 6, 7, Index: dsputil.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/dsputil.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- dsputil.c 1 Feb 2004 05:31:16 -0000 1.33 +++ dsputil.c 14 Mar 2004 21:14:08 -0000 1.34 @@ -874,6 +874,13 @@ #define avg2(a,b) ((a+b+1)>>1) #define avg4(a,b,c,d) ((a+b+c+d+2)>>2) +static void put_no_rnd_pixels16_l2_c(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h){ + put_no_rnd_pixels16_l2(dst, a, b, stride, stride, stride, h); +} + +static void put_no_rnd_pixels8_l2_c(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h){ + put_no_rnd_pixels8_l2(dst, a, b, stride, stride, stride, h); +} static void gmc1_c(uint8_t *dst, uint8_t *src, int stride, int h, int x16, int y16, int rounder) { @@ -2532,6 +2539,29 @@ return s; } +static int try_8x8basis_c(int16_t rem[64], int16_t weight[64], int16_t basis[64], int scale){ + int i; + unsigned int sum=0; + + for(i=0; i<8*8; i++){ + int b= rem[i] + ((basis[i]*scale + (1<<(BASIS_SHIFT - RECON_SHIFT-1)))>>(BASIS_SHIFT - RECON_SHIFT)); + int w= weight[i]; + b>>= RECON_SHIFT; + assert(-512<b && b<512); + + sum += (w*b)*(w*b)>>4; + } + return sum>>2; +} + +static void add_8x8basis_c(int16_t rem[64], int16_t basis[64], int scale){ + int i; + + for(i=0; i<8*8; i++){ + rem[i] += (basis[i]*scale + (1<<(BASIS_SHIFT - RECON_SHIFT-1)))>>(BASIS_SHIFT - RECON_SHIFT); + } +} + /** * permutes an 8x8 block. * @param block the block which will be permuted according to the given permutation vector @@ -3094,6 +3124,11 @@ c->idct_permutation_type= FF_NO_IDCT_PERM; } + /* VP3 DSP support */ + c->vp3_dsp_init = vp3_dsp_init_c; + c->vp3_idct_put = vp3_idct_put_c; + c->vp3_idct_add = vp3_idct_add_c; + c->get_pixels = get_pixels_c; c->diff_pixels = diff_pixels_c; c->put_pixels_clamped = put_pixels_clamped_c; @@ -3135,6 +3170,9 @@ dspfunc(avg, 3, 2); #undef dspfunc + c->put_no_rnd_pixels_l2[0]= put_no_rnd_pixels16_l2_c; + c->put_no_rnd_pixels_l2[1]= put_no_rnd_pixels8_l2_c; + c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c; c->put_tpel_pixels_tab[ 1] = put_tpel_pixels_mc10_c; c->put_tpel_pixels_tab[ 2] = put_tpel_pixels_mc20_c; @@ -3235,6 +3273,9 @@ c->h263_h_loop_filter= h263_h_loop_filter_c; c->h263_v_loop_filter= h263_v_loop_filter_c; + + c->try_8x8basis= try_8x8basis_c; + c->add_8x8basis= add_8x8basis_c; #ifdef HAVE_MMX dsputil_init_mmx(c, avctx); Index: dsputil.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/dsputil.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- dsputil.h 1 Feb 2004 05:31:16 -0000 1.26 +++ dsputil.h 14 Mar 2004 21:14:08 -0000 1.27 @@ -63,6 +63,19 @@ extern uint32_t squareTbl[512]; extern uint8_t cropTbl[256 + 2 * MAX_NEG_CROP]; +/* VP3 DSP functions */ +void vp3_dsp_init_c(void); +void vp3_idct_put_c(int16_t *input_data, int16_t *dequant_matrix, + int coeff_count, uint8_t *dest, int stride); +void vp3_idct_add_c(int16_t *input_data, int16_t *dequant_matrix, + int coeff_count, uint8_t *dest, int stride); + +void vp3_dsp_init_mmx(void); +void vp3_idct_put_mmx(int16_t *input_data, int16_t *dequant_matrix, + int coeff_count, uint8_t *dest, int stride); +void vp3_idct_add_mmx(int16_t *input_data, int16_t *dequant_matrix, + int coeff_count, uint8_t *dest, int stride); + /* minimum alignment rules ;) if u notice errors in the align stuff, need more alignment for some asm code for some cpu @@ -207,6 +220,8 @@ */ op_pixels_func avg_no_rnd_pixels_tab[2][4]; + void (*put_no_rnd_pixels_l2[2])(uint8_t *block/*align width (8 or 16)*/, const uint8_t *a/*align 1*/, const uint8_t *b/*align 1*/, int line_size, int h); + /** * Thirdpel motion compensation with rounding (a+b+1)>>1. * this is an array[12] of motion compensation funcions for the 9 thirdpel positions<br> @@ -288,6 +303,45 @@ #define FF_SIMPLE_IDCT_PERM 3 #define FF_TRANSPOSE_IDCT_PERM 4 + int (*try_8x8basis)(int16_t rem[64], int16_t weight[64], int16_t basis[64], int scale); + void (*add_8x8basis)(int16_t rem[64], int16_t basis[64], int scale); +#define BASIS_SHIFT 16 +#define RECON_SHIFT 6 + + /** + * This function handles any initialization for the VP3 DSP functions. + */ + void (*vp3_dsp_init)(void); + + /** + * This function is responsible for taking a block of zigzag'd, + * quantized DCT coefficients, reconstructing the original block of + * samples, and placing it into the output. + * @param input_data 64 zigzag'd, quantized DCT coefficients + * @param dequant_matrix 64 zigzag'd quantizer coefficients + * @param coeff_count index of the last coefficient + * @param dest the final output location where the transformed samples + * are to be placed + * @param stride the width in 8-bit samples of a line on this plane + */ + void (*vp3_idct_put)(int16_t *input_data, int16_t *dequant_matrix, + int coeff_count, uint8_t *dest, int stride); + + /** + * This function is responsible for taking a block of zigzag'd, + * quantized DCT coefficients, reconstructing the original block of + * samples, and adding the transformed samples to an existing block of + * samples in the output. + * @param input_data 64 zigzag'd, quantized DCT coefficients + * @param dequant_matrix 64 zigzag'd quantizer coefficients + * @param coeff_count index of the last coefficient + * @param dest the final output location where the transformed samples + * are to be placed + * @param stride the width in 8-bit samples of a line on this plane + */ + void (*vp3_idct_add)(int16_t *input_data, int16_t *dequant_matrix, + int coeff_count, uint8_t *dest, int stride); + } DSPContext; void dsputil_static_init(void); @@ -457,17 +511,17 @@ void (*fft_calc)(struct FFTContext *s, FFTComplex *z); } FFTContext; -int fft_init(FFTContext *s, int nbits, int inverse); -void fft_permute(FFTContext *s, FFTComplex *z); -void fft_calc_c(FFTContext *s, FFTComplex *z); -void fft_calc_sse(FFTContext *s, FFTComplex *z); -void fft_calc_altivec(FFTContext *s, FFTComplex *z); +int ff_fft_init(FFTContext *s, int nbits, int inverse); +void ff_fft_permute(FFTContext *s, FFTComplex *z); +void ff_fft_calc_c(FFTContext *s, FFTComplex *z); +void ff_fft_calc_sse(FFTContext *s, FFTComplex *z); +void ff_fft_calc_altivec(FFTContext *s, FFTComplex *z); -static inline void fft_calc(FFTContext *s, FFTComplex *z) +static inline void ff_fft_calc(FFTContext *s, FFTComplex *z) { s->fft_calc(s, z); } -void fft_end(FFTContext *s); +void ff_fft_end(FFTContext *s); /* MDCT computation */ Index: dv.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/dv.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- dv.c 1 Feb 2004 05:31:16 -0000 1.12 +++ dv.c 14 Mar 2004 21:14:08 -0000 1.13 @@ -642,12 +642,6 @@ uint32_t partial_bit_buffer; /* we can't use uint16_t here */ } EncBlockInfo; -static always_inline int dv_bits_left(PutBitContext* s) -{ - return (s->buf_end - s->buf) * 8 - - ((s->buf_ptr - s->buf) * 8 + 32 - (int64_t)s->bit_left); -} - static always_inline void dv_encode_ac(EncBlockInfo* bi, PutBitContext* pb_pool, int pb_size) { @@ -660,7 +654,7 @@ bi->partial_bit_count = bi->partial_bit_buffer = 0; vlc_loop: /* Find suitable storage space */ - for (; size > (bits_left = dv_bits_left(pb)); pb++) { + for (; size > (bits_left = put_bits_left(pb)); pb++) { if (bits_left) { size -= bits_left; put_bits(pb, bits_left, vlc >> size); Index: error_resilience.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/error_resilience.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- error_resilience.c 1 Feb 2004 05:31:16 -0000 1.10 +++ error_resilience.c 14 Mar 2004 21:14:08 -0000 1.11 @@ -652,7 +652,7 @@ s->error_status_table[start_xy] |= VP_START; - if(start_xy > 0){ + if(start_xy > 0 && s->avctx->thread_count <= 1){ int prev_status= s->error_status_table[ s->mb_index2xy[start_i - 1] ]; prev_status &= ~ VP_START; Index: eval.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/eval.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- eval.c 1 Feb 2004 05:31:16 -0000 1.5 +++ eval.c 14 Mar 2004 21:14:08 -0000 1.6 @@ -115,12 +115,16 @@ p->s++; // "(" evalExpression(p); d= pop(p); - p->s++; // ")" or "," - if(p->s[-1]== ','){ + if(p->s[0]== ','){ + p->s++; // "," evalExpression(p); d2= pop(p); - p->s++; // ")" } + if(p->s[0] != ')'){ + av_log(NULL, AV_LOG_ERROR, "Parser: missing ) in \"%s\"\n", next); + return; + } + p->s++; // ")" if( strmatch(next, "sinh" ) ) d= sinh(d); else if( strmatch(next, "cosh" ) ) d= cosh(d); @@ -136,7 +140,9 @@ 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; + else if( strmatch(next, "gte" ) ) d= d >= d2 ? 1.0 : 0.0; else if( strmatch(next, "lt" ) ) d= d > d2 ? 0.0 : 1.0; + else if( strmatch(next, "lte" ) ) d= d >= d2 ? 0.0 : 1.0; else if( strmatch(next, "eq" ) ) d= d == d2 ? 1.0 : 0.0; // else if( strmatch(next, "l1" ) ) d= 1 + d2*(d - 1); // else if( strmatch(next, "sq01" ) ) d= (d >= 0.0 && d <=1.0) ? 1.0 : 0.0; @@ -164,10 +170,6 @@ } } - if(p->s[-1]!= ')'){ - av_log(NULL, AV_LOG_ERROR, "Parser: missing ) in \"%s\"\n", next); - return; - } push(p, d); } Index: fft.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/fft.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- fft.c 26 Mar 2003 14:43:53 -0000 1.4 +++ fft.c 14 Mar 2004 21:14:08 -0000 1.5 @@ -28,7 +28,7 @@ * The size of the FFT is 2^nbits. If inverse is TRUE, inverse FFT is * done */ -int fft_init(FFTContext *s, int nbits, int inverse) +int ff_fft_init(FFTContext *s, int nbits, int inverse) { int i, j, m, n; float alpha, c1, s1, s2; @@ -53,7 +53,7 @@ s->exptab[i].re = c1; s->exptab[i].im = s1; } - s->fft_calc = fft_calc_c; + s->fft_calc = ff_fft_calc_c; s->exptab1 = NULL; /* compute constant table for HAVE_SSE version */ @@ -94,9 +94,9 @@ } while (nblocks != 0); av_freep(&s->exptab); #if defined(HAVE_MMX) - s->fft_calc = fft_calc_sse; + s->fft_calc = ff_fft_calc_sse; #else - s->fft_calc = fft_calc_altivec; + s->fft_calc = ff_fft_calc_altivec; #endif } } @@ -142,11 +142,11 @@ } /** - * Do a complex FFT with the parameters defined in fft_init(). The + * Do a complex FFT with the parameters defined in ff_fft_init(). The * input data must be permuted before with s->revtab table. No * 1.0/sqrt(n) normalization is done. */ -void fft_calc_c(FFTContext *s, FFTComplex *z) +void ff_fft_calc_c(FFTContext *s, FFTComplex *z) { int ln = s->nbits; int j, np, np2; @@ -221,9 +221,9 @@ } /** - * Do the permutation needed BEFORE calling fft_calc() + * Do the permutation needed BEFORE calling ff_fft_calc() */ -void fft_permute(FFTContext *s, FFTComplex *z) +void ff_fft_permute(FFTContext *s, FFTComplex *z) { int j, k, np; FFTComplex tmp; @@ -241,7 +241,7 @@ } } -void fft_end(FFTContext *s) +void ff_fft_end(FFTContext *s) { av_freep(&s->revtab); av_freep(&s->exptab); Index: flicvideo.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/flicvideo.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- flicvideo.c 1 Feb 2004 05:11:55 -0000 1.1 +++ flicvideo.c 14 Mar 2004 21:14:08 -0000 1.2 @@ -51,12 +51,6 @@ #define FLI_COPY 16 #define FLI_MINI 18 -#define LE_16(x) ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0]) -#define LE_32(x) ((((uint8_t*)(x))[3] << 24) | \ - (((uint8_t*)(x))[2] << 16) | \ - (((uint8_t*)(x))[1] << 8) | \ - ((uint8_t*)(x))[0]) - typedef struct FlicDecodeContext { AVCodecContext *avctx; AVFrame frame; Index: golomb.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/golomb.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- golomb.h 27 Oct 2003 15:24:38 -0000 1.4 +++ golomb.h 14 Mar 2004 21:14:08 -0000 1.5 @@ -256,6 +256,14 @@ } } +/** + * read unsigned golomb rice code (flac). + */ +static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){ + int v= get_ur_golomb_jpegls(gb, k, limit, esc_len); + return (v>>1) ^ -(v&1); +} + #ifdef TRACE static inline int get_ue(GetBitContext *s, char *file, char *func, int line){ Index: h263.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/h263.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- h263.c 1 Feb 2004 05:31:16 -0000 1.35 +++ h263.c 14 Mar 2004 21:14:08 -0000 1.36 @@ -197,15 +197,36 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) { - int format; + int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref; + int best_clock_code=1; + int best_divisor=60; + int best_error= INT_MAX; + + if(s->h263_plus){ + for(i=0; i<2; i++){ + int div, error; + div= (s->avctx->frame_rate_base*1800000LL + 500LL*s->avctx->frame_rate) / ((1000LL+i)*s->avctx->frame_rate); + div= clip(1, div, 127); + error= ABS(s->avctx->frame_rate_base*1800000LL - (1000LL+i)*s->avctx->frame_rate*div); + if(error < best_error){ + best_error= error; + best_divisor= div; + best_clock_code= i; + } + } + } + s->custom_pcf= best_clock_code!=1 || best_divisor!=60; + coded_frame_rate= 1800000; + coded_frame_rate_base= (1000+best_clock_code)*best_divisor; align_put_bits(&s->pb); /* Update the pointer to last GOB */ s->ptr_lastgob = pbBufPtr(&s->pb); put_bits(&s->pb, 22, 0x20); /* PSC */ - put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) / - s->avctx->frame_rate) & 0xff); + temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->frame_rate_base / + (coded_frame_rate_base * (int64_t)s->avctx->frame_rate); + put_bits(&s->pb, 8, temp_ref & 0xff); /* TemporalReference */ put_bits(&s->pb, 1, 1); /* marker */ put_bits(&s->pb, 1, 0); /* h263 id */ @@ -228,16 +249,18 @@ put_bits(&s->pb, 5, s->qscale); put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */ } else { + int ufep=1; /* H.263v2 */ /* H.263 Plus PTYPE */ + put_bits(&s->pb, 3, 7); - put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */ + put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */ if (format == 7) put_bits(&s->pb,3,6); /* Custom Source Format */ else put_bits(&s->pb, 3, format); - put_bits(&s->pb,1,0); /* Custom PCF: off */ + put_bits(&s->pb,1, s->custom_pcf); put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */ put_bits(&s->pb,1,0); /* SAC: off */ put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */ @@ -275,6 +298,13 @@ put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den); } } + if(s->custom_pcf){ + if(ufep){ + put_bits(&s->pb, 1, best_clock_code); + put_bits(&s->pb, 7, best_divisor); + } + put_bits(&s->pb, 2, (temp_ref>>8)&3); + } /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ if (s->umvplus) @@ -1123,7 +1153,7 @@ /* compute cbp */ cbp= get_p_cbp(s, block, motion_x, motion_y); - if ((cbp | motion_x | motion_y | s->dquant) == 0) { + if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) { /* skip macroblock */ put_bits(&s->pb, 1, 1); if(interleaved_stats){ @@ -1961,7 +1991,9 @@ s->luma_dc_vlc_length= uni_DCtab_lum_len; s->chroma_dc_vlc_length= uni_DCtab_chrom_len; s->ac_esc_length= 7+2+1+6+1+12+1; - + s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; + s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; + if(s->flags & CODEC_FLAG_GLOBAL_HEADER){ s->avctx->extradata= av_malloc(1024); @@ -1972,7 +2004,7 @@ // ff_mpeg4_stuffing(&s->pb); ? flush_put_bits(&s->pb); - s->avctx->extradata_size= (get_bit_count(&s->pb)+7)>>3; + s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3; } break; @@ -2146,7 +2178,7 @@ { int length; put_bits(pbc, 1, 0); - length= (-get_bit_count(pbc))&7; + length= (-put_bits_count(pbc))&7; if(length) put_bits(pbc, length, (1<<length)-1); } @@ -2154,10 +2186,9 @@ void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){ int time_div, time_mod; - if(s->current_picture_ptr->pts) - s->time= (s->current_picture_ptr->pts*s->time_increment_resolution + 500*1000)/(1000*1000); - else - s->time= av_rescale(picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->frame_rate); + assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE); + s->time= (s->current_picture_ptr->pts*s->time_increment_resolution + AV_TIME_BASE/2)/AV_TIME_BASE; + time_div= s->time/s->time_increment_resolution; time_mod= s->time%s->time_increment_resolution; @@ -2178,11 +2209,10 @@ put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, GOP_STARTCODE); - if(s->current_picture_ptr->pts && s->reordered_input_picture[1]){ - time= FFMIN(s->reordered_input_picture[1]->pts, s->current_picture_ptr->pts); - time= (time*s->time_increment_resolution + 500*1000)/(1000*1000); - }else - time= av_rescale(s->current_picture_ptr->coded_picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->frame_rate); + time= s->current_picture_ptr->pts; + if(s->reordered_input_picture[1]) + time= FFMIN(time, s->reordered_input_picture[1]->pts); + time= (time*s->time_increment_resolution + AV_TIME_BASE/2)/AV_TIME_BASE; seconds= time/s->time_increment_resolution; minutes= seconds/60; seconds %= 60; @@ -2290,12 +2320,11 @@ put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1); put_bits(&s->pb, 1, 1); /* obmc disable */ if (vo_ver_id == 1) { - put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */ + put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */ }else{ - put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */ + put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */ } - s->quant_precision=5; put_bits(&s->pb, 1, 0); /* not 8 bit == false */ put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/ @@ -2326,8 +2355,7 @@ if(!(s->flags & CODEC_FLAG_BITEXACT)){ put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, 0x1B2); /* user_data */ - put_string(&s->pb, LIBAVCODEC_IDENT); - ff_mpeg4_stuffing(&s->pb); + put_string(&s->pb, LIBAVCODEC_IDENT, 0); } } @@ -2385,9 +2413,6 @@ if (s->pict_type == B_TYPE) put_bits(&s->pb, 3, s->b_code); /* fcode_back */ // printf("****frame %d\n", picture_number); - - 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; } #endif //CONFIG_ENCODERS @@ -2966,15 +2991,23 @@ void ff_mpeg4_init_partitions(MpegEncContext *s) { - init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE); - init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE); + uint8_t *start= pbBufPtr(&s->pb); + uint8_t *end= s->pb.buf_end; + int size= end - start; + int pb_size = size/3; + int pb2_size= size/3; + int tex_size= size - pb_size - pb2_size; + + set_put_bits_buffer_size(&s->pb, pb_size); + init_put_bits(&s->tex_pb, start + pb_size , tex_size); + init_put_bits(&s->pb2 , start + pb_size + tex_size, pb2_size); } void ff_mpeg4_merge_partitions(MpegEncContext *s) { - const int pb2_len = get_bit_count(&s->pb2 ); - const int tex_pb_len= get_bit_count(&s->tex_pb); - const int bits= get_bit_count(&s->pb); + const int pb2_len = put_bits_count(&s->pb2 ); + const int tex_pb_len= put_bits_count(&s->tex_pb); + const int bits= put_bits_count(&s->pb); if(s->pict_type==I_TYPE){ put_bits(&s->pb, 19, DC_MARKER); @@ -2990,9 +3023,10 @@ flush_put_bits(&s->pb2); flush_put_bits(&s->tex_pb); - ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len); - ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len); - s->last_bits= get_bit_count(&s->pb); + set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf); + ff_copy_bits(&s->pb, s->pb2.buf , pb2_len); + ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len); + s->last_bits= put_bits_count(&s->pb); } #endif //CONFIG_ENCODERS @@ -3302,18 +3336,18 @@ if(s->pict_type==I_TYPE){ int i; - if(show_bits_long(&s->gb, 19)==DC_MARKER){ - return mb_num-1; - } - do{ + if(show_bits_long(&s->gb, 19)==DC_MARKER){ + return mb_num-1; + } + cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); if (cbpc < 0){ av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); return -1; } }while(cbpc == 8); - + s->cbp_table[xy]= cbpc & 3; s->current_picture.mb_type[xy]= MB_TYPE_INTRA; s->mb_intra = 1; @@ -3340,7 +3374,7 @@ int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]]; const int stride= s->block_wrap[0]*2; -// do{ //FIXME +try_again: bits= show_bits(&s->gb, 17); if(bits==MOTION_MARKER){ return mb_num-1; @@ -3371,7 +3405,8 @@ av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); return -1; } -// }while(cbpc == 20); + if(cbpc == 20) + goto try_again; s->cbp_table[xy]= cbpc&(8+3); //8 is dquant @@ -3552,11 +3587,15 @@ s->mb_num_left= mb_num; if(s->pict_type==I_TYPE){ + while(show_bits(&s->gb, 9) == 1) + skip_bits(&s->gb, 9); if(get_bits_long(&s->gb, 19)!=DC_MARKER){ av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y); return -1; } }else{ + while(show_bits(&s->gb, 10) == 1) + skip_bits(&s->gb, 10); if(get_bits(&s->gb, 17)!=MOTION_MARKER){ av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y); return -1; @@ -3867,8 +3906,15 @@ } } + /* decode each block */ + for (i = 0; i < 6; i++) { + if (h263_decode_block(s, block[i], i, cbp&32) < 0) + return -1; + cbp+=cbp; + } + if(s->obmc){ - if(s->pict_type == P_TYPE && s->mb_x+1<s->mb_width) + if(s->pict_type == P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1) preview_obmc(s); } } else if(s->pict_type==B_TYPE) { @@ -3958,6 +4004,13 @@ } s->current_picture.mb_type[xy]= mb_type; + + /* decode each block */ + for (i = 0; i < 6; i++) { + if (h263_decode_block(s, block[i], i, cbp&32) < 0) + return -1; + cbp+=cbp; + } } else { /* I-Frame */ do{ cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); @@ -3990,13 +4043,13 @@ if (dquant) { h263_decode_dquant(s); } - } - /* decode each block */ - for (i = 0; i < 6; i++) { - if (h263_decode_block(s, block[i], i, cbp&32) < 0) - return -1; - cbp+=cbp; + /* decode each block */ + for (i = 0; i < 6; i++) { + if (h263_decode_block(s, block[i], i, cbp&32) < 0) + return -1; + cbp+=cbp; + } } end: @@ -4873,7 +4926,10 @@ return -1; } /* temporal reference */ - s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ + i = get_bits(&s->gb, 8); /* picture timestamp */ + if( (s->picture_number&~0xFF)+i < s->picture_number) + i+= 256; + s->picture_number= (s->picture_number&~0xFF) + i; /* PTYPE starts here */ if (get_bits1(&s->gb) != 1) { @@ -4925,6 +4981,9 @@ s->width = width; s->height = height; + s->avctx->sample_aspect_ratio= (AVRational){12,11}; + s->avctx->frame_rate = 30000; + s->avctx->frame_rate_base= 1001; } else { int ufep; @@ -4937,7 +4996,7 @@ /* OPPTYPE */ format = get_bits(&s->gb, 3); dprintf("ufep=1, format: %d\n", format); - skip_bits(&s->gb,1); /* Custom PCF */ + s->custom_pcf= get_bits1(&s->gb); s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */ if (get_bits1(&s->gb) != 0) { av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n"); @@ -5010,11 +5069,37 @@ } else { width = h263_format[format][0]; height = h263_format[format][1]; + s->avctx->sample_aspect_ratio= (AVRational){12,11}; } if ((width == 0) || (height == 0)) return -1; s->width = width; s->height = height; + + if(s->custom_pcf){ + int gcd; + s->avctx->frame_rate= 1800000; + s->avctx->frame_rate_base= 1000 + get_bits1(&s->gb); + s->avctx->frame_rate_base*= get_bits(&s->gb, 7); + if(s->avctx->frame_rate_base == 0){ + av_log(s, AV_LOG_ERROR, "zero framerate\n"); + return -1; + } + gcd= ff_gcd(s->avctx->frame_rate, s->avctx->frame_rate_base); + s->avctx->frame_rate /= gcd; + s->avctx->frame_rate_base /= gcd; +// av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->frame_rate, s->avctx->frame_rate_base); + }else{ + s->avctx->frame_rate = 30000; + s->avctx->frame_rate_base= 1001; + } + } + + if(s->custom_pcf){ + skip_bits(&s->gb, 2); //extended Temporal reference + } + + if (ufep) { if (s->umvplus) { if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ skip_bits1(&s->gb); @@ -5061,7 +5146,7 @@ } if(s->avctx->debug&FF_DEBUG_PICT_INFO){ - av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s\n", + av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n", s->qscale, av_get_pict_type_char(s->pict_type), s->gb.size_in_bits, 1-s->no_rounding, s->obmc ? " AP" : "", @@ -5072,7 +5157,8 @@ s->alt_inter_vlc ? " AIV" : "", s->modified_quant ? " MQ" : "", s->loop_filter ? " LOOP" : "", - s->h263_slice_structured ? " SS" : "" + s->h263_slice_structured ? " SS" : "", + s->avctx->frame_rate, s->avctx->frame_rate_base ); } #if 1 @@ -5690,9 +5776,9 @@ - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; } - s->current_picture_ptr->pts= s->time*1000LL*1000LL / s->time_increment_resolution; + s->current_picture_ptr->pts= s->time*(int64_t)AV_TIME_BASE / s->time_increment_resolution; if(s->avctx->debug&FF_DEBUG_PTS) - av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %f\n", s->current_picture_ptr->pts/(1000.0*1000.0)); + av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %f\n", s->current_picture_ptr->pts/(float)AV_TIME_BASE); check_marker(gb, "before vop_coded"); Index: h264.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/h264.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- h264.c 1 Feb 2004 05:31:16 -0000 1.10 +++ h264.c 14 Mar 2004 21:14:08 -0000 1.11 @@ -1070,7 +1070,7 @@ static void encode_rbsp_trailing(PutBitContext *pb){ int length; put_bits(pb, 1, 1); - length= (-get_bit_count(pb))&7; + length= (-put_bits_count(pb))&7; if(length) put_bits(pb, length, 0); } Index: huffyuv.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libffmpeg/libavcodec/huffyuv.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- huffyuv.c 1 Feb 2004 05:31:16 -0000 1.14 +++ huffyuv.c 14 Mar 2004 21:14:08 -0000 1.15 @@ -1049,7 +1049,7 @@ } emms_c(); - size= (get_bit_count(&s->pb)+31)/32; + size= (put_bits_count(&s->pb)+31)/32; if((s->flags&CODEC_FLAG_PASS1) && (s->picture_number&31)==0){ int j; Index: indeo3.c ==============... [truncated message content] |