summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-11-11 13:45:34 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-11-11 13:45:34 +0000
commit810ddddbc0d5f6587b9154115fa60d546d728310 (patch)
tree67256930a6cd947fb3f09b070b19dedd4fbbcd10
parente38a8cca2c6be40954a44f167f7cc9fac0813ede (diff)
downloadxine-lib-810ddddbc0d5f6587b9154115fa60d546d728310.tar.gz
xine-lib-810ddddbc0d5f6587b9154115fa60d546d728310.tar.bz2
sync ffmpeg
- add wma decoder - fix mmx macro - remove changes from fdct_mmx.c (it should work fine now with the mmx macro fix) CVS patchset: 3234 CVS date: 2002/11/11 13:45:34
-rw-r--r--src/libffmpeg/libavcodec/alpha/dsputil_alpha.c104
-rw-r--r--src/libffmpeg/libavcodec/avcodec.h136
-rw-r--r--src/libffmpeg/libavcodec/common.c27
-rw-r--r--src/libffmpeg/libavcodec/common.h98
-rw-r--r--src/libffmpeg/libavcodec/dsputil.c133
-rw-r--r--src/libffmpeg/libavcodec/dsputil.h131
-rw-r--r--src/libffmpeg/libavcodec/dv.c64
-rw-r--r--src/libffmpeg/libavcodec/error_resilience.c28
-rw-r--r--src/libffmpeg/libavcodec/h263.c40
-rw-r--r--src/libffmpeg/libavcodec/h263dec.c100
-rw-r--r--src/libffmpeg/libavcodec/i386/Makefile.am1
-rw-r--r--src/libffmpeg/libavcodec/i386/cputest.c21
-rw-r--r--src/libffmpeg/libavcodec/i386/dsputil_mmx.c241
-rw-r--r--src/libffmpeg/libavcodec/i386/fdct_mmx.c24
-rw-r--r--src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c11
-rw-r--r--src/libffmpeg/libavcodec/i386/simple_idct_mmx.c4
-rw-r--r--src/libffmpeg/libavcodec/imgconvert.c232
-rw-r--r--src/libffmpeg/libavcodec/mdct.c12
-rw-r--r--src/libffmpeg/libavcodec/mjpeg.c143
-rw-r--r--src/libffmpeg/libavcodec/mlib/dsputil_mlib.c46
-rw-r--r--src/libffmpeg/libavcodec/motion_est.c92
-rw-r--r--src/libffmpeg/libavcodec/mpeg12.c65
-rw-r--r--src/libffmpeg/libavcodec/mpegvideo.c195
-rw-r--r--src/libffmpeg/libavcodec/mpegvideo.h30
-rw-r--r--src/libffmpeg/libavcodec/msmpeg4.c2
-rw-r--r--src/libffmpeg/libavcodec/ppc/Makefile.am6
-rw-r--r--src/libffmpeg/libavcodec/ppc/dsputil_altivec.c126
-rw-r--r--src/libffmpeg/libavcodec/ppc/dsputil_altivec.h21
-rw-r--r--src/libffmpeg/libavcodec/ppc/dsputil_ppc.c38
-rw-r--r--src/libffmpeg/libavcodec/ppc/idct_altivec.c216
-rw-r--r--src/libffmpeg/libavcodec/ppc/mpegvideo_altivec.c509
-rw-r--r--src/libffmpeg/libavcodec/ppc/mpegvideo_ppc.c77
-rw-r--r--src/libffmpeg/libavcodec/ratecontrol.c4
-rw-r--r--src/libffmpeg/libavcodec/rv10.c2
-rw-r--r--src/libffmpeg/libavcodec/svq1.c18
-rw-r--r--src/libffmpeg/libavcodec/svq1_cb.h28
-rw-r--r--src/libffmpeg/libavcodec/utils.c8
-rw-r--r--src/libffmpeg/libavcodec/wmadec.c32
-rw-r--r--src/libffmpeg/xine_decoder.c33
-rw-r--r--src/xine-utils/xineutils.h6
40 files changed, 2219 insertions, 885 deletions
diff --git a/src/libffmpeg/libavcodec/alpha/dsputil_alpha.c b/src/libffmpeg/libavcodec/alpha/dsputil_alpha.c
index 371e20269..401dfd787 100644
--- a/src/libffmpeg/libavcodec/alpha/dsputil_alpha.c
+++ b/src/libffmpeg/libavcodec/alpha/dsputil_alpha.c
@@ -281,61 +281,61 @@ void put_pixels16_axp_asm(uint8_t *block, const uint8_t *pixels,
put_pixels_axp_asm(block + 8, pixels + 8, line_size, h);
}
-void dsputil_init_alpha(void)
+void dsputil_init_alpha(DSPContext* c, unsigned mask)
{
- put_pixels_tab[0][0] = put_pixels16_axp_asm;
- put_pixels_tab[0][1] = put_pixels16_x2_axp;
- put_pixels_tab[0][2] = put_pixels16_y2_axp;
- put_pixels_tab[0][3] = put_pixels16_xy2_axp;
-
- put_no_rnd_pixels_tab[0][0] = put_pixels16_axp_asm;
- put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_axp;
- put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_axp;
- put_no_rnd_pixels_tab[0][3] = put_no_rnd_pixels16_xy2_axp;
-
- avg_pixels_tab[0][0] = avg_pixels16_axp;
- avg_pixels_tab[0][1] = avg_pixels16_x2_axp;
- avg_pixels_tab[0][2] = avg_pixels16_y2_axp;
- avg_pixels_tab[0][3] = avg_pixels16_xy2_axp;
-
- avg_no_rnd_pixels_tab[0][0] = avg_no_rnd_pixels16_axp;
- avg_no_rnd_pixels_tab[0][1] = avg_no_rnd_pixels16_x2_axp;
- avg_no_rnd_pixels_tab[0][2] = avg_no_rnd_pixels16_y2_axp;
- avg_no_rnd_pixels_tab[0][3] = avg_no_rnd_pixels16_xy2_axp;
-
- put_pixels_tab[1][0] = put_pixels_axp_asm;
- put_pixels_tab[1][1] = put_pixels_x2_axp;
- put_pixels_tab[1][2] = put_pixels_y2_axp;
- put_pixels_tab[1][3] = put_pixels_xy2_axp;
-
- put_no_rnd_pixels_tab[1][0] = put_pixels_axp_asm;
- put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels_x2_axp;
- put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels_y2_axp;
- put_no_rnd_pixels_tab[1][3] = put_no_rnd_pixels_xy2_axp;
-
- avg_pixels_tab[1][0] = avg_pixels_axp;
- avg_pixels_tab[1][1] = avg_pixels_x2_axp;
- avg_pixels_tab[1][2] = avg_pixels_y2_axp;
- avg_pixels_tab[1][3] = avg_pixels_xy2_axp;
-
- avg_no_rnd_pixels_tab[1][0] = avg_no_rnd_pixels_axp;
- avg_no_rnd_pixels_tab[1][1] = avg_no_rnd_pixels_x2_axp;
- avg_no_rnd_pixels_tab[1][2] = avg_no_rnd_pixels_y2_axp;
- avg_no_rnd_pixels_tab[1][3] = avg_no_rnd_pixels_xy2_axp;
-
- clear_blocks = clear_blocks_axp;
+ c->put_pixels_tab[0][0] = put_pixels16_axp_asm;
+ c->put_pixels_tab[0][1] = put_pixels16_x2_axp;
+ c->put_pixels_tab[0][2] = put_pixels16_y2_axp;
+ c->put_pixels_tab[0][3] = put_pixels16_xy2_axp;
+
+ c->put_no_rnd_pixels_tab[0][0] = put_pixels16_axp_asm;
+ c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_axp;
+ c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_axp;
+ c->put_no_rnd_pixels_tab[0][3] = put_no_rnd_pixels16_xy2_axp;
+
+ c->avg_pixels_tab[0][0] = avg_pixels16_axp;
+ c->avg_pixels_tab[0][1] = avg_pixels16_x2_axp;
+ c->avg_pixels_tab[0][2] = avg_pixels16_y2_axp;
+ c->avg_pixels_tab[0][3] = avg_pixels16_xy2_axp;
+
+ c->avg_no_rnd_pixels_tab[0][0] = avg_no_rnd_pixels16_axp;
+ c->avg_no_rnd_pixels_tab[0][1] = avg_no_rnd_pixels16_x2_axp;
+ c->avg_no_rnd_pixels_tab[0][2] = avg_no_rnd_pixels16_y2_axp;
+ c->avg_no_rnd_pixels_tab[0][3] = avg_no_rnd_pixels16_xy2_axp;
+
+ c->put_pixels_tab[1][0] = put_pixels_axp_asm;
+ c->put_pixels_tab[1][1] = put_pixels_x2_axp;
+ c->put_pixels_tab[1][2] = put_pixels_y2_axp;
+ c->put_pixels_tab[1][3] = put_pixels_xy2_axp;
+
+ c->put_no_rnd_pixels_tab[1][0] = put_pixels_axp_asm;
+ c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels_x2_axp;
+ c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels_y2_axp;
+ c->put_no_rnd_pixels_tab[1][3] = put_no_rnd_pixels_xy2_axp;
+
+ c->avg_pixels_tab[1][0] = avg_pixels_axp;
+ c->avg_pixels_tab[1][1] = avg_pixels_x2_axp;
+ c->avg_pixels_tab[1][2] = avg_pixels_y2_axp;
+ c->avg_pixels_tab[1][3] = avg_pixels_xy2_axp;
+
+ c->avg_no_rnd_pixels_tab[1][0] = avg_no_rnd_pixels_axp;
+ c->avg_no_rnd_pixels_tab[1][1] = avg_no_rnd_pixels_x2_axp;
+ c->avg_no_rnd_pixels_tab[1][2] = avg_no_rnd_pixels_y2_axp;
+ c->avg_no_rnd_pixels_tab[1][3] = avg_no_rnd_pixels_xy2_axp;
+
+ c->clear_blocks = clear_blocks_axp;
/* amask clears all bits that correspond to present features. */
if (amask(AMASK_MVI) == 0) {
- put_pixels_clamped = put_pixels_clamped_mvi_asm;
- add_pixels_clamped = add_pixels_clamped_mvi_asm;
-
- get_pixels = get_pixels_mvi;
- diff_pixels = diff_pixels_mvi;
- pix_abs8x8 = pix_abs8x8_mvi;
- pix_abs16x16 = pix_abs16x16_mvi_asm;
- pix_abs16x16_x2 = pix_abs16x16_x2_mvi;
- pix_abs16x16_y2 = pix_abs16x16_y2_mvi;
- pix_abs16x16_xy2 = pix_abs16x16_xy2_mvi;
+ c->put_pixels_clamped = put_pixels_clamped_mvi_asm;
+ c->add_pixels_clamped = add_pixels_clamped_mvi_asm;
+
+ c->get_pixels = get_pixels_mvi;
+ c->diff_pixels = diff_pixels_mvi;
+ c->pix_abs8x8 = pix_abs8x8_mvi;
+ c->pix_abs16x16 = pix_abs16x16_mvi_asm;
+ c->pix_abs16x16_x2 = pix_abs16x16_x2_mvi;
+ c->pix_abs16x16_y2 = pix_abs16x16_y2_mvi;
+ c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mvi;
}
}
diff --git a/src/libffmpeg/libavcodec/avcodec.h b/src/libffmpeg/libavcodec/avcodec.h
index 9f80071aa..8e2fc3d58 100644
--- a/src/libffmpeg/libavcodec/avcodec.h
+++ b/src/libffmpeg/libavcodec/avcodec.h
@@ -5,8 +5,8 @@
#define LIBAVCODEC_VERSION_INT 0x000406
#define LIBAVCODEC_VERSION "0.4.6"
-#define LIBAVCODEC_BUILD 4632
-#define LIBAVCODEC_BUILD_STR "4632"
+#define LIBAVCODEC_BUILD 4638
+#define LIBAVCODEC_BUILD_STR "4638"
enum CodecID {
CODEC_ID_NONE,
@@ -32,6 +32,8 @@ enum CodecID {
CODEC_ID_DVAUDIO,
CODEC_ID_WMAV1,
CODEC_ID_WMAV2,
+ CODEC_ID_MACE3,
+ CODEC_ID_MACE6,
/* various pcm "codecs" */
CODEC_ID_PCM_S16LE,
@@ -48,7 +50,6 @@ enum CodecID {
CODEC_ID_ADPCM_IMA_WAV,
CODEC_ID_ADPCM_MS,
};
-#define CODEC_ID_MSMPEG4 CODEC_ID_MSMPEG4V3
enum CodecType {
CODEC_TYPE_UNKNOWN = -1,
@@ -78,6 +79,12 @@ enum SampleFormat {
/* in bytes */
#define AVCODEC_MAX_AUDIO_FRAME_SIZE 131072
+/**
+ * Required number of zero bytes at the end of the input bitstream for decoding.
+ * to avoid overreading (and possibly segfaulting)
+ */
+#define FF_INPUT_BUFFER_PADDING_SIZE 8
+
/* motion estimation type, EPZS by default */
enum Motion_Est_ID {
ME_ZERO = 1,
@@ -115,7 +122,6 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG,
#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_TYPE 0x0040 /* fixed I/P frame type, from avctx->key_frame */
#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 */
@@ -126,10 +132,11 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG,
#define CODEC_FLAG_GRAY 0x2000 /* only decode/encode grayscale */
#define CODEC_FLAG_EMU_EDGE 0x4000/* dont draw edges */
#define CODEC_FLAG_DR1 0x8000 /* direct renderig type 1 (store internal frames in external buffers) */
-#define CODEC_FLAG_NOT_TRUNCATED 0x00010000 /* input bitstream is not truncated, except before a startcode
- allows the last part of a frame to be decoded earlier */
+#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 */
/* codec capabilities */
@@ -138,6 +145,7 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG,
/* 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
@@ -348,7 +356,7 @@ typedef struct AVCodecContext {
/**
* encoding: unused
- * decoding: set by user. 1-> skip b frames, 2-> skip idct/dequant too
+ * decoding: set by user. 1-> skip b frames, 2-> skip idct/dequant too, 5-> skip everything except header
*/
int hurry_up;
@@ -400,7 +408,7 @@ typedef struct AVCodecContext {
/**
* number of bits used for the previously encoded frame
* encoding: set by lavc
- * decoding: unused
+ * decoding: - for audio - bits_per_sample
*/
int frame_bits;
@@ -467,15 +475,17 @@ typedef struct AVCodecContext {
*/
int error_resilience;
-#ifndef MBC
-#define MBC 128
-#define MBR 96
-#endif
-#define QP_TYPE int //FIXME note xxx this might be changed to int8_t
-
- QP_TYPE *quant_store; /* field for communicating with external postprocessing */
+ /**
+ * obsolete, just here to keep ABI compatible (should be removed perhaps, dunno)
+ */
+ int *quant_store;
- unsigned qstride;
+ /**
+ * QP store stride
+ * encoding: unused
+ * decoding: set by lavc
+ */
+ int qstride;
/**
* buffer, where the next picture should be decoded into
@@ -646,6 +656,7 @@ typedef struct AVCodecContext {
#define FF_DCT_INT 2
#define FF_DCT_MMX 3
#define FF_DCT_MLIB 4
+#define FF_DCT_ALTIVEC 5
/**
* presentation timestamp in micro seconds (time when frame should be shown to user)
@@ -712,6 +723,7 @@ typedef struct AVCodecContext {
#define FF_IDCT_PS2 5
#define FF_IDCT_MLIB 6
#define FF_IDCT_ARM 7
+#define FF_IDCT_ALTIVEC 8
/**
* slice count
@@ -735,40 +747,29 @@ typedef struct AVCodecContext {
#define FF_EC_GUESS_MVS 1
#define FF_EC_DEBLOCK 2
- //FIXME this should be reordered after kabis API is finished ...
- //TODO kill kabi
- /*
- Note: Below are located reserved fields for further usage
- It requires for ABI !!!
- If you'll perform some changes then borrow new space from these fields
- (void * can be safety replaced with struct * ;)
- P L E A S E ! ! !
- Note: use avcodec_alloc_context instead of malloc to allocate this,
- otherwise the ABI compatibility will be broken between versions
- IMPORTANT: Never change order of already declared fields!!!
- */
- //TODO: remove mess below
- unsigned long long int
- ull_res0,ull_res1,ull_res2,ull_res3,ull_res4,ull_res5,
- ull_res6,ull_res7,ull_res8,ull_res9,ull_res10,ull_res11;
- float
- flt_res0,flt_res1,flt_res2,flt_res3,flt_res4,flt_res5,
- flt_res6,flt_res7,flt_res8,flt_res9,flt_res10,flt_res11,flt_res12;
- void
- *ptr_res0,*ptr_res1,*ptr_res2,*ptr_res3,*ptr_res4,*ptr_res5,
- *ptr_res6,*ptr_res7,*ptr_res8,*ptr_res9,*ptr_res10,*ptr_res11,*ptr_res12;
- unsigned long int
- ul_res0,ul_res1,ul_res2,ul_res3,ul_res4,ul_res5,
- ul_res6,ul_res7,ul_res8,ul_res9,ul_res10,ul_res11,ul_res12;
- unsigned short int
- us_res0,us_res1,us_res2,us_res3,us_res4,us_res5,
- us_res6,us_res7,us_res8,us_res9,us_res10,us_res11,us_res12;
- unsigned char
- uc_res0,uc_res1,uc_res2,uc_res3,uc_res4,uc_res5,
- uc_res6,uc_res7,uc_res8,uc_res9,uc_res10,uc_res11,uc_res12;
- unsigned int
- ui_res0,ui_res1,ui_res2,ui_res3,ui_res4,ui_res5,ui_res6,ui_res7,ui_res8,ui_res9,
- ui_res10,ui_res11,ui_res12,ui_res13,ui_res14,ui_res15,ui_res16;
+ /**
+ * QP table of the currently decoded frame
+ * encoding; unused
+ * decoding: set by lavc
+ */
+ int8_t *current_qscale_table;
+ /**
+ * QP table of the currently displayed frame
+ * encoding; unused
+ * decoding: set by lavc
+ */
+ int8_t *display_qscale_table;
+ /**
+ * force specific pict_type.
+ * encoding; set by user (I/P/B_TYPE)
+ * decoding: unused
+ */
+ int force_type;
+ /**
+ * dsp_mask could be used to disable unwanted
+ * CPU features (i.e. MMX, SSE. ...)
+ */
+ unsigned dsp_mask;
} AVCodecContext;
typedef struct AVCodec {
@@ -783,29 +784,15 @@ typedef struct AVCodec {
UINT8 *buf, int buf_size);
int capabilities;
struct AVCodec *next;
- /*
- Note: Below are located reserved fields for further usage
- It requires for ABI !!!
- If you'll perform some changes then borrow new space from these fields
- (void * can be safety replaced with struct * ;)
- P L E A S E ! ! !
- IMPORTANT: Never change order of already declared fields!!!
- */
- unsigned long long int
- ull_res0,ull_res1,ull_res2,ull_res3,ull_res4,ull_res5,
- ull_res6,ull_res7,ull_res8,ull_res9,ull_res10,ull_res11,ull_res12;
- float
- flt_res0,flt_res1,flt_res2,flt_res3,flt_res4,flt_res5,
- flt_res6,flt_res7,flt_res8,flt_res9,flt_res10,flt_res11,flt_res12;
- void
- *ptr_res0,*ptr_res1,*ptr_res2,*ptr_res3,*ptr_res4,*ptr_res5,
- *ptr_res6,*ptr_res7,*ptr_res8,*ptr_res9,*ptr_res10,*ptr_res11,*ptr_res12;
} AVCodec;
-/* three components are given, that's all */
+/**
+ * four components are given, that's all.
+ * the last component is alpha
+ */
typedef struct AVPicture {
- UINT8 *data[3];
- int linesize[3];
+ UINT8 *data[4];
+ int linesize[4];
} AVPicture;
extern AVCodec ac3_encoder;
@@ -842,11 +829,13 @@ extern AVCodec wmav2_decoder;
extern AVCodec mjpeg_decoder;
extern AVCodec mp2_decoder;
extern AVCodec mp3_decoder;
+extern AVCodec mace3_decoder;
+extern AVCodec mace6_decoder;
/* pcm codecs */
#define PCM_CODEC(id, name) \
extern AVCodec name ## _decoder; \
-extern AVCodec name ## _encoder;
+extern AVCodec name ## _encoder
PCM_CODEC(CODEC_ID_PCM_S16LE, pcm_s16le);
PCM_CODEC(CODEC_ID_PCM_S16BE, pcm_s16be);
@@ -955,11 +944,6 @@ void avcodec_register_all(void);
void avcodec_flush_buffers(AVCodecContext *avctx);
-#ifdef FF_POSTPROCESS
-extern int quant_store[MBR+1][MBC+1]; // [Review]
-#endif
-
-
/**
* Interface for 0.5.0 version
*
diff --git a/src/libffmpeg/libavcodec/common.c b/src/libffmpeg/libavcodec/common.c
index fde12d927..1140d56cc 100644
--- a/src/libffmpeg/libavcodec/common.c
+++ b/src/libffmpeg/libavcodec/common.c
@@ -87,33 +87,6 @@ void flush_put_bits(PutBitContext *s)
#endif
}
-/* pad the end of the output stream with zeros */
-#ifndef ALT_BITSTREAM_WRITER
-void jflush_put_bits(PutBitContext *s)
-{
- unsigned int b;
- s->bit_buf<<= s->bit_left;
- s->bit_buf |= ~1U >> (32 - s->bit_left); /* set all the unused bits to one */
-
- while (s->bit_left < 32) {
- b = s->bit_buf >> 24;
- *s->buf_ptr++ = b;
- if (b == 0xff)
- *s->buf_ptr++ = 0;
- s->bit_buf<<=8;
- s->bit_left+=8;
- }
- s->bit_left=32;
- s->bit_buf=0;
-}
-#else
-void jflush_put_bits(PutBitContext *s)
-{
- int num= ( - s->index) & 7;
- jput_bits(s, num,0xFF>>(8-num));
-}
-#endif
-
void put_string(PutBitContext * pbc, char *s)
{
while(*s){
diff --git a/src/libffmpeg/libavcodec/common.h b/src/libffmpeg/libavcodec/common.h
index 8b8c7453b..822233112 100644
--- a/src/libffmpeg/libavcodec/common.h
+++ b/src/libffmpeg/libavcodec/common.h
@@ -108,7 +108,6 @@ 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)
@@ -117,7 +116,6 @@ typedef signed long long INT64;
# ifdef USE_FASTMEMCPY
# include "fastmemcpy.h"
# endif
-
# endif /* HAVE_AV_CONFIG_H */
#endif /* !CONFIG_WIN32 */
@@ -170,8 +168,9 @@ inline void dprintf(const char* fmt,...) {}
/* assume b>0 */
#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
#define ABS(a) ((a) >= 0 ? (a) : (-(a)))
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
-#define MIN(a,b) ((a) > (b) ? (b) : (a))
+
+#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
+#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
#ifdef ARCH_X86
// avoid +32 for shift optimization (gcc should do that ...)
@@ -222,9 +221,6 @@ void align_put_bits(PutBitContext *s);
void flush_put_bits(PutBitContext *s);
void put_string(PutBitContext * pbc, char *s);
-/* jpeg specific put_bits */
-void jflush_put_bits(PutBitContext *s);
-
/* bit input */
typedef struct GetBitContext {
@@ -385,94 +381,6 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value)
}
#endif
-#ifndef ALT_BITSTREAM_WRITER
-/* for jpeg : escape 0xff with 0x00 after it */
-static inline void jput_bits(PutBitContext *s, int n, unsigned int value)
-{
- unsigned int bit_buf, b;
- int bit_left, i;
-
- assert(n == 32 || value < (1U << n));
-
- bit_buf = s->bit_buf;
- bit_left = s->bit_left;
-
- //printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
- /* XXX: optimize */
- if (n < bit_left) {
- bit_buf = (bit_buf<<n) | value;
- bit_left-=n;
- } else {
- bit_buf<<=bit_left;
- bit_buf |= value >> (n - bit_left);
- /* handle escape */
- for(i=0;i<4;i++) {
- b = (bit_buf >> 24);
- *(s->buf_ptr++) = b;
- if (b == 0xff)
- *(s->buf_ptr++) = 0;
- bit_buf <<= 8;
- }
-
- bit_left+= 32 - n;
- bit_buf = value;
- }
-
- s->bit_buf = bit_buf;
- s->bit_left = bit_left;
-}
-#endif
-
-
-#ifdef ALT_BITSTREAM_WRITER
-static inline void jput_bits(PutBitContext *s, int n, int value)
-{
- int index= s->index;
- uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
- int v= ptr[0];
-//if(n>24) printf("%d %d\n", n, value);
-
- v |= be2me_32(value<<(32-n-(index&7) ));
- if(((v+0x01010101)^0xFFFFFFFF)&v&0x80808080)
- {
- /* handle idiotic (m)jpeg escapes */
- uint8_t *bPtr= (uint8_t*)ptr;
- int numChecked= ((index+n)>>3) - (index>>3);
-
- v= be2me_32(v);
-
- *(bPtr++)= v>>24;
- if((v&0xFF000000)==0xFF000000 && numChecked>0){
- *(bPtr++)= 0x00;
- index+=8;
- }
- *(bPtr++)= (v>>16)&0xFF;
- if((v&0x00FF0000)==0x00FF0000 && numChecked>1){
- *(bPtr++)= 0x00;
- index+=8;
- }
- *(bPtr++)= (v>>8)&0xFF;
- if((v&0x0000FF00)==0x0000FF00 && numChecked>2){
- *(bPtr++)= 0x00;
- index+=8;
- }
- *(bPtr++)= v&0xFF;
- if((v&0x000000FF)==0x000000FF && numChecked>3){
- *(bPtr++)= 0x00;
- index+=8;
- }
- *((uint32_t*)bPtr)= 0;
- }
- else
- {
- ptr[0] = v;
- ptr[1] = 0;
- }
-
- index+= n;
- s->index= index;
- }
-#endif
static inline uint8_t* pbBufPtr(PutBitContext *s)
{
diff --git a/src/libffmpeg/libavcodec/dsputil.c b/src/libffmpeg/libavcodec/dsputil.c
index a8578b5c7..e043ad648 100644
--- a/src/libffmpeg/libavcodec/dsputil.c
+++ b/src/libffmpeg/libavcodec/dsputil.c
@@ -20,7 +20,7 @@
*/
#include "avcodec.h"
#include "dsputil.h"
-
+/*
void (*get_pixels)(DCTELEM *block, const UINT8 *pixels, int line_size);
void (*diff_pixels)(DCTELEM *block, const UINT8 *s1, const UINT8 *s2, int stride);
void (*put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
@@ -41,7 +41,7 @@ op_pixels_abs_func pix_abs8x8;
op_pixels_abs_func pix_abs8x8_x2;
op_pixels_abs_func pix_abs8x8_y2;
op_pixels_abs_func pix_abs8x8_xy2;
-
+*/
int ff_bit_exact=0;
UINT8 cropTbl[256 + 2 * MAX_NEG_CROP];
@@ -84,7 +84,7 @@ const UINT8 ff_alternate_vertical_scan[64] = {
};
/* a*inverse[b]>>32 == a/b for all 0<=a<=65536 && 2<=b<=255 */
-UINT32 inverse[256]={
+const UINT32 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,
@@ -119,7 +119,7 @@ UINT32 inverse[256]={
17318417, 17248865, 17179870, 17111424, 17043522, 16976156, 16909321, 16843010,
};
-int pix_sum_c(UINT8 * pix, int line_size)
+static int pix_sum_c(UINT8 * pix, int line_size)
{
int s, i, j;
@@ -141,7 +141,7 @@ int pix_sum_c(UINT8 * pix, int line_size)
return s;
}
-int pix_norm1_c(UINT8 * pix, int line_size)
+static int pix_norm1_c(UINT8 * pix, int line_size)
{
int s, i, j;
UINT32 *sq = squareTbl + 256;
@@ -165,7 +165,7 @@ int pix_norm1_c(UINT8 * pix, int line_size)
}
-void get_pixels_c(DCTELEM *restrict block, const UINT8 *pixels, int line_size)
+static void get_pixels_c(DCTELEM *restrict block, const UINT8 *pixels, int line_size)
{
int i;
@@ -184,8 +184,8 @@ void get_pixels_c(DCTELEM *restrict block, const UINT8 *pixels, int line_size)
}
}
-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 *s1,
+ const UINT8 *s2, int stride){
int i;
/* read the pixels */
@@ -205,8 +205,8 @@ void diff_pixels_c(DCTELEM *restrict block, const UINT8 *s1, const UINT8 *s2,
}
-void put_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels,
- int line_size)
+static void put_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels,
+ int line_size)
{
int i;
UINT8 *cm = cropTbl + MAX_NEG_CROP;
@@ -227,7 +227,7 @@ void put_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels,
}
}
-void add_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels,
+static void add_pixels_clamped_c(const DCTELEM *block, UINT8 *restrict pixels,
int line_size)
{
int i;
@@ -1353,7 +1353,7 @@ QPEL_MC(0, avg_ , _ , op_avg)
#undef op_put
#undef op_put_no_rnd
-int pix_abs16x16_c(UINT8 *pix1, UINT8 *pix2, int line_size)
+static int pix_abs16x16_c(UINT8 *pix1, UINT8 *pix2, int line_size)
{
int s, i;
@@ -1381,7 +1381,7 @@ int pix_abs16x16_c(UINT8 *pix1, UINT8 *pix2, int line_size)
return s;
}
-int pix_abs16x16_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
+static int pix_abs16x16_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
{
int s, i;
@@ -1409,7 +1409,7 @@ int pix_abs16x16_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
return s;
}
-int pix_abs16x16_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
+static int pix_abs16x16_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
{
int s, i;
UINT8 *pix3 = pix2 + line_size;
@@ -1439,7 +1439,7 @@ int pix_abs16x16_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
return s;
}
-int pix_abs16x16_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
+static int pix_abs16x16_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
{
int s, i;
UINT8 *pix3 = pix2 + line_size;
@@ -1469,7 +1469,7 @@ int pix_abs16x16_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
return s;
}
-int pix_abs8x8_c(UINT8 *pix1, UINT8 *pix2, int line_size)
+static int pix_abs8x8_c(UINT8 *pix1, UINT8 *pix2, int line_size)
{
int s, i;
@@ -1489,7 +1489,7 @@ int pix_abs8x8_c(UINT8 *pix1, UINT8 *pix2, int line_size)
return s;
}
-int pix_abs8x8_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
+static int pix_abs8x8_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
{
int s, i;
@@ -1509,7 +1509,7 @@ int pix_abs8x8_x2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
return s;
}
-int pix_abs8x8_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
+static int pix_abs8x8_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
{
int s, i;
UINT8 *pix3 = pix2 + line_size;
@@ -1531,7 +1531,7 @@ int pix_abs8x8_y2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
return s;
}
-int pix_abs8x8_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
+static int pix_abs8x8_xy2_c(UINT8 *pix1, UINT8 *pix2, int line_size)
{
int s, i;
UINT8 *pix3 = pix2 + line_size;
@@ -1574,12 +1574,12 @@ void ff_block_permute(INT16 *block, UINT8 *permutation, const UINT8 *scantable,
}
}
-void clear_blocks_c(DCTELEM *blocks)
+static void clear_blocks_c(DCTELEM *blocks)
{
memset(blocks, 0, sizeof(DCTELEM)*6*64);
}
-void dsputil_init(void)
+void dsputil_init(DSPContext* c, unsigned mask)
{
int i;
@@ -1593,42 +1593,82 @@ void dsputil_init(void)
squareTbl[i] = (i - 256) * (i - 256);
}
- get_pixels = get_pixels_c;
- diff_pixels = diff_pixels_c;
- put_pixels_clamped = put_pixels_clamped_c;
- add_pixels_clamped = add_pixels_clamped_c;
- ff_gmc1= gmc1_c;
- ff_gmc= gmc_c;
- clear_blocks= clear_blocks_c;
- pix_sum= pix_sum_c;
- pix_norm1= pix_norm1_c;
-
- pix_abs16x16 = pix_abs16x16_c;
- pix_abs16x16_x2 = pix_abs16x16_x2_c;
- pix_abs16x16_y2 = pix_abs16x16_y2_c;
- pix_abs16x16_xy2 = pix_abs16x16_xy2_c;
- pix_abs8x8 = pix_abs8x8_c;
- pix_abs8x8_x2 = pix_abs8x8_x2_c;
- pix_abs8x8_y2 = pix_abs8x8_y2_c;
- pix_abs8x8_xy2 = pix_abs8x8_xy2_c;
+ c->get_pixels = get_pixels_c;
+ c->diff_pixels = diff_pixels_c;
+ c->put_pixels_clamped = put_pixels_clamped_c;
+ c->add_pixels_clamped = add_pixels_clamped_c;
+ c->gmc1 = gmc1_c;
+ c->gmc = gmc_c;
+ c->clear_blocks = clear_blocks_c;
+ c->pix_sum = pix_sum_c;
+ c->pix_norm1 = pix_norm1_c;
+
+ c->pix_abs16x16 = pix_abs16x16_c;
+ c->pix_abs16x16_x2 = pix_abs16x16_x2_c;
+ c->pix_abs16x16_y2 = pix_abs16x16_y2_c;
+ c->pix_abs16x16_xy2 = pix_abs16x16_xy2_c;
+ c->pix_abs8x8 = pix_abs8x8_c;
+ c->pix_abs8x8_x2 = pix_abs8x8_x2_c;
+ c->pix_abs8x8_y2 = pix_abs8x8_y2_c;
+ c->pix_abs8x8_xy2 = pix_abs8x8_xy2_c;
+
+ c->put_pixels_tab[0][0] = put_pixels16;
+ c->put_pixels_tab[0][1] = put_pixels16_x2;
+ c->put_pixels_tab[0][2] = put_pixels16_y2;
+ c->put_pixels_tab[0][3] = put_pixels16_xy2;
+
+ c->put_no_rnd_pixels_tab[0][0] = put_pixels16;
+ c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2;
+ c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2;
+ c->put_no_rnd_pixels_tab[0][3] = put_no_rnd_pixels16_xy2;
+
+ c->avg_pixels_tab[0][0] = avg_pixels16;
+ c->avg_pixels_tab[0][1] = avg_pixels16_x2;
+ c->avg_pixels_tab[0][2] = avg_pixels16_y2;
+ c->avg_pixels_tab[0][3] = avg_pixels16_xy2;
+
+ c->avg_no_rnd_pixels_tab[0][0] = avg_no_rnd_pixels16;
+ c->avg_no_rnd_pixels_tab[0][1] = avg_no_rnd_pixels16_x2;
+ c->avg_no_rnd_pixels_tab[0][2] = avg_no_rnd_pixels16_y2;
+ c->avg_no_rnd_pixels_tab[0][3] = avg_no_rnd_pixels16_xy2;
+
+ c->put_pixels_tab[1][0] = put_pixels8;
+ c->put_pixels_tab[1][1] = put_pixels8_x2;
+ c->put_pixels_tab[1][2] = put_pixels8_y2;
+ c->put_pixels_tab[1][3] = put_pixels8_xy2;
+
+ c->put_no_rnd_pixels_tab[1][0] = put_pixels8;
+ c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2;
+ c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2;
+ c->put_no_rnd_pixels_tab[1][3] = put_no_rnd_pixels8_xy2;
+
+ c->avg_pixels_tab[1][0] = avg_pixels8;
+ c->avg_pixels_tab[1][1] = avg_pixels8_x2;
+ c->avg_pixels_tab[1][2] = avg_pixels8_y2;
+ c->avg_pixels_tab[1][3] = avg_pixels8_xy2;
+
+ c->avg_no_rnd_pixels_tab[1][0] = avg_no_rnd_pixels8;
+ c->avg_no_rnd_pixels_tab[1][1] = avg_no_rnd_pixels8_x2;
+ c->avg_no_rnd_pixels_tab[1][2] = avg_no_rnd_pixels8_y2;
+ c->avg_no_rnd_pixels_tab[1][3] = avg_no_rnd_pixels8_xy2;
#ifdef HAVE_MMX
- dsputil_init_mmx();
+ dsputil_init_mmx(c, mask);
#endif
#ifdef ARCH_ARMV4L
- dsputil_init_armv4l();
+ dsputil_init_armv4l(c, mask);
#endif
#ifdef HAVE_MLIB
- dsputil_init_mlib();
+ dsputil_init_mlib(c, mask);
#endif
#ifdef ARCH_ALPHA
- dsputil_init_alpha();
+ dsputil_init_alpha(c, mask);
#endif
#ifdef ARCH_POWERPC
- dsputil_init_ppc();
+ dsputil_init_ppc(c, mask);
#endif
#ifdef HAVE_MMI
- dsputil_init_mmi();
+ dsputil_init_mmi(c, mask);
#endif
for(i=0; i<64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1;
@@ -1639,7 +1679,8 @@ void avcodec_set_bit_exact(void)
{
ff_bit_exact=1;
#ifdef HAVE_MMX
- dsputil_set_bit_exact_mmx();
+#warning FIXME - set_bit_exact
+// dsputil_set_bit_exact_mmx();
#endif
}
diff --git a/src/libffmpeg/libavcodec/dsputil.h b/src/libffmpeg/libavcodec/dsputil.h
index da78f54c8..860133290 100644
--- a/src/libffmpeg/libavcodec/dsputil.h
+++ b/src/libffmpeg/libavcodec/dsputil.h
@@ -23,6 +23,10 @@
#include "avcodec.h"
#include "xineutils.h"
+#if defined(ARCH_X86)
+#define HAVE_MMX 1
+#endif
+
#undef DEBUG
/* dct code */
typedef short DCTELEM;
@@ -46,10 +50,9 @@ extern const UINT8 ff_zigzag_direct[64];
extern UINT32 squareTbl[512];
extern UINT8 cropTbl[256 + 2 * MAX_NEG_CROP];
-void dsputil_init(void);
/* minimum alignment rules ;)
-if u notice errors in the align stuff, need more alignment for some asm code for some cpu
+if u notice errors in the align stuff, need more alignment for some asm code for some cpu
or need to use a function with less aligned data then send a mail to the ffmpeg-dev list, ...
!warning these alignments might not match reallity, (missing attribute((align)) stuff somewhere possible)
@@ -58,39 +61,20 @@ i (michael) didnt check them, these are just the alignents which i think could b
!future video codecs might need functions with less strict alignment
*/
-/* pixel ops : interface with DCT */
-extern void (*get_pixels)(DCTELEM *block/*align 16*/, const UINT8 *pixels/*align 8*/, int line_size);
-extern void (*diff_pixels)(DCTELEM *block/*align 16*/, const UINT8 *s1/*align 8*/, const UINT8 *s2/*align 8*/, int stride);
-extern void (*put_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size);
-extern void (*add_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size);
-extern void (*ff_gmc1)(UINT8 *dst/*align 8*/, UINT8 *src/*align 1*/, int srcStride, int h, int x16, int y16, int rounder);
-extern void (*ff_gmc )(UINT8 *dst/*align 8*/, UINT8 *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);
-extern void (*clear_blocks)(DCTELEM *blocks/*align 16*/);
-extern int (*pix_sum)(UINT8 * pix, int line_size);
-extern int (*pix_norm1)(UINT8 * pix, int line_size);
-
-
-
+/*
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 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);
-extern op_pixels_func put_pixels_tab[2][4];
-extern op_pixels_func avg_pixels_tab[2][4];
-extern op_pixels_func put_no_rnd_pixels_tab[2][4];
-extern op_pixels_func avg_no_rnd_pixels_tab[2][4];
-extern qpel_mc_func put_qpel_pixels_tab[2][16];
-extern qpel_mc_func avg_qpel_pixels_tab[2][16];
-extern qpel_mc_func put_no_rnd_qpel_pixels_tab[2][16];
-extern qpel_mc_func avg_no_rnd_qpel_pixels_tab[2][16];
+
#define CALL_2X_PIXELS(a, b, n)\
static void a(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
@@ -101,20 +85,46 @@ 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);
-
-extern op_pixels_abs_func pix_abs16x16;
-extern op_pixels_abs_func pix_abs16x16_x2;
-extern op_pixels_abs_func pix_abs16x16_y2;
-extern op_pixels_abs_func pix_abs16x16_xy2;
-extern op_pixels_abs_func pix_abs8x8;
-extern op_pixels_abs_func pix_abs8x8_x2;
-extern op_pixels_abs_func pix_abs8x8_y2;
-extern op_pixels_abs_func pix_abs8x8_xy2;
-
+/*
int pix_abs16x16_c(UINT8 *blk1, UINT8 *blk2, int lx);
int pix_abs16x16_x2_c(UINT8 *blk1, UINT8 *blk2, int lx);
int pix_abs16x16_y2_c(UINT8 *blk1, UINT8 *blk2, int lx);
int pix_abs16x16_xy2_c(UINT8 *blk1, UINT8 *blk2, int lx);
+*/
+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,
+ 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);
+
+ /* maybe create an array for 16/8 functions */
+ op_pixels_func put_pixels_tab[2][4];
+ op_pixels_func avg_pixels_tab[2][4];
+ op_pixels_func put_no_rnd_pixels_tab[2][4];
+ 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];
+ qpel_mc_func put_no_rnd_qpel_pixels_tab[2][16];
+ qpel_mc_func avg_no_rnd_qpel_pixels_tab[2][16];
+
+ op_pixels_abs_func pix_abs16x16;
+ op_pixels_abs_func pix_abs16x16_x2;
+ op_pixels_abs_func pix_abs16x16_y2;
+ op_pixels_abs_func pix_abs16x16_xy2;
+ op_pixels_abs_func pix_abs8x8;
+ op_pixels_abs_func pix_abs8x8_x2;
+ op_pixels_abs_func pix_abs8x8_y2;
+ op_pixels_abs_func pix_abs8x8_xy2;
+} DSPContext;
+
+void dsputil_init(DSPContext* p, unsigned mask);
/**
* permute block according to permuatation.
@@ -122,12 +132,12 @@ int pix_abs16x16_xy2_c(UINT8 *blk1, UINT8 *blk2, int lx);
*/
void ff_block_permute(INT16 *block, UINT8 *permutation, const UINT8 *scantable, int last);
-#if defined(ARCH_X86)
-#define HAVE_MMX 1
-#endif
+#define emms_c()
#if defined(HAVE_MMX)
+#undef emms_c()
+
#if 0
#define MM_MMX 0x0001 /* standard MMX */
#define MM_3DNOW 0x0004 /* AMD 3DNOW */
@@ -138,8 +148,9 @@ void ff_block_permute(INT16 *block, UINT8 *permutation, const UINT8 *scantable,
extern int mm_flags;
-/*int mm_support(void);*/
-#define mm_support() xine_mm_accel()
+int mm_support(void);
+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);
#if 0
static inline void emms(void)
@@ -156,54 +167,44 @@ static inline void emms(void)
#define __align8 __attribute__ ((aligned (8)))
-void dsputil_init_mmx(void);
-void dsputil_set_bit_exact_mmx(void);
+void dsputil_init_mmx(DSPContext* c, unsigned mask);
+void dsputil_set_bit_exact_mmx(DSPContext* c, unsigned mask);
#elif defined(ARCH_ARMV4L)
-#define emms_c()
-
/* This is to use 4 bytes read to the IDCT pointers for some 'zero'
line ptimizations */
#define __align8 __attribute__ ((aligned (4)))
-void dsputil_init_armv4l(void);
+void dsputil_init_armv4l(DSPContext* c, unsigned mask);
#elif defined(HAVE_MLIB)
-
-#define emms_c()
/* SPARC/VIS IDCT needs 8-byte aligned DCT blocks */
#define __align8 __attribute__ ((aligned (8)))
-void dsputil_init_mlib(void);
+void dsputil_init_mlib(DSPContext* c, unsigned mask);
#elif defined(ARCH_ALPHA)
-#define emms_c()
#define __align8 __attribute__ ((aligned (8)))
-void dsputil_init_alpha(void);
+void dsputil_init_alpha(DSPContext* c, unsigned mask);
#elif defined(ARCH_POWERPC)
-#define emms_c()
#define __align8 __attribute__ ((aligned (16)))
-void dsputil_init_ppc(void);
+void dsputil_init_ppc(DSPContext* c, unsigned mask);
#elif defined(HAVE_MMI)
-#define emms_c()
-
#define __align8 __attribute__ ((aligned (16)))
-void dsputil_init_mmi(void);
+void dsputil_init_mmi(DSPContext* c, unsigned mask);
#else
-#define emms_c()
-
#define __align8
#endif
@@ -272,11 +273,21 @@ typedef struct MDCTContext {
FFTContext fft;
} MDCTContext;
-int mdct_init(MDCTContext *s, int nbits, int inverse);
-void imdct_calc(MDCTContext *s, FFTSample *output,
+int ff_mdct_init(MDCTContext *s, int nbits, int inverse);
+void ff_imdct_calc(MDCTContext *s, FFTSample *output,
const FFTSample *input, FFTSample *tmp);
-void mdct_calc(MDCTContext *s, FFTSample *out,
+void ff_mdct_calc(MDCTContext *s, FFTSample *out,
const FFTSample *input, FFTSample *tmp);
-void mdct_end(MDCTContext *s);
+void ff_mdct_end(MDCTContext *s);
+
+#ifndef HAVE_LRINTF
+/* XXX: add ISOC specific test to avoid specific BSD testing. */
+/* better than nothing implementation. */
+/* btw, rintf() is existing on fbsd too -- alex */
+static inline long int lrintf(float x)
+{
+ return (int)(rint(x));
+}
+#endif
#endif
diff --git a/src/libffmpeg/libavcodec/dv.c b/src/libffmpeg/libavcodec/dv.c
index 327149068..dc27dc84c 100644
--- a/src/libffmpeg/libavcodec/dv.c
+++ b/src/libffmpeg/libavcodec/dv.c
@@ -114,6 +114,7 @@ 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);
if (DCT_common_init(&s2) < 0)
return -1;
@@ -531,10 +532,12 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
/* init size */
width = 720;
if (dsf) {
+ avctx->frame_rate = 25 * FRAME_RATE_BASE;
packet_size = PAL_FRAME_SIZE;
height = 576;
nb_dif_segs = 12;
} else {
+ avctx->frame_rate = 30 * FRAME_RATE_BASE;
packet_size = NTSC_FRAME_SIZE;
height = 480;
nb_dif_segs = 10;
@@ -546,23 +549,49 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
/* XXX: is it correct to assume that 420 is always used in PAL
mode ? */
s->sampling_411 = !dsf;
- if (s->sampling_411)
+ if (s->sampling_411) {
mb_pos_ptr = dv_place_411;
- else
+ avctx->pix_fmt = PIX_FMT_YUV411P;
+ } else {
mb_pos_ptr = dv_place_420;
+ avctx->pix_fmt = PIX_FMT_YUV420P;
+ }
+
+ avctx->width = width;
+ avctx->height = height;
+
+ if (avctx->flags & CODEC_FLAG_DR1 && avctx->get_buffer_callback)
+ {
+ s->width = -1;
+ avctx->dr_buffer[0] = avctx->dr_buffer[1] = avctx->dr_buffer[2] = 0;
+ if(avctx->get_buffer_callback(avctx, width, height, I_TYPE) < 0){
+ fprintf(stderr, "get_buffer() failed\n");
+ return -1;
+ }
+ }
/* (re)alloc picture if needed */
if (s->width != width || s->height != height) {
- for(i=0;i<3;i++)
- av_freep(&s->current_picture[i]);
+ if (!(avctx->flags & CODEC_FLAG_DR1))
+ for(i=0;i<3;i++) {
+ if (avctx->dr_buffer[i] != s->current_picture[i])
+ av_freep(&s->current_picture[i]);
+ avctx->dr_buffer[i] = 0;
+ }
+
for(i=0;i<3;i++) {
- size = width * height;
- s->linesize[i] = width;
- if (i >= 1) {
- size >>= 2;
- s->linesize[i] >>= s->sampling_411 ? 2 : 1;
- }
- s->current_picture[i] = av_malloc(size);
+ if (avctx->dr_buffer[i]) {
+ s->current_picture[i] = avctx->dr_buffer[i];
+ s->linesize[i] = (i == 0) ? avctx->dr_stride : avctx->dr_uvstride;
+ } else {
+ size = width * height;
+ s->linesize[i] = width;
+ if (i >= 1) {
+ size >>= 2;
+ s->linesize[i] >>= s->sampling_411 ? 2 : 1;
+ }
+ s->current_picture[i] = av_malloc(size);
+ }
if (!s->current_picture[i])
return -1;
}
@@ -589,16 +618,6 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
emms_c();
/* return image */
- avctx->width = width;
- avctx->height = height;
- if (s->sampling_411)
- avctx->pix_fmt = PIX_FMT_YUV411P;
- else
- avctx->pix_fmt = PIX_FMT_YUV420P;
- if (dsf)
- avctx->frame_rate = 25 * FRAME_RATE_BASE;
- else
- avctx->frame_rate = 30 * FRAME_RATE_BASE;
*data_size = sizeof(AVPicture);
picture = data;
for(i=0;i<3;i++) {
@@ -614,6 +633,7 @@ static int dvvideo_decode_end(AVCodecContext *avctx)
int i;
for(i=0;i<3;i++)
+ if (avctx->dr_buffer[i] != s->current_picture[i])
av_freep(&s->current_picture[i]);
return 0;
}
@@ -627,7 +647,7 @@ AVCodec dvvideo_decoder = {
NULL,
dvvideo_decode_end,
dvvideo_decode_frame,
- 0,
+ CODEC_CAP_DR1,
NULL
};
diff --git a/src/libffmpeg/libavcodec/error_resilience.c b/src/libffmpeg/libavcodec/error_resilience.c
index 84b7bb8a0..519674496 100644
--- a/src/libffmpeg/libavcodec/error_resilience.c
+++ b/src/libffmpeg/libavcodec/error_resilience.c
@@ -209,7 +209,7 @@ static void h_block_filter(MpegEncContext *s, UINT8 *dst, int w, int h, int stri
c= dst[offset + 9 + y*stride] - dst[offset + 8 + y*stride];
d= ABS(b) - ((ABS(a) + ABS(c) + 1)>>1);
- d= MAX(d, 0);
+ d= FFMAX(d, 0);
if(b<0) d= -d;
if(d==0) continue;
@@ -269,7 +269,7 @@ static void v_block_filter(MpegEncContext *s, UINT8 *dst, int w, int h, int stri
c= dst[offset + x + 9*stride] - dst[offset + x + 8*stride];
d= ABS(b) - ((ABS(a) + ABS(c)+1)>>1);
- d= MAX(d, 0);
+ d= FFMAX(d, 0);
if(b<0) d= -d;
if(d==0) continue;
@@ -331,7 +331,7 @@ static void guess_mv(MpegEncContext *s){
s->mv_type = MV_TYPE_16X16;
s->mb_skiped=0;
- clear_blocks(s->block[0]);
+ s->dsp.clear_blocks(s->block[0]);
s->mb_x= mb_x;
s->mb_y= mb_y;
@@ -430,10 +430,10 @@ int score_sum=0;
min_x=min_y=max_x=max_y=0;
}
for(j=0; j<pred_count; j++){
- max_x= MAX(max_x, mv_predictor[j][0]);
- max_y= MAX(max_y, mv_predictor[j][1]);
- min_x= MIN(min_x, mv_predictor[j][0]);
- min_y= MIN(min_y, mv_predictor[j][1]);
+ max_x= FFMAX(max_x, mv_predictor[j][0]);
+ max_y= FFMAX(max_y, mv_predictor[j][1]);
+ min_x= FFMIN(min_x, mv_predictor[j][0]);
+ min_y= FFMIN(min_y, mv_predictor[j][1]);
}
mv_predictor[pred_count+1][0] = sum_x - max_x - min_x;
mv_predictor[pred_count+1][1] = sum_y - max_y - min_y;
@@ -458,7 +458,7 @@ int score_sum=0;
s->mv_type = MV_TYPE_16X16;
s->mb_skiped=0;
- clear_blocks(s->block[0]);
+ s->dsp.clear_blocks(s->block[0]);
s->mb_x= mb_x;
s->mb_y= mb_y;
@@ -538,7 +538,7 @@ static int is_intra_more_likely(MpegEncContext *s){
if(undamaged_count < 5) return 0; //allmost all MBs damaged -> use temporal prediction
- skip_amount= MAX(undamaged_count/50, 1); //check only upto 50 MBs
+ skip_amount= FFMAX(undamaged_count/50, 1); //check only upto 50 MBs
is_intra_likely=0;
j=0;
@@ -559,8 +559,8 @@ static int is_intra_more_likely(MpegEncContext *s){
UINT8 *mb_ptr = s->current_picture[0] + mb_x*16 + mb_y*16*s->linesize;
UINT8 *last_mb_ptr= s->last_picture [0] + mb_x*16 + mb_y*16*s->linesize;
- is_intra_likely += pix_abs16x16(last_mb_ptr, mb_ptr , s->linesize);
- is_intra_likely -= pix_abs16x16(last_mb_ptr, last_mb_ptr+s->linesize*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);
}else{
if(s->mbintra_table[i]) //HACK (this is allways inited but we should use mb_type[])
is_intra_likely++;
@@ -738,7 +738,7 @@ void ff_error_resilience(MpegEncContext *s){
s->mv[0][0][1] = s->motion_val[ mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0] ][1];
}
- clear_blocks(s->block[0]);
+ s->dsp.clear_blocks(s->block[0]);
s->mb_x= mb_x;
s->mb_y= mb_y;
@@ -778,8 +778,8 @@ void ff_error_resilience(MpegEncContext *s){
s->mv[1][0][0]= 0;
s->mv[1][0][1]= 0;
}
-
- clear_blocks(s->block[0]);
+
+ s->dsp.clear_blocks(s->block[0]);
s->mb_x= mb_x;
s->mb_y= mb_y;
MPV_decode_mb(s, s->block);
diff --git a/src/libffmpeg/libavcodec/h263.c b/src/libffmpeg/libavcodec/h263.c
index 8fb9c06b7..b2c37ccb5 100644
--- a/src/libffmpeg/libavcodec/h263.c
+++ b/src/libffmpeg/libavcodec/h263.c
@@ -49,6 +49,7 @@
#define MB_TYPE_B_VLC_BITS 4
#define TEX_VLC_BITS 9
+#ifdef CONFIG_ENCODERS
static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
int n);
static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
@@ -56,6 +57,8 @@ static void h263p_encode_umotion(MpegEncContext * s, int val);
static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
int n, int dc, UINT8 *scan_table,
PutBitContext *dc_pb, PutBitContext *ac_pb);
+#endif
+
static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
static int h263p_decode_umotion(MpegEncContext * s, int pred);
static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
@@ -69,15 +72,16 @@ static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
-
extern UINT32 inverse[256];
-static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
+static UINT16 uni_DCtab_lum [512][2];
+static UINT16 uni_DCtab_chrom[512][2];
+
+#ifdef CONFIG_ENCODERS
+static UINT16 (*mv_penalty)[MAX_MV*2+1]= NULL;
static UINT8 fcode_tab[MAX_MV*2+1];
static UINT8 umv_fcode_tab[MAX_MV*2+1];
-static UINT16 uni_DCtab_lum [512][2];
-static UINT16 uni_DCtab_chrom[512][2];
static UINT32 uni_mpeg4_intra_rl_bits[64*64*2*2];
static UINT8 uni_mpeg4_intra_rl_len [64*64*2*2];
static UINT32 uni_mpeg4_inter_rl_bits[64*64*2*2];
@@ -94,6 +98,8 @@ intra
max level: 53/16
max run: 29/41
*/
+#endif
+
int h263_get_picture_format(int width, int height)
{
@@ -364,6 +370,7 @@ void ff_clean_mpeg4_qscales(MpegEncContext *s){
}
}
+#ifdef CONFIG_ENCODERS
void mpeg4_encode_mb(MpegEncContext * s,
DCTELEM block[6][64],
int motion_x, int motion_y)
@@ -531,7 +538,7 @@ void mpeg4_encode_mb(MpegEncContext * s,
if(s->coded_order[i+1].pict_type!=B_TYPE) break;
b_pic= s->coded_order[i+1].picture[0] + offset;
- diff= pix_abs16x16(p_pic, b_pic, s->linesize);
+ diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize);
if(diff>s->qscale*70){ //FIXME check that 70 is optimal
s->mb_skiped=0;
break;
@@ -870,6 +877,7 @@ void h263_encode_mb(MpegEncContext * s,
}
}
}
+#endif
static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
{
@@ -1061,6 +1069,7 @@ INT16 *h263_pred_motion(MpegEncContext * s, int block,
return mot_val;
}
+#ifdef CONFIG_ENCODERS
static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
{
int range, l, bit_size, sign, code, bits;
@@ -1152,6 +1161,10 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s)
{
int f_code;
int mv;
+
+ if(mv_penalty==NULL)
+ mv_penalty= av_mallocz( sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1) );
+
for(f_code=1; f_code<=MAX_FCODE; f_code++){
for(mv=-MAX_MV; mv<=MAX_MV; mv++){
int len;
@@ -1189,6 +1202,7 @@ static void init_mv_penalty_and_fcode(MpegEncContext *s)
umv_fcode_tab[mv]= 1;
}
}
+#endif
static void init_uni_dc_tab(void)
{
@@ -1242,6 +1256,7 @@ static void init_uni_dc_tab(void)
}
}
+#ifdef CONFIG_ENCODERS
static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){
int slevel, run, last;
@@ -1434,6 +1449,7 @@ static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
}
}
}
+#endif
/***************************************************/
/**
@@ -1832,7 +1848,7 @@ static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
}
#endif
}
-
+#ifdef CONFIG_ENCODERS
static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
{
@@ -1948,7 +1964,7 @@ static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n
}
#endif
}
-
+#endif
/***********************************************/
@@ -2188,7 +2204,7 @@ int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
case S_TYPE:
return s->f_code+15;
case B_TYPE:
- return MAX(MAX(s->f_code, s->b_code)+15, 17);
+ return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17);
default:
return -1;
}
@@ -2305,7 +2321,7 @@ static int mpeg4_decode_video_packet_header(MpegEncContext *s)
if(s->shape != BIN_ONLY_SHAPE){
skip_bits(&s->gb, 3); /* intra dc vlc threshold */
//FIXME dont just ignore everything
- if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){
+ if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
mpeg4_decode_sprite_trajectory(s);
fprintf(stderr, "untested\n");
}
@@ -3965,7 +3981,7 @@ static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
s->sprite_shift[1]= alpha+rho+2;
break;
case 3:
- min_ab= MIN(alpha, beta);
+ min_ab= FFMIN(alpha, beta);
w3= w2>>min_ab;
h3= h2>>min_ab;
s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
@@ -4469,9 +4485,7 @@ static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
}
if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
- if(s->num_sprite_warping_points){
- mpeg4_decode_sprite_trajectory(s);
- }
+ mpeg4_decode_sprite_trajectory(s);
if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
}
diff --git a/src/libffmpeg/libavcodec/h263dec.c b/src/libffmpeg/libavcodec/h263dec.c
index 4a1c3dcd5..69e161766 100644
--- a/src/libffmpeg/libavcodec/h263dec.c
+++ b/src/libffmpeg/libavcodec/h263dec.c
@@ -60,7 +60,6 @@ static int h263_decode_init(AVCodecContext *avctx)
switch(avctx->codec->id) {
case CODEC_ID_H263:
s->gob_number = 0;
- s->first_slice_line = 0;
break;
case CODEC_ID_MPEG4:
s->time_increment_bits = 4; /* default value for broken headers */
@@ -126,9 +125,14 @@ static int 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){
//we would have to scan through the whole buf to handle the weird reordering ...
return buf_size;
+ }else if(s->flags&CODEC_FLAG_TRUNCATED){
+ pos -= s->parse_context.last_index;
+ if(pos<0) pos=0; // padding is not really read so this might be -1
+ return pos;
}else{
if(pos==0) pos=1; //avoid infinite loops (i doubt thats needed but ...)
if(pos+10>buf_size) pos=buf_size; // oops ;)
@@ -191,7 +195,7 @@ static int decode_slice(MpegEncContext *s){
}
/* DCT & quantize */
- clear_blocks(s->block[0]);
+ s->dsp.clear_blocks(s->block[0]);
s->mv_dir = MV_DIR_FORWARD;
s->mv_type = MV_TYPE_16X16;
@@ -252,10 +256,10 @@ static int decode_slice(MpegEncContext *s){
if(bits_left==0 || bits_left>8){
s->padding_bug_score++;
- } else {
+ } else if(bits_left != 1){
int v= show_bits(&s->gb, 8);
v|= 0x7F >> (7-(bits_count&7));
-
+
if(v==0x7F)
s->padding_bug_score--;
else
@@ -300,6 +304,43 @@ static int decode_slice(MpegEncContext *s){
return -1;
}
+/**
+ * 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){
+ ParseContext *pc= &s->parse_context;
+ int vop_found, i;
+ uint32_t state;
+
+ vop_found= pc->frame_start_found;
+ state= pc->state;
+
+ i=0;
+ if(!vop_found){
+ for(i=0; i<buf_size; i++){
+ state= (state<<8) | buf[i];
+ if(state == 0x1B6){
+ i++;
+ vop_found=1;
+ break;
+ }
+ }
+ }
+
+ for(; i<buf_size; i++){
+ state= (state<<8) | buf[i];
+ if((state&0xFFFFFF00) == 0x100){
+ pc->frame_start_found=0;
+ pc->state=-1;
+ return i-3;
+ }
+ }
+ pc->frame_start_found= vop_found;
+ pc->state= state;
+ return -1;
+}
+
static int h263_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
UINT8 *buf, int buf_size)
@@ -326,6 +367,42 @@ uint64_t time= rdtsc();
if (buf_size == 0) {
return 0;
}
+
+ if(s->flags&CODEC_FLAG_TRUNCATED){
+ int next;
+ ParseContext *pc= &s->parse_context;
+
+ pc->last_index= pc->index;
+
+ if(s->codec_id==CODEC_ID_MPEG4){
+ next= mpeg4_find_frame_end(s, buf, buf_size);
+ }else{
+ fprintf(stderr, "this codec doesnt support truncated bitstreams\n");
+ return -1;
+ }
+ if(next==-1){
+ if(buf_size + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){
+ pc->buffer_size= buf_size + pc->index + 10*1024;
+ pc->buffer= realloc(pc->buffer, pc->buffer_size);
+ }
+
+ memcpy(&pc->buffer[pc->index], buf, buf_size);
+ pc->index += buf_size;
+ return buf_size;
+ }
+
+ if(pc->index){
+ if(next + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){
+ pc->buffer_size= next + pc->index + 10*1024;
+ pc->buffer= realloc(pc->buffer, pc->buffer_size);
+ }
+
+ memcpy(&pc->buffer[pc->index], buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
+ pc->index = 0;
+ buf= pc->buffer;
+ buf_size= pc->last_index + next;
+ }
+ }
retry:
@@ -352,6 +429,9 @@ retry:
}
ret = ff_mpeg4_decode_picture_header(s, &s->gb);
+ if(s->flags& CODEC_FLAG_LOW_DELAY)
+ s->low_delay=1;
+
s->has_b_frames= !s->low_delay;
} else if (s->h263_intel) {
ret = intel_h263_decode_picture_header(s);
@@ -445,10 +525,16 @@ retry:
fprintf(stderr, "header damaged\n");
return -1;
}
+
+ s->avctx->key_frame = (s->pict_type == I_TYPE);
+ s->avctx->pict_type = s->pict_type;
+
/* skip b frames if we dont have reference frames */
if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
/* skip b frames if we are in a hurry */
if(s->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
+ /* skip everything if we are in a hurry>=5 */
+ if(s->hurry_up>=5) return get_consumed_bytes(s, buf_size);
if(s->next_p_frame_damaged){
if(s->pict_type==B_TYPE)
@@ -479,7 +565,7 @@ retry:
decode_slice(s);
s->error_status_table[0]|= VP_START;
- while(s->mb_y<s->mb_height && s->gb.size*8 - get_bits_count(&s->gb)>32){
+ while(s->mb_y<s->mb_height && s->gb.size*8 - get_bits_count(&s->gb)>16){
if(s->msmpeg4_version){
if(s->mb_x!=0 || (s->mb_y%s->slice_height)!=0)
break;
@@ -545,7 +631,7 @@ retry:
num_end_markers--;
}
if(num_end_markers || error){
-// fprintf(stderr, "concealing errors\n");
+ fprintf(stderr, "concealing errors\n");
//printf("type:%d\n", s->pict_type);
ff_error_resilience(s);
}
@@ -625,7 +711,7 @@ AVCodec mpeg4_decoder = {
NULL,
h263_decode_end,
h263_decode_frame,
- CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
+ CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
};
AVCodec h263_decoder = {
diff --git a/src/libffmpeg/libavcodec/i386/Makefile.am b/src/libffmpeg/libavcodec/i386/Makefile.am
index 53f1f6528..0ef6bb0eb 100644
--- a/src/libffmpeg/libavcodec/i386/Makefile.am
+++ b/src/libffmpeg/libavcodec/i386/Makefile.am
@@ -13,6 +13,7 @@ LIBTOOL = $(SHELL) $(top_builddir)/libtool-nofpic
noinst_LTLIBRARIES = libavcodec_mmx.la
libavcodec_mmx_src = \
+ cputest.c \
dsputil_mmx.c \
fdct_mmx.c \
idct_mmx.c \
diff --git a/src/libffmpeg/libavcodec/i386/cputest.c b/src/libffmpeg/libavcodec/i386/cputest.c
new file mode 100644
index 000000000..b885548ee
--- /dev/null
+++ b/src/libffmpeg/libavcodec/i386/cputest.c
@@ -0,0 +1,21 @@
+/* dummy file to use xine mm_support function */
+
+#include "xineutils.h"
+#include "../dsputil.h"
+
+
+/* Function to test if multimedia instructions are supported... */
+int mm_support(void)
+{
+ return xine_mm_accel();
+}
+
+#ifdef __TEST__
+int main ( void )
+{
+ int mm_flags;
+ mm_flags = mm_support();
+ printf("mm_support = 0x%08u\n",mm_flags);
+ return 0;
+}
+#endif
diff --git a/src/libffmpeg/libavcodec/i386/dsputil_mmx.c b/src/libffmpeg/libavcodec/i386/dsputil_mmx.c
index 708d0b091..94b88b70e 100644
--- a/src/libffmpeg/libavcodec/i386/dsputil_mmx.c
+++ b/src/libffmpeg/libavcodec/i386/dsputil_mmx.c
@@ -22,7 +22,7 @@
#include "../dsputil.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);
@@ -242,7 +242,7 @@ static void diff_pixels_mmx(DCTELEM *block, const UINT8 *s1, const UINT8 *s2, in
);
}
-static void put_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size)
+void put_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size)
{
const DCTELEM *p;
UINT8 *pix;
@@ -297,7 +297,7 @@ static void put_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line
:"memory");
}
-static void add_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size)
+void add_pixels_clamped_mmx(const DCTELEM *block, UINT8 *pixels, int line_size)
{
const DCTELEM *p;
UINT8 *pix;
@@ -457,7 +457,7 @@ static int pix_sum16_mmx(UINT8 * pix, int line_size){
static void just_return() { return; }
#endif
-void dsputil_init_mmx(void)
+void dsputil_init_mmx(DSPContext* c, unsigned mask)
{
mm_flags = mm_support();
#if 0
@@ -476,112 +476,112 @@ void dsputil_init_mmx(void)
#endif
if (mm_flags & MM_MMX) {
- get_pixels = get_pixels_mmx;
- diff_pixels = diff_pixels_mmx;
- put_pixels_clamped = put_pixels_clamped_mmx;
- add_pixels_clamped = add_pixels_clamped_mmx;
- clear_blocks= clear_blocks_mmx;
- pix_sum= pix_sum16_mmx;
-
- pix_abs16x16 = pix_abs16x16_mmx;
- pix_abs16x16_x2 = pix_abs16x16_x2_mmx;
- pix_abs16x16_y2 = pix_abs16x16_y2_mmx;
- pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx;
- pix_abs8x8 = pix_abs8x8_mmx;
- pix_abs8x8_x2 = pix_abs8x8_x2_mmx;
- pix_abs8x8_y2 = pix_abs8x8_y2_mmx;
- pix_abs8x8_xy2= pix_abs8x8_xy2_mmx;
-
- put_pixels_tab[0][0] = put_pixels16_mmx;
- put_pixels_tab[0][1] = put_pixels16_x2_mmx;
- put_pixels_tab[0][2] = put_pixels16_y2_mmx;
- put_pixels_tab[0][3] = put_pixels16_xy2_mmx;
-
- put_no_rnd_pixels_tab[0][0] = put_pixels16_mmx;
- put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx;
- put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx;
- put_no_rnd_pixels_tab[0][3] = put_no_rnd_pixels16_xy2_mmx;
-
- avg_pixels_tab[0][0] = avg_pixels16_mmx;
- avg_pixels_tab[0][1] = avg_pixels16_x2_mmx;
- avg_pixels_tab[0][2] = avg_pixels16_y2_mmx;
- avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx;
-
- avg_no_rnd_pixels_tab[0][0] = avg_no_rnd_pixels16_mmx;
- avg_no_rnd_pixels_tab[0][1] = avg_no_rnd_pixels16_x2_mmx;
- avg_no_rnd_pixels_tab[0][2] = avg_no_rnd_pixels16_y2_mmx;
- avg_no_rnd_pixels_tab[0][3] = avg_no_rnd_pixels16_xy2_mmx;
-
- put_pixels_tab[1][0] = put_pixels8_mmx;
- put_pixels_tab[1][1] = put_pixels8_x2_mmx;
- put_pixels_tab[1][2] = put_pixels8_y2_mmx;
- put_pixels_tab[1][3] = put_pixels8_xy2_mmx;
-
- put_no_rnd_pixels_tab[1][0] = put_pixels8_mmx;
- put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx;
- put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx;
- put_no_rnd_pixels_tab[1][3] = put_no_rnd_pixels8_xy2_mmx;
-
- avg_pixels_tab[1][0] = avg_pixels8_mmx;
- avg_pixels_tab[1][1] = avg_pixels8_x2_mmx;
- avg_pixels_tab[1][2] = avg_pixels8_y2_mmx;
- avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx;
-
- avg_no_rnd_pixels_tab[1][0] = avg_no_rnd_pixels8_mmx;
- avg_no_rnd_pixels_tab[1][1] = avg_no_rnd_pixels8_x2_mmx;
- avg_no_rnd_pixels_tab[1][2] = avg_no_rnd_pixels8_y2_mmx;
- avg_no_rnd_pixels_tab[1][3] = avg_no_rnd_pixels8_xy2_mmx;
+ c->get_pixels = get_pixels_mmx;
+ c->diff_pixels = diff_pixels_mmx;
+ c->put_pixels_clamped = put_pixels_clamped_mmx;
+ c->add_pixels_clamped = add_pixels_clamped_mmx;
+ 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;
+ c->put_pixels_tab[0][3] = put_pixels16_xy2_mmx;
+
+ c->put_no_rnd_pixels_tab[0][0] = put_pixels16_mmx;
+ 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->put_no_rnd_pixels_tab[0][3] = put_no_rnd_pixels16_xy2_mmx;
+
+ c->avg_pixels_tab[0][0] = avg_pixels16_mmx;
+ c->avg_pixels_tab[0][1] = avg_pixels16_x2_mmx;
+ c->avg_pixels_tab[0][2] = avg_pixels16_y2_mmx;
+ c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx;
+
+ c->avg_no_rnd_pixels_tab[0][0] = avg_no_rnd_pixels16_mmx;
+ c->avg_no_rnd_pixels_tab[0][1] = avg_no_rnd_pixels16_x2_mmx;
+ c->avg_no_rnd_pixels_tab[0][2] = avg_no_rnd_pixels16_y2_mmx;
+ c->avg_no_rnd_pixels_tab[0][3] = avg_no_rnd_pixels16_xy2_mmx;
+
+ c->put_pixels_tab[1][0] = put_pixels8_mmx;
+ c->put_pixels_tab[1][1] = put_pixels8_x2_mmx;
+ c->put_pixels_tab[1][2] = put_pixels8_y2_mmx;
+ c->put_pixels_tab[1][3] = put_pixels8_xy2_mmx;
+
+ c->put_no_rnd_pixels_tab[1][0] = put_pixels8_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->put_no_rnd_pixels_tab[1][3] = put_no_rnd_pixels8_xy2_mmx;
+
+ c->avg_pixels_tab[1][0] = avg_pixels8_mmx;
+ c->avg_pixels_tab[1][1] = avg_pixels8_x2_mmx;
+ c->avg_pixels_tab[1][2] = avg_pixels8_y2_mmx;
+ c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx;
+
+ c->avg_no_rnd_pixels_tab[1][0] = avg_no_rnd_pixels8_mmx;
+ c->avg_no_rnd_pixels_tab[1][1] = avg_no_rnd_pixels8_x2_mmx;
+ c->avg_no_rnd_pixels_tab[1][2] = avg_no_rnd_pixels8_y2_mmx;
+ c->avg_no_rnd_pixels_tab[1][3] = avg_no_rnd_pixels8_xy2_mmx;
if (mm_flags & MM_MMXEXT) {
- pix_abs16x16 = pix_abs16x16_mmx2;
- pix_abs16x16_x2 = pix_abs16x16_x2_mmx2;
- pix_abs16x16_y2 = pix_abs16x16_y2_mmx2;
- pix_abs16x16_xy2= pix_abs16x16_xy2_mmx2;
-
- pix_abs8x8 = pix_abs8x8_mmx2;
- pix_abs8x8_x2 = pix_abs8x8_x2_mmx2;
- pix_abs8x8_y2 = pix_abs8x8_y2_mmx2;
- pix_abs8x8_xy2= pix_abs8x8_xy2_mmx2;
-
- put_pixels_tab[0][1] = put_pixels16_x2_mmx2;
- put_pixels_tab[0][2] = put_pixels16_y2_mmx2;
- put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx2;
- put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx2;
-
- avg_pixels_tab[0][0] = avg_pixels16_mmx2;
- avg_pixels_tab[0][1] = avg_pixels16_x2_mmx2;
- avg_pixels_tab[0][2] = avg_pixels16_y2_mmx2;
- avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx2;
-
- put_pixels_tab[1][1] = put_pixels8_x2_mmx2;
- put_pixels_tab[1][2] = put_pixels8_y2_mmx2;
- put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx2;
- put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx2;
-
- avg_pixels_tab[1][0] = avg_pixels8_mmx2;
- avg_pixels_tab[1][1] = avg_pixels8_x2_mmx2;
- avg_pixels_tab[1][2] = avg_pixels8_y2_mmx2;
- avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx2;
+ 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->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;
} else if (mm_flags & MM_3DNOW) {
- put_pixels_tab[0][1] = put_pixels16_x2_3dnow;
- put_pixels_tab[0][2] = put_pixels16_y2_3dnow;
- put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_3dnow;
- put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_3dnow;
-
- avg_pixels_tab[0][0] = avg_pixels16_3dnow;
- avg_pixels_tab[0][1] = avg_pixels16_x2_3dnow;
- avg_pixels_tab[0][2] = avg_pixels16_y2_3dnow;
- avg_pixels_tab[0][3] = avg_pixels16_xy2_3dnow;
-
- put_pixels_tab[1][1] = put_pixels8_x2_3dnow;
- put_pixels_tab[1][2] = put_pixels8_y2_3dnow;
- put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_3dnow;
- put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_3dnow;
-
- avg_pixels_tab[1][0] = avg_pixels8_3dnow;
- avg_pixels_tab[1][1] = avg_pixels8_x2_3dnow;
- avg_pixels_tab[1][2] = avg_pixels8_y2_3dnow;
- avg_pixels_tab[1][3] = avg_pixels8_xy2_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;
}
}
@@ -624,25 +624,24 @@ void dsputil_init_mmx(void)
/* 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(void)
+void dsputil_set_bit_exact_mmx(DSPContext* c, unsigned mask)
{
if (mm_flags & MM_MMX) {
-
/* MMX2 & 3DNOW */
- put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx;
- put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx;
- avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx;
- put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx;
- put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx;
- avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx;
+ 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) {
- pix_abs16x16_x2 = pix_abs16x16_x2_mmx;
- pix_abs16x16_y2 = pix_abs16x16_y2_mmx;
- pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx;
- pix_abs8x8_x2 = pix_abs8x8_x2_mmx;
- pix_abs8x8_y2 = pix_abs8x8_y2_mmx;
- pix_abs8x8_xy2= pix_abs8x8_xy2_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_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/fdct_mmx.c b/src/libffmpeg/libavcodec/i386/fdct_mmx.c
index 19f656afd..8d3552d2a 100644
--- a/src/libffmpeg/libavcodec/i386/fdct_mmx.c
+++ b/src/libffmpeg/libavcodec/i386/fdct_mmx.c
@@ -32,23 +32,23 @@
#define RND_FRW_COL (1 << (SHIFT_FRW_COL-1))
//concatenated table, for forward DCT transformation
-const int16_t fdct_tg_all_16[] ATTR_ALIGN(8) = {
+static const int16_t fdct_tg_all_16[] ATTR_ALIGN(8) = {
13036, 13036, 13036, 13036, // tg * (2<<16) + 0.5
27146, 27146, 27146, 27146, // tg * (2<<16) + 0.5
-21746, -21746, -21746, -21746, // tg * (2<<16) + 0.5
};
-const int16_t cos_4_16[4] = {
+static const int16_t cos_4_16[4] ATTR_ALIGN(8) = {
-19195, -19195, -19195, -19195, //cos * (2<<16) + 0.5
};
-const int16_t ocos_4_16[4] = {
+static const int16_t ocos_4_16[4] ATTR_ALIGN(8) = {
23170, 23170, 23170, 23170, //cos * (2<<15) + 0.5
};
-static const mmx_t fdct_one_corr = {0x0001000100010001LL};
-static volatile mmx_t fdct_r_row = { d:{RND_FRW_ROW, RND_FRW_ROW} };
+static const long long fdct_one_corr ATTR_ALIGN(8) = 0x0001000100010001LL;
+static const long fdct_r_row[2] ATTR_ALIGN(8) = {RND_FRW_ROW, RND_FRW_ROW };
-const int16_t tab_frw_01234567[] ATTR_ALIGN(8) = { // forward_dct coeff table
+static const int16_t tab_frw_01234567[] ATTR_ALIGN(8) = { // forward_dct coeff table
//row0
16384, 16384, 21407, -8867, // w09 w01 w08 w00
16384, 16384, 8867, -21407, // w13 w05 w12 w04
@@ -242,18 +242,18 @@ static inline void fdct_row(const int16_t *in, int16_t *out, const int16_t *tabl
punpckhdq_r2r(mm6, mm6);
movq_m2r(*(table + 20), mm7);
pmaddwd_r2r(mm5, mm1);
- paddd_m2r(fdct_r_row, mm3);
+ paddd_m2r(*fdct_r_row, mm3);
pmaddwd_r2r(mm6, mm7);
pmaddwd_m2r(*(table + 12), mm2);
paddd_r2r(mm4, mm3);
pmaddwd_m2r(*(table + 24), mm5);
pmaddwd_m2r(*(table + 28), mm6);
paddd_r2r(mm7, mm1);
- paddd_m2r(fdct_r_row, mm0);
+ paddd_m2r(*fdct_r_row, mm0);
psrad_i2r(SHIFT_FRW_ROW, mm3);
- paddd_m2r(fdct_r_row, mm1);
+ paddd_m2r(*fdct_r_row, mm1);
paddd_r2r(mm2, mm0);
- paddd_m2r(fdct_r_row, mm5);
+ paddd_m2r(*fdct_r_row, mm5);
psrad_i2r(SHIFT_FRW_ROW, mm1);
paddd_r2r(mm6, mm5);
psrad_i2r(SHIFT_FRW_ROW, mm0);
@@ -269,8 +269,8 @@ static inline void fdct_row(const int16_t *in, int16_t *out, const int16_t *tabl
void ff_fdct_mmx(int16_t *block)
{
- /* XXX: not thread safe */
- static int16_t block_tmp[64] ATTR_ALIGN(8);
+ int64_t align_tmp[16] ATTR_ALIGN(8);
+ int16_t * const block_tmp= (int16_t*)align_tmp;
int16_t *block1, *out;
const int16_t *table;
int i;
diff --git a/src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c b/src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c
index 8645fa370..cb7af3e62 100644
--- a/src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c
+++ b/src/libffmpeg/libavcodec/i386/mpegvideo_mmx.c
@@ -55,7 +55,8 @@ static void dct_unquantize_h263_mmx(MpegEncContext *s,
}
nCoeffs=63;
} else {
- nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
+ nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
+ level = 0;/* keep gcc quiet */
}
//printf("%d %d ", qmul, qadd);
asm volatile(
@@ -507,22 +508,22 @@ void ff_mmxext_idct(DCTELEM *block);
static void ff_libmpeg2mmx_idct_put(UINT8 *dest, int line_size, DCTELEM *block)
{
ff_mmx_idct (block);
- put_pixels_clamped(block, dest, line_size);
+ 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(block, dest, line_size);
+ 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(block, dest, line_size);
+ 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(block, dest, line_size);
+ add_pixels_clamped_mmx(block, dest, line_size);
}
void MPV_common_init_mmx(MpegEncContext *s)
diff --git a/src/libffmpeg/libavcodec/i386/simple_idct_mmx.c b/src/libffmpeg/libavcodec/i386/simple_idct_mmx.c
index 0c859862e..9dfd5f149 100644
--- a/src/libffmpeg/libavcodec/i386/simple_idct_mmx.c
+++ b/src/libffmpeg/libavcodec/i386/simple_idct_mmx.c
@@ -1301,10 +1301,10 @@ void ff_simple_idct_mmx(int16_t *block)
void ff_simple_idct_put_mmx(UINT8 *dest, int line_size, DCTELEM *block)
{
idct(block);
- put_pixels_clamped(block, dest, line_size);
+ put_pixels_clamped_mmx(block, dest, line_size);
}
void ff_simple_idct_add_mmx(UINT8 *dest, int line_size, DCTELEM *block)
{
idct(block);
- add_pixels_clamped(block, dest, line_size);
+ add_pixels_clamped_mmx(block, dest, line_size);
}
diff --git a/src/libffmpeg/libavcodec/imgconvert.c b/src/libffmpeg/libavcodec/imgconvert.c
index 45bc54056..854ea50dd 100644
--- a/src/libffmpeg/libavcodec/imgconvert.c
+++ b/src/libffmpeg/libavcodec/imgconvert.c
@@ -22,6 +22,10 @@
#ifdef USE_FASTMEMCPY
#include "fastmemcpy.h"
#endif
+
+#ifdef HAVE_MMX
+#include "i386/mmx.h"
+#endif
/* XXX: totally non optimized */
static void yuv422_to_yuv420p(UINT8 *lum, UINT8 *cb, UINT8 *cr,
@@ -762,77 +766,182 @@ int img_convert(AVPicture *dst, int dst_pix_fmt,
return 0;
}
+
+#ifdef HAVE_MMX
+#define DEINT_INPLACE_LINE_LUM \
+ movd_m2r(lum_m4[0],mm0);\
+ movd_m2r(lum_m3[0],mm1);\
+ movd_m2r(lum_m2[0],mm2);\
+ movd_m2r(lum_m1[0],mm3);\
+ movd_m2r(lum[0],mm4);\
+ punpcklbw_r2r(mm7,mm0);\
+ movd_r2m(mm2,lum_m4[0]);\
+ punpcklbw_r2r(mm7,mm1);\
+ punpcklbw_r2r(mm7,mm2);\
+ punpcklbw_r2r(mm7,mm3);\
+ punpcklbw_r2r(mm7,mm4);\
+ paddw_r2r(mm3,mm1);\
+ psllw_i2r(1,mm2);\
+ paddw_r2r(mm4,mm0);\
+ psllw_i2r(2,mm1);\
+ paddw_r2r(mm6,mm2);\
+ paddw_r2r(mm2,mm1);\
+ psubusw_r2r(mm0,mm1);\
+ psrlw_i2r(3,mm1);\
+ packuswb_r2r(mm7,mm1);\
+ movd_r2m(mm1,lum_m2[0]);
+
+#define DEINT_LINE_LUM \
+ movd_m2r(lum_m4[0],mm0);\
+ movd_m2r(lum_m3[0],mm1);\
+ movd_m2r(lum_m2[0],mm2);\
+ movd_m2r(lum_m1[0],mm3);\
+ movd_m2r(lum[0],mm4);\
+ punpcklbw_r2r(mm7,mm0);\
+ punpcklbw_r2r(mm7,mm1);\
+ punpcklbw_r2r(mm7,mm2);\
+ punpcklbw_r2r(mm7,mm3);\
+ punpcklbw_r2r(mm7,mm4);\
+ paddw_r2r(mm3,mm1);\
+ psllw_i2r(1,mm2);\
+ paddw_r2r(mm4,mm0);\
+ psllw_i2r(2,mm1);\
+ paddw_r2r(mm6,mm2);\
+ paddw_r2r(mm2,mm1);\
+ psubusw_r2r(mm0,mm1);\
+ psrlw_i2r(3,mm1);\
+ packuswb_r2r(mm7,mm1);\
+ movd_r2m(mm1,dst[0]);
+#endif
+
/* filter parameters: [-1 4 2 4 -1] // 8 */
-static void deinterlace_line(UINT8 *dst, UINT8 *src, int src_wrap,
- int size)
+static void deinterlace_line(UINT8 *dst, UINT8 *lum_m4, UINT8 *lum_m3, UINT8 *lum_m2, UINT8 *lum_m1, UINT8 *lum,
+ int size)
{
+#ifndef HAVE_MMX
UINT8 *cm = cropTbl + MAX_NEG_CROP;
int sum;
- UINT8 *s;
for(;size > 0;size--) {
- s = src;
- sum = -s[0];
- s += src_wrap;
- sum += s[0] << 2;
- s += src_wrap;
- sum += s[0] << 1;
- s += src_wrap;
- sum += s[0] << 2;
- s += src_wrap;
- sum += -s[0];
+ sum = -lum_m4[0];
+ sum += lum_m3[0] << 2;
+ sum += lum_m2[0] << 1;
+ sum += lum_m1[0] << 2;
+ sum += -lum[0];
dst[0] = cm[(sum + 4) >> 3];
+ lum_m4++;
+ lum_m3++;
+ lum_m2++;
+ lum_m1++;
+ lum++;
dst++;
- src++;
}
+#else
+
+ for (;size > 3; size-=4) {
+ DEINT_LINE_LUM
+ lum_m4+=4;
+ lum_m3+=4;
+ lum_m2+=4;
+ lum_m1+=4;
+ lum+=4;
+ dst+=4;
+ }
+#endif
+}
+static void deinterlace_line_inplace(UINT8 *lum_m4, UINT8 *lum_m3, UINT8 *lum_m2, UINT8 *lum_m1, UINT8 *lum,
+ int size)
+{
+#ifndef HAVE_MMX
+ UINT8 *cm = cropTbl + MAX_NEG_CROP;
+ int sum;
+
+ for(;size > 0;size--) {
+ sum = -lum_m4[0];
+ sum += lum_m3[0] << 2;
+ sum += lum_m2[0] << 1;
+ lum_m4[0]=lum_m2[0];
+ sum += lum_m1[0] << 2;
+ sum += -lum[0];
+ lum_m2[0] = cm[(sum + 4) >> 3];
+ lum_m4++;
+ lum_m3++;
+ lum_m2++;
+ lum_m1++;
+ lum++;
+ }
+#else
+
+ for (;size > 3; size-=4) {
+ DEINT_INPLACE_LINE_LUM
+ lum_m4+=4;
+ lum_m3+=4;
+ lum_m2+=4;
+ lum_m1+=4;
+ lum+=4;
+ }
+#endif
}
/* 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,
- int width, int height)
+ UINT8 *src1, int src_wrap,
+ int width, int height)
{
- UINT8 *src, *ptr;
- int y, y1, i;
- UINT8 *buf;
-
- buf = (UINT8*)av_malloc(5 * width);
-
- src = src1;
- for(y=0;y<height;y+=2) {
- /* copy top field line */
- memcpy(dst, src, width);
+ UINT8 *src_m2, *src_m1, *src_0, *src_p1, *src_p2;
+ int y;
+
+ src_m2 = src1;
+ src_m1 = src1;
+ src_0=&src_m1[src_wrap];
+ src_p1=&src_0[src_wrap];
+ src_p2=&src_p1[src_wrap];
+ for(y=0;y<(height-2);y+=2) {
+ memcpy(dst,src_m1,width);
dst += dst_wrap;
- src += (1 - 2) * src_wrap;
- y1 = y - 2;
- if (y1 >= 0 && (y1 + 4) < height) {
- /* fast case : no edges */
- deinterlace_line(dst, src, src_wrap, width);
- } else {
- /* in order to use the same function, we use an intermediate buffer */
- ptr = buf;
- for(i=0;i<5;i++) {
- if (y1 < 0)
- memcpy(ptr, src1, width);
- else if (y1 >= height)
- memcpy(ptr, src1 + (height - 1) * src_wrap, width);
- else
- memcpy(ptr, src1 + y1 * src_wrap, width);
- y1++;
- ptr += width;
- }
- deinterlace_line(dst, buf, width, width);
- }
+ deinterlace_line(dst,src_m2,src_m1,src_0,src_p1,src_p2,width);
+ src_m2 = src_0;
+ src_m1 = src_p1;
+ src_0 = src_p2;
+ src_p1 += 2*src_wrap;
+ src_p2 += 2*src_wrap;
dst += dst_wrap;
- src += (2 + 1) * src_wrap;
}
+ memcpy(dst,src_m1,width);
+ dst += dst_wrap;
+ /* do last line */
+ 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,
+ int width, int height)
+{
+ UINT8 *src_m1, *src_0, *src_p1, *src_p2;
+ int y;
+ UINT8 *buf;
+ buf = (UINT8*)av_malloc(width);
+
+ src_m1 = src1;
+ memcpy(buf,src_m1,width);
+ src_0=&src_m1[src_wrap];
+ src_p1=&src_0[src_wrap];
+ src_p2=&src_p1[src_wrap];
+ for(y=0;y<(height-2);y+=2) {
+ deinterlace_line_inplace(buf,src_m1,src_0,src_p1,src_p2,width);
+ src_m1 = src_p1;
+ src_0 = src_p2;
+ src_p1 += 2*src_wrap;
+ src_p2 += 2*src_wrap;
+ }
+ /* do last line */
+ deinterlace_line_inplace(buf,src_m1,src_0,src_0,src_0,width);
av_free(buf);
}
-/* deinterlace, return -1 if format not handled */
+/* deinterlace - if not supported return -1 */
int avpicture_deinterlace(AVPicture *dst, AVPicture *src,
int pix_fmt, int width, int height)
{
@@ -842,8 +951,21 @@ int avpicture_deinterlace(AVPicture *dst, AVPicture *src,
pix_fmt != PIX_FMT_YUV422P &&
pix_fmt != PIX_FMT_YUV444P)
return -1;
- if ((width & 1) != 0 || (height & 3) != 0)
+ if ((width & 3) != 0 || (height & 3) != 0)
return -1;
+
+#ifdef HAVE_MMX
+ {
+ mmx_t rounder;
+ rounder.uw[0]=4;
+ rounder.uw[1]=4;
+ rounder.uw[2]=4;
+ rounder.uw[3]=4;
+ pxor_r2r(mm7,mm7);
+ movq_m2r(rounder,mm6);
+ }
+#endif
+
for(i=0;i<3;i++) {
if (i == 1) {
@@ -859,10 +981,18 @@ int avpicture_deinterlace(AVPicture *dst, AVPicture *src,
break;
}
}
- deinterlace_bottom_field(dst->data[i], dst->linesize[i],
- src->data[i], src->linesize[i],
+ if (src == dst) {
+ deinterlace_bottom_field_inplace(src->data[i], src->linesize[i],
width, height);
+ } else {
+ deinterlace_bottom_field(dst->data[i],dst->linesize[i],
+ src->data[i], src->linesize[i],
+ width, height);
+ }
}
+#ifdef HAVE_MMX
+ emms();
+#endif
return 0;
}
diff --git a/src/libffmpeg/libavcodec/mdct.c b/src/libffmpeg/libavcodec/mdct.c
index baab5d315..0f70ed850 100644
--- a/src/libffmpeg/libavcodec/mdct.c
+++ b/src/libffmpeg/libavcodec/mdct.c
@@ -21,7 +21,7 @@
/*
* init MDCT or IMDCT computation
*/
-int mdct_init(MDCTContext *s, int nbits, int inverse)
+int ff_mdct_init(MDCTContext *s, int nbits, int inverse)
{
int n, n4, i;
float alpha;
@@ -69,8 +69,8 @@ int mdct_init(MDCTContext *s, int nbits, int inverse)
* @param input N/2 samples
* @param tmp N/2 samples
*/
-void imdct_calc(MDCTContext *s, FFTSample *output,
- const FFTSample *input, FFTSample *tmp)
+void ff_imdct_calc(MDCTContext *s, FFTSample *output,
+ const FFTSample *input, FFTSample *tmp)
{
int k, n8, n4, n2, n, j;
const uint16_t *revtab = s->fft.revtab;
@@ -121,8 +121,8 @@ void imdct_calc(MDCTContext *s, FFTSample *output,
* @param out N/2 samples
* @param tmp temporary storage of N/2 samples
*/
-void mdct_calc(MDCTContext *s, FFTSample *out,
- const FFTSample *input, FFTSample *tmp)
+void ff_mdct_calc(MDCTContext *s, FFTSample *out,
+ const FFTSample *input, FFTSample *tmp)
{
int i, j, n, n8, n4, n2, n3;
FFTSample re, im, re1, im1;
@@ -162,7 +162,7 @@ void mdct_calc(MDCTContext *s, FFTSample *out,
}
}
-void mdct_end(MDCTContext *s)
+void ff_mdct_end(MDCTContext *s)
{
av_freep(&s->tcos);
av_freep(&s->tsin);
diff --git a/src/libffmpeg/libavcodec/mjpeg.c b/src/libffmpeg/libavcodec/mjpeg.c
index 292cd7d0f..8b167a157 100644
--- a/src/libffmpeg/libavcodec/mjpeg.c
+++ b/src/libffmpeg/libavcodec/mjpeg.c
@@ -470,9 +470,73 @@ void mjpeg_picture_header(MpegEncContext *s)
put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
}
+static void escape_FF(MpegEncContext *s, int start)
+{
+ int size= get_bit_count(&s->pb) - start*8;
+ int i, ff_count;
+ uint8_t *buf= s->pb.buf + start;
+ int align= (-(int)(buf))&3;
+
+ assert((size&7) == 0);
+ size >>= 3;
+
+ ff_count=0;
+ for(i=0; i<size && i<align; i++){
+ if(buf[i]==0xFF) ff_count++;
+ }
+ for(; i<size-15; i+=16){
+ int acc, v;
+
+ v= *(uint32_t*)(&buf[i]);
+ acc= (((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
+ v= *(uint32_t*)(&buf[i+4]);
+ acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
+ v= *(uint32_t*)(&buf[i+8]);
+ acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
+ v= *(uint32_t*)(&buf[i+12]);
+ acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
+
+ acc>>=4;
+ acc+= (acc>>16);
+ acc+= (acc>>8);
+ ff_count+= acc&0xFF;
+ }
+ for(; i<size; i++){
+ if(buf[i]==0xFF) ff_count++;
+ }
+
+ if(ff_count==0) return;
+
+ /* skip put bits */
+ for(i=0; i<ff_count-3; i+=4)
+ put_bits(&s->pb, 32, 0);
+ put_bits(&s->pb, (ff_count-i)*8, 0);
+ flush_put_bits(&s->pb);
+
+ for(i=size-1; ff_count; i--){
+ int v= buf[i];
+
+ if(v==0xFF){
+//printf("%d %d\n", i, ff_count);
+ buf[i+ff_count]= 0;
+ ff_count--;
+ }
+
+ buf[i+ff_count]= v;
+ }
+}
+
void mjpeg_picture_trailer(MpegEncContext *s)
{
- jflush_put_bits(&s->pb);
+ int pad= (-get_bit_count(&s->pb))&7;
+
+ put_bits(&s->pb, pad,0xFF>>(8-pad));
+ flush_put_bits(&s->pb);
+
+ assert((s->header_bits&7)==0);
+
+ escape_FF(s, s->header_bits>>3);
+
put_marker(&s->pb, EOI);
}
@@ -482,7 +546,7 @@ static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
int mant, nbits;
if (val == 0) {
- jput_bits(&s->pb, huff_size[0], huff_code[0]);
+ put_bits(&s->pb, huff_size[0], huff_code[0]);
} else {
mant = val;
if (val < 0) {
@@ -497,9 +561,9 @@ static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
nbits++;
}
- jput_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
+ put_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
- jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
+ put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
}
}
@@ -537,7 +601,7 @@ static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
run++;
} else {
while (run >= 16) {
- jput_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
+ put_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
run -= 16;
}
mant = val;
@@ -554,16 +618,16 @@ static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
}
code = (run << 4) | nbits;
- jput_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
+ put_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
- jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
+ put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
run = 0;
}
}
/* output EOB only if not already 64 values */
if (last_index < 63 || run != 0)
- jput_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
+ put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
}
void mjpeg_encode_mb(MpegEncContext *s,
@@ -608,13 +672,14 @@ typedef struct MJpegDecodeContext {
UINT8 *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*/);
- int buggy_avid;
int restart_interval;
int restart_count;
+
+ int buggy_avid;
int interlace_polarity;
- ScanTable scantable;
- void (*idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
} MJpegDecodeContext;
static int mjpeg_decode_dht(MJpegDecodeContext *s);
@@ -1032,7 +1097,9 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s)
}
}
}
- if ((s->restart_interval <= 8) && !--s->restart_count) {
+ /* (< 1350) buggy workaround for Spectralfan.mov, should be fixed */
+
+ if ((s->restart_interval < 1350) && !--s->restart_count) {
align_get_bits(&s->gb);
skip_bits(&s->gb, 16); /* skip RSTn */
for (j=0; j<nb_components; j++) /* reset dc */
@@ -1068,12 +1135,13 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
if (len < 5)
return -1;
- id = be2me_32((get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16));
+ id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
+ id = be2me_32(id);
len -= 6;
/* buggy AVID, it puts EOI only at every 10th frame */
- /* also this fourcc is used by non-avid files too, it means
- interleaving, but it's always present in AVID files */
+ /* also this fourcc is used by non-avid files too, it holds some
+ informations, but it's always present in AVID creates files */
if (id == ff_get_fourcc("AVI1"))
{
/* structure:
@@ -1098,10 +1166,11 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
goto out;
}
- len -= 2;
+// len -= 2;
if (id == ff_get_fourcc("JFIF"))
{
+ int t_w, t_h;
skip_bits(&s->gb, 8); /* the trailing zero-byte */
printf("mjpeg: JFIF header found (version: %x.%x)\n",
get_bits(&s->gb, 8), get_bits(&s->gb, 8));
@@ -1116,15 +1185,34 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
skip_bits(&s->gb, 16);
skip_bits(&s->gb, 16);
}
- skip_bits(&s->gb, 8);
- skip_bits(&s->gb, 8);
+ t_w = get_bits(&s->gb, 8);
+ t_h = get_bits(&s->gb, 8);
+ if (t_w && t_h)
+ {
+ /* skip thumbnail */
+ if (len-10-(t_w*t_h*3) > 0)
+ len -= t_w*t_h*3;
+ }
+ len -= 10;
+ goto out;
+ }
+
+ if (id == ff_get_fourcc("Adob") && (get_bits(&s->gb, 8) == 'e'))
+ {
+ printf("mjpeg: Adobe header found\n");
+ skip_bits(&s->gb, 16); /* version */
+ skip_bits(&s->gb, 16); /* flags0 */
+ skip_bits(&s->gb, 16); /* flags1 */
+ skip_bits(&s->gb, 8); /* transform */
+ len -= 7;
goto out;
}
/* Apple MJPEG-A */
if ((s->start_code == APP1) && (len > (0x28 - 8)))
{
- id = be2me_32((get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16));
+ id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
+ id = be2me_32(id);
len -= 4;
if (id == ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
{
@@ -1144,6 +1232,12 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
}
out:
+ /* slow but needed for extreme adobe jpegs */
+ if (len < 0)
+ printf("mjpeg: error, decode_app parser read over the end\n");
+ while(--len > 0)
+ skip_bits(&s->gb, 8);
+
return 0;
}
@@ -1278,10 +1372,16 @@ static int mjpeg_decode_frame(AVCodecContext *avctx,
while (src<buf_end)
{
UINT8 x = *(src++);
-
+
+#if 0
+ if (x == 0xff && *src == 0xff)
+ break;
+#endif
*(dst++) = x;
if (x == 0xff)
{
+ while(*src == 0xff) src++;
+
x = *(src++);
if (x >= 0xd0 && x <= 0xd7)
*(dst++) = x;
@@ -1290,6 +1390,9 @@ static int mjpeg_decode_frame(AVCodecContext *avctx,
}
}
init_get_bits(&s->gb, s->buffer, dst - s->buffer);
+
+ dprintf("escaping removed %d bytes\n",
+ (buf_end - buf_ptr) - (dst - s->buffer));
}
else
init_get_bits(&s->gb, buf_ptr, buf_end - buf_ptr);
diff --git a/src/libffmpeg/libavcodec/mlib/dsputil_mlib.c b/src/libffmpeg/libavcodec/mlib/dsputil_mlib.c
index 445500c50..e75f858a2 100644
--- a/src/libffmpeg/libavcodec/mlib/dsputil_mlib.c
+++ b/src/libffmpeg/libavcodec/mlib/dsputil_mlib.c
@@ -223,30 +223,30 @@ static void ff_fdct_mlib(DCTELEM *data)
mlib_VideoDCT8x8_S16_S16 (data, data);
}
-void dsputil_init_mlib(void)
+void dsputil_init_mlib(DSPContext* c, unsigned mask)
{
- put_pixels_tab[0][0] = put_pixels16_mlib;
- put_pixels_tab[0][1] = put_pixels16_x2_mlib;
- put_pixels_tab[0][2] = put_pixels16_y2_mlib;
- put_pixels_tab[0][3] = put_pixels16_xy2_mlib;
- put_pixels_tab[1][0] = put_pixels8_mlib;
- put_pixels_tab[1][1] = put_pixels8_x2_mlib;
- put_pixels_tab[1][2] = put_pixels8_y2_mlib;
- put_pixels_tab[1][3] = put_pixels8_xy2_mlib;
-
- avg_pixels_tab[0][0] = avg_pixels16_mlib;
- avg_pixels_tab[0][1] = avg_pixels16_x2_mlib;
- avg_pixels_tab[0][2] = avg_pixels16_y2_mlib;
- avg_pixels_tab[0][3] = avg_pixels16_xy2_mlib;
- avg_pixels_tab[1][0] = avg_pixels8_mlib;
- avg_pixels_tab[1][1] = avg_pixels8_x2_mlib;
- avg_pixels_tab[1][2] = avg_pixels8_y2_mlib;
- avg_pixels_tab[1][3] = avg_pixels8_xy2_mlib;
-
- put_no_rnd_pixels_tab[0][0] = put_pixels16_mlib;
- put_no_rnd_pixels_tab[1][0] = put_pixels8_mlib;
-
- add_pixels_clamped = add_pixels_clamped_mlib;
+ c->put_pixels_tab[0][0] = put_pixels16_mlib;
+ c->put_pixels_tab[0][1] = put_pixels16_x2_mlib;
+ c->put_pixels_tab[0][2] = put_pixels16_y2_mlib;
+ c->put_pixels_tab[0][3] = put_pixels16_xy2_mlib;
+ c->put_pixels_tab[1][0] = put_pixels8_mlib;
+ c->put_pixels_tab[1][1] = put_pixels8_x2_mlib;
+ c->put_pixels_tab[1][2] = put_pixels8_y2_mlib;
+ c->put_pixels_tab[1][3] = put_pixels8_xy2_mlib;
+
+ c->avg_pixels_tab[0][0] = avg_pixels16_mlib;
+ c->avg_pixels_tab[0][1] = avg_pixels16_x2_mlib;
+ c->avg_pixels_tab[0][2] = avg_pixels16_y2_mlib;
+ c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mlib;
+ c->avg_pixels_tab[1][0] = avg_pixels8_mlib;
+ c->avg_pixels_tab[1][1] = avg_pixels8_x2_mlib;
+ c->avg_pixels_tab[1][2] = avg_pixels8_y2_mlib;
+ c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mlib;
+
+ c->put_no_rnd_pixels_tab[0][0] = put_pixels16_mlib;
+ c->put_no_rnd_pixels_tab[1][0] = put_pixels8_mlib;
+
+ c->add_pixels_clamped = add_pixels_clamped_mlib;
}
void MPV_common_init_mlib(MpegEncContext *s)
diff --git a/src/libffmpeg/libavcodec/motion_est.c b/src/libffmpeg/libavcodec/motion_est.c
index f8064b126..779e88aa6 100644
--- a/src/libffmpeg/libavcodec/motion_est.c
+++ b/src/libffmpeg/libavcodec/motion_est.c
@@ -88,8 +88,8 @@ static int pix_norm(UINT8 * pix1, UINT8 * pix2, int line_size)
return s;
}
-static void no_motion_search(MpegEncContext * s,
- int *mx_ptr, int *my_ptr)
+static inline void no_motion_search(MpegEncContext * s,
+ int *mx_ptr, int *my_ptr)
{
*mx_ptr = 16 * s->mb_x;
*my_ptr = 16 * s->mb_y;
@@ -123,7 +123,7 @@ static int full_motion_search(MpegEncContext * s,
my = 0;
for (y = y1; y <= y2; y++) {
for (x = x1; x <= x2; x++) {
- d = pix_abs16x16(pix, ref_picture + (y * s->linesize) + x,
+ d = s->dsp.pix_abs16x16(pix, ref_picture + (y * s->linesize) + x,
s->linesize);
if (d < dmin ||
(d == dmin &&
@@ -188,7 +188,7 @@ static int log_motion_search(MpegEncContext * s,
do {
for (y = y1; y <= y2; y += range) {
for (x = x1; x <= x2; x += range) {
- d = pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
+ d = s->dsp.pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
if (d < dmin || (d == dmin && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {
dmin = d;
mx = x;
@@ -268,7 +268,7 @@ static int phods_motion_search(MpegEncContext * s,
lastx = x;
for (x = x1; x <= x2; x += range) {
- d = pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
+ d = s->dsp.pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
if (d < dminx || (d == dminx && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {
dminx = d;
mx = x;
@@ -277,7 +277,7 @@ static int phods_motion_search(MpegEncContext * s,
x = lastx;
for (y = y1; y <= y2; y += range) {
- d = pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
+ d = s->dsp.pix_abs16x16(pix, ref_picture + (y * s->linesize) + x, s->linesize);
if (d < dminy || (d == dminy && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) {
dminy = d;
my = y;
@@ -324,7 +324,7 @@ static int phods_motion_search(MpegEncContext * s,
const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\
if(map[index]!=key){\
- d = pix_abs16x16(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);\
+ d = s->dsp.pix_abs16x16(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);\
d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*quant;\
COPY3_IF_LT(dmin, d, best[0], x, best[1], y)\
map[index]= key;\
@@ -355,7 +355,7 @@ static int phods_motion_search(MpegEncContext * s,
const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\
if(map[index]!=key){\
- d = pix_abs8x8(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);\
+ d = s->dsp.pix_abs8x8(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);\
d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*quant;\
COPY3_IF_LT(dmin, d, best[0], x, best[1], y)\
map[index]= key;\
@@ -590,7 +590,7 @@ static int epzs_motion_search(MpegEncContext * s,
map_generation= update_map_generation(s);
- dmin = pix_abs16x16(new_pic, old_pic, pic_stride);
+ dmin = s->dsp.pix_abs16x16(new_pic, old_pic, pic_stride);
map[0]= map_generation;
score_map[0]= dmin;
@@ -644,11 +644,11 @@ static int epzs_motion_search(MpegEncContext * s,
if(s->me_method==ME_EPZS)
dmin= small_diamond_search(s, best, dmin, new_pic, old_pic, pic_stride,
pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax,
- shift, map, score_map, map_generation, pix_abs16x16);
+ shift, map, score_map, map_generation, s->dsp.pix_abs16x16);
else
dmin= cross_search(s, best, dmin, new_pic, old_pic, pic_stride,
pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax,
- shift, map, score_map, map_generation, pix_abs16x16);
+ shift, map, score_map, map_generation, s->dsp.pix_abs16x16);
//check(best[0],best[1],0, b1)
*mx_ptr= best[0];
*my_ptr= best[1];
@@ -683,7 +683,7 @@ static int epzs_motion_search4(MpegEncContext * s, int block,
//printf("%d %d %d %d //",xmin, ymin, xmax, ymax);
/* first line */
if ((s->mb_y == 0 || s->first_slice_line) && block<2) {
- CHECK_MV4(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
+ CHECK_MV4(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
CHECK_MV4(P_LAST[0]>>shift, P_LAST[1]>>shift)
CHECK_MV4(P_MV1[0]>>shift, P_MV1[1]>>shift)
}else{
@@ -705,11 +705,11 @@ static int epzs_motion_search4(MpegEncContext * s, int block,
if(s->me_method==ME_EPZS)
dmin= small_diamond_search(s, best, dmin, new_pic, old_pic, pic_stride,
pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax,
- shift, map, score_map, map_generation, pix_abs8x8);
+ shift, map, score_map, map_generation, s->dsp.pix_abs8x8);
else
dmin= cross_search(s, best, dmin, new_pic, old_pic, pic_stride,
pred_x, pred_y, mv_penalty, quant, xmin, ymin, xmax, ymax,
- shift, map, score_map, map_generation, pix_abs8x8);
+ shift, map, score_map, map_generation, s->dsp.pix_abs8x8);
*mx_ptr= best[0];
*my_ptr= best[1];
@@ -1023,8 +1023,8 @@ static inline int mv4_search(MpegEncContext *s, int xmin, int ymin, int xmax, in
dmin4 = epzs_motion_search4(s, block, &mx4, &my4, P, pred_x4, pred_y4, rel_xmin4, rel_ymin4, rel_xmax4, rel_ymax4, ref_picture);
dmin4= fast_halfpel_motion_search(s, &mx4, &my4, dmin4, rel_xmin4, rel_ymin4, rel_xmax4, rel_ymax4,
- pred_x4, pred_y4, ref_picture, pix_abs8x8_x2,
- pix_abs8x8_y2, pix_abs8x8_xy2, block);
+ pred_x4, pred_y4, ref_picture, s->dsp.pix_abs8x8_x2,
+ s->dsp.pix_abs8x8_y2, s->dsp.pix_abs8x8_xy2, block);
s->motion_val[ s->block_index[block] ][0]= mx4;
s->motion_val[ s->block_index[block] ][1]= my4;
@@ -1133,16 +1133,16 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
/* At this point (mx,my) are full-pell and the relative displacement */
ppix = ref_picture + ((yy+my) * s->linesize) + (xx+mx);
- sum = pix_sum(pix, s->linesize);
+ sum = s->dsp.pix_sum(pix, s->linesize);
- sum= (sum+8)>>4;
- varc = (pix_norm1(pix, s->linesize) - sum*sum + 500 + 128)>>8;
+ varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
+ // FIXME: MMX OPTIMIZE
vard = (pix_norm(pix, ppix, s->linesize)+128)>>8;
//printf("%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout);
s->mb_var [s->mb_width * mb_y + mb_x] = varc;
s->mc_mb_var[s->mb_width * mb_y + mb_x] = vard;
- s->mb_mean [s->mb_width * mb_y + mb_x] = (sum+7)>>4;
+ s->mb_mean [s->mb_width * mb_y + mb_x] = (sum+128)>>8;
s->mb_var_sum += varc;
s->mc_mb_var_sum += vard;
//printf("E%d %d %d %X %X %X\n", s->mb_width, mb_x, mb_y,(int)s, (int)s->mb_var, (int)s->mc_mb_var); fflush(stdout);
@@ -1162,13 +1162,13 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
if (varc*2 + 200 > vard){
mb_type|= MB_TYPE_INTER;
if(s->me_method >= ME_EPZS)
- fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
- pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2,
- pix_abs16x16_xy2, 0);
+ fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
+ pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2,
+ s->dsp.pix_abs16x16_y2, s->dsp.pix_abs16x16_xy2, 0);
else
- halfpel_motion_search( s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
- pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2,
- pix_abs16x16_xy2, 0);
+ halfpel_motion_search( s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
+ pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2,
+ s->dsp.pix_abs16x16_y2, s->dsp.pix_abs16x16_xy2, 0);
}else{
mx <<=1;
my <<=1;
@@ -1187,13 +1187,13 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
mb_type|= MB_TYPE_INTER;
if (s->me_method != ME_ZERO) {
if(s->me_method >= ME_EPZS)
- dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
- pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2,
- pix_abs16x16_xy2, 0);
+ dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
+ pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2, s->dsp.pix_abs16x16_y2,
+ s->dsp.pix_abs16x16_xy2, 0);
else
- dmin= halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
- pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2,
- pix_abs16x16_xy2, 0);
+ dmin= halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
+ pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2, s->dsp.pix_abs16x16_y2,
+ s->dsp.pix_abs16x16_xy2, 0);
if((s->flags&CODEC_FLAG_4MV)
&& !s->skip_me && varc>50 && vard>10){
int dmin4= mv4_search(s, rel_xmin, rel_ymin, rel_xmax, rel_ymax, mx, my, shift);
@@ -1304,9 +1304,9 @@ int ff_estimate_motion_b(MpegEncContext * s,
break;
}
- dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
- pred_x, pred_y, ref_picture, pix_abs16x16_x2, pix_abs16x16_y2,
- pix_abs16x16_xy2, 0);
+ dmin= fast_halfpel_motion_search(s, &mx, &my, dmin, rel_xmin, rel_ymin, rel_xmax, rel_ymax,
+ pred_x, pred_y, ref_picture, s->dsp.pix_abs16x16_x2, s->dsp.pix_abs16x16_y2,
+ s->dsp.pix_abs16x16_xy2, 0);
//printf("%d %d %d %d//", s->mb_x, s->mb_y, mx, my);
// s->mb_type[mb_y*s->mb_width + mb_x]= mb_type;
mv_table[mot_xy][0]= mx;
@@ -1344,8 +1344,8 @@ static inline int check_bidir_mv(MpegEncContext * s,
dxy&= 1;
ptr = s->last_picture[0] + (src_y * s->linesize) + src_x;
- put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
-
+ s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
+
fbmin += (mv_penalty[motion_bx-pred_bx] + mv_penalty[motion_by-pred_by])*s->qscale;
dxy = ((motion_by & 1) << 1) | (motion_bx & 1);
@@ -1357,11 +1357,11 @@ static inline int check_bidir_mv(MpegEncContext * s,
src_y = clip(src_y, -16, s->height);
if (src_y == s->height)
dxy&= 1;
-
+
ptr = s->next_picture[0] + (src_y * s->linesize) + src_x;
- avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
-
- fbmin += pix_abs16x16(s->new_picture[0] + mb_x*16 + mb_y*16*s->linesize, dest_y, s->linesize);
+ s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
+
+ fbmin += s->dsp.pix_abs16x16(s->new_picture[0] + mb_x*16 + mb_y*16*s->linesize, dest_y, s->linesize);
return fbmin;
}
@@ -1444,7 +1444,7 @@ static inline int direct_search(MpegEncContext * s,
if (src_y == height) dxy &= ~2;
ptr = s->last_picture[0] + (src_y * s->linesize) + src_x;
- put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
+ s->dsp.put_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
dxy = ((motion_by & 1) << 1) | (motion_bx & 1);
src_x = (mb_x + bx) * 16 + (motion_bx >> 1);
@@ -1454,7 +1454,7 @@ static inline int direct_search(MpegEncContext * s,
src_y = clip(src_y, -16, height);
if (src_y == height) dxy &= ~2;
- avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
+ s->dsp.avg_pixels_tab[0][dxy](dest_y , ptr , s->linesize, 16);
}
}
@@ -1558,7 +1558,7 @@ void ff_estimate_b_frame_motion(MpegEncContext * s,
score=fbmin;
type= MB_TYPE_BIDIR;
}
- score= (score*score + 128*256)>>16;
+ score= ((unsigned)(score*score + 128*256))>>16;
s->mc_mb_var_sum += score;
s->mc_mb_var[mb_y*s->mb_width + mb_x] = score; //FIXME use SSD
}
@@ -1601,8 +1601,8 @@ int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type)
i= y*s->mb_width;
for(x=0; x<s->mb_width; x++){
if(s->mb_type[i] & type){
- int fcode= MAX(fcode_tab[mv_table[xy][0] + MAX_MV],
- fcode_tab[mv_table[xy][1] + MAX_MV]);
+ int fcode= FFMAX(fcode_tab[mv_table[xy][0] + MAX_MV],
+ fcode_tab[mv_table[xy][1] + MAX_MV]);
int j;
for(j=0; j<fcode && j<8; j++){
diff --git a/src/libffmpeg/libavcodec/mpeg12.c b/src/libffmpeg/libavcodec/mpeg12.c
index 4bd8d1aeb..5a87f4287 100644
--- a/src/libffmpeg/libavcodec/mpeg12.c
+++ b/src/libffmpeg/libavcodec/mpeg12.c
@@ -1559,7 +1559,18 @@ static void mpeg_decode_extension(AVCodecContext *avctx,
}
}
-/* return 1 if end of frame */
+#define DECODE_SLICE_FATAL_ERROR -2
+#define DECODE_SLICE_ERROR -1
+#define DECODE_SLICE_OK 0
+#define DECODE_SLICE_EOP 1
+
+/**
+ * decodes a slice.
+ * @return DECODE_SLICE_FATAL_ERROR if a non recoverable error occured<br>
+ * DECODE_SLICE_ERROR if the slice is damaged<br>
+ * DECODE_SLICE_OK if this slice is ok<br>
+ * DECODE_SLICE_EOP if the end of the picture is reached
+ */
static int mpeg_decode_slice(AVCodecContext *avctx,
AVPicture *pict,
int start_code,
@@ -1572,7 +1583,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx,
start_code = (start_code - 1) & 0xff;
if (start_code >= s->mb_height){
fprintf(stderr, "slice below image (%d >= %d)\n", start_code, s->mb_height);
- return -1;
+ return DECODE_SLICE_ERROR;
}
s->last_dc[0] = 1 << (7 + s->intra_dc_precision);
s->last_dc[1] = s->last_dc[0];
@@ -1582,7 +1593,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx,
if (s->first_slice) {
s->first_slice = 0;
if(MPV_frame_start(s, avctx) < 0)
- return -1;
+ return DECODE_SLICE_FATAL_ERROR;
}
init_get_bits(&s->gb, buf, buf_size);
@@ -1612,8 +1623,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx,
s->mb_incr= 1;
for(;;) {
- clear_blocks(s->block[0]);
- emms_c();
+ s->dsp.clear_blocks(s->block[0]);
ret = mpeg_decode_mb(s, s->block);
dprintf("ret=%d\n", ret);
@@ -1623,30 +1633,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx,
MPV_decode_mb(s, s->block);
if (++s->mb_x >= s->mb_width) {
- if ( avctx->draw_horiz_band
- && (s->num_available_buffers>=1 || (!s->has_b_frames)) ) {
- 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)
- offset = 0;
- else
- offset = y * s->linesize;
- if(s->pict_type==B_TYPE || (!s->has_b_frames)){
- src_ptr[0] = s->current_picture[0] + offset;
- src_ptr[1] = s->current_picture[1] + (offset >> 2);
- src_ptr[2] = s->current_picture[2] + (offset >> 2);
- } else {
- src_ptr[0] = s->last_picture[0] + offset;
- src_ptr[1] = s->last_picture[1] + (offset >> 2);
- src_ptr[2] = s->last_picture[2] + (offset >> 2);
- }
- avctx->draw_horiz_band(avctx, src_ptr, s->linesize,
- y, s->width, h);
- }
+ ff_draw_horiz_band(s);
s->mb_x = 0;
s->mb_y++;
@@ -1675,7 +1662,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx,
}
if(s->mb_y >= s->mb_height){
fprintf(stderr, "slice too long\n");
- return -1;
+ return DECODE_SLICE_ERROR;
}
}
eos: //end of slice
@@ -1690,7 +1677,6 @@ eos: //end of slice
MPV_frame_end(s);
- /* XXX: incorrect reported qscale for mpeg2 */
if (s->pict_type == B_TYPE) {
picture = s->current_picture;
avctx->quality = s->qscale;
@@ -1706,6 +1692,8 @@ eos: //end of slice
s->last_qscale = s->qscale;
s->picture_number++;
}
+ if(s->mpeg2)
+ avctx->quality>>=1;
if (picture) {
pict->data[0] = picture[0];
pict->data[1] = picture[1];
@@ -1713,12 +1701,12 @@ eos: //end of slice
pict->linesize[0] = s->linesize;
pict->linesize[1] = s->uvlinesize;
pict->linesize[2] = s->uvlinesize;
- return 1;
+ return DECODE_SLICE_EOP;
} else {
- return 0;
+ return DECODE_SLICE_OK;
}
} else {
- return 0;
+ return DECODE_SLICE_OK;
}
}
@@ -1889,7 +1877,7 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
} else {
memcpy(s->buf_ptr, buf_start, len);
s->buf_ptr += len;
- if( (s2->flags&CODEC_FLAG_NOT_TRUNCATED) && (!start_code_found)
+ if( (!(s2->flags&CODEC_FLAG_TRUNCATED)) && (!start_code_found)
&& s->buf_ptr+4<s->buffer+s->buffer_size){
start_code_found= 1;
code= 0x1FF;
@@ -1926,7 +1914,7 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
start_code <= SLICE_MAX_START_CODE) {
ret = mpeg_decode_slice(avctx, picture,
start_code, s->buffer, input_size);
- if (ret == 1) {
+ if (ret == DECODE_SLICE_EOP) {
/* got a picture: exit */
/* first check if we must repeat the frame */
avctx->repeat_pict = 0;
@@ -1952,8 +1940,9 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
}
*data_size = sizeof(AVPicture);
goto the_end;
- }else if(ret==-1){
+ }else if(ret<0){
printf("Error while decoding slice\n");
+ if(ret==DECODE_SLICE_FATAL_ERROR) return -1;
}
}
break;
@@ -1983,5 +1972,5 @@ AVCodec mpeg_decoder = {
NULL,
mpeg_decode_end,
mpeg_decode_frame,
- CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
+ CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
};
diff --git a/src/libffmpeg/libavcodec/mpegvideo.c b/src/libffmpeg/libavcodec/mpegvideo.c
index 4761b6137..357ab20e4 100644
--- a/src/libffmpeg/libavcodec/mpegvideo.c
+++ b/src/libffmpeg/libavcodec/mpegvideo.c
@@ -57,7 +57,7 @@ static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int bl
/* for jpeg fast DCT */
#define CONST_BITS 14
-static const unsigned short aanscales[64] = {
+static const uint16_t aanscales[64] = {
/* precomputed values scaled up by 14 bits */
16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
@@ -70,7 +70,7 @@ static const unsigned short aanscales[64] = {
};
/* Input permutation for the simple_idct_mmx */
-static const UINT8 simple_mmx_permutation[64]={
+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,
@@ -81,11 +81,11 @@ static const UINT8 simple_mmx_permutation[64]={
0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
};
-static UINT8 h263_chroma_roundtab[16] = {
+static const uint8_t h263_chroma_roundtab[16] = {
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
};
-static UINT16 default_mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
+static UINT16 (*default_mv_penalty)[MAX_MV*2+1]=NULL;
static UINT8 default_fcode_tab[MAX_MV*2+1];
/* default motion estimation */
@@ -157,6 +157,9 @@ void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scanta
int j;
j = src_scantable[i];
st->permutated[i] = s->idct_permutation[j];
+#ifdef ARCH_POWERPC
+ st->inverse[j] = i;
+#endif
}
end=-1;
@@ -169,16 +172,19 @@ void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scanta
}
/* XXX: those functions should be suppressed ASAP when all IDCTs are
- converted */
+ 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);
- put_pixels_clamped(block, dest, line_size);
+ 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);
- add_pixels_clamped(block, dest, line_size);
+ ff_add_pixels_clamped(block, dest, line_size);
}
/* init common dct for both encoder and decoder */
@@ -186,6 +192,9 @@ 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;
@@ -221,6 +230,9 @@ int DCT_common_init(MpegEncContext *s)
#ifdef ARCH_ARMV4L
MPV_common_init_armv4l();
#endif
+#ifdef ARCH_POWERPC
+ MPV_common_init_ppc(s);
+#endif
switch(s->idct_permutation_type){
case FF_NO_IDCT_PERM:
@@ -262,29 +274,30 @@ int MPV_common_init(MpegEncContext *s)
UINT8 *pict;
int y_size, c_size, yc_size, i;
+ dsputil_init(&s->dsp, s->avctx->dsp_mask);
DCT_common_init(s);
-
+
s->flags= s->avctx->flags;
s->mb_width = (s->width + 15) / 16;
s->mb_height = (s->height + 15) / 16;
-
- y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
- c_size = (s->mb_width + 2) * (s->mb_height + 2);
- yc_size = y_size + 2 * c_size;
-
+
/* set default edge pos, will be overriden in decode_header if needed */
s->h_edge_pos= s->mb_width*16;
s->v_edge_pos= s->mb_height*16;
-
+
+ s->mb_num = s->mb_width * s->mb_height;
+
+ y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
+ c_size = (s->mb_width + 2) * (s->mb_height + 2);
+ 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->mb_num = s->mb_width * s->mb_height;
-
if(!(s->flags&CODEC_FLAG_DR1)){
s->linesize = s->mb_width * 16 + 2 * EDGE_WIDTH;
s->uvlinesize = s->mb_width * 8 + EDGE_WIDTH;
@@ -404,7 +417,7 @@ int MPV_common_init(MpegEncContext *s)
/* divx501 bitstream reorder buffer */
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))
@@ -420,7 +433,11 @@ int MPV_common_init(MpegEncContext *s)
s->dc_val[0][i] = 1024;
}
- CHECKED_ALLOCZ(s->qscale_table , s->mb_num * sizeof(UINT8))
+ CHECKED_ALLOCZ(s->next_qscale_table , s->mb_num * sizeof(UINT8))
+ CHECKED_ALLOCZ(s->last_qscale_table , s->mb_num * sizeof(UINT8))
+ CHECKED_ALLOCZ(s->aux_qscale_table , s->mb_num * sizeof(UINT8))
+ s->qscale_table= s->next_qscale_table;
+ s->avctx->qstride= s->mb_width;
/* which mb is a intra block */
CHECKED_ALLOCZ(s->mbintra_table, s->mb_num);
@@ -435,6 +452,8 @@ int MPV_common_init(MpegEncContext *s)
s->block= s->blocks[0];
+ s->parse_context.state= -1;
+
s->context_initialized = 1;
return 0;
fail:
@@ -469,7 +488,9 @@ void MPV_common_end(MpegEncContext *s)
av_freep(&s->mbintra_table);
av_freep(&s->cbp_table);
av_freep(&s->pred_dir_table);
- av_freep(&s->qscale_table);
+ av_freep(&s->next_qscale_table);
+ av_freep(&s->last_qscale_table);
+ av_freep(&s->aux_qscale_table);
av_freep(&s->me_scratchpad);
av_freep(&s->me_map);
av_freep(&s->me_score_map);
@@ -678,6 +699,8 @@ int MPV_encode_init(AVCodecContext *avctx)
if(!done){
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));
@@ -700,12 +723,14 @@ int MPV_encode_init(AVCodecContext *avctx)
if (MPV_common_init(s) < 0)
return -1;
+#ifdef CONFIG_ENCODERS
if (s->out_format == FMT_H263)
h263_encode_init(s);
else if (s->out_format == FMT_MPEG1)
ff_mpeg1_encode_init(s);
if(s->msmpeg4_version)
ff_msmpeg4_encode_init(s);
+#endif
/* init default q matrix */
for(i=0;i<64;i++) {
@@ -824,6 +849,9 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
s->current_picture[i] = s->aux_picture[i];
}
+ s->avctx->display_qscale_table=
+ s->avctx->current_qscale_table=
+ s->qscale_table= s->aux_qscale_table;
} else {
for(i=0;i<3;i++) {
/* swap next and last */
@@ -847,6 +875,9 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
else
avctx->dr_opaque_frame= s->next_dr_opaque;
}
+ s->avctx->current_qscale_table= s->qscale_table = s->last_qscale_table;
+ s->avctx->display_qscale_table= s->last_qscale_table = s->next_qscale_table;
+ s->next_qscale_table= s->qscale_table;
}
/* set dequantizer, we cant do it during init as it might change for mpeg4
and we cant do it in the header decode as init isnt called for mpeg4 there yet */
@@ -972,9 +1003,9 @@ int MPV_encode_picture(AVCodecContext *avctx,
init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
- if(avctx->flags&CODEC_FLAG_TYPE){
+ if(avctx->force_type){
s->input_pict_type=
- s->force_input_type= avctx->key_frame ? I_TYPE : P_TYPE;
+ s->force_input_type= avctx->force_type;
}else if(s->flags&CODEC_FLAG_PASS2){
s->input_pict_type=
s->force_input_type= s->rc_context.entry[s->input_picture_number].new_pict_type;
@@ -1109,17 +1140,17 @@ static inline void gmc1_motion(MpegEncContext *s,
}
if((motion_x|motion_y)&7){
- ff_gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
- ff_gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
+ s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
+ s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
}else{
int dxy;
dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
if (s->no_rounding){
- put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
+ s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
}else{
- put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
- }
+ s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
+ }
}
if(s->flags&CODEC_FLAG_GRAY) return;
@@ -1143,14 +1174,14 @@ static inline void gmc1_motion(MpegEncContext *s,
emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
ptr= s->edge_emu_buffer;
}
- ff_gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
+ s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
ptr = ref_picture[2] + offset;
if(emu){
emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
ptr= s->edge_emu_buffer;
}
- ff_gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
+ s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
return;
}
@@ -1175,14 +1206,14 @@ static inline void gmc_motion(MpegEncContext *s,
ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
- ff_gmc(dest_y, ptr, linesize, 16,
+ s->dsp.gmc(dest_y, ptr, linesize, 16,
ox,
oy,
s->sprite_delta[0][0], s->sprite_delta[0][1],
s->sprite_delta[1][0], s->sprite_delta[1][1],
a+1, (1<<(2*a+1)) - s->no_rounding,
s->h_edge_pos, s->v_edge_pos);
- ff_gmc(dest_y+8, ptr, linesize, 16,
+ s->dsp.gmc(dest_y+8, ptr, linesize, 16,
ox + s->sprite_delta[0][0]*8,
oy + s->sprite_delta[1][0]*8,
s->sprite_delta[0][0], s->sprite_delta[0][1],
@@ -1200,7 +1231,7 @@ static inline void gmc_motion(MpegEncContext *s,
oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
ptr = ref_picture[1] + (src_offset>>1);
- ff_gmc(dest_cb, ptr, uvlinesize, 8,
+ s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
ox,
oy,
s->sprite_delta[0][0], s->sprite_delta[0][1],
@@ -1209,7 +1240,7 @@ static inline void gmc_motion(MpegEncContext *s,
s->h_edge_pos>>1, s->v_edge_pos>>1);
ptr = ref_picture[2] + (src_offset>>1);
- ff_gmc(dest_cr, ptr, uvlinesize, 8,
+ s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
ox,
oy,
s->sprite_delta[0][0], s->sprite_delta[0][1],
@@ -1224,7 +1255,7 @@ static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int bl
int x, y;
int start_y, start_x, end_y, end_x;
UINT8 *buf= s->edge_emu_buffer;
-
+
if(src_y>= h){
src+= (h-1-src_y)*linesize;
src_y=h-1;
@@ -1240,10 +1271,10 @@ static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int bl
src_x=1-block_w;
}
- start_y= MAX(0, -src_y);
- start_x= MAX(0, -src_x);
- end_y= MIN(block_h, h-src_y);
- end_x= MIN(block_w, w-src_x);
+ start_y= FFMAX(0, -src_y);
+ start_x= FFMAX(0, -src_x);
+ end_y= FFMIN(block_h, h-src_y);
+ end_x= FFMIN(block_w, w-src_x);
// copy existing part
for(y=start_y; y<end_y; y++){
@@ -1728,14 +1759,6 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
mb_x = s->mb_x;
mb_y = s->mb_y;
-#ifdef FF_POSTPROCESS
- /* Obsolete. Exists for compatibility with mplayer only. */
- quant_store[mb_y][mb_x]=s->qscale;
- //printf("[%02d][%02d] %d\n",mb_x,mb_y,s->qscale);
-#else
- /* even more obsolete, exists for mplayer xp only */
- if(s->avctx->quant_store) s->avctx->quant_store[mb_y*s->avctx->qstride+mb_x] = s->qscale;
-#endif
s->qscale_table[mb_xy]= s->qscale;
/* update DC predictors for P macroblocks */
@@ -1815,7 +1838,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
/* if previous was skipped too, then nothing to do !
skip only during decoding as we might trash the buffers during encoding a bit */
if (*mbskip_ptr >= s->ip_buffer_count && !s->encoding)
- goto the_end;
+ return;
} else {
*mbskip_ptr = 0; /* not skipped */
}
@@ -1844,17 +1867,17 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
/* decoding or more than one mb_type (MC was allready done otherwise) */
if((!s->encoding) || (s->mb_type[mb_xy]&(s->mb_type[mb_xy]-1))){
if ((!s->no_rounding) || s->pict_type==B_TYPE){
- op_pix = put_pixels_tab;
- op_qpix= put_qpel_pixels_tab;
+ op_pix = s->dsp.put_pixels_tab;
+ op_qpix= s->dsp.put_qpel_pixels_tab;
}else{
- op_pix = put_no_rnd_pixels_tab;
- op_qpix= put_no_rnd_qpel_pixels_tab;
+ op_pix = s->dsp.put_no_rnd_pixels_tab;
+ op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
}
if (s->mv_dir & MV_DIR_FORWARD) {
MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix);
- op_pix = avg_pixels_tab;
- op_qpix= avg_qpel_pixels_tab;
+ op_pix = s->dsp.avg_pixels_tab;
+ op_qpix= s->dsp.avg_qpel_pixels_tab;
}
if (s->mv_dir & MV_DIR_BACKWARD) {
MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix);
@@ -1862,7 +1885,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
}
/* skip dequant / idct if we are really late ;) */
- if(s->hurry_up>1) goto the_end;
+ if(s->hurry_up>1) return;
/* add dct residue */
if(s->encoding || !( s->mpeg2 || s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO
@@ -1912,8 +1935,6 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
}
}
}
- the_end:
- emms_c(); //FIXME remove
}
static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
@@ -2143,6 +2164,8 @@ void ff_draw_horiz_band(MpegEncContext *s){
src_ptr[1] = s->last_picture[1] + (offset >> 2);
src_ptr[2] = s->last_picture[2] + (offset >> 2);
}
+ emms_c();
+
s->avctx->draw_horiz_band(s->avctx, src_ptr, s->linesize,
y, s->width, h);
}
@@ -2208,10 +2231,10 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
s->interlaced_dct=0;
}
- get_pixels(s->block[0], ptr , wrap_y);
- get_pixels(s->block[1], ptr + 8, wrap_y);
- get_pixels(s->block[2], ptr + dct_offset , wrap_y);
- get_pixels(s->block[3], ptr + dct_offset + 8, wrap_y);
+ s->dsp.get_pixels(s->block[0], ptr , wrap_y);
+ s->dsp.get_pixels(s->block[1], ptr + 8, wrap_y);
+ s->dsp.get_pixels(s->block[2], ptr + dct_offset , wrap_y);
+ s->dsp.get_pixels(s->block[3], ptr + dct_offset + 8, wrap_y);
if(s->flags&CODEC_FLAG_GRAY){
skip_dct[4]= 1;
@@ -2223,14 +2246,14 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
ptr= s->edge_emu_buffer;
}
- get_pixels(s->block[4], ptr, wrap_c);
+ s->dsp.get_pixels(s->block[4], ptr, wrap_c);
ptr = s->new_picture[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
if(emu){
emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
ptr= s->edge_emu_buffer;
}
- get_pixels(s->block[5], ptr, wrap_c);
+ s->dsp.get_pixels(s->block[5], ptr, wrap_c);
}
}else{
op_pixels_func (*op_pix)[4];
@@ -2250,17 +2273,17 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
ptr_cr = s->new_picture[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
if ((!s->no_rounding) || s->pict_type==B_TYPE){
- op_pix = put_pixels_tab;
- op_qpix= put_qpel_pixels_tab;
+ op_pix = s->dsp.put_pixels_tab;
+ op_qpix= s->dsp.put_qpel_pixels_tab;
}else{
- op_pix = put_no_rnd_pixels_tab;
- op_qpix= put_no_rnd_qpel_pixels_tab;
+ op_pix = s->dsp.put_no_rnd_pixels_tab;
+ op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
}
if (s->mv_dir & MV_DIR_FORWARD) {
MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix);
- op_pix = avg_pixels_tab;
- op_qpix= avg_qpel_pixels_tab;
+ op_pix = s->dsp.avg_pixels_tab;
+ op_qpix= s->dsp.avg_qpel_pixels_tab;
}
if (s->mv_dir & MV_DIR_BACKWARD) {
MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix);
@@ -2289,10 +2312,10 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
s->interlaced_dct=0;
}
- diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
- diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
- diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
- diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
+ s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
+ s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
+ s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
+ s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
if(s->flags&CODEC_FLAG_GRAY){
skip_dct[4]= 1;
@@ -2302,23 +2325,23 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
ptr_cb= s->edge_emu_buffer;
}
- diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
+ s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
if(emu){
emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
ptr_cr= s->edge_emu_buffer;
}
- diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
+ s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
}
/* pre quantization */
if(s->mc_mb_var[s->mb_width*mb_y+ mb_x]<2*s->qscale*s->qscale){
//FIXME optimize
- if(pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1;
- if(pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1;
- if(pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1;
- if(pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1;
- if(pix_abs8x8(ptr_cb , dest_cb , wrap_y) < 20*s->qscale) skip_dct[4]= 1;
- if(pix_abs8x8(ptr_cr , dest_cr , wrap_y) < 20*s->qscale) skip_dct[5]= 1;
+ if(s->dsp.pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1;
+ if(s->dsp.pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1;
+ if(s->dsp.pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1;
+ if(s->dsp.pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1;
+ if(s->dsp.pix_abs8x8(ptr_cb , dest_cb , wrap_y) < 20*s->qscale) skip_dct[4]= 1;
+ if(s->dsp.pix_abs8x8(ptr_cr , dest_cr , wrap_y) < 20*s->qscale) skip_dct[5]= 1;
#if 0
{
static int stat[7];
@@ -2385,6 +2408,7 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
s->block[5][0]= 128;
}
+#ifdef CONFIG_ENCODERS
/* huffman encode */
switch(s->out_format) {
case FMT_MPEG1:
@@ -2402,6 +2426,7 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
mjpeg_encode_mb(s, s->block);
break;
}
+#endif
}
void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length)
@@ -2568,7 +2593,6 @@ static void encode_picture(MpegEncContext *s, int picture_number)
// s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
}
}
- emms_c();
}else /* if(s->pict_type == I_TYPE) */{
/* I-Frame */
//FIXME do we need to zero them?
@@ -2584,18 +2608,19 @@ static void encode_picture(MpegEncContext *s, int picture_number)
int yy = mb_y * 16;
uint8_t *pix = s->new_picture[0] + (yy * s->linesize) + xx;
int varc;
- int sum = pix_sum(pix, s->linesize);
+ int sum = s->dsp.pix_sum(pix, s->linesize);
- sum= (sum+8)>>4;
- varc = (pix_norm1(pix, s->linesize) - sum*sum + 500 + 128)>>8;
+ varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
s->mb_var [s->mb_width * mb_y + mb_x] = varc;
- s->mb_mean[s->mb_width * mb_y + mb_x] = (sum+7)>>4;
+ s->mb_mean[s->mb_width * mb_y + mb_x] = (sum+128)>>8;
s->mb_var_sum += varc;
}
}
}
}
+ emms_c();
+
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);
@@ -3001,7 +3026,7 @@ static int dct_quantize_c(MpegEncContext *s,
int bias;
int max=0;
unsigned int threshold1, threshold2;
-
+
s->fdct (block);
if (s->mb_intra) {
diff --git a/src/libffmpeg/libavcodec/mpegvideo.h b/src/libffmpeg/libavcodec/mpegvideo.h
index d50d1ad0e..9b344ee7a 100644
--- a/src/libffmpeg/libavcodec/mpegvideo.h
+++ b/src/libffmpeg/libavcodec/mpegvideo.h
@@ -103,8 +103,21 @@ typedef struct ScanTable{
const UINT8 *scantable;
UINT8 permutated[64];
UINT8 raster_end[64];
+#ifdef ARCH_POWERPC
+ /* Used by dct_quantise_alitvec to find last-non-zero */
+ UINT8 __align8 inverse[64];
+#endif
} ScanTable;
+typedef struct ParseContext{
+ UINT8 *buffer;
+ int index;
+ int last_index;
+ int buffer_size;
+ int state;
+ int frame_start_found;
+} ParseContext;
+
typedef struct MpegEncContext {
struct AVCodecContext *avctx;
/* the following parameters must be initialized before encoding */
@@ -187,7 +200,10 @@ typedef struct MpegEncContext {
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 */
- INT8 *qscale_table; /* used to store qscale for partitioned decoding (& postprocessing FIXME export) */
+ INT8 *qscale_table; /* used to store qscale */
+ INT8 *aux_qscale_table;
+ INT8 *next_qscale_table;
+ INT8 *last_qscale_table; //FIXME move these into some picture struct (MpegEncContext.aux.qscale_table[])
UINT8 *edge_emu_buffer;
int input_qscale; /* qscale prior to reordering of frames */
@@ -205,6 +221,7 @@ typedef struct MpegEncContext {
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) */
@@ -284,8 +301,8 @@ typedef struct MpegEncContext {
int min_qcoeff; /* minimum encodable coefficient */
int max_qcoeff; /* maximum encodable coefficient */
/* precomputed matrix (combine qscale and DCT renorm) */
- int q_intra_matrix[32][64];
- int q_inter_matrix[32][64];
+ 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];
@@ -293,7 +310,7 @@ typedef struct MpegEncContext {
UINT16 __align8 q_inter_matrix16_bias[32][64];
int block_last_index[6]; /* last non zero coefficient in block */
/* scantables */
- ScanTable intra_scantable;
+ 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
@@ -344,6 +361,8 @@ typedef struct MpegEncContext {
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;
/* H.263 specific */
int gob_number;
@@ -532,6 +551,9 @@ void MPV_common_init_mlib(MpegEncContext *s);
#ifdef HAVE_MMI
void MPV_common_init_mmi(MpegEncContext *s);
#endif
+#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);
diff --git a/src/libffmpeg/libavcodec/msmpeg4.c b/src/libffmpeg/libavcodec/msmpeg4.c
index 81dc91fbb..f1746b4f6 100644
--- a/src/libffmpeg/libavcodec/msmpeg4.c
+++ b/src/libffmpeg/libavcodec/msmpeg4.c
@@ -425,7 +425,7 @@ 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, 11, MIN(s->bit_rate/1024, 2047));
+ put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
if(s->msmpeg4_version<3)
s->flipflop_rounding=0;
diff --git a/src/libffmpeg/libavcodec/ppc/Makefile.am b/src/libffmpeg/libavcodec/ppc/Makefile.am
index 8ffd8121c..d791fe4a8 100644
--- a/src/libffmpeg/libavcodec/ppc/Makefile.am
+++ b/src/libffmpeg/libavcodec/ppc/Makefile.am
@@ -12,7 +12,11 @@ LIBTOOL = $(SHELL) $(top_builddir)/libtool-nofpic
noinst_LTLIBRARIES = libavcodec_ppc.la
-libavcodec_ppc_src = dsputil_altivec.c dsputil_ppc.c
+libavcodec_ppc_src = dsputil_altivec.c \
+ dsputil_ppc.c \
+ idct_altivec.c \
+ mpegvideo_altivec.c \
+ mpegvideo_ppc.c
libavcodec_ppc_dummy = libavcodec_ppc_dummy.c
EXTRA_DIST = $(libavcodec_ppc_src) $(libavcodec_ppc_dummy)
diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c
index 18d9d27a4..8a50ccb90 100644
--- a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c
+++ b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.c
@@ -1,15 +1,29 @@
+/*
+ * Copyright (c) 2002 Brian Foley
+ * Copyright (c) 2002 Dieter Shirley
+ *
+ * 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"
#if CONFIG_DARWIN
#include <sys/sysctl.h>
#endif
-int pix_abs16x16_altivec(uint8_t *pix1, uint8_t *pix2, int line_size);
-int pix_abs8x8_altivec(uint8_t *pix1, uint8_t *pix2, int line_size);
-int pix_sum_altivec(UINT8 * pix, int line_size);
-
-int has_altivec(void);
-
int pix_abs16x16_altivec(uint8_t *pix1, uint8_t *pix2, int line_size)
{
int i, s;
@@ -127,6 +141,105 @@ int pix_sum_altivec(UINT8 * pix, int line_size)
return s;
}
+void get_pixels_altivec(DCTELEM *restrict block, const UINT8 *pixels, int line_size)
+{
+ int i;
+ vector unsigned char perm, bytes, *pixv;
+ vector unsigned char zero = (vector unsigned char) (0);
+ vector signed short shorts;
+
+ for(i=0;i<8;i++)
+ {
+ // Read potentially unaligned pixels.
+ // We're reading 16 pixels, and actually only want 8,
+ // but we simply ignore the extras.
+ perm = vec_lvsl(0, pixels);
+ pixv = (vector unsigned char *) pixels;
+ bytes = vec_perm(pixv[0], pixv[1], perm);
+
+ // convert the bytes into shorts
+ shorts = (vector signed short)vec_mergeh(zero, bytes);
+
+ // save the data to the block, we assume the block is 16-byte aligned
+ vec_st(shorts, i*16, (vector signed short*)block);
+
+ pixels += line_size;
+ }
+}
+
+void diff_pixels_altivec(DCTELEM *restrict block, const UINT8 *s1,
+ const UINT8 *s2, int stride)
+{
+ int i;
+ vector unsigned char perm, bytes, *pixv;
+ vector unsigned char zero = (vector unsigned char) (0);
+ vector signed short shorts1, shorts2;
+
+ for(i=0;i<4;i++)
+ {
+ // Read potentially unaligned pixels
+ // We're reading 16 pixels, and actually only want 8,
+ // but we simply ignore the extras.
+ perm = vec_lvsl(0, s1);
+ pixv = (vector unsigned char *) s1;
+ bytes = vec_perm(pixv[0], pixv[1], perm);
+
+ // convert the bytes into shorts
+ shorts1 = (vector signed short)vec_mergeh(zero, bytes);
+
+ // Do the same for the second block of pixels
+ perm = vec_lvsl(0, s2);
+ pixv = (vector unsigned char *) s2;
+ bytes = vec_perm(pixv[0], pixv[1], perm);
+
+ // convert the bytes into shorts
+ shorts2 = (vector signed short)vec_mergeh(zero, bytes);
+
+ // Do the subtraction
+ shorts1 = vec_sub(shorts1, shorts2);
+
+ // save the data to the block, we assume the block is 16-byte aligned
+ vec_st(shorts1, 0, (vector signed short*)block);
+
+ s1 += stride;
+ s2 += stride;
+ block += 8;
+
+
+ // The code below is a copy of the code above... This is a manual
+ // unroll.
+
+ // Read potentially unaligned pixels
+ // We're reading 16 pixels, and actually only want 8,
+ // but we simply ignore the extras.
+ perm = vec_lvsl(0, s1);
+ pixv = (vector unsigned char *) s1;
+ bytes = vec_perm(pixv[0], pixv[1], perm);
+
+ // convert the bytes into shorts
+ shorts1 = (vector signed short)vec_mergeh(zero, bytes);
+
+ // Do the same for the second block of pixels
+ perm = vec_lvsl(0, s2);
+ pixv = (vector unsigned char *) s2;
+ bytes = vec_perm(pixv[0], pixv[1], perm);
+
+ // convert the bytes into shorts
+ shorts2 = (vector signed short)vec_mergeh(zero, bytes);
+
+ // Do the subtraction
+ shorts1 = vec_sub(shorts1, shorts2);
+
+ // save the data to the block, we assume the block is 16-byte aligned
+ vec_st(shorts1, 0, (vector signed short*)block);
+
+ s1 += stride;
+ s2 += stride;
+ block += 8;
+ }
+}
+
+
int has_altivec(void)
{
#if CONFIG_DARWIN
@@ -141,3 +254,4 @@ int has_altivec(void)
#endif
return 0;
}
+
diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h
index 42c373e76..bdf8f5ffe 100644
--- a/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h
+++ b/src/libffmpeg/libavcodec/ppc/dsputil_altivec.h
@@ -1,5 +1,26 @@
+/*
+ * Copyright (c) 2002 Brian Foley
+ * Copyright (c) 2002 Dieter Shirley
+ *
+ * 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
+ */
+
extern int pix_abs16x16_altivec(uint8_t *pix1, uint8_t *pix2, int line_size);
extern int pix_abs8x8_altivec(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 has_altivec(void);
diff --git a/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c b/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c
index d9c8ba86e..4be3abb28 100644
--- a/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c
+++ b/src/libffmpeg/libavcodec/ppc/dsputil_ppc.c
@@ -1,19 +1,47 @@
+/*
+ * Copyright (c) 2002 Brian Foley
+ * Copyright (c) 2002 Dieter Shirley
+ *
+ * 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"
#ifdef HAVE_ALTIVEC
#include "dsputil_altivec.h"
#endif
-void dsputil_init_ppc(void)
+void dsputil_init_ppc(DSPContext* c, unsigned mask)
{
+ // Common optimisations whether Altivec or not
+
+ // ... pending ...
+
#if HAVE_ALTIVEC
if (has_altivec()) {
- pix_abs16x16 = pix_abs16x16_altivec;
- pix_abs8x8 = pix_abs8x8_altivec;
- pix_sum = pix_sum_altivec;
+ // Altivec specific optimisations
+ c->pix_abs16x16 = pix_abs16x16_altivec;
+ c->pix_abs8x8 = pix_abs8x8_altivec;
+ c->pix_sum = pix_sum_altivec;
+ c->diff_pixels = diff_pixels_altivec;
+ c->get_pixels = get_pixels_altivec;
} else
#endif
{
- /* Non-AltiVec PPC optimisations here */
+ // Non-AltiVec PPC optimisations
+
+ // ... pending ...
}
}
diff --git a/src/libffmpeg/libavcodec/ppc/idct_altivec.c b/src/libffmpeg/libavcodec/ppc/idct_altivec.c
new file mode 100644
index 000000000..8036d403f
--- /dev/null
+++ b/src/libffmpeg/libavcodec/ppc/idct_altivec.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2001 Michel Lespinasse
+ *
+ * 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
+ *
+ */
+
+/*
+ * NOTE: This code is based on GPL code from the libmpeg2 project. The
+ * author, Michel Lespinasses, has given explicit permission to release
+ * under LGPL as part of ffmpeg.
+ *
+ */
+
+/*
+ * FFMpeg integration by Dieter Shirley
+ *
+ * This file is a direct copy of the altivec idct module from the libmpeg2
+ * project. I've deleted all of the libmpeg2 specific code, renamed the functions and
+ * re-ordered the function parameters. The only change to the IDCT function
+ * itself was to factor out the partial transposition, and to perform a full
+ * transpose at the end of the function.
+ */
+
+
+#include <stdlib.h> /* malloc(), free() */
+#include <string.h>
+#include "../dsputil.h"
+
+#define vector_s16_t vector signed short
+#define vector_u16_t vector unsigned short
+#define vector_s8_t vector signed char
+#define vector_u8_t vector unsigned char
+#define vector_s32_t vector signed int
+#define vector_u32_t vector unsigned int
+
+#define IDCT_HALF \
+ /* 1st stage */ \
+ t1 = vec_mradds (a1, vx7, vx1 ); \
+ t8 = vec_mradds (a1, vx1, vec_subs (zero, vx7)); \
+ t7 = vec_mradds (a2, vx5, vx3); \
+ t3 = vec_mradds (ma2, vx3, vx5); \
+ \
+ /* 2nd stage */ \
+ t5 = vec_adds (vx0, vx4); \
+ t0 = vec_subs (vx0, vx4); \
+ t2 = vec_mradds (a0, vx6, vx2); \
+ t4 = vec_mradds (a0, vx2, vec_subs (zero, vx6)); \
+ t6 = vec_adds (t8, t3); \
+ t3 = vec_subs (t8, t3); \
+ t8 = vec_subs (t1, t7); \
+ t1 = vec_adds (t1, t7); \
+ \
+ /* 3rd stage */ \
+ t7 = vec_adds (t5, t2); \
+ t2 = vec_subs (t5, t2); \
+ t5 = vec_adds (t0, t4); \
+ t0 = vec_subs (t0, t4); \
+ t4 = vec_subs (t8, t3); \
+ t3 = vec_adds (t8, t3); \
+ \
+ /* 4th stage */ \
+ vy0 = vec_adds (t7, t1); \
+ vy7 = vec_subs (t7, t1); \
+ vy1 = vec_mradds (c4, t3, t5); \
+ vy6 = vec_mradds (mc4, t3, t5); \
+ vy2 = vec_mradds (c4, t4, t0); \
+ vy5 = vec_mradds (mc4, t4, t0); \
+ vy3 = vec_adds (t2, t6); \
+ vy4 = vec_subs (t2, t6);
+
+
+#define IDCT \
+ vector_s16_t vx0, vx1, vx2, vx3, vx4, vx5, vx6, vx7; \
+ vector_s16_t vy0, vy1, vy2, vy3, vy4, vy5, vy6, vy7; \
+ vector_s16_t a0, a1, a2, ma2, c4, mc4, zero, bias; \
+ vector_s16_t t0, t1, t2, t3, t4, t5, t6, t7, t8; \
+ vector_u16_t shift; \
+ \
+ c4 = vec_splat (constants[0], 0); \
+ a0 = vec_splat (constants[0], 1); \
+ a1 = vec_splat (constants[0], 2); \
+ a2 = vec_splat (constants[0], 3); \
+ mc4 = vec_splat (constants[0], 4); \
+ ma2 = vec_splat (constants[0], 5); \
+ bias = (vector_s16_t)vec_splat ((vector_s32_t)constants[0], 3); \
+ \
+ zero = vec_splat_s16 (0); \
+ shift = vec_splat_u16 (4); \
+ \
+ vx0 = vec_mradds (vec_sl (block[0], shift), constants[1], zero); \
+ vx1 = vec_mradds (vec_sl (block[1], shift), constants[2], zero); \
+ vx2 = vec_mradds (vec_sl (block[2], shift), constants[3], zero); \
+ vx3 = vec_mradds (vec_sl (block[3], shift), constants[4], zero); \
+ vx4 = vec_mradds (vec_sl (block[4], shift), constants[1], zero); \
+ vx5 = vec_mradds (vec_sl (block[5], shift), constants[4], zero); \
+ vx6 = vec_mradds (vec_sl (block[6], shift), constants[3], zero); \
+ vx7 = vec_mradds (vec_sl (block[7], shift), constants[2], zero); \
+ \
+ IDCT_HALF \
+ \
+ vx0 = vec_mergeh (vy0, vy4); \
+ vx1 = vec_mergel (vy0, vy4); \
+ vx2 = vec_mergeh (vy1, vy5); \
+ vx3 = vec_mergel (vy1, vy5); \
+ vx4 = vec_mergeh (vy2, vy6); \
+ vx5 = vec_mergel (vy2, vy6); \
+ vx6 = vec_mergeh (vy3, vy7); \
+ vx7 = vec_mergel (vy3, vy7); \
+ \
+ vy0 = vec_mergeh (vx0, vx4); \
+ vy1 = vec_mergel (vx0, vx4); \
+ vy2 = vec_mergeh (vx1, vx5); \
+ vy3 = vec_mergel (vx1, vx5); \
+ vy4 = vec_mergeh (vx2, vx6); \
+ vy5 = vec_mergel (vx2, vx6); \
+ vy6 = vec_mergeh (vx3, vx7); \
+ vy7 = vec_mergel (vx3, vx7); \
+ \
+ vx0 = vec_adds (vec_mergeh (vy0, vy4), bias); \
+ vx1 = vec_mergel (vy0, vy4); \
+ vx2 = vec_mergeh (vy1, vy5); \
+ vx3 = vec_mergel (vy1, vy5); \
+ vx4 = vec_mergeh (vy2, vy6); \
+ vx5 = vec_mergel (vy2, vy6); \
+ vx6 = vec_mergeh (vy3, vy7); \
+ vx7 = vec_mergel (vy3, vy7); \
+ \
+ IDCT_HALF \
+ \
+ shift = vec_splat_u16 (6); \
+ vx0 = vec_sra (vy0, shift); \
+ vx1 = vec_sra (vy1, shift); \
+ vx2 = vec_sra (vy2, shift); \
+ vx3 = vec_sra (vy3, shift); \
+ vx4 = vec_sra (vy4, shift); \
+ vx5 = vec_sra (vy5, shift); \
+ vx6 = vec_sra (vy6, shift); \
+ vx7 = vec_sra (vy7, shift);
+
+static const vector_s16_t constants[5] = {
+ (vector_s16_t)(23170, 13573, 6518, 21895, -23170, -21895, 32, 31),
+ (vector_s16_t)(16384, 22725, 21407, 19266, 16384, 19266, 21407, 22725),
+ (vector_s16_t)(22725, 31521, 29692, 26722, 22725, 26722, 29692, 31521),
+ (vector_s16_t)(21407, 29692, 27969, 25172, 21407, 25172, 27969, 29692),
+ (vector_s16_t)(19266, 26722, 25172, 22654, 19266, 22654, 25172, 26722)
+};
+
+void idct_put_altivec(uint8_t* dest, int stride, vector_s16_t* block)
+{
+ vector_u8_t tmp;
+
+ IDCT
+
+#define COPY(dest,src) \
+ tmp = vec_packsu (src, src); \
+ vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest); \
+ vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
+
+ COPY (dest, vx0) dest += stride;
+ COPY (dest, vx1) dest += stride;
+ COPY (dest, vx2) dest += stride;
+ COPY (dest, vx3) dest += stride;
+ COPY (dest, vx4) dest += stride;
+ COPY (dest, vx5) dest += stride;
+ COPY (dest, vx6) dest += stride;
+ COPY (dest, vx7)
+}
+
+void idct_add_altivec(uint8_t* dest, int stride, vector_s16_t* block)
+{
+ vector_u8_t tmp;
+ vector_s16_t tmp2, tmp3;
+ vector_u8_t perm0;
+ vector_u8_t perm1;
+ vector_u8_t p0, p1, p;
+
+ IDCT
+
+ p0 = vec_lvsl (0, dest);
+ p1 = vec_lvsl (stride, dest);
+ p = vec_splat_u8 (-1);
+ perm0 = vec_mergeh (p, p0);
+ perm1 = vec_mergeh (p, p1);
+
+#define ADD(dest,src,perm) \
+ /* *(uint64_t *)&tmp = *(uint64_t *)dest; */ \
+ tmp = vec_ld (0, dest); \
+ tmp2 = (vector_s16_t)vec_perm (tmp, (vector_u8_t)zero, perm); \
+ tmp3 = vec_adds (tmp2, src); \
+ tmp = vec_packsu (tmp3, tmp3); \
+ vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest); \
+ vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
+
+ ADD (dest, vx0, perm0) dest += stride;
+ ADD (dest, vx1, perm1) dest += stride;
+ ADD (dest, vx2, perm0) dest += stride;
+ ADD (dest, vx3, perm1) dest += stride;
+ ADD (dest, vx4, perm0) dest += stride;
+ ADD (dest, vx5, perm1) dest += stride;
+ ADD (dest, vx6, perm0) dest += stride;
+ ADD (dest, vx7, perm1)
+}
+
diff --git a/src/libffmpeg/libavcodec/ppc/mpegvideo_altivec.c b/src/libffmpeg/libavcodec/ppc/mpegvideo_altivec.c
new file mode 100644
index 000000000..bcbc1e6ba
--- /dev/null
+++ b/src/libffmpeg/libavcodec/ppc/mpegvideo_altivec.c
@@ -0,0 +1,509 @@
+/*
+ * Copyright (c) 2002 Dieter Shirley
+ *
+ * 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 <stdlib.h>
+#include <stdio.h>
+#include "../dsputil.h"
+#include "../mpegvideo.h"
+
+
+// Used when initializing constant vectors
+#define FOUR_INSTANCES(x) x,x,x,x
+
+// Swaps two variables (used for altivec registers)
+#define SWAP(a,b) \
+do { \
+ __typeof__(a) swap_temp=a; \
+ a=b; \
+ b=swap_temp; \
+} while (0)
+
+// transposes a matrix consisting of four vectors with four elements each
+#define TRANSPOSE4(a,b,c,d) \
+do { \
+ __typeof__(a) _trans_ach = vec_mergeh(a, c); \
+ __typeof__(a) _trans_acl = vec_mergel(a, c); \
+ __typeof__(a) _trans_bdh = vec_mergeh(b, d); \
+ __typeof__(a) _trans_bdl = vec_mergel(b, d); \
+ \
+ a = vec_mergeh(_trans_ach, _trans_bdh); \
+ b = vec_mergel(_trans_ach, _trans_bdh); \
+ c = vec_mergeh(_trans_acl, _trans_bdl); \
+ d = vec_mergel(_trans_acl, _trans_bdl); \
+} while (0)
+
+#define TRANSPOSE8(a,b,c,d,e,f,g,h) \
+do { \
+ __typeof__(a) _A1, _B1, _C1, _D1, _E1, _F1, _G1, _H1; \
+ __typeof__(a) _A2, _B2, _C2, _D2, _E2, _F2, _G2, _H2; \
+ \
+ _A1 = vec_mergeh (a, e); \
+ _B1 = vec_mergel (a, e); \
+ _C1 = vec_mergeh (b, f); \
+ _D1 = vec_mergel (b, f); \
+ _E1 = vec_mergeh (c, g); \
+ _F1 = vec_mergel (c, g); \
+ _G1 = vec_mergeh (d, h); \
+ _H1 = vec_mergel (d, h); \
+ \
+ _A2 = vec_mergeh (_A1, _E1); \
+ _B2 = vec_mergel (_A1, _E1); \
+ _C2 = vec_mergeh (_B1, _F1); \
+ _D2 = vec_mergel (_B1, _F1); \
+ _E2 = vec_mergeh (_C1, _G1); \
+ _F2 = vec_mergel (_C1, _G1); \
+ _G2 = vec_mergeh (_D1, _H1); \
+ _H2 = vec_mergel (_D1, _H1); \
+ \
+ a = vec_mergeh (_A2, _E2); \
+ b = vec_mergel (_A2, _E2); \
+ c = vec_mergeh (_B2, _F2); \
+ d = vec_mergel (_B2, _F2); \
+ e = vec_mergeh (_C2, _G2); \
+ f = vec_mergel (_C2, _G2); \
+ g = vec_mergeh (_D2, _H2); \
+ h = vec_mergel (_D2, _H2); \
+} while (0)
+
+
+// Loads a four-byte value (int or float) from the target address
+// into every element in the target vector. Only works if the
+// target address is four-byte aligned (which should be always).
+#define LOAD4(vec, address) \
+{ \
+ __typeof__(vec)* _load_addr = (__typeof__(vec)*)(address); \
+ vector unsigned char _perm_vec = vec_lvsl(0,(address)); \
+ vec = vec_ld(0, _load_addr); \
+ vec = vec_perm(vec, vec, _perm_vec); \
+ vec = vec_splat(vec, 0); \
+}
+
+int dct_quantize_altivec(MpegEncContext* s,
+ DCTELEM* data, int n,
+ int qscale, int* overflow)
+{
+ int lastNonZero;
+ vector float row0, row1, row2, row3, row4, row5, row6, row7;
+ vector float alt0, alt1, alt2, alt3, alt4, alt5, alt6, alt7;
+ const vector float zero = {FOUR_INSTANCES(0.0f)};
+
+ // Load the data into the row/alt vectors
+ {
+ vector signed short data0, data1, data2, data3, data4, data5, data6, data7;
+
+ data0 = vec_ld(0, data);
+ data1 = vec_ld(16, data);
+ data2 = vec_ld(32, data);
+ data3 = vec_ld(48, data);
+ data4 = vec_ld(64, data);
+ data5 = vec_ld(80, data);
+ data6 = vec_ld(96, data);
+ data7 = vec_ld(112, data);
+
+ // Transpose the data before we start
+ TRANSPOSE8(data0, data1, data2, data3, data4, data5, data6, data7);
+
+ // load the data into floating point vectors. We load
+ // the high half of each row into the main row vectors
+ // and the low half into the alt vectors.
+ row0 = vec_ctf(vec_unpackh(data0), 0);
+ alt0 = vec_ctf(vec_unpackl(data0), 0);
+ row1 = vec_ctf(vec_unpackh(data1), 0);
+ alt1 = vec_ctf(vec_unpackl(data1), 0);
+ row2 = vec_ctf(vec_unpackh(data2), 0);
+ alt2 = vec_ctf(vec_unpackl(data2), 0);
+ row3 = vec_ctf(vec_unpackh(data3), 0);
+ alt3 = vec_ctf(vec_unpackl(data3), 0);
+ row4 = vec_ctf(vec_unpackh(data4), 0);
+ alt4 = vec_ctf(vec_unpackl(data4), 0);
+ row5 = vec_ctf(vec_unpackh(data5), 0);
+ alt5 = vec_ctf(vec_unpackl(data5), 0);
+ row6 = vec_ctf(vec_unpackh(data6), 0);
+ alt6 = vec_ctf(vec_unpackl(data6), 0);
+ row7 = vec_ctf(vec_unpackh(data7), 0);
+ alt7 = vec_ctf(vec_unpackl(data7), 0);
+ }
+
+ // The following block could exist as a separate an altivec dct
+ // function. However, if we put it inline, the DCT data can remain
+ // in the vector local variables, as floats, which we'll use during the
+ // quantize step...
+ {
+ const vector float vec_0_298631336 = {FOUR_INSTANCES(0.298631336f)};
+ const vector float vec_0_390180644 = {FOUR_INSTANCES(-0.390180644f)};
+ const vector float vec_0_541196100 = {FOUR_INSTANCES(0.541196100f)};
+ const vector float vec_0_765366865 = {FOUR_INSTANCES(0.765366865f)};
+ const vector float vec_0_899976223 = {FOUR_INSTANCES(-0.899976223f)};
+ const vector float vec_1_175875602 = {FOUR_INSTANCES(1.175875602f)};
+ const vector float vec_1_501321110 = {FOUR_INSTANCES(1.501321110f)};
+ const vector float vec_1_847759065 = {FOUR_INSTANCES(-1.847759065f)};
+ const vector float vec_1_961570560 = {FOUR_INSTANCES(-1.961570560f)};
+ const vector float vec_2_053119869 = {FOUR_INSTANCES(2.053119869f)};
+ const vector float vec_2_562915447 = {FOUR_INSTANCES(-2.562915447f)};
+ const vector float vec_3_072711026 = {FOUR_INSTANCES(3.072711026f)};
+
+
+ int whichPass, whichHalf;
+
+ for(whichPass = 1; whichPass<=2; whichPass++)
+ {
+ for(whichHalf = 1; whichHalf<=2; whichHalf++)
+ {
+ vector float tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+ vector float tmp10, tmp11, tmp12, tmp13;
+ vector float z1, z2, z3, z4, z5;
+
+ tmp0 = vec_add(row0, row7); // tmp0 = dataptr[0] + dataptr[7];
+ tmp7 = vec_sub(row0, row7); // tmp7 = dataptr[0] - dataptr[7];
+ tmp3 = vec_add(row3, row4); // tmp3 = dataptr[3] + dataptr[4];
+ tmp4 = vec_sub(row3, row4); // tmp4 = dataptr[3] - dataptr[4];
+ tmp1 = vec_add(row1, row6); // tmp1 = dataptr[1] + dataptr[6];
+ tmp6 = vec_sub(row1, row6); // tmp6 = dataptr[1] - dataptr[6];
+ tmp2 = vec_add(row2, row5); // tmp2 = dataptr[2] + dataptr[5];
+ tmp5 = vec_sub(row2, row5); // tmp5 = dataptr[2] - dataptr[5];
+
+ tmp10 = vec_add(tmp0, tmp3); // tmp10 = tmp0 + tmp3;
+ tmp13 = vec_sub(tmp0, tmp3); // tmp13 = tmp0 - tmp3;
+ tmp11 = vec_add(tmp1, tmp2); // tmp11 = tmp1 + tmp2;
+ tmp12 = vec_sub(tmp1, tmp2); // tmp12 = tmp1 - tmp2;
+
+
+ // dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
+ row0 = vec_add(tmp10, tmp11);
+
+ // dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
+ row4 = vec_sub(tmp10, tmp11);
+
+
+ // z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = vec_madd(vec_add(tmp12, tmp13), vec_0_541196100, (vector float)zero);
+
+ // dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
+ // CONST_BITS-PASS1_BITS);
+ row2 = vec_madd(tmp13, vec_0_765366865, z1);
+
+ // dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
+ // CONST_BITS-PASS1_BITS);
+ row6 = vec_madd(tmp12, vec_1_847759065, z1);
+
+ z1 = vec_add(tmp4, tmp7); // z1 = tmp4 + tmp7;
+ z2 = vec_add(tmp5, tmp6); // z2 = tmp5 + tmp6;
+ z3 = vec_add(tmp4, tmp6); // z3 = tmp4 + tmp6;
+ z4 = vec_add(tmp5, tmp7); // z4 = tmp5 + tmp7;
+
+ // z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+ z5 = vec_madd(vec_add(z3, z4), vec_1_175875602, (vector float)zero);
+
+ // z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z3 = vec_madd(z3, vec_1_961570560, z5);
+
+ // z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z4 = vec_madd(z4, vec_0_390180644, z5);
+
+ // The following adds are rolled into the multiplies above
+ // z3 = vec_add(z3, z5); // z3 += z5;
+ // z4 = vec_add(z4, z5); // z4 += z5;
+
+ // z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ // Wow! It's actually more effecient to roll this multiply
+ // into the adds below, even thought the multiply gets done twice!
+ // z2 = vec_madd(z2, vec_2_562915447, (vector float)zero);
+
+ // z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ // Same with this one...
+ // z1 = vec_madd(z1, vec_0_899976223, (vector float)zero);
+
+ // tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ // dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
+ row7 = vec_madd(tmp4, vec_0_298631336, vec_madd(z1, vec_0_899976223, z3));
+
+ // tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ // dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
+ row5 = vec_madd(tmp5, vec_2_053119869, vec_madd(z2, vec_2_562915447, z4));
+
+ // tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ // dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
+ row3 = vec_madd(tmp6, vec_3_072711026, vec_madd(z2, vec_2_562915447, z3));
+
+ // tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ // dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
+ row1 = vec_madd(z1, vec_0_899976223, vec_madd(tmp7, vec_1_501321110, z4));
+
+ // Swap the row values with the alts. If this is the first half,
+ // this sets up the low values to be acted on in the second half.
+ // If this is the second half, it puts the high values back in
+ // the row values where they are expected to be when we're done.
+ SWAP(row0, alt0);
+ SWAP(row1, alt1);
+ SWAP(row2, alt2);
+ SWAP(row3, alt3);
+ SWAP(row4, alt4);
+ SWAP(row5, alt5);
+ SWAP(row6, alt6);
+ SWAP(row7, alt7);
+ }
+
+ if (whichPass == 1)
+ {
+ // transpose the data for the second pass
+
+ // First, block transpose the upper right with lower left.
+ SWAP(row4, alt0);
+ SWAP(row5, alt1);
+ SWAP(row6, alt2);
+ SWAP(row7, alt3);
+
+ // Now, transpose each block of four
+ TRANSPOSE4(row0, row1, row2, row3);
+ TRANSPOSE4(row4, row5, row6, row7);
+ TRANSPOSE4(alt0, alt1, alt2, alt3);
+ TRANSPOSE4(alt4, alt5, alt6, alt7);
+ }
+ }
+ }
+
+ // used after quantise step
+ int oldBaseValue = 0;
+
+ // perform the quantise step, using the floating point data
+ // still in the row/alt registers
+ {
+ const int* biasAddr;
+ const vector signed int* qmat;
+ vector float bias, negBias;
+
+ if (s->mb_intra)
+ {
+ vector signed int baseVector;
+
+ // We must cache element 0 in the intra case
+ // (it needs special handling).
+ baseVector = vec_cts(vec_splat(row0, 0), 0);
+ vec_ste(baseVector, 0, &oldBaseValue);
+
+ qmat = (vector signed int*)s->q_intra_matrix[qscale];
+ biasAddr = &(s->intra_quant_bias);
+ }
+ else
+ {
+ qmat = (vector signed int*)s->q_inter_matrix[qscale];
+ biasAddr = &(s->inter_quant_bias);
+ }
+
+ // Load the bias vector (We add 0.5 to the bias so that we're
+ // rounding when we convert to int, instead of flooring.)
+ {
+ vector signed int biasInt;
+ const vector float negOneFloat = (vector float)(FOUR_INSTANCES(-1.0f));
+ LOAD4(biasInt, biasAddr);
+ bias = vec_ctf(biasInt, QUANT_BIAS_SHIFT);
+ negBias = vec_madd(bias, negOneFloat, zero);
+ }
+
+ {
+ vector float q0, q1, q2, q3, q4, q5, q6, q7;
+
+ q0 = vec_ctf(qmat[0], QMAT_SHIFT);
+ q1 = vec_ctf(qmat[2], QMAT_SHIFT);
+ q2 = vec_ctf(qmat[4], QMAT_SHIFT);
+ q3 = vec_ctf(qmat[6], QMAT_SHIFT);
+ q4 = vec_ctf(qmat[8], QMAT_SHIFT);
+ q5 = vec_ctf(qmat[10], QMAT_SHIFT);
+ q6 = vec_ctf(qmat[12], QMAT_SHIFT);
+ q7 = vec_ctf(qmat[14], QMAT_SHIFT);
+
+ row0 = vec_sel(vec_madd(row0, q0, negBias), vec_madd(row0, q0, bias),
+ vec_cmpgt(row0, zero));
+ row1 = vec_sel(vec_madd(row1, q1, negBias), vec_madd(row1, q1, bias),
+ vec_cmpgt(row1, zero));
+ row2 = vec_sel(vec_madd(row2, q2, negBias), vec_madd(row2, q2, bias),
+ vec_cmpgt(row2, zero));
+ row3 = vec_sel(vec_madd(row3, q3, negBias), vec_madd(row3, q3, bias),
+ vec_cmpgt(row3, zero));
+ row4 = vec_sel(vec_madd(row4, q4, negBias), vec_madd(row4, q4, bias),
+ vec_cmpgt(row4, zero));
+ row5 = vec_sel(vec_madd(row5, q5, negBias), vec_madd(row5, q5, bias),
+ vec_cmpgt(row5, zero));
+ row6 = vec_sel(vec_madd(row6, q6, negBias), vec_madd(row6, q6, bias),
+ vec_cmpgt(row6, zero));
+ row7 = vec_sel(vec_madd(row7, q7, negBias), vec_madd(row7, q7, bias),
+ vec_cmpgt(row7, zero));
+
+ q0 = vec_ctf(qmat[1], QMAT_SHIFT);
+ q1 = vec_ctf(qmat[3], QMAT_SHIFT);
+ q2 = vec_ctf(qmat[5], QMAT_SHIFT);
+ q3 = vec_ctf(qmat[7], QMAT_SHIFT);
+ q4 = vec_ctf(qmat[9], QMAT_SHIFT);
+ q5 = vec_ctf(qmat[11], QMAT_SHIFT);
+ q6 = vec_ctf(qmat[13], QMAT_SHIFT);
+ q7 = vec_ctf(qmat[15], QMAT_SHIFT);
+
+ alt0 = vec_sel(vec_madd(alt0, q0, negBias), vec_madd(alt0, q0, bias),
+ vec_cmpgt(alt0, zero));
+ alt1 = vec_sel(vec_madd(alt1, q1, negBias), vec_madd(alt1, q1, bias),
+ vec_cmpgt(alt1, zero));
+ alt2 = vec_sel(vec_madd(alt2, q2, negBias), vec_madd(alt2, q2, bias),
+ vec_cmpgt(alt2, zero));
+ alt3 = vec_sel(vec_madd(alt3, q3, negBias), vec_madd(alt3, q3, bias),
+ vec_cmpgt(alt3, zero));
+ alt4 = vec_sel(vec_madd(alt4, q4, negBias), vec_madd(alt4, q4, bias),
+ vec_cmpgt(alt4, zero));
+ alt5 = vec_sel(vec_madd(alt5, q5, negBias), vec_madd(alt5, q5, bias),
+ vec_cmpgt(alt5, zero));
+ alt6 = vec_sel(vec_madd(alt6, q6, negBias), vec_madd(alt6, q6, bias),
+ vec_cmpgt(alt6, zero));
+ alt7 = vec_sel(vec_madd(alt7, q7, negBias), vec_madd(alt7, q7, bias),
+ vec_cmpgt(alt7, zero));
+ }
+
+
+ }
+
+ // Store the data back into the original block
+ {
+ vector signed short data0, data1, data2, data3, data4, data5, data6, data7;
+
+ data0 = vec_pack(vec_cts(row0, 0), vec_cts(alt0, 0));
+ data1 = vec_pack(vec_cts(row1, 0), vec_cts(alt1, 0));
+ data2 = vec_pack(vec_cts(row2, 0), vec_cts(alt2, 0));
+ data3 = vec_pack(vec_cts(row3, 0), vec_cts(alt3, 0));
+ data4 = vec_pack(vec_cts(row4, 0), vec_cts(alt4, 0));
+ data5 = vec_pack(vec_cts(row5, 0), vec_cts(alt5, 0));
+ data6 = vec_pack(vec_cts(row6, 0), vec_cts(alt6, 0));
+ data7 = vec_pack(vec_cts(row7, 0), vec_cts(alt7, 0));
+
+ {
+ // Clamp for overflow
+ vector signed int max_q_int, min_q_int;
+ vector signed short max_q, min_q;
+
+ LOAD4(max_q_int, &(s->max_qcoeff));
+ LOAD4(min_q_int, &(s->min_qcoeff));
+
+ max_q = vec_pack(max_q_int, max_q_int);
+ min_q = vec_pack(min_q_int, min_q_int);
+
+ data0 = vec_max(vec_min(data0, max_q), min_q);
+ data1 = vec_max(vec_min(data1, max_q), min_q);
+ data2 = vec_max(vec_min(data2, max_q), min_q);
+ data4 = vec_max(vec_min(data4, max_q), min_q);
+ data5 = vec_max(vec_min(data5, max_q), min_q);
+ data6 = vec_max(vec_min(data6, max_q), min_q);
+ data7 = vec_max(vec_min(data7, max_q), min_q);
+ }
+
+ vector bool char zero_01, zero_23, zero_45, zero_67;
+ vector signed char scanIndices_01, scanIndices_23, scanIndices_45, scanIndices_67;
+ vector signed char negOne = vec_splat_s8(-1);
+ vector signed char* scanPtr =
+ (vector signed char*)(s->intra_scantable.inverse);
+
+ // Determine the largest non-zero index.
+ zero_01 = vec_pack(vec_cmpeq(data0, (vector short)zero),
+ vec_cmpeq(data1, (vector short)zero));
+ zero_23 = vec_pack(vec_cmpeq(data2, (vector short)zero),
+ vec_cmpeq(data3, (vector short)zero));
+ zero_45 = vec_pack(vec_cmpeq(data4, (vector short)zero),
+ vec_cmpeq(data5, (vector short)zero));
+ zero_67 = vec_pack(vec_cmpeq(data6, (vector short)zero),
+ vec_cmpeq(data7, (vector short)zero));
+
+ // 64 biggest values
+ scanIndices_01 = vec_sel(scanPtr[0], negOne, zero_01);
+ scanIndices_23 = vec_sel(scanPtr[1], negOne, zero_23);
+ scanIndices_45 = vec_sel(scanPtr[2], negOne, zero_45);
+ scanIndices_67 = vec_sel(scanPtr[3], negOne, zero_67);
+
+ // 32 largest values
+ scanIndices_01 = vec_max(scanIndices_01, scanIndices_23);
+ scanIndices_45 = vec_max(scanIndices_45, scanIndices_67);
+
+ // 16 largest values
+ scanIndices_01 = vec_max(scanIndices_01, scanIndices_45);
+
+ // 8 largest values
+ scanIndices_01 = vec_max(vec_mergeh(scanIndices_01, negOne),
+ vec_mergel(scanIndices_01, negOne));
+
+ // 4 largest values
+ scanIndices_01 = vec_max(vec_mergeh(scanIndices_01, negOne),
+ vec_mergel(scanIndices_01, negOne));
+
+ // 2 largest values
+ scanIndices_01 = vec_max(vec_mergeh(scanIndices_01, negOne),
+ vec_mergel(scanIndices_01, negOne));
+
+ // largest value
+ scanIndices_01 = vec_max(vec_mergeh(scanIndices_01, negOne),
+ vec_mergel(scanIndices_01, negOne));
+
+ scanIndices_01 = vec_splat(scanIndices_01, 0);
+
+ signed char lastNonZeroChar;
+
+ vec_ste(scanIndices_01, 0, &lastNonZeroChar);
+
+ lastNonZero = lastNonZeroChar;
+
+ // While the data is still in vectors we check for the transpose IDCT permute
+ // 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))
+ {
+ TRANSPOSE8(data0, data1, data2, data3, data4, data5, data6, data7);
+ }
+
+ vec_st(data0, 0, data);
+ vec_st(data1, 16, data);
+ vec_st(data2, 32, data);
+ vec_st(data3, 48, data);
+ vec_st(data4, 64, data);
+ vec_st(data5, 80, data);
+ vec_st(data6, 96, data);
+ vec_st(data7, 112, data);
+ }
+
+ // special handling of block[0]
+ if (s->mb_intra)
+ {
+ if (!s->h263_aic)
+ {
+ if (n < 4)
+ oldBaseValue /= s->y_dc_scale;
+ else
+ oldBaseValue /= s->c_dc_scale;
+ }
+
+ // Divide by 8, rounding the result
+ data[0] = (oldBaseValue + 4) >> 3;
+ }
+
+ // 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))
+ {
+ ff_block_permute(data, s->idct_permutation,
+ s->intra_scantable.scantable, lastNonZero);
+ }
+
+ return lastNonZero;
+}
+
diff --git a/src/libffmpeg/libavcodec/ppc/mpegvideo_ppc.c b/src/libffmpeg/libavcodec/ppc/mpegvideo_ppc.c
new file mode 100644
index 000000000..18888c8f4
--- /dev/null
+++ b/src/libffmpeg/libavcodec/ppc/mpegvideo_ppc.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2002 Dieter Shirley
+ *
+ * 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 <time.h>
+#include "../../config.h"
+#include "../dsputil.h"
+#include "../mpegvideo.h"
+
+#ifdef HAVE_ALTIVEC
+#include "dsputil_altivec.h"
+#endif
+
+extern int dct_quantize_altivec(MpegEncContext *s,
+ DCTELEM *block, int n,
+ int qscale, int *overflow);
+
+extern void idct_put_altivec(UINT8 *dest, int line_size, INT16 *block);
+extern void idct_add_altivec(UINT8 *dest, int line_size, INT16 *block);
+
+
+void MPV_common_init_ppc(MpegEncContext *s)
+{
+#if HAVE_ALTIVEC
+ if (has_altivec())
+ {
+ 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->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
+ }
+
+ // Test to make sure that the dct required alignments are met.
+ if ((((long)(s->q_intra_matrix) & 0x0f) != 0) ||
+ (((long)(s->q_inter_matrix) & 0x0f) != 0))
+ {
+ fprintf(stderr, "Internal Error: q-matrix blocks must be 16-byte aligned "
+ "to use Altivec DCT. Reverting to non-altivec version.\n");
+ return;
+ }
+
+ if (((long)(s->intra_scantable.inverse) & 0x0f) != 0)
+ {
+ fprintf(stderr, "Internal Error: scan table blocks must be 16-byte aligned "
+ "to use Altivec DCT. Reverting to non-altivec version.\n");
+ return;
+ }
+
+
+ if ((s->avctx->dct_algo == FF_DCT_AUTO) ||
+ (s->avctx->dct_algo == FF_DCT_ALTIVEC))
+ {
+ s->dct_quantize = dct_quantize_altivec;
+ }
+ } else
+#endif
+ {
+ /* Non-AltiVec PPC optimisations here */
+ }
+}
+
diff --git a/src/libffmpeg/libavcodec/ratecontrol.c b/src/libffmpeg/libavcodec/ratecontrol.c
index 99e46dbad..870cd21e3 100644
--- a/src/libffmpeg/libavcodec/ratecontrol.c
+++ b/src/libffmpeg/libavcodec/ratecontrol.c
@@ -405,7 +405,7 @@ static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q,
else if(d<0.0001) d=0.0001;
q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
- q= MIN(q, bits2qp(rce, MAX((min_rate - buffer_size + rcc->buffer_index)*2, 1)));
+ q= FFMIN(q, bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index)*2, 1)));
}
if(max_rate){
@@ -414,7 +414,7 @@ static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q,
else if(d<0.0001) d=0.0001;
q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
- q= MAX(q, bits2qp(rce, MAX(rcc->buffer_index/2, 1)));
+ q= FFMAX(q, bits2qp(rce, FFMAX(rcc->buffer_index/2, 1)));
}
}
//printf("q:%f max:%f min:%f size:%f index:%d bits:%f agr:%f\n", q,max_rate, min_rate, buffer_size, rcc->buffer_index, bits, s->avctx->rc_buffer_aggressivity);
diff --git a/src/libffmpeg/libavcodec/rv10.c b/src/libffmpeg/libavcodec/rv10.c
index 5932126c8..02da93a6c 100644
--- a/src/libffmpeg/libavcodec/rv10.c
+++ b/src/libffmpeg/libavcodec/rv10.c
@@ -447,7 +447,7 @@ static int rv10_decode_packet(AVCodecContext *avctx,
printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
#endif
- clear_blocks(s->block[0]);
+ s->dsp.clear_blocks(s->block[0]);
s->mv_dir = MV_DIR_FORWARD;
s->mv_type = MV_TYPE_16X16;
if (ff_h263_decode_mb(s, s->block) == SLICE_ERROR) {
diff --git a/src/libffmpeg/libavcodec/svq1.c b/src/libffmpeg/libavcodec/svq1.c
index d1df89bd8..e5e760238 100644
--- a/src/libffmpeg/libavcodec/svq1.c
+++ b/src/libffmpeg/libavcodec/svq1.c
@@ -804,7 +804,7 @@ static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int
}
}
-static int svq1_motion_inter_block (bit_buffer_t *bitbuf,
+static int svq1_motion_inter_block (MpegEncContext *s, bit_buffer_t *bitbuf,
uint8_t *current, uint8_t *previous, int pitch,
svq1_pmv_t *motion, int x, int y) {
uint8_t *src;
@@ -839,12 +839,12 @@ static int svq1_motion_inter_block (bit_buffer_t *bitbuf,
src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
dst = current;
- put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
+ s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
return 0;
}
-static int svq1_motion_inter_4v_block (bit_buffer_t *bitbuf,
+static int svq1_motion_inter_4v_block (MpegEncContext *s, bit_buffer_t *bitbuf,
uint8_t *current, uint8_t *previous, int pitch,
svq1_pmv_t *motion,int x, int y) {
uint8_t *src;
@@ -906,7 +906,7 @@ static int svq1_motion_inter_4v_block (bit_buffer_t *bitbuf,
src = &previous[(x + (pmv[i]->x >> 1)) + (y + (pmv[i]->y >> 1))*pitch];
dst = current;
- put_pixels_tab[1][((pmv[i]->y & 1) << 1) | (pmv[i]->x & 1)](dst,src,pitch,8);
+ s->dsp.put_pixels_tab[1][((pmv[i]->y & 1) << 1) | (pmv[i]->x & 1)](dst,src,pitch,8);
/* select next block */
if (i & 1) {
@@ -921,7 +921,7 @@ static int svq1_motion_inter_4v_block (bit_buffer_t *bitbuf,
return 0;
}
-static int svq1_decode_delta_block (bit_buffer_t *bitbuf,
+static int svq1_decode_delta_block (MpegEncContext *s, bit_buffer_t *bitbuf,
uint8_t *current, uint8_t *previous, int pitch,
svq1_pmv_t *motion, int x, int y) {
uint32_t bit_cache;
@@ -951,7 +951,7 @@ static int svq1_decode_delta_block (bit_buffer_t *bitbuf,
break;
case SVQ1_BLOCK_INTER:
- result = svq1_motion_inter_block (bitbuf, current, previous, pitch, motion, x, y);
+ result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
if (result != 0)
{
@@ -964,7 +964,7 @@ static int svq1_decode_delta_block (bit_buffer_t *bitbuf,
break;
case SVQ1_BLOCK_INTER_4V:
- result = svq1_motion_inter_4v_block (bitbuf, current, previous, pitch, motion, x, y);
+ result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
if (result != 0)
{
@@ -1142,8 +1142,8 @@ static int svq1_decode_frame(AVCodecContext *avctx,
for (y=0; y < height; y+=16) {
for (x=0; x < width; x+=16) {
- result = svq1_decode_delta_block (&s->gb, &current[x], previous,
- linesize, pmv, x, y);
+ result = svq1_decode_delta_block (s, &s->gb, &current[x], previous,
+ linesize, pmv, x, y);
if (result != 0)
{
#ifdef DEBUG_SVQ1
diff --git a/src/libffmpeg/libavcodec/svq1_cb.h b/src/libffmpeg/libavcodec/svq1_cb.h
index e91b62551..fa1eb3b1f 100644
--- a/src/libffmpeg/libavcodec/svq1_cb.h
+++ b/src/libffmpeg/libavcodec/svq1_cb.h
@@ -23,7 +23,7 @@
*/
/* 6x16-entry codebook for inter-coded 4x2 vectors */
-static int8_t svq1_inter_codebook_4x2[768] = {
+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,
19, 17, 9, 3,-14,-16,-12, -8,-18,-16, -8, -3, 11, 14, 12, 8,
7,-16,-10, 20, 7,-17,-10, 20, -6, 18, 8,-21, -7, 18, 9,-20,
@@ -75,7 +75,7 @@ static int8_t svq1_inter_codebook_4x2[768] = {
};
/* 6x16-entry codebook for inter-coded 4x4 vectors */
-static int8_t svq1_inter_codebook_4x4[1536] = {
+static const int8_t svq1_inter_codebook_4x4[1536] = {
4, 0, -6, -7, -4, -8,-13, -9, -8, -8, -1, 6, -2, 5, 22, 27,
-16, -7, 11, 10,-18, -7, 13, 10,-15, -4, 12, 8, -9, -1, 9, 5,
-2, 2, 15,-16, -3, 2, 19,-19, -3, 2, 19,-19, -2, 3, 15,-14,
@@ -175,7 +175,7 @@ static int8_t svq1_inter_codebook_4x4[1536] = {
};
/* 6x16-entry codebook for inter-coded 8x4 vectors */
-static int8_t svq1_inter_codebook_8x4[3072] = {
+static const int8_t svq1_inter_codebook_8x4[3072] = {
9, 8, 4, 0, -3, -4, -4, -3, 9, 8, 4, -1, -4, -5, -5, -3,
8, 7, 3, -2, -5, -5, -5, -4, 6, 4, 1, -2, -4, -5, -4, -3,
-12,-14,-11, -4, 1, 5, 6, 6, -8,-10, -7, -5, -2, 1, 1, 1,
@@ -371,7 +371,7 @@ static int8_t svq1_inter_codebook_8x4[3072] = {
};
/* 6x16-entry codebook for inter-coded 8x8 vectors */
-static int8_t svq1_inter_codebook_8x8[6144] = {
+static const int8_t svq1_inter_codebook_8x8[6144] = {
-4, -3, 4, 5, 2, 1, 1, 0, -5, -3, 5, 5, 2, 1, 0, 0,
-6, -4, 5, 5, 2, 1, 0, 0, -7, -4, 4, 5, 2, 1, 0, 0,
-8, -5, 3, 4, 2, 1, 0, 0, -8, -6, 3, 4, 1, 1, 1, 0,
@@ -759,13 +759,13 @@ static int8_t svq1_inter_codebook_8x8[6144] = {
};
/* list of codebooks for inter-coded vectors */
-static uint8_t *svq1_inter_codebooks[4] = {
- svq1_inter_codebook_4x2, svq1_inter_codebook_4x4,
- svq1_inter_codebook_8x4, svq1_inter_codebook_8x8
+static const uint8_t* const svq1_inter_codebooks[4] = {
+ svq1_inter_codebook_4x2, svq1_inter_codebook_4x4,
+ svq1_inter_codebook_8x4, svq1_inter_codebook_8x8
};
/* 6x16-entry codebook for intra-coded 4x2 vectors */
-static int8_t svq1_intra_codebook_4x2[768] = {
+static const int8_t svq1_intra_codebook_4x2[768] = {
12, 13, 13, 11, -7,-10,-15,-17,-16,-15,-12,-10, 11, 15, 15, 12,
2, 17, 20, 15,-45,-24, 2, 13, 21, 20, -6,-36, 12, 16, -1,-27,
-18,-21, 10, 45,-11,-20, -7, 21, 43, -8,-28, 0, 33,-16,-28, 3,
@@ -817,7 +817,7 @@ static int8_t svq1_intra_codebook_4x2[768] = {
};
/* 6x16-entry codebook for intra-coded 4x4 vectors */
-static int8_t svq1_intra_codebook_4x4[1536] = {
+static const int8_t svq1_intra_codebook_4x4[1536] = {
-11, -3, 3, 6,-10, -1, 5, 7, -9, -1, 6, 7, -9, -1, 4, 6,
5, 7, 0,-14, 6, 9, 2,-15, 6, 9, 2,-15, 4, 6, 0,-14,
16, 3, -5, -6, 16, 1, -8, -8, 14, -1, -9, -9, 12, 0, -8, -8,
@@ -917,7 +917,7 @@ static int8_t svq1_intra_codebook_4x4[1536] = {
};
/* 6x16-entry codebook for intra-coded 8x4 vectors */
-static int8_t svq1_intra_codebook_8x4[3072] = {
+static const int8_t svq1_intra_codebook_8x4[3072] = {
5, 6, 6, 6, 7, 7, 8, 8, 0, 0, 0, 0, 0, 1, 2, 3,
-3, -4, -4, -5, -5, -4, -3, -2, -4, -4, -4, -5, -4, -4, -3, -3,
1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 4, 4, 5, 5, 5,
@@ -1113,7 +1113,7 @@ static int8_t svq1_intra_codebook_8x4[3072] = {
};
/* 6x16-entry codebook for intra-coded 8x8 vectors */
-static int8_t svq1_intra_codebook_8x8[6144] = {
+static const int8_t svq1_intra_codebook_8x8[6144] = {
4, 4, 3, 2, 2, 1, 0, -1, 4, 3, 3, 2, 1, 0, -1, -1,
3, 3, 2, 2, 1, 0, -1, -2, 3, 2, 2, 1, 0, -1, -2, -3,
2, 2, 1, 0, -1, -1, -2, -3, 2, 1, 0, 0, -1, -2, -3, -4,
@@ -1501,7 +1501,7 @@ static int8_t svq1_intra_codebook_8x8[6144] = {
};
/* list of codebooks for intra-coded vectors */
-static uint8_t *svq1_intra_codebooks[4] = {
- svq1_intra_codebook_4x2, svq1_intra_codebook_4x4,
- svq1_intra_codebook_8x4, svq1_intra_codebook_8x8
+static const uint8_t* const svq1_intra_codebooks[4] = {
+ svq1_intra_codebook_4x2, svq1_intra_codebook_4x4,
+ svq1_intra_codebook_8x4, svq1_intra_codebook_8x8
};
diff --git a/src/libffmpeg/libavcodec/utils.c b/src/libffmpeg/libavcodec/utils.c
index fcd65364b..77e4e750d 100644
--- a/src/libffmpeg/libavcodec/utils.c
+++ b/src/libffmpeg/libavcodec/utils.c
@@ -120,6 +120,9 @@ int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size,
int ret;
ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict);
+
+ emms_c(); //needed to avoid a emms_c() call before every return;
+
avctx->frame_number++;
return ret;
}
@@ -135,6 +138,9 @@ int avcodec_decode_video(AVCodecContext *avctx, AVPicture *picture,
ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
buf, buf_size);
+
+ emms_c(); //needed to avoid a emms_c() call before every return;
+
if (*got_picture_ptr)
avctx->frame_number++;
return ret;
@@ -464,7 +470,7 @@ void avcodec_init(void)
return;
inited = 1;
- dsputil_init();
+ //dsputil_init();
}
/* this should be called after seeking and before trying to decode the next frame */
diff --git a/src/libffmpeg/libavcodec/wmadec.c b/src/libffmpeg/libavcodec/wmadec.c
index 0eef66c6b..7505a9be3 100644
--- a/src/libffmpeg/libavcodec/wmadec.c
+++ b/src/libffmpeg/libavcodec/wmadec.c
@@ -122,7 +122,7 @@ static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len);
#include "wmadata.h"
#ifdef DEBUG_TRACE
-
+#include <stdarg.h>
int frame_count;
static FILE *flog;
@@ -245,7 +245,7 @@ static int wma_decode_init(AVCodecContext * avctx)
s->bit_rate = avctx->bit_rate;
s->block_align = avctx->block_align;
- if (avctx->codec_id == CODEC_ID_WMAV1) {
+ if (avctx->codec->id == CODEC_ID_WMAV1) {
s->version = 1;
} else {
s->version = 2;
@@ -270,14 +270,22 @@ static int wma_decode_init(AVCodecContext * avctx)
/* compute MDCT block size */
if (s->sample_rate <= 16000) {
s->frame_len_bits = 9;
- } else if (s->sample_rate <= 32000 && s->version == 1) {
+ } else if (s->sample_rate <= 22050 ||
+ (s->sample_rate <= 32000 && s->version == 1)) {
s->frame_len_bits = 10;
} else {
s->frame_len_bits = 11;
}
s->frame_len = 1 << s->frame_len_bits;
if (s->use_variable_block_len) {
- s->nb_block_sizes = s->frame_len_bits - BLOCK_MIN_BITS + 1;
+ int nb_max, nb;
+ nb = ((flags2 >> 3) & 3) + 1;
+ if ((s->bit_rate / s->nb_channels) >= 32000)
+ nb += 2;
+ nb_max = s->frame_len_bits - BLOCK_MIN_BITS;
+ if (nb > nb_max)
+ nb = nb_max;
+ s->nb_block_sizes = nb + 1;
} else {
s->nb_block_sizes = 1;
}
@@ -352,8 +360,8 @@ static int wma_decode_init(AVCodecContext * avctx)
s->block_align);
printf("bps=%f bps1=%f high_freq=%f bitoffset=%d\n",
bps, bps1, high_freq, s->byte_offset_bits);
- printf("use_noise_coding=%d use_exp_vlc=%d\n",
- s->use_noise_coding, s->use_exp_vlc);
+ printf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n",
+ s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes);
#endif
/* compute the scale factor band sizes for each MDCT block size */
@@ -472,7 +480,7 @@ static int wma_decode_init(AVCodecContext * avctx)
/* init MDCT */
for(i = 0; i < s->nb_block_sizes; i++)
- mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1);
+ ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1);
/* init MDCT windows : simple sinus window */
for(i = 0; i < s->nb_block_sizes; i++) {
@@ -1116,8 +1124,8 @@ static int wma_decode_block(WMADecodeContext *s)
n = s->block_len;
n4 = s->block_len / 2;
- imdct_calc(&s->mdct_ctx[bsize],
- output, s->coefs[ch], s->mdct_tmp);
+ ff_imdct_calc(&s->mdct_ctx[bsize],
+ output, s->coefs[ch], s->mdct_tmp);
/* XXX: optimize all that by build the window and
multipying/adding at the same time */
@@ -1183,7 +1191,7 @@ static int wma_decode_frame(WMADecodeContext *s, int16_t *samples)
iptr = s->frame_out[ch];
for(i=0;i<n;i++) {
- a = lrint(*iptr++);
+ a = lrintf(*iptr++);
if (a > 32767)
a = 32767;
else if (a < -32768)
@@ -1274,7 +1282,7 @@ static int wma_decode_superframe(AVCodecContext *avctx,
s->last_bitoffset = pos & 7;
pos >>= 3;
len = buf_size - pos;
- if (len > MAX_CODED_SUPERFRAME_SIZE) {
+ if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) {
return -1;
}
s->last_superframe_len = len;
@@ -1295,7 +1303,7 @@ static int wma_decode_end(AVCodecContext *avctx)
int i;
for(i = 0; i < s->nb_block_sizes; i++)
- mdct_end(&s->mdct_ctx[i]);
+ ff_mdct_end(&s->mdct_ctx[i]);
for(i = 0; i < s->nb_block_sizes; i++)
av_free(s->windows[i]);
diff --git a/src/libffmpeg/xine_decoder.c b/src/libffmpeg/xine_decoder.c
index 76728a2d1..54aa7bd1b 100644
--- a/src/libffmpeg/xine_decoder.c
+++ b/src/libffmpeg/xine_decoder.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine_decoder.c,v 1.63 2002/10/31 17:02:42 mroi Exp $
+ * $Id: xine_decoder.c,v 1.64 2002/11/11 13:45:34 miguelfreitas Exp $
*
* xine decoder plugin using ffmpeg
*
@@ -107,6 +107,9 @@ typedef struct ff_audio_decoder_s {
} ff_audio_decoder_t;
+static pthread_once_t once_control = PTHREAD_ONCE_INIT;
+
+
#define VIDEOBUFSIZE 128*1024
#define AUDIOBUFSIZE VIDEOBUFSIZE
@@ -336,7 +339,7 @@ static void ff_decode_data (video_decoder_t *this_gen, buf_element_t *buf) {
= strdup ("ms mpeg-4 v2 (ffmpeg)");
break;
case BUF_VIDEO_MSMPEG4_V3:
- codec = avcodec_find_decoder (CODEC_ID_MSMPEG4);
+ codec = avcodec_find_decoder (CODEC_ID_MSMPEG4V3);
this->stream->meta_info[XINE_META_INFO_VIDEOCODEC]
= strdup ("ms mpeg-4 v3 (ffmpeg)");
break;
@@ -731,7 +734,6 @@ static void init_once_routine(void) {
static void *init_video_plugin (xine_t *xine, void *data) {
ff_video_class_t *this;
- static pthread_once_t once_control = PTHREAD_ONCE_INIT;
this = (ff_video_class_t *) malloc (sizeof (ff_video_class_t));
@@ -749,6 +751,7 @@ static void *init_video_plugin (xine_t *xine, void *data) {
return this;
}
+void avcodec_get_context_defaults(AVCodecContext *s);
static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) {
@@ -788,17 +791,29 @@ static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
}
memset(&this->context, 0, sizeof(this->context));
+ avcodec_get_context_defaults(&this->context);
this->context.sample_rate = this->audio_sample_rate = buf->decoder_info[1];
this->audio_bits = buf->decoder_info[2];
this->context.channels = this->audio_channels = buf->decoder_info[3];
this->context.block_align = audio_header->nBlockAlign;
+ this->context.bit_rate = audio_header->nAvgBytesPerSec * 8;
+ this->context.codec_id = codec->id;
+ if( audio_header->cbSize > 0 ) {
+printf ("extra data size = %d\n", audio_header->cbSize);
+ this->context.extradata = malloc(audio_header->cbSize);
+ this->context.extradata_size = audio_header->cbSize;
+ memcpy( this->context.extradata,
+ (uint8_t *)audio_header + sizeof(xine_waveformatex),
+ audio_header->cbSize );
+ }
+
this->buf = xine_xmalloc(AUDIOBUFSIZE);
this->bufsize = AUDIOBUFSIZE;
this->size = 0;
printf ("decode buffer (before) = %p\n", this->decode_buffer);
- this->decode_buffer = xine_xmalloc(50000);
+ this->decode_buffer = xine_xmalloc(100000);
printf ("decode buffer (after) = %p\n", this->decode_buffer);
if (avcodec_open (&this->context, codec) < 0) {
@@ -811,6 +826,9 @@ printf ("decode buffer (after) = %p\n", this->decode_buffer);
return;
} else if (this->decoder_ok) {
+printf("buf->content = [%x %x %x %x]\n",
+*((char *)buf->content+0),*((char *)buf->content+1),*((char *)buf->content+2),*((char *)buf->content+3));
+
if (!this->output_open) {
this->output_open = this->stream->audio_out->open(this->stream->audio_out,
this->audio_bits, this->audio_sample_rate,
@@ -924,6 +942,9 @@ static void ff_audio_dispose (audio_decoder_t *this_gen) {
free(this->buf);
free(this->decode_buffer);
+ if(this->context.extradata)
+ free(this->context.extradata);
+
free (this_gen);
}
@@ -970,6 +991,8 @@ static void *init_audio_plugin (xine_t *xine, void *data) {
this->decoder_class.get_description = ff_audio_get_description;
this->decoder_class.dispose = ff_audio_dispose_class;
+ pthread_once( &once_control, init_once_routine );
+
return this;
}
@@ -1015,6 +1038,6 @@ static decoder_info_t dec_info_ffmpeg_audio = {
plugin_info_t xine_plugin_info[] = {
/* type, API, "name", version, special_info, init_function */
{ PLUGIN_VIDEO_DECODER, 11, "ffmpegvideo", XINE_VERSION_CODE, &dec_info_ffmpeg_video, init_video_plugin },
-/* { PLUGIN_AUDIO_DECODER, 10, "ffmpegaudio", XINE_VERSION_CODE, &dec_info_ffmpeg_audio, init_audio_plugin },*/
+ { PLUGIN_AUDIO_DECODER, 10, "ffmpegaudio", XINE_VERSION_CODE, &dec_info_ffmpeg_audio, init_audio_plugin },
{ PLUGIN_NONE, 0, "", 0, NULL, NULL }
};
diff --git a/src/xine-utils/xineutils.h b/src/xine-utils/xineutils.h
index b008928b8..fce1b31a8 100644
--- a/src/xine-utils/xineutils.h
+++ b/src/xine-utils/xineutils.h
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xineutils.h,v 1.26 2002/11/01 01:14:06 miguelfreitas Exp $
+ * $Id: xineutils.h,v 1.27 2002/11/11 13:45:37 miguelfreitas Exp $
*
*/
#ifndef XINEUTILS_H
@@ -103,7 +103,7 @@ typedef union {
#define mmx_i2r(op,imm,reg) \
__asm__ __volatile__ (#op " %0, %%" #reg \
: /* nothing */ \
- : "X" (imm) )
+ : "i" (imm) )
#define mmx_m2r(op,mem,reg) \
__asm__ __volatile__ (#op " %0, %%" #reg \
@@ -112,7 +112,7 @@ typedef union {
#define mmx_r2m(op,reg,mem) \
__asm__ __volatile__ (#op " %%" #reg ", %0" \
- : "=X" (mem) \
+ : "=m" (mem) \
: /* nothing */ )
#define mmx_r2r(op,regs,regd) \