aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Uoti Urpala <uau@glyph.nonexistent.invalid>2011-02-01 20:10:27 +0200
committerGravatar Uoti Urpala <uau@glyph.nonexistent.invalid>2011-02-01 20:10:27 +0200
commit7cd7416c7316ce28cfa663b1f1d578b9c768a6ba (patch)
tree9ac07232011a1488a0f502835f6aba41631a71c2
parent156ba34ac7b6099f867a66295fbfe650db63e598 (diff)
libmpeg2: drop libmpeg2 support
libavcodec mpeg2 decoder has been the default for a while and seems to work fine.
-rw-r--r--Copyright13
-rw-r--r--Makefile21
-rwxr-xr-xconfigure50
-rw-r--r--etc/codecs.conf39
-rw-r--r--libmpcodecs/vd.c4
-rw-r--r--libmpcodecs/vd_libmpeg2.c314
-rw-r--r--libmpeg2/alloc.c70
-rw-r--r--libmpeg2/alpha_asm.h181
-rw-r--r--libmpeg2/attributes.h42
-rw-r--r--libmpeg2/cpu_accel.c283
-rw-r--r--libmpeg2/cpu_state.c129
-rw-r--r--libmpeg2/decode.c452
-rw-r--r--libmpeg2/header.c972
-rw-r--r--libmpeg2/idct.c299
-rw-r--r--libmpeg2/idct_alpha.c377
-rw-r--r--libmpeg2/idct_altivec.c286
-rw-r--r--libmpeg2/idct_mmx.c1305
-rw-r--r--libmpeg2/libmpeg2_changes.diff439
-rw-r--r--libmpeg2/mmx.h292
-rw-r--r--libmpeg2/motion_comp.c145
-rw-r--r--libmpeg2/motion_comp_alpha.c253
-rw-r--r--libmpeg2/motion_comp_altivec.c1010
-rw-r--r--libmpeg2/motion_comp_arm.c185
-rw-r--r--libmpeg2/motion_comp_arm_s.S323
-rw-r--r--libmpeg2/motion_comp_mmx.c1013
-rw-r--r--libmpeg2/motion_comp_vis.c2061
-rw-r--r--libmpeg2/mpeg2.h208
-rw-r--r--libmpeg2/mpeg2_internal.h329
-rw-r--r--libmpeg2/slice.c2101
-rw-r--r--libmpeg2/vis.h333
-rw-r--r--libmpeg2/vlc.h434
31 files changed, 0 insertions, 13963 deletions
diff --git a/Copyright b/Copyright
index 0191e43dc9..e33f4e77a3 100644
--- a/Copyright
+++ b/Copyright
@@ -28,19 +28,6 @@ Copyright: 1998-2008 VideoLAN
License: GNU General Public License
-Name: libmpeg2
-Version: 0.5.1 + patches
-URL: http://libmpeg2.sourceforge.net/
-Directory: libmpeg2
-Copyright: 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- 2000-2004 Michel Lespinasse <walken@zoy.org>
- 2002-2003 Falk Hueffner <falk@debian.org>
- 2003 David S. Miller <davem@redhat.com>
- 2003 Regis Duchesne <hpreg@zoy.org>
- 2003 Peter Gubanov <peter@elecard.net.ru>
-License: GNU General Public License
-
-
Name: mpg123
Version: 0.59s + significant changes
URL: http://www.mpg123.de/
diff --git a/Makefile b/Makefile
index 18d86fd87f..b39f75ac9a 100644
--- a/Makefile
+++ b/Makefile
@@ -109,26 +109,6 @@ SRCS_COMMON-$(LIBDVDCSS_INTERNAL) += libdvdcss/css.c \
SRCS_COMMON-$(LIBMAD) += libmpcodecs/ad_libmad.c
-SRCS_LIBMPEG2-$(ARCH_ALPHA) += libmpeg2/idct_alpha.c \
- libmpeg2/motion_comp_alpha.c
-SRCS_LIBMPEG2-$(ARCH_ARM) += libmpeg2/motion_comp_arm.c \
- libmpeg2/motion_comp_arm_s.S
-SRCS_LIBMPEG2-$(HAVE_ALTIVEC) += libmpeg2/idct_altivec.c \
- libmpeg2/motion_comp_altivec.c
-SRCS_LIBMPEG2-$(HAVE_MMX) += libmpeg2/idct_mmx.c \
- libmpeg2/motion_comp_mmx.c
-SRCS_LIBMPEG2-$(HAVE_VIS) += libmpeg2/motion_comp_vis.c
-SRCS_COMMON-$(LIBMPEG2) += libmpcodecs/vd_libmpeg2.c \
- libmpeg2/alloc.c \
- libmpeg2/cpu_accel.c\
- libmpeg2/cpu_state.c \
- libmpeg2/decode.c \
- libmpeg2/header.c \
- libmpeg2/idct.c \
- libmpeg2/motion_comp.c \
- libmpeg2/slice.c \
- $(SRCS_LIBMPEG2-yes)
-
SRCS_COMMON-$(LIBNEMESI) += libmpdemux/demux_nemesi.c \
stream/stream_nemesi.c
SRCS_COMMON-$(LIBNUT) += libmpdemux/demux_nut.c
@@ -609,7 +589,6 @@ DIRS = . \
libmpcodecs \
libmpcodecs/native \
libmpdemux \
- libmpeg2 \
libvo \
loader \
loader/dshow \
diff --git a/configure b/configure
index f5ca0ee846..c51ed2fe3d 100755
--- a/configure
+++ b/configure
@@ -382,7 +382,6 @@ Codecs:
--enable-libdca enable libdca support [autodetect]
--disable-mp3lib disable builtin mp3lib [autodetect]
--disable-liba52 disable liba52 [autodetect]
- --disable-libmpeg2 disable builtin libmpeg2 [autodetect]
--disable-musepack disable musepack support [autodetect]
Video output:
@@ -621,7 +620,6 @@ _mpg123=auto
_mp3lib=auto
_liba52=auto
_libdca=auto
-_libmpeg2=auto
_faad=auto
_ladspa=auto
_libbs2b=auto
@@ -987,8 +985,6 @@ for ac_option do
--disable-liba52) _liba52=no ;;
--enable-libdca) _libdca=yes ;;
--disable-libdca) _libdca=no ;;
- --enable-libmpeg2) _libmpeg2=yes ;;
- --disable-libmpeg2) _libmpeg2=no ;;
--enable-musepack) _musepack=yes ;;
--disable-musepack) _musepack=no ;;
--enable-faad) _faad=yes ;;
@@ -3096,23 +3092,6 @@ if test "$_inttypes" = no ; then
fi
-echocheck "int_fastXY_t in inttypes.h"
-_fast_inttypes=no
-statement_check "inttypes.h" 'volatile int_fast16_t v = 0' && _fast_inttypes=yes
-if test "$_fast_inttypes" = no ; then
- def_fast_inttypes='
- typedef signed char int_fast8_t;
- typedef signed int int_fast16_t;
- typedef signed int int_fast32_t;
- typedef signed long long int_fast64_t;
- typedef unsigned char uint_fast8_t;
- typedef unsigned int uint_fast16_t;
- typedef unsigned int uint_fast32_t;
- typedef unsigned long long uint_fast64_t;'
-fi
-echores "$_fast_inttypes"
-
-
echocheck "malloc.h"
_malloc=no
header_check malloc.h && _malloc=yes
@@ -5864,27 +5843,6 @@ else
fi
echores "$_liba52"
-echocheck "internal libmpeg2 support"
-if test "$_libmpeg2" = auto ; then
- _libmpeg2=yes
- if alpha && test cc_vendor=gnu; then
- case $cc_version in
- 2*|3.0*|3.1*) # cannot compile MVI instructions
- _libmpeg2=no
- res_comment="broken gcc"
- ;;
- esac
- fi
-fi
-if test "$_libmpeg2" = yes ; then
- def_libmpeg2='#define CONFIG_LIBMPEG2 1'
- codecmodules="libmpeg2(internal) $codecmodules"
-else
- def_libmpeg2='#undef CONFIG_LIBMPEG2'
- nocodecmodules="libmpeg2(internal) $nocodecmodules"
-fi
-echores "$_libmpeg2"
-
echocheck "libdca support"
if test "$_libdca" = auto ; then
_libdca=no
@@ -6938,7 +6896,6 @@ LIBLZO = $_liblzo
LIBMAD = $_mad
LIBMENU = $_menu
LIBMENU_DVBIN = $_menu_dvbin
-LIBMPEG2 = $_libmpeg2
LIBNEMESI = $_nemesi
LIBNUT = $_libnut
LIBSMBCLIENT = $_smb
@@ -7072,10 +7029,6 @@ cat > $TMPH << EOF
#undef FAST_OSD
#undef FAST_OSD_TABLE
-/* Define this to enable MPEG-1/2 image postprocessing in libmpeg2 */
-#define MPEG12_POSTPROC 1
-#define ATTRIBUTE_ALIGNED_MAX 16
-
#define CONFIGURATION "$configuration"
@@ -7089,8 +7042,6 @@ $def_translation
/* definitions needed by included libraries */
#define HAVE_INTTYPES_H 1
-/* libmpeg2 + FFmpeg */
-$def_fast_inttypes
/* libdvdcss */
#define HAVE_ERRNO_H 1
/* libdvdcss + libdvdread */
@@ -7219,7 +7170,6 @@ $def_liba52
$def_libdca
$def_libdv
$def_liblzo
-$def_libmpeg2
$def_mad
$def_mp3lib
$def_mpg123
diff --git a/etc/codecs.conf b/etc/codecs.conf
index f80d717043..be54e79035 100644
--- a/etc/codecs.conf
+++ b/etc/codecs.conf
@@ -255,45 +255,6 @@ videocodec ffmpeg12
out YV12,I420,IYUV
out 422P,444P
-videocodec mpeg12
- info "MPEG-1 or 2 (libmpeg2)"
- comment "with postprocessing"
- status working
- format 0x10000001 ; MPEG-1
- format 0x10000002 ; MPEG-2
- fourcc "DVR "
- fourcc hdv2
- fourcc mpg1
- fourcc PIM1 ; Pinnacle hardware-MPEG-1
- fourcc PIM2 ; Pinnacle hardware-MPEG-2
- fourcc mpg2,MPG2
- fourcc MPEG
- fourcc hdv1
- fourcc hdv3 ; HDV 1080i50
- fourcc hdv5 ; HDV 720p25
- fourcc mx5p ; MPEG IMX 625/50 (50 Mb/s)
- fourcc MMES,mmes ; matrox mpeg2 in avi
- fourcc M701 ; matrox mpeg2 intra-only
- fourcc hdv6,hdv7,hdv8
- fourcc xdv1,xdv2,xdv3
- fourcc xdv4,xdv5,xdv6
- fourcc xdv7,xdv8,xdv9
- fourcc xdva,xdvb,xdvc
- fourcc xdvd,xdve,xdvf
- fourcc xd5a,xd5b,xd5c
- fourcc xd5d,xd5e,xd5f
- fourcc xd59,xd54
- fourcc mx5n,mx4n,mx4p
- fourcc mx3n,mx3p
- fourcc AVmp
- fourcc mp2v,mpgv
- fourcc m2v1,m1v1
- fourcc LMP2 ; Lead mpeg2 in avi
- driver libmpeg2
-; dll "libmpeg2"
- out YV12,I420,IYUV
- out 422P
-
videocodec ffmpeg12mc
info "FFmpeg MPEG-1/2 (XvMC)"
status buggy
diff --git a/libmpcodecs/vd.c b/libmpcodecs/vd.c
index cbe979a100..c54ae5260b 100644
--- a/libmpcodecs/vd.c
+++ b/libmpcodecs/vd.c
@@ -50,7 +50,6 @@ extern const vd_functions_t mpcodecs_vd_mpng;
extern const vd_functions_t mpcodecs_vd_ijpg;
extern const vd_functions_t mpcodecs_vd_mtga;
extern const vd_functions_t mpcodecs_vd_sgi;
-extern const vd_functions_t mpcodecs_vd_libmpeg2;
extern const vd_functions_t mpcodecs_vd_mpegpes;
extern const vd_functions_t mpcodecs_vd_realvid;
extern const vd_functions_t mpcodecs_vd_xvid;
@@ -90,9 +89,6 @@ const vd_functions_t * const mpcodecs_vd_drivers[] = {
#endif
&mpcodecs_vd_mtga,
&mpcodecs_vd_sgi,
-#ifdef CONFIG_LIBMPEG2
- &mpcodecs_vd_libmpeg2,
-#endif
&mpcodecs_vd_mpegpes,
#ifdef CONFIG_REALCODECS
&mpcodecs_vd_realvid,
diff --git a/libmpcodecs/vd_libmpeg2.c b/libmpcodecs/vd_libmpeg2.c
deleted file mode 100644
index c686ad67a4..0000000000
--- a/libmpcodecs/vd_libmpeg2.c
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * This file is part of MPlayer.
- *
- * MPlayer is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * MPlayer 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with MPlayer; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "config.h"
-#include "options.h"
-#include "mp_msg.h"
-
-#include "vd_internal.h"
-
-//#undef MPEG12_POSTPROC
-
-static const vd_info_t info =
-{
- "libmpeg2 MPEG 1/2 Video decoder",
- "libmpeg2",
- "A'rpi & Fabian Franz",
- "Aaron & Walken",
- "native"
-};
-
-LIBVD_EXTERN(libmpeg2)
-
-//#include "libvo/video_out.h" // FIXME!!!
-
-#include "libmpeg2/mpeg2.h"
-#include "libmpeg2/attributes.h"
-#include "libmpeg2/mpeg2_internal.h"
-
-#include "cpudetect.h"
-
-typedef struct {
- mpeg2dec_t *mpeg2dec;
- int quant_store_idx;
- char *quant_store[3];
- int imgfmt;
- int width;
- int height;
- double aspect;
-} vd_libmpeg2_ctx_t;
-
-// to set/get/query special features/parameters
-static int control(sh_video_t *sh,int cmd,void* arg,...){
- vd_libmpeg2_ctx_t *context = sh->context;
- mpeg2dec_t * mpeg2dec = context->mpeg2dec;
- const mpeg2_info_t * info = mpeg2_info (mpeg2dec);
-
- switch(cmd) {
- case VDCTRL_QUERY_FORMAT:
- if (info->sequence->width >> 1 == info->sequence->chroma_width &&
- info->sequence->height >> 1 == info->sequence->chroma_height &&
- (*((int*)arg)) == IMGFMT_YV12)
- return CONTROL_TRUE;
- if (info->sequence->width >> 1 == info->sequence->chroma_width &&
- info->sequence->height == info->sequence->chroma_height &&
- (*((int*)arg)) == IMGFMT_422P)
- return CONTROL_TRUE;
- return CONTROL_FALSE;
- }
-
- return CONTROL_UNKNOWN;
-}
-
-// init driver
-static int init(sh_video_t *sh){
- vd_libmpeg2_ctx_t *context;
- mpeg2dec_t * mpeg2dec;
-// const mpeg2_info_t * info;
- int accel;
-
- accel = 0;
- if(gCpuCaps.hasMMX)
- accel |= MPEG2_ACCEL_X86_MMX;
- if(gCpuCaps.hasMMX2)
- accel |= MPEG2_ACCEL_X86_MMXEXT;
- if(gCpuCaps.has3DNow)
- accel |= MPEG2_ACCEL_X86_3DNOW;
- if(gCpuCaps.hasSSE2)
- accel |= MPEG2_ACCEL_X86_SSE2;
- if(gCpuCaps.hasAltiVec)
- accel |= MPEG2_ACCEL_PPC_ALTIVEC;
- #if ARCH_ALPHA
- accel |= MPEG2_ACCEL_ALPHA;
- #elif ARCH_ARM
- accel |= MPEG2_ACCEL_ARM;
- #endif
- #if HAVE_MVI
- accel |= MPEG2_ACCEL_ALPHA_MVI;
- #elif HAVE_VIS
- accel |= MPEG2_ACCEL_SPARC_VIS;
- #endif
- mpeg2_accel(accel);
-
- mpeg2dec = mpeg2_init ();
-
- if(!mpeg2dec) return 0;
-
- mpeg2_custom_fbuf(mpeg2dec,1); // enable DR1
-
- context = calloc(1, sizeof(vd_libmpeg2_ctx_t));
- context->mpeg2dec = mpeg2dec;
- sh->context = context;
-
- mpeg2dec->pending_buffer = 0;
- mpeg2dec->pending_length = 0;
-
- return 1;
-}
-
-// uninit driver
-static void uninit(sh_video_t *sh){
- int i;
- vd_libmpeg2_ctx_t *context = sh->context;
- mpeg2dec_t * mpeg2dec = context->mpeg2dec;
- free(mpeg2dec->pending_buffer);
- mpeg2dec->decoder.convert=NULL;
- mpeg2dec->decoder.convert_id=NULL;
- mpeg2_close (mpeg2dec);
- for (i=0; i < 3; i++)
- free(context->quant_store[i]);
- free(sh->context);
-}
-
-static void draw_slice (void * _sh, uint8_t * const * src, unsigned int y){
- sh_video_t* sh = (sh_video_t*) _sh;
- vd_libmpeg2_ctx_t *context = sh->context;
- mpeg2dec_t* mpeg2dec = context->mpeg2dec;
- const mpeg2_info_t * info = mpeg2_info (mpeg2dec);
- int stride[MP_MAX_PLANES] = {mpeg2dec->decoder.stride, mpeg2dec->decoder.uv_stride, mpeg2dec->decoder.uv_stride};
- uint8_t *srcs[MP_MAX_PLANES] = {src[0], src[1], src[2]};
-
-// printf("draw_slice() y=%d \n",y);
-
- mpcodecs_draw_slice(sh, srcs,
- stride, info->sequence->picture_width,
- (y+16<=info->sequence->picture_height) ? 16 :
- info->sequence->picture_height-y,
- 0, y);
-}
-
-// decode a frame
-static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
- vd_libmpeg2_ctx_t *context = sh->context;
- mpeg2dec_t * mpeg2dec = context->mpeg2dec;
- const mpeg2_info_t * info = mpeg2_info (mpeg2dec);
- int drop_frame, framedrop=flags&3;
-
- // MPlayer registers its own draw_slice callback, prevent libmpeg2 from freeing the context
- mpeg2dec->decoder.convert=NULL;
- mpeg2dec->decoder.convert_id=NULL;
-
- if(len<=0) return NULL; // skipped null frame
-
- // append extra 'end of frame' code:
- ((char*)data+len)[0]=0;
- ((char*)data+len)[1]=0;
- ((char*)data+len)[2]=1;
- ((char*)data+len)[3]=0xff;
- len+=4;
-
- if (mpeg2dec->pending_length) {
- mpeg2_buffer (mpeg2dec, mpeg2dec->pending_buffer, mpeg2dec->pending_buffer + mpeg2dec->pending_length);
- } else {
- mpeg2_buffer (mpeg2dec, data, (uint8_t *)data+len);
- }
-
- while(1){
- int state=mpeg2_parse (mpeg2dec);
- int type, use_callback;
- mp_image_t* mpi_new;
- unsigned long pw, ph;
- int imgfmt;
-
- switch(state){
- case STATE_BUFFER:
- if (mpeg2dec->pending_length) {
- // just finished the pending data, continue with processing of the passed buffer
- mpeg2dec->pending_length = 0;
- mpeg2_buffer (mpeg2dec, data, (uint8_t *)data+len);
- } else {
- // parsing of the passed buffer finished, return.
- return 0;
- }
- break;
- case STATE_SEQUENCE:
- pw = info->sequence->display_width * info->sequence->pixel_width;
- ph = info->sequence->display_height * info->sequence->pixel_height;
- if(ph) sh->aspect = (float) pw / (float) ph;
- // video parameters initialized/changed, (re)init libvo:
- if (info->sequence->width >> 1 == info->sequence->chroma_width &&
- info->sequence->height >> 1 == info->sequence->chroma_height) {
- imgfmt = IMGFMT_YV12;
- } else if (info->sequence->width >> 1 == info->sequence->chroma_width &&
- info->sequence->height == info->sequence->chroma_height) {
- imgfmt = IMGFMT_422P;
- } else return 0;
- if (imgfmt == context->imgfmt &&
- info->sequence->picture_width == context->width &&
- info->sequence->picture_height == context->height &&
- sh->aspect == context->aspect)
- break;
- if(!mpcodecs_config_vo(sh,
- info->sequence->picture_width,
- info->sequence->picture_height, imgfmt))
- return 0;
- context->imgfmt = imgfmt;
- context->width = info->sequence->picture_width;
- context->height = info->sequence->picture_height;
- context->aspect = sh->aspect;
- break;
- case STATE_PICTURE:
- type=info->current_picture->flags&PIC_MASK_CODING_TYPE;
-
- drop_frame = framedrop && (mpeg2dec->decoder.coding_type == B_TYPE);
- drop_frame |= framedrop>=2; // hard drop
- if (drop_frame) {
- mpeg2_skip(mpeg2dec, 1);
- //printf("Dropping Frame ...\n");
- break;
- }
- mpeg2_skip(mpeg2dec, 0); //mpeg2skip skips frames until set again to 0
-
- use_callback = (!framedrop && sh->opts->vd_use_slices &&
- (info->current_picture->flags&PIC_FLAG_PROGRESSIVE_FRAME)) ?
- MP_IMGFLAG_DRAW_CALLBACK:0;
-
- // get_buffer "callback":
- mpi_new=mpcodecs_get_image(sh,MP_IMGTYPE_IPB,
- (type==PIC_FLAG_CODING_TYPE_B) ?
- use_callback : (MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE),
- info->sequence->width,
- info->sequence->height);
-
- if(!mpi_new) return 0; // VO ERROR!!!!!!!!
- mpeg2_set_buf(mpeg2dec, mpi_new->planes, mpi_new);
- mpi_new->stride[0] = info->sequence->width;
- mpi_new->stride[1] = info->sequence->chroma_width;
- mpi_new->stride[2] = info->sequence->chroma_width;
- if (info->current_picture->flags&PIC_FLAG_TOP_FIELD_FIRST)
- mpi_new->fields |= MP_IMGFIELD_TOP_FIRST;
- else mpi_new->fields &= ~MP_IMGFIELD_TOP_FIRST;
- if (info->current_picture->flags&PIC_FLAG_REPEAT_FIRST_FIELD)
- mpi_new->fields |= MP_IMGFIELD_REPEAT_FIRST;
- else mpi_new->fields &= ~MP_IMGFIELD_REPEAT_FIRST;
- mpi_new->fields |= MP_IMGFIELD_ORDERED;
- if (!(info->current_picture->flags&PIC_FLAG_PROGRESSIVE_FRAME))
- mpi_new->fields |= MP_IMGFIELD_INTERLACED;
-
-#ifdef MPEG12_POSTPROC
- mpi_new->qstride=info->sequence->width>>4;
- {
- char **p = &context->quant_store[type==PIC_FLAG_CODING_TYPE_B ?
- 2 : (context->quant_store_idx ^= 1)];
- *p = realloc(*p, mpi_new->qstride*(info->sequence->height>>4));
- mpi_new->qscale = *p;
- }
- mpeg2dec->decoder.quant_store=mpi_new->qscale;
- mpeg2dec->decoder.quant_stride=mpi_new->qstride;
- mpi_new->pict_type=type; // 1->I, 2->P, 3->B
- mpi_new->qscale_type= 1;
-#endif
-
- if (mpi_new->flags&MP_IMGFLAG_DRAW_CALLBACK
- && !(mpi_new->flags&MP_IMGFLAG_DIRECT)) {
- // nice, filter/vo likes draw_callback :)
- mpeg2dec->decoder.convert=draw_slice;
- mpeg2dec->decoder.convert_id=sh;
- } else {
- mpeg2dec->decoder.convert=NULL;
- mpeg2dec->decoder.convert_id=NULL;
- }
-
- break;
- case STATE_SLICE:
- case STATE_END:
- case STATE_INVALID_END:
- // decoding done:
- if(info->display_fbuf) {
- mp_image_t* mpi = info->display_fbuf->id;
- if (mpeg2dec->pending_length == 0) {
- mpeg2dec->pending_length = mpeg2dec->buf_end - mpeg2dec->buf_start;
- mpeg2dec->pending_buffer = realloc(mpeg2dec->pending_buffer, mpeg2dec->pending_length);
- memcpy(mpeg2dec->pending_buffer, mpeg2dec->buf_start, mpeg2dec->pending_length);
- } else {
- // still some data in the pending buffer, shouldn't happen
- mpeg2dec->pending_length = mpeg2dec->buf_end - mpeg2dec->buf_start;
- memmove(mpeg2dec->pending_buffer, mpeg2dec->buf_start, mpeg2dec->pending_length);
- mpeg2dec->pending_buffer = realloc(mpeg2dec->pending_buffer, mpeg2dec->pending_length + len);
- memcpy(mpeg2dec->pending_buffer+mpeg2dec->pending_length, data, len);
- mpeg2dec->pending_length += len;
- }
-// fprintf(stderr, "pending = %d\n", mpeg2dec->pending_length);
- return mpi;
- }
- }
- }
-}
diff --git a/libmpeg2/alloc.c b/libmpeg2/alloc.c
deleted file mode 100644
index 71bc18b692..0000000000
--- a/libmpeg2/alloc.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * alloc.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <stdlib.h>
-#include <inttypes.h>
-
-#include "mpeg2.h"
-
-static void * (* malloc_hook) (unsigned size, mpeg2_alloc_t reason) = NULL;
-static int (* free_hook) (void * buf) = NULL;
-
-void * mpeg2_malloc (unsigned size, mpeg2_alloc_t reason)
-{
- char * buf;
-
- if (malloc_hook) {
- buf = (char *) malloc_hook (size, reason);
- if (buf)
- return buf;
- }
-
- if (size) {
- buf = (char *) malloc (size + 63 + sizeof (void **));
- if (buf) {
- char * align_buf;
-
- align_buf = buf + 63 + sizeof (void **);
- align_buf -= (long)align_buf & 63;
- *(((void **)align_buf) - 1) = buf;
- return align_buf;
- }
- }
- return NULL;
-}
-
-void mpeg2_free (void * buf)
-{
- if (free_hook && free_hook (buf))
- return;
-
- if (buf)
- free (*(((void **)buf) - 1));
-}
-
-void mpeg2_malloc_hooks (void * alloc_func (unsigned, mpeg2_alloc_t),
- int free_func (void *))
-{
- malloc_hook = alloc_func;
- free_hook = free_func;
-}
diff --git a/libmpeg2/alpha_asm.h b/libmpeg2/alpha_asm.h
deleted file mode 100644
index 8cebbcb817..0000000000
--- a/libmpeg2/alpha_asm.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Alpha assembly macros
- * Copyright (c) 2002-2003 Falk Hueffner <falk@debian.org>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef LIBMPEG2_ALPHA_ASM_H
-#define LIBMPEG2_ALPHA_ASM_H
-
-#include <inttypes.h>
-
-#if defined __GNUC__
-# define GNUC_PREREQ(maj, min) \
- ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
-#else
-# define GNUC_PREREQ(maj, min) 0
-#endif
-
-#define AMASK_BWX (1 << 0)
-#define AMASK_FIX (1 << 1)
-#define AMASK_CIX (1 << 2)
-#define AMASK_MVI (1 << 8)
-
-#ifdef __alpha_bwx__
-# define HAVE_BWX() 1
-#else
-# define HAVE_BWX() (amask(AMASK_BWX) == 0)
-#endif
-#ifdef __alpha_fix__
-# define HAVE_FIX() 1
-#else
-# define HAVE_FIX() (amask(AMASK_FIX) == 0)
-#endif
-#ifdef __alpha_max__
-# define HAVE_MVI() 1
-#else
-# define HAVE_MVI() (amask(AMASK_MVI) == 0)
-#endif
-#ifdef __alpha_cix__
-# define HAVE_CIX() 1
-#else
-# define HAVE_CIX() (amask(AMASK_CIX) == 0)
-#endif
-
-inline static uint64_t BYTE_VEC(uint64_t x)
-{
- x |= x << 8;
- x |= x << 16;
- x |= x << 32;
- return x;
-}
-inline static uint64_t WORD_VEC(uint64_t x)
-{
- x |= x << 16;
- x |= x << 32;
- return x;
-}
-
-#define ldq(p) (*(const uint64_t *) (p))
-#define ldl(p) (*(const int32_t *) (p))
-#define stl(l, p) do { *(uint32_t *) (p) = (l); } while (0)
-#define stq(l, p) do { *(uint64_t *) (p) = (l); } while (0)
-#define sextw(x) ((int16_t) (x))
-
-#ifdef __GNUC__
-struct unaligned_long { uint64_t l; } __attribute__((packed));
-#define ldq_u(p) (*(const uint64_t *) (((uint64_t) (p)) & ~7ul))
-#define uldq(a) (((const struct unaligned_long *) (a))->l)
-
-#if GNUC_PREREQ(3,3)
-#define prefetch(p) __builtin_prefetch((p), 0, 1)
-#define prefetch_en(p) __builtin_prefetch((p), 0, 0)
-#define prefetch_m(p) __builtin_prefetch((p), 1, 1)
-#define prefetch_men(p) __builtin_prefetch((p), 1, 0)
-#define cmpbge __builtin_alpha_cmpbge
-/* Avoid warnings. */
-#define extql(a, b) __builtin_alpha_extql(a, (uint64_t) (b))
-#define extwl(a, b) __builtin_alpha_extwl(a, (uint64_t) (b))
-#define extqh(a, b) __builtin_alpha_extqh(a, (uint64_t) (b))
-#define zap __builtin_alpha_zap
-#define zapnot __builtin_alpha_zapnot
-#define amask __builtin_alpha_amask
-#define implver __builtin_alpha_implver
-#define rpcc __builtin_alpha_rpcc
-#else
-#define prefetch(p) asm volatile("ldl $31,%0" : : "m"(*(const char *) (p)) : "memory")
-#define prefetch_en(p) asm volatile("ldq $31,%0" : : "m"(*(const char *) (p)) : "memory")
-#define prefetch_m(p) asm volatile("lds $f31,%0" : : "m"(*(const char *) (p)) : "memory")
-#define prefetch_men(p) asm volatile("ldt $f31,%0" : : "m"(*(const char *) (p)) : "memory")
-#define cmpbge(a, b) ({ uint64_t __r; asm ("cmpbge %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
-#define extql(a, b) ({ uint64_t __r; asm ("extql %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
-#define extwl(a, b) ({ uint64_t __r; asm ("extwl %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
-#define extqh(a, b) ({ uint64_t __r; asm ("extqh %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
-#define zap(a, b) ({ uint64_t __r; asm ("zap %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
-#define zapnot(a, b) ({ uint64_t __r; asm ("zapnot %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
-#define amask(a) ({ uint64_t __r; asm ("amask %1,%0" : "=r" (__r) : "rI" (a)); __r; })
-#define implver() ({ uint64_t __r; asm ("implver %0" : "=r" (__r)); __r; })
-#define rpcc() ({ uint64_t __r; asm volatile ("rpcc %0" : "=r" (__r)); __r; })
-#endif
-#define wh64(p) asm volatile("wh64 (%0)" : : "r"(p) : "memory")
-
-#if GNUC_PREREQ(3,3) && defined(__alpha_max__)
-#define minub8 __builtin_alpha_minub8
-#define minsb8 __builtin_alpha_minsb8
-#define minuw4 __builtin_alpha_minuw4
-#define minsw4 __builtin_alpha_minsw4
-#define maxub8 __builtin_alpha_maxub8
-#define maxsb8 __builtin_alpha_maxsb8
-#define maxuw4 __builtin_alpha_maxuw4
-#define maxsw4 __builtin_alpha_maxsw4
-#define perr __builtin_alpha_perr
-#define pklb __builtin_alpha_pklb
-#define pkwb __builtin_alpha_pkwb
-#define unpkbl __builtin_alpha_unpkbl
-#define unpkbw __builtin_alpha_unpkbw
-#else
-#define minub8(a, b) ({ uint64_t __r; asm (".arch ev6; minub8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
-#define minsb8(a, b) ({ uint64_t __r; asm (".arch ev6; minsb8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
-#define minuw4(a, b) ({ uint64_t __r; asm (".arch ev6; minuw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
-#define minsw4(a, b) ({ uint64_t __r; asm (".arch ev6; minsw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
-#define maxub8(a, b) ({ uint64_t __r; asm (".arch ev6; maxub8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
-#define maxsb8(a, b) ({ uint64_t __r; asm (".arch ev6; maxsb8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
-#define maxuw4(a, b) ({ uint64_t __r; asm (".arch ev6; maxuw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
-#define maxsw4(a, b) ({ uint64_t __r; asm (".arch ev6; maxsw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
-#define perr(a, b) ({ uint64_t __r; asm (".arch ev6; perr %r1,%r2,%0" : "=r" (__r) : "%rJ" (a), "rJ" (b)); __r; })
-#define pklb(a) ({ uint64_t __r; asm (".arch ev6; pklb %r1,%0" : "=r" (__r) : "rJ" (a)); __r; })
-#define pkwb(a) ({ uint64_t __r; asm (".arch ev6; pkwb %r1,%0" : "=r" (__r) : "rJ" (a)); __r; })
-#define unpkbl(a) ({ uint64_t __r; asm (".arch ev6; unpkbl %r1,%0" : "=r" (__r) : "rJ" (a)); __r; })
-#define unpkbw(a) ({ uint64_t __r; asm (".arch ev6; unpkbw %r1,%0" : "=r" (__r) : "rJ" (a)); __r; })
-#endif
-
-#elif defined(__DECC) /* Digital/Compaq/hp "ccc" compiler */
-
-#include <c_asm.h>
-#define ldq_u(a) asm ("ldq_u %v0,0(%a0)", a)
-#define uldq(a) (*(const __unaligned uint64_t *) (a))
-#define cmpbge(a, b) asm ("cmpbge %a0,%a1,%v0", a, b)
-#define extql(a, b) asm ("extql %a0,%a1,%v0", a, b)
-#define extwl(a, b) asm ("extwl %a0,%a1,%v0", a, b)
-#define extqh(a, b) asm ("extqh %a0,%a1,%v0", a, b)
-#define zap(a, b) asm ("zap %a0,%a1,%v0", a, b)
-#define zapnot(a, b) asm ("zapnot %a0,%a1,%v0", a, b)
-#define amask(a) asm ("amask %a0,%v0", a)
-#define implver() asm ("implver %v0")
-#define rpcc() asm ("rpcc %v0")
-#define minub8(a, b) asm ("minub8 %a0,%a1,%v0", a, b)
-#define minsb8(a, b) asm ("minsb8 %a0,%a1,%v0", a, b)
-#define minuw4(a, b) asm ("minuw4 %a0,%a1,%v0", a, b)
-#define minsw4(a, b) asm ("minsw4 %a0,%a1,%v0", a, b)
-#define maxub8(a, b) asm ("maxub8 %a0,%a1,%v0", a, b)
-#define maxsb8(a, b) asm ("maxsb8 %a0,%a1,%v0", a, b)
-#define maxuw4(a, b) asm ("maxuw4 %a0,%a1,%v0", a, b)
-#define maxsw4(a, b) asm ("maxsw4 %a0,%a1,%v0", a, b)
-#define perr(a, b) asm ("perr %a0,%a1,%v0", a, b)
-#define pklb(a) asm ("pklb %a0,%v0", a)
-#define pkwb(a) asm ("pkwb %a0,%v0", a)
-#define unpkbl(a) asm ("unpkbl %a0,%v0", a)
-#define unpkbw(a) asm ("unpkbw %a0,%v0", a)
-#define wh64(a) asm ("wh64 %a0", a)
-
-#else
-#error "Unknown compiler!"
-#endif
-
-#endif /* LIBMPEG2_ALPHA_ASM_H */
diff --git a/libmpeg2/attributes.h b/libmpeg2/attributes.h
deleted file mode 100644
index e005eef1c3..0000000000
--- a/libmpeg2/attributes.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * attributes.h
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef LIBMPEG2_ATTRIBUTES_H
-#define LIBMPEG2_ATTRIBUTES_H
-
-/* use gcc attribs to align critical data structures */
-#ifdef ATTRIBUTE_ALIGNED_MAX
-#define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align)))
-#else
-#define ATTR_ALIGN(align)
-#endif
-
-#ifdef HAVE_BUILTIN_EXPECT
-#define likely(x) __builtin_expect ((x) != 0, 1)
-#define unlikely(x) __builtin_expect ((x) != 0, 0)
-#else
-#define likely(x) (x)
-#define unlikely(x) (x)
-#endif
-
-#endif /* LIBMPEG2_ATTRIBUTES_H */
diff --git a/libmpeg2/cpu_accel.c b/libmpeg2/cpu_accel.c
deleted file mode 100644
index f2e99f754a..0000000000
--- a/libmpeg2/cpu_accel.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * cpu_accel.c
- * Copyright (C) 2000-2004 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
- * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id$
- */
-
-#include "config.h"
-
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-#include "cpudetect.h"
-
-#if ARCH_X86 || ARCH_X86_64
-static inline uint32_t arch_accel (uint32_t accel)
-{
-/* Use MPlayer CPU detection instead of libmpeg2 variant. */
-#if 0
- if (accel & (MPEG2_ACCEL_X86_3DNOW | MPEG2_ACCEL_X86_MMXEXT))
- accel |= MPEG2_ACCEL_X86_MMX;
-
- if (accel & (MPEG2_ACCEL_X86_SSE2 | MPEG2_ACCEL_X86_SSE3))
- accel |= MPEG2_ACCEL_X86_MMXEXT;
-
- if (accel & (MPEG2_ACCEL_X86_SSE3))
- accel |= MPEG2_ACCEL_X86_SSE2;
-
-#ifdef ACCEL_DETECT
- if (accel & MPEG2_ACCEL_DETECT) {
- uint32_t eax, ebx, ecx, edx;
- int AMD;
-
-#if defined(__x86_64__) || (!defined(PIC) && !defined(__PIC__))
-#define cpuid(op,eax,ebx,ecx,edx) \
- __asm__ ("cpuid" \
- : "=a" (eax), \
- "=b" (ebx), \
- "=c" (ecx), \
- "=d" (edx) \
- : "a" (op) \
- : "cc")
-#else /* PIC version : save ebx (not needed on x86_64) */
-#define cpuid(op,eax,ebx,ecx,edx) \
- __asm__ ("pushl %%ebx\n\t" \
- "cpuid\n\t" \
- "movl %%ebx,%1\n\t" \
- "popl %%ebx" \
- : "=a" (eax), \
- "=r" (ebx), \
- "=c" (ecx), \
- "=d" (edx) \
- : "a" (op) \
- : "cc")
-#endif
-
-#ifndef __x86_64__ /* x86_64 supports the cpuid op */
- __asm__ ("pushf\n\t"
- "pushf\n\t"
- "pop %0\n\t"
- "movl %0,%1\n\t"
- "xorl $0x200000,%0\n\t"
- "push %0\n\t"
- "popf\n\t"
- "pushf\n\t"
- "pop %0\n\t"
- "popf"
- : "=r" (eax),
- "=r" (ebx)
- :
- : "cc");
-
- if (eax == ebx) /* no cpuid */
- return accel;
-#endif
-
- cpuid (0x00000000, eax, ebx, ecx, edx);
- if (!eax) /* vendor string only */
- return accel;
-
- AMD = (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65);
-
- cpuid (0x00000001, eax, ebx, ecx, edx);
- if (! (edx & 0x00800000)) /* no MMX */
- return accel;
-
- accel |= MPEG2_ACCEL_X86_MMX;
- if (edx & 0x02000000) /* SSE - identical to AMD MMX ext. */
- accel |= MPEG2_ACCEL_X86_MMXEXT;
-
- if (edx & 0x04000000) /* SSE2 */
- accel |= MPEG2_ACCEL_X86_SSE2;
-
- if (ecx & 0x00000001) /* SSE3 */
- accel |= MPEG2_ACCEL_X86_SSE3;
-
- cpuid (0x80000000, eax, ebx, ecx, edx);
- if (eax < 0x80000001) /* no extended capabilities */
- return accel;
-
- cpuid (0x80000001, eax, ebx, ecx, edx);
-
- if (edx & 0x80000000)
- accel |= MPEG2_ACCEL_X86_3DNOW;
-
- if (AMD && (edx & 0x00400000)) /* AMD MMX extensions */
- accel |= MPEG2_ACCEL_X86_MMXEXT;
- }
-#endif /* ACCEL_DETECT */
-
- return accel;
-
-#else /* 0 */
- accel = 0;
- if (gCpuCaps.hasMMX)
- accel |= MPEG2_ACCEL_X86_MMX;
- if (gCpuCaps.hasSSE2)
- accel |= MPEG2_ACCEL_X86_SSE2;
- if (gCpuCaps.hasMMX2)
- accel |= MPEG2_ACCEL_X86_MMXEXT;
- if (gCpuCaps.has3DNow)
- accel |= MPEG2_ACCEL_X86_3DNOW;
-
- return accel;
-
-#endif /* 0 */
-}
-#endif /* ARCH_X86 || ARCH_X86_64 */
-
-#if defined(ACCEL_DETECT) && (ARCH_PPC || ARCH_SPARC)
-#include <signal.h>
-#include <setjmp.h>
-
-static sigjmp_buf jmpbuf;
-static volatile sig_atomic_t canjump = 0;
-
-static RETSIGTYPE sigill_handler (int sig)
-{
- if (!canjump) {
- signal (sig, SIG_DFL);
- raise (sig);
- }
-
- canjump = 0;
- siglongjmp (jmpbuf, 1);
-}
-#endif /* ACCEL_DETECT && (ARCH_PPC || ARCH_SPARC) */
-
-#if ARCH_PPC
-static uint32_t arch_accel (uint32_t accel)
-{
-#ifdef ACCEL_DETECT
- if ((accel & (MPEG2_ACCEL_PPC_ALTIVEC | MPEG2_ACCEL_DETECT)) ==
- MPEG2_ACCEL_DETECT) {
- static RETSIGTYPE (* oldsig) (int);
-
- oldsig = signal (SIGILL, sigill_handler);
- if (sigsetjmp (jmpbuf, 1)) {
- signal (SIGILL, oldsig);
- return accel;
- }
-
- canjump = 1;
-
-#if defined(__APPLE_CC__) /* apple */
-#define VAND(a,b,c) "vand v" #a ",v" #b ",v" #c "\n\t"
-#else /* gnu */
-#define VAND(a,b,c) "vand " #a "," #b "," #c "\n\t"
-#endif
- asm volatile ("mtspr 256, %0\n\t"
- VAND (0, 0, 0)
- :
- : "r" (-1));
-
- canjump = 0;
- accel |= MPEG2_ACCEL_PPC_ALTIVEC;
-
- signal (SIGILL, oldsig);
- }
-#endif /* ACCEL_DETECT */
-
- return accel;
-}
-#endif /* ARCH_PPC */
-
-#if ARCH_SPARC
-static uint32_t arch_accel (uint32_t accel)
-{
- if (accel & MPEG2_ACCEL_SPARC_VIS2)
- accel |= MPEG2_ACCEL_SPARC_VIS;
-
-#ifdef ACCEL_DETECT
- if ((accel & (MPEG2_ACCEL_SPARC_VIS2 | MPEG2_ACCEL_DETECT)) ==
- MPEG2_ACCEL_DETECT) {
- static RETSIGTYPE (* oldsig) (int);
-
- oldsig = signal (SIGILL, sigill_handler);
- if (sigsetjmp (jmpbuf, 1)) {
- signal (SIGILL, oldsig);
- return accel;
- }
-
- canjump = 1;
-
- /* pdist %f0, %f0, %f0 */
- __asm__ __volatile__(".word\t0x81b007c0");
-
- canjump = 0;
- accel |= MPEG2_ACCEL_SPARC_VIS;
-
- if (sigsetjmp (jmpbuf, 1)) {
- signal (SIGILL, oldsig);
- return accel;
- }
-
- canjump = 1;
-
- /* edge8n %g0, %g0, %g0 */
- __asm__ __volatile__(".word\t0x81b00020");
-
- canjump = 0;
- accel |= MPEG2_ACCEL_SPARC_VIS2;
-
- signal (SIGILL, oldsig);
- }
-#endif /* ACCEL_DETECT */
-
- return accel;
-}
-#endif /* ARCH_SPARC */
-
-#if ARCH_ALPHA
-static inline uint32_t arch_accel (uint32_t accel)
-{
- if (accel & MPEG2_ACCEL_ALPHA_MVI)
- accel |= MPEG2_ACCEL_ALPHA;
-
-#ifdef ACCEL_DETECT
- if (accel & MPEG2_ACCEL_DETECT) {
- uint64_t no_mvi;
-
- asm volatile ("amask %1, %0"
- : "=r" (no_mvi)
- : "rI" (256)); /* AMASK_MVI */
- accel |= no_mvi ? MPEG2_ACCEL_ALPHA : (MPEG2_ACCEL_ALPHA |
- MPEG2_ACCEL_ALPHA_MVI);
- }
-#endif /* ACCEL_DETECT */
-
- return accel;
-}
-#endif /* ARCH_ALPHA */
-
-uint32_t mpeg2_detect_accel (uint32_t accel)
-{
-#if ARCH_X86 || ARCH_X86_64 || ARCH_PPC || ARCH_ALPHA || ARCH_SPARC
- accel = arch_accel (accel);
-#endif
- return accel;
-}
diff --git a/libmpeg2/cpu_state.c b/libmpeg2/cpu_state.c
deleted file mode 100644
index d82b6738a7..0000000000
--- a/libmpeg2/cpu_state.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * cpu_state.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-#if ARCH_X86 || ARCH_X86_64
-#include "mmx.h"
-#endif
-
-void (* mpeg2_cpu_state_save) (cpu_state_t * state) = NULL;
-void (* mpeg2_cpu_state_restore) (cpu_state_t * state) = NULL;
-
-#if ARCH_X86 || ARCH_X86_64
-static void state_restore_mmx (cpu_state_t * state)
-{
- emms ();
-}
-#endif
-
-#if ARCH_PPC
-#if defined(__APPLE_CC__) /* apple */
-#define LI(a,b) "li r" #a "," #b "\n\t"
-#define STVX0(a,b,c) "stvx v" #a ",0,r" #c "\n\t"
-#define STVX(a,b,c) "stvx v" #a ",r" #b ",r" #c "\n\t"
-#define LVX0(a,b,c) "lvx v" #a ",0,r" #c "\n\t"
-#define LVX(a,b,c) "lvx v" #a ",r" #b ",r" #c "\n\t"
-#else /* gnu */
-#define LI(a,b) "li " #a "," #b "\n\t"
-#define STVX0(a,b,c) "stvx " #a ",0," #c "\n\t"
-#define STVX(a,b,c) "stvx " #a "," #b "," #c "\n\t"
-#define LVX0(a,b,c) "lvx " #a ",0," #c "\n\t"
-#define LVX(a,b,c) "lvx " #a "," #b "," #c "\n\t"
-#endif
-
-static void state_save_altivec (cpu_state_t * state)
-{
- asm (LI (9, 16)
- STVX0 (20, 0, 3)
- LI (11, 32)
- STVX (21, 9, 3)
- LI (9, 48)
- STVX (22, 11, 3)
- LI (11, 64)
- STVX (23, 9, 3)
- LI (9, 80)
- STVX (24, 11, 3)
- LI (11, 96)
- STVX (25, 9, 3)
- LI (9, 112)
- STVX (26, 11, 3)
- LI (11, 128)
- STVX (27, 9, 3)
- LI (9, 144)
- STVX (28, 11, 3)
- LI (11, 160)
- STVX (29, 9, 3)
- LI (9, 176)
- STVX (30, 11, 3)
- STVX (31, 9, 3));
-}
-
-static void state_restore_altivec (cpu_state_t * state)
-{
- asm (LI (9, 16)
- LVX0 (20, 0, 3)
- LI (11, 32)
- LVX (21, 9, 3)
- LI (9, 48)
- LVX (22, 11, 3)
- LI (11, 64)
- LVX (23, 9, 3)
- LI (9, 80)
- LVX (24, 11, 3)
- LI (11, 96)
- LVX (25, 9, 3)
- LI (9, 112)
- LVX (26, 11, 3)
- LI (11, 128)
- LVX (27, 9, 3)
- LI (9, 144)
- LVX (28, 11, 3)
- LI (11, 160)
- LVX (29, 9, 3)
- LI (9, 176)
- LVX (30, 11, 3)
- LVX (31, 9, 3));
-}
-#endif
-
-void mpeg2_cpu_state_init (uint32_t accel)
-{
-#if ARCH_X86 || ARCH_X86_64
- if (accel & MPEG2_ACCEL_X86_MMX) {
- mpeg2_cpu_state_restore = state_restore_mmx;
- }
-#endif
-#if ARCH_PPC
- if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
- mpeg2_cpu_state_save = state_save_altivec;
- mpeg2_cpu_state_restore = state_restore_altivec;
- }
-#endif
-}
diff --git a/libmpeg2/decode.c b/libmpeg2/decode.c
deleted file mode 100644
index f30b86b740..0000000000
--- a/libmpeg2/decode.c
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * decode.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
- * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id$
- */
-
-#include "config.h"
-
-#include <string.h> /* memcmp/memset, try to remove */
-#include <stdlib.h>
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-static int mpeg2_accels = 0;
-
-#define BUFFER_SIZE (1194 * 1024)
-
-const mpeg2_info_t * mpeg2_info (mpeg2dec_t * mpeg2dec)
-{
- return &(mpeg2dec->info);
-}
-
-static inline int skip_chunk (mpeg2dec_t * mpeg2dec, int bytes)
-{
- uint8_t * current;
- uint32_t shift;
- uint8_t * limit;
- uint8_t byte;
-
- if (!bytes)
- return 0;
-
- current = mpeg2dec->buf_start;
- shift = mpeg2dec->shift;
- limit = current + bytes;
-
- do {
- byte = *current++;
- if (shift == 0x00000100) {
- int skipped;
-
- mpeg2dec->shift = 0xffffff00;
- skipped = current - mpeg2dec->buf_start;
- mpeg2dec->buf_start = current;
- return skipped;
- }
- shift = (shift | byte) << 8;
- } while (current < limit);
-
- mpeg2dec->shift = shift;
- mpeg2dec->buf_start = current;
- return 0;
-}
-
-static inline int copy_chunk (mpeg2dec_t * mpeg2dec, int bytes)
-{
- uint8_t * current;
- uint32_t shift;
- uint8_t * chunk_ptr;
- uint8_t * limit;
- uint8_t byte;
-
- if (!bytes)
- return 0;
-
- current = mpeg2dec->buf_start;
- shift = mpeg2dec->shift;
- chunk_ptr = mpeg2dec->chunk_ptr;
- limit = current + bytes;
-
- do {
- byte = *current++;
- if (shift == 0x00000100) {
- int copied;
-
- mpeg2dec->shift = 0xffffff00;
- mpeg2dec->chunk_ptr = chunk_ptr + 1;
- copied = current - mpeg2dec->buf_start;
- mpeg2dec->buf_start = current;
- return copied;
- }
- shift = (shift | byte) << 8;
- *chunk_ptr++ = byte;
- } while (current < limit);
-
- mpeg2dec->shift = shift;
- mpeg2dec->buf_start = current;
- return 0;
-}
-
-void mpeg2_buffer (mpeg2dec_t * mpeg2dec, uint8_t * start, uint8_t * end)
-{
- mpeg2dec->buf_start = start;
- mpeg2dec->buf_end = end;
-}
-
-int mpeg2_getpos (mpeg2dec_t * mpeg2dec)
-{
- return mpeg2dec->buf_end - mpeg2dec->buf_start;
-}
-
-static inline mpeg2_state_t seek_chunk (mpeg2dec_t * mpeg2dec)
-{
- int size, skipped;
-
- size = mpeg2dec->buf_end - mpeg2dec->buf_start;
- skipped = skip_chunk (mpeg2dec, size);
- if (!skipped) {
- mpeg2dec->bytes_since_tag += size;
- return STATE_BUFFER;
- }
- mpeg2dec->bytes_since_tag += skipped;
- mpeg2dec->code = mpeg2dec->buf_start[-1];
- return STATE_INTERNAL_NORETURN;
-}
-
-mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec)
-{
- while (!(mpeg2dec->code == 0xb3 ||
- ((mpeg2dec->code == 0xb7 || mpeg2dec->code == 0xb8 ||
- !mpeg2dec->code) && mpeg2dec->sequence.width != (unsigned)-1)))
- if (seek_chunk (mpeg2dec) == STATE_BUFFER)
- return STATE_BUFFER;
- mpeg2dec->chunk_start = mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer;
- mpeg2dec->user_data_len = 0;
- return ((mpeg2dec->code == 0xb7) ?
- mpeg2_header_end (mpeg2dec) : mpeg2_parse_header (mpeg2dec));
-}
-
-#define RECEIVED(code,state) (((state) << 8) + (code))
-
-mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec)
-{
- int size_buffer, size_chunk, copied;
-
- if (mpeg2dec->action) {
- mpeg2_state_t state;
-
- state = mpeg2dec->action (mpeg2dec);
- if ((int)state > (int)STATE_INTERNAL_NORETURN)
- return state;
- }
-
- while (1) {
- while ((unsigned) (mpeg2dec->code - mpeg2dec->first_decode_slice) <
- mpeg2dec->nb_decode_slices) {
- size_buffer = mpeg2dec->buf_end - mpeg2dec->buf_start;
- size_chunk = (mpeg2dec->chunk_buffer + BUFFER_SIZE -
- mpeg2dec->chunk_ptr);
- if (size_buffer <= size_chunk) {
- copied = copy_chunk (mpeg2dec, size_buffer);
- if (!copied) {
- mpeg2dec->bytes_since_tag += size_buffer;
- mpeg2dec->chunk_ptr += size_buffer;
- return STATE_BUFFER;
- }
- } else {
- copied = copy_chunk (mpeg2dec, size_chunk);
- if (!copied) {
- /* filled the chunk buffer without finding a start code */
- mpeg2dec->bytes_since_tag += size_chunk;
- mpeg2dec->action = seek_chunk;
- return STATE_INVALID;
- }
- }
- mpeg2dec->bytes_since_tag += copied;
-
- mpeg2_slice (&(mpeg2dec->decoder), mpeg2dec->code,
- mpeg2dec->chunk_start);
- mpeg2dec->code = mpeg2dec->buf_start[-1];
- mpeg2dec->chunk_ptr = mpeg2dec->chunk_start;
- }
- if ((unsigned) (mpeg2dec->code - 1) >= 0xb0 - 1)
- break;
- if (seek_chunk (mpeg2dec) == STATE_BUFFER)
- return STATE_BUFFER;
- }
-
- mpeg2dec->action = mpeg2_seek_header;
- switch (mpeg2dec->code) {
- case 0x00:
- return mpeg2dec->state;
- case 0xb3:
- case 0xb7:
- case 0xb8:
- return (mpeg2dec->state == STATE_SLICE) ? STATE_SLICE : STATE_INVALID;
- default:
- mpeg2dec->action = seek_chunk;
- return STATE_INVALID;
- }
-}
-
-mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec)
-{
- static int (* process_header[]) (mpeg2dec_t * mpeg2dec) = {
- mpeg2_header_picture, mpeg2_header_extension, mpeg2_header_user_data,
- mpeg2_header_sequence, NULL, NULL, NULL, NULL, mpeg2_header_gop
- };
- int size_buffer, size_chunk, copied;
-
- mpeg2dec->action = mpeg2_parse_header;
- mpeg2dec->info.user_data = NULL; mpeg2dec->info.user_data_len = 0;
- while (1) {
- size_buffer = mpeg2dec->buf_end - mpeg2dec->buf_start;
- size_chunk = (mpeg2dec->chunk_buffer + BUFFER_SIZE -
- mpeg2dec->chunk_ptr);
- if (size_buffer <= size_chunk) {
- copied = copy_chunk (mpeg2dec, size_buffer);
- if (!copied) {
- mpeg2dec->bytes_since_tag += size_buffer;
- mpeg2dec->chunk_ptr += size_buffer;
- return STATE_BUFFER;
- }
- } else {
- copied = copy_chunk (mpeg2dec, size_chunk);
- if (!copied) {
- /* filled the chunk buffer without finding a start code */
- mpeg2dec->bytes_since_tag += size_chunk;
- mpeg2dec->code = 0xb4;
- mpeg2dec->action = mpeg2_seek_header;
- return STATE_INVALID;
- }
- }
- mpeg2dec->bytes_since_tag += copied;
-
- if (process_header[mpeg2dec->code & 0x0b] (mpeg2dec)) {
- mpeg2dec->code = mpeg2dec->buf_start[-1];
- mpeg2dec->action = mpeg2_seek_header;
- return STATE_INVALID;
- }
-
- mpeg2dec->code = mpeg2dec->buf_start[-1];
- switch (RECEIVED (mpeg2dec->code, mpeg2dec->state)) {
-
- /* state transition after a sequence header */
- case RECEIVED (0x00, STATE_SEQUENCE):
- case RECEIVED (0xb8, STATE_SEQUENCE):
- mpeg2_header_sequence_finalize (mpeg2dec);
- break;
-
- /* other legal state transitions */
- case RECEIVED (0x00, STATE_GOP):
- mpeg2_header_gop_finalize (mpeg2dec);
- break;
- case RECEIVED (0x01, STATE_PICTURE):
- case RECEIVED (0x01, STATE_PICTURE_2ND):
- mpeg2_header_picture_finalize (mpeg2dec, mpeg2_accels);
- mpeg2dec->action = mpeg2_header_slice_start;
- break;
-
- /* legal headers within a given state */
- case RECEIVED (0xb2, STATE_SEQUENCE):
- case RECEIVED (0xb2, STATE_GOP):
- case RECEIVED (0xb2, STATE_PICTURE):
- case RECEIVED (0xb2, STATE_PICTURE_2ND):
- case RECEIVED (0xb5, STATE_SEQUENCE):
- case RECEIVED (0xb5, STATE_PICTURE):
- case RECEIVED (0xb5, STATE_PICTURE_2ND):
- mpeg2dec->chunk_ptr = mpeg2dec->chunk_start;
- continue;
-
- default:
- mpeg2dec->action = mpeg2_seek_header;
- return STATE_INVALID;
- }
-
- mpeg2dec->chunk_start = mpeg2dec->chunk_ptr = mpeg2dec->chunk_buffer;
- mpeg2dec->user_data_len = 0;
- return mpeg2dec->state;
- }
-}
-
-int mpeg2_convert (mpeg2dec_t * mpeg2dec, mpeg2_convert_t convert, void * arg)
-{
- mpeg2_convert_init_t convert_init;
- int error;
-
- error = convert (MPEG2_CONVERT_SET, NULL, &(mpeg2dec->sequence), 0,
- mpeg2_accels, arg, &convert_init);
- if (!error) {
- mpeg2dec->convert = convert;
- mpeg2dec->convert_arg = arg;
- mpeg2dec->convert_id_size = convert_init.id_size;
- mpeg2dec->convert_stride = 0;
- }
- return error;
-}
-
-int mpeg2_stride (mpeg2dec_t * mpeg2dec, int stride)
-{
- if (!mpeg2dec->convert) {
- if (stride < (int) mpeg2dec->sequence.width)
- stride = mpeg2dec->sequence.width;
- mpeg2dec->decoder.stride_frame = stride;
- } else {
- mpeg2_convert_init_t convert_init;
-
- stride = mpeg2dec->convert (MPEG2_CONVERT_STRIDE, NULL,
- &(mpeg2dec->sequence), stride,
- mpeg2_accels, mpeg2dec->convert_arg,
- &convert_init);
- mpeg2dec->convert_id_size = convert_init.id_size;
- mpeg2dec->convert_stride = stride;
- }
- return stride;
-}
-
-void mpeg2_set_buf (mpeg2dec_t * mpeg2dec, uint8_t * buf[3], void * id)
-{
- mpeg2_fbuf_t * fbuf;
-
- if (mpeg2dec->custom_fbuf) {
- if (mpeg2dec->state == STATE_SEQUENCE) {
- mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1];
- mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0];
- }
- mpeg2_set_fbuf (mpeg2dec, (mpeg2dec->decoder.coding_type ==
- PIC_FLAG_CODING_TYPE_B));
- fbuf = mpeg2dec->fbuf[0];
- } else {
- fbuf = &(mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index].fbuf);
- mpeg2dec->alloc_index_user = ++mpeg2dec->alloc_index;
- }
- fbuf->buf[0] = buf[0];
- fbuf->buf[1] = buf[1];
- fbuf->buf[2] = buf[2];
- fbuf->id = id;
- // HACK! FIXME! At first I frame, copy pointers to prediction frame too!
- if (mpeg2dec->custom_fbuf && !mpeg2dec->fbuf[1]->buf[0]){
- mpeg2dec->fbuf[1]->buf[0]=buf[0];
- mpeg2dec->fbuf[1]->buf[1]=buf[1];
- mpeg2dec->fbuf[1]->buf[2]=buf[2];
- mpeg2dec->fbuf[1]->id=NULL;
- }
-// printf("libmpeg2: FBUF 0:%p 1:%p 2:%p\n",
-// mpeg2dec->fbuf[0]->buf[0],mpeg2dec->fbuf[1]->buf[0],mpeg2dec->fbuf[2]->buf[0]);
-}
-
-void mpeg2_custom_fbuf (mpeg2dec_t * mpeg2dec, int custom_fbuf)
-{
- mpeg2dec->custom_fbuf = custom_fbuf;
-}
-
-void mpeg2_skip (mpeg2dec_t * mpeg2dec, int skip)
-{
- mpeg2dec->first_decode_slice = 1;
- mpeg2dec->nb_decode_slices = skip ? 0 : (0xb0 - 1);
-}
-
-void mpeg2_slice_region (mpeg2dec_t * mpeg2dec, int start, int end)
-{
- start = (start < 1) ? 1 : (start > 0xb0) ? 0xb0 : start;
- end = (end < start) ? start : (end > 0xb0) ? 0xb0 : end;
- mpeg2dec->first_decode_slice = start;
- mpeg2dec->nb_decode_slices = end - start;
-}
-
-void mpeg2_tag_picture (mpeg2dec_t * mpeg2dec, uint32_t tag, uint32_t tag2)
-{
- mpeg2dec->tag_previous = mpeg2dec->tag_current;
- mpeg2dec->tag2_previous = mpeg2dec->tag2_current;
- mpeg2dec->tag_current = tag;
- mpeg2dec->tag2_current = tag2;
- mpeg2dec->num_tags++;
- mpeg2dec->bytes_since_tag = 0;
-}
-
-uint32_t mpeg2_accel (uint32_t accel)
-{
- if (!mpeg2_accels) {
- mpeg2_accels = mpeg2_detect_accel (accel) | MPEG2_ACCEL_DETECT;
- mpeg2_cpu_state_init (mpeg2_accels);
- mpeg2_idct_init (mpeg2_accels);
- mpeg2_mc_init (mpeg2_accels);
- }
- return mpeg2_accels & ~MPEG2_ACCEL_DETECT;
-}
-
-void mpeg2_reset (mpeg2dec_t * mpeg2dec, int full_reset)
-{
- mpeg2dec->buf_start = mpeg2dec->buf_end = NULL;
- mpeg2dec->num_tags = 0;
- mpeg2dec->shift = 0xffffff00;
- mpeg2dec->code = 0xb4;
- mpeg2dec->action = mpeg2_seek_header;
- mpeg2dec->state = STATE_INVALID;
- mpeg2dec->first = 1;
-
- mpeg2_reset_info(&(mpeg2dec->info));
- mpeg2dec->info.gop = NULL;
- mpeg2dec->info.user_data = NULL;
- mpeg2dec->info.user_data_len = 0;
- if (full_reset) {
- mpeg2dec->info.sequence = NULL;
- mpeg2_header_state_init (mpeg2dec);
- }
-
-}
-
-mpeg2dec_t * mpeg2_init (void)
-{
- mpeg2dec_t * mpeg2dec;
-
- mpeg2_accel (MPEG2_ACCEL_DETECT);
-
- mpeg2dec = (mpeg2dec_t *) mpeg2_malloc (sizeof (mpeg2dec_t),
- MPEG2_ALLOC_MPEG2DEC);
- if (mpeg2dec == NULL)
- return NULL;
-
- memset (mpeg2dec->decoder.DCTblock, 0, 64 * sizeof (int16_t));
- memset (mpeg2dec->quantizer_matrix, 0, 4 * 64 * sizeof (uint8_t));
-
- mpeg2dec->chunk_buffer = (uint8_t *) mpeg2_malloc (BUFFER_SIZE + 4,
- MPEG2_ALLOC_CHUNK);
-
- mpeg2dec->sequence.width = (unsigned)-1;
- mpeg2_reset (mpeg2dec, 1);
-
- return mpeg2dec;
-}
-
-void mpeg2_close (mpeg2dec_t * mpeg2dec)
-{
- mpeg2_header_state_init (mpeg2dec);
- mpeg2_free (mpeg2dec->chunk_buffer);
- mpeg2_free (mpeg2dec);
-}
diff --git a/libmpeg2/header.c b/libmpeg2/header.c
deleted file mode 100644
index 10786bd6d9..0000000000
--- a/libmpeg2/header.c
+++ /dev/null
@@ -1,972 +0,0 @@
-/*
- * header.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 2003 Regis Duchesne <hpreg@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
- * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id$
- */
-
-#include "config.h"
-
-#include <inttypes.h>
-#include <stdlib.h> /* defines NULL */
-#include <string.h> /* memcmp */
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-#define SEQ_EXT 2
-#define SEQ_DISPLAY_EXT 4
-#define QUANT_MATRIX_EXT 8
-#define COPYRIGHT_EXT 0x10
-#define PIC_DISPLAY_EXT 0x80
-#define PIC_CODING_EXT 0x100
-
-/* default intra quant matrix, in zig-zag order */
-static const uint8_t default_intra_quantizer_matrix[64] ATTR_ALIGN(16) = {
- 8,
- 16, 16,
- 19, 16, 19,
- 22, 22, 22, 22,
- 22, 22, 26, 24, 26,
- 27, 27, 27, 26, 26, 26,
- 26, 27, 27, 27, 29, 29, 29,
- 34, 34, 34, 29, 29, 29, 27, 27,
- 29, 29, 32, 32, 34, 34, 37,
- 38, 37, 35, 35, 34, 35,
- 38, 38, 40, 40, 40,
- 48, 48, 46, 46,
- 56, 56, 58,
- 69, 69,
- 83
-};
-
-uint8_t mpeg2_scan_norm[64] ATTR_ALIGN(16) = {
- /* Zig-Zag scan pattern */
- 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
-};
-
-uint8_t mpeg2_scan_alt[64] ATTR_ALIGN(16) = {
- /* Alternate scan pattern */
- 0, 8, 16, 24, 1, 9, 2, 10, 17, 25, 32, 40, 48, 56, 57, 49,
- 41, 33, 26, 18, 3, 11, 4, 12, 19, 27, 34, 42, 50, 58, 35, 43,
- 51, 59, 20, 28, 5, 13, 6, 14, 21, 29, 36, 44, 52, 60, 37, 45,
- 53, 61, 22, 30, 7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63
-};
-
-void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec)
-{
- if (mpeg2dec->sequence.width != (unsigned)-1) {
- int i;
-
- mpeg2dec->sequence.width = (unsigned)-1;
- if (!mpeg2dec->custom_fbuf)
- for (i = mpeg2dec->alloc_index_user;
- i < mpeg2dec->alloc_index; i++) {
- mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[0]);
- mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[1]);
- mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[2]);
- }
- if (mpeg2dec->convert_start)
- for (i = 0; i < 3; i++) {
- mpeg2_free (mpeg2dec->yuv_buf[i][0]);
- mpeg2_free (mpeg2dec->yuv_buf[i][1]);
- mpeg2_free (mpeg2dec->yuv_buf[i][2]);
- }
- if (mpeg2dec->decoder.convert_id)
- mpeg2_free (mpeg2dec->decoder.convert_id);
- }
- mpeg2dec->decoder.coding_type = I_TYPE;
- mpeg2dec->decoder.convert = NULL;
- mpeg2dec->decoder.convert_id = NULL;
- mpeg2dec->picture = mpeg2dec->pictures;
- memset(&mpeg2dec->fbuf_alloc[0].fbuf, 0, sizeof(mpeg2_fbuf_t));
- memset(&mpeg2dec->fbuf_alloc[1].fbuf, 0, sizeof(mpeg2_fbuf_t));
- memset(&mpeg2dec->fbuf_alloc[2].fbuf, 0, sizeof(mpeg2_fbuf_t));
- mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf;
- mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf;
- mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf;
- mpeg2dec->first = 1;
- mpeg2dec->alloc_index = 0;
- mpeg2dec->alloc_index_user = 0;
- mpeg2dec->first_decode_slice = 1;
- mpeg2dec->nb_decode_slices = 0xb0 - 1;
- mpeg2dec->convert = NULL;
- mpeg2dec->convert_start = NULL;
- mpeg2dec->custom_fbuf = 0;
- mpeg2dec->yuv_index = 0;
-}
-
-void mpeg2_reset_info (mpeg2_info_t * info)
-{
- info->current_picture = info->current_picture_2nd = NULL;
- info->display_picture = info->display_picture_2nd = NULL;
- info->current_fbuf = info->display_fbuf = info->discard_fbuf = NULL;
-}
-
-static void info_user_data (mpeg2dec_t * mpeg2dec)
-{
- if (mpeg2dec->user_data_len) {
- mpeg2dec->info.user_data = mpeg2dec->chunk_buffer;
- mpeg2dec->info.user_data_len = mpeg2dec->user_data_len - 3;
- }
-}
-
-int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec)
-{
- uint8_t * buffer = mpeg2dec->chunk_start;
- mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence);
- static unsigned int frame_period[16] = {
- 0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000,
- /* unofficial: xing 15 fps */
- 1800000,
- /* unofficial: libmpeg3 "Unofficial economy rates" 5/10/12/15 fps */
- 5400000, 2700000, 2250000, 1800000, 0, 0
- };
- int i;
-
- if ((buffer[6] & 0x20) != 0x20) /* missing marker_bit */
- return 1;
-
- i = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
- if (! (sequence->display_width = sequence->picture_width = i >> 12))
- return 1;
- if (! (sequence->display_height = sequence->picture_height = i & 0xfff))
- return 1;
- sequence->width = (sequence->picture_width + 15) & ~15;
- sequence->height = (sequence->picture_height + 15) & ~15;
- sequence->chroma_width = sequence->width >> 1;
- sequence->chroma_height = sequence->height >> 1;
-
- sequence->flags = (SEQ_FLAG_PROGRESSIVE_SEQUENCE |
- SEQ_VIDEO_FORMAT_UNSPECIFIED);
-
- sequence->pixel_width = buffer[3] >> 4; /* aspect ratio */
- sequence->frame_period = frame_period[buffer[3] & 15];
-
- sequence->byte_rate = (buffer[4]<<10) | (buffer[5]<<2) | (buffer[6]>>6);
-
- sequence->vbv_buffer_size = ((buffer[6]<<16)|(buffer[7]<<8))&0x1ff800;
-
- if (buffer[7] & 4)
- sequence->flags |= SEQ_FLAG_CONSTRAINED_PARAMETERS;
-
- mpeg2dec->copy_matrix = 3;
- if (buffer[7] & 2) {
- for (i = 0; i < 64; i++)
- mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] =
- (buffer[i+7] << 7) | (buffer[i+8] >> 1);
- buffer += 64;
- } else
- for (i = 0; i < 64; i++)
- mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] =
- default_intra_quantizer_matrix[i];
-
- if (buffer[7] & 1)
- for (i = 0; i < 64; i++)
- mpeg2dec->new_quantizer_matrix[1][mpeg2_scan_norm[i]] =
- buffer[i+8];
- else
- memset (mpeg2dec->new_quantizer_matrix[1], 16, 64);
-
- sequence->profile_level_id = 0x80;
- sequence->colour_primaries = 0;
- sequence->transfer_characteristics = 0;
- sequence->matrix_coefficients = 0;
-
- mpeg2dec->ext_state = SEQ_EXT;
- mpeg2dec->state = STATE_SEQUENCE;
- mpeg2dec->display_offset_x = mpeg2dec->display_offset_y = 0;
-
- return 0;
-}
-
-static int sequence_ext (mpeg2dec_t * mpeg2dec)
-{
- uint8_t * buffer = mpeg2dec->chunk_start;
- mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence);
- uint32_t flags;
-
- if (!(buffer[3] & 1))
- return 1;
-
- sequence->profile_level_id = (buffer[0] << 4) | (buffer[1] >> 4);
-
- sequence->display_width = sequence->picture_width +=
- ((buffer[1] << 13) | (buffer[2] << 5)) & 0x3000;
- sequence->display_height = sequence->picture_height +=
- (buffer[2] << 7) & 0x3000;
- sequence->width = (sequence->picture_width + 15) & ~15;
- sequence->height = (sequence->picture_height + 15) & ~15;
- flags = sequence->flags | SEQ_FLAG_MPEG2;
- if (!(buffer[1] & 8)) {
- flags &= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE;
- sequence->height = (sequence->height + 31) & ~31;
- }
- if (buffer[5] & 0x80)
- flags |= SEQ_FLAG_LOW_DELAY;
- sequence->flags = flags;
- sequence->chroma_width = sequence->width;
- sequence->chroma_height = sequence->height;
- switch (buffer[1] & 6) {
- case 0: /* invalid */
- return 1;
- case 2: /* 4:2:0 */
- sequence->chroma_height >>= 1;
- case 4: /* 4:2:2 */
- sequence->chroma_width >>= 1;
- }
-
- sequence->byte_rate += ((buffer[2]<<25) | (buffer[3]<<17)) & 0x3ffc0000;
-
- sequence->vbv_buffer_size |= buffer[4] << 21;
-
- sequence->frame_period =
- sequence->frame_period * ((buffer[5]&31)+1) / (((buffer[5]>>5)&3)+1);
-
- mpeg2dec->ext_state = SEQ_DISPLAY_EXT;
-
- return 0;
-}
-
-static int sequence_display_ext (mpeg2dec_t * mpeg2dec)
-{
- uint8_t * buffer = mpeg2dec->chunk_start;
- mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence);
-
- sequence->flags = ((sequence->flags & ~SEQ_MASK_VIDEO_FORMAT) |
- ((buffer[0]<<4) & SEQ_MASK_VIDEO_FORMAT));
- if (buffer[0] & 1) {
- sequence->flags |= SEQ_FLAG_COLOUR_DESCRIPTION;
- sequence->colour_primaries = buffer[1];
- sequence->transfer_characteristics = buffer[2];
- sequence->matrix_coefficients = buffer[3];
- buffer += 3;
- }
-
- if (!(buffer[2] & 2)) /* missing marker_bit */
- return 1;
-
- if( (buffer[1] << 6) | (buffer[2] >> 2) )
- sequence->display_width = (buffer[1] << 6) | (buffer[2] >> 2);
- if( ((buffer[2]& 1 ) << 13) | (buffer[3] << 5) | (buffer[4] >> 3) )
- sequence->display_height =
- ((buffer[2]& 1 ) << 13) | (buffer[3] << 5) | (buffer[4] >> 3);
-
- return 0;
-}
-
-static inline void simplify (unsigned int * u, unsigned int * v)
-{
- unsigned int a, b, tmp;
-
- a = *u; b = *v;
- while (a) { /* find greatest common divisor */
- tmp = a; a = b % tmp; b = tmp;
- }
- *u /= b; *v /= b;
-}
-
-static inline void finalize_sequence (mpeg2_sequence_t * sequence)
-{
- int width;
- int height;
-
- sequence->byte_rate *= 50;
-
- if (sequence->flags & SEQ_FLAG_MPEG2) {
- switch (sequence->pixel_width) {
- case 1: /* square pixels */
- sequence->pixel_width = sequence->pixel_height = 1; return;
- case 2: /* 4:3 aspect ratio */
- width = 4; height = 3; break;
- case 3: /* 16:9 aspect ratio */
- width = 16; height = 9; break;
- case 4: /* 2.21:1 aspect ratio */
- width = 221; height = 100; break;
- default: /* illegal */
- sequence->pixel_width = sequence->pixel_height = 0; return;
- }
- width *= sequence->display_height;
- height *= sequence->display_width;
-
- } else {
- if (sequence->byte_rate == 50 * 0x3ffff)
- sequence->byte_rate = 0; /* mpeg-1 VBR */
-
- switch (sequence->pixel_width) {
- case 0: case 15: /* illegal */
- sequence->pixel_width = sequence->pixel_height = 0; return;
- case 1: /* square pixels */
- sequence->pixel_width = sequence->pixel_height = 1; return;
- case 3: /* 720x576 16:9 */
- sequence->pixel_width = 64; sequence->pixel_height = 45; return;
- case 6: /* 720x480 16:9 */
- sequence->pixel_width = 32; sequence->pixel_height = 27; return;
- case 8: /* BT.601 625 lines 4:3 */
- sequence->pixel_width = 59; sequence->pixel_height = 54; return;
- case 12: /* BT.601 525 lines 4:3 */
- sequence->pixel_width = 10; sequence->pixel_height = 11; return;
- default:
- height = 88 * sequence->pixel_width + 1171;
- width = 2000;
- }
- }
-
- sequence->pixel_width = width;
- sequence->pixel_height = height;
- simplify (&sequence->pixel_width, &sequence->pixel_height);
-}
-
-int mpeg2_guess_aspect (const mpeg2_sequence_t * sequence,
- unsigned int * pixel_width,
- unsigned int * pixel_height)
-{
- static struct {
- unsigned int width, height;
- } video_modes[] = {
- {720, 576}, /* 625 lines, 13.5 MHz (D1, DV, DVB, DVD) */
- {704, 576}, /* 625 lines, 13.5 MHz (1/1 D1, DVB, DVD, 4CIF) */
- {544, 576}, /* 625 lines, 10.125 MHz (DVB, laserdisc) */
- {528, 576}, /* 625 lines, 10.125 MHz (3/4 D1, DVB, laserdisc) */
- {480, 576}, /* 625 lines, 9 MHz (2/3 D1, DVB, SVCD) */
- {352, 576}, /* 625 lines, 6.75 MHz (D2, 1/2 D1, CVD, DVB, DVD) */
- {352, 288}, /* 625 lines, 6.75 MHz, 1 field (D4, VCD, DVB, DVD, CIF) */
- {176, 144}, /* 625 lines, 3.375 MHz, half field (QCIF) */
- {720, 486}, /* 525 lines, 13.5 MHz (D1) */
- {704, 486}, /* 525 lines, 13.5 MHz */
- {720, 480}, /* 525 lines, 13.5 MHz (DV, DSS, DVD) */
- {704, 480}, /* 525 lines, 13.5 MHz (1/1 D1, ATSC, DVD) */
- {544, 480}, /* 525 lines. 10.125 MHz (DSS, laserdisc) */
- {528, 480}, /* 525 lines. 10.125 MHz (3/4 D1, laserdisc) */
- {480, 480}, /* 525 lines, 9 MHz (2/3 D1, SVCD) */
- {352, 480}, /* 525 lines, 6.75 MHz (D2, 1/2 D1, CVD, DVD) */
- {352, 240} /* 525 lines. 6.75 MHz, 1 field (D4, VCD, DSS, DVD) */
- };
- unsigned int width, height, pix_width, pix_height, i, DAR_16_9;
-
- *pixel_width = sequence->pixel_width;
- *pixel_height = sequence->pixel_height;
- width = sequence->picture_width;
- height = sequence->picture_height;
- for (i = 0; i < sizeof (video_modes) / sizeof (video_modes[0]); i++)
- if (width == video_modes[i].width && height == video_modes[i].height)
- break;
- if (i == sizeof (video_modes) / sizeof (video_modes[0]) ||
- (sequence->pixel_width == 1 && sequence->pixel_height == 1) ||
- width != sequence->display_width || height != sequence->display_height)
- return 0;
-
- for (pix_height = 1; height * pix_height < 480; pix_height <<= 1);
- height *= pix_height;
- for (pix_width = 1; width * pix_width <= 352; pix_width <<= 1);
- width *= pix_width;
-
- if (! (sequence->flags & SEQ_FLAG_MPEG2)) {
- static unsigned int mpeg1_check[2][2] = {{11, 54}, {27, 45}};
- DAR_16_9 = (sequence->pixel_height == 27 ||
- sequence->pixel_height == 45);
- if (width < 704 ||
- sequence->pixel_height != mpeg1_check[DAR_16_9][height == 576])
- return 0;
- } else {
- DAR_16_9 = (3 * sequence->picture_width * sequence->pixel_width >
- 4 * sequence->picture_height * sequence->pixel_height);
- switch (width) {
- case 528: case 544: pix_width *= 4; pix_height *= 3; break;
- case 480: pix_width *= 3; pix_height *= 2; break;
- }
- }
- if (DAR_16_9) {
- pix_width *= 4; pix_height *= 3;
- }
- if (height == 576) {
- pix_width *= 59; pix_height *= 54;
- } else {
- pix_width *= 10; pix_height *= 11;
- }
- *pixel_width = pix_width;
- *pixel_height = pix_height;
- simplify (pixel_width, pixel_height);
- return (height == 576) ? 1 : 2;
-}
-
-static void copy_matrix (mpeg2dec_t * mpeg2dec, int idx)
-{
- if (memcmp (mpeg2dec->quantizer_matrix[idx],
- mpeg2dec->new_quantizer_matrix[idx], 64)) {
- memcpy (mpeg2dec->quantizer_matrix[idx],
- mpeg2dec->new_quantizer_matrix[idx], 64);
- mpeg2dec->scaled[idx] = -1;
- }
-}
-
-static void finalize_matrix (mpeg2dec_t * mpeg2dec)
-{
- mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
- int i;
-
- for (i = 0; i < 2; i++) {
- if (mpeg2dec->copy_matrix & (1 << i))
- copy_matrix (mpeg2dec, i);
- if ((mpeg2dec->copy_matrix & (4 << i)) &&
- memcmp (mpeg2dec->quantizer_matrix[i],
- mpeg2dec->new_quantizer_matrix[i+2], 64)) {
- copy_matrix (mpeg2dec, i + 2);
- decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i+2];
- } else if (mpeg2dec->copy_matrix & (5 << i))
- decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i];
- }
-}
-
-static mpeg2_state_t invalid_end_action (mpeg2dec_t * mpeg2dec)
-{
- mpeg2_reset_info (&(mpeg2dec->info));
- mpeg2dec->info.gop = NULL;
- info_user_data (mpeg2dec);
- mpeg2_header_state_init (mpeg2dec);
- mpeg2dec->sequence = mpeg2dec->new_sequence;
- mpeg2dec->action = mpeg2_seek_header;
- mpeg2dec->state = STATE_SEQUENCE;
- return STATE_SEQUENCE;
-}
-
-void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec)
-{
- mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence);
- mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
-
- finalize_sequence (sequence);
- finalize_matrix (mpeg2dec);
-
- decoder->mpeg1 = !(sequence->flags & SEQ_FLAG_MPEG2);
- decoder->width = sequence->width;
- decoder->height = sequence->height;
- decoder->vertical_position_extension = (sequence->picture_height > 2800);
- decoder->chroma_format = ((sequence->chroma_width == sequence->width) +
- (sequence->chroma_height == sequence->height));
-
- if (mpeg2dec->sequence.width != (unsigned)-1) {
- /*
- * According to 6.1.1.6, repeat sequence headers should be
- * identical to the original. However some encoders do not
- * respect that and change various fields (including bitrate
- * and aspect ratio) in the repeat sequence headers. So we
- * choose to be as conservative as possible and only restart
- * the decoder if the width, height, chroma_width,
- * chroma_height or low_delay flag are modified.
- */
- if (sequence->width != mpeg2dec->sequence.width ||
- sequence->height != mpeg2dec->sequence.height ||
- sequence->chroma_width != mpeg2dec->sequence.chroma_width ||
- sequence->chroma_height != mpeg2dec->sequence.chroma_height ||
- ((sequence->flags ^ mpeg2dec->sequence.flags) &
- SEQ_FLAG_LOW_DELAY)) {
- decoder->stride_frame = sequence->width;
- mpeg2_header_end (mpeg2dec);
- mpeg2dec->action = invalid_end_action;
- mpeg2dec->state = STATE_INVALID_END;
- return;
- }
- mpeg2dec->state = (memcmp (&(mpeg2dec->sequence), sequence,
- sizeof (mpeg2_sequence_t)) ?
- STATE_SEQUENCE_MODIFIED : STATE_SEQUENCE_REPEATED);
- } else
- decoder->stride_frame = sequence->width;
- mpeg2dec->sequence = *sequence;
- mpeg2_reset_info (&(mpeg2dec->info));
- mpeg2dec->info.sequence = &(mpeg2dec->sequence);
- mpeg2dec->info.gop = NULL;
- info_user_data (mpeg2dec);
-}
-
-int mpeg2_header_gop (mpeg2dec_t * mpeg2dec)
-{
- uint8_t * buffer = mpeg2dec->chunk_start;
- mpeg2_gop_t * gop = &(mpeg2dec->new_gop);
-
- if (! (buffer[1] & 8))
- return 1;
- gop->hours = (buffer[0] >> 2) & 31;
- gop->minutes = ((buffer[0] << 4) | (buffer[1] >> 4)) & 63;
- gop->seconds = ((buffer[1] << 3) | (buffer[2] >> 5)) & 63;
- gop->pictures = ((buffer[2] << 1) | (buffer[3] >> 7)) & 63;
- gop->flags = (buffer[0] >> 7) | ((buffer[3] >> 4) & 6);
- mpeg2dec->state = STATE_GOP;
- return 0;
-}
-
-void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec)
-{
- mpeg2dec->gop = mpeg2dec->new_gop;
- mpeg2_reset_info (&(mpeg2dec->info));
- mpeg2dec->info.gop = &(mpeg2dec->gop);
- info_user_data (mpeg2dec);
-}
-
-void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type)
-{
- int i;
-
- for (i = 0; i < 3; i++)
- if (mpeg2dec->fbuf[1] != &mpeg2dec->fbuf_alloc[i].fbuf &&
- mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf) {
- mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf;
- mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0];
- if (b_type || (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) {
- if (b_type || mpeg2dec->convert)
- mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0];
- mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0];
- }
- break;
- }
-}
-
-int mpeg2_header_picture (mpeg2dec_t * mpeg2dec)
-{
- uint8_t * buffer = mpeg2dec->chunk_start;
- mpeg2_picture_t * picture = &(mpeg2dec->new_picture);
- mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
- int type;
-
- mpeg2dec->state = ((mpeg2dec->state != STATE_SLICE_1ST) ?
- STATE_PICTURE : STATE_PICTURE_2ND);
- mpeg2dec->ext_state = PIC_CODING_EXT;
-
- picture->temporal_reference = (buffer[0] << 2) | (buffer[1] >> 6);
-
- type = (buffer [1] >> 3) & 7;
- if (type == PIC_FLAG_CODING_TYPE_P || type == PIC_FLAG_CODING_TYPE_B) {
- /* forward_f_code and backward_f_code - used in mpeg1 only */
- decoder->f_motion.f_code[1] = (buffer[3] >> 2) & 1;
- decoder->f_motion.f_code[0] =
- (((buffer[3] << 1) | (buffer[4] >> 7)) & 7) - 1;
- decoder->b_motion.f_code[1] = (buffer[4] >> 6) & 1;
- decoder->b_motion.f_code[0] = ((buffer[4] >> 3) & 7) - 1;
- }
-
- picture->flags = PIC_FLAG_PROGRESSIVE_FRAME | type;
- picture->tag = picture->tag2 = 0;
- if (mpeg2dec->num_tags) {
- if (mpeg2dec->bytes_since_tag >= mpeg2dec->chunk_ptr - buffer + 4) {
- mpeg2dec->num_tags = 0;
- picture->tag = mpeg2dec->tag_current;
- picture->tag2 = mpeg2dec->tag2_current;
- picture->flags |= PIC_FLAG_TAGS;
- } else if (mpeg2dec->num_tags > 1) {
- mpeg2dec->num_tags = 1;
- picture->tag = mpeg2dec->tag_previous;
- picture->tag2 = mpeg2dec->tag2_previous;
- picture->flags |= PIC_FLAG_TAGS;
- }
- }
- picture->nb_fields = 2;
- picture->display_offset[0].x = picture->display_offset[1].x =
- picture->display_offset[2].x = mpeg2dec->display_offset_x;
- picture->display_offset[0].y = picture->display_offset[1].y =
- picture->display_offset[2].y = mpeg2dec->display_offset_y;
-
- /* XXXXXX decode extra_information_picture as well */
-
- decoder->q_scale_type = 0;
- decoder->intra_dc_precision = 7;
- decoder->frame_pred_frame_dct = 1;
- decoder->concealment_motion_vectors = 0;
- decoder->scan = mpeg2_scan_norm;
- decoder->picture_structure = FRAME_PICTURE;
- mpeg2dec->copy_matrix = 0;
-
- return 0;
-}
-
-static int picture_coding_ext (mpeg2dec_t * mpeg2dec)
-{
- uint8_t * buffer = mpeg2dec->chunk_start;
- mpeg2_picture_t * picture = &(mpeg2dec->new_picture);
- mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
- uint32_t flags;
-
- /* pre subtract 1 for use later in compute_motion_vector */
- decoder->f_motion.f_code[0] = (buffer[0] & 15) - 1;
- decoder->f_motion.f_code[1] = (buffer[1] >> 4) - 1;
- decoder->b_motion.f_code[0] = (buffer[1] & 15) - 1;
- decoder->b_motion.f_code[1] = (buffer[2] >> 4) - 1;
-
- flags = picture->flags;
- decoder->intra_dc_precision = 7 - ((buffer[2] >> 2) & 3);
- decoder->picture_structure = buffer[2] & 3;
- switch (decoder->picture_structure) {
- case TOP_FIELD:
- flags |= PIC_FLAG_TOP_FIELD_FIRST;
- case BOTTOM_FIELD:
- picture->nb_fields = 1;
- break;
- case FRAME_PICTURE:
- if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) {
- picture->nb_fields = (buffer[3] & 2) ? 3 : 2;
- flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0;
- flags |= (buffer[3] & 2) ? PIC_FLAG_REPEAT_FIRST_FIELD : 0;
- } else
- picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2;
- break;
- default:
- return 1;
- }
- decoder->top_field_first = buffer[3] >> 7;
- decoder->frame_pred_frame_dct = (buffer[3] >> 6) & 1;
- decoder->concealment_motion_vectors = (buffer[3] >> 5) & 1;
- decoder->q_scale_type = buffer[3] & 16;
- decoder->intra_vlc_format = (buffer[3] >> 3) & 1;
- decoder->scan = (buffer[3] & 4) ? mpeg2_scan_alt : mpeg2_scan_norm;
- if (!(buffer[4] & 0x80))
- flags &= ~PIC_FLAG_PROGRESSIVE_FRAME;
- if (buffer[4] & 0x40)
- flags |= (((buffer[4]<<26) | (buffer[5]<<18) | (buffer[6]<<10)) &
- PIC_MASK_COMPOSITE_DISPLAY) | PIC_FLAG_COMPOSITE_DISPLAY;
- picture->flags = flags;
-
- mpeg2dec->ext_state = PIC_DISPLAY_EXT | COPYRIGHT_EXT | QUANT_MATRIX_EXT;
-
- return 0;
-}
-
-static int picture_display_ext (mpeg2dec_t * mpeg2dec)
-{
- uint8_t * buffer = mpeg2dec->chunk_start;
- mpeg2_picture_t * picture = &(mpeg2dec->new_picture);
- int i, nb_pos;
-
- nb_pos = picture->nb_fields;
- if (mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)
- nb_pos >>= 1;
-
- for (i = 0; i < nb_pos; i++) {
- int x, y;
-
- x = ((buffer[4*i] << 24) | (buffer[4*i+1] << 16) |
- (buffer[4*i+2] << 8) | buffer[4*i+3]) >> (11-2*i);
- y = ((buffer[4*i+2] << 24) | (buffer[4*i+3] << 16) |
- (buffer[4*i+4] << 8) | buffer[4*i+5]) >> (10-2*i);
- if (! (x & y & 1))
- return 1;
- picture->display_offset[i].x = mpeg2dec->display_offset_x = x >> 1;
- picture->display_offset[i].y = mpeg2dec->display_offset_y = y >> 1;
- }
- for (; i < 3; i++) {
- picture->display_offset[i].x = mpeg2dec->display_offset_x;
- picture->display_offset[i].y = mpeg2dec->display_offset_y;
- }
- return 0;
-}
-
-void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels)
-{
- mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
- int old_type_b = (decoder->coding_type == B_TYPE);
- int low_delay = mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY;
-
- finalize_matrix (mpeg2dec);
- decoder->coding_type = mpeg2dec->new_picture.flags & PIC_MASK_CODING_TYPE;
-
- if (mpeg2dec->state == STATE_PICTURE) {
- mpeg2_picture_t * picture;
- mpeg2_picture_t * other;
-
- decoder->second_field = 0;
-
- picture = other = mpeg2dec->pictures;
- if (old_type_b ^ (mpeg2dec->picture < mpeg2dec->pictures + 2))
- picture += 2;
- else
- other += 2;
- mpeg2dec->picture = picture;
- *picture = mpeg2dec->new_picture;
-
- if (!old_type_b) {
- mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1];
- mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0];
- }
- mpeg2dec->fbuf[0] = NULL;
- mpeg2_reset_info (&(mpeg2dec->info));
- mpeg2dec->info.current_picture = picture;
- mpeg2dec->info.display_picture = picture;
- if (decoder->coding_type != B_TYPE) {
- if (!low_delay) {
- if (mpeg2dec->first) {
- mpeg2dec->info.display_picture = NULL;
- mpeg2dec->first = 0;
- } else {
- mpeg2dec->info.display_picture = other;
- if (other->nb_fields == 1)
- mpeg2dec->info.display_picture_2nd = other + 1;
- mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1];
- }
- }
- if (!low_delay + !mpeg2dec->convert)
- mpeg2dec->info.discard_fbuf =
- mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert];
- }
- if (mpeg2dec->convert) {
- mpeg2_convert_init_t convert_init;
- if (!mpeg2dec->convert_start) {
- int y_size, uv_size;
-
- mpeg2dec->decoder.convert_id =
- mpeg2_malloc (mpeg2dec->convert_id_size,
- MPEG2_ALLOC_CONVERT_ID);
- mpeg2dec->convert (MPEG2_CONVERT_START,
- mpeg2dec->decoder.convert_id,
- &(mpeg2dec->sequence),
- mpeg2dec->convert_stride, accels,
- mpeg2dec->convert_arg, &convert_init);
- mpeg2dec->convert_start = convert_init.start;
- mpeg2dec->decoder.convert = convert_init.copy;
-
- y_size = decoder->stride_frame * mpeg2dec->sequence.height;
- uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format);
- mpeg2dec->yuv_buf[0][0] =
- (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV);
- mpeg2dec->yuv_buf[0][1] =
- (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
- mpeg2dec->yuv_buf[0][2] =
- (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
- mpeg2dec->yuv_buf[1][0] =
- (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV);
- mpeg2dec->yuv_buf[1][1] =
- (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
- mpeg2dec->yuv_buf[1][2] =
- (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
- y_size = decoder->stride_frame * 32;
- uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format);
- mpeg2dec->yuv_buf[2][0] =
- (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV);
- mpeg2dec->yuv_buf[2][1] =
- (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
- mpeg2dec->yuv_buf[2][2] =
- (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
- }
- if (!mpeg2dec->custom_fbuf) {
- while (mpeg2dec->alloc_index < 3) {
- mpeg2_fbuf_t * fbuf;
-
- fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf;
- fbuf->id = NULL;
- fbuf->buf[0] =
- (uint8_t *) mpeg2_malloc (convert_init.buf_size[0],
- MPEG2_ALLOC_CONVERTED);
- fbuf->buf[1] =
- (uint8_t *) mpeg2_malloc (convert_init.buf_size[1],
- MPEG2_ALLOC_CONVERTED);
- fbuf->buf[2] =
- (uint8_t *) mpeg2_malloc (convert_init.buf_size[2],
- MPEG2_ALLOC_CONVERTED);
- }
- mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE));
- }
- } else if (!mpeg2dec->custom_fbuf) {
- while (mpeg2dec->alloc_index < 3) {
- mpeg2_fbuf_t * fbuf;
- int y_size, uv_size;
-
- fbuf = &(mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf);
- fbuf->id = NULL;
- y_size = decoder->stride_frame * mpeg2dec->sequence.height;
- uv_size = y_size >> (2 - decoder->chroma_format);
- fbuf->buf[0] = (uint8_t *) mpeg2_malloc (y_size,
- MPEG2_ALLOC_YUV);
- fbuf->buf[1] = (uint8_t *) mpeg2_malloc (uv_size,
- MPEG2_ALLOC_YUV);
- fbuf->buf[2] = (uint8_t *) mpeg2_malloc (uv_size,
- MPEG2_ALLOC_YUV);
- }
- mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE));
- }
- } else {
- decoder->second_field = 1;
- mpeg2dec->picture++; /* second field picture */
- *(mpeg2dec->picture) = mpeg2dec->new_picture;
- mpeg2dec->info.current_picture_2nd = mpeg2dec->picture;
- if (low_delay || decoder->coding_type == B_TYPE)
- mpeg2dec->info.display_picture_2nd = mpeg2dec->picture;
- }
-
- info_user_data (mpeg2dec);
-}
-
-static int copyright_ext (mpeg2dec_t * mpeg2dec)
-{
- return 0;
-}
-
-static int quant_matrix_ext (mpeg2dec_t * mpeg2dec)
-{
- uint8_t * buffer = mpeg2dec->chunk_start;
- int i, j;
-
- for (i = 0; i < 4; i++)
- if (buffer[0] & (8 >> i)) {
- for (j = 0; j < 64; j++)
- mpeg2dec->new_quantizer_matrix[i][mpeg2_scan_norm[j]] =
- (buffer[j] << (i+5)) | (buffer[j+1] >> (3-i));
- mpeg2dec->copy_matrix |= 1 << i;
- buffer += 64;
- }
-
- return 0;
-}
-
-int mpeg2_header_extension (mpeg2dec_t * mpeg2dec)
-{
- static int (* parser[]) (mpeg2dec_t *) = {
- 0, sequence_ext, sequence_display_ext, quant_matrix_ext,
- copyright_ext, 0, 0, picture_display_ext, picture_coding_ext
- };
- int ext, ext_bit;
-
- ext = mpeg2dec->chunk_start[0] >> 4;
- ext_bit = 1 << ext;
-
- if (!(mpeg2dec->ext_state & ext_bit))
- return 0; /* ignore illegal extensions */
- mpeg2dec->ext_state &= ~ext_bit;
- return parser[ext] (mpeg2dec);
-}
-
-int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec)
-{
- mpeg2dec->user_data_len += mpeg2dec->chunk_ptr - 1 - mpeg2dec->chunk_start;
- mpeg2dec->chunk_start = mpeg2dec->chunk_ptr - 1;
-
- return 0;
-}
-
-static void prescale (mpeg2dec_t * mpeg2dec, int idx)
-{
- static int non_linear_scale [] = {
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 10, 12, 14, 16, 18, 20, 22,
- 24, 28, 32, 36, 40, 44, 48, 52,
- 56, 64, 72, 80, 88, 96, 104, 112
- };
- int i, j, k;
- mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
-
- if (mpeg2dec->scaled[idx] != decoder->q_scale_type) {
- mpeg2dec->scaled[idx] = decoder->q_scale_type;
- for (i = 0; i < 32; i++) {
- k = decoder->q_scale_type ? non_linear_scale[i] : (i << 1);
- decoder->quantizer_scales[i] = k;
- for (j = 0; j < 64; j++)
- decoder->quantizer_prescale[idx][i][j] =
- k * mpeg2dec->quantizer_matrix[idx][j];
- }
- }
-}
-
-mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec)
-{
- mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
-
- mpeg2dec->info.user_data = NULL; mpeg2dec->info.user_data_len = 0;
- mpeg2dec->state = ((mpeg2dec->picture->nb_fields > 1 ||
- mpeg2dec->state == STATE_PICTURE_2ND) ?
- STATE_SLICE : STATE_SLICE_1ST);
-
- if (mpeg2dec->decoder.coding_type != D_TYPE) {
- prescale (mpeg2dec, 0);
- if (decoder->chroma_quantizer[0] == decoder->quantizer_prescale[2])
- prescale (mpeg2dec, 2);
- if (mpeg2dec->decoder.coding_type != I_TYPE) {
- prescale (mpeg2dec, 1);
- if (decoder->chroma_quantizer[1] == decoder->quantizer_prescale[3])
- prescale (mpeg2dec, 3);
- }
- }
-
- if (!(mpeg2dec->nb_decode_slices))
- mpeg2dec->picture->flags |= PIC_FLAG_SKIP;
- else if (mpeg2dec->convert_start) {
- mpeg2dec->convert_start (decoder->convert_id, mpeg2dec->fbuf[0],
- mpeg2dec->picture, mpeg2dec->info.gop);
-
- if (mpeg2dec->decoder.coding_type == B_TYPE)
- mpeg2_init_fbuf (&(mpeg2dec->decoder), mpeg2dec->yuv_buf[2],
- mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1],
- mpeg2dec->yuv_buf[mpeg2dec->yuv_index]);
- else {
- mpeg2_init_fbuf (&(mpeg2dec->decoder),
- mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1],
- mpeg2dec->yuv_buf[mpeg2dec->yuv_index],
- mpeg2dec->yuv_buf[mpeg2dec->yuv_index]);
- if (mpeg2dec->state == STATE_SLICE)
- mpeg2dec->yuv_index ^= 1;
- }
- } else {
- int b_type;
-
- b_type = (mpeg2dec->decoder.coding_type == B_TYPE);
- mpeg2_init_fbuf (&(mpeg2dec->decoder), mpeg2dec->fbuf[0]->buf,
- mpeg2dec->fbuf[b_type + 1]->buf,
- mpeg2dec->fbuf[b_type]->buf);
- }
- mpeg2dec->action = NULL;
- return STATE_INTERNAL_NORETURN;
-}
-
-static mpeg2_state_t seek_sequence (mpeg2dec_t * mpeg2dec)
-{
- mpeg2_reset_info (&(mpeg2dec->info));
- mpeg2dec->info.sequence = NULL;
- mpeg2dec->info.gop = NULL;
- mpeg2_header_state_init (mpeg2dec);
- mpeg2dec->action = mpeg2_seek_header;
- return mpeg2_seek_header (mpeg2dec);
-}
-
-mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec)
-{
- mpeg2_picture_t * picture;
- int b_type;
-
- b_type = (mpeg2dec->decoder.coding_type == B_TYPE);
- picture = mpeg2dec->pictures;
- if ((mpeg2dec->picture >= picture + 2) ^ b_type)
- picture = mpeg2dec->pictures + 2;
-
- mpeg2_reset_info (&(mpeg2dec->info));
- if (!(mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) {
- mpeg2dec->info.display_picture = picture;
- if (picture->nb_fields == 1)
- mpeg2dec->info.display_picture_2nd = picture + 1;
- mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type];
- if (!mpeg2dec->convert)
- mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1];
- } else if (!mpeg2dec->convert)
- mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type];
- mpeg2dec->action = seek_sequence;
- return STATE_END;
-}
diff --git a/libmpeg2/idct.c b/libmpeg2/idct.c
deleted file mode 100644
index 09a81159eb..0000000000
--- a/libmpeg2/idct.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * idct.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
- * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id$
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-#define W1 2841 /* 2048 * sqrt (2) * cos (1 * pi / 16) */
-#define W2 2676 /* 2048 * sqrt (2) * cos (2 * pi / 16) */
-#define W3 2408 /* 2048 * sqrt (2) * cos (3 * pi / 16) */
-#define W5 1609 /* 2048 * sqrt (2) * cos (5 * pi / 16) */
-#define W6 1108 /* 2048 * sqrt (2) * cos (6 * pi / 16) */
-#define W7 565 /* 2048 * sqrt (2) * cos (7 * pi / 16) */
-
-/* idct main entry point */
-void (* mpeg2_idct_copy) (int16_t * block, uint8_t * dest, int stride);
-void (* mpeg2_idct_add) (int last, int16_t * block,
- uint8_t * dest, int stride);
-
-/*
- * In legal streams, the IDCT output should be between -384 and +384.
- * In corrupted streams, it is possible to force the IDCT output to go
- * to +-3826 - this is the worst case for a column IDCT where the
- * column inputs are 16-bit values.
- */
-uint8_t mpeg2_clip[3840 * 2 + 256];
-#define CLIP(i) ((mpeg2_clip + 3840)[i])
-
-#if 0
-#define BUTTERFLY(t0,t1,W0,W1,d0,d1) \
-do { \
- t0 = W0 * d0 + W1 * d1; \
- t1 = W0 * d1 - W1 * d0; \
-} while (0)
-#else
-#define BUTTERFLY(t0,t1,W0,W1,d0,d1) \
-do { \
- int tmp = W0 * (d0 + d1); \
- t0 = tmp + (W1 - W0) * d1; \
- t1 = tmp - (W1 + W0) * d0; \
-} while (0)
-#endif
-
-static inline void idct_row (int16_t * const block)
-{
- int d0, d1, d2, d3;
- int a0, a1, a2, a3, b0, b1, b2, b3;
- int t0, t1, t2, t3;
-
- /* shortcut */
- if (likely (!(block[1] | ((int32_t *)block)[1] | ((int32_t *)block)[2] |
- ((int32_t *)block)[3]))) {
- uint32_t tmp = (uint16_t) (block[0] >> 1);
- tmp |= tmp << 16;
- ((int32_t *)block)[0] = tmp;
- ((int32_t *)block)[1] = tmp;
- ((int32_t *)block)[2] = tmp;
- ((int32_t *)block)[3] = tmp;
- return;
- }
-
- d0 = (block[0] << 11) + 2048;
- d1 = block[1];
- d2 = block[2] << 11;
- d3 = block[3];
- t0 = d0 + d2;
- t1 = d0 - d2;
- BUTTERFLY (t2, t3, W6, W2, d3, d1);
- a0 = t0 + t2;
- a1 = t1 + t3;
- a2 = t1 - t3;
- a3 = t0 - t2;
-
- d0 = block[4];
- d1 = block[5];
- d2 = block[6];
- d3 = block[7];
- BUTTERFLY (t0, t1, W7, W1, d3, d0);
- BUTTERFLY (t2, t3, W3, W5, d1, d2);
- b0 = t0 + t2;
- b3 = t1 + t3;
- t0 -= t2;
- t1 -= t3;
- b1 = ((t0 + t1) >> 8) * 181;
- b2 = ((t0 - t1) >> 8) * 181;
-
- block[0] = (a0 + b0) >> 12;
- block[1] = (a1 + b1) >> 12;
- block[2] = (a2 + b2) >> 12;
- block[3] = (a3 + b3) >> 12;
- block[4] = (a3 - b3) >> 12;
- block[5] = (a2 - b2) >> 12;
- block[6] = (a1 - b1) >> 12;
- block[7] = (a0 - b0) >> 12;
-}
-
-static inline void idct_col (int16_t * const block)
-{
- int d0, d1, d2, d3;
- int a0, a1, a2, a3, b0, b1, b2, b3;
- int t0, t1, t2, t3;
-
- d0 = (block[8*0] << 11) + 65536;
- d1 = block[8*1];
- d2 = block[8*2] << 11;
- d3 = block[8*3];
- t0 = d0 + d2;
- t1 = d0 - d2;
- BUTTERFLY (t2, t3, W6, W2, d3, d1);
- a0 = t0 + t2;
- a1 = t1 + t3;
- a2 = t1 - t3;
- a3 = t0 - t2;
-
- d0 = block[8*4];
- d1 = block[8*5];
- d2 = block[8*6];
- d3 = block[8*7];
- BUTTERFLY (t0, t1, W7, W1, d3, d0);
- BUTTERFLY (t2, t3, W3, W5, d1, d2);
- b0 = t0 + t2;
- b3 = t1 + t3;
- t0 -= t2;
- t1 -= t3;
- b1 = ((t0 + t1) >> 8) * 181;
- b2 = ((t0 - t1) >> 8) * 181;
-
- block[8*0] = (a0 + b0) >> 17;
- block[8*1] = (a1 + b1) >> 17;
- block[8*2] = (a2 + b2) >> 17;
- block[8*3] = (a3 + b3) >> 17;
- block[8*4] = (a3 - b3) >> 17;
- block[8*5] = (a2 - b2) >> 17;
- block[8*6] = (a1 - b1) >> 17;
- block[8*7] = (a0 - b0) >> 17;
-}
-
-static void mpeg2_idct_copy_c (int16_t * block, uint8_t * dest,
- const int stride)
-{
- int i;
-
- for (i = 0; i < 8; i++)
- idct_row (block + 8 * i);
- for (i = 0; i < 8; i++)
- idct_col (block + i);
- do {
- dest[0] = CLIP (block[0]);
- dest[1] = CLIP (block[1]);
- dest[2] = CLIP (block[2]);
- dest[3] = CLIP (block[3]);
- dest[4] = CLIP (block[4]);
- dest[5] = CLIP (block[5]);
- dest[6] = CLIP (block[6]);
- dest[7] = CLIP (block[7]);
-
- ((int32_t *)block)[0] = 0; ((int32_t *)block)[1] = 0;
- ((int32_t *)block)[2] = 0; ((int32_t *)block)[3] = 0;
-
- dest += stride;
- block += 8;
- } while (--i);
-}
-
-static void mpeg2_idct_add_c (const int last, int16_t * block,
- uint8_t * dest, const int stride)
-{
- int i;
-
- if (last != 129 || (block[0] & (7 << 4)) == (4 << 4)) {
- for (i = 0; i < 8; i++)
- idct_row (block + 8 * i);
- for (i = 0; i < 8; i++)
- idct_col (block + i);
- do {
- dest[0] = CLIP (block[0] + dest[0]);
- dest[1] = CLIP (block[1] + dest[1]);
- dest[2] = CLIP (block[2] + dest[2]);
- dest[3] = CLIP (block[3] + dest[3]);
- dest[4] = CLIP (block[4] + dest[4]);
- dest[5] = CLIP (block[5] + dest[5]);
- dest[6] = CLIP (block[6] + dest[6]);
- dest[7] = CLIP (block[7] + dest[7]);
-
- ((int32_t *)block)[0] = 0; ((int32_t *)block)[1] = 0;
- ((int32_t *)block)[2] = 0; ((int32_t *)block)[3] = 0;
-
- dest += stride;
- block += 8;
- } while (--i);
- } else {
- int DC;
-
- DC = (block[0] + 64) >> 7;
- block[0] = block[63] = 0;
- i = 8;
- do {
- dest[0] = CLIP (DC + dest[0]);
- dest[1] = CLIP (DC + dest[1]);
- dest[2] = CLIP (DC + dest[2]);
- dest[3] = CLIP (DC + dest[3]);
- dest[4] = CLIP (DC + dest[4]);
- dest[5] = CLIP (DC + dest[5]);
- dest[6] = CLIP (DC + dest[6]);
- dest[7] = CLIP (DC + dest[7]);
- dest += stride;
- } while (--i);
- }
-}
-
-void mpeg2_idct_init (uint32_t accel)
-{
-#if HAVE_SSE2
- if (accel & MPEG2_ACCEL_X86_SSE2) {
- mpeg2_idct_copy = mpeg2_idct_copy_sse2;
- mpeg2_idct_add = mpeg2_idct_add_sse2;
- mpeg2_idct_mmx_init ();
- } else
-#elif HAVE_MMX2
- if (accel & MPEG2_ACCEL_X86_MMXEXT) {
- mpeg2_idct_copy = mpeg2_idct_copy_mmxext;
- mpeg2_idct_add = mpeg2_idct_add_mmxext;
- mpeg2_idct_mmx_init ();
- } else
-#elif HAVE_MMX
- if (accel & MPEG2_ACCEL_X86_MMX) {
- mpeg2_idct_copy = mpeg2_idct_copy_mmx;
- mpeg2_idct_add = mpeg2_idct_add_mmx;
- mpeg2_idct_mmx_init ();
- } else
-#endif
-#if HAVE_ALTIVEC
- if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
- mpeg2_idct_copy = mpeg2_idct_copy_altivec;
- mpeg2_idct_add = mpeg2_idct_add_altivec;
- mpeg2_idct_altivec_init ();
- } else
-#endif
-#if HAVE_MVI
- if (accel & MPEG2_ACCEL_ALPHA_MVI) {
- mpeg2_idct_copy = mpeg2_idct_copy_mvi;
- mpeg2_idct_add = mpeg2_idct_add_mvi;
- mpeg2_idct_alpha_init ();
- } else
-#elif ARCH_ALPHA
- if (accel & MPEG2_ACCEL_ALPHA) {
- int i;
-
- mpeg2_idct_copy = mpeg2_idct_copy_alpha;
- mpeg2_idct_add = mpeg2_idct_add_alpha;
- mpeg2_idct_alpha_init ();
- for (i = -3840; i < 3840 + 256; i++)
- CLIP(i) = (i < 0) ? 0 : ((i > 255) ? 255 : i);
- } else
-#endif
- {
- int i, j;
-
- mpeg2_idct_copy = mpeg2_idct_copy_c;
- mpeg2_idct_add = mpeg2_idct_add_c;
- for (i = -3840; i < 3840 + 256; i++)
- CLIP(i) = (i < 0) ? 0 : ((i > 255) ? 255 : i);
- for (i = 0; i < 64; i++) {
- j = mpeg2_scan_norm[i];
- mpeg2_scan_norm[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2);
- j = mpeg2_scan_alt[i];
- mpeg2_scan_alt[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2);
- }
- }
-}
diff --git a/libmpeg2/idct_alpha.c b/libmpeg2/idct_alpha.c
deleted file mode 100644
index 182e008b1f..0000000000
--- a/libmpeg2/idct_alpha.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * idct_alpha.c
- * Copyright (C) 2002-2003 Falk Hueffner <falk@debian.org>
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#if ARCH_ALPHA
-
-#include <stdlib.h>
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-#include "alpha_asm.h"
-
-#define W1 2841 /* 2048 * sqrt (2) * cos (1 * pi / 16) */
-#define W2 2676 /* 2048 * sqrt (2) * cos (2 * pi / 16) */
-#define W3 2408 /* 2048 * sqrt (2) * cos (3 * pi / 16) */
-#define W5 1609 /* 2048 * sqrt (2) * cos (5 * pi / 16) */
-#define W6 1108 /* 2048 * sqrt (2) * cos (6 * pi / 16) */
-#define W7 565 /* 2048 * sqrt (2) * cos (7 * pi / 16) */
-
-extern uint8_t mpeg2_clip[3840 * 2 + 256];
-#define CLIP(i) ((mpeg2_clip + 3840)[i])
-
-#if 0
-#define BUTTERFLY(t0,t1,W0,W1,d0,d1) \
-do { \
- t0 = W0 * d0 + W1 * d1; \
- t1 = W0 * d1 - W1 * d0; \
-} while (0)
-#else
-#define BUTTERFLY(t0,t1,W0,W1,d0,d1) \
-do { \
- int_fast32_t tmp = W0 * (d0 + d1); \
- t0 = tmp + (W1 - W0) * d1; \
- t1 = tmp - (W1 + W0) * d0; \
-} while (0)
-#endif
-
-static inline void idct_row (int16_t * const block)
-{
- uint64_t l, r;
- int_fast32_t d0, d1, d2, d3;
- int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3;
- int_fast32_t t0, t1, t2, t3;
-
- l = ldq (block);
- r = ldq (block + 4);
-
- /* shortcut */
- if (likely (!((l & ~0xffffUL) | r))) {
- uint64_t tmp = (uint16_t) (l >> 1);
- tmp |= tmp << 16;
- tmp |= tmp << 32;
- ((int32_t *)block)[0] = tmp;
- ((int32_t *)block)[1] = tmp;
- ((int32_t *)block)[2] = tmp;
- ((int32_t *)block)[3] = tmp;
- return;
- }
-
- d0 = (sextw (l) << 11) + 2048;
- d1 = sextw (extwl (l, 2));
- d2 = sextw (extwl (l, 4)) << 11;
- d3 = sextw (extwl (l, 6));
- t0 = d0 + d2;
- t1 = d0 - d2;
- BUTTERFLY (t2, t3, W6, W2, d3, d1);
- a0 = t0 + t2;
- a1 = t1 + t3;
- a2 = t1 - t3;
- a3 = t0 - t2;
-
- d0 = sextw (r);
- d1 = sextw (extwl (r, 2));
- d2 = sextw (extwl (r, 4));
- d3 = sextw (extwl (r, 6));
- BUTTERFLY (t0, t1, W7, W1, d3, d0);
- BUTTERFLY (t2, t3, W3, W5, d1, d2);
- b0 = t0 + t2;
- b3 = t1 + t3;
- t0 -= t2;
- t1 -= t3;
- b1 = ((t0 + t1) >> 8) * 181;
- b2 = ((t0 - t1) >> 8) * 181;
-
- block[0] = (a0 + b0) >> 12;
- block[1] = (a1 + b1) >> 12;
- block[2] = (a2 + b2) >> 12;
- block[3] = (a3 + b3) >> 12;
- block[4] = (a3 - b3) >> 12;
- block[5] = (a2 - b2) >> 12;
- block[6] = (a1 - b1) >> 12;
- block[7] = (a0 - b0) >> 12;
-}
-
-static inline void idct_col (int16_t * const block)
-{
- int_fast32_t d0, d1, d2, d3;
- int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3;
- int_fast32_t t0, t1, t2, t3;
-
- d0 = (block[8*0] << 11) + 65536;
- d1 = block[8*1];
- d2 = block[8*2] << 11;
- d3 = block[8*3];
- t0 = d0 + d2;
- t1 = d0 - d2;
- BUTTERFLY (t2, t3, W6, W2, d3, d1);
- a0 = t0 + t2;
- a1 = t1 + t3;
- a2 = t1 - t3;
- a3 = t0 - t2;
-
- d0 = block[8*4];
- d1 = block[8*5];
- d2 = block[8*6];
- d3 = block[8*7];
- BUTTERFLY (t0, t1, W7, W1, d3, d0);
- BUTTERFLY (t2, t3, W3, W5, d1, d2);
- b0 = t0 + t2;
- b3 = t1 + t3;
- t0 -= t2;
- t1 -= t3;
- b1 = ((t0 + t1) >> 8) * 181;
- b2 = ((t0 - t1) >> 8) * 181;
-
- block[8*0] = (a0 + b0) >> 17;
- block[8*1] = (a1 + b1) >> 17;
- block[8*2] = (a2 + b2) >> 17;
- block[8*3] = (a3 + b3) >> 17;
- block[8*4] = (a3 - b3) >> 17;
- block[8*5] = (a2 - b2) >> 17;
- block[8*6] = (a1 - b1) >> 17;
- block[8*7] = (a0 - b0) >> 17;
-}
-
-void mpeg2_idct_copy_mvi (int16_t * block, uint8_t * dest, const int stride)
-{
- uint64_t clampmask;
- int i;
-
- for (i = 0; i < 8; i++)
- idct_row (block + 8 * i);
-
- for (i = 0; i < 8; i++)
- idct_col (block + i);
-
- clampmask = zap (-1, 0xaa); /* 0x00ff00ff00ff00ff */
- do {
- uint64_t shorts0, shorts1;
-
- shorts0 = ldq (block);
- shorts0 = maxsw4 (shorts0, 0);
- shorts0 = minsw4 (shorts0, clampmask);
- stl (pkwb (shorts0), dest);
-
- shorts1 = ldq (block + 4);
- shorts1 = maxsw4 (shorts1, 0);
- shorts1 = minsw4 (shorts1, clampmask);
- stl (pkwb (shorts1), dest + 4);
-
- stq (0, block);
- stq (0, block + 4);
-
- dest += stride;
- block += 8;
- } while (--i);
-}
-
-void mpeg2_idct_add_mvi (const int last, int16_t * block,
- uint8_t * dest, const int stride)
-{
- uint64_t clampmask;
- uint64_t signmask;
- int i;
-
- if (last != 129 || (block[0] & (7 << 4)) == (4 << 4)) {
- for (i = 0; i < 8; i++)
- idct_row (block + 8 * i);
- for (i = 0; i < 8; i++)
- idct_col (block + i);
- clampmask = zap (-1, 0xaa); /* 0x00ff00ff00ff00ff */
- signmask = zap (-1, 0x33);
- signmask ^= signmask >> 1; /* 0x8000800080008000 */
-
- do {
- uint64_t shorts0, pix0, signs0;
- uint64_t shorts1, pix1, signs1;
-
- shorts0 = ldq (block);
- shorts1 = ldq (block + 4);
-
- pix0 = unpkbw (ldl (dest));
- /* signed subword add (MMX paddw). */
- signs0 = shorts0 & signmask;
- shorts0 &= ~signmask;
- shorts0 += pix0;
- shorts0 ^= signs0;
- /* clamp. */
- shorts0 = maxsw4 (shorts0, 0);
- shorts0 = minsw4 (shorts0, clampmask);
-
- /* next 4. */
- pix1 = unpkbw (ldl (dest + 4));
- signs1 = shorts1 & signmask;
- shorts1 &= ~signmask;
- shorts1 += pix1;
- shorts1 ^= signs1;
- shorts1 = maxsw4 (shorts1, 0);
- shorts1 = minsw4 (shorts1, clampmask);
-
- stl (pkwb (shorts0), dest);
- stl (pkwb (shorts1), dest + 4);
- stq (0, block);
- stq (0, block + 4);
-
- dest += stride;
- block += 8;
- } while (--i);
- } else {
- int DC;
- uint64_t p0, p1, p2, p3, p4, p5, p6, p7;
- uint64_t DCs;
-
- DC = (block[0] + 64) >> 7;
- block[0] = block[63] = 0;
-
- p0 = ldq (dest + 0 * stride);
- p1 = ldq (dest + 1 * stride);
- p2 = ldq (dest + 2 * stride);
- p3 = ldq (dest + 3 * stride);
- p4 = ldq (dest + 4 * stride);
- p5 = ldq (dest + 5 * stride);
- p6 = ldq (dest + 6 * stride);
- p7 = ldq (dest + 7 * stride);
-
- if (DC > 0) {
- DCs = BYTE_VEC (likely (DC <= 255) ? DC : 255);
- p0 += minub8 (DCs, ~p0);
- p1 += minub8 (DCs, ~p1);
- p2 += minub8 (DCs, ~p2);
- p3 += minub8 (DCs, ~p3);
- p4 += minub8 (DCs, ~p4);
- p5 += minub8 (DCs, ~p5);
- p6 += minub8 (DCs, ~p6);
- p7 += minub8 (DCs, ~p7);
- } else {
- DCs = BYTE_VEC (likely (-DC <= 255) ? -DC : 255);
- p0 -= minub8 (DCs, p0);
- p1 -= minub8 (DCs, p1);
- p2 -= minub8 (DCs, p2);
- p3 -= minub8 (DCs, p3);
- p4 -= minub8 (DCs, p4);
- p5 -= minub8 (DCs, p5);
- p6 -= minub8 (DCs, p6);
- p7 -= minub8 (DCs, p7);
- }
-
- stq (p0, dest + 0 * stride);
- stq (p1, dest + 1 * stride);
- stq (p2, dest + 2 * stride);
- stq (p3, dest + 3 * stride);
- stq (p4, dest + 4 * stride);
- stq (p5, dest + 5 * stride);
- stq (p6, dest + 6 * stride);
- stq (p7, dest + 7 * stride);
- }
-}
-
-void mpeg2_idct_copy_alpha (int16_t * block, uint8_t * dest, const int stride)
-{
- int i;
-
- for (i = 0; i < 8; i++)
- idct_row (block + 8 * i);
- for (i = 0; i < 8; i++)
- idct_col (block + i);
- do {
- dest[0] = CLIP (block[0]);
- dest[1] = CLIP (block[1]);
- dest[2] = CLIP (block[2]);
- dest[3] = CLIP (block[3]);
- dest[4] = CLIP (block[4]);
- dest[5] = CLIP (block[5]);
- dest[6] = CLIP (block[6]);
- dest[7] = CLIP (block[7]);
-
- stq(0, block);
- stq(0, block + 4);
-
- dest += stride;
- block += 8;
- } while (--i);
-}
-
-void mpeg2_idct_add_alpha (const int last, int16_t * block,
- uint8_t * dest, const int stride)
-{
- int i;
-
- if (last != 129 || (block[0] & (7 << 4)) == (4 << 4)) {
- for (i = 0; i < 8; i++)
- idct_row (block + 8 * i);
- for (i = 0; i < 8; i++)
- idct_col (block + i);
- do {
- dest[0] = CLIP (block[0] + dest[0]);
- dest[1] = CLIP (block[1] + dest[1]);
- dest[2] = CLIP (block[2] + dest[2]);
- dest[3] = CLIP (block[3] + dest[3]);
- dest[4] = CLIP (block[4] + dest[4]);
- dest[5] = CLIP (block[5] + dest[5]);
- dest[6] = CLIP (block[6] + dest[6]);
- dest[7] = CLIP (block[7] + dest[7]);
-
- stq(0, block);
- stq(0, block + 4);
-
- dest += stride;
- block += 8;
- } while (--i);
- } else {
- int DC;
-
- DC = (block[0] + 64) >> 7;
- block[0] = block[63] = 0;
- i = 8;
- do {
- dest[0] = CLIP (DC + dest[0]);
- dest[1] = CLIP (DC + dest[1]);
- dest[2] = CLIP (DC + dest[2]);
- dest[3] = CLIP (DC + dest[3]);
- dest[4] = CLIP (DC + dest[4]);
- dest[5] = CLIP (DC + dest[5]);
- dest[6] = CLIP (DC + dest[6]);
- dest[7] = CLIP (DC + dest[7]);
- dest += stride;
- } while (--i);
- }
-}
-
-void mpeg2_idct_alpha_init (void)
-{
- int i, j;
-
- for (i = 0; i < 64; i++) {
- j = mpeg2_scan_norm[i];
- mpeg2_scan_norm[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2);
- j = mpeg2_scan_alt[i];
- mpeg2_scan_alt[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2);
- }
-}
-
-#endif /* ARCH_ALPHA */
diff --git a/libmpeg2/idct_altivec.c b/libmpeg2/idct_altivec.c
deleted file mode 100644
index 1403eeac87..0000000000
--- a/libmpeg2/idct_altivec.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * idct_altivec.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#if ARCH_PPC
-
-#ifdef HAVE_ALTIVEC_H
-#include <altivec.h>
-#endif
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-typedef vector signed char vector_s8_t;
-typedef vector unsigned char vector_u8_t;
-typedef vector signed short vector_s16_t;
-typedef vector unsigned short vector_u16_t;
-typedef vector signed int vector_s32_t;
-typedef vector unsigned int vector_u32_t;
-
-#if defined(HAVE_ALTIVEC_H) && !defined(__APPLE_CC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 303)
-/* work around gcc <3.3 vec_mergel bug */
-static inline vector_s16_t my_vec_mergel (vector_s16_t const A,
- vector_s16_t const B)
-{
- static const vector_u8_t mergel = {
- 0x08, 0x09, 0x18, 0x19, 0x0a, 0x0b, 0x1a, 0x1b,
- 0x0c, 0x0d, 0x1c, 0x1d, 0x0e, 0x0f, 0x1e, 0x1f
- };
- return vec_perm (A, B, mergel);
-}
-#undef vec_mergel
-#define vec_mergel my_vec_mergel
-#endif
-
-#ifdef HAVE_ALTIVEC_H /* gnu */
-#define VEC_S16(a,b,c,d,e,f,g,h) {a, b, c, d, e, f, g, h}
-#else /* apple */
-#define VEC_S16(a,b,c,d,e,f,g,h) (vector_s16_t) (a, b, c, d, e, f, g, h)
-#endif
-
-static const vector_s16_t constants ATTR_ALIGN(16) =
- VEC_S16 (23170, 13573, 6518, 21895, -23170, -21895, 32, 31);
-static const vector_s16_t constants_1 ATTR_ALIGN(16) =
- VEC_S16 (16384, 22725, 21407, 19266, 16384, 19266, 21407, 22725);
-static const vector_s16_t constants_2 ATTR_ALIGN(16) =
- VEC_S16 (16069, 22289, 20995, 18895, 16069, 18895, 20995, 22289);
-static const vector_s16_t constants_3 ATTR_ALIGN(16) =
- VEC_S16 (21407, 29692, 27969, 25172, 21407, 25172, 27969, 29692);
-static const vector_s16_t constants_4 ATTR_ALIGN(16) =
- VEC_S16 (13623, 18895, 17799, 16019, 13623, 16019, 17799, 18895);
-
-#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); \
- a0 = vec_splat (constants, 1); \
- a1 = vec_splat (constants, 2); \
- a2 = vec_splat (constants, 3); \
- mc4 = vec_splat (constants, 4); \
- ma2 = vec_splat (constants, 5); \
- bias = (vector_s16_t)vec_splat ((vector_s32_t)constants, 3); \
- \
- zero = vec_splat_s16 (0); \
- \
- vx0 = vec_adds (block[0], block[4]); \
- vx4 = vec_subs (block[0], block[4]); \
- t5 = vec_mradds (vx0, constants_1, zero); \
- t0 = vec_mradds (vx4, constants_1, zero); \
- \
- vx1 = vec_mradds (a1, block[7], block[1]); \
- vx7 = vec_mradds (a1, block[1], vec_subs (zero, block[7])); \
- t1 = vec_mradds (vx1, constants_2, zero); \
- t8 = vec_mradds (vx7, constants_2, zero); \
- \
- vx2 = vec_mradds (a0, block[6], block[2]); \
- vx6 = vec_mradds (a0, block[2], vec_subs (zero, block[6])); \
- t2 = vec_mradds (vx2, constants_3, zero); \
- t4 = vec_mradds (vx6, constants_3, zero); \
- \
- vx3 = vec_mradds (block[3], constants_4, zero); \
- vx5 = vec_mradds (block[5], constants_4, zero); \
- t7 = vec_mradds (a2, vx5, vx3); \
- t3 = vec_mradds (ma2, vx3, vx5); \
- \
- t6 = vec_adds (t8, t3); \
- t3 = vec_subs (t8, t3); \
- t8 = vec_subs (t1, t7); \
- t1 = vec_adds (t1, t7); \
- t6 = vec_mradds (a0, t6, t6); /* a0+1 == 2*c4 */ \
- t1 = vec_mradds (a0, t1, t1); /* a0+1 == 2*c4 */ \
- \
- 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); \
- \
- vy0 = vec_adds (t7, t1); \
- vy7 = vec_subs (t7, t1); \
- vy1 = vec_adds (t5, t3); \
- vy6 = vec_subs (t5, t3); \
- vy2 = vec_adds (t0, t4); \
- vy5 = vec_subs (t0, t4); \
- vy3 = vec_adds (t2, t6); \
- vy4 = vec_subs (t2, t6); \
- \
- 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_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); \
- \
- vx0 = vec_adds (vx0, bias); \
- t5 = vec_adds (vx0, vx4); \
- t0 = vec_subs (vx0, vx4); \
- \
- t1 = vec_mradds (a1, vx7, vx1); \
- t8 = vec_mradds (a1, vx1, vec_subs (zero, vx7)); \
- \
- t2 = vec_mradds (a0, vx6, vx2); \
- t4 = vec_mradds (a0, vx2, vec_subs (zero, vx6)); \
- \
- t7 = vec_mradds (a2, vx5, vx3); \
- t3 = vec_mradds (ma2, vx3, vx5); \
- \
- t6 = vec_adds (t8, t3); \
- t3 = vec_subs (t8, t3); \
- t8 = vec_subs (t1, t7); \
- t1 = vec_adds (t1, t7); \
- \
- 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); \
- \
- 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); \
- \
- 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);
-
-void mpeg2_idct_copy_altivec (int16_t * const _block, uint8_t * dest,
- const int stride)
-{
- vector_s16_t * const block = (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)
-
- block[0] = block[1] = block[2] = block[3] = zero;
- block[4] = block[5] = block[6] = block[7] = zero;
-}
-
-void mpeg2_idct_add_altivec (const int last, int16_t * const _block,
- uint8_t * dest, const int stride)
-{
- vector_s16_t * const block = (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)
-
- block[0] = block[1] = block[2] = block[3] = zero;
- block[4] = block[5] = block[6] = block[7] = zero;
-}
-
-void mpeg2_idct_altivec_init (void)
-{
- int i, j;
-
- /* the altivec idct uses a transposed input, so we patch scan tables */
- for (i = 0; i < 64; i++) {
- j = mpeg2_scan_norm[i];
- mpeg2_scan_norm[i] = (j >> 3) | ((j & 7) << 3);
- j = mpeg2_scan_alt[i];
- mpeg2_scan_alt[i] = (j >> 3) | ((j & 7) << 3);
- }
-}
-
-#endif
diff --git a/libmpeg2/idct_mmx.c b/libmpeg2/idct_mmx.c
deleted file mode 100644
index fe6215b20d..0000000000
--- a/libmpeg2/idct_mmx.c
+++ /dev/null
@@ -1,1305 +0,0 @@
-/*
- * idct_mmx.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#if ARCH_X86 || ARCH_X86_64
-
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-#include "mmx.h"
-
-#define ROW_SHIFT 15
-#define COL_SHIFT 6
-
-#define round(bias) ((int)(((bias)+0.5) * (1<<ROW_SHIFT)))
-#define rounder(bias) {round (bias), round (bias)}
-#define rounder_sse2(bias) {round (bias), round (bias), round (bias), round (bias)}
-
-
-#if 0
-/* C row IDCT - it is just here to document the MMXEXT and MMX versions */
-static inline void idct_row (int16_t * row, int offset,
- int16_t * table, int32_t * rounder)
-{
- int C1, C2, C3, C4, C5, C6, C7;
- int a0, a1, a2, a3, b0, b1, b2, b3;
-
- row += offset;
-
- C1 = table[1];
- C2 = table[2];
- C3 = table[3];
- C4 = table[4];
- C5 = table[5];
- C6 = table[6];
- C7 = table[7];
-
- a0 = C4*row[0] + C2*row[2] + C4*row[4] + C6*row[6] + *rounder;
- a1 = C4*row[0] + C6*row[2] - C4*row[4] - C2*row[6] + *rounder;
- a2 = C4*row[0] - C6*row[2] - C4*row[4] + C2*row[6] + *rounder;
- a3 = C4*row[0] - C2*row[2] + C4*row[4] - C6*row[6] + *rounder;
-
- b0 = C1*row[1] + C3*row[3] + C5*row[5] + C7*row[7];
- b1 = C3*row[1] - C7*row[3] - C1*row[5] - C5*row[7];
- b2 = C5*row[1] - C1*row[3] + C7*row[5] + C3*row[7];
- b3 = C7*row[1] - C5*row[3] + C3*row[5] - C1*row[7];
-
- row[0] = (a0 + b0) >> ROW_SHIFT;
- row[1] = (a1 + b1) >> ROW_SHIFT;
- row[2] = (a2 + b2) >> ROW_SHIFT;
- row[3] = (a3 + b3) >> ROW_SHIFT;
- row[4] = (a3 - b3) >> ROW_SHIFT;
- row[5] = (a2 - b2) >> ROW_SHIFT;
- row[6] = (a1 - b1) >> ROW_SHIFT;
- row[7] = (a0 - b0) >> ROW_SHIFT;
-}
-#endif
-
-
-/* SSE2 row IDCT */
-#define sse2_table(c1,c2,c3,c4,c5,c6,c7) { c4, c2, c4, c6, \
- c4, -c6, c4, -c2, \
- c4, c6, -c4, -c2, \
- -c4, c2, c4, -c6, \
- c1, c3, c3, -c7, \
- c5, -c1, c7, -c5, \
- c5, c7, -c1, -c5, \
- c7, c3, c3, -c1 }
-
-#define SSE2_IDCT_2ROW(table, row1, row2, round1, round2) do { \
- /* no scheduling: trust in out of order execution */ \
- /* based on Intel AP-945 */ \
- /* (http://cache-www.intel.com/cd/00/00/01/76/17680_w_idct.pdf) */ \
- \
- /* input */ /* 1: row1= x7 x5 x3 x1 x6 x4 x2 x0 */ \
- pshufd_r2r (row1, xmm1, 0); /* 1: xmm1= x2 x0 x2 x0 x2 x0 x2 x0 */ \
- pmaddwd_m2r (table[0], xmm1); /* 1: xmm1= x2*C + x0*C ... */ \
- pshufd_r2r (row1, xmm3, 0xaa); /* 1: xmm3= x3 x1 x3 x1 x3 x1 x3 x1 */ \
- pmaddwd_m2r (table[2*8], xmm3); /* 1: xmm3= x3*C + x1*C ... */ \
- pshufd_r2r (row1, xmm2, 0x55); /* 1: xmm2= x6 x4 x6 x4 x6 x4 x6 x4 */ \
- pshufd_r2r (row1, row1, 0xff); /* 1: row1= x7 x5 x7 x5 x7 x5 x7 x5 */ \
- pmaddwd_m2r (table[1*8], xmm2); /* 1: xmm2= x6*C + x4*C ... */ \
- paddd_m2r (round1, xmm1); /* 1: xmm1= x2*C + x0*C + round ... */ \
- pmaddwd_m2r (table[3*8], row1); /* 1: row1= x7*C + x5*C ... */ \
- pshufd_r2r (row2, xmm5, 0); /* 2: */ \
- pshufd_r2r (row2, xmm6, 0x55); /* 2: */ \
- pmaddwd_m2r (table[0], xmm5); /* 2: */ \
- paddd_r2r (xmm2, xmm1); /* 1: xmm1= a[] */ \
- movdqa_r2r (xmm1, xmm2); /* 1: xmm2= a[] */ \
- pshufd_r2r (row2, xmm7, 0xaa); /* 2: */ \
- pmaddwd_m2r (table[1*8], xmm6); /* 2: */ \
- paddd_r2r (xmm3, row1); /* 1: row1= b[]= 7*C+5*C+3*C+1*C ... */ \
- pshufd_r2r (row2, row2, 0xff); /* 2: */ \
- psubd_r2r (row1, xmm2); /* 1: xmm2= a[] - b[] */ \
- pmaddwd_m2r (table[2*8], xmm7); /* 2: */ \
- paddd_r2r (xmm1, row1); /* 1: row1= a[] + b[] */ \
- psrad_i2r (ROW_SHIFT, xmm2); /* 1: xmm2= result 4...7 */ \
- paddd_m2r (round2, xmm5); /* 2: */ \
- pmaddwd_m2r (table[3*8], row2); /* 2: */ \
- paddd_r2r (xmm6, xmm5); /* 2: */ \
- movdqa_r2r (xmm5, xmm6); /* 2: */ \
- psrad_i2r (ROW_SHIFT, row1); /* 1: row1= result 0...4 */ \
- pshufd_r2r (xmm2, xmm2, 0x1b); /* 1: [0 1 2 3] -> [3 2 1 0] */ \
- packssdw_r2r (xmm2, row1); /* 1: row1= result[] */ \
- paddd_r2r (xmm7, row2); /* 2: */ \
- psubd_r2r (row2, xmm6); /* 2: */ \
- paddd_r2r (xmm5, row2); /* 2: */ \
- psrad_i2r (ROW_SHIFT, xmm6); /* 2: */ \
- psrad_i2r (ROW_SHIFT, row2); /* 2: */ \
- pshufd_r2r (xmm6, xmm6, 0x1b); /* 2: */ \
- packssdw_r2r (xmm6, row2); /* 2: */ \
-} while (0)
-
-
-/* MMXEXT row IDCT */
-
-#define mmxext_table(c1,c2,c3,c4,c5,c6,c7) { c4, c2, -c4, -c2, \
- c4, c6, c4, c6, \
- c1, c3, -c1, -c5, \
- c5, c7, c3, -c7, \
- c4, -c6, c4, -c6, \
- -c4, c2, c4, -c2, \
- c5, -c1, c3, -c1, \
- c7, c3, c7, -c5 }
-
-static inline void mmxext_row_head (int16_t * const row, const int offset,
- const int16_t * const table)
-{
- movq_m2r (*(row+offset), mm2); /* mm2 = x6 x4 x2 x0 */
-
- movq_m2r (*(row+offset+4), mm5); /* mm5 = x7 x5 x3 x1 */
- movq_r2r (mm2, mm0); /* mm0 = x6 x4 x2 x0 */
-
- movq_m2r (*table, mm3); /* mm3 = -C2 -C4 C2 C4 */
- movq_r2r (mm5, mm6); /* mm6 = x7 x5 x3 x1 */
-
- movq_m2r (*(table+4), mm4); /* mm4 = C6 C4 C6 C4 */
- pmaddwd_r2r (mm0, mm3); /* mm3 = -C4*x4-C2*x6 C4*x0+C2*x2 */
-
- pshufw_r2r (mm2, mm2, 0x4e); /* mm2 = x2 x0 x6 x4 */
-}
-
-static inline void mmxext_row (const int16_t * const table,
- const int32_t * const rounder)
-{
- movq_m2r (*(table+8), mm1); /* mm1 = -C5 -C1 C3 C1 */
- pmaddwd_r2r (mm2, mm4); /* mm4 = C4*x0+C6*x2 C4*x4+C6*x6 */
-
- pmaddwd_m2r (*(table+16), mm0); /* mm0 = C4*x4-C6*x6 C4*x0-C6*x2 */
- pshufw_r2r (mm6, mm6, 0x4e); /* mm6 = x3 x1 x7 x5 */
-
- movq_m2r (*(table+12), mm7); /* mm7 = -C7 C3 C7 C5 */
- pmaddwd_r2r (mm5, mm1); /* mm1 = -C1*x5-C5*x7 C1*x1+C3*x3 */
-
- paddd_m2r (*rounder, mm3); /* mm3 += rounder */
- pmaddwd_r2r (mm6, mm7); /* mm7 = C3*x1-C7*x3 C5*x5+C7*x7 */
-
- pmaddwd_m2r (*(table+20), mm2); /* mm2 = C4*x0-C2*x2 -C4*x4+C2*x6 */
- paddd_r2r (mm4, mm3); /* mm3 = a1 a0 + rounder */
-
- pmaddwd_m2r (*(table+24), mm5); /* mm5 = C3*x5-C1*x7 C5*x1-C1*x3 */
- movq_r2r (mm3, mm4); /* mm4 = a1 a0 + rounder */
-
- pmaddwd_m2r (*(table+28), mm6); /* mm6 = C7*x1-C5*x3 C7*x5+C3*x7 */
- paddd_r2r (mm7, mm1); /* mm1 = b1 b0 */
-
- paddd_m2r (*rounder, mm0); /* mm0 += rounder */
- psubd_r2r (mm1, mm3); /* mm3 = a1-b1 a0-b0 + rounder */
-
- psrad_i2r (ROW_SHIFT, mm3); /* mm3 = y6 y7 */
- paddd_r2r (mm4, mm1); /* mm1 = a1+b1 a0+b0 + rounder */
-
- paddd_r2r (mm2, mm0); /* mm0 = a3 a2 + rounder */
- psrad_i2r (ROW_SHIFT, mm1); /* mm1 = y1 y0 */
-
- paddd_r2r (mm6, mm5); /* mm5 = b3 b2 */
- movq_r2r (mm0, mm4); /* mm4 = a3 a2 + rounder */
-
- paddd_r2r (mm5, mm0); /* mm0 = a3+b3 a2+b2 + rounder */
- psubd_r2r (mm5, mm4); /* mm4 = a3-b3 a2-b2 + rounder */
-}
-
-static inline void mmxext_row_tail (int16_t * const row, const int store)
-{
- psrad_i2r (ROW_SHIFT, mm0); /* mm0 = y3 y2 */
-
- psrad_i2r (ROW_SHIFT, mm4); /* mm4 = y4 y5 */
-
- packssdw_r2r (mm0, mm1); /* mm1 = y3 y2 y1 y0 */
-
- packssdw_r2r (mm3, mm4); /* mm4 = y6 y7 y4 y5 */
-
- movq_r2m (mm1, *(row+store)); /* save y3 y2 y1 y0 */
- pshufw_r2r (mm4, mm4, 0xb1); /* mm4 = y7 y6 y5 y4 */
-
- /* slot */
-
- movq_r2m (mm4, *(row+store+4)); /* save y7 y6 y5 y4 */
-}
-
-static inline void mmxext_row_mid (int16_t * const row, const int store,
- const int offset,
- const int16_t * const table)
-{
- movq_m2r (*(row+offset), mm2); /* mm2 = x6 x4 x2 x0 */
- psrad_i2r (ROW_SHIFT, mm0); /* mm0 = y3 y2 */
-
- movq_m2r (*(row+offset+4), mm5); /* mm5 = x7 x5 x3 x1 */
- psrad_i2r (ROW_SHIFT, mm4); /* mm4 = y4 y5 */
-
- packssdw_r2r (mm0, mm1); /* mm1 = y3 y2 y1 y0 */
- movq_r2r (mm5, mm6); /* mm6 = x7 x5 x3 x1 */
-
- packssdw_r2r (mm3, mm4); /* mm4 = y6 y7 y4 y5 */
- movq_r2r (mm2, mm0); /* mm0 = x6 x4 x2 x0 */
-
- movq_r2m (mm1, *(row+store)); /* save y3 y2 y1 y0 */
- pshufw_r2r (mm4, mm4, 0xb1); /* mm4 = y7 y6 y5 y4 */
-
- movq_m2r (*table, mm3); /* mm3 = -C2 -C4 C2 C4 */
- movq_r2m (mm4, *(row+store+4)); /* save y7 y6 y5 y4 */
-
- pmaddwd_r2r (mm0, mm3); /* mm3 = -C4*x4-C2*x6 C4*x0+C2*x2 */
-
- movq_m2r (*(table+4), mm4); /* mm4 = C6 C4 C6 C4 */
- pshufw_r2r (mm2, mm2, 0x4e); /* mm2 = x2 x0 x6 x4 */
-}
-
-
-/* MMX row IDCT */
-
-#define mmx_table(c1,c2,c3,c4,c5,c6,c7) { c4, c2, c4, c6, \
- c4, c6, -c4, -c2, \
- c1, c3, c3, -c7, \
- c5, c7, -c1, -c5, \
- c4, -c6, c4, -c2, \
- -c4, c2, c4, -c6, \
- c5, -c1, c7, -c5, \
- c7, c3, c3, -c1 }
-
-static inline void mmx_row_head (int16_t * const row, const int offset,
- const int16_t * const table)
-{
- movq_m2r (*(row+offset), mm2); /* mm2 = x6 x4 x2 x0 */
-
- movq_m2r (*(row+offset+4), mm5); /* mm5 = x7 x5 x3 x1 */
- movq_r2r (mm2, mm0); /* mm0 = x6 x4 x2 x0 */
-
- movq_m2r (*table, mm3); /* mm3 = C6 C4 C2 C4 */
- movq_r2r (mm5, mm6); /* mm6 = x7 x5 x3 x1 */
-
- punpckldq_r2r (mm0, mm0); /* mm0 = x2 x0 x2 x0 */
-
- movq_m2r (*(table+4), mm4); /* mm4 = -C2 -C4 C6 C4 */
- pmaddwd_r2r (mm0, mm3); /* mm3 = C4*x0+C6*x2 C4*x0+C2*x2 */
-
- movq_m2r (*(table+8), mm1); /* mm1 = -C7 C3 C3 C1 */
- punpckhdq_r2r (mm2, mm2); /* mm2 = x6 x4 x6 x4 */
-}
-
-static inline void mmx_row (const int16_t * const table,
- const int32_t * const rounder)
-{
- pmaddwd_r2r (mm2, mm4); /* mm4 = -C4*x4-C2*x6 C4*x4+C6*x6 */
- punpckldq_r2r (mm5, mm5); /* mm5 = x3 x1 x3 x1 */
-
- pmaddwd_m2r (*(table+16), mm0); /* mm0 = C4*x0-C2*x2 C4*x0-C6*x2 */
- punpckhdq_r2r (mm6, mm6); /* mm6 = x7 x5 x7 x5 */
-
- movq_m2r (*(table+12), mm7); /* mm7 = -C5 -C1 C7 C5 */
- pmaddwd_r2r (mm5, mm1); /* mm1 = C3*x1-C7*x3 C1*x1+C3*x3 */
-
- paddd_m2r (*rounder, mm3); /* mm3 += rounder */
- pmaddwd_r2r (mm6, mm7); /* mm7 = -C1*x5-C5*x7 C5*x5+C7*x7 */
-
- pmaddwd_m2r (*(table+20), mm2); /* mm2 = C4*x4-C6*x6 -C4*x4+C2*x6 */
- paddd_r2r (mm4, mm3); /* mm3 = a1 a0 + rounder */
-
- pmaddwd_m2r (*(table+24), mm5); /* mm5 = C7*x1-C5*x3 C5*x1-C1*x3 */
- movq_r2r (mm3, mm4); /* mm4 = a1 a0 + rounder */
-
- pmaddwd_m2r (*(table+28), mm6); /* mm6 = C3*x5-C1*x7 C7*x5+C3*x7 */
- paddd_r2r (mm7, mm1); /* mm1 = b1 b0 */
-
- paddd_m2r (*rounder, mm0); /* mm0 += rounder */
- psubd_r2r (mm1, mm3); /* mm3 = a1-b1 a0-b0 + rounder */
-
- psrad_i2r (ROW_SHIFT, mm3); /* mm3 = y6 y7 */
- paddd_r2r (mm4, mm1); /* mm1 = a1+b1 a0+b0 + rounder */
-
- paddd_r2r (mm2, mm0); /* mm0 = a3 a2 + rounder */
- psrad_i2r (ROW_SHIFT, mm1); /* mm1 = y1 y0 */
-
- paddd_r2r (mm6, mm5); /* mm5 = b3 b2 */
- movq_r2r (mm0, mm7); /* mm7 = a3 a2 + rounder */
-
- paddd_r2r (mm5, mm0); /* mm0 = a3+b3 a2+b2 + rounder */
- psubd_r2r (mm5, mm7); /* mm7 = a3-b3 a2-b2 + rounder */
-}
-
-static inline void mmx_row_tail (int16_t * const row, const int store)
-{
- psrad_i2r (ROW_SHIFT, mm0); /* mm0 = y3 y2 */
-
- psrad_i2r (ROW_SHIFT, mm7); /* mm7 = y4 y5 */
-
- packssdw_r2r (mm0, mm1); /* mm1 = y3 y2 y1 y0 */
-
- packssdw_r2r (mm3, mm7); /* mm7 = y6 y7 y4 y5 */
-
- movq_r2m (mm1, *(row+store)); /* save y3 y2 y1 y0 */
- movq_r2r (mm7, mm4); /* mm4 = y6 y7 y4 y5 */
-
- pslld_i2r (16, mm7); /* mm7 = y7 0 y5 0 */
-
- psrld_i2r (16, mm4); /* mm4 = 0 y6 0 y4 */
-
- por_r2r (mm4, mm7); /* mm7 = y7 y6 y5 y4 */
-
- /* slot */
-
- movq_r2m (mm7, *(row+store+4)); /* save y7 y6 y5 y4 */
-}
-
-static inline void mmx_row_mid (int16_t * const row, const int store,
- const int offset, const int16_t * const table)
-{
- movq_m2r (*(row+offset), mm2); /* mm2 = x6 x4 x2 x0 */
- psrad_i2r (ROW_SHIFT, mm0); /* mm0 = y3 y2 */
-
- movq_m2r (*(row+offset+4), mm5); /* mm5 = x7 x5 x3 x1 */
- psrad_i2r (ROW_SHIFT, mm7); /* mm7 = y4 y5 */
-
- packssdw_r2r (mm0, mm1); /* mm1 = y3 y2 y1 y0 */
- movq_r2r (mm5, mm6); /* mm6 = x7 x5 x3 x1 */
-
- packssdw_r2r (mm3, mm7); /* mm7 = y6 y7 y4 y5 */
- movq_r2r (mm2, mm0); /* mm0 = x6 x4 x2 x0 */
-
- movq_r2m (mm1, *(row+store)); /* save y3 y2 y1 y0 */
- movq_r2r (mm7, mm1); /* mm1 = y6 y7 y4 y5 */
-
- punpckldq_r2r (mm0, mm0); /* mm0 = x2 x0 x2 x0 */
- psrld_i2r (16, mm7); /* mm7 = 0 y6 0 y4 */
-
- movq_m2r (*table, mm3); /* mm3 = C6 C4 C2 C4 */
- pslld_i2r (16, mm1); /* mm1 = y7 0 y5 0 */
-
- movq_m2r (*(table+4), mm4); /* mm4 = -C2 -C4 C6 C4 */
- por_r2r (mm1, mm7); /* mm7 = y7 y6 y5 y4 */
-
- movq_m2r (*(table+8), mm1); /* mm1 = -C7 C3 C3 C1 */
- punpckhdq_r2r (mm2, mm2); /* mm2 = x6 x4 x6 x4 */
-
- movq_r2m (mm7, *(row+store+4)); /* save y7 y6 y5 y4 */
- pmaddwd_r2r (mm0, mm3); /* mm3 = C4*x0+C6*x2 C4*x0+C2*x2 */
-}
-
-
-#if 0
-/* C column IDCT - it is just here to document the MMXEXT and MMX versions */
-static inline void idct_col (int16_t * col, int offset)
-{
-/* multiplication - as implemented on mmx */
-#define F(c,x) (((c) * (x)) >> 16)
-
-/* saturation - it helps us handle torture test cases */
-#define S(x) (((x)>32767) ? 32767 : ((x)<-32768) ? -32768 : (x))
-
- int16_t x0, x1, x2, x3, x4, x5, x6, x7;
- int16_t y0, y1, y2, y3, y4, y5, y6, y7;
- int16_t a0, a1, a2, a3, b0, b1, b2, b3;
- int16_t u04, v04, u26, v26, u17, v17, u35, v35, u12, v12;
-
- col += offset;
-
- x0 = col[0*8];
- x1 = col[1*8];
- x2 = col[2*8];
- x3 = col[3*8];
- x4 = col[4*8];
- x5 = col[5*8];
- x6 = col[6*8];
- x7 = col[7*8];
-
- u04 = S (x0 + x4);
- v04 = S (x0 - x4);
- u26 = S (F (T2, x6) + x2);
- v26 = S (F (T2, x2) - x6);
-
- a0 = S (u04 + u26);
- a1 = S (v04 + v26);
- a2 = S (v04 - v26);
- a3 = S (u04 - u26);
-
- u17 = S (F (T1, x7) + x1);
- v17 = S (F (T1, x1) - x7);
- u35 = S (F (T3, x5) + x3);
- v35 = S (F (T3, x3) - x5);
-
- b0 = S (u17 + u35);
- b3 = S (v17 - v35);
- u12 = S (u17 - u35);
- v12 = S (v17 + v35);
- u12 = S (2 * F (C4, u12));
- v12 = S (2 * F (C4, v12));
- b1 = S (u12 + v12);
- b2 = S (u12 - v12);
-
- y0 = S (a0 + b0) >> COL_SHIFT;
- y1 = S (a1 + b1) >> COL_SHIFT;
- y2 = S (a2 + b2) >> COL_SHIFT;
- y3 = S (a3 + b3) >> COL_SHIFT;
-
- y4 = S (a3 - b3) >> COL_SHIFT;
- y5 = S (a2 - b2) >> COL_SHIFT;
- y6 = S (a1 - b1) >> COL_SHIFT;
- y7 = S (a0 - b0) >> COL_SHIFT;
-
- col[0*8] = y0;
- col[1*8] = y1;
- col[2*8] = y2;
- col[3*8] = y3;
- col[4*8] = y4;
- col[5*8] = y5;
- col[6*8] = y6;
- col[7*8] = y7;
-}
-#endif
-
-
-#define T1 13036
-#define T2 27146
-#define T3 43790
-#define C4 23170
-
-
-/* SSE2 column IDCT */
-static inline void sse2_idct_col (int16_t * const col)
-{
- /* Almost identical to mmxext version: */
- /* just do both 4x8 columns in paraller */
-
- static const short t1_vector[] ATTR_ALIGN(16) = {T1,T1,T1,T1,T1,T1,T1,T1};
- static const short t2_vector[] ATTR_ALIGN(16) = {T2,T2,T2,T2,T2,T2,T2,T2};
- static const short t3_vector[] ATTR_ALIGN(16) = {T3,T3,T3,T3,T3,T3,T3,T3};
- static const short c4_vector[] ATTR_ALIGN(16) = {C4,C4,C4,C4,C4,C4,C4,C4};
-
-#if defined(__x86_64__)
-
- /* INPUT: block in xmm8 ... xmm15 */
-
- movdqa_m2r (*t1_vector, xmm0); /* xmm0 = T1 */
- movdqa_r2r (xmm9, xmm1); /* xmm1 = x1 */
-
- movdqa_r2r (xmm0, xmm2); /* xmm2 = T1 */
- pmulhw_r2r (xmm1, xmm0); /* xmm0 = T1*x1 */
-
- movdqa_m2r (*t3_vector, xmm5); /* xmm5 = T3 */
- pmulhw_r2r (xmm15, xmm2); /* xmm2 = T1*x7 */
-
- movdqa_r2r (xmm5, xmm7); /* xmm7 = T3-1 */
- psubsw_r2r (xmm15, xmm0); /* xmm0 = v17 */
-
- movdqa_m2r (*t2_vector, xmm9); /* xmm9 = T2 */
- pmulhw_r2r (xmm11, xmm5); /* xmm5 = (T3-1)*x3 */
-
- paddsw_r2r (xmm2, xmm1); /* xmm1 = u17 */
- pmulhw_r2r (xmm13, xmm7); /* xmm7 = (T3-1)*x5 */
-
- movdqa_r2r (xmm9, xmm2); /* xmm2 = T2 */
- paddsw_r2r (xmm11, xmm5); /* xmm5 = T3*x3 */
-
- pmulhw_r2r (xmm10, xmm9); /* xmm9 = T2*x2 */
- paddsw_r2r (xmm13, xmm7); /* xmm7 = T3*x5 */
-
- psubsw_r2r (xmm13, xmm5); /* xmm5 = v35 */
- paddsw_r2r (xmm11, xmm7); /* xmm7 = u35 */
-
- movdqa_r2r (xmm0, xmm6); /* xmm6 = v17 */
- pmulhw_r2r (xmm14, xmm2); /* xmm2 = T2*x6 */
-
- psubsw_r2r (xmm5, xmm0); /* xmm0 = b3 */
- psubsw_r2r (xmm14, xmm9); /* xmm9 = v26 */
-
- paddsw_r2r (xmm6, xmm5); /* xmm5 = v12 */
- movdqa_r2r (xmm0, xmm11); /* xmm11 = b3 */
-
- movdqa_r2r (xmm1, xmm6); /* xmm6 = u17 */
- paddsw_r2r (xmm10, xmm2); /* xmm2 = u26 */
-
- paddsw_r2r (xmm7, xmm6); /* xmm6 = b0 */
- psubsw_r2r (xmm7, xmm1); /* xmm1 = u12 */
-
- movdqa_r2r (xmm1, xmm7); /* xmm7 = u12 */
- paddsw_r2r (xmm5, xmm1); /* xmm1 = u12+v12 */
-
- movdqa_m2r (*c4_vector, xmm0); /* xmm0 = C4/2 */
- psubsw_r2r (xmm5, xmm7); /* xmm7 = u12-v12 */
-
- movdqa_r2r (xmm6, xmm4); /* xmm4 = b0 */
- pmulhw_r2r (xmm0, xmm1); /* xmm1 = b1/2 */
-
- movdqa_r2r (xmm9, xmm6); /* xmm6 = v26 */
- pmulhw_r2r (xmm0, xmm7); /* xmm7 = b2/2 */
-
- movdqa_r2r (xmm8, xmm10); /* xmm10 = x0 */
- movdqa_r2r (xmm8, xmm0); /* xmm0 = x0 */
-
- psubsw_r2r (xmm12, xmm10); /* xmm10 = v04 */
- paddsw_r2r (xmm12, xmm0); /* xmm0 = u04 */
-
- paddsw_r2r (xmm10, xmm9); /* xmm9 = a1 */
- movdqa_r2r (xmm0, xmm8); /* xmm8 = u04 */
-
- psubsw_r2r (xmm6, xmm10); /* xmm10 = a2 */
- paddsw_r2r (xmm2, xmm8); /* xmm5 = a0 */
-
- paddsw_r2r (xmm1, xmm1); /* xmm1 = b1 */
- psubsw_r2r (xmm2, xmm0); /* xmm0 = a3 */
-
- paddsw_r2r (xmm7, xmm7); /* xmm7 = b2 */
- movdqa_r2r (xmm10, xmm13); /* xmm13 = a2 */
-
- movdqa_r2r (xmm9, xmm14); /* xmm14 = a1 */
- paddsw_r2r (xmm7, xmm10); /* xmm10 = a2+b2 */
-
- psraw_i2r (COL_SHIFT,xmm10); /* xmm10 = y2 */
- paddsw_r2r (xmm1, xmm9); /* xmm9 = a1+b1 */
-
- psraw_i2r (COL_SHIFT, xmm9); /* xmm9 = y1 */
- psubsw_r2r (xmm1, xmm14); /* xmm14 = a1-b1 */
-
- psubsw_r2r (xmm7, xmm13); /* xmm13 = a2-b2 */
- psraw_i2r (COL_SHIFT,xmm14); /* xmm14 = y6 */
-
- movdqa_r2r (xmm8, xmm15); /* xmm15 = a0 */
- psraw_i2r (COL_SHIFT,xmm13); /* xmm13 = y5 */
-
- paddsw_r2r (xmm4, xmm8); /* xmm8 = a0+b0 */
- psubsw_r2r (xmm4, xmm15); /* xmm15 = a0-b0 */
-
- psraw_i2r (COL_SHIFT, xmm8); /* xmm8 = y0 */
- movdqa_r2r (xmm0, xmm12); /* xmm12 = a3 */
-
- psubsw_r2r (xmm11, xmm12); /* xmm12 = a3-b3 */
- psraw_i2r (COL_SHIFT,xmm15); /* xmm15 = y7 */
-
- paddsw_r2r (xmm0, xmm11); /* xmm11 = a3+b3 */
- psraw_i2r (COL_SHIFT,xmm12); /* xmm12 = y4 */
-
- psraw_i2r (COL_SHIFT,xmm11); /* xmm11 = y3 */
-
- /* OUTPUT: block in xmm8 ... xmm15 */
-
-#else
- movdqa_m2r (*t1_vector, xmm0); /* xmm0 = T1 */
-
- movdqa_m2r (*(col+1*8), xmm1); /* xmm1 = x1 */
- movdqa_r2r (xmm0, xmm2); /* xmm2 = T1 */
-
- movdqa_m2r (*(col+7*8), xmm4); /* xmm4 = x7 */
- pmulhw_r2r (xmm1, xmm0); /* xmm0 = T1*x1 */
-
- movdqa_m2r (*t3_vector, xmm5); /* xmm5 = T3 */
- pmulhw_r2r (xmm4, xmm2); /* xmm2 = T1*x7 */
-
- movdqa_m2r (*(col+5*8), xmm6); /* xmm6 = x5 */
- movdqa_r2r (xmm5, xmm7); /* xmm7 = T3-1 */
-
- movdqa_m2r (*(col+3*8), xmm3); /* xmm3 = x3 */
- psubsw_r2r (xmm4, xmm0); /* xmm0 = v17 */
-
- movdqa_m2r (*t2_vector, xmm4); /* xmm4 = T2 */
- pmulhw_r2r (xmm3, xmm5); /* xmm5 = (T3-1)*x3 */
-
- paddsw_r2r (xmm2, xmm1); /* xmm1 = u17 */
- pmulhw_r2r (xmm6, xmm7); /* xmm7 = (T3-1)*x5 */
-
- /* slot */
-
- movdqa_r2r (xmm4, xmm2); /* xmm2 = T2 */
- paddsw_r2r (xmm3, xmm5); /* xmm5 = T3*x3 */
-
- pmulhw_m2r (*(col+2*8), xmm4); /* xmm4 = T2*x2 */
- paddsw_r2r (xmm6, xmm7); /* xmm7 = T3*x5 */
-
- psubsw_r2r (xmm6, xmm5); /* xmm5 = v35 */
- paddsw_r2r (xmm3, xmm7); /* xmm7 = u35 */
-
- movdqa_m2r (*(col+6*8), xmm3); /* xmm3 = x6 */
- movdqa_r2r (xmm0, xmm6); /* xmm6 = v17 */
-
- pmulhw_r2r (xmm3, xmm2); /* xmm2 = T2*x6 */
- psubsw_r2r (xmm5, xmm0); /* xmm0 = b3 */
-
- psubsw_r2r (xmm3, xmm4); /* xmm4 = v26 */
- paddsw_r2r (xmm6, xmm5); /* xmm5 = v12 */
-
- movdqa_r2m (xmm0, *(col+3*8)); /* save b3 in scratch0 */
- movdqa_r2r (xmm1, xmm6); /* xmm6 = u17 */
-
- paddsw_m2r (*(col+2*8), xmm2); /* xmm2 = u26 */
- paddsw_r2r (xmm7, xmm6); /* xmm6 = b0 */
-
- psubsw_r2r (xmm7, xmm1); /* xmm1 = u12 */
- movdqa_r2r (xmm1, xmm7); /* xmm7 = u12 */
-
- movdqa_m2r (*(col+0*8), xmm3); /* xmm3 = x0 */
- paddsw_r2r (xmm5, xmm1); /* xmm1 = u12+v12 */
-
- movdqa_m2r (*c4_vector, xmm0); /* xmm0 = C4/2 */
- psubsw_r2r (xmm5, xmm7); /* xmm7 = u12-v12 */
-
- movdqa_r2m (xmm6, *(col+5*8)); /* save b0 in scratch1 */
- pmulhw_r2r (xmm0, xmm1); /* xmm1 = b1/2 */
-
- movdqa_r2r (xmm4, xmm6); /* xmm6 = v26 */
- pmulhw_r2r (xmm0, xmm7); /* xmm7 = b2/2 */
-
- movdqa_m2r (*(col+4*8), xmm5); /* xmm5 = x4 */
- movdqa_r2r (xmm3, xmm0); /* xmm0 = x0 */
-
- psubsw_r2r (xmm5, xmm3); /* xmm3 = v04 */
- paddsw_r2r (xmm5, xmm0); /* xmm0 = u04 */
-
- paddsw_r2r (xmm3, xmm4); /* xmm4 = a1 */
- movdqa_r2r (xmm0, xmm5); /* xmm5 = u04 */
-
- psubsw_r2r (xmm6, xmm3); /* xmm3 = a2 */
- paddsw_r2r (xmm2, xmm5); /* xmm5 = a0 */
-
- paddsw_r2r (xmm1, xmm1); /* xmm1 = b1 */
- psubsw_r2r (xmm2, xmm0); /* xmm0 = a3 */
-
- paddsw_r2r (xmm7, xmm7); /* xmm7 = b2 */
- movdqa_r2r (xmm3, xmm2); /* xmm2 = a2 */
-
- movdqa_r2r (xmm4, xmm6); /* xmm6 = a1 */
- paddsw_r2r (xmm7, xmm3); /* xmm3 = a2+b2 */
-
- psraw_i2r (COL_SHIFT, xmm3); /* xmm3 = y2 */
- paddsw_r2r (xmm1, xmm4); /* xmm4 = a1+b1 */
-
- psraw_i2r (COL_SHIFT, xmm4); /* xmm4 = y1 */
- psubsw_r2r (xmm1, xmm6); /* xmm6 = a1-b1 */
-
- movdqa_m2r (*(col+5*8), xmm1); /* xmm1 = b0 */
- psubsw_r2r (xmm7, xmm2); /* xmm2 = a2-b2 */
-
- psraw_i2r (COL_SHIFT, xmm6); /* xmm6 = y6 */
- movdqa_r2r (xmm5, xmm7); /* xmm7 = a0 */
-
- movdqa_r2m (xmm4, *(col+1*8)); /* save y1 */
- psraw_i2r (COL_SHIFT, xmm2); /* xmm2 = y5 */
-
- movdqa_r2m (xmm3, *(col+2*8)); /* save y2 */
- paddsw_r2r (xmm1, xmm5); /* xmm5 = a0+b0 */
-
- movdqa_m2r (*(col+3*8), xmm4); /* xmm4 = b3 */
- psubsw_r2r (xmm1, xmm7); /* xmm7 = a0-b0 */
-
- psraw_i2r (COL_SHIFT, xmm5); /* xmm5 = y0 */
- movdqa_r2r (xmm0, xmm3); /* xmm3 = a3 */
-
- movdqa_r2m (xmm2, *(col+5*8)); /* save y5 */
- psubsw_r2r (xmm4, xmm3); /* xmm3 = a3-b3 */
-
- psraw_i2r (COL_SHIFT, xmm7); /* xmm7 = y7 */
- paddsw_r2r (xmm0, xmm4); /* xmm4 = a3+b3 */
-
- movdqa_r2m (xmm5, *(col+0*8)); /* save y0 */
- psraw_i2r (COL_SHIFT, xmm3); /* xmm3 = y4 */
-
- movdqa_r2m (xmm6, *(col+6*8)); /* save y6 */
- psraw_i2r (COL_SHIFT, xmm4); /* xmm4 = y3 */
-
- movdqa_r2m (xmm7, *(col+7*8)); /* save y7 */
-
- movdqa_r2m (xmm3, *(col+4*8)); /* save y4 */
-
- movdqa_r2m (xmm4, *(col+3*8)); /* save y3 */
-#endif
-}
-
-
-/* MMX column IDCT */
-static inline void idct_col (int16_t * const col, const int offset)
-{
- static const short t1_vector[] ATTR_ALIGN(8) = {T1,T1,T1,T1};
- static const short t2_vector[] ATTR_ALIGN(8) = {T2,T2,T2,T2};
- static const short t3_vector[] ATTR_ALIGN(8) = {T3,T3,T3,T3};
- static const short c4_vector[] ATTR_ALIGN(8) = {C4,C4,C4,C4};
-
- /* column code adapted from peter gubanov */
- /* http://www.elecard.com/peter/idct.shtml */
-
- movq_m2r (*t1_vector, mm0); /* mm0 = T1 */
-
- movq_m2r (*(col+offset+1*8), mm1); /* mm1 = x1 */
- movq_r2r (mm0, mm2); /* mm2 = T1 */
-
- movq_m2r (*(col+offset+7*8), mm4); /* mm4 = x7 */
- pmulhw_r2r (mm1, mm0); /* mm0 = T1*x1 */
-
- movq_m2r (*t3_vector, mm5); /* mm5 = T3 */
- pmulhw_r2r (mm4, mm2); /* mm2 = T1*x7 */
-
- movq_m2r (*(col+offset+5*8), mm6); /* mm6 = x5 */
- movq_r2r (mm5, mm7); /* mm7 = T3-1 */
-
- movq_m2r (*(col+offset+3*8), mm3); /* mm3 = x3 */
- psubsw_r2r (mm4, mm0); /* mm0 = v17 */
-
- movq_m2r (*t2_vector, mm4); /* mm4 = T2 */
- pmulhw_r2r (mm3, mm5); /* mm5 = (T3-1)*x3 */
-
- paddsw_r2r (mm2, mm1); /* mm1 = u17 */
- pmulhw_r2r (mm6, mm7); /* mm7 = (T3-1)*x5 */
-
- /* slot */
-
- movq_r2r (mm4, mm2); /* mm2 = T2 */
- paddsw_r2r (mm3, mm5); /* mm5 = T3*x3 */
-
- pmulhw_m2r (*(col+offset+2*8), mm4);/* mm4 = T2*x2 */
- paddsw_r2r (mm6, mm7); /* mm7 = T3*x5 */
-
- psubsw_r2r (mm6, mm5); /* mm5 = v35 */
- paddsw_r2r (mm3, mm7); /* mm7 = u35 */
-
- movq_m2r (*(col+offset+6*8), mm3); /* mm3 = x6 */
- movq_r2r (mm0, mm6); /* mm6 = v17 */
-
- pmulhw_r2r (mm3, mm2); /* mm2 = T2*x6 */
- psubsw_r2r (mm5, mm0); /* mm0 = b3 */
-
- psubsw_r2r (mm3, mm4); /* mm4 = v26 */
- paddsw_r2r (mm6, mm5); /* mm5 = v12 */
-
- movq_r2m (mm0, *(col+offset+3*8)); /* save b3 in scratch0 */
- movq_r2r (mm1, mm6); /* mm6 = u17 */
-
- paddsw_m2r (*(col+offset+2*8), mm2);/* mm2 = u26 */
- paddsw_r2r (mm7, mm6); /* mm6 = b0 */
-
- psubsw_r2r (mm7, mm1); /* mm1 = u12 */
- movq_r2r (mm1, mm7); /* mm7 = u12 */
-
- movq_m2r (*(col+offset+0*8), mm3); /* mm3 = x0 */
- paddsw_r2r (mm5, mm1); /* mm1 = u12+v12 */
-
- movq_m2r (*c4_vector, mm0); /* mm0 = C4/2 */
- psubsw_r2r (mm5, mm7); /* mm7 = u12-v12 */
-
- movq_r2m (mm6, *(col+offset+5*8)); /* save b0 in scratch1 */
- pmulhw_r2r (mm0, mm1); /* mm1 = b1/2 */
-
- movq_r2r (mm4, mm6); /* mm6 = v26 */
- pmulhw_r2r (mm0, mm7); /* mm7 = b2/2 */
-
- movq_m2r (*(col+offset+4*8), mm5); /* mm5 = x4 */
- movq_r2r (mm3, mm0); /* mm0 = x0 */
-
- psubsw_r2r (mm5, mm3); /* mm3 = v04 */
- paddsw_r2r (mm5, mm0); /* mm0 = u04 */
-
- paddsw_r2r (mm3, mm4); /* mm4 = a1 */
- movq_r2r (mm0, mm5); /* mm5 = u04 */
-
- psubsw_r2r (mm6, mm3); /* mm3 = a2 */
- paddsw_r2r (mm2, mm5); /* mm5 = a0 */
-
- paddsw_r2r (mm1, mm1); /* mm1 = b1 */
- psubsw_r2r (mm2, mm0); /* mm0 = a3 */
-
- paddsw_r2r (mm7, mm7); /* mm7 = b2 */
- movq_r2r (mm3, mm2); /* mm2 = a2 */
-
- movq_r2r (mm4, mm6); /* mm6 = a1 */
- paddsw_r2r (mm7, mm3); /* mm3 = a2+b2 */
-
- psraw_i2r (COL_SHIFT, mm3); /* mm3 = y2 */
- paddsw_r2r (mm1, mm4); /* mm4 = a1+b1 */
-
- psraw_i2r (COL_SHIFT, mm4); /* mm4 = y1 */
- psubsw_r2r (mm1, mm6); /* mm6 = a1-b1 */
-
- movq_m2r (*(col+offset+5*8), mm1); /* mm1 = b0 */
- psubsw_r2r (mm7, mm2); /* mm2 = a2-b2 */
-
- psraw_i2r (COL_SHIFT, mm6); /* mm6 = y6 */
- movq_r2r (mm5, mm7); /* mm7 = a0 */
-
- movq_r2m (mm4, *(col+offset+1*8)); /* save y1 */
- psraw_i2r (COL_SHIFT, mm2); /* mm2 = y5 */
-
- movq_r2m (mm3, *(col+offset+2*8)); /* save y2 */
- paddsw_r2r (mm1, mm5); /* mm5 = a0+b0 */
-
- movq_m2r (*(col+offset+3*8), mm4); /* mm4 = b3 */
- psubsw_r2r (mm1, mm7); /* mm7 = a0-b0 */
-
- psraw_i2r (COL_SHIFT, mm5); /* mm5 = y0 */
- movq_r2r (mm0, mm3); /* mm3 = a3 */
-
- movq_r2m (mm2, *(col+offset+5*8)); /* save y5 */
- psubsw_r2r (mm4, mm3); /* mm3 = a3-b3 */
-
- psraw_i2r (COL_SHIFT, mm7); /* mm7 = y7 */
- paddsw_r2r (mm0, mm4); /* mm4 = a3+b3 */
-
- movq_r2m (mm5, *(col+offset+0*8)); /* save y0 */
- psraw_i2r (COL_SHIFT, mm3); /* mm3 = y4 */
-
- movq_r2m (mm6, *(col+offset+6*8)); /* save y6 */
- psraw_i2r (COL_SHIFT, mm4); /* mm4 = y3 */
-
- movq_r2m (mm7, *(col+offset+7*8)); /* save y7 */
-
- movq_r2m (mm3, *(col+offset+4*8)); /* save y4 */
-
- movq_r2m (mm4, *(col+offset+3*8)); /* save y3 */
-}
-
-
-static const int32_t rounder0[] ATTR_ALIGN(8) =
- rounder ((1 << (COL_SHIFT - 1)) - 0.5);
-static const int32_t rounder4[] ATTR_ALIGN(8) = rounder (0);
-static const int32_t rounder1[] ATTR_ALIGN(8) =
- rounder (1.25683487303); /* C1*(C1/C4+C1+C7)/2 */
-static const int32_t rounder7[] ATTR_ALIGN(8) =
- rounder (-0.25); /* C1*(C7/C4+C7-C1)/2 */
-static const int32_t rounder2[] ATTR_ALIGN(8) =
- rounder (0.60355339059); /* C2 * (C6+C2)/2 */
-static const int32_t rounder6[] ATTR_ALIGN(8) =
- rounder (-0.25); /* C2 * (C6-C2)/2 */
-static const int32_t rounder3[] ATTR_ALIGN(8) =
- rounder (0.087788325588); /* C3*(-C3/C4+C3+C5)/2 */
-static const int32_t rounder5[] ATTR_ALIGN(8) =
- rounder (-0.441341716183); /* C3*(-C5/C4+C5-C3)/2 */
-
-
-#define declare_idct(idct,table,idct_row_head,idct_row,idct_row_tail,idct_row_mid) \
-static inline void idct (int16_t * const block) \
-{ \
- static const int16_t table04[] ATTR_ALIGN(16) = \
- table (22725, 21407, 19266, 16384, 12873, 8867, 4520); \
- static const int16_t table17[] ATTR_ALIGN(16) = \
- table (31521, 29692, 26722, 22725, 17855, 12299, 6270); \
- static const int16_t table26[] ATTR_ALIGN(16) = \
- table (29692, 27969, 25172, 21407, 16819, 11585, 5906); \
- static const int16_t table35[] ATTR_ALIGN(16) = \
- table (26722, 25172, 22654, 19266, 15137, 10426, 5315); \
- \
- idct_row_head (block, 0*8, table04); \
- idct_row (table04, rounder0); \
- idct_row_mid (block, 0*8, 4*8, table04); \
- idct_row (table04, rounder4); \
- idct_row_mid (block, 4*8, 1*8, table17); \
- idct_row (table17, rounder1); \
- idct_row_mid (block, 1*8, 7*8, table17); \
- idct_row (table17, rounder7); \
- idct_row_mid (block, 7*8, 2*8, table26); \
- idct_row (table26, rounder2); \
- idct_row_mid (block, 2*8, 6*8, table26); \
- idct_row (table26, rounder6); \
- idct_row_mid (block, 6*8, 3*8, table35); \
- idct_row (table35, rounder3); \
- idct_row_mid (block, 3*8, 5*8, table35); \
- idct_row (table35, rounder5); \
- idct_row_tail (block, 5*8); \
- \
- idct_col (block, 0); \
- idct_col (block, 4); \
-}
-
-static inline void sse2_idct (int16_t * const block)
-{
- static const int16_t table04[] ATTR_ALIGN(16) =
- sse2_table (22725, 21407, 19266, 16384, 12873, 8867, 4520);
- static const int16_t table17[] ATTR_ALIGN(16) =
- sse2_table (31521, 29692, 26722, 22725, 17855, 12299, 6270);
- static const int16_t table26[] ATTR_ALIGN(16) =
- sse2_table (29692, 27969, 25172, 21407, 16819, 11585, 5906);
- static const int16_t table35[] ATTR_ALIGN(16) =
- sse2_table (26722, 25172, 22654, 19266, 15137, 10426, 5315);
-
- static const int32_t rounder0_128[] ATTR_ALIGN(16) =
- rounder_sse2 ((1 << (COL_SHIFT - 1)) - 0.5);
- static const int32_t rounder4_128[] ATTR_ALIGN(16) = rounder_sse2 (0);
- static const int32_t rounder1_128[] ATTR_ALIGN(16) =
- rounder_sse2 (1.25683487303); /* C1*(C1/C4+C1+C7)/2 */
- static const int32_t rounder7_128[] ATTR_ALIGN(16) =
- rounder_sse2 (-0.25); /* C1*(C7/C4+C7-C1)/2 */
- static const int32_t rounder2_128[] ATTR_ALIGN(16) =
- rounder_sse2 (0.60355339059); /* C2 * (C6+C2)/2 */
- static const int32_t rounder6_128[] ATTR_ALIGN(16) =
- rounder_sse2 (-0.25); /* C2 * (C6-C2)/2 */
- static const int32_t rounder3_128[] ATTR_ALIGN(16) =
- rounder_sse2 (0.087788325588); /* C3*(-C3/C4+C3+C5)/2 */
- static const int32_t rounder5_128[] ATTR_ALIGN(16) =
- rounder_sse2 (-0.441341716183); /* C3*(-C5/C4+C5-C3)/2 */
-
-#if defined(__x86_64__)
- movdqa_m2r (block[0*8], xmm8);
- movdqa_m2r (block[4*8], xmm12);
- SSE2_IDCT_2ROW (table04, xmm8, xmm12, *rounder0_128, *rounder4_128);
-
- movdqa_m2r (block[1*8], xmm9);
- movdqa_m2r (block[7*8], xmm15);
- SSE2_IDCT_2ROW (table17, xmm9, xmm15, *rounder1_128, *rounder7_128);
-
- movdqa_m2r (block[2*8], xmm10);
- movdqa_m2r (block[6*8], xmm14);
- SSE2_IDCT_2ROW (table26, xmm10, xmm14, *rounder2_128, *rounder6_128);
-
- movdqa_m2r (block[3*8], xmm11);
- movdqa_m2r (block[5*8], xmm13);
- SSE2_IDCT_2ROW (table35, xmm11, xmm13, *rounder3_128, *rounder5_128);
-
- /* OUTPUT: block in xmm8 ... xmm15 */
-
-#else
- movdqa_m2r (block[0*8], xmm0);
- movdqa_m2r (block[4*8], xmm4);
- SSE2_IDCT_2ROW (table04, xmm0, xmm4, *rounder0_128, *rounder4_128);
- movdqa_r2m (xmm0, block[0*8]);
- movdqa_r2m (xmm4, block[4*8]);
-
- movdqa_m2r (block[1*8], xmm0);
- movdqa_m2r (block[7*8], xmm4);
- SSE2_IDCT_2ROW (table17, xmm0, xmm4, *rounder1_128, *rounder7_128);
- movdqa_r2m (xmm0, block[1*8]);
- movdqa_r2m (xmm4, block[7*8]);
-
- movdqa_m2r (block[2*8], xmm0);
- movdqa_m2r (block[6*8], xmm4);
- SSE2_IDCT_2ROW (table26, xmm0, xmm4, *rounder2_128, *rounder6_128);
- movdqa_r2m (xmm0, block[2*8]);
- movdqa_r2m (xmm4, block[6*8]);
-
- movdqa_m2r (block[3*8], xmm0);
- movdqa_m2r (block[5*8], xmm4);
- SSE2_IDCT_2ROW (table35, xmm0, xmm4, *rounder3_128, *rounder5_128);
- movdqa_r2m (xmm0, block[3*8]);
- movdqa_r2m (xmm4, block[5*8]);
-#endif
-
- sse2_idct_col (block);
-}
-
-static void sse2_block_copy (int16_t * const block, uint8_t * dest,
- const int stride)
-{
-#if defined(__x86_64__)
- /* INPUT: block in xmm8 ... xmm15 */
- packuswb_r2r (xmm8, xmm8);
- packuswb_r2r (xmm9, xmm9);
- movq_r2m (xmm8, *(dest+0*stride));
- packuswb_r2r (xmm10, xmm10);
- movq_r2m (xmm9, *(dest+1*stride));
- packuswb_r2r (xmm11, xmm11);
- movq_r2m (xmm10, *(dest+2*stride));
- packuswb_r2r (xmm12, xmm12);
- movq_r2m (xmm11, *(dest+3*stride));
- packuswb_r2r (xmm13, xmm13);
- movq_r2m (xmm12, *(dest+4*stride));
- packuswb_r2r (xmm14, xmm14);
- movq_r2m (xmm13, *(dest+5*stride));
- packuswb_r2r (xmm15, xmm15);
- movq_r2m (xmm14, *(dest+6*stride));
- movq_r2m (xmm15, *(dest+7*stride));
-#else
- movdqa_m2r (*(block+0*8), xmm0);
- movdqa_m2r (*(block+1*8), xmm1);
- movdqa_m2r (*(block+2*8), xmm2);
- packuswb_r2r (xmm0, xmm0);
- movdqa_m2r (*(block+3*8), xmm3);
- packuswb_r2r (xmm1, xmm1);
- movdqa_m2r (*(block+4*8), xmm4);
- packuswb_r2r (xmm2, xmm2);
- movdqa_m2r (*(block+5*8), xmm5);
- packuswb_r2r (xmm3, xmm3);
- movdqa_m2r (*(block+6*8), xmm6);
- packuswb_r2r (xmm4, xmm4);
- movdqa_m2r (*(block+7*8), xmm7);
- movq_r2m (xmm0, *(dest+0*stride));
- packuswb_r2r (xmm5, xmm5);
- movq_r2m (xmm1, *(dest+1*stride));
- packuswb_r2r (xmm6, xmm6);
- movq_r2m (xmm2, *(dest+2*stride));
- packuswb_r2r (xmm7, xmm7);
- movq_r2m (xmm3, *(dest+3*stride));
- movq_r2m (xmm4, *(dest+4*stride));
- movq_r2m (xmm5, *(dest+5*stride));
- movq_r2m (xmm6, *(dest+6*stride));
- movq_r2m (xmm7, *(dest+7*stride));
-#endif
-}
-
-#define COPY_MMX(offset,r0,r1,r2) \
-do { \
- movq_m2r (*(block+offset), r0); \
- dest += stride; \
- movq_m2r (*(block+offset+4), r1); \
- movq_r2m (r2, *dest); \
- packuswb_r2r (r1, r0); \
-} while (0)
-
-static inline void block_copy (int16_t * const block, uint8_t * dest,
- const int stride)
-{
- movq_m2r (*(block+0*8), mm0);
- movq_m2r (*(block+0*8+4), mm1);
- movq_m2r (*(block+1*8), mm2);
- packuswb_r2r (mm1, mm0);
- movq_m2r (*(block+1*8+4), mm3);
- movq_r2m (mm0, *dest);
- packuswb_r2r (mm3, mm2);
- COPY_MMX (2*8, mm0, mm1, mm2);
- COPY_MMX (3*8, mm2, mm3, mm0);
- COPY_MMX (4*8, mm0, mm1, mm2);
- COPY_MMX (5*8, mm2, mm3, mm0);
- COPY_MMX (6*8, mm0, mm1, mm2);
- COPY_MMX (7*8, mm2, mm3, mm0);
- movq_r2m (mm2, *(dest+stride));
-}
-
-#define ADD_SSE2_2ROW(op, block0, block1)\
-do { \
- movq_m2r (*(dest), xmm1); \
- movq_m2r (*(dest+stride), xmm2); \
- punpcklbw_r2r (xmm0, xmm1); \
- punpcklbw_r2r (xmm0, xmm2); \
- paddsw_##op (block0, xmm1); \
- paddsw_##op (block1, xmm2); \
- packuswb_r2r (xmm1, xmm1); \
- packuswb_r2r (xmm2, xmm2); \
- movq_r2m (xmm1, *(dest)); \
- movq_r2m (xmm2, *(dest+stride)); \
- dest += 2*stride; \
-} while (0)
-
-static void sse2_block_add (int16_t * const block, uint8_t * dest,
- const int stride)
-{
- pxor_r2r(xmm0, xmm0);
-#if defined(__x86_64__)
- /* INPUT: block in xmm8 ... xmm15 */
- ADD_SSE2_2ROW(r2r, xmm8, xmm9);
- ADD_SSE2_2ROW(r2r, xmm10, xmm11);
- ADD_SSE2_2ROW(r2r, xmm12, xmm13);
- ADD_SSE2_2ROW(r2r, xmm14, xmm15);
-#else
- ADD_SSE2_2ROW(m2r, *(block+0*8), *(block+1*8));
- ADD_SSE2_2ROW(m2r, *(block+2*8), *(block+3*8));
- ADD_SSE2_2ROW(m2r, *(block+4*8), *(block+5*8));
- ADD_SSE2_2ROW(m2r, *(block+6*8), *(block+7*8));
-#endif
-}
-
-#define ADD_MMX(offset,r1,r2,r3,r4) \
-do { \
- movq_m2r (*(dest+2*stride), r1); \
- packuswb_r2r (r4, r3); \
- movq_r2r (r1, r2); \
- dest += stride; \
- movq_r2m (r3, *dest); \
- punpcklbw_r2r (mm0, r1); \
- paddsw_m2r (*(block+offset), r1); \
- punpckhbw_r2r (mm0, r2); \
- paddsw_m2r (*(block+offset+4), r2); \
-} while (0)
-
-static inline void block_add (int16_t * const block, uint8_t * dest,
- const int stride)
-{
- movq_m2r (*dest, mm1);
- pxor_r2r (mm0, mm0);
- movq_m2r (*(dest+stride), mm3);
- movq_r2r (mm1, mm2);
- punpcklbw_r2r (mm0, mm1);
- movq_r2r (mm3, mm4);
- paddsw_m2r (*(block+0*8), mm1);
- punpckhbw_r2r (mm0, mm2);
- paddsw_m2r (*(block+0*8+4), mm2);
- punpcklbw_r2r (mm0, mm3);
- paddsw_m2r (*(block+1*8), mm3);
- packuswb_r2r (mm2, mm1);
- punpckhbw_r2r (mm0, mm4);
- movq_r2m (mm1, *dest);
- paddsw_m2r (*(block+1*8+4), mm4);
- ADD_MMX (2*8, mm1, mm2, mm3, mm4);
- ADD_MMX (3*8, mm3, mm4, mm1, mm2);
- ADD_MMX (4*8, mm1, mm2, mm3, mm4);
- ADD_MMX (5*8, mm3, mm4, mm1, mm2);
- ADD_MMX (6*8, mm1, mm2, mm3, mm4);
- ADD_MMX (7*8, mm3, mm4, mm1, mm2);
- packuswb_r2r (mm4, mm3);
- movq_r2m (mm3, *(dest+stride));
-}
-
-
-static inline void sse2_block_zero (int16_t * const block)
-{
- pxor_r2r (xmm0, xmm0);
- movdqa_r2m (xmm0, *(block+0*8));
- movdqa_r2m (xmm0, *(block+1*8));
- movdqa_r2m (xmm0, *(block+2*8));
- movdqa_r2m (xmm0, *(block+3*8));
- movdqa_r2m (xmm0, *(block+4*8));
- movdqa_r2m (xmm0, *(block+5*8));
- movdqa_r2m (xmm0, *(block+6*8));
- movdqa_r2m (xmm0, *(block+7*8));
-}
-
-static inline void block_zero (int16_t * const block)
-{
- pxor_r2r (mm0, mm0);
- movq_r2m (mm0, *(block+0*4));
- movq_r2m (mm0, *(block+1*4));
- movq_r2m (mm0, *(block+2*4));
- movq_r2m (mm0, *(block+3*4));
- movq_r2m (mm0, *(block+4*4));
- movq_r2m (mm0, *(block+5*4));
- movq_r2m (mm0, *(block+6*4));
- movq_r2m (mm0, *(block+7*4));
- movq_r2m (mm0, *(block+8*4));
- movq_r2m (mm0, *(block+9*4));
- movq_r2m (mm0, *(block+10*4));
- movq_r2m (mm0, *(block+11*4));
- movq_r2m (mm0, *(block+12*4));
- movq_r2m (mm0, *(block+13*4));
- movq_r2m (mm0, *(block+14*4));
- movq_r2m (mm0, *(block+15*4));
-}
-
-
-#define CPU_MMXEXT 0
-#define CPU_MMX 1
-
-#define dup4(reg) \
-do { \
- if (cpu != CPU_MMXEXT) { \
- punpcklwd_r2r (reg, reg); \
- punpckldq_r2r (reg, reg); \
- } else \
- pshufw_r2r (reg, reg, 0x00); \
-} while (0)
-
-static inline void block_add_DC (int16_t * const block, uint8_t * dest,
- const int stride, const int cpu)
-{
- movd_v2r ((block[0] + 64) >> 7, mm0);
- pxor_r2r (mm1, mm1);
- movq_m2r (*dest, mm2);
- dup4 (mm0);
- psubsw_r2r (mm0, mm1);
- packuswb_r2r (mm0, mm0);
- paddusb_r2r (mm0, mm2);
- packuswb_r2r (mm1, mm1);
- movq_m2r (*(dest + stride), mm3);
- psubusb_r2r (mm1, mm2);
- block[0] = 0;
- paddusb_r2r (mm0, mm3);
- movq_r2m (mm2, *dest);
- psubusb_r2r (mm1, mm3);
- movq_m2r (*(dest + 2*stride), mm2);
- dest += stride;
- movq_r2m (mm3, *dest);
- paddusb_r2r (mm0, mm2);
- movq_m2r (*(dest + 2*stride), mm3);
- psubusb_r2r (mm1, mm2);
- dest += stride;
- paddusb_r2r (mm0, mm3);
- movq_r2m (mm2, *dest);
- psubusb_r2r (mm1, mm3);
- movq_m2r (*(dest + 2*stride), mm2);
- dest += stride;
- movq_r2m (mm3, *dest);
- paddusb_r2r (mm0, mm2);
- movq_m2r (*(dest + 2*stride), mm3);
- psubusb_r2r (mm1, mm2);
- dest += stride;
- paddusb_r2r (mm0, mm3);
- movq_r2m (mm2, *dest);
- psubusb_r2r (mm1, mm3);
- movq_m2r (*(dest + 2*stride), mm2);
- dest += stride;
- movq_r2m (mm3, *dest);
- paddusb_r2r (mm0, mm2);
- movq_m2r (*(dest + 2*stride), mm3);
- psubusb_r2r (mm1, mm2);
- block[63] = 0;
- paddusb_r2r (mm0, mm3);
- movq_r2m (mm2, *(dest + stride));
- psubusb_r2r (mm1, mm3);
- movq_r2m (mm3, *(dest + 2*stride));
-}
-
-void mpeg2_idct_copy_sse2 (int16_t * const block, uint8_t * const dest,
- const int stride)
-{
- sse2_idct (block);
- sse2_block_copy (block, dest, stride);
- sse2_block_zero (block);
-}
-
-void mpeg2_idct_add_sse2 (const int last, int16_t * const block,
- uint8_t * const dest, const int stride)
-{
- if (last != 129 || (block[0] & (7 << 4)) == (4 << 4)) {
- sse2_idct (block);
- sse2_block_add (block, dest, stride);
- sse2_block_zero (block);
- } else
- block_add_DC (block, dest, stride, CPU_MMXEXT);
-}
-
-
-declare_idct (mmxext_idct, mmxext_table,
- mmxext_row_head, mmxext_row, mmxext_row_tail, mmxext_row_mid)
-
-void mpeg2_idct_copy_mmxext (int16_t * const block, uint8_t * const dest,
- const int stride)
-{
- mmxext_idct (block);
- block_copy (block, dest, stride);
- block_zero (block);
-}
-
-void mpeg2_idct_add_mmxext (const int last, int16_t * const block,
- uint8_t * const dest, const int stride)
-{
- if (last != 129 || (block[0] & (7 << 4)) == (4 << 4)) {
- mmxext_idct (block);
- block_add (block, dest, stride);
- block_zero (block);
- } else
- block_add_DC (block, dest, stride, CPU_MMXEXT);
-}
-
-
-declare_idct (mmx_idct, mmx_table,
- mmx_row_head, mmx_row, mmx_row_tail, mmx_row_mid)
-
-void mpeg2_idct_copy_mmx (int16_t * const block, uint8_t * const dest,
- const int stride)
-{
- mmx_idct (block);
- block_copy (block, dest, stride);
- block_zero (block);
-}
-
-void mpeg2_idct_add_mmx (const int last, int16_t * const block,
- uint8_t * const dest, const int stride)
-{
- if (last != 129 || (block[0] & (7 << 4)) == (4 << 4)) {
- mmx_idct (block);
- block_add (block, dest, stride);
- block_zero (block);
- } else
- block_add_DC (block, dest, stride, CPU_MMX);
-}
-
-
-void mpeg2_idct_mmx_init (void)
-{
- int i, j;
-
- /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
-
- for (i = 0; i < 64; i++) {
- j = mpeg2_scan_norm[i];
- mpeg2_scan_norm[i] = (j & 0x38) | ((j & 6) >> 1) | ((j & 1) << 2);
- j = mpeg2_scan_alt[i];
- mpeg2_scan_alt[i] = (j & 0x38) | ((j & 6) >> 1) | ((j & 1) << 2);
- }
-}
-
-#endif
diff --git a/libmpeg2/libmpeg2_changes.diff b/libmpeg2/libmpeg2_changes.diff
deleted file mode 100644
index 5e55453ab1..0000000000
--- a/libmpeg2/libmpeg2_changes.diff
+++ /dev/null
@@ -1,439 +0,0 @@
---- libmpeg2/cpu_accel.c 2006-06-16 20:12:26.000000000 +0200
-+++ libmpeg2/cpu_accel.c 2006-06-16 20:12:50.000000000 +0200
-@@ -29,9 +33,13 @@
- #include "attributes.h"
- #include "mpeg2_internal.h"
-
-+#include "cpudetect.h"
-+
--#if defined(ARCH_X86) || defined(ARCH_X86_64)
-+#if ARCH_X86 || ARCH_X86_64
- static inline uint32_t arch_accel (uint32_t accel)
- {
-+/* Use MPlayer CPU detection instead of libmpeg2 variant. */
-+#if 0
- if (accel & (MPEG2_ACCEL_X86_3DNOW | MPEG2_ACCEL_X86_MMXEXT))
- accel |= MPEG2_ACCEL_X86_MMX;
-
-@@ -124,6 +132,21 @@
- #endif /* ACCEL_DETECT */
-
- return accel;
-+
-+#else /* 0 */
-+ accel = 0;
-+ if (gCpuCaps.hasMMX)
-+ accel |= MPEG2_ACCEL_X86_MMX;
-+ if (gCpuCaps.hasSSE2)
-+ accel |= MPEG2_ACCEL_X86_SSE2;
-+ if (gCpuCaps.hasMMX2)
-+ accel |= MPEG2_ACCEL_X86_MMXEXT;
-+ if (gCpuCaps.has3DNow)
-+ accel |= MPEG2_ACCEL_X86_3DNOW;
-+
-+ return accel;
-+
-+#endif /* 0 */
- }
- #endif /* ARCH_X86 || ARCH_X86_64 */
-
-@@ -127,7 +150,7 @@
- }
- #endif /* ARCH_X86 || ARCH_X86_64 */
-
--#if defined(ACCEL_DETECT) && (defined(ARCH_PPC) || defined(ARCH_SPARC))
-+#if defined(ACCEL_DETECT) && (ARCH_PPC || ARCH_SPARC)
- #include <signal.h>
- #include <setjmp.h>
-
-@@ -146,7 +169,7 @@
- }
- #endif /* ACCEL_DETECT && (ARCH_PPC || ARCH_SPARC) */
-
--#ifdef ARCH_PPC
-+#if ARCH_PPC
- static uint32_t arch_accel (uint32_t accel)
- {
- #ifdef ACCEL_DETECT
-@@ -183,7 +206,7 @@
- }
- #endif /* ARCH_PPC */
-
--#ifdef ARCH_SPARC
-+#if ARCH_SPARC
- static uint32_t arch_accel (uint32_t accel)
- {
- if (accel & MPEG2_ACCEL_SPARC_VIS2)
-@@ -229,7 +252,7 @@
- }
- #endif /* ARCH_SPARC */
-
--#ifdef ARCH_ALPHA
-+#if ARCH_ALPHA
- static inline uint32_t arch_accel (uint32_t accel)
- {
- if (accel & MPEG2_ACCEL_ALPHA_MVI)
-@@ -253,7 +276,7 @@
-
- uint32_t mpeg2_detect_accel (uint32_t accel)
- {
--#if defined (ARCH_X86) || defined (ARCH_X86_64) || defined (ARCH_PPC) || defined (ARCH_ALPHA) || defined (ARCH_SPARC)
-+#if ARCH_X86 || ARCH_X86_64 || ARCH_PPC || ARCH_ALPHA || ARCH_SPARC
- accel = arch_accel (accel);
- #endif
- return accel;
-Index: libmpeg2/cpu_state.c
-===================================================================
---- libmpeg2/cpu_state.c (revision 28324)
-+++ libmpeg2/cpu_state.c (revision 28325)
-@@ -29,21 +29,21 @@
- #include "mpeg2.h"
- #include "attributes.h"
- #include "mpeg2_internal.h"
--#if defined(ARCH_X86) || defined(ARCH_X86_64)
-+#if ARCH_X86 || ARCH_X86_64
- #include "mmx.h"
- #endif
-
- void (* mpeg2_cpu_state_save) (cpu_state_t * state) = NULL;
- void (* mpeg2_cpu_state_restore) (cpu_state_t * state) = NULL;
-
--#if defined(ARCH_X86) || defined(ARCH_X86_64)
-+#if ARCH_X86 || ARCH_X86_64
- static void state_restore_mmx (cpu_state_t * state)
- {
- emms ();
- }
- #endif
-
--#ifdef ARCH_PPC
-+#if ARCH_PPC
- #if defined(__APPLE_CC__) /* apple */
- #define LI(a,b) "li r" #a "," #b "\n\t"
- #define STVX0(a,b,c) "stvx v" #a ",0,r" #c "\n\t"
-@@ -115,12 +115,12 @@
-
- void mpeg2_cpu_state_init (uint32_t accel)
- {
--#if defined(ARCH_X86) || defined(ARCH_X86_64)
-+#if ARCH_X86 || ARCH_X86_64
- if (accel & MPEG2_ACCEL_X86_MMX) {
- mpeg2_cpu_state_restore = state_restore_mmx;
- }
- #endif
--#ifdef ARCH_PPC
-+#if ARCH_PPC
- if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
- mpeg2_cpu_state_save = state_save_altivec;
- mpeg2_cpu_state_restore = state_restore_altivec;
---- libmpeg2/decode.c 2006-06-16 20:12:26.000000000 +0200
-+++ libmpeg2/decode.c 2006-06-16 20:12:50.000000000 +0200
-@@ -345,6 +349,15 @@
- fbuf->buf[1] = buf[1];
- fbuf->buf[2] = buf[2];
- fbuf->id = id;
-+ // HACK! FIXME! At first I frame, copy pointers to prediction frame too!
-+ if (mpeg2dec->custom_fbuf && !mpeg2dec->fbuf[1]->buf[0]){
-+ mpeg2dec->fbuf[1]->buf[0]=buf[0];
-+ mpeg2dec->fbuf[1]->buf[1]=buf[1];
-+ mpeg2dec->fbuf[1]->buf[2]=buf[2];
-+ mpeg2dec->fbuf[1]->id=NULL;
-+ }
-+// printf("libmpeg2: FBUF 0:%p 1:%p 2:%p\n",
-+// mpeg2dec->fbuf[0]->buf[0],mpeg2dec->fbuf[1]->buf[0],mpeg2dec->fbuf[2]->buf[0]);
- }
-
- void mpeg2_custom_fbuf (mpeg2dec_t * mpeg2dec, int custom_fbuf)
---- libmpeg2/header.c 2006-06-16 20:12:26.000000000 +0200
-+++ libmpeg2/header.c 2006-06-16 20:12:50.000000000 +0200
-@@ -100,6 +104,9 @@
- mpeg2dec->decoder.convert = NULL;
- mpeg2dec->decoder.convert_id = NULL;
- mpeg2dec->picture = mpeg2dec->pictures;
-+ memset(&mpeg2dec->fbuf_alloc[0].fbuf, 0, sizeof(mpeg2_fbuf_t));
-+ memset(&mpeg2dec->fbuf_alloc[1].fbuf, 0, sizeof(mpeg2_fbuf_t));
-+ memset(&mpeg2dec->fbuf_alloc[2].fbuf, 0, sizeof(mpeg2_fbuf_t));
- mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf;
- mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf;
- mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf;
-@@ -872,6 +879,7 @@
- mpeg2dec->scaled[idx] = decoder->q_scale_type;
- for (i = 0; i < 32; i++) {
- k = decoder->q_scale_type ? non_linear_scale[i] : (i << 1);
-+ decoder->quantizer_scales[i] = k;
- for (j = 0; j < 64; j++)
- decoder->quantizer_prescale[idx][i][j] =
- k * mpeg2dec->quantizer_matrix[idx][j];
---- libmpeg2/idct.c (revision 26652)
-+++ libmpeg2/idct.c (working copy)
-@@ -235,34 +239,40 @@
-
- void mpeg2_idct_init (uint32_t accel)
- {
--#ifdef ARCH_X86
-+#if HAVE_SSE2
- if (accel & MPEG2_ACCEL_X86_SSE2) {
- mpeg2_idct_copy = mpeg2_idct_copy_sse2;
- mpeg2_idct_add = mpeg2_idct_add_sse2;
- mpeg2_idct_mmx_init ();
-- } else if (accel & MPEG2_ACCEL_X86_MMXEXT) {
-+ } else
-+#elif HAVE_MMX2
-+ if (accel & MPEG2_ACCEL_X86_MMXEXT) {
- mpeg2_idct_copy = mpeg2_idct_copy_mmxext;
- mpeg2_idct_add = mpeg2_idct_add_mmxext;
- mpeg2_idct_mmx_init ();
-- } else if (accel & MPEG2_ACCEL_X86_MMX) {
-+ } else
-+#elif HAVE_MMX
-+ if (accel & MPEG2_ACCEL_X86_MMX) {
- mpeg2_idct_copy = mpeg2_idct_copy_mmx;
- mpeg2_idct_add = mpeg2_idct_add_mmx;
- mpeg2_idct_mmx_init ();
- } else
- #endif
--#ifdef ARCH_PPC
-+#if HAVE_ALTIVEC
- if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
- mpeg2_idct_copy = mpeg2_idct_copy_altivec;
- mpeg2_idct_add = mpeg2_idct_add_altivec;
- mpeg2_idct_altivec_init ();
- } else
- #endif
--#ifdef ARCH_ALPHA
-+#if HAVE_MVI
- if (accel & MPEG2_ACCEL_ALPHA_MVI) {
- mpeg2_idct_copy = mpeg2_idct_copy_mvi;
- mpeg2_idct_add = mpeg2_idct_add_mvi;
- mpeg2_idct_alpha_init ();
-- } else if (accel & MPEG2_ACCEL_ALPHA) {
-+ } else
-+#elif ARCH_ALPHA
-+ if (accel & MPEG2_ACCEL_ALPHA) {
- int i;
-
- mpeg2_idct_copy = mpeg2_idct_copy_alpha;
-Index: libmpeg2/idct_alpha.c
-===================================================================
---- libmpeg2/idct_alpha.c (revision 28324)
-+++ libmpeg2/idct_alpha.c (revision 28325)
-@@ -24,7 +24,7 @@
-
- #include "config.h"
-
--#ifdef ARCH_ALPHA
-+#if ARCH_ALPHA
-
- #include <stdlib.h>
- #include <inttypes.h>
-Index: libmpeg2/idct_altivec.c
-===================================================================
---- libmpeg2/idct_altivec.c (revision 28324)
-+++ libmpeg2/idct_altivec.c (revision 28325)
-@@ -23,7 +23,7 @@
-
- #include "config.h"
-
--#ifdef ARCH_PPC
-+#if ARCH_PPC
-
- #ifdef HAVE_ALTIVEC_H
- #include <altivec.h>
-Index: libmpeg2/idct_mmx.c
-===================================================================
---- libmpeg2/idct_mmx.c (revision 28324)
-+++ libmpeg2/idct_mmx.c (revision 28325)
-@@ -23,7 +23,7 @@
-
- #include "config.h"
-
--#if defined(ARCH_X86) || defined(ARCH_X86_64)
-+#if ARCH_X86 || ARCH_X86_64
-
- #include <inttypes.h>
-
---- libmpeg2/motion_comp.c 2006-06-16 20:12:26.000000000 +0200
-+++ libmpeg2/motion_comp.c 2006-06-16 20:12:50.000000000 +0200
-@@ -33,34 +37,40 @@
-
- void mpeg2_mc_init (uint32_t accel)
- {
--#ifdef ARCH_X86
-+#if HAVE_MMX2
- if (accel & MPEG2_ACCEL_X86_MMXEXT)
- mpeg2_mc = mpeg2_mc_mmxext;
-- else if (accel & MPEG2_ACCEL_X86_3DNOW)
-+ else
-+#endif
-+#if HAVE_AMD3DNOW
-+ if (accel & MPEG2_ACCEL_X86_3DNOW)
- mpeg2_mc = mpeg2_mc_3dnow;
-- else if (accel & MPEG2_ACCEL_X86_MMX)
-+ else
-+#endif
-+#if HAVE_MMX
-+ if (accel & MPEG2_ACCEL_X86_MMX)
- mpeg2_mc = mpeg2_mc_mmx;
- else
- #endif
--#ifdef ARCH_PPC
-+#if HAVE_ALTIVEC
- if (accel & MPEG2_ACCEL_PPC_ALTIVEC)
- mpeg2_mc = mpeg2_mc_altivec;
- else
- #endif
--#ifdef ARCH_ALPHA
-+#if ARCH_ALPHA
- if (accel & MPEG2_ACCEL_ALPHA)
- mpeg2_mc = mpeg2_mc_alpha;
- else
- #endif
--#ifdef ARCH_SPARC
-+#if HAVE_VIS
- if (accel & MPEG2_ACCEL_SPARC_VIS)
- mpeg2_mc = mpeg2_mc_vis;
- else
- #endif
--#ifdef ARCH_ARM
-+#if ARCH_ARM
-- if (accel & MPEG2_ACCEL_ARM) {
-+ if (accel & MPEG2_ACCEL_ARM)
- mpeg2_mc = mpeg2_mc_arm;
-- } else
-+ else
- #endif
- mpeg2_mc = mpeg2_mc_c;
- }
-Index: libmpeg2/motion_comp_alpha.c
-===================================================================
---- libmpeg2/motion_comp_alpha.c (revision 28324)
-+++ libmpeg2/motion_comp_alpha.c (revision 28325)
-@@ -22,7 +22,7 @@
-
- #include "config.h"
-
--#ifdef ARCH_ALPHA
-+#if ARCH_ALPHA
-
- #include <inttypes.h>
-
-Index: libmpeg2/motion_comp_altivec.c
-===================================================================
---- libmpeg2/motion_comp_altivec.c (revision 28324)
-+++ libmpeg2/motion_comp_altivec.c (revision 28325)
-@@ -23,7 +23,7 @@
-
- #include "config.h"
-
--#ifdef ARCH_PPC
-+#if ARCH_PPC
-
- #ifdef HAVE_ALTIVEC_H
- #include <altivec.h>
-Index: libmpeg2/motion_comp_arm.c
-===================================================================
---- libmpeg2/motion_comp_arm.c (revision 28324)
-+++ libmpeg2/motion_comp_arm.c (revision 28325)
-@@ -22,7 +22,7 @@
-
- #include "config.h"
-
--#ifdef ARCH_ARM
-+#if ARCH_ARM
-
- #include <inttypes.h>
-
-Index: libmpeg2/motion_comp_mmx.c
-===================================================================
---- libmpeg2/motion_comp_mmx.c (revision 28324)
-+++ libmpeg2/motion_comp_mmx.c (revision 28325)
-@@ -23,7 +23,7 @@
-
- #include "config.h"
-
--#if defined(ARCH_X86) || defined(ARCH_X86_64)
-+#if ARCH_X86 || ARCH_X86_64
-
- #include <inttypes.h>
-
-Index: libmpeg2/motion_comp_vis.c
-===================================================================
---- libmpeg2/motion_comp_vis.c (revision 28324)
-+++ libmpeg2/motion_comp_vis.c (revision 28325)
-@@ -22,7 +22,7 @@
-
- #include "config.h"
-
--#ifdef ARCH_SPARC
-+#if ARCH_SPARC
-
- #include <inttypes.h>
-
---- libmpeg2/mpeg2_internal.h 2006-06-16 20:12:26.000000000 +0200
-+++ libmpeg2/mpeg2_internal.h 2006-06-16 20:12:50.000000000 +0200
-@@ -152,6 +156,11 @@
-
- /* XXX: stuff due to xine shit */
- int8_t q_scale_type;
-+
-+ int quantizer_scales[32];
-+ int quantizer_scale;
-+ char* quant_store;
-+ int quant_stride;
- };
-
- typedef struct {
-@@ -223,6 +232,9 @@
- //int8_t q_scale_type, scaled[4];
- uint8_t quantizer_matrix[4][64];
- uint8_t new_quantizer_matrix[4][64];
-+
-+ unsigned char *pending_buffer;
-+ int pending_length;
- };
-
- typedef struct {
-@@ -226,7 +238,7 @@
- };
-
- typedef struct {
--#ifdef ARCH_PPC
-+#if ARCH_PPC
- uint8_t regv[12*16];
- #endif
- int dummy;
---- libmpeg2/slice.c 2006-06-16 20:12:26.000000000 +0200
-+++ libmpeg2/slice.c 2006-06-16 20:12:50.000000000 +0200
-@@ -142,6 +146,7 @@
-
- quantizer_scale_code = UBITS (bit_buf, 5);
- DUMPBITS (bit_buf, bits, 5);
-+ decoder->quantizer_scale = decoder->quantizer_scales[quantizer_scale_code];
-
- decoder->quantizer_matrix[0] =
- decoder->quantizer_prescale[0][quantizer_scale_code];
-@@ -1564,6 +1569,24 @@
-
- #define NEXT_MACROBLOCK \
- do { \
-+ if(decoder->quant_store) { \
-+ if (decoder->picture_structure == TOP_FIELD) \
-+ decoder->quant_store[2 * decoder->quant_stride \
-+ * (decoder->v_offset >> 4) \
-+ + (decoder->offset >> 4)] \
-+ = decoder->quantizer_scale; \
-+ else if (decoder->picture_structure == BOTTOM_FIELD) \
-+ decoder->quant_store[2 * decoder->quant_stride \
-+ * (decoder->v_offset >> 4) \
-+ + decoder->quant_stride \
-+ + (decoder->offset >> 4)] \
-+ = decoder->quantizer_scale; \
-+ else \
-+ decoder->quant_store[decoder->quant_stride \
-+ * (decoder->v_offset >> 4) \
-+ + (decoder->offset >> 4)] \
-+ = decoder->quantizer_scale; \
-+ } \
- decoder->offset += 16; \
- if (decoder->offset == decoder->width) { \
- do { /* just so we can use the break statement */ \
diff --git a/libmpeg2/mmx.h b/libmpeg2/mmx.h
deleted file mode 100644
index c62be1f581..0000000000
--- a/libmpeg2/mmx.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * mmx.h
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef LIBMPEG2_MMX_H
-#define LIBMPEG2_MMX_H
-
-/*
- * The type of an value that fits in an MMX register (note that long
- * long constant values MUST be suffixed by LL and unsigned long long
- * values by ULL, lest they be truncated by the compiler)
- */
-
-typedef union {
- long long q; /* Quadword (64-bit) value */
- unsigned long long uq; /* Unsigned Quadword */
- int d[2]; /* 2 Doubleword (32-bit) values */
- unsigned int ud[2]; /* 2 Unsigned Doubleword */
- short w[4]; /* 4 Word (16-bit) values */
- unsigned short uw[4]; /* 4 Unsigned Word */
- char b[8]; /* 8 Byte (8-bit) values */
- unsigned char ub[8]; /* 8 Unsigned Byte */
- float s[2]; /* Single-precision (32-bit) value */
-} ATTR_ALIGN(8) mmx_t; /* On an 8-byte (64-bit) boundary */
-
-
-#define mmx_i2r(op,imm,reg) \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "i" (imm) )
-
-#define mmx_m2r(op,mem,reg) \
- __asm__ __volatile__ (#op " %0, %%" #reg \
- : /* nothing */ \
- : "m" (mem))
-
-#define mmx_r2m(op,reg,mem) \
- __asm__ __volatile__ (#op " %%" #reg ", %0" \
- : "=m" (mem) \
- : /* nothing */ )
-
-#define mmx_r2r(op,regs,regd) \
- __asm__ __volatile__ (#op " %" #regs ", %" #regd)
-
-
-#define emms() __asm__ __volatile__ ("emms")
-
-#define movd_m2r(var,reg) mmx_m2r (movd, var, reg)
-#define movd_r2m(reg,var) mmx_r2m (movd, reg, var)
-#define movd_v2r(var,reg) __asm__ __volatile__ ("movd %0, %%" #reg \
- : /* nothing */ \
- : "rm" (var))
-#define movd_r2v(reg,var) __asm__ __volatile__ ("movd %%" #reg ", %0" \
- : "=rm" (var) \
- : /* nothing */ )
-
-#define movq_m2r(var,reg) mmx_m2r (movq, var, reg)
-#define movq_r2m(reg,var) mmx_r2m (movq, reg, var)
-#define movq_r2r(regs,regd) mmx_r2r (movq, regs, regd)
-
-#define packssdw_m2r(var,reg) mmx_m2r (packssdw, var, reg)
-#define packssdw_r2r(regs,regd) mmx_r2r (packssdw, regs, regd)
-#define packsswb_m2r(var,reg) mmx_m2r (packsswb, var, reg)
-#define packsswb_r2r(regs,regd) mmx_r2r (packsswb, regs, regd)
-
-#define packuswb_m2r(var,reg) mmx_m2r (packuswb, var, reg)
-#define packuswb_r2r(regs,regd) mmx_r2r (packuswb, regs, regd)
-
-#define paddb_m2r(var,reg) mmx_m2r (paddb, var, reg)
-#define paddb_r2r(regs,regd) mmx_r2r (paddb, regs, regd)
-#define paddd_m2r(var,reg) mmx_m2r (paddd, var, reg)
-#define paddd_r2r(regs,regd) mmx_r2r (paddd, regs, regd)
-#define paddw_m2r(var,reg) mmx_m2r (paddw, var, reg)
-#define paddw_r2r(regs,regd) mmx_r2r (paddw, regs, regd)
-
-#define paddsb_m2r(var,reg) mmx_m2r (paddsb, var, reg)
-#define paddsb_r2r(regs,regd) mmx_r2r (paddsb, regs, regd)
-#define paddsw_m2r(var,reg) mmx_m2r (paddsw, var, reg)
-#define paddsw_r2r(regs,regd) mmx_r2r (paddsw, regs, regd)
-
-#define paddusb_m2r(var,reg) mmx_m2r (paddusb, var, reg)
-#define paddusb_r2r(regs,regd) mmx_r2r (paddusb, regs, regd)
-#define paddusw_m2r(var,reg) mmx_m2r (paddusw, var, reg)
-#define paddusw_r2r(regs,regd) mmx_r2r (paddusw, regs, regd)
-
-#define pand_m2r(var,reg) mmx_m2r (pand, var, reg)
-#define pand_r2r(regs,regd) mmx_r2r (pand, regs, regd)
-
-#define pandn_m2r(var,reg) mmx_m2r (pandn, var, reg)
-#define pandn_r2r(regs,regd) mmx_r2r (pandn, regs, regd)
-
-#define pcmpeqb_m2r(var,reg) mmx_m2r (pcmpeqb, var, reg)
-#define pcmpeqb_r2r(regs,regd) mmx_r2r (pcmpeqb, regs, regd)
-#define pcmpeqd_m2r(var,reg) mmx_m2r (pcmpeqd, var, reg)
-#define pcmpeqd_r2r(regs,regd) mmx_r2r (pcmpeqd, regs, regd)
-#define pcmpeqw_m2r(var,reg) mmx_m2r (pcmpeqw, var, reg)
-#define pcmpeqw_r2r(regs,regd) mmx_r2r (pcmpeqw, regs, regd)
-
-#define pcmpgtb_m2r(var,reg) mmx_m2r (pcmpgtb, var, reg)
-#define pcmpgtb_r2r(regs,regd) mmx_r2r (pcmpgtb, regs, regd)
-#define pcmpgtd_m2r(var,reg) mmx_m2r (pcmpgtd, var, reg)
-#define pcmpgtd_r2r(regs,regd) mmx_r2r (pcmpgtd, regs, regd)
-#define pcmpgtw_m2r(var,reg) mmx_m2r (pcmpgtw, var, reg)
-#define pcmpgtw_r2r(regs,regd) mmx_r2r (pcmpgtw, regs, regd)
-
-#define pmaddwd_m2r(var,reg) mmx_m2r (pmaddwd, var, reg)
-#define pmaddwd_r2r(regs,regd) mmx_r2r (pmaddwd, regs, regd)
-
-#define pmulhw_m2r(var,reg) mmx_m2r (pmulhw, var, reg)
-#define pmulhw_r2r(regs,regd) mmx_r2r (pmulhw, regs, regd)
-
-#define pmullw_m2r(var,reg) mmx_m2r (pmullw, var, reg)
-#define pmullw_r2r(regs,regd) mmx_r2r (pmullw, regs, regd)
-
-#define por_m2r(var,reg) mmx_m2r (por, var, reg)
-#define por_r2r(regs,regd) mmx_r2r (por, regs, regd)
-
-#define pslld_i2r(imm,reg) mmx_i2r (pslld, imm, reg)
-#define pslld_m2r(var,reg) mmx_m2r (pslld, var, reg)
-#define pslld_r2r(regs,regd) mmx_r2r (pslld, regs, regd)
-#define psllq_i2r(imm,reg) mmx_i2r (psllq, imm, reg)
-#define psllq_m2r(var,reg) mmx_m2r (psllq, var, reg)
-#define psllq_r2r(regs,regd) mmx_r2r (psllq, regs, regd)
-#define psllw_i2r(imm,reg) mmx_i2r (psllw, imm, reg)
-#define psllw_m2r(var,reg) mmx_m2r (psllw, var, reg)
-#define psllw_r2r(regs,regd) mmx_r2r (psllw, regs, regd)
-
-#define psrad_i2r(imm,reg) mmx_i2r (psrad, imm, reg)
-#define psrad_m2r(var,reg) mmx_m2r (psrad, var, reg)
-#define psrad_r2r(regs,regd) mmx_r2r (psrad, regs, regd)
-#define psraw_i2r(imm,reg) mmx_i2r (psraw, imm, reg)
-#define psraw_m2r(var,reg) mmx_m2r (psraw, var, reg)
-#define psraw_r2r(regs,regd) mmx_r2r (psraw, regs, regd)
-
-#define psrld_i2r(imm,reg) mmx_i2r (psrld, imm, reg)
-#define psrld_m2r(var,reg) mmx_m2r (psrld, var, reg)
-#define psrld_r2r(regs,regd) mmx_r2r (psrld, regs, regd)
-#define psrlq_i2r(imm,reg) mmx_i2r (psrlq, imm, reg)
-#define psrlq_m2r(var,reg) mmx_m2r (psrlq, var, reg)
-#define psrlq_r2r(regs,regd) mmx_r2r (psrlq, regs, regd)
-#define psrlw_i2r(imm,reg) mmx_i2r (psrlw, imm, reg)
-#define psrlw_m2r(var,reg) mmx_m2r (psrlw, var, reg)
-#define psrlw_r2r(regs,regd) mmx_r2r (psrlw, regs, regd)
-
-#define psubb_m2r(var,reg) mmx_m2r (psubb, var, reg)
-#define psubb_r2r(regs,regd) mmx_r2r (psubb, regs, regd)
-#define psubd_m2r(var,reg) mmx_m2r (psubd, var, reg)
-#define psubd_r2r(regs,regd) mmx_r2r (psubd, regs, regd)
-#define psubw_m2r(var,reg) mmx_m2r (psubw, var, reg)
-#define psubw_r2r(regs,regd) mmx_r2r (psubw, regs, regd)
-
-#define psubsb_m2r(var,reg) mmx_m2r (psubsb, var, reg)
-#define psubsb_r2r(regs,regd) mmx_r2r (psubsb, regs, regd)
-#define psubsw_m2r(var,reg) mmx_m2r (psubsw, var, reg)
-#define psubsw_r2r(regs,regd) mmx_r2r (psubsw, regs, regd)
-
-#define psubusb_m2r(var,reg) mmx_m2r (psubusb, var, reg)
-#define psubusb_r2r(regs,regd) mmx_r2r (psubusb, regs, regd)
-#define psubusw_m2r(var,reg) mmx_m2r (psubusw, var, reg)
-#define psubusw_r2r(regs,regd) mmx_r2r (psubusw, regs, regd)
-
-#define punpckhbw_m2r(var,reg) mmx_m2r (punpckhbw, var, reg)
-#define punpckhbw_r2r(regs,regd) mmx_r2r (punpckhbw, regs, regd)
-#define punpckhdq_m2r(var,reg) mmx_m2r (punpckhdq, var, reg)
-#define punpckhdq_r2r(regs,regd) mmx_r2r (punpckhdq, regs, regd)
-#define punpckhwd_m2r(var,reg) mmx_m2r (punpckhwd, var, reg)
-#define punpckhwd_r2r(regs,regd) mmx_r2r (punpckhwd, regs, regd)
-
-#define punpcklbw_m2r(var,reg) mmx_m2r (punpcklbw, var, reg)
-#define punpcklbw_r2r(regs,regd) mmx_r2r (punpcklbw, regs, regd)
-#define punpckldq_m2r(var,reg) mmx_m2r (punpckldq, var, reg)
-#define punpckldq_r2r(regs,regd) mmx_r2r (punpckldq, regs, regd)
-#define punpcklwd_m2r(var,reg) mmx_m2r (punpcklwd, var, reg)
-#define punpcklwd_r2r(regs,regd) mmx_r2r (punpcklwd, regs, regd)
-
-#define pxor_m2r(var,reg) mmx_m2r (pxor, var, reg)
-#define pxor_r2r(regs,regd) mmx_r2r (pxor, regs, regd)
-
-
-/* 3DNOW extensions */
-
-#define pavgusb_m2r(var,reg) mmx_m2r (pavgusb, var, reg)
-#define pavgusb_r2r(regs,regd) mmx_r2r (pavgusb, regs, regd)
-
-
-/* AMD MMX extensions - also available in intel SSE */
-
-
-#define mmx_m2ri(op,mem,reg,imm) \
- __asm__ __volatile__ (#op " %1, %0, %%" #reg \
- : /* nothing */ \
- : "m" (mem), "i" (imm))
-
-#define mmx_r2ri(op,regs,regd,imm) \
- __asm__ __volatile__ (#op " %0, %%" #regs ", %%" #regd \
- : /* nothing */ \
- : "i" (imm) )
-
-#define mmx_fetch(mem,hint) \
- __asm__ __volatile__ ("prefetch" #hint " %0" \
- : /* nothing */ \
- : "m" (mem))
-
-
-#define maskmovq(regs,maskreg) mmx_r2ri (maskmovq, regs, maskreg)
-
-#define movntq_r2m(mmreg,var) mmx_r2m (movntq, mmreg, var)
-
-#define pavgb_m2r(var,reg) mmx_m2r (pavgb, var, reg)
-#define pavgb_r2r(regs,regd) mmx_r2r (pavgb, regs, regd)
-#define pavgw_m2r(var,reg) mmx_m2r (pavgw, var, reg)
-#define pavgw_r2r(regs,regd) mmx_r2r (pavgw, regs, regd)
-
-#define pextrw_r2r(mmreg,reg,imm) mmx_r2ri (pextrw, mmreg, reg, imm)
-
-#define pinsrw_r2r(reg,mmreg,imm) mmx_r2ri (pinsrw, reg, mmreg, imm)
-
-#define pmaxsw_m2r(var,reg) mmx_m2r (pmaxsw, var, reg)
-#define pmaxsw_r2r(regs,regd) mmx_r2r (pmaxsw, regs, regd)
-
-#define pmaxub_m2r(var,reg) mmx_m2r (pmaxub, var, reg)
-#define pmaxub_r2r(regs,regd) mmx_r2r (pmaxub, regs, regd)
-
-#define pminsw_m2r(var,reg) mmx_m2r (pminsw, var, reg)
-#define pminsw_r2r(regs,regd) mmx_r2r (pminsw, regs, regd)
-
-#define pminub_m2r(var,reg) mmx_m2r (pminub, var, reg)
-#define pminub_r2r(regs,regd) mmx_r2r (pminub, regs, regd)
-
-#define pmovmskb(mmreg,reg) \
- __asm__ __volatile__ ("movmskps %" #mmreg ", %" #reg)
-
-#define pmulhuw_m2r(var,reg) mmx_m2r (pmulhuw, var, reg)
-#define pmulhuw_r2r(regs,regd) mmx_r2r (pmulhuw, regs, regd)
-
-#define prefetcht0(mem) mmx_fetch (mem, t0)
-#define prefetcht1(mem) mmx_fetch (mem, t1)
-#define prefetcht2(mem) mmx_fetch (mem, t2)
-#define prefetchnta(mem) mmx_fetch (mem, nta)
-
-#define psadbw_m2r(var,reg) mmx_m2r (psadbw, var, reg)
-#define psadbw_r2r(regs,regd) mmx_r2r (psadbw, regs, regd)
-
-
-/* SSE2 */
-
-typedef union {
- long long q[2]; /* Quadword (64-bit) value */
- unsigned long long uq[2]; /* Unsigned Quadword */
- int d[4]; /* 2 Doubleword (32-bit) values */
- unsigned int ud[4]; /* 2 Unsigned Doubleword */
- short w[8]; /* 4 Word (16-bit) values */
- unsigned short uw[8]; /* 4 Unsigned Word */
- char b[16]; /* 8 Byte (8-bit) values */
- unsigned char ub[16]; /* 8 Unsigned Byte */
- float s[4]; /* Single-precision (32-bit) value */
-} ATTR_ALIGN(16) sse_t; /* On an 16-byte (128-bit) boundary */
-
-#define movdqu_m2r(var,reg) mmx_m2r (movdqu, var, reg)
-#define movdqu_r2m(reg,var) mmx_r2m (movdqu, reg, var)
-#define movdqu_r2r(regs,regd) mmx_r2r (movdqu, regs, regd)
-#define movdqa_m2r(var,reg) mmx_m2r (movdqa, var, reg)
-#define movdqa_r2m(reg,var) mmx_r2m (movdqa, reg, var)
-#define movdqa_r2r(regs,regd) mmx_r2r (movdqa, regs, regd)
-
-#define pshufd_r2r(regs,regd,imm) mmx_r2ri(pshufd, regs, regd, imm)
-
-#define pshufw_m2r(var,reg,imm) mmx_m2ri(pshufw, var, reg, imm)
-#define pshufw_r2r(regs,regd,imm) mmx_r2ri(pshufw, regs, regd, imm)
-
-#define sfence() __asm__ __volatile__ ("sfence\n\t")
-
-#endif /* LIBMPEG2_MMX_H */
diff --git a/libmpeg2/motion_comp.c b/libmpeg2/motion_comp.c
deleted file mode 100644
index f056176e92..0000000000
--- a/libmpeg2/motion_comp.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * motion_comp.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
- * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id$
- */
-
-#include "config.h"
-
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-mpeg2_mc_t mpeg2_mc;
-
-void mpeg2_mc_init (uint32_t accel)
-{
-#if HAVE_MMX2
- if (accel & MPEG2_ACCEL_X86_MMXEXT)
- mpeg2_mc = mpeg2_mc_mmxext;
- else
-#endif
-#if HAVE_AMD3DNOW
- if (accel & MPEG2_ACCEL_X86_3DNOW)
- mpeg2_mc = mpeg2_mc_3dnow;
- else
-#endif
-#if HAVE_MMX
- if (accel & MPEG2_ACCEL_X86_MMX)
- mpeg2_mc = mpeg2_mc_mmx;
- else
-#endif
-#if HAVE_ALTIVEC
- if (accel & MPEG2_ACCEL_PPC_ALTIVEC)
- mpeg2_mc = mpeg2_mc_altivec;
- else
-#endif
-#if ARCH_ALPHA
- if (accel & MPEG2_ACCEL_ALPHA)
- mpeg2_mc = mpeg2_mc_alpha;
- else
-#endif
-#if HAVE_VIS
- if (accel & MPEG2_ACCEL_SPARC_VIS)
- mpeg2_mc = mpeg2_mc_vis;
- else
-#endif
-#if ARCH_ARM
- if (accel & MPEG2_ACCEL_ARM)
- mpeg2_mc = mpeg2_mc_arm;
- else
-#endif
- mpeg2_mc = mpeg2_mc_c;
-}
-
-#define avg2(a,b) ((a+b+1)>>1)
-#define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
-
-#define predict_o(i) (ref[i])
-#define predict_x(i) (avg2 (ref[i], ref[i+1]))
-#define predict_y(i) (avg2 (ref[i], (ref+stride)[i]))
-#define predict_xy(i) (avg4 (ref[i], ref[i+1], \
- (ref+stride)[i], (ref+stride)[i+1]))
-
-#define put(predictor,i) dest[i] = predictor (i)
-#define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i])
-
-/* mc function template */
-
-#define MC_FUNC(op,xy) \
-static void MC_##op##_##xy##_16_c (uint8_t * dest, const uint8_t * ref, \
- const int stride, int height) \
-{ \
- do { \
- op (predict_##xy, 0); \
- op (predict_##xy, 1); \
- op (predict_##xy, 2); \
- op (predict_##xy, 3); \
- op (predict_##xy, 4); \
- op (predict_##xy, 5); \
- op (predict_##xy, 6); \
- op (predict_##xy, 7); \
- op (predict_##xy, 8); \
- op (predict_##xy, 9); \
- op (predict_##xy, 10); \
- op (predict_##xy, 11); \
- op (predict_##xy, 12); \
- op (predict_##xy, 13); \
- op (predict_##xy, 14); \
- op (predict_##xy, 15); \
- ref += stride; \
- dest += stride; \
- } while (--height); \
-} \
-static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, \
- const int stride, int height) \
-{ \
- do { \
- op (predict_##xy, 0); \
- op (predict_##xy, 1); \
- op (predict_##xy, 2); \
- op (predict_##xy, 3); \
- op (predict_##xy, 4); \
- op (predict_##xy, 5); \
- op (predict_##xy, 6); \
- op (predict_##xy, 7); \
- ref += stride; \
- dest += stride; \
- } while (--height); \
-}
-
-/* definitions of the actual mc functions */
-
-MC_FUNC (put,o)
-MC_FUNC (avg,o)
-MC_FUNC (put,x)
-MC_FUNC (avg,x)
-MC_FUNC (put,y)
-MC_FUNC (avg,y)
-MC_FUNC (put,xy)
-MC_FUNC (avg,xy)
-
-MPEG2_MC_EXTERN (c)
diff --git a/libmpeg2/motion_comp_alpha.c b/libmpeg2/motion_comp_alpha.c
deleted file mode 100644
index a7f33d3914..0000000000
--- a/libmpeg2/motion_comp_alpha.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * motion_comp_alpha.c
- * Copyright (C) 2002-2003 Falk Hueffner <falk@debian.org>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#if ARCH_ALPHA
-
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-#include "alpha_asm.h"
-
-static inline uint64_t avg2 (uint64_t a, uint64_t b)
-{
- return (a | b) - (((a ^ b) & BYTE_VEC (0xfe)) >> 1);
-}
-
-// Load two unaligned quadwords from addr. This macro only works if
-// addr is actually unaligned.
-#define ULOAD16(ret_l,ret_r,addr) \
- do { \
- uint64_t _l = ldq_u (addr + 0); \
- uint64_t _m = ldq_u (addr + 8); \
- uint64_t _r = ldq_u (addr + 16); \
- ret_l = extql (_l, addr) | extqh (_m, addr); \
- ret_r = extql (_m, addr) | extqh (_r, addr); \
- } while (0)
-
-// Load two aligned quadwords from addr.
-#define ALOAD16(ret_l,ret_r,addr) \
- do { \
- ret_l = ldq (addr); \
- ret_r = ldq (addr + 8); \
- } while (0)
-
-#define OP8(LOAD,LOAD16,STORE) \
- do { \
- STORE (LOAD (pixels), block); \
- pixels += line_size; \
- block += line_size; \
- } while (--h)
-
-#define OP16(LOAD,LOAD16,STORE) \
- do { \
- uint64_t l, r; \
- LOAD16 (l, r, pixels); \
- STORE (l, block); \
- STORE (r, block + 8); \
- pixels += line_size; \
- block += line_size; \
- } while (--h)
-
-#define OP8_X2(LOAD,LOAD16,STORE) \
- do { \
- uint64_t p0, p1; \
- \
- p0 = LOAD (pixels); \
- p1 = p0 >> 8 | ((uint64_t) pixels[8] << 56); \
- STORE (avg2 (p0, p1), block); \
- pixels += line_size; \
- block += line_size; \
- } while (--h)
-
-#define OP16_X2(LOAD,LOAD16,STORE) \
- do { \
- uint64_t p0, p1; \
- \
- LOAD16 (p0, p1, pixels); \
- STORE (avg2(p0, p0 >> 8 | p1 << 56), block); \
- STORE (avg2(p1, p1 >> 8 | (uint64_t) pixels[16] << 56), \
- block + 8); \
- pixels += line_size; \
- block += line_size; \
- } while (--h)
-
-#define OP8_Y2(LOAD,LOAD16,STORE) \
- do { \
- uint64_t p0, p1; \
- p0 = LOAD (pixels); \
- pixels += line_size; \
- p1 = LOAD (pixels); \
- do { \
- uint64_t av = avg2 (p0, p1); \
- if (--h == 0) line_size = 0; \
- pixels += line_size; \
- p0 = p1; \
- p1 = LOAD (pixels); \
- STORE (av, block); \
- block += line_size; \
- } while (h); \
- } while (0)
-
-#define OP16_Y2(LOAD,LOAD16,STORE) \
- do { \
- uint64_t p0l, p0r, p1l, p1r; \
- LOAD16 (p0l, p0r, pixels); \
- pixels += line_size; \
- LOAD16 (p1l, p1r, pixels); \
- do { \
- uint64_t avl, avr; \
- if (--h == 0) line_size = 0; \
- avl = avg2 (p0l, p1l); \
- avr = avg2 (p0r, p1r); \
- p0l = p1l; \
- p0r = p1r; \
- pixels += line_size; \
- LOAD16 (p1l, p1r, pixels); \
- STORE (avl, block); \
- STORE (avr, block + 8); \
- block += line_size; \
- } while (h); \
- } while (0)
-
-#define OP8_XY2(LOAD,LOAD16,STORE) \
- do { \
- uint64_t pl, ph; \
- uint64_t p1 = LOAD (pixels); \
- uint64_t p2 = p1 >> 8 | ((uint64_t) pixels[8] << 56); \
- \
- ph = (((p1 & ~BYTE_VEC (0x03)) >> 2) + \
- ((p2 & ~BYTE_VEC (0x03)) >> 2)); \
- pl = ((p1 & BYTE_VEC (0x03)) + \
- (p2 & BYTE_VEC (0x03))); \
- \
- do { \
- uint64_t npl, nph; \
- \
- pixels += line_size; \
- p1 = LOAD (pixels); \
- p2 = (p1 >> 8) | ((uint64_t) pixels[8] << 56); \
- nph = (((p1 & ~BYTE_VEC (0x03)) >> 2) + \
- ((p2 & ~BYTE_VEC (0x03)) >> 2)); \
- npl = ((p1 & BYTE_VEC (0x03)) + \
- (p2 & BYTE_VEC (0x03))); \
- \
- STORE (ph + nph + \
- (((pl + npl + BYTE_VEC (0x02)) >> 2) & \
- BYTE_VEC (0x03)), block); \
- \
- block += line_size; \
- pl = npl; \
- ph = nph; \
- } while (--h); \
- } while (0)
-
-#define OP16_XY2(LOAD,LOAD16,STORE) \
- do { \
- uint64_t p0, p1, p2, p3, pl_l, ph_l, pl_r, ph_r; \
- LOAD16 (p0, p2, pixels); \
- p1 = p0 >> 8 | (p2 << 56); \
- p3 = p2 >> 8 | ((uint64_t)pixels[16] << 56); \
- \
- ph_l = (((p0 & ~BYTE_VEC (0x03)) >> 2) + \
- ((p1 & ~BYTE_VEC (0x03)) >> 2)); \
- pl_l = ((p0 & BYTE_VEC (0x03)) + \
- (p1 & BYTE_VEC(0x03))); \
- ph_r = (((p2 & ~BYTE_VEC (0x03)) >> 2) + \
- ((p3 & ~BYTE_VEC (0x03)) >> 2)); \
- pl_r = ((p2 & BYTE_VEC (0x03)) + \
- (p3 & BYTE_VEC (0x03))); \
- \
- do { \
- uint64_t npl_l, nph_l, npl_r, nph_r; \
- \
- pixels += line_size; \
- LOAD16 (p0, p2, pixels); \
- p1 = p0 >> 8 | (p2 << 56); \
- p3 = p2 >> 8 | ((uint64_t)pixels[16] << 56); \
- nph_l = (((p0 & ~BYTE_VEC (0x03)) >> 2) + \
- ((p1 & ~BYTE_VEC (0x03)) >> 2)); \
- npl_l = ((p0 & BYTE_VEC (0x03)) + \
- (p1 & BYTE_VEC (0x03))); \
- nph_r = (((p2 & ~BYTE_VEC (0x03)) >> 2) + \
- ((p3 & ~BYTE_VEC (0x03)) >> 2)); \
- npl_r = ((p2 & BYTE_VEC (0x03)) + \
- (p3 & BYTE_VEC (0x03))); \
- \
- STORE (ph_l + nph_l + \
- (((pl_l + npl_l + BYTE_VEC (0x02)) >> 2) & \
- BYTE_VEC(0x03)), block); \
- STORE (ph_r + nph_r + \
- (((pl_r + npl_r + BYTE_VEC (0x02)) >> 2) & \
- BYTE_VEC(0x03)), block + 8); \
- \
- block += line_size; \
- pl_l = npl_l; \
- ph_l = nph_l; \
- pl_r = npl_r; \
- ph_r = nph_r; \
- } while (--h); \
- } while (0)
-
-#define MAKE_OP(OPNAME,SIZE,SUFF,OPKIND,STORE) \
-static void MC_ ## OPNAME ## _ ## SUFF ## _ ## SIZE ## _alpha \
- (uint8_t *restrict block, const uint8_t *restrict pixels, \
- int line_size, int h) \
-{ \
- if ((uint64_t) pixels & 0x7) { \
- OPKIND (uldq, ULOAD16, STORE); \
- } else { \
- OPKIND (ldq, ALOAD16, STORE); \
- } \
-}
-
-#define PIXOP(OPNAME,STORE) \
- MAKE_OP (OPNAME, 8, o, OP8, STORE); \
- MAKE_OP (OPNAME, 8, x, OP8_X2, STORE); \
- MAKE_OP (OPNAME, 8, y, OP8_Y2, STORE); \
- MAKE_OP (OPNAME, 8, xy, OP8_XY2, STORE); \
- MAKE_OP (OPNAME, 16, o, OP16, STORE); \
- MAKE_OP (OPNAME, 16, x, OP16_X2, STORE); \
- MAKE_OP (OPNAME, 16, y, OP16_Y2, STORE); \
- MAKE_OP (OPNAME, 16, xy, OP16_XY2, STORE);
-
-#define STORE(l,b) stq (l, b)
-PIXOP (put, STORE);
-#undef STORE
-#define STORE(l,b) stq (avg2 (l, ldq (b)), b);
-PIXOP (avg, STORE);
-
-mpeg2_mc_t mpeg2_mc_alpha = {
- { MC_put_o_16_alpha, MC_put_x_16_alpha,
- MC_put_y_16_alpha, MC_put_xy_16_alpha,
- MC_put_o_8_alpha, MC_put_x_8_alpha,
- MC_put_y_8_alpha, MC_put_xy_8_alpha },
- { MC_avg_o_16_alpha, MC_avg_x_16_alpha,
- MC_avg_y_16_alpha, MC_avg_xy_16_alpha,
- MC_avg_o_8_alpha, MC_avg_x_8_alpha,
- MC_avg_y_8_alpha, MC_avg_xy_8_alpha }
-};
-
-#endif
diff --git a/libmpeg2/motion_comp_altivec.c b/libmpeg2/motion_comp_altivec.c
deleted file mode 100644
index f98aaedc90..0000000000
--- a/libmpeg2/motion_comp_altivec.c
+++ /dev/null
@@ -1,1010 +0,0 @@
-/*
- * motion_comp_altivec.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#if ARCH_PPC
-
-#ifdef HAVE_ALTIVEC_H
-#include <altivec.h>
-#endif
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-typedef vector signed char vector_s8_t;
-typedef vector unsigned char vector_u8_t;
-typedef vector signed short vector_s16_t;
-typedef vector unsigned short vector_u16_t;
-typedef vector signed int vector_s32_t;
-typedef vector unsigned int vector_u32_t;
-
-#ifndef COFFEE_BREAK /* Workarounds for gcc suckage */
-
-static inline vector_u8_t my_vec_ld (int const A, const uint8_t * const B)
-{
- return vec_ld (A, (uint8_t *)B);
-}
-#undef vec_ld
-#define vec_ld my_vec_ld
-
-static inline vector_u8_t my_vec_and (vector_u8_t const A, vector_u8_t const B)
-{
- return vec_and (A, B);
-}
-#undef vec_and
-#define vec_and my_vec_and
-
-static inline vector_u8_t my_vec_avg (vector_u8_t const A, vector_u8_t const B)
-{
- return vec_avg (A, B);
-}
-#undef vec_avg
-#define vec_avg my_vec_avg
-
-#endif
-
-static void MC_put_o_16_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm, ref0, ref1, tmp;
-
- perm = vec_lvsl (0, ref);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- tmp = vec_perm (ref0, ref1, perm);
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- vec_st (tmp, 0, dest);
- tmp = vec_perm (ref0, ref1, perm);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- vec_st (tmp, stride, dest);
- dest += 2*stride;
- tmp = vec_perm (ref0, ref1, perm);
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- vec_st (tmp, 0, dest);
- tmp = vec_perm (ref0, ref1, perm);
- vec_st (tmp, stride, dest);
-}
-
-static void MC_put_o_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm0, perm1, tmp0, tmp1, ref0, ref1;
-
- tmp0 = vec_lvsl (0, ref);
- tmp0 = vec_mergeh (tmp0, tmp0);
- perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
- tmp1 = vec_lvsl (stride, ref);
- tmp1 = vec_mergeh (tmp1, tmp1);
- perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- tmp0 = vec_perm (ref0, ref1, perm0);
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_perm (ref0, ref1, perm1);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
- dest += stride;
- tmp0 = vec_perm (ref0, ref1, perm0);
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_perm (ref0, ref1, perm1);
- vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
-}
-
-static void MC_put_x_16_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t permA, permB, ref0, ref1, tmp;
-
- permA = vec_lvsl (0, ref);
- permB = vec_add (permA, vec_splat_u8 (1));
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- tmp = vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- vec_st (tmp, 0, dest);
- tmp = vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- vec_st (tmp, stride, dest);
- dest += 2*stride;
- tmp = vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- vec_st (tmp, 0, dest);
- tmp = vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB));
- vec_st (tmp, stride, dest);
-}
-
-static void MC_put_x_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm0A, perm0B, perm1A, perm1B, ones, tmp0, tmp1, ref0, ref1;
-
- ones = vec_splat_u8 (1);
- tmp0 = vec_lvsl (0, ref);
- tmp0 = vec_mergeh (tmp0, tmp0);
- perm0A = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
- perm0B = vec_add (perm0A, ones);
- tmp1 = vec_lvsl (stride, ref);
- tmp1 = vec_mergeh (tmp1, tmp1);
- perm1A = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
- perm1B = vec_add (perm1A, ones);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- tmp0 = vec_avg (vec_perm (ref0, ref1, perm0A),
- vec_perm (ref0, ref1, perm0B));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_avg (vec_perm (ref0, ref1, perm1A),
- vec_perm (ref0, ref1, perm1B));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
- dest += stride;
- tmp0 = vec_avg (vec_perm (ref0, ref1, perm0A),
- vec_perm (ref0, ref1, perm0B));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_avg (vec_perm (ref0, ref1, perm1A),
- vec_perm (ref0, ref1, perm1B));
- vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
-}
-
-static void MC_put_y_16_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm, ref0, ref1, tmp0, tmp1, tmp;
-
- perm = vec_lvsl (0, ref);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- tmp0 = vec_perm (ref0, ref1, perm);
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- tmp1 = vec_perm (ref0, ref1, perm);
- tmp = vec_avg (tmp0, tmp1);
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- vec_st (tmp, 0, dest);
- tmp0 = vec_perm (ref0, ref1, perm);
- tmp = vec_avg (tmp0, tmp1);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- vec_st (tmp, stride, dest);
- dest += 2*stride;
- tmp1 = vec_perm (ref0, ref1, perm);
- tmp = vec_avg (tmp0, tmp1);
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- vec_st (tmp, 0, dest);
- tmp0 = vec_perm (ref0, ref1, perm);
- tmp = vec_avg (tmp0, tmp1);
- vec_st (tmp, stride, dest);
-}
-
-static void MC_put_y_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm0, perm1, tmp0, tmp1, tmp, ref0, ref1;
-
- tmp0 = vec_lvsl (0, ref);
- tmp0 = vec_mergeh (tmp0, tmp0);
- perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
- tmp1 = vec_lvsl (stride, ref);
- tmp1 = vec_mergeh (tmp1, tmp1);
- perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- tmp0 = vec_perm (ref0, ref1, perm0);
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- tmp1 = vec_perm (ref0, ref1, perm1);
- tmp = vec_avg (tmp0, tmp1);
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- tmp0 = vec_perm (ref0, ref1, perm0);
- tmp = vec_avg (tmp0, tmp1);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_perm (ref0, ref1, perm1);
- tmp = vec_avg (tmp0, tmp1);
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- tmp0 = vec_perm (ref0, ref1, perm0);
- tmp = vec_avg (tmp0, tmp1);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
-}
-
-static void MC_put_xy_16_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t permA, permB, ref0, ref1, A, B, avg0, avg1, xor0, xor1, tmp;
- vector_u8_t ones;
-
- ones = vec_splat_u8 (1);
- permA = vec_lvsl (0, ref);
- permB = vec_add (permA, ones);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg1 = vec_avg (A, B);
- xor1 = vec_xor (A, B);
- tmp = vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1)));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- vec_st (tmp, 0, dest);
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
- tmp = vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1)));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- vec_st (tmp, stride, dest);
- dest += 2*stride;
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg1 = vec_avg (A, B);
- xor1 = vec_xor (A, B);
- tmp = vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1)));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- vec_st (tmp, 0, dest);
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
- tmp = vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1)));
- vec_st (tmp, stride, dest);
-}
-
-static void MC_put_xy_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm0A, perm0B, perm1A, perm1B, ref0, ref1, A, B;
- vector_u8_t avg0, avg1, xor0, xor1, tmp, ones;
-
- ones = vec_splat_u8 (1);
- perm0A = vec_lvsl (0, ref);
- perm0A = vec_mergeh (perm0A, perm0A);
- perm0A = vec_pack ((vector_u16_t)perm0A, (vector_u16_t)perm0A);
- perm0B = vec_add (perm0A, ones);
- perm1A = vec_lvsl (stride, ref);
- perm1A = vec_mergeh (perm1A, perm1A);
- perm1A = vec_pack ((vector_u16_t)perm1A, (vector_u16_t)perm1A);
- perm1B = vec_add (perm1A, ones);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- A = vec_perm (ref0, ref1, perm0A);
- B = vec_perm (ref0, ref1, perm0B);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- A = vec_perm (ref0, ref1, perm1A);
- B = vec_perm (ref0, ref1, perm1B);
- avg1 = vec_avg (A, B);
- xor1 = vec_xor (A, B);
- tmp = vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1)));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- A = vec_perm (ref0, ref1, perm0A);
- B = vec_perm (ref0, ref1, perm0B);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
- tmp = vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1)));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- A = vec_perm (ref0, ref1, perm1A);
- B = vec_perm (ref0, ref1, perm1B);
- avg1 = vec_avg (A, B);
- xor1 = vec_xor (A, B);
- tmp = vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1)));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- A = vec_perm (ref0, ref1, perm0A);
- B = vec_perm (ref0, ref1, perm0B);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
- tmp = vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1)));
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
-}
-
-#if 0
-static void MC_put_xy_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t permA, permB, ref0, ref1, A, B, C, D, tmp, zero, ones;
- vector_u16_t splat2, temp;
-
- ones = vec_splat_u8 (1);
- permA = vec_lvsl (0, ref);
- permB = vec_add (permA, ones);
-
- zero = vec_splat_u8 (0);
- splat2 = vec_splat_u16 (2);
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- C = vec_perm (ref0, ref1, permA);
- D = vec_perm (ref0, ref1, permB);
-
- temp = vec_add (vec_add ((vector_u16_t)vec_mergeh (zero, A),
- (vector_u16_t)vec_mergeh (zero, B)),
- vec_add ((vector_u16_t)vec_mergeh (zero, C),
- (vector_u16_t)vec_mergeh (zero, D)));
- temp = vec_sr (vec_add (temp, splat2), splat2);
- tmp = vec_pack (temp, temp);
-
- vec_st (tmp, 0, dest);
- dest += stride;
- tmp = vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB));
- } while (--height);
-}
-#endif
-
-static void MC_avg_o_16_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm, ref0, ref1, tmp, prev;
-
- perm = vec_lvsl (0, ref);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- prev = vec_ld (0, dest);
- tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_st (tmp, 0, dest);
- tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- prev = vec_ld (2*stride, dest);
- vec_st (tmp, stride, dest);
- dest += 2*stride;
- tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- prev = vec_ld (stride, dest);
- vec_st (tmp, 0, dest);
- tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));
- vec_st (tmp, stride, dest);
-}
-
-static void MC_avg_o_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm0, perm1, tmp0, tmp1, ref0, ref1, prev;
-
- tmp0 = vec_lvsl (0, ref);
- tmp0 = vec_mergeh (tmp0, tmp0);
- perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
- tmp1 = vec_lvsl (stride, ref);
- tmp1 = vec_mergeh (tmp1, tmp1);
- perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- prev = vec_ld (0, dest);
- tmp0 = vec_avg (prev, vec_perm (ref0, ref1, perm0));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_avg (prev, vec_perm (ref0, ref1, perm1));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
- dest += stride;
- tmp0 = vec_avg (prev, vec_perm (ref0, ref1, perm0));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_avg (prev, vec_perm (ref0, ref1, perm1));
- vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
-}
-
-static void MC_avg_x_16_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t permA, permB, ref0, ref1, tmp, prev;
-
- permA = vec_lvsl (0, ref);
- permB = vec_add (permA, vec_splat_u8 (1));
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- prev = vec_ld (0, dest);
- ref += stride;
- tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB)));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_st (tmp, 0, dest);
- tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB)));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- prev = vec_ld (2*stride, dest);
- vec_st (tmp, stride, dest);
- dest += 2*stride;
- tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB)));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- prev = vec_ld (stride, dest);
- vec_st (tmp, 0, dest);
- tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),
- vec_perm (ref0, ref1, permB)));
- vec_st (tmp, stride, dest);
-}
-
-static void MC_avg_x_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm0A, perm0B, perm1A, perm1B, ones, tmp0, tmp1, ref0, ref1;
- vector_u8_t prev;
-
- ones = vec_splat_u8 (1);
- tmp0 = vec_lvsl (0, ref);
- tmp0 = vec_mergeh (tmp0, tmp0);
- perm0A = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
- perm0B = vec_add (perm0A, ones);
- tmp1 = vec_lvsl (stride, ref);
- tmp1 = vec_mergeh (tmp1, tmp1);
- perm1A = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
- perm1B = vec_add (perm1A, ones);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- prev = vec_ld (0, dest);
- ref += stride;
- tmp0 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm0A),
- vec_perm (ref0, ref1, perm0B)));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm1A),
- vec_perm (ref0, ref1, perm1B)));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
- dest += stride;
- tmp0 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm0A),
- vec_perm (ref0, ref1, perm0B)));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm1A),
- vec_perm (ref0, ref1, perm1B)));
- vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);
-}
-
-static void MC_avg_y_16_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm, ref0, ref1, tmp0, tmp1, tmp, prev;
-
- perm = vec_lvsl (0, ref);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- tmp0 = vec_perm (ref0, ref1, perm);
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- prev = vec_ld (0, dest);
- tmp1 = vec_perm (ref0, ref1, perm);
- tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_st (tmp, 0, dest);
- tmp0 = vec_perm (ref0, ref1, perm);
- tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- ref += stride;
- prev = vec_ld (2*stride, dest);
- vec_st (tmp, stride, dest);
- dest += 2*stride;
- tmp1 = vec_perm (ref0, ref1, perm);
- tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (15, ref);
- prev = vec_ld (stride, dest);
- vec_st (tmp, 0, dest);
- tmp0 = vec_perm (ref0, ref1, perm);
- tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
- vec_st (tmp, stride, dest);
-}
-
-static void MC_avg_y_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm0, perm1, tmp0, tmp1, tmp, ref0, ref1, prev;
-
- tmp0 = vec_lvsl (0, ref);
- tmp0 = vec_mergeh (tmp0, tmp0);
- perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);
- tmp1 = vec_lvsl (stride, ref);
- tmp1 = vec_mergeh (tmp1, tmp1);
- perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- tmp0 = vec_perm (ref0, ref1, perm0);
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- prev = vec_ld (0, dest);
- tmp1 = vec_perm (ref0, ref1, perm1);
- tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- tmp0 = vec_perm (ref0, ref1, perm0);
- tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- tmp1 = vec_perm (ref0, ref1, perm1);
- tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (7, ref);
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- tmp0 = vec_perm (ref0, ref1, perm0);
- tmp = vec_avg (prev, vec_avg (tmp0, tmp1));
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
-}
-
-static void MC_avg_xy_16_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t permA, permB, ref0, ref1, A, B, avg0, avg1, xor0, xor1, tmp;
- vector_u8_t ones, prev;
-
- ones = vec_splat_u8 (1);
- permA = vec_lvsl (0, ref);
- permB = vec_add (permA, ones);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- prev = vec_ld (0, dest);
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg1 = vec_avg (A, B);
- xor1 = vec_xor (A, B);
- tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1))));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_st (tmp, 0, dest);
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
- tmp = vec_avg (prev,
- vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1))));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- ref += stride;
- prev = vec_ld (2*stride, dest);
- vec_st (tmp, stride, dest);
- dest += 2*stride;
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg1 = vec_avg (A, B);
- xor1 = vec_xor (A, B);
- tmp = vec_avg (prev,
- vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1))));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (16, ref);
- prev = vec_ld (stride, dest);
- vec_st (tmp, 0, dest);
- A = vec_perm (ref0, ref1, permA);
- B = vec_perm (ref0, ref1, permB);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
- tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1))));
- vec_st (tmp, stride, dest);
-}
-
-static void MC_avg_xy_8_altivec (uint8_t * dest, const uint8_t * ref,
- const int stride, int height)
-{
- vector_u8_t perm0A, perm0B, perm1A, perm1B, ref0, ref1, A, B;
- vector_u8_t avg0, avg1, xor0, xor1, tmp, ones, prev;
-
- ones = vec_splat_u8 (1);
- perm0A = vec_lvsl (0, ref);
- perm0A = vec_mergeh (perm0A, perm0A);
- perm0A = vec_pack ((vector_u16_t)perm0A, (vector_u16_t)perm0A);
- perm0B = vec_add (perm0A, ones);
- perm1A = vec_lvsl (stride, ref);
- perm1A = vec_mergeh (perm1A, perm1A);
- perm1A = vec_pack ((vector_u16_t)perm1A, (vector_u16_t)perm1A);
- perm1B = vec_add (perm1A, ones);
-
- height = (height >> 1) - 1;
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- A = vec_perm (ref0, ref1, perm0A);
- B = vec_perm (ref0, ref1, perm0B);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- prev = vec_ld (0, dest);
- A = vec_perm (ref0, ref1, perm1A);
- B = vec_perm (ref0, ref1, perm1B);
- avg1 = vec_avg (A, B);
- xor1 = vec_xor (A, B);
- tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1))));
-
- do {
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- A = vec_perm (ref0, ref1, perm0A);
- B = vec_perm (ref0, ref1, perm0B);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
- tmp = vec_avg (prev,
- vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1))));
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- ref += stride;
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- A = vec_perm (ref0, ref1, perm1A);
- B = vec_perm (ref0, ref1, perm1B);
- avg1 = vec_avg (A, B);
- xor1 = vec_xor (A, B);
- tmp = vec_avg (prev,
- vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1))));
- } while (--height);
-
- ref0 = vec_ld (0, ref);
- ref1 = vec_ld (8, ref);
- prev = vec_ld (stride, dest);
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
- dest += stride;
- A = vec_perm (ref0, ref1, perm0A);
- B = vec_perm (ref0, ref1, perm0B);
- avg0 = vec_avg (A, B);
- xor0 = vec_xor (A, B);
- tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),
- vec_and (vec_and (ones, vec_or (xor0, xor1)),
- vec_xor (avg0, avg1))));
- vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);
- vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);
-}
-
-MPEG2_MC_EXTERN (altivec)
-
-#endif
diff --git a/libmpeg2/motion_comp_arm.c b/libmpeg2/motion_comp_arm.c
deleted file mode 100644
index f783434a30..0000000000
--- a/libmpeg2/motion_comp_arm.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * motion_comp_arm.c
- * Copyright (C) 2004 AGAWA Koji <i (AT) atty (DOT) jp>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with mpeg2dec; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#if ARCH_ARM
-
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-#define avg2(a,b) ((a+b+1)>>1)
-#define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
-
-#define predict_o(i) (ref[i])
-#define predict_x(i) (avg2 (ref[i], ref[i+1]))
-#define predict_y(i) (avg2 (ref[i], (ref+stride)[i]))
-#define predict_xy(i) (avg4 (ref[i], ref[i+1], \
- (ref+stride)[i], (ref+stride)[i+1]))
-
-#define put(predictor,i) dest[i] = predictor (i)
-#define avg(predictor,i) dest[i] = avg2 (predictor (i), dest[i])
-
-/* mc function template */
-
-#define MC_FUNC(op,xy) \
-static void inline MC_##op##_##xy##_16_c (uint8_t * dest, const uint8_t * ref, \
- const int stride, int height) \
-{ \
- do { \
- op (predict_##xy, 0); \
- op (predict_##xy, 1); \
- op (predict_##xy, 2); \
- op (predict_##xy, 3); \
- op (predict_##xy, 4); \
- op (predict_##xy, 5); \
- op (predict_##xy, 6); \
- op (predict_##xy, 7); \
- op (predict_##xy, 8); \
- op (predict_##xy, 9); \
- op (predict_##xy, 10); \
- op (predict_##xy, 11); \
- op (predict_##xy, 12); \
- op (predict_##xy, 13); \
- op (predict_##xy, 14); \
- op (predict_##xy, 15); \
- ref += stride; \
- dest += stride; \
- } while (--height); \
-} \
-static void MC_##op##_##xy##_8_c (uint8_t * dest, const uint8_t * ref, \
- const int stride, int height) \
-{ \
- do { \
- op (predict_##xy, 0); \
- op (predict_##xy, 1); \
- op (predict_##xy, 2); \
- op (predict_##xy, 3); \
- op (predict_##xy, 4); \
- op (predict_##xy, 5); \
- op (predict_##xy, 6); \
- op (predict_##xy, 7); \
- ref += stride; \
- dest += stride; \
- } while (--height); \
-} \
-/* definitions of the actual mc functions */
-
-MC_FUNC (avg,o)
-MC_FUNC (avg,x)
-MC_FUNC (put,y)
-MC_FUNC (avg,y)
-MC_FUNC (put,xy)
-MC_FUNC (avg,xy)
-
-
-extern void MC_put_o_16_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height);
-
-extern void MC_put_x_16_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height);
-
-
-static void MC_put_y_16_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_y_16_c(dest, ref, stride, height);
-}
-
-static void MC_put_xy_16_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_xy_16_c(dest, ref, stride, height);
-}
-
-extern void MC_put_o_8_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height);
-
-extern void MC_put_x_8_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height);
-
-static void MC_put_y_8_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_y_8_c(dest, ref, stride, height);
-}
-
-static void MC_put_xy_8_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_xy_8_c(dest, ref, stride, height);
-}
-
-static void MC_avg_o_16_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_o_16_c(dest, ref, stride, height);
-}
-
-static void MC_avg_x_16_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_x_16_c(dest, ref, stride, height);
-}
-
-static void MC_avg_y_16_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_y_16_c(dest, ref, stride, height);
-}
-
-static void MC_avg_xy_16_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_xy_16_c(dest, ref, stride, height);
-}
-
-static void MC_avg_o_8_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_o_8_c(dest, ref, stride, height);
-}
-
-static void MC_avg_x_8_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_x_8_c(dest, ref, stride, height);
-}
-
-static void MC_avg_y_8_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_y_8_c(dest, ref, stride, height);
-}
-
-static void MC_avg_xy_8_arm (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_xy_8_c(dest, ref, stride, height);
-}
-
-MPEG2_MC_EXTERN (arm)
-
-#endif
diff --git a/libmpeg2/motion_comp_arm_s.S b/libmpeg2/motion_comp_arm_s.S
deleted file mode 100644
index f6c3d7df8e..0000000000
--- a/libmpeg2/motion_comp_arm_s.S
+++ /dev/null
@@ -1,323 +0,0 @@
-@ motion_comp_arm_s.S
-@ Copyright (C) 2004 AGAWA Koji <i (AT) atty (DOT) jp>
-@
-@ This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
-@ See http://libmpeg2.sourceforge.net/ for updates.
-@
-@ mpeg2dec is free software; you can redistribute it and/or modify
-@ it under the terms of the GNU General Public License as published by
-@ the Free Software Foundation; either version 2 of the License, or
-@ (at your option) any later version.
-@
-@ mpeg2dec 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 General Public License for more details.
-@
-@ You should have received a copy of the GNU General Public License
-@ along with mpeg2dec; if not, write to the Free Software
-@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- .text
-
-@ ----------------------------------------------------------------
- .align
- .global MC_put_o_16_arm
-MC_put_o_16_arm:
- @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height)
- pld [r1]
- stmfd sp!, {r4-r11, lr} @ R14 is also called LR
- and r4, r1, #3
- adr r5, MC_put_o_16_arm_align_jt
- add r5, r5, r4, lsl #2
- ldr pc, [r5]
-
-MC_put_o_16_arm_align0:
- ldmia r1, {r4-r7}
- add r1, r1, r2
- pld [r1]
- stmia r0, {r4-r7}
- subs r3, r3, #1
- add r0, r0, r2
- bne MC_put_o_16_arm_align0
- ldmfd sp!, {r4-r11, pc} @@ update PC with LR content.
-
-.macro PROC shift
- ldmia r1, {r4-r8}
- add r1, r1, r2
- mov r9, r4, lsr #(\shift)
- pld [r1]
- mov r10, r5, lsr #(\shift)
- orr r9, r9, r5, lsl #(32-\shift)
- mov r11, r6, lsr #(\shift)
- orr r10, r10, r6, lsl #(32-\shift)
- mov r12, r7, lsr #(\shift)
- orr r11, r11, r7, lsl #(32-\shift)
- orr r12, r12, r8, lsl #(32-\shift)
- stmia r0, {r9-r12}
- subs r3, r3, #1
- add r0, r0, r2
-.endm
-
-MC_put_o_16_arm_align1:
- and r1, r1, #0xFFFFFFFC
-1: PROC(8)
- bne 1b
- ldmfd sp!, {r4-r11, pc} @@ update PC with LR content.
-MC_put_o_16_arm_align2:
- and r1, r1, #0xFFFFFFFC
-1: PROC(16)
- bne 1b
- ldmfd sp!, {r4-r11, pc} @@ update PC with LR content.
-MC_put_o_16_arm_align3:
- and r1, r1, #0xFFFFFFFC
-1: PROC(24)
- bne 1b
- ldmfd sp!, {r4-r11, pc} @@ update PC with LR content.
-MC_put_o_16_arm_align_jt:
- .word MC_put_o_16_arm_align0
- .word MC_put_o_16_arm_align1
- .word MC_put_o_16_arm_align2
- .word MC_put_o_16_arm_align3
-
-@ ----------------------------------------------------------------
- .align
- .global MC_put_o_8_arm
-MC_put_o_8_arm:
- @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height)
- pld [r1]
- stmfd sp!, {r4-r10, lr} @ R14 is also called LR
- and r4, r1, #3
- adr r5, MC_put_o_8_arm_align_jt
- add r5, r5, r4, lsl #2
- ldr pc, [r5]
-MC_put_o_8_arm_align0:
- ldmia r1, {r4-r5}
- add r1, r1, r2
- pld [r1]
- stmia r0, {r4-r5}
- add r0, r0, r2
- subs r3, r3, #1
- bne MC_put_o_8_arm_align0
- ldmfd sp!, {r4-r10, pc} @@ update PC with LR content.
-
-.macro PROC8 shift
- ldmia r1, {r4-r6}
- add r1, r1, r2
- mov r9, r4, lsr #(\shift)
- pld [r1]
- mov r10, r5, lsr #(\shift)
- orr r9, r9, r5, lsl #(32-\shift)
- orr r10, r10, r6, lsl #(32-\shift)
- stmia r0, {r9-r10}
- subs r3, r3, #1
- add r0, r0, r2
-.endm
-
-MC_put_o_8_arm_align1:
- and r1, r1, #0xFFFFFFFC
-1: PROC8(8)
- bne 1b
- ldmfd sp!, {r4-r10, pc} @@ update PC with LR content.
-
-MC_put_o_8_arm_align2:
- and r1, r1, #0xFFFFFFFC
-1: PROC8(16)
- bne 1b
- ldmfd sp!, {r4-r10, pc} @@ update PC with LR content.
-
-MC_put_o_8_arm_align3:
- and r1, r1, #0xFFFFFFFC
-1: PROC8(24)
- bne 1b
- ldmfd sp!, {r4-r10, pc} @@ update PC with LR content.
-
-MC_put_o_8_arm_align_jt:
- .word MC_put_o_8_arm_align0
- .word MC_put_o_8_arm_align1
- .word MC_put_o_8_arm_align2
- .word MC_put_o_8_arm_align3
-
-@ ----------------------------------------------------------------
-.macro AVG_PW rW1, rW2
- mov \rW2, \rW2, lsl #24
- orr \rW2, \rW2, \rW1, lsr #8
- eor r9, \rW1, \rW2
- and \rW2, \rW1, \rW2
- and r10, r9, r12
- add \rW2, \rW2, r10, lsr #1
- and r10, r9, r11
- add \rW2, \rW2, r10
-.endm
-
- .align
- .global MC_put_x_16_arm
-MC_put_x_16_arm:
- @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height)
- pld [r1]
- stmfd sp!, {r4-r11,lr} @ R14 is also called LR
- and r4, r1, #3
- adr r5, MC_put_x_16_arm_align_jt
- ldr r11, [r5]
- mvn r12, r11
- add r5, r5, r4, lsl #2
- ldr pc, [r5, #4]
-
-.macro ADJ_ALIGN_QW shift, R0, R1, R2, R3, R4
- mov \R0, \R0, lsr #(\shift)
- orr \R0, \R0, \R1, lsl #(32 - \shift)
- mov \R1, \R1, lsr #(\shift)
- orr \R1, \R1, \R2, lsl #(32 - \shift)
- mov \R2, \R2, lsr #(\shift)
- orr \R2, \R2, \R3, lsl #(32 - \shift)
- mov \R3, \R3, lsr #(\shift)
- orr \R3, \R3, \R4, lsl #(32 - \shift)
- mov \R4, \R4, lsr #(\shift)
-@ and \R4, \R4, #0xFF
-.endm
-
-MC_put_x_16_arm_align0:
- ldmia r1, {r4-r8}
- add r1, r1, r2
- pld [r1]
- AVG_PW r7, r8
- AVG_PW r6, r7
- AVG_PW r5, r6
- AVG_PW r4, r5
- stmia r0, {r5-r8}
- subs r3, r3, #1
- add r0, r0, r2
- bne MC_put_x_16_arm_align0
- ldmfd sp!, {r4-r11,pc} @@ update PC with LR content.
-MC_put_x_16_arm_align1:
- and r1, r1, #0xFFFFFFFC
-1: ldmia r1, {r4-r8}
- add r1, r1, r2
- pld [r1]
- ADJ_ALIGN_QW 8, r4, r5, r6, r7, r8
- AVG_PW r7, r8
- AVG_PW r6, r7
- AVG_PW r5, r6
- AVG_PW r4, r5
- stmia r0, {r5-r8}
- subs r3, r3, #1
- add r0, r0, r2
- bne 1b
- ldmfd sp!, {r4-r11,pc} @@ update PC with LR content.
-MC_put_x_16_arm_align2:
- and r1, r1, #0xFFFFFFFC
-1: ldmia r1, {r4-r8}
- add r1, r1, r2
- pld [r1]
- ADJ_ALIGN_QW 16, r4, r5, r6, r7, r8
- AVG_PW r7, r8
- AVG_PW r6, r7
- AVG_PW r5, r6
- AVG_PW r4, r5
- stmia r0, {r5-r8}
- subs r3, r3, #1
- add r0, r0, r2
- bne 1b
- ldmfd sp!, {r4-r11,pc} @@ update PC with LR content.
-MC_put_x_16_arm_align3:
- and r1, r1, #0xFFFFFFFC
-1: ldmia r1, {r4-r8}
- add r1, r1, r2
- pld [r1]
- ADJ_ALIGN_QW 24, r4, r5, r6, r7, r8
- AVG_PW r7, r8
- AVG_PW r6, r7
- AVG_PW r5, r6
- AVG_PW r4, r5
- stmia r0, {r5-r8}
- subs r3, r3, #1
- add r0, r0, r2
- bne 1b
- ldmfd sp!, {r4-r11,pc} @@ update PC with LR content.
-MC_put_x_16_arm_align_jt:
- .word 0x01010101
- .word MC_put_x_16_arm_align0
- .word MC_put_x_16_arm_align1
- .word MC_put_x_16_arm_align2
- .word MC_put_x_16_arm_align3
-
-@ ----------------------------------------------------------------
- .align
- .global MC_put_x_8_arm
-MC_put_x_8_arm:
- @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height)
- pld [r1]
- stmfd sp!, {r4-r11,lr} @ R14 is also called LR
- and r4, r1, #3
- adr r5, MC_put_x_8_arm_align_jt
- ldr r11, [r5]
- mvn r12, r11
- add r5, r5, r4, lsl #2
- ldr pc, [r5, #4]
-
-.macro ADJ_ALIGN_DW shift, R0, R1, R2
- mov \R0, \R0, lsr #(\shift)
- orr \R0, \R0, \R1, lsl #(32 - \shift)
- mov \R1, \R1, lsr #(\shift)
- orr \R1, \R1, \R2, lsl #(32 - \shift)
- mov \R2, \R2, lsr #(\shift)
-@ and \R4, \R4, #0xFF
-.endm
-
-MC_put_x_8_arm_align0:
- ldmia r1, {r4-r6}
- add r1, r1, r2
- pld [r1]
- AVG_PW r5, r6
- AVG_PW r4, r5
- stmia r0, {r5-r6}
- subs r3, r3, #1
- add r0, r0, r2
- bne MC_put_x_8_arm_align0
- ldmfd sp!, {r4-r11,pc} @@ update PC with LR content.
-MC_put_x_8_arm_align1:
- and r1, r1, #0xFFFFFFFC
-1: ldmia r1, {r4-r6}
- add r1, r1, r2
- pld [r1]
- ADJ_ALIGN_DW 8, r4, r5, r6
- AVG_PW r5, r6
- AVG_PW r4, r5
- stmia r0, {r5-r6}
- subs r3, r3, #1
- add r0, r0, r2
- bne 1b
- ldmfd sp!, {r4-r11,pc} @@ update PC with LR content.
-MC_put_x_8_arm_align2:
- and r1, r1, #0xFFFFFFFC
-1: ldmia r1, {r4-r6}
- add r1, r1, r2
- pld [r1]
- ADJ_ALIGN_DW 16, r4, r5, r6
- AVG_PW r5, r6
- AVG_PW r4, r5
- stmia r0, {r5-r6}
- subs r3, r3, #1
- add r0, r0, r2
- bne 1b
- ldmfd sp!, {r4-r11,pc} @@ update PC with LR content.
-MC_put_x_8_arm_align3:
- and r1, r1, #0xFFFFFFFC
-1: ldmia r1, {r4-r6}
- add r1, r1, r2
- pld [r1]
- ADJ_ALIGN_DW 24, r4, r5, r6
- AVG_PW r5, r6
- AVG_PW r4, r5
- stmia r0, {r5-r6}
- subs r3, r3, #1
- add r0, r0, r2
- bne 1b
- ldmfd sp!, {r4-r11,pc} @@ update PC with LR content.
-MC_put_x_8_arm_align_jt:
- .word 0x01010101
- .word MC_put_x_8_arm_align0
- .word MC_put_x_8_arm_align1
- .word MC_put_x_8_arm_align2
- .word MC_put_x_8_arm_align3
diff --git a/libmpeg2/motion_comp_mmx.c b/libmpeg2/motion_comp_mmx.c
deleted file mode 100644
index d89c2bd591..0000000000
--- a/libmpeg2/motion_comp_mmx.c
+++ /dev/null
@@ -1,1013 +0,0 @@
-/*
- * motion_comp_mmx.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#if ARCH_X86 || ARCH_X86_64
-
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-#include "mmx.h"
-
-#define CPU_MMXEXT 0
-#define CPU_3DNOW 1
-
-
-#if HAVE_MMX
-/* MMX code - needs a rewrite */
-
-/*
- * Motion Compensation frequently needs to average values using the
- * formula (x+y+1)>>1. Both MMXEXT and 3Dnow include one instruction
- * to compute this, but it's been left out of classic MMX.
- *
- * We need to be careful of overflows when doing this computation.
- * Rather than unpacking data to 16-bits, which reduces parallelism,
- * we use the following formulas:
- *
- * (x+y)>>1 == (x&y)+((x^y)>>1)
- * (x+y+1)>>1 == (x|y)-((x^y)>>1)
- */
-
-/* some rounding constants */
-static mmx_t mask1 = {0xfefefefefefefefeLL};
-static mmx_t round4 = {0x0002000200020002LL};
-
-/*
- * This code should probably be compiled with loop unrolling
- * (ie, -funroll-loops in gcc)becuase some of the loops
- * use a small static number of iterations. This was written
- * with the assumption the compiler knows best about when
- * unrolling will help
- */
-
-static inline void mmx_zero_reg (void)
-{
- /* load 0 into mm0 */
- pxor_r2r (mm0, mm0);
-}
-
-static inline void mmx_average_2_U8 (uint8_t * dest, const uint8_t * src1,
- const uint8_t * src2)
-{
- /* *dest = (*src1 + *src2 + 1)/ 2; */
-
- movq_m2r (*src1, mm1); /* load 8 src1 bytes */
- movq_r2r (mm1, mm2); /* copy 8 src1 bytes */
-
- movq_m2r (*src2, mm3); /* load 8 src2 bytes */
- movq_r2r (mm3, mm4); /* copy 8 src2 bytes */
-
- pxor_r2r (mm1, mm3); /* xor src1 and src2 */
- pand_m2r (mask1, mm3); /* mask lower bits */
- psrlq_i2r (1, mm3); /* /2 */
- por_r2r (mm2, mm4); /* or src1 and src2 */
- psubb_r2r (mm3, mm4); /* subtract subresults */
- movq_r2m (mm4, *dest); /* store result in dest */
-}
-
-static inline void mmx_interp_average_2_U8 (uint8_t * dest,
- const uint8_t * src1,
- const uint8_t * src2)
-{
- /* *dest = (*dest + (*src1 + *src2 + 1)/ 2 + 1)/ 2; */
-
- movq_m2r (*dest, mm1); /* load 8 dest bytes */
- movq_r2r (mm1, mm2); /* copy 8 dest bytes */
-
- movq_m2r (*src1, mm3); /* load 8 src1 bytes */
- movq_r2r (mm3, mm4); /* copy 8 src1 bytes */
-
- movq_m2r (*src2, mm5); /* load 8 src2 bytes */
- movq_r2r (mm5, mm6); /* copy 8 src2 bytes */
-
- pxor_r2r (mm3, mm5); /* xor src1 and src2 */
- pand_m2r (mask1, mm5); /* mask lower bits */
- psrlq_i2r (1, mm5); /* /2 */
- por_r2r (mm4, mm6); /* or src1 and src2 */
- psubb_r2r (mm5, mm6); /* subtract subresults */
- movq_r2r (mm6, mm5); /* copy subresult */
-
- pxor_r2r (mm1, mm5); /* xor srcavg and dest */
- pand_m2r (mask1, mm5); /* mask lower bits */
- psrlq_i2r (1, mm5); /* /2 */
- por_r2r (mm2, mm6); /* or srcavg and dest */
- psubb_r2r (mm5, mm6); /* subtract subresults */
- movq_r2m (mm6, *dest); /* store result in dest */
-}
-
-static inline void mmx_average_4_U8 (uint8_t * dest, const uint8_t * src1,
- const uint8_t * src2,
- const uint8_t * src3,
- const uint8_t * src4)
-{
- /* *dest = (*src1 + *src2 + *src3 + *src4 + 2)/ 4; */
-
- movq_m2r (*src1, mm1); /* load 8 src1 bytes */
- movq_r2r (mm1, mm2); /* copy 8 src1 bytes */
-
- punpcklbw_r2r (mm0, mm1); /* unpack low src1 bytes */
- punpckhbw_r2r (mm0, mm2); /* unpack high src1 bytes */
-
- movq_m2r (*src2, mm3); /* load 8 src2 bytes */
- movq_r2r (mm3, mm4); /* copy 8 src2 bytes */
-
- punpcklbw_r2r (mm0, mm3); /* unpack low src2 bytes */
- punpckhbw_r2r (mm0, mm4); /* unpack high src2 bytes */
-
- paddw_r2r (mm3, mm1); /* add lows */
- paddw_r2r (mm4, mm2); /* add highs */
-
- /* now have partials in mm1 and mm2 */
-
- movq_m2r (*src3, mm3); /* load 8 src3 bytes */
- movq_r2r (mm3, mm4); /* copy 8 src3 bytes */
-
- punpcklbw_r2r (mm0, mm3); /* unpack low src3 bytes */
- punpckhbw_r2r (mm0, mm4); /* unpack high src3 bytes */
-
- paddw_r2r (mm3, mm1); /* add lows */
- paddw_r2r (mm4, mm2); /* add highs */
-
- movq_m2r (*src4, mm5); /* load 8 src4 bytes */
- movq_r2r (mm5, mm6); /* copy 8 src4 bytes */
-
- punpcklbw_r2r (mm0, mm5); /* unpack low src4 bytes */
- punpckhbw_r2r (mm0, mm6); /* unpack high src4 bytes */
-
- paddw_r2r (mm5, mm1); /* add lows */
- paddw_r2r (mm6, mm2); /* add highs */
-
- /* now have subtotal in mm1 and mm2 */
-
- paddw_m2r (round4, mm1);
- psraw_i2r (2, mm1); /* /4 */
- paddw_m2r (round4, mm2);
- psraw_i2r (2, mm2); /* /4 */
-
- packuswb_r2r (mm2, mm1); /* pack (w/ saturation) */
- movq_r2m (mm1, *dest); /* store result in dest */
-}
-
-static inline void mmx_interp_average_4_U8 (uint8_t * dest,
- const uint8_t * src1,
- const uint8_t * src2,
- const uint8_t * src3,
- const uint8_t * src4)
-{
- /* *dest = (*dest + (*src1 + *src2 + *src3 + *src4 + 2)/ 4 + 1)/ 2; */
-
- movq_m2r (*src1, mm1); /* load 8 src1 bytes */
- movq_r2r (mm1, mm2); /* copy 8 src1 bytes */
-
- punpcklbw_r2r (mm0, mm1); /* unpack low src1 bytes */
- punpckhbw_r2r (mm0, mm2); /* unpack high src1 bytes */
-
- movq_m2r (*src2, mm3); /* load 8 src2 bytes */
- movq_r2r (mm3, mm4); /* copy 8 src2 bytes */
-
- punpcklbw_r2r (mm0, mm3); /* unpack low src2 bytes */
- punpckhbw_r2r (mm0, mm4); /* unpack high src2 bytes */
-
- paddw_r2r (mm3, mm1); /* add lows */
- paddw_r2r (mm4, mm2); /* add highs */
-
- /* now have partials in mm1 and mm2 */
-
- movq_m2r (*src3, mm3); /* load 8 src3 bytes */
- movq_r2r (mm3, mm4); /* copy 8 src3 bytes */
-
- punpcklbw_r2r (mm0, mm3); /* unpack low src3 bytes */
- punpckhbw_r2r (mm0, mm4); /* unpack high src3 bytes */
-
- paddw_r2r (mm3, mm1); /* add lows */
- paddw_r2r (mm4, mm2); /* add highs */
-
- movq_m2r (*src4, mm5); /* load 8 src4 bytes */
- movq_r2r (mm5, mm6); /* copy 8 src4 bytes */
-
- punpcklbw_r2r (mm0, mm5); /* unpack low src4 bytes */
- punpckhbw_r2r (mm0, mm6); /* unpack high src4 bytes */
-
- paddw_r2r (mm5, mm1); /* add lows */
- paddw_r2r (mm6, mm2); /* add highs */
-
- paddw_m2r (round4, mm1);
- psraw_i2r (2, mm1); /* /4 */
- paddw_m2r (round4, mm2);
- psraw_i2r (2, mm2); /* /4 */
-
- /* now have subtotal/4 in mm1 and mm2 */
-
- movq_m2r (*dest, mm3); /* load 8 dest bytes */
- movq_r2r (mm3, mm4); /* copy 8 dest bytes */
-
- packuswb_r2r (mm2, mm1); /* pack (w/ saturation) */
- movq_r2r (mm1,mm2); /* copy subresult */
-
- pxor_r2r (mm1, mm3); /* xor srcavg and dest */
- pand_m2r (mask1, mm3); /* mask lower bits */
- psrlq_i2r (1, mm3); /* /2 */
- por_r2r (mm2, mm4); /* or srcavg and dest */
- psubb_r2r (mm3, mm4); /* subtract subresults */
- movq_r2m (mm4, *dest); /* store result in dest */
-}
-
-/*-----------------------------------------------------------------------*/
-
-static inline void MC_avg_mmx (const int width, int height, uint8_t * dest,
- const uint8_t * ref, const int stride)
-{
- mmx_zero_reg ();
-
- do {
- mmx_average_2_U8 (dest, dest, ref);
-
- if (width == 16)
- mmx_average_2_U8 (dest+8, dest+8, ref+8);
-
- dest += stride;
- ref += stride;
- } while (--height);
-}
-
-static void MC_avg_o_16_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_mmx (16, height, dest, ref, stride);
-}
-
-static void MC_avg_o_8_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_mmx (8, height, dest, ref, stride);
-}
-
-/*-----------------------------------------------------------------------*/
-
-static inline void MC_put_mmx (const int width, int height, uint8_t * dest,
- const uint8_t * ref, const int stride)
-{
- mmx_zero_reg ();
-
- do {
- movq_m2r (* ref, mm1); /* load 8 ref bytes */
- movq_r2m (mm1,* dest); /* store 8 bytes at curr */
-
- if (width == 16)
- {
- movq_m2r (* (ref+8), mm1); /* load 8 ref bytes */
- movq_r2m (mm1,* (dest+8)); /* store 8 bytes at curr */
- }
-
- dest += stride;
- ref += stride;
- } while (--height);
-}
-
-static void MC_put_o_16_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_mmx (16, height, dest, ref, stride);
-}
-
-static void MC_put_o_8_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_mmx (8, height, dest, ref, stride);
-}
-
-/*-----------------------------------------------------------------------*/
-
-/* Half pixel interpolation in the x direction */
-static inline void MC_avg_x_mmx (const int width, int height, uint8_t * dest,
- const uint8_t * ref, const int stride)
-{
- mmx_zero_reg ();
-
- do {
- mmx_interp_average_2_U8 (dest, ref, ref+1);
-
- if (width == 16)
- mmx_interp_average_2_U8 (dest+8, ref+8, ref+9);
-
- dest += stride;
- ref += stride;
- } while (--height);
-}
-
-static void MC_avg_x_16_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_x_mmx (16, height, dest, ref, stride);
-}
-
-static void MC_avg_x_8_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_x_mmx (8, height, dest, ref, stride);
-}
-
-/*-----------------------------------------------------------------------*/
-
-static inline void MC_put_x_mmx (const int width, int height, uint8_t * dest,
- const uint8_t * ref, const int stride)
-{
- mmx_zero_reg ();
-
- do {
- mmx_average_2_U8 (dest, ref, ref+1);
-
- if (width == 16)
- mmx_average_2_U8 (dest+8, ref+8, ref+9);
-
- dest += stride;
- ref += stride;
- } while (--height);
-}
-
-static void MC_put_x_16_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_x_mmx (16, height, dest, ref, stride);
-}
-
-static void MC_put_x_8_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_x_mmx (8, height, dest, ref, stride);
-}
-
-/*-----------------------------------------------------------------------*/
-
-static inline void MC_avg_xy_mmx (const int width, int height, uint8_t * dest,
- const uint8_t * ref, const int stride)
-{
- const uint8_t * ref_next = ref + stride;
-
- mmx_zero_reg ();
-
- do {
- mmx_interp_average_4_U8 (dest, ref, ref+1, ref_next, ref_next+1);
-
- if (width == 16)
- mmx_interp_average_4_U8 (dest+8, ref+8, ref+9,
- ref_next+8, ref_next+9);
-
- dest += stride;
- ref += stride;
- ref_next += stride;
- } while (--height);
-}
-
-static void MC_avg_xy_16_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_xy_mmx (16, height, dest, ref, stride);
-}
-
-static void MC_avg_xy_8_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_xy_mmx (8, height, dest, ref, stride);
-}
-
-/*-----------------------------------------------------------------------*/
-
-static inline void MC_put_xy_mmx (const int width, int height, uint8_t * dest,
- const uint8_t * ref, const int stride)
-{
- const uint8_t * ref_next = ref + stride;
-
- mmx_zero_reg ();
-
- do {
- mmx_average_4_U8 (dest, ref, ref+1, ref_next, ref_next+1);
-
- if (width == 16)
- mmx_average_4_U8 (dest+8, ref+8, ref+9, ref_next+8, ref_next+9);
-
- dest += stride;
- ref += stride;
- ref_next += stride;
- } while (--height);
-}
-
-static void MC_put_xy_16_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_xy_mmx (16, height, dest, ref, stride);
-}
-
-static void MC_put_xy_8_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_xy_mmx (8, height, dest, ref, stride);
-}
-
-/*-----------------------------------------------------------------------*/
-
-static inline void MC_avg_y_mmx (const int width, int height, uint8_t * dest,
- const uint8_t * ref, const int stride)
-{
- const uint8_t * ref_next = ref + stride;
-
- mmx_zero_reg ();
-
- do {
- mmx_interp_average_2_U8 (dest, ref, ref_next);
-
- if (width == 16)
- mmx_interp_average_2_U8 (dest+8, ref+8, ref_next+8);
-
- dest += stride;
- ref += stride;
- ref_next += stride;
- } while (--height);
-}
-
-static void MC_avg_y_16_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_y_mmx (16, height, dest, ref, stride);
-}
-
-static void MC_avg_y_8_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg_y_mmx (8, height, dest, ref, stride);
-}
-
-/*-----------------------------------------------------------------------*/
-
-static inline void MC_put_y_mmx (const int width, int height, uint8_t * dest,
- const uint8_t * ref, const int stride)
-{
- const uint8_t * ref_next = ref + stride;
-
- mmx_zero_reg ();
-
- do {
- mmx_average_2_U8 (dest, ref, ref_next);
-
- if (width == 16)
- mmx_average_2_U8 (dest+8, ref+8, ref_next+8);
-
- dest += stride;
- ref += stride;
- ref_next += stride;
- } while (--height);
-}
-
-static void MC_put_y_16_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_y_mmx (16, height, dest, ref, stride);
-}
-
-static void MC_put_y_8_mmx (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put_y_mmx (8, height, dest, ref, stride);
-}
-
-
-MPEG2_MC_EXTERN (mmx)
-
-#endif /* HAVE_MMX */
-
-
-
-
-
-
-/* CPU_MMXEXT/CPU_3DNOW adaptation layer */
-
-#define pavg_r2r(src,dest) \
-do { \
- if (cpu == CPU_MMXEXT) \
- pavgb_r2r (src, dest); \
- else \
- pavgusb_r2r (src, dest); \
-} while (0)
-
-#define pavg_m2r(src,dest) \
-do { \
- if (cpu == CPU_MMXEXT) \
- pavgb_m2r (src, dest); \
- else \
- pavgusb_m2r (src, dest); \
-} while (0)
-
-
-/* CPU_MMXEXT code */
-
-
-static inline void MC_put1_8 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride)
-{
- do {
- movq_m2r (*ref, mm0);
- movq_r2m (mm0, *dest);
- ref += stride;
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_put1_16 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride)
-{
- do {
- movq_m2r (*ref, mm0);
- movq_m2r (*(ref+8), mm1);
- ref += stride;
- movq_r2m (mm0, *dest);
- movq_r2m (mm1, *(dest+8));
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_avg1_8 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- pavg_m2r (*dest, mm0);
- ref += stride;
- movq_r2m (mm0, *dest);
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_avg1_16 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- movq_m2r (*(ref+8), mm1);
- pavg_m2r (*dest, mm0);
- pavg_m2r (*(dest+8), mm1);
- movq_r2m (mm0, *dest);
- ref += stride;
- movq_r2m (mm1, *(dest+8));
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_put2_8 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int offset,
- const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- pavg_m2r (*(ref+offset), mm0);
- ref += stride;
- movq_r2m (mm0, *dest);
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_put2_16 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int offset,
- const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- movq_m2r (*(ref+8), mm1);
- pavg_m2r (*(ref+offset), mm0);
- pavg_m2r (*(ref+offset+8), mm1);
- movq_r2m (mm0, *dest);
- ref += stride;
- movq_r2m (mm1, *(dest+8));
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_avg2_8 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int offset,
- const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- pavg_m2r (*(ref+offset), mm0);
- pavg_m2r (*dest, mm0);
- ref += stride;
- movq_r2m (mm0, *dest);
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_avg2_16 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int offset,
- const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- movq_m2r (*(ref+8), mm1);
- pavg_m2r (*(ref+offset), mm0);
- pavg_m2r (*(ref+offset+8), mm1);
- pavg_m2r (*dest, mm0);
- pavg_m2r (*(dest+8), mm1);
- ref += stride;
- movq_r2m (mm0, *dest);
- movq_r2m (mm1, *(dest+8));
- dest += stride;
- } while (--height);
-}
-
-static mmx_t mask_one = {0x0101010101010101LL};
-
-static inline void MC_put4_8 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int cpu)
-{
- movq_m2r (*ref, mm0);
- movq_m2r (*(ref+1), mm1);
- movq_r2r (mm0, mm7);
- pxor_r2r (mm1, mm7);
- pavg_r2r (mm1, mm0);
- ref += stride;
-
- do {
- movq_m2r (*ref, mm2);
- movq_r2r (mm0, mm5);
-
- movq_m2r (*(ref+1), mm3);
- movq_r2r (mm2, mm6);
-
- pxor_r2r (mm3, mm6);
- pavg_r2r (mm3, mm2);
-
- por_r2r (mm6, mm7);
- pxor_r2r (mm2, mm5);
-
- pand_r2r (mm5, mm7);
- pavg_r2r (mm2, mm0);
-
- pand_m2r (mask_one, mm7);
-
- psubusb_r2r (mm7, mm0);
-
- ref += stride;
- movq_r2m (mm0, *dest);
- dest += stride;
-
- movq_r2r (mm6, mm7); /* unroll ! */
- movq_r2r (mm2, mm0); /* unroll ! */
- } while (--height);
-}
-
-static inline void MC_put4_16 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- movq_m2r (*(ref+stride+1), mm1);
- movq_r2r (mm0, mm7);
- movq_m2r (*(ref+1), mm2);
- pxor_r2r (mm1, mm7);
- movq_m2r (*(ref+stride), mm3);
- movq_r2r (mm2, mm6);
- pxor_r2r (mm3, mm6);
- pavg_r2r (mm1, mm0);
- pavg_r2r (mm3, mm2);
- por_r2r (mm6, mm7);
- movq_r2r (mm0, mm6);
- pxor_r2r (mm2, mm6);
- pand_r2r (mm6, mm7);
- pand_m2r (mask_one, mm7);
- pavg_r2r (mm2, mm0);
- psubusb_r2r (mm7, mm0);
- movq_r2m (mm0, *dest);
-
- movq_m2r (*(ref+8), mm0);
- movq_m2r (*(ref+stride+9), mm1);
- movq_r2r (mm0, mm7);
- movq_m2r (*(ref+9), mm2);
- pxor_r2r (mm1, mm7);
- movq_m2r (*(ref+stride+8), mm3);
- movq_r2r (mm2, mm6);
- pxor_r2r (mm3, mm6);
- pavg_r2r (mm1, mm0);
- pavg_r2r (mm3, mm2);
- por_r2r (mm6, mm7);
- movq_r2r (mm0, mm6);
- pxor_r2r (mm2, mm6);
- pand_r2r (mm6, mm7);
- pand_m2r (mask_one, mm7);
- pavg_r2r (mm2, mm0);
- psubusb_r2r (mm7, mm0);
- ref += stride;
- movq_r2m (mm0, *(dest+8));
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_avg4_8 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- movq_m2r (*(ref+stride+1), mm1);
- movq_r2r (mm0, mm7);
- movq_m2r (*(ref+1), mm2);
- pxor_r2r (mm1, mm7);
- movq_m2r (*(ref+stride), mm3);
- movq_r2r (mm2, mm6);
- pxor_r2r (mm3, mm6);
- pavg_r2r (mm1, mm0);
- pavg_r2r (mm3, mm2);
- por_r2r (mm6, mm7);
- movq_r2r (mm0, mm6);
- pxor_r2r (mm2, mm6);
- pand_r2r (mm6, mm7);
- pand_m2r (mask_one, mm7);
- pavg_r2r (mm2, mm0);
- psubusb_r2r (mm7, mm0);
- movq_m2r (*dest, mm1);
- pavg_r2r (mm1, mm0);
- ref += stride;
- movq_r2m (mm0, *dest);
- dest += stride;
- } while (--height);
-}
-
-static inline void MC_avg4_16 (int height, uint8_t * dest, const uint8_t * ref,
- const int stride, const int cpu)
-{
- do {
- movq_m2r (*ref, mm0);
- movq_m2r (*(ref+stride+1), mm1);
- movq_r2r (mm0, mm7);
- movq_m2r (*(ref+1), mm2);
- pxor_r2r (mm1, mm7);
- movq_m2r (*(ref+stride), mm3);
- movq_r2r (mm2, mm6);
- pxor_r2r (mm3, mm6);
- pavg_r2r (mm1, mm0);
- pavg_r2r (mm3, mm2);
- por_r2r (mm6, mm7);
- movq_r2r (mm0, mm6);
- pxor_r2r (mm2, mm6);
- pand_r2r (mm6, mm7);
- pand_m2r (mask_one, mm7);
- pavg_r2r (mm2, mm0);
- psubusb_r2r (mm7, mm0);
- movq_m2r (*dest, mm1);
- pavg_r2r (mm1, mm0);
- movq_r2m (mm0, *dest);
-
- movq_m2r (*(ref+8), mm0);
- movq_m2r (*(ref+stride+9), mm1);
- movq_r2r (mm0, mm7);
- movq_m2r (*(ref+9), mm2);
- pxor_r2r (mm1, mm7);
- movq_m2r (*(ref+stride+8), mm3);
- movq_r2r (mm2, mm6);
- pxor_r2r (mm3, mm6);
- pavg_r2r (mm1, mm0);
- pavg_r2r (mm3, mm2);
- por_r2r (mm6, mm7);
- movq_r2r (mm0, mm6);
- pxor_r2r (mm2, mm6);
- pand_r2r (mm6, mm7);
- pand_m2r (mask_one, mm7);
- pavg_r2r (mm2, mm0);
- psubusb_r2r (mm7, mm0);
- movq_m2r (*(dest+8), mm1);
- pavg_r2r (mm1, mm0);
- ref += stride;
- movq_r2m (mm0, *(dest+8));
- dest += stride;
- } while (--height);
-}
-
-#if HAVE_MMX2
-
-static void MC_avg_o_16_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg1_16 (height, dest, ref, stride, CPU_MMXEXT);
-}
-
-static void MC_avg_o_8_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg1_8 (height, dest, ref, stride, CPU_MMXEXT);
-}
-
-static void MC_put_o_16_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put1_16 (height, dest, ref, stride);
-}
-
-static void MC_put_o_8_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put1_8 (height, dest, ref, stride);
-}
-
-static void MC_avg_x_16_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg2_16 (height, dest, ref, stride, 1, CPU_MMXEXT);
-}
-
-static void MC_avg_x_8_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg2_8 (height, dest, ref, stride, 1, CPU_MMXEXT);
-}
-
-static void MC_put_x_16_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put2_16 (height, dest, ref, stride, 1, CPU_MMXEXT);
-}
-
-static void MC_put_x_8_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put2_8 (height, dest, ref, stride, 1, CPU_MMXEXT);
-}
-
-static void MC_avg_y_16_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg2_16 (height, dest, ref, stride, stride, CPU_MMXEXT);
-}
-
-static void MC_avg_y_8_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg2_8 (height, dest, ref, stride, stride, CPU_MMXEXT);
-}
-
-static void MC_put_y_16_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put2_16 (height, dest, ref, stride, stride, CPU_MMXEXT);
-}
-
-static void MC_put_y_8_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put2_8 (height, dest, ref, stride, stride, CPU_MMXEXT);
-}
-
-static void MC_avg_xy_16_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg4_16 (height, dest, ref, stride, CPU_MMXEXT);
-}
-
-static void MC_avg_xy_8_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg4_8 (height, dest, ref, stride, CPU_MMXEXT);
-}
-
-static void MC_put_xy_16_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put4_16 (height, dest, ref, stride, CPU_MMXEXT);
-}
-
-static void MC_put_xy_8_mmxext (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put4_8 (height, dest, ref, stride, CPU_MMXEXT);
-}
-
-
-MPEG2_MC_EXTERN (mmxext)
-
-#endif /* HAVE_MMX2 */
-
-#if HAVE_AMD3DNOW
-
-static void MC_avg_o_16_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg1_16 (height, dest, ref, stride, CPU_3DNOW);
-}
-
-static void MC_avg_o_8_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg1_8 (height, dest, ref, stride, CPU_3DNOW);
-}
-
-static void MC_put_o_16_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put1_16 (height, dest, ref, stride);
-}
-
-static void MC_put_o_8_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put1_8 (height, dest, ref, stride);
-}
-
-static void MC_avg_x_16_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg2_16 (height, dest, ref, stride, 1, CPU_3DNOW);
-}
-
-static void MC_avg_x_8_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg2_8 (height, dest, ref, stride, 1, CPU_3DNOW);
-}
-
-static void MC_put_x_16_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put2_16 (height, dest, ref, stride, 1, CPU_3DNOW);
-}
-
-static void MC_put_x_8_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put2_8 (height, dest, ref, stride, 1, CPU_3DNOW);
-}
-
-static void MC_avg_y_16_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg2_16 (height, dest, ref, stride, stride, CPU_3DNOW);
-}
-
-static void MC_avg_y_8_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg2_8 (height, dest, ref, stride, stride, CPU_3DNOW);
-}
-
-static void MC_put_y_16_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put2_16 (height, dest, ref, stride, stride, CPU_3DNOW);
-}
-
-static void MC_put_y_8_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put2_8 (height, dest, ref, stride, stride, CPU_3DNOW);
-}
-
-static void MC_avg_xy_16_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg4_16 (height, dest, ref, stride, CPU_3DNOW);
-}
-
-static void MC_avg_xy_8_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_avg4_8 (height, dest, ref, stride, CPU_3DNOW);
-}
-
-static void MC_put_xy_16_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put4_16 (height, dest, ref, stride, CPU_3DNOW);
-}
-
-static void MC_put_xy_8_3dnow (uint8_t * dest, const uint8_t * ref,
- int stride, int height)
-{
- MC_put4_8 (height, dest, ref, stride, CPU_3DNOW);
-}
-
-
-MPEG2_MC_EXTERN (3dnow)
-
-#endif /* HAVE_AMD3DNOW */
-
-#endif
diff --git a/libmpeg2/motion_comp_vis.c b/libmpeg2/motion_comp_vis.c
deleted file mode 100644
index f6f3a315ee..0000000000
--- a/libmpeg2/motion_comp_vis.c
+++ /dev/null
@@ -1,2061 +0,0 @@
-/*
- * motion_comp_vis.c
- * Copyright (C) 2003 David S. Miller <davem@redhat.com>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#if ARCH_SPARC
-
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-#include "vis.h"
-
-/* The trick used in some of this file is the formula from the MMX
- * motion comp code, which is:
- *
- * (x+y+1)>>1 == (x|y)-((x^y)>>1)
- *
- * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
- * We avoid overflows by masking before we do the shift, and we
- * implement the shift by multiplying by 1/2 using mul8x16. So in
- * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
- * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
- * the value 0x80808080 is in f8):
- *
- * fxor f0, f2, f10
- * fand f10, f4, f10
- * fmul8x16 f8, f10, f10
- * fand f10, f6, f10
- * for f0, f2, f12
- * fpsub16 f12, f10, f10
- */
-
-#define DUP4(x) {x, x, x, x}
-#define DUP8(x) {x, x, x, x, x, x, x, x}
-static const int16_t constants1[] ATTR_ALIGN(8) = DUP4 (1);
-static const int16_t constants2[] ATTR_ALIGN(8) = DUP4 (2);
-static const int16_t constants3[] ATTR_ALIGN(8) = DUP4 (3);
-static const int16_t constants6[] ATTR_ALIGN(8) = DUP4 (6);
-static const int8_t constants_fe[] ATTR_ALIGN(8) = DUP8 (0xfe);
-static const int8_t constants_7f[] ATTR_ALIGN(8) = DUP8 (0x7f);
-static const int8_t constants128[] ATTR_ALIGN(8) = DUP8 (128);
-static const int16_t constants256_512[] ATTR_ALIGN(8) =
- {256, 512, 256, 512};
-static const int16_t constants256_1024[] ATTR_ALIGN(8) =
- {256, 1024, 256, 1024};
-
-#define REF_0 0
-#define REF_0_1 1
-#define REF_2 2
-#define REF_2_1 3
-#define REF_4 4
-#define REF_4_1 5
-#define REF_6 6
-#define REF_6_1 7
-#define REF_S0 8
-#define REF_S0_1 9
-#define REF_S2 10
-#define REF_S2_1 11
-#define REF_S4 12
-#define REF_S4_1 13
-#define REF_S6 14
-#define REF_S6_1 15
-#define DST_0 16
-#define DST_1 17
-#define DST_2 18
-#define DST_3 19
-#define CONST_1 20
-#define CONST_2 20
-#define CONST_3 20
-#define CONST_6 20
-#define MASK_fe 20
-#define CONST_128 22
-#define CONST_256 22
-#define CONST_512 22
-#define CONST_1024 22
-#define TMP0 24
-#define TMP1 25
-#define TMP2 26
-#define TMP3 27
-#define TMP4 28
-#define TMP5 29
-#define ZERO 30
-#define MASK_7f 30
-
-#define TMP6 32
-#define TMP8 34
-#define TMP10 36
-#define TMP12 38
-#define TMP14 40
-#define TMP16 42
-#define TMP18 44
-#define TMP20 46
-#define TMP22 48
-#define TMP24 50
-#define TMP26 52
-#define TMP28 54
-#define TMP30 56
-#define TMP32 58
-
-static void MC_put_o_16_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- int offset;
-
- ref = vis_alignaddr(ref);
- offset = (ref != _ref) ? 16 : 0;
- do { /* 5 cycles */
- vis_ld64(ref[0], TMP0);
-
- vis_ld64_2(ref, 8, TMP2);
-
- vis_ld64_2(ref, offset, TMP4);
- ref += stride;
-
- vis_faligndata(TMP0, TMP2, REF_0);
- vis_st64(REF_0, dest[0]);
-
- vis_faligndata(TMP2, TMP4, REF_2);
- vis_st64_2(REF_2, dest, 8);
- dest += stride;
- } while (--height);
-}
-
-static void MC_put_o_8_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- int offset;
-
- ref = vis_alignaddr(ref);
- offset = (ref != _ref) ? 8 : 0;
- do { /* 4 cycles */
- vis_ld64(ref[0], TMP0);
-
- vis_ld64_2(ref, offset, TMP2);
- ref += stride;
-
- /* stall */
-
- vis_faligndata(TMP0, TMP2, REF_0);
- vis_st64(REF_0, dest[0]);
- dest += stride;
- } while (--height);
-}
-
-
-static void MC_avg_o_16_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- int stride_8 = stride + 8;
- int offset;
-
- ref = vis_alignaddr(ref);
- offset = (ref != _ref) ? 16 : 0;
-
- vis_ld64(ref[0], TMP0);
-
- vis_ld64(ref[8], TMP2);
-
- vis_ld64_2(ref, offset, TMP4);
-
- vis_ld64(dest[0], DST_0);
-
- vis_ld64(dest[8], DST_2);
-
- vis_ld64(constants_fe[0], MASK_fe);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64(constants_7f[0], MASK_7f);
- vis_faligndata(TMP2, TMP4, REF_2);
-
- vis_ld64(constants128[0], CONST_128);
-
- ref += stride;
- height = (height >> 1) - 1;
-
- do { /* 24 cycles */
- vis_ld64(ref[0], TMP0);
- vis_xor(DST_0, REF_0, TMP6);
-
- vis_ld64_2(ref, 8, TMP2);
- vis_and(TMP6, MASK_fe, TMP6);
-
- vis_ld64_2(ref, offset, TMP4);
- ref += stride;
- vis_mul8x16(CONST_128, TMP6, TMP6);
- vis_xor(DST_2, REF_2, TMP8);
-
- vis_and(TMP8, MASK_fe, TMP8);
-
- vis_or(DST_0, REF_0, TMP10);
- vis_ld64_2(dest, stride, DST_0);
- vis_mul8x16(CONST_128, TMP8, TMP8);
-
- vis_or(DST_2, REF_2, TMP12);
- vis_ld64_2(dest, stride_8, DST_2);
-
- vis_ld64(ref[0], TMP14);
- vis_and(TMP6, MASK_7f, TMP6);
-
- vis_and(TMP8, MASK_7f, TMP8);
-
- vis_psub16(TMP10, TMP6, TMP6);
- vis_st64(TMP6, dest[0]);
-
- vis_psub16(TMP12, TMP8, TMP8);
- vis_st64_2(TMP8, dest, 8);
-
- dest += stride;
- vis_ld64_2(ref, 8, TMP16);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(ref, offset, TMP18);
- vis_faligndata(TMP2, TMP4, REF_2);
- ref += stride;
-
- vis_xor(DST_0, REF_0, TMP20);
-
- vis_and(TMP20, MASK_fe, TMP20);
-
- vis_xor(DST_2, REF_2, TMP22);
- vis_mul8x16(CONST_128, TMP20, TMP20);
-
- vis_and(TMP22, MASK_fe, TMP22);
-
- vis_or(DST_0, REF_0, TMP24);
- vis_mul8x16(CONST_128, TMP22, TMP22);
-
- vis_or(DST_2, REF_2, TMP26);
-
- vis_ld64_2(dest, stride, DST_0);
- vis_faligndata(TMP14, TMP16, REF_0);
-
- vis_ld64_2(dest, stride_8, DST_2);
- vis_faligndata(TMP16, TMP18, REF_2);
-
- vis_and(TMP20, MASK_7f, TMP20);
-
- vis_and(TMP22, MASK_7f, TMP22);
-
- vis_psub16(TMP24, TMP20, TMP20);
- vis_st64(TMP20, dest[0]);
-
- vis_psub16(TMP26, TMP22, TMP22);
- vis_st64_2(TMP22, dest, 8);
- dest += stride;
- } while (--height);
-
- vis_ld64(ref[0], TMP0);
- vis_xor(DST_0, REF_0, TMP6);
-
- vis_ld64_2(ref, 8, TMP2);
- vis_and(TMP6, MASK_fe, TMP6);
-
- vis_ld64_2(ref, offset, TMP4);
- vis_mul8x16(CONST_128, TMP6, TMP6);
- vis_xor(DST_2, REF_2, TMP8);
-
- vis_and(TMP8, MASK_fe, TMP8);
-
- vis_or(DST_0, REF_0, TMP10);
- vis_ld64_2(dest, stride, DST_0);
- vis_mul8x16(CONST_128, TMP8, TMP8);
-
- vis_or(DST_2, REF_2, TMP12);
- vis_ld64_2(dest, stride_8, DST_2);
-
- vis_ld64(ref[0], TMP14);
- vis_and(TMP6, MASK_7f, TMP6);
-
- vis_and(TMP8, MASK_7f, TMP8);
-
- vis_psub16(TMP10, TMP6, TMP6);
- vis_st64(TMP6, dest[0]);
-
- vis_psub16(TMP12, TMP8, TMP8);
- vis_st64_2(TMP8, dest, 8);
-
- dest += stride;
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_faligndata(TMP2, TMP4, REF_2);
-
- vis_xor(DST_0, REF_0, TMP20);
-
- vis_and(TMP20, MASK_fe, TMP20);
-
- vis_xor(DST_2, REF_2, TMP22);
- vis_mul8x16(CONST_128, TMP20, TMP20);
-
- vis_and(TMP22, MASK_fe, TMP22);
-
- vis_or(DST_0, REF_0, TMP24);
- vis_mul8x16(CONST_128, TMP22, TMP22);
-
- vis_or(DST_2, REF_2, TMP26);
-
- vis_and(TMP20, MASK_7f, TMP20);
-
- vis_and(TMP22, MASK_7f, TMP22);
-
- vis_psub16(TMP24, TMP20, TMP20);
- vis_st64(TMP20, dest[0]);
-
- vis_psub16(TMP26, TMP22, TMP22);
- vis_st64_2(TMP22, dest, 8);
-}
-
-static void MC_avg_o_8_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- int offset;
-
- ref = vis_alignaddr(ref);
- offset = (ref != _ref) ? 8 : 0;
-
- vis_ld64(ref[0], TMP0);
-
- vis_ld64_2(ref, offset, TMP2);
-
- vis_ld64(dest[0], DST_0);
-
- vis_ld64(constants_fe[0], MASK_fe);
-
- vis_ld64(constants_7f[0], MASK_7f);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64(constants128[0], CONST_128);
-
- ref += stride;
- height = (height >> 1) - 1;
-
- do { /* 12 cycles */
- vis_ld64(ref[0], TMP0);
- vis_xor(DST_0, REF_0, TMP4);
-
- vis_ld64_2(ref, offset, TMP2);
- vis_and(TMP4, MASK_fe, TMP4);
-
- vis_or(DST_0, REF_0, TMP6);
- vis_ld64_2(dest, stride, DST_0);
- ref += stride;
- vis_mul8x16(CONST_128, TMP4, TMP4);
-
- vis_ld64(ref[0], TMP12);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(ref, offset, TMP2);
- vis_xor(DST_0, REF_0, TMP0);
- ref += stride;
-
- vis_and(TMP0, MASK_fe, TMP0);
-
- vis_and(TMP4, MASK_7f, TMP4);
-
- vis_psub16(TMP6, TMP4, TMP4);
- vis_st64(TMP4, dest[0]);
- dest += stride;
- vis_mul8x16(CONST_128, TMP0, TMP0);
-
- vis_or(DST_0, REF_0, TMP6);
- vis_ld64_2(dest, stride, DST_0);
-
- vis_faligndata(TMP12, TMP2, REF_0);
-
- vis_and(TMP0, MASK_7f, TMP0);
-
- vis_psub16(TMP6, TMP0, TMP4);
- vis_st64(TMP4, dest[0]);
- dest += stride;
- } while (--height);
-
- vis_ld64(ref[0], TMP0);
- vis_xor(DST_0, REF_0, TMP4);
-
- vis_ld64_2(ref, offset, TMP2);
- vis_and(TMP4, MASK_fe, TMP4);
-
- vis_or(DST_0, REF_0, TMP6);
- vis_ld64_2(dest, stride, DST_0);
- vis_mul8x16(CONST_128, TMP4, TMP4);
-
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_xor(DST_0, REF_0, TMP0);
-
- vis_and(TMP0, MASK_fe, TMP0);
-
- vis_and(TMP4, MASK_7f, TMP4);
-
- vis_psub16(TMP6, TMP4, TMP4);
- vis_st64(TMP4, dest[0]);
- dest += stride;
- vis_mul8x16(CONST_128, TMP0, TMP0);
-
- vis_or(DST_0, REF_0, TMP6);
-
- vis_and(TMP0, MASK_7f, TMP0);
-
- vis_psub16(TMP6, TMP0, TMP4);
- vis_st64(TMP4, dest[0]);
-}
-
-static void MC_put_x_16_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- unsigned long off = (unsigned long) ref & 0x7;
- unsigned long off_plus_1 = off + 1;
-
- ref = vis_alignaddr(ref);
-
- vis_ld64(ref[0], TMP0);
-
- vis_ld64_2(ref, 8, TMP2);
-
- vis_ld64_2(ref, 16, TMP4);
-
- vis_ld64(constants_fe[0], MASK_fe);
-
- vis_ld64(constants_7f[0], MASK_7f);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64(constants128[0], CONST_128);
- vis_faligndata(TMP2, TMP4, REF_4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- vis_faligndata(TMP2, TMP4, REF_6);
- } else {
- vis_src1(TMP2, REF_2);
- vis_src1(TMP4, REF_6);
- }
-
- ref += stride;
- height = (height >> 1) - 1;
-
- do { /* 34 cycles */
- vis_ld64(ref[0], TMP0);
- vis_xor(REF_0, REF_2, TMP6);
-
- vis_ld64_2(ref, 8, TMP2);
- vis_xor(REF_4, REF_6, TMP8);
-
- vis_ld64_2(ref, 16, TMP4);
- vis_and(TMP6, MASK_fe, TMP6);
- ref += stride;
-
- vis_ld64(ref[0], TMP14);
- vis_mul8x16(CONST_128, TMP6, TMP6);
- vis_and(TMP8, MASK_fe, TMP8);
-
- vis_ld64_2(ref, 8, TMP16);
- vis_mul8x16(CONST_128, TMP8, TMP8);
- vis_or(REF_0, REF_2, TMP10);
-
- vis_ld64_2(ref, 16, TMP18);
- ref += stride;
- vis_or(REF_4, REF_6, TMP12);
-
- vis_alignaddr_g0((void *)off);
-
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_faligndata(TMP2, TMP4, REF_4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- vis_faligndata(TMP2, TMP4, REF_6);
- } else {
- vis_src1(TMP2, REF_2);
- vis_src1(TMP4, REF_6);
- }
-
- vis_and(TMP6, MASK_7f, TMP6);
-
- vis_and(TMP8, MASK_7f, TMP8);
-
- vis_psub16(TMP10, TMP6, TMP6);
- vis_st64(TMP6, dest[0]);
-
- vis_psub16(TMP12, TMP8, TMP8);
- vis_st64_2(TMP8, dest, 8);
- dest += stride;
-
- vis_xor(REF_0, REF_2, TMP6);
-
- vis_xor(REF_4, REF_6, TMP8);
-
- vis_and(TMP6, MASK_fe, TMP6);
-
- vis_mul8x16(CONST_128, TMP6, TMP6);
- vis_and(TMP8, MASK_fe, TMP8);
-
- vis_mul8x16(CONST_128, TMP8, TMP8);
- vis_or(REF_0, REF_2, TMP10);
-
- vis_or(REF_4, REF_6, TMP12);
-
- vis_alignaddr_g0((void *)off);
-
- vis_faligndata(TMP14, TMP16, REF_0);
-
- vis_faligndata(TMP16, TMP18, REF_4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP14, TMP16, REF_2);
- vis_faligndata(TMP16, TMP18, REF_6);
- } else {
- vis_src1(TMP16, REF_2);
- vis_src1(TMP18, REF_6);
- }
-
- vis_and(TMP6, MASK_7f, TMP6);
-
- vis_and(TMP8, MASK_7f, TMP8);
-
- vis_psub16(TMP10, TMP6, TMP6);
- vis_st64(TMP6, dest[0]);
-
- vis_psub16(TMP12, TMP8, TMP8);
- vis_st64_2(TMP8, dest, 8);
- dest += stride;
- } while (--height);
-
- vis_ld64(ref[0], TMP0);
- vis_xor(REF_0, REF_2, TMP6);
-
- vis_ld64_2(ref, 8, TMP2);
- vis_xor(REF_4, REF_6, TMP8);
-
- vis_ld64_2(ref, 16, TMP4);
- vis_and(TMP6, MASK_fe, TMP6);
-
- vis_mul8x16(CONST_128, TMP6, TMP6);
- vis_and(TMP8, MASK_fe, TMP8);
-
- vis_mul8x16(CONST_128, TMP8, TMP8);
- vis_or(REF_0, REF_2, TMP10);
-
- vis_or(REF_4, REF_6, TMP12);
-
- vis_alignaddr_g0((void *)off);
-
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_faligndata(TMP2, TMP4, REF_4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- vis_faligndata(TMP2, TMP4, REF_6);
- } else {
- vis_src1(TMP2, REF_2);
- vis_src1(TMP4, REF_6);
- }
-
- vis_and(TMP6, MASK_7f, TMP6);
-
- vis_and(TMP8, MASK_7f, TMP8);
-
- vis_psub16(TMP10, TMP6, TMP6);
- vis_st64(TMP6, dest[0]);
-
- vis_psub16(TMP12, TMP8, TMP8);
- vis_st64_2(TMP8, dest, 8);
- dest += stride;
-
- vis_xor(REF_0, REF_2, TMP6);
-
- vis_xor(REF_4, REF_6, TMP8);
-
- vis_and(TMP6, MASK_fe, TMP6);
-
- vis_mul8x16(CONST_128, TMP6, TMP6);
- vis_and(TMP8, MASK_fe, TMP8);
-
- vis_mul8x16(CONST_128, TMP8, TMP8);
- vis_or(REF_0, REF_2, TMP10);
-
- vis_or(REF_4, REF_6, TMP12);
-
- vis_and(TMP6, MASK_7f, TMP6);
-
- vis_and(TMP8, MASK_7f, TMP8);
-
- vis_psub16(TMP10, TMP6, TMP6);
- vis_st64(TMP6, dest[0]);
-
- vis_psub16(TMP12, TMP8, TMP8);
- vis_st64_2(TMP8, dest, 8);
-}
-
-static void MC_put_x_8_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- unsigned long off = (unsigned long) ref & 0x7;
- unsigned long off_plus_1 = off + 1;
-
- ref = vis_alignaddr(ref);
-
- vis_ld64(ref[0], TMP0);
-
- vis_ld64(ref[8], TMP2);
-
- vis_ld64(constants_fe[0], MASK_fe);
-
- vis_ld64(constants_7f[0], MASK_7f);
-
- vis_ld64(constants128[0], CONST_128);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- } else {
- vis_src1(TMP2, REF_2);
- }
-
- ref += stride;
- height = (height >> 1) - 1;
-
- do { /* 20 cycles */
- vis_ld64(ref[0], TMP0);
- vis_xor(REF_0, REF_2, TMP4);
-
- vis_ld64_2(ref, 8, TMP2);
- vis_and(TMP4, MASK_fe, TMP4);
- ref += stride;
-
- vis_ld64(ref[0], TMP8);
- vis_or(REF_0, REF_2, TMP6);
- vis_mul8x16(CONST_128, TMP4, TMP4);
-
- vis_alignaddr_g0((void *)off);
-
- vis_ld64_2(ref, 8, TMP10);
- ref += stride;
- vis_faligndata(TMP0, TMP2, REF_0);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- } else {
- vis_src1(TMP2, REF_2);
- }
-
- vis_and(TMP4, MASK_7f, TMP4);
-
- vis_psub16(TMP6, TMP4, DST_0);
- vis_st64(DST_0, dest[0]);
- dest += stride;
-
- vis_xor(REF_0, REF_2, TMP12);
-
- vis_and(TMP12, MASK_fe, TMP12);
-
- vis_or(REF_0, REF_2, TMP14);
- vis_mul8x16(CONST_128, TMP12, TMP12);
-
- vis_alignaddr_g0((void *)off);
- vis_faligndata(TMP8, TMP10, REF_0);
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP8, TMP10, REF_2);
- } else {
- vis_src1(TMP10, REF_2);
- }
-
- vis_and(TMP12, MASK_7f, TMP12);
-
- vis_psub16(TMP14, TMP12, DST_0);
- vis_st64(DST_0, dest[0]);
- dest += stride;
- } while (--height);
-
- vis_ld64(ref[0], TMP0);
- vis_xor(REF_0, REF_2, TMP4);
-
- vis_ld64_2(ref, 8, TMP2);
- vis_and(TMP4, MASK_fe, TMP4);
-
- vis_or(REF_0, REF_2, TMP6);
- vis_mul8x16(CONST_128, TMP4, TMP4);
-
- vis_alignaddr_g0((void *)off);
-
- vis_faligndata(TMP0, TMP2, REF_0);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- } else {
- vis_src1(TMP2, REF_2);
- }
-
- vis_and(TMP4, MASK_7f, TMP4);
-
- vis_psub16(TMP6, TMP4, DST_0);
- vis_st64(DST_0, dest[0]);
- dest += stride;
-
- vis_xor(REF_0, REF_2, TMP12);
-
- vis_and(TMP12, MASK_fe, TMP12);
-
- vis_or(REF_0, REF_2, TMP14);
- vis_mul8x16(CONST_128, TMP12, TMP12);
-
- vis_and(TMP12, MASK_7f, TMP12);
-
- vis_psub16(TMP14, TMP12, DST_0);
- vis_st64(DST_0, dest[0]);
- dest += stride;
-}
-
-static void MC_avg_x_16_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- unsigned long off = (unsigned long) ref & 0x7;
- unsigned long off_plus_1 = off + 1;
-
- vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
-
- vis_ld64(constants3[0], CONST_3);
- vis_fzero(ZERO);
- vis_ld64(constants256_512[0], CONST_256);
-
- ref = vis_alignaddr(ref);
- do { /* 26 cycles */
- vis_ld64(ref[0], TMP0);
-
- vis_ld64(ref[8], TMP2);
-
- vis_alignaddr_g0((void *)off);
-
- vis_ld64(ref[16], TMP4);
-
- vis_ld64(dest[0], DST_0);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64(dest[8], DST_2);
- vis_faligndata(TMP2, TMP4, REF_4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- vis_faligndata(TMP2, TMP4, REF_6);
- } else {
- vis_src1(TMP2, REF_2);
- vis_src1(TMP4, REF_6);
- }
-
- vis_mul8x16au(REF_0, CONST_256, TMP0);
-
- vis_pmerge(ZERO, REF_2, TMP4);
- vis_mul8x16au(REF_0_1, CONST_256, TMP2);
-
- vis_pmerge(ZERO, REF_2_1, TMP6);
-
- vis_padd16(TMP0, TMP4, TMP0);
-
- vis_mul8x16al(DST_0, CONST_512, TMP4);
- vis_padd16(TMP2, TMP6, TMP2);
-
- vis_mul8x16al(DST_1, CONST_512, TMP6);
-
- vis_mul8x16au(REF_6, CONST_256, TMP12);
-
- vis_padd16(TMP0, TMP4, TMP0);
- vis_mul8x16au(REF_6_1, CONST_256, TMP14);
-
- vis_padd16(TMP2, TMP6, TMP2);
- vis_mul8x16au(REF_4, CONST_256, TMP16);
-
- vis_padd16(TMP0, CONST_3, TMP8);
- vis_mul8x16au(REF_4_1, CONST_256, TMP18);
-
- vis_padd16(TMP2, CONST_3, TMP10);
- vis_pack16(TMP8, DST_0);
-
- vis_pack16(TMP10, DST_1);
- vis_padd16(TMP16, TMP12, TMP0);
-
- vis_st64(DST_0, dest[0]);
- vis_mul8x16al(DST_2, CONST_512, TMP4);
- vis_padd16(TMP18, TMP14, TMP2);
-
- vis_mul8x16al(DST_3, CONST_512, TMP6);
- vis_padd16(TMP0, CONST_3, TMP0);
-
- vis_padd16(TMP2, CONST_3, TMP2);
-
- vis_padd16(TMP0, TMP4, TMP0);
-
- vis_padd16(TMP2, TMP6, TMP2);
- vis_pack16(TMP0, DST_2);
-
- vis_pack16(TMP2, DST_3);
- vis_st64(DST_2, dest[8]);
-
- ref += stride;
- dest += stride;
- } while (--height);
-}
-
-static void MC_avg_x_8_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- unsigned long off = (unsigned long) ref & 0x7;
- unsigned long off_plus_1 = off + 1;
- int stride_times_2 = stride << 1;
-
- vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
-
- vis_ld64(constants3[0], CONST_3);
- vis_fzero(ZERO);
- vis_ld64(constants256_512[0], CONST_256);
-
- ref = vis_alignaddr(ref);
- height >>= 2;
- do { /* 47 cycles */
- vis_ld64(ref[0], TMP0);
-
- vis_ld64_2(ref, 8, TMP2);
- ref += stride;
-
- vis_alignaddr_g0((void *)off);
-
- vis_ld64(ref[0], TMP4);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(ref, 8, TMP6);
- ref += stride;
-
- vis_ld64(ref[0], TMP8);
-
- vis_ld64_2(ref, 8, TMP10);
- ref += stride;
- vis_faligndata(TMP4, TMP6, REF_4);
-
- vis_ld64(ref[0], TMP12);
-
- vis_ld64_2(ref, 8, TMP14);
- ref += stride;
- vis_faligndata(TMP8, TMP10, REF_S0);
-
- vis_faligndata(TMP12, TMP14, REF_S4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
-
- vis_ld64(dest[0], DST_0);
- vis_faligndata(TMP0, TMP2, REF_2);
-
- vis_ld64_2(dest, stride, DST_2);
- vis_faligndata(TMP4, TMP6, REF_6);
-
- vis_faligndata(TMP8, TMP10, REF_S2);
-
- vis_faligndata(TMP12, TMP14, REF_S6);
- } else {
- vis_ld64(dest[0], DST_0);
- vis_src1(TMP2, REF_2);
-
- vis_ld64_2(dest, stride, DST_2);
- vis_src1(TMP6, REF_6);
-
- vis_src1(TMP10, REF_S2);
-
- vis_src1(TMP14, REF_S6);
- }
-
- vis_pmerge(ZERO, REF_0, TMP0);
- vis_mul8x16au(REF_0_1, CONST_256, TMP2);
-
- vis_pmerge(ZERO, REF_2, TMP4);
- vis_mul8x16au(REF_2_1, CONST_256, TMP6);
-
- vis_padd16(TMP0, CONST_3, TMP0);
- vis_mul8x16al(DST_0, CONST_512, TMP16);
-
- vis_padd16(TMP2, CONST_3, TMP2);
- vis_mul8x16al(DST_1, CONST_512, TMP18);
-
- vis_padd16(TMP0, TMP4, TMP0);
- vis_mul8x16au(REF_4, CONST_256, TMP8);
-
- vis_padd16(TMP2, TMP6, TMP2);
- vis_mul8x16au(REF_4_1, CONST_256, TMP10);
-
- vis_padd16(TMP0, TMP16, TMP0);
- vis_mul8x16au(REF_6, CONST_256, TMP12);
-
- vis_padd16(TMP2, TMP18, TMP2);
- vis_mul8x16au(REF_6_1, CONST_256, TMP14);
-
- vis_padd16(TMP8, CONST_3, TMP8);
- vis_mul8x16al(DST_2, CONST_512, TMP16);
-
- vis_padd16(TMP8, TMP12, TMP8);
- vis_mul8x16al(DST_3, CONST_512, TMP18);
-
- vis_padd16(TMP10, TMP14, TMP10);
- vis_pack16(TMP0, DST_0);
-
- vis_pack16(TMP2, DST_1);
- vis_st64(DST_0, dest[0]);
- dest += stride;
- vis_padd16(TMP10, CONST_3, TMP10);
-
- vis_ld64_2(dest, stride, DST_0);
- vis_padd16(TMP8, TMP16, TMP8);
-
- vis_ld64_2(dest, stride_times_2, TMP4/*DST_2*/);
- vis_padd16(TMP10, TMP18, TMP10);
- vis_pack16(TMP8, DST_2);
-
- vis_pack16(TMP10, DST_3);
- vis_st64(DST_2, dest[0]);
- dest += stride;
-
- vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
- vis_pmerge(ZERO, REF_S0, TMP0);
-
- vis_pmerge(ZERO, REF_S2, TMP24);
- vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
-
- vis_padd16(TMP0, CONST_3, TMP0);
- vis_mul8x16au(REF_S4, CONST_256, TMP8);
-
- vis_padd16(TMP2, CONST_3, TMP2);
- vis_mul8x16au(REF_S4_1, CONST_256, TMP10);
-
- vis_padd16(TMP0, TMP24, TMP0);
- vis_mul8x16au(REF_S6, CONST_256, TMP12);
-
- vis_padd16(TMP2, TMP6, TMP2);
- vis_mul8x16au(REF_S6_1, CONST_256, TMP14);
-
- vis_padd16(TMP8, CONST_3, TMP8);
- vis_mul8x16al(DST_0, CONST_512, TMP16);
-
- vis_padd16(TMP10, CONST_3, TMP10);
- vis_mul8x16al(DST_1, CONST_512, TMP18);
-
- vis_padd16(TMP8, TMP12, TMP8);
- vis_mul8x16al(TMP4/*DST_2*/, CONST_512, TMP20);
-
- vis_mul8x16al(TMP5/*DST_3*/, CONST_512, TMP22);
- vis_padd16(TMP0, TMP16, TMP0);
-
- vis_padd16(TMP2, TMP18, TMP2);
- vis_pack16(TMP0, DST_0);
-
- vis_padd16(TMP10, TMP14, TMP10);
- vis_pack16(TMP2, DST_1);
- vis_st64(DST_0, dest[0]);
- dest += stride;
-
- vis_padd16(TMP8, TMP20, TMP8);
-
- vis_padd16(TMP10, TMP22, TMP10);
- vis_pack16(TMP8, DST_2);
-
- vis_pack16(TMP10, DST_3);
- vis_st64(DST_2, dest[0]);
- dest += stride;
- } while (--height);
-}
-
-static void MC_put_y_16_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- int offset;
-
- ref = vis_alignaddr(ref);
- offset = (ref != _ref) ? 16 : 0;
-
- vis_ld64(ref[0], TMP0);
-
- vis_ld64_2(ref, 8, TMP2);
-
- vis_ld64_2(ref, offset, TMP4);
- ref += stride;
-
- vis_ld64(ref[0], TMP6);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(ref, 8, TMP8);
- vis_faligndata(TMP2, TMP4, REF_4);
-
- vis_ld64_2(ref, offset, TMP10);
- ref += stride;
-
- vis_ld64(constants_fe[0], MASK_fe);
- vis_faligndata(TMP6, TMP8, REF_2);
-
- vis_ld64(constants_7f[0], MASK_7f);
- vis_faligndata(TMP8, TMP10, REF_6);
-
- vis_ld64(constants128[0], CONST_128);
- height = (height >> 1) - 1;
- do { /* 24 cycles */
- vis_ld64(ref[0], TMP0);
- vis_xor(REF_0, REF_2, TMP12);
-
- vis_ld64_2(ref, 8, TMP2);
- vis_xor(REF_4, REF_6, TMP16);
-
- vis_ld64_2(ref, offset, TMP4);
- ref += stride;
- vis_or(REF_0, REF_2, TMP14);
-
- vis_ld64(ref[0], TMP6);
- vis_or(REF_4, REF_6, TMP18);
-
- vis_ld64_2(ref, 8, TMP8);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(ref, offset, TMP10);
- ref += stride;
- vis_faligndata(TMP2, TMP4, REF_4);
-
- vis_and(TMP12, MASK_fe, TMP12);
-
- vis_and(TMP16, MASK_fe, TMP16);
- vis_mul8x16(CONST_128, TMP12, TMP12);
-
- vis_mul8x16(CONST_128, TMP16, TMP16);
- vis_xor(REF_0, REF_2, TMP0);
-
- vis_xor(REF_4, REF_6, TMP2);
-
- vis_or(REF_0, REF_2, TMP20);
-
- vis_and(TMP12, MASK_7f, TMP12);
-
- vis_and(TMP16, MASK_7f, TMP16);
-
- vis_psub16(TMP14, TMP12, TMP12);
- vis_st64(TMP12, dest[0]);
-
- vis_psub16(TMP18, TMP16, TMP16);
- vis_st64_2(TMP16, dest, 8);
- dest += stride;
-
- vis_or(REF_4, REF_6, TMP18);
-
- vis_and(TMP0, MASK_fe, TMP0);
-
- vis_and(TMP2, MASK_fe, TMP2);
- vis_mul8x16(CONST_128, TMP0, TMP0);
-
- vis_faligndata(TMP6, TMP8, REF_2);
- vis_mul8x16(CONST_128, TMP2, TMP2);
-
- vis_faligndata(TMP8, TMP10, REF_6);
-
- vis_and(TMP0, MASK_7f, TMP0);
-
- vis_and(TMP2, MASK_7f, TMP2);
-
- vis_psub16(TMP20, TMP0, TMP0);
- vis_st64(TMP0, dest[0]);
-
- vis_psub16(TMP18, TMP2, TMP2);
- vis_st64_2(TMP2, dest, 8);
- dest += stride;
- } while (--height);
-
- vis_ld64(ref[0], TMP0);
- vis_xor(REF_0, REF_2, TMP12);
-
- vis_ld64_2(ref, 8, TMP2);
- vis_xor(REF_4, REF_6, TMP16);
-
- vis_ld64_2(ref, offset, TMP4);
- vis_or(REF_0, REF_2, TMP14);
-
- vis_or(REF_4, REF_6, TMP18);
-
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_faligndata(TMP2, TMP4, REF_4);
-
- vis_and(TMP12, MASK_fe, TMP12);
-
- vis_and(TMP16, MASK_fe, TMP16);
- vis_mul8x16(CONST_128, TMP12, TMP12);
-
- vis_mul8x16(CONST_128, TMP16, TMP16);
- vis_xor(REF_0, REF_2, TMP0);
-
- vis_xor(REF_4, REF_6, TMP2);
-
- vis_or(REF_0, REF_2, TMP20);
-
- vis_and(TMP12, MASK_7f, TMP12);
-
- vis_and(TMP16, MASK_7f, TMP16);
-
- vis_psub16(TMP14, TMP12, TMP12);
- vis_st64(TMP12, dest[0]);
-
- vis_psub16(TMP18, TMP16, TMP16);
- vis_st64_2(TMP16, dest, 8);
- dest += stride;
-
- vis_or(REF_4, REF_6, TMP18);
-
- vis_and(TMP0, MASK_fe, TMP0);
-
- vis_and(TMP2, MASK_fe, TMP2);
- vis_mul8x16(CONST_128, TMP0, TMP0);
-
- vis_mul8x16(CONST_128, TMP2, TMP2);
-
- vis_and(TMP0, MASK_7f, TMP0);
-
- vis_and(TMP2, MASK_7f, TMP2);
-
- vis_psub16(TMP20, TMP0, TMP0);
- vis_st64(TMP0, dest[0]);
-
- vis_psub16(TMP18, TMP2, TMP2);
- vis_st64_2(TMP2, dest, 8);
-}
-
-static void MC_put_y_8_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- int offset;
-
- ref = vis_alignaddr(ref);
- offset = (ref != _ref) ? 8 : 0;
-
- vis_ld64(ref[0], TMP0);
-
- vis_ld64_2(ref, offset, TMP2);
- ref += stride;
-
- vis_ld64(ref[0], TMP4);
-
- vis_ld64_2(ref, offset, TMP6);
- ref += stride;
-
- vis_ld64(constants_fe[0], MASK_fe);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64(constants_7f[0], MASK_7f);
- vis_faligndata(TMP4, TMP6, REF_2);
-
- vis_ld64(constants128[0], CONST_128);
- height = (height >> 1) - 1;
- do { /* 12 cycles */
- vis_ld64(ref[0], TMP0);
- vis_xor(REF_0, REF_2, TMP4);
-
- vis_ld64_2(ref, offset, TMP2);
- ref += stride;
- vis_and(TMP4, MASK_fe, TMP4);
-
- vis_or(REF_0, REF_2, TMP6);
- vis_mul8x16(CONST_128, TMP4, TMP4);
-
- vis_faligndata(TMP0, TMP2, REF_0);
- vis_ld64(ref[0], TMP0);
-
- vis_ld64_2(ref, offset, TMP2);
- ref += stride;
- vis_xor(REF_0, REF_2, TMP12);
-
- vis_and(TMP4, MASK_7f, TMP4);
-
- vis_and(TMP12, MASK_fe, TMP12);
-
- vis_mul8x16(CONST_128, TMP12, TMP12);
- vis_or(REF_0, REF_2, TMP14);
-
- vis_psub16(TMP6, TMP4, DST_0);
- vis_st64(DST_0, dest[0]);
- dest += stride;
-
- vis_faligndata(TMP0, TMP2, REF_2);
-
- vis_and(TMP12, MASK_7f, TMP12);
-
- vis_psub16(TMP14, TMP12, DST_0);
- vis_st64(DST_0, dest[0]);
- dest += stride;
- } while (--height);
-
- vis_ld64(ref[0], TMP0);
- vis_xor(REF_0, REF_2, TMP4);
-
- vis_ld64_2(ref, offset, TMP2);
- vis_and(TMP4, MASK_fe, TMP4);
-
- vis_or(REF_0, REF_2, TMP6);
- vis_mul8x16(CONST_128, TMP4, TMP4);
-
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_xor(REF_0, REF_2, TMP12);
-
- vis_and(TMP4, MASK_7f, TMP4);
-
- vis_and(TMP12, MASK_fe, TMP12);
-
- vis_mul8x16(CONST_128, TMP12, TMP12);
- vis_or(REF_0, REF_2, TMP14);
-
- vis_psub16(TMP6, TMP4, DST_0);
- vis_st64(DST_0, dest[0]);
- dest += stride;
-
- vis_and(TMP12, MASK_7f, TMP12);
-
- vis_psub16(TMP14, TMP12, DST_0);
- vis_st64(DST_0, dest[0]);
-}
-
-static void MC_avg_y_16_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- int stride_8 = stride + 8;
- int stride_16;
- int offset;
-
- vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
-
- ref = vis_alignaddr(ref);
- offset = (ref != _ref) ? 16 : 0;
-
- vis_ld64(ref[ 0], TMP0);
- vis_fzero(ZERO);
-
- vis_ld64(ref[ 8], TMP2);
-
- vis_ld64_2(ref, offset, TMP4);
- stride_16 = stride + offset;
-
- vis_ld64(constants3[0], CONST_3);
- vis_faligndata(TMP0, TMP2, REF_2);
-
- vis_ld64(constants256_512[0], CONST_256);
- vis_faligndata(TMP2, TMP4, REF_6);
- height >>= 1;
-
- do { /* 31 cycles */
- vis_ld64_2(ref, stride, TMP0);
- vis_pmerge(ZERO, REF_2, TMP12);
- vis_mul8x16au(REF_2_1, CONST_256, TMP14);
-
- vis_ld64_2(ref, stride_8, TMP2);
- vis_pmerge(ZERO, REF_6, TMP16);
- vis_mul8x16au(REF_6_1, CONST_256, TMP18);
-
- vis_ld64_2(ref, stride_16, TMP4);
- ref += stride;
-
- vis_ld64(dest[0], DST_0);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(dest, 8, DST_2);
- vis_faligndata(TMP2, TMP4, REF_4);
-
- vis_ld64_2(ref, stride, TMP6);
- vis_pmerge(ZERO, REF_0, TMP0);
- vis_mul8x16au(REF_0_1, CONST_256, TMP2);
-
- vis_ld64_2(ref, stride_8, TMP8);
- vis_pmerge(ZERO, REF_4, TMP4);
-
- vis_ld64_2(ref, stride_16, TMP10);
- ref += stride;
-
- vis_ld64_2(dest, stride, REF_S0/*DST_4*/);
- vis_faligndata(TMP6, TMP8, REF_2);
- vis_mul8x16au(REF_4_1, CONST_256, TMP6);
-
- vis_ld64_2(dest, stride_8, REF_S2/*DST_6*/);
- vis_faligndata(TMP8, TMP10, REF_6);
- vis_mul8x16al(DST_0, CONST_512, TMP20);
-
- vis_padd16(TMP0, CONST_3, TMP0);
- vis_mul8x16al(DST_1, CONST_512, TMP22);
-
- vis_padd16(TMP2, CONST_3, TMP2);
- vis_mul8x16al(DST_2, CONST_512, TMP24);
-
- vis_padd16(TMP4, CONST_3, TMP4);
- vis_mul8x16al(DST_3, CONST_512, TMP26);
-
- vis_padd16(TMP6, CONST_3, TMP6);
-
- vis_padd16(TMP12, TMP20, TMP12);
- vis_mul8x16al(REF_S0, CONST_512, TMP20);
-
- vis_padd16(TMP14, TMP22, TMP14);
- vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
-
- vis_padd16(TMP16, TMP24, TMP16);
- vis_mul8x16al(REF_S2, CONST_512, TMP24);
-
- vis_padd16(TMP18, TMP26, TMP18);
- vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
-
- vis_padd16(TMP12, TMP0, TMP12);
- vis_mul8x16au(REF_2, CONST_256, TMP28);
-
- vis_padd16(TMP14, TMP2, TMP14);
- vis_mul8x16au(REF_2_1, CONST_256, TMP30);
-
- vis_padd16(TMP16, TMP4, TMP16);
- vis_mul8x16au(REF_6, CONST_256, REF_S4);
-
- vis_padd16(TMP18, TMP6, TMP18);
- vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
-
- vis_pack16(TMP12, DST_0);
- vis_padd16(TMP28, TMP0, TMP12);
-
- vis_pack16(TMP14, DST_1);
- vis_st64(DST_0, dest[0]);
- vis_padd16(TMP30, TMP2, TMP14);
-
- vis_pack16(TMP16, DST_2);
- vis_padd16(REF_S4, TMP4, TMP16);
-
- vis_pack16(TMP18, DST_3);
- vis_st64_2(DST_2, dest, 8);
- dest += stride;
- vis_padd16(REF_S6, TMP6, TMP18);
-
- vis_padd16(TMP12, TMP20, TMP12);
-
- vis_padd16(TMP14, TMP22, TMP14);
- vis_pack16(TMP12, DST_0);
-
- vis_padd16(TMP16, TMP24, TMP16);
- vis_pack16(TMP14, DST_1);
- vis_st64(DST_0, dest[0]);
-
- vis_padd16(TMP18, TMP26, TMP18);
- vis_pack16(TMP16, DST_2);
-
- vis_pack16(TMP18, DST_3);
- vis_st64_2(DST_2, dest, 8);
- dest += stride;
- } while (--height);
-}
-
-static void MC_avg_y_8_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- int stride_8;
- int offset;
-
- vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
-
- ref = vis_alignaddr(ref);
- offset = (ref != _ref) ? 8 : 0;
-
- vis_ld64(ref[ 0], TMP0);
- vis_fzero(ZERO);
-
- vis_ld64_2(ref, offset, TMP2);
- stride_8 = stride + offset;
-
- vis_ld64(constants3[0], CONST_3);
- vis_faligndata(TMP0, TMP2, REF_2);
-
- vis_ld64(constants256_512[0], CONST_256);
-
- height >>= 1;
- do { /* 20 cycles */
- vis_ld64_2(ref, stride, TMP0);
- vis_pmerge(ZERO, REF_2, TMP8);
- vis_mul8x16au(REF_2_1, CONST_256, TMP10);
-
- vis_ld64_2(ref, stride_8, TMP2);
- ref += stride;
-
- vis_ld64(dest[0], DST_0);
-
- vis_ld64_2(dest, stride, DST_2);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(ref, stride, TMP4);
- vis_mul8x16al(DST_0, CONST_512, TMP16);
- vis_pmerge(ZERO, REF_0, TMP12);
-
- vis_ld64_2(ref, stride_8, TMP6);
- ref += stride;
- vis_mul8x16al(DST_1, CONST_512, TMP18);
- vis_pmerge(ZERO, REF_0_1, TMP14);
-
- vis_padd16(TMP12, CONST_3, TMP12);
- vis_mul8x16al(DST_2, CONST_512, TMP24);
-
- vis_padd16(TMP14, CONST_3, TMP14);
- vis_mul8x16al(DST_3, CONST_512, TMP26);
-
- vis_faligndata(TMP4, TMP6, REF_2);
-
- vis_padd16(TMP8, TMP12, TMP8);
-
- vis_padd16(TMP10, TMP14, TMP10);
- vis_mul8x16au(REF_2, CONST_256, TMP20);
-
- vis_padd16(TMP8, TMP16, TMP0);
- vis_mul8x16au(REF_2_1, CONST_256, TMP22);
-
- vis_padd16(TMP10, TMP18, TMP2);
- vis_pack16(TMP0, DST_0);
-
- vis_pack16(TMP2, DST_1);
- vis_st64(DST_0, dest[0]);
- dest += stride;
- vis_padd16(TMP12, TMP20, TMP12);
-
- vis_padd16(TMP14, TMP22, TMP14);
-
- vis_padd16(TMP12, TMP24, TMP0);
-
- vis_padd16(TMP14, TMP26, TMP2);
- vis_pack16(TMP0, DST_2);
-
- vis_pack16(TMP2, DST_3);
- vis_st64(DST_2, dest[0]);
- dest += stride;
- } while (--height);
-}
-
-static void MC_put_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- unsigned long off = (unsigned long) ref & 0x7;
- unsigned long off_plus_1 = off + 1;
- int stride_8 = stride + 8;
- int stride_16 = stride + 16;
-
- vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
-
- ref = vis_alignaddr(ref);
-
- vis_ld64(ref[ 0], TMP0);
- vis_fzero(ZERO);
-
- vis_ld64(ref[ 8], TMP2);
-
- vis_ld64(ref[16], TMP4);
-
- vis_ld64(constants2[0], CONST_2);
- vis_faligndata(TMP0, TMP2, REF_S0);
-
- vis_ld64(constants256_512[0], CONST_256);
- vis_faligndata(TMP2, TMP4, REF_S4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_S2);
- vis_faligndata(TMP2, TMP4, REF_S6);
- } else {
- vis_src1(TMP2, REF_S2);
- vis_src1(TMP4, REF_S6);
- }
-
- height >>= 1;
- do {
- vis_ld64_2(ref, stride, TMP0);
- vis_mul8x16au(REF_S0, CONST_256, TMP12);
- vis_pmerge(ZERO, REF_S0_1, TMP14);
-
- vis_alignaddr_g0((void *)off);
-
- vis_ld64_2(ref, stride_8, TMP2);
- vis_mul8x16au(REF_S2, CONST_256, TMP16);
- vis_pmerge(ZERO, REF_S2_1, TMP18);
-
- vis_ld64_2(ref, stride_16, TMP4);
- ref += stride;
- vis_mul8x16au(REF_S4, CONST_256, TMP20);
- vis_pmerge(ZERO, REF_S4_1, TMP22);
-
- vis_ld64_2(ref, stride, TMP6);
- vis_mul8x16au(REF_S6, CONST_256, TMP24);
- vis_pmerge(ZERO, REF_S6_1, TMP26);
-
- vis_ld64_2(ref, stride_8, TMP8);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(ref, stride_16, TMP10);
- ref += stride;
- vis_faligndata(TMP2, TMP4, REF_4);
-
- vis_faligndata(TMP6, TMP8, REF_S0);
-
- vis_faligndata(TMP8, TMP10, REF_S4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- vis_faligndata(TMP2, TMP4, REF_6);
- vis_faligndata(TMP6, TMP8, REF_S2);
- vis_faligndata(TMP8, TMP10, REF_S6);
- } else {
- vis_src1(TMP2, REF_2);
- vis_src1(TMP4, REF_6);
- vis_src1(TMP8, REF_S2);
- vis_src1(TMP10, REF_S6);
- }
-
- vis_mul8x16au(REF_0, CONST_256, TMP0);
- vis_pmerge(ZERO, REF_0_1, TMP2);
-
- vis_mul8x16au(REF_2, CONST_256, TMP4);
- vis_pmerge(ZERO, REF_2_1, TMP6);
-
- vis_padd16(TMP0, CONST_2, TMP8);
- vis_mul8x16au(REF_4, CONST_256, TMP0);
-
- vis_padd16(TMP2, CONST_2, TMP10);
- vis_mul8x16au(REF_4_1, CONST_256, TMP2);
-
- vis_padd16(TMP8, TMP4, TMP8);
- vis_mul8x16au(REF_6, CONST_256, TMP4);
-
- vis_padd16(TMP10, TMP6, TMP10);
- vis_mul8x16au(REF_6_1, CONST_256, TMP6);
-
- vis_padd16(TMP12, TMP8, TMP12);
-
- vis_padd16(TMP14, TMP10, TMP14);
-
- vis_padd16(TMP12, TMP16, TMP12);
-
- vis_padd16(TMP14, TMP18, TMP14);
- vis_pack16(TMP12, DST_0);
-
- vis_pack16(TMP14, DST_1);
- vis_st64(DST_0, dest[0]);
- vis_padd16(TMP0, CONST_2, TMP12);
-
- vis_mul8x16au(REF_S0, CONST_256, TMP0);
- vis_padd16(TMP2, CONST_2, TMP14);
-
- vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
- vis_padd16(TMP12, TMP4, TMP12);
-
- vis_mul8x16au(REF_S2, CONST_256, TMP4);
- vis_padd16(TMP14, TMP6, TMP14);
-
- vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
- vis_padd16(TMP20, TMP12, TMP20);
-
- vis_padd16(TMP22, TMP14, TMP22);
-
- vis_padd16(TMP20, TMP24, TMP20);
-
- vis_padd16(TMP22, TMP26, TMP22);
- vis_pack16(TMP20, DST_2);
-
- vis_pack16(TMP22, DST_3);
- vis_st64_2(DST_2, dest, 8);
- dest += stride;
- vis_padd16(TMP0, TMP4, TMP24);
-
- vis_mul8x16au(REF_S4, CONST_256, TMP0);
- vis_padd16(TMP2, TMP6, TMP26);
-
- vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
- vis_padd16(TMP24, TMP8, TMP24);
-
- vis_padd16(TMP26, TMP10, TMP26);
- vis_pack16(TMP24, DST_0);
-
- vis_pack16(TMP26, DST_1);
- vis_st64(DST_0, dest[0]);
- vis_pmerge(ZERO, REF_S6, TMP4);
-
- vis_pmerge(ZERO, REF_S6_1, TMP6);
-
- vis_padd16(TMP0, TMP4, TMP0);
-
- vis_padd16(TMP2, TMP6, TMP2);
-
- vis_padd16(TMP0, TMP12, TMP0);
-
- vis_padd16(TMP2, TMP14, TMP2);
- vis_pack16(TMP0, DST_2);
-
- vis_pack16(TMP2, DST_3);
- vis_st64_2(DST_2, dest, 8);
- dest += stride;
- } while (--height);
-}
-
-static void MC_put_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- unsigned long off = (unsigned long) ref & 0x7;
- unsigned long off_plus_1 = off + 1;
- int stride_8 = stride + 8;
-
- vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
-
- ref = vis_alignaddr(ref);
-
- vis_ld64(ref[ 0], TMP0);
- vis_fzero(ZERO);
-
- vis_ld64(ref[ 8], TMP2);
-
- vis_ld64(constants2[0], CONST_2);
-
- vis_ld64(constants256_512[0], CONST_256);
- vis_faligndata(TMP0, TMP2, REF_S0);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_S2);
- } else {
- vis_src1(TMP2, REF_S2);
- }
-
- height >>= 1;
- do { /* 26 cycles */
- vis_ld64_2(ref, stride, TMP0);
- vis_mul8x16au(REF_S0, CONST_256, TMP8);
- vis_pmerge(ZERO, REF_S2, TMP12);
-
- vis_alignaddr_g0((void *)off);
-
- vis_ld64_2(ref, stride_8, TMP2);
- ref += stride;
- vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
- vis_pmerge(ZERO, REF_S2_1, TMP14);
-
- vis_ld64_2(ref, stride, TMP4);
-
- vis_ld64_2(ref, stride_8, TMP6);
- ref += stride;
- vis_faligndata(TMP0, TMP2, REF_S4);
-
- vis_pmerge(ZERO, REF_S4, TMP18);
-
- vis_pmerge(ZERO, REF_S4_1, TMP20);
-
- vis_faligndata(TMP4, TMP6, REF_S0);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_S6);
- vis_faligndata(TMP4, TMP6, REF_S2);
- } else {
- vis_src1(TMP2, REF_S6);
- vis_src1(TMP6, REF_S2);
- }
-
- vis_padd16(TMP18, CONST_2, TMP18);
- vis_mul8x16au(REF_S6, CONST_256, TMP22);
-
- vis_padd16(TMP20, CONST_2, TMP20);
- vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
-
- vis_mul8x16au(REF_S0, CONST_256, TMP26);
- vis_pmerge(ZERO, REF_S0_1, TMP28);
-
- vis_mul8x16au(REF_S2, CONST_256, TMP30);
- vis_padd16(TMP18, TMP22, TMP18);
-
- vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
- vis_padd16(TMP20, TMP24, TMP20);
-
- vis_padd16(TMP8, TMP18, TMP8);
-
- vis_padd16(TMP10, TMP20, TMP10);
-
- vis_padd16(TMP8, TMP12, TMP8);
-
- vis_padd16(TMP10, TMP14, TMP10);
- vis_pack16(TMP8, DST_0);
-
- vis_pack16(TMP10, DST_1);
- vis_st64(DST_0, dest[0]);
- dest += stride;
- vis_padd16(TMP18, TMP26, TMP18);
-
- vis_padd16(TMP20, TMP28, TMP20);
-
- vis_padd16(TMP18, TMP30, TMP18);
-
- vis_padd16(TMP20, TMP32, TMP20);
- vis_pack16(TMP18, DST_2);
-
- vis_pack16(TMP20, DST_3);
- vis_st64(DST_2, dest[0]);
- dest += stride;
- } while (--height);
-}
-
-static void MC_avg_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- unsigned long off = (unsigned long) ref & 0x7;
- unsigned long off_plus_1 = off + 1;
- int stride_8 = stride + 8;
- int stride_16 = stride + 16;
-
- vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
-
- ref = vis_alignaddr(ref);
-
- vis_ld64(ref[ 0], TMP0);
- vis_fzero(ZERO);
-
- vis_ld64(ref[ 8], TMP2);
-
- vis_ld64(ref[16], TMP4);
-
- vis_ld64(constants6[0], CONST_6);
- vis_faligndata(TMP0, TMP2, REF_S0);
-
- vis_ld64(constants256_1024[0], CONST_256);
- vis_faligndata(TMP2, TMP4, REF_S4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_S2);
- vis_faligndata(TMP2, TMP4, REF_S6);
- } else {
- vis_src1(TMP2, REF_S2);
- vis_src1(TMP4, REF_S6);
- }
-
- height >>= 1;
- do { /* 55 cycles */
- vis_ld64_2(ref, stride, TMP0);
- vis_mul8x16au(REF_S0, CONST_256, TMP12);
- vis_pmerge(ZERO, REF_S0_1, TMP14);
-
- vis_alignaddr_g0((void *)off);
-
- vis_ld64_2(ref, stride_8, TMP2);
- vis_mul8x16au(REF_S2, CONST_256, TMP16);
- vis_pmerge(ZERO, REF_S2_1, TMP18);
-
- vis_ld64_2(ref, stride_16, TMP4);
- ref += stride;
- vis_mul8x16au(REF_S4, CONST_256, TMP20);
- vis_pmerge(ZERO, REF_S4_1, TMP22);
-
- vis_ld64_2(ref, stride, TMP6);
- vis_mul8x16au(REF_S6, CONST_256, TMP24);
- vis_pmerge(ZERO, REF_S6_1, TMP26);
-
- vis_ld64_2(ref, stride_8, TMP8);
- vis_faligndata(TMP0, TMP2, REF_0);
-
- vis_ld64_2(ref, stride_16, TMP10);
- ref += stride;
- vis_faligndata(TMP2, TMP4, REF_4);
-
- vis_ld64(dest[0], DST_0);
- vis_faligndata(TMP6, TMP8, REF_S0);
-
- vis_ld64_2(dest, 8, DST_2);
- vis_faligndata(TMP8, TMP10, REF_S4);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_2);
- vis_faligndata(TMP2, TMP4, REF_6);
- vis_faligndata(TMP6, TMP8, REF_S2);
- vis_faligndata(TMP8, TMP10, REF_S6);
- } else {
- vis_src1(TMP2, REF_2);
- vis_src1(TMP4, REF_6);
- vis_src1(TMP8, REF_S2);
- vis_src1(TMP10, REF_S6);
- }
-
- vis_mul8x16al(DST_0, CONST_1024, TMP30);
- vis_pmerge(ZERO, REF_0, TMP0);
-
- vis_mul8x16al(DST_1, CONST_1024, TMP32);
- vis_pmerge(ZERO, REF_0_1, TMP2);
-
- vis_mul8x16au(REF_2, CONST_256, TMP4);
- vis_pmerge(ZERO, REF_2_1, TMP6);
-
- vis_mul8x16al(DST_2, CONST_1024, REF_0);
- vis_padd16(TMP0, CONST_6, TMP0);
-
- vis_mul8x16al(DST_3, CONST_1024, REF_2);
- vis_padd16(TMP2, CONST_6, TMP2);
-
- vis_padd16(TMP0, TMP4, TMP0);
- vis_mul8x16au(REF_4, CONST_256, TMP4);
-
- vis_padd16(TMP2, TMP6, TMP2);
- vis_mul8x16au(REF_4_1, CONST_256, TMP6);
-
- vis_padd16(TMP12, TMP0, TMP12);
- vis_mul8x16au(REF_6, CONST_256, TMP8);
-
- vis_padd16(TMP14, TMP2, TMP14);
- vis_mul8x16au(REF_6_1, CONST_256, TMP10);
-
- vis_padd16(TMP12, TMP16, TMP12);
- vis_mul8x16au(REF_S0, CONST_256, REF_4);
-
- vis_padd16(TMP14, TMP18, TMP14);
- vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
-
- vis_padd16(TMP12, TMP30, TMP12);
-
- vis_padd16(TMP14, TMP32, TMP14);
- vis_pack16(TMP12, DST_0);
-
- vis_pack16(TMP14, DST_1);
- vis_st64(DST_0, dest[0]);
- vis_padd16(TMP4, CONST_6, TMP4);
-
- vis_ld64_2(dest, stride, DST_0);
- vis_padd16(TMP6, CONST_6, TMP6);
- vis_mul8x16au(REF_S2, CONST_256, TMP12);
-
- vis_padd16(TMP4, TMP8, TMP4);
- vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
-
- vis_padd16(TMP6, TMP10, TMP6);
-
- vis_padd16(TMP20, TMP4, TMP20);
-
- vis_padd16(TMP22, TMP6, TMP22);
-
- vis_padd16(TMP20, TMP24, TMP20);
-
- vis_padd16(TMP22, TMP26, TMP22);
-
- vis_padd16(TMP20, REF_0, TMP20);
- vis_mul8x16au(REF_S4, CONST_256, REF_0);
-
- vis_padd16(TMP22, REF_2, TMP22);
- vis_pack16(TMP20, DST_2);
-
- vis_pack16(TMP22, DST_3);
- vis_st64_2(DST_2, dest, 8);
- dest += stride;
-
- vis_ld64_2(dest, 8, DST_2);
- vis_mul8x16al(DST_0, CONST_1024, TMP30);
- vis_pmerge(ZERO, REF_S4_1, REF_2);
-
- vis_mul8x16al(DST_1, CONST_1024, TMP32);
- vis_padd16(REF_4, TMP0, TMP8);
-
- vis_mul8x16au(REF_S6, CONST_256, REF_4);
- vis_padd16(REF_6, TMP2, TMP10);
-
- vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
- vis_padd16(TMP8, TMP12, TMP8);
-
- vis_padd16(TMP10, TMP14, TMP10);
-
- vis_padd16(TMP8, TMP30, TMP8);
-
- vis_padd16(TMP10, TMP32, TMP10);
- vis_pack16(TMP8, DST_0);
-
- vis_pack16(TMP10, DST_1);
- vis_st64(DST_0, dest[0]);
-
- vis_padd16(REF_0, TMP4, REF_0);
-
- vis_mul8x16al(DST_2, CONST_1024, TMP30);
- vis_padd16(REF_2, TMP6, REF_2);
-
- vis_mul8x16al(DST_3, CONST_1024, TMP32);
- vis_padd16(REF_0, REF_4, REF_0);
-
- vis_padd16(REF_2, REF_6, REF_2);
-
- vis_padd16(REF_0, TMP30, REF_0);
-
- /* stall */
-
- vis_padd16(REF_2, TMP32, REF_2);
- vis_pack16(REF_0, DST_2);
-
- vis_pack16(REF_2, DST_3);
- vis_st64_2(DST_2, dest, 8);
- dest += stride;
- } while (--height);
-}
-
-static void MC_avg_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
- const int stride, int height)
-{
- uint8_t *ref = (uint8_t *) _ref;
- unsigned long off = (unsigned long) ref & 0x7;
- unsigned long off_plus_1 = off + 1;
- int stride_8 = stride + 8;
-
- vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
-
- ref = vis_alignaddr(ref);
-
- vis_ld64(ref[0], TMP0);
- vis_fzero(ZERO);
-
- vis_ld64_2(ref, 8, TMP2);
-
- vis_ld64(constants6[0], CONST_6);
-
- vis_ld64(constants256_1024[0], CONST_256);
- vis_faligndata(TMP0, TMP2, REF_S0);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_S2);
- } else {
- vis_src1(TMP2, REF_S2);
- }
-
- height >>= 1;
- do { /* 31 cycles */
- vis_ld64_2(ref, stride, TMP0);
- vis_mul8x16au(REF_S0, CONST_256, TMP8);
- vis_pmerge(ZERO, REF_S0_1, TMP10);
-
- vis_ld64_2(ref, stride_8, TMP2);
- ref += stride;
- vis_mul8x16au(REF_S2, CONST_256, TMP12);
- vis_pmerge(ZERO, REF_S2_1, TMP14);
-
- vis_alignaddr_g0((void *)off);
-
- vis_ld64_2(ref, stride, TMP4);
- vis_faligndata(TMP0, TMP2, REF_S4);
-
- vis_ld64_2(ref, stride_8, TMP6);
- ref += stride;
-
- vis_ld64(dest[0], DST_0);
- vis_faligndata(TMP4, TMP6, REF_S0);
-
- vis_ld64_2(dest, stride, DST_2);
-
- if (off != 0x7) {
- vis_alignaddr_g0((void *)off_plus_1);
- vis_faligndata(TMP0, TMP2, REF_S6);
- vis_faligndata(TMP4, TMP6, REF_S2);
- } else {
- vis_src1(TMP2, REF_S6);
- vis_src1(TMP6, REF_S2);
- }
-
- vis_mul8x16al(DST_0, CONST_1024, TMP30);
- vis_pmerge(ZERO, REF_S4, TMP22);
-
- vis_mul8x16al(DST_1, CONST_1024, TMP32);
- vis_pmerge(ZERO, REF_S4_1, TMP24);
-
- vis_mul8x16au(REF_S6, CONST_256, TMP26);
- vis_pmerge(ZERO, REF_S6_1, TMP28);
-
- vis_mul8x16au(REF_S0, CONST_256, REF_S4);
- vis_padd16(TMP22, CONST_6, TMP22);
-
- vis_mul8x16au(REF_S0_1, CONST_256, REF_S6);
- vis_padd16(TMP24, CONST_6, TMP24);
-
- vis_mul8x16al(DST_2, CONST_1024, REF_0);
- vis_padd16(TMP22, TMP26, TMP22);
-
- vis_mul8x16al(DST_3, CONST_1024, REF_2);
- vis_padd16(TMP24, TMP28, TMP24);
-
- vis_mul8x16au(REF_S2, CONST_256, TMP26);
- vis_padd16(TMP8, TMP22, TMP8);
-
- vis_mul8x16au(REF_S2_1, CONST_256, TMP28);
- vis_padd16(TMP10, TMP24, TMP10);
-
- vis_padd16(TMP8, TMP12, TMP8);
-
- vis_padd16(TMP10, TMP14, TMP10);
-
- vis_padd16(TMP8, TMP30, TMP8);
-
- vis_padd16(TMP10, TMP32, TMP10);
- vis_pack16(TMP8, DST_0);
-
- vis_pack16(TMP10, DST_1);
- vis_st64(DST_0, dest[0]);
- dest += stride;
-
- vis_padd16(REF_S4, TMP22, TMP12);
-
- vis_padd16(REF_S6, TMP24, TMP14);
-
- vis_padd16(TMP12, TMP26, TMP12);
-
- vis_padd16(TMP14, TMP28, TMP14);
-
- vis_padd16(TMP12, REF_0, TMP12);
-
- vis_padd16(TMP14, REF_2, TMP14);
- vis_pack16(TMP12, DST_2);
-
- vis_pack16(TMP14, DST_3);
- vis_st64(DST_2, dest[0]);
- dest += stride;
- } while (--height);
-}
-
-MPEG2_MC_EXTERN(vis);
-
-#endif /* !(ARCH_SPARC) */
diff --git a/libmpeg2/mpeg2.h b/libmpeg2/mpeg2.h
deleted file mode 100644
index 6b8ae5b45d..0000000000
--- a/libmpeg2/mpeg2.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * mpeg2.h
- * Copyright (C) 2000-2004 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
- * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id$
- */
-
-#ifndef LIBMPEG2_MPEG2_H
-#define LIBMPEG2_MPEG2_H
-
-#define MPEG2_VERSION(a,b,c) (((a)<<16)|((b)<<8)|(c))
-#define MPEG2_RELEASE MPEG2_VERSION (0, 5, 1) /* 0.5.1 */
-
-#define SEQ_FLAG_MPEG2 1
-#define SEQ_FLAG_CONSTRAINED_PARAMETERS 2
-#define SEQ_FLAG_PROGRESSIVE_SEQUENCE 4
-#define SEQ_FLAG_LOW_DELAY 8
-#define SEQ_FLAG_COLOUR_DESCRIPTION 16
-
-#define SEQ_MASK_VIDEO_FORMAT 0xe0
-#define SEQ_VIDEO_FORMAT_COMPONENT 0
-#define SEQ_VIDEO_FORMAT_PAL 0x20
-#define SEQ_VIDEO_FORMAT_NTSC 0x40
-#define SEQ_VIDEO_FORMAT_SECAM 0x60
-#define SEQ_VIDEO_FORMAT_MAC 0x80
-#define SEQ_VIDEO_FORMAT_UNSPECIFIED 0xa0
-
-typedef struct mpeg2_sequence_s {
- unsigned int width, height;
- unsigned int chroma_width, chroma_height;
- unsigned int byte_rate;
- unsigned int vbv_buffer_size;
- uint32_t flags;
-
- unsigned int picture_width, picture_height;
- unsigned int display_width, display_height;
- unsigned int pixel_width, pixel_height;
- unsigned int frame_period;
-
- uint8_t profile_level_id;
- uint8_t colour_primaries;
- uint8_t transfer_characteristics;
- uint8_t matrix_coefficients;
-} mpeg2_sequence_t;
-
-#define GOP_FLAG_DROP_FRAME 1
-#define GOP_FLAG_BROKEN_LINK 2
-#define GOP_FLAG_CLOSED_GOP 4
-
-typedef struct mpeg2_gop_s {
- uint8_t hours;
- uint8_t minutes;
- uint8_t seconds;
- uint8_t pictures;
- uint32_t flags;
-} mpeg2_gop_t;
-
-#define PIC_MASK_CODING_TYPE 7
-#define PIC_FLAG_CODING_TYPE_I 1
-#define PIC_FLAG_CODING_TYPE_P 2
-#define PIC_FLAG_CODING_TYPE_B 3
-#define PIC_FLAG_CODING_TYPE_D 4
-
-#define PIC_FLAG_TOP_FIELD_FIRST 8
-#define PIC_FLAG_PROGRESSIVE_FRAME 16
-#define PIC_FLAG_COMPOSITE_DISPLAY 32
-#define PIC_FLAG_SKIP 64
-#define PIC_FLAG_TAGS 128
-#define PIC_FLAG_REPEAT_FIRST_FIELD 256
-#define PIC_MASK_COMPOSITE_DISPLAY 0xfffff000
-
-typedef struct mpeg2_picture_s {
- unsigned int temporal_reference;
- unsigned int nb_fields;
- uint32_t tag, tag2;
- uint32_t flags;
- struct {
- int x, y;
- } display_offset[3];
-} mpeg2_picture_t;
-
-typedef struct mpeg2_fbuf_s {
- uint8_t * buf[3];
- void * id;
-} mpeg2_fbuf_t;
-
-typedef struct mpeg2_info_s {
- const mpeg2_sequence_t * sequence;
- const mpeg2_gop_t * gop;
- const mpeg2_picture_t * current_picture;
- const mpeg2_picture_t * current_picture_2nd;
- const mpeg2_fbuf_t * current_fbuf;
- const mpeg2_picture_t * display_picture;
- const mpeg2_picture_t * display_picture_2nd;
- const mpeg2_fbuf_t * display_fbuf;
- const mpeg2_fbuf_t * discard_fbuf;
- const uint8_t * user_data;
- unsigned int user_data_len;
-} mpeg2_info_t;
-
-typedef struct mpeg2dec_s mpeg2dec_t;
-typedef struct mpeg2_decoder_s mpeg2_decoder_t;
-
-typedef enum {
- STATE_BUFFER = 0,
- STATE_SEQUENCE = 1,
- STATE_SEQUENCE_REPEATED = 2,
- STATE_GOP = 3,
- STATE_PICTURE = 4,
- STATE_SLICE_1ST = 5,
- STATE_PICTURE_2ND = 6,
- STATE_SLICE = 7,
- STATE_END = 8,
- STATE_INVALID = 9,
- STATE_INVALID_END = 10,
- STATE_SEQUENCE_MODIFIED = 11
-} mpeg2_state_t;
-
-typedef struct mpeg2_convert_init_s {
- unsigned int id_size;
- unsigned int buf_size[3];
- void (* start) (void * id, const mpeg2_fbuf_t * fbuf,
- const mpeg2_picture_t * picture, const mpeg2_gop_t * gop);
- void (* copy) (void * id, uint8_t * const * src, unsigned int v_offset);
-} mpeg2_convert_init_t;
-typedef enum {
- MPEG2_CONVERT_SET = 0,
- MPEG2_CONVERT_STRIDE = 1,
- MPEG2_CONVERT_START = 2
-} mpeg2_convert_stage_t;
-typedef int mpeg2_convert_t (int stage, void * id,
- const mpeg2_sequence_t * sequence, int stride,
- uint32_t accel, void * arg,
- mpeg2_convert_init_t * result);
-int mpeg2_convert (mpeg2dec_t * mpeg2dec, mpeg2_convert_t convert, void * arg);
-int mpeg2_stride (mpeg2dec_t * mpeg2dec, int stride);
-void mpeg2_set_buf (mpeg2dec_t * mpeg2dec, uint8_t * buf[3], void * id);
-void mpeg2_custom_fbuf (mpeg2dec_t * mpeg2dec, int custom_fbuf);
-
-#define MPEG2_ACCEL_X86_MMX 1
-#define MPEG2_ACCEL_X86_3DNOW 2
-#define MPEG2_ACCEL_X86_MMXEXT 4
-#define MPEG2_ACCEL_X86_SSE2 8
-#define MPEG2_ACCEL_X86_SSE3 16
-#define MPEG2_ACCEL_PPC_ALTIVEC 1
-#define MPEG2_ACCEL_ALPHA 1
-#define MPEG2_ACCEL_ALPHA_MVI 2
-#define MPEG2_ACCEL_SPARC_VIS 1
-#define MPEG2_ACCEL_SPARC_VIS2 2
-#define MPEG2_ACCEL_ARM 1
-#define MPEG2_ACCEL_DETECT 0x80000000
-
-uint32_t mpeg2_accel (uint32_t accel);
-mpeg2dec_t * mpeg2_init (void);
-const mpeg2_info_t * mpeg2_info (mpeg2dec_t * mpeg2dec);
-void mpeg2_close (mpeg2dec_t * mpeg2dec);
-
-void mpeg2_buffer (mpeg2dec_t * mpeg2dec, uint8_t * start, uint8_t * end);
-int mpeg2_getpos (mpeg2dec_t * mpeg2dec);
-mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec);
-
-void mpeg2_reset (mpeg2dec_t * mpeg2dec, int full_reset);
-void mpeg2_skip (mpeg2dec_t * mpeg2dec, int skip);
-void mpeg2_slice_region (mpeg2dec_t * mpeg2dec, int start, int end);
-
-void mpeg2_tag_picture (mpeg2dec_t * mpeg2dec, uint32_t tag, uint32_t tag2);
-
-void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3],
- uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3]);
-void mpeg2_slice (mpeg2_decoder_t * decoder, int code, const uint8_t * buffer);
-int mpeg2_guess_aspect (const mpeg2_sequence_t * sequence,
- unsigned int * pixel_width,
- unsigned int * pixel_height);
-
-typedef enum {
- MPEG2_ALLOC_MPEG2DEC = 0,
- MPEG2_ALLOC_CHUNK = 1,
- MPEG2_ALLOC_YUV = 2,
- MPEG2_ALLOC_CONVERT_ID = 3,
- MPEG2_ALLOC_CONVERTED = 4
-} mpeg2_alloc_t;
-
-void * mpeg2_malloc (unsigned size, mpeg2_alloc_t reason);
-void mpeg2_free (void * buf);
-void mpeg2_malloc_hooks (void * malloc (unsigned, mpeg2_alloc_t),
- int free (void *));
-
-#endif /* LIBMPEG2_MPEG2_H */
diff --git a/libmpeg2/mpeg2_internal.h b/libmpeg2/mpeg2_internal.h
deleted file mode 100644
index 73cbfb15ce..0000000000
--- a/libmpeg2/mpeg2_internal.h
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * mpeg2_internal.h
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
- * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id$
- */
-
-#ifndef LIBMPEG2_MPEG2_INTERNAL_H
-#define LIBMPEG2_MPEG2_INTERNAL_H
-
-#define STATE_INTERNAL_NORETURN ((mpeg2_state_t)-1)
-
-/* macroblock modes */
-#define MACROBLOCK_INTRA 1
-#define MACROBLOCK_PATTERN 2
-#define MACROBLOCK_MOTION_BACKWARD 4
-#define MACROBLOCK_MOTION_FORWARD 8
-#define MACROBLOCK_QUANT 16
-#define DCT_TYPE_INTERLACED 32
-/* motion_type */
-#define MOTION_TYPE_SHIFT 6
-#define MC_FIELD 1
-#define MC_FRAME 2
-#define MC_16X8 2
-#define MC_DMV 3
-
-/* picture structure */
-#define TOP_FIELD 1
-#define BOTTOM_FIELD 2
-#define FRAME_PICTURE 3
-
-/* picture coding type */
-#define I_TYPE 1
-#define P_TYPE 2
-#define B_TYPE 3
-#define D_TYPE 4
-
-typedef void mpeg2_mc_fct (uint8_t *, const uint8_t *, int, int);
-
-typedef struct {
- uint8_t * ref[2][3];
- uint8_t ** ref2[2];
- int pmv[2][2];
- int f_code[2];
-} motion_t;
-
-typedef void motion_parser_t (mpeg2_decoder_t * decoder,
- motion_t * motion,
- mpeg2_mc_fct * const * table);
-
-struct mpeg2_decoder_s {
- /* first, state that carries information from one macroblock to the */
- /* next inside a slice, and is never used outside of mpeg2_slice() */
-
- /* bit parsing stuff */
- uint32_t bitstream_buf; /* current 32 bit working set */
- int bitstream_bits; /* used bits in working set */
- const uint8_t * bitstream_ptr; /* buffer with stream data */
-
- uint8_t * dest[3];
-
- int offset;
- int stride;
- int uv_stride;
- int slice_stride;
- int slice_uv_stride;
- int stride_frame;
- unsigned int limit_x;
- unsigned int limit_y_16;
- unsigned int limit_y_8;
- unsigned int limit_y;
-
- /* Motion vectors */
- /* The f_ and b_ correspond to the forward and backward motion */
- /* predictors */
- motion_t b_motion;
- motion_t f_motion;
- motion_parser_t * motion_parser[5];
-
- /* predictor for DC coefficients in intra blocks */
- int16_t dc_dct_pred[3];
-
- /* DCT coefficients */
- int16_t DCTblock[64] ATTR_ALIGN(64);
-
- uint8_t * picture_dest[3];
- void (* convert) (void * convert_id, uint8_t * const * src,
- unsigned int v_offset);
- void * convert_id;
-
- int dmv_offset;
- unsigned int v_offset;
-
- /* now non-slice-specific information */
-
- /* sequence header stuff */
- uint16_t * quantizer_matrix[4];
- uint16_t (* chroma_quantizer[2])[64];
- uint16_t quantizer_prescale[4][32][64];
-
- /* The width and height of the picture snapped to macroblock units */
- int width;
- int height;
- int vertical_position_extension;
- int chroma_format;
-
- /* picture header stuff */
-
- /* what type of picture this is (I, P, B, D) */
- int coding_type;
-
- /* picture coding extension stuff */
-
- /* quantization factor for intra dc coefficients */
- int intra_dc_precision;
- /* top/bottom/both fields */
- int picture_structure;
- /* bool to indicate all predictions are frame based */
- int frame_pred_frame_dct;
- /* bool to indicate whether intra blocks have motion vectors */
- /* (for concealment) */
- int concealment_motion_vectors;
- /* bool to use different vlc tables */
- int intra_vlc_format;
- /* used for DMV MC */
- int top_field_first;
-
- /* stuff derived from bitstream */
-
- /* pointer to the zigzag scan we're supposed to be using */
- const uint8_t * scan;
-
- int second_field;
-
- int mpeg1;
-
- /* XXX: stuff due to xine shit */
- int8_t q_scale_type;
-
- int quantizer_scales[32];
- int quantizer_scale;
- char* quant_store;
- int quant_stride;
-};
-
-typedef struct {
- mpeg2_fbuf_t fbuf;
-} fbuf_alloc_t;
-
-struct mpeg2dec_s {
- mpeg2_decoder_t decoder;
-
- mpeg2_info_t info;
-
- uint32_t shift;
- int is_display_initialized;
- mpeg2_state_t (* action) (struct mpeg2dec_s * mpeg2dec);
- mpeg2_state_t state;
- uint32_t ext_state;
-
- /* allocated in init - gcc has problems allocating such big structures */
- uint8_t * chunk_buffer;
- /* pointer to start of the current chunk */
- uint8_t * chunk_start;
- /* pointer to current position in chunk_buffer */
- uint8_t * chunk_ptr;
- /* last start code ? */
- uint8_t code;
-
- /* picture tags */
- uint32_t tag_current, tag2_current, tag_previous, tag2_previous;
- int num_tags;
- int bytes_since_tag;
-
- int first;
- int alloc_index_user;
- int alloc_index;
- uint8_t first_decode_slice;
- uint8_t nb_decode_slices;
-
- unsigned int user_data_len;
-
- mpeg2_sequence_t new_sequence;
- mpeg2_sequence_t sequence;
- mpeg2_gop_t new_gop;
- mpeg2_gop_t gop;
- mpeg2_picture_t new_picture;
- mpeg2_picture_t pictures[4];
- mpeg2_picture_t * picture;
- /*const*/ mpeg2_fbuf_t * fbuf[3]; /* 0: current fbuf, 1-2: prediction fbufs */
-
- fbuf_alloc_t fbuf_alloc[3];
- int custom_fbuf;
-
- uint8_t * yuv_buf[3][3];
- int yuv_index;
- mpeg2_convert_t * convert;
- void * convert_arg;
- unsigned int convert_id_size;
- int convert_stride;
- void (* convert_start) (void * id, const mpeg2_fbuf_t * fbuf,
- const mpeg2_picture_t * picture,
- const mpeg2_gop_t * gop);
-
- uint8_t * buf_start;
- uint8_t * buf_end;
-
- int16_t display_offset_x, display_offset_y;
-
- int copy_matrix;
- int8_t scaled[4]; /* XXX: MOVED */
- //int8_t q_scale_type, scaled[4];
- uint8_t quantizer_matrix[4][64];
- uint8_t new_quantizer_matrix[4][64];
-
- unsigned char *pending_buffer;
- int pending_length;
-};
-
-typedef struct {
-#if ARCH_PPC
- uint8_t regv[12*16];
-#endif
- int dummy;
-} cpu_state_t;
-
-/* cpu_accel.c */
-uint32_t mpeg2_detect_accel (uint32_t accel);
-
-/* cpu_state.c */
-void mpeg2_cpu_state_init (uint32_t accel);
-
-/* decode.c */
-mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec);
-mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec);
-
-/* header.c */
-void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec);
-void mpeg2_reset_info (mpeg2_info_t * info);
-int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec);
-int mpeg2_header_gop (mpeg2dec_t * mpeg2dec);
-mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec);
-int mpeg2_header_picture (mpeg2dec_t * mpeg2dec);
-int mpeg2_header_extension (mpeg2dec_t * mpeg2dec);
-int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec);
-void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec);
-void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec);
-void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels);
-mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec);
-mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec);
-void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type);
-
-/* idct.c */
-extern void mpeg2_idct_init (uint32_t accel);
-extern uint8_t mpeg2_scan_norm[64];
-extern uint8_t mpeg2_scan_alt[64];
-
-/* idct_mmx.c */
-void mpeg2_idct_copy_sse2 (int16_t * block, uint8_t * dest, int stride);
-void mpeg2_idct_add_sse2 (int last, int16_t * block,
- uint8_t * dest, int stride);
-void mpeg2_idct_copy_mmxext (int16_t * block, uint8_t * dest, int stride);
-void mpeg2_idct_add_mmxext (int last, int16_t * block,
- uint8_t * dest, int stride);
-void mpeg2_idct_copy_mmx (int16_t * block, uint8_t * dest, int stride);
-void mpeg2_idct_add_mmx (int last, int16_t * block,
- uint8_t * dest, int stride);
-void mpeg2_idct_mmx_init (void);
-
-/* idct_altivec.c */
-void mpeg2_idct_copy_altivec (int16_t * block, uint8_t * dest, int stride);
-void mpeg2_idct_add_altivec (int last, int16_t * block,
- uint8_t * dest, int stride);
-void mpeg2_idct_altivec_init (void);
-
-/* idct_alpha.c */
-void mpeg2_idct_copy_mvi (int16_t * block, uint8_t * dest, int stride);
-void mpeg2_idct_add_mvi (int last, int16_t * block,
- uint8_t * dest, int stride);
-void mpeg2_idct_copy_alpha (int16_t * block, uint8_t * dest, int stride);
-void mpeg2_idct_add_alpha (int last, int16_t * block,
- uint8_t * dest, int stride);
-void mpeg2_idct_alpha_init (void);
-
-/* motion_comp.c */
-void mpeg2_mc_init (uint32_t accel);
-
-typedef struct {
- mpeg2_mc_fct * put [8];
- mpeg2_mc_fct * avg [8];
-} mpeg2_mc_t;
-
-#define MPEG2_MC_EXTERN(x) mpeg2_mc_t mpeg2_mc_##x = { \
- {MC_put_o_16_##x, MC_put_x_16_##x, MC_put_y_16_##x, MC_put_xy_16_##x, \
- MC_put_o_8_##x, MC_put_x_8_##x, MC_put_y_8_##x, MC_put_xy_8_##x}, \
- {MC_avg_o_16_##x, MC_avg_x_16_##x, MC_avg_y_16_##x, MC_avg_xy_16_##x, \
- MC_avg_o_8_##x, MC_avg_x_8_##x, MC_avg_y_8_##x, MC_avg_xy_8_##x} \
-};
-
-extern mpeg2_mc_t mpeg2_mc_c;
-extern mpeg2_mc_t mpeg2_mc_mmx;
-extern mpeg2_mc_t mpeg2_mc_mmxext;
-extern mpeg2_mc_t mpeg2_mc_3dnow;
-extern mpeg2_mc_t mpeg2_mc_altivec;
-extern mpeg2_mc_t mpeg2_mc_alpha;
-extern mpeg2_mc_t mpeg2_mc_vis;
-extern mpeg2_mc_t mpeg2_mc_arm;
-
-#endif /* LIBMPEG2_MPEG2_INTERNAL_H */
diff --git a/libmpeg2/slice.c b/libmpeg2/slice.c
deleted file mode 100644
index 60a6119987..0000000000
--- a/libmpeg2/slice.c
+++ /dev/null
@@ -1,2101 +0,0 @@
-/*
- * slice.c
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 2003 Peter Gubanov <peter@elecard.net.ru>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Modified for use with MPlayer, see libmpeg2_changes.diff for the exact changes.
- * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
- * $Id$
- */
-
-#include "config.h"
-
-#include <inttypes.h>
-
-#include "mpeg2.h"
-#include "attributes.h"
-#include "mpeg2_internal.h"
-
-extern mpeg2_mc_t mpeg2_mc;
-extern void (* mpeg2_idct_copy) (int16_t * block, uint8_t * dest, int stride);
-extern void (* mpeg2_idct_add) (int last, int16_t * block,
- uint8_t * dest, int stride);
-extern void (* mpeg2_cpu_state_save) (cpu_state_t * state);
-extern void (* mpeg2_cpu_state_restore) (cpu_state_t * state);
-
-#include "vlc.h"
-
-static inline int get_macroblock_modes (mpeg2_decoder_t * const decoder)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
- int macroblock_modes;
- const MBtab * tab;
-
- switch (decoder->coding_type) {
- case I_TYPE:
-
- tab = MB_I + UBITS (bit_buf, 1);
- DUMPBITS (bit_buf, bits, tab->len);
- macroblock_modes = tab->modes;
-
- if ((! (decoder->frame_pred_frame_dct)) &&
- (decoder->picture_structure == FRAME_PICTURE)) {
- macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
- DUMPBITS (bit_buf, bits, 1);
- }
-
- return macroblock_modes;
-
- case P_TYPE:
-
- tab = MB_P + UBITS (bit_buf, 5);
- DUMPBITS (bit_buf, bits, tab->len);
- macroblock_modes = tab->modes;
-
- if (decoder->picture_structure != FRAME_PICTURE) {
- if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) {
- macroblock_modes |= UBITS (bit_buf, 2) << MOTION_TYPE_SHIFT;
- DUMPBITS (bit_buf, bits, 2);
- }
- return macroblock_modes | MACROBLOCK_MOTION_FORWARD;
- } else if (decoder->frame_pred_frame_dct) {
- if (macroblock_modes & MACROBLOCK_MOTION_FORWARD)
- macroblock_modes |= MC_FRAME << MOTION_TYPE_SHIFT;
- return macroblock_modes | MACROBLOCK_MOTION_FORWARD;
- } else {
- if (macroblock_modes & MACROBLOCK_MOTION_FORWARD) {
- macroblock_modes |= UBITS (bit_buf, 2) << MOTION_TYPE_SHIFT;
- DUMPBITS (bit_buf, bits, 2);
- }
- if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN)) {
- macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
- DUMPBITS (bit_buf, bits, 1);
- }
- return macroblock_modes | MACROBLOCK_MOTION_FORWARD;
- }
-
- case B_TYPE:
-
- tab = MB_B + UBITS (bit_buf, 6);
- DUMPBITS (bit_buf, bits, tab->len);
- macroblock_modes = tab->modes;
-
- if (decoder->picture_structure != FRAME_PICTURE) {
- if (! (macroblock_modes & MACROBLOCK_INTRA)) {
- macroblock_modes |= UBITS (bit_buf, 2) << MOTION_TYPE_SHIFT;
- DUMPBITS (bit_buf, bits, 2);
- }
- return macroblock_modes;
- } else if (decoder->frame_pred_frame_dct) {
- /* if (! (macroblock_modes & MACROBLOCK_INTRA)) */
- macroblock_modes |= MC_FRAME << MOTION_TYPE_SHIFT;
- return macroblock_modes;
- } else {
- if (macroblock_modes & MACROBLOCK_INTRA)
- goto intra;
- macroblock_modes |= UBITS (bit_buf, 2) << MOTION_TYPE_SHIFT;
- DUMPBITS (bit_buf, bits, 2);
- if (macroblock_modes & (MACROBLOCK_INTRA | MACROBLOCK_PATTERN)) {
- intra:
- macroblock_modes |= UBITS (bit_buf, 1) * DCT_TYPE_INTERLACED;
- DUMPBITS (bit_buf, bits, 1);
- }
- return macroblock_modes;
- }
-
- case D_TYPE:
-
- DUMPBITS (bit_buf, bits, 1);
- return MACROBLOCK_INTRA;
-
- default:
- return 0;
- }
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-static inline void get_quantizer_scale (mpeg2_decoder_t * const decoder)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
-
- int quantizer_scale_code;
-
- quantizer_scale_code = UBITS (bit_buf, 5);
- DUMPBITS (bit_buf, bits, 5);
- decoder->quantizer_scale = decoder->quantizer_scales[quantizer_scale_code];
-
- decoder->quantizer_matrix[0] =
- decoder->quantizer_prescale[0][quantizer_scale_code];
- decoder->quantizer_matrix[1] =
- decoder->quantizer_prescale[1][quantizer_scale_code];
- decoder->quantizer_matrix[2] =
- decoder->chroma_quantizer[0][quantizer_scale_code];
- decoder->quantizer_matrix[3] =
- decoder->chroma_quantizer[1][quantizer_scale_code];
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-static inline int get_motion_delta (mpeg2_decoder_t * const decoder,
- const int f_code)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
-
- int delta;
- int sign;
- const MVtab * tab;
-
- if (bit_buf & 0x80000000) {
- DUMPBITS (bit_buf, bits, 1);
- return 0;
- } else if (bit_buf >= 0x0c000000) {
-
- tab = MV_4 + UBITS (bit_buf, 4);
- delta = (tab->delta << f_code) + 1;
- bits += tab->len + f_code + 1;
- bit_buf <<= tab->len;
-
- sign = SBITS (bit_buf, 1);
- bit_buf <<= 1;
-
- if (f_code)
- delta += UBITS (bit_buf, f_code);
- bit_buf <<= f_code;
-
- return (delta ^ sign) - sign;
-
- } else {
-
- tab = MV_10 + UBITS (bit_buf, 10);
- delta = (tab->delta << f_code) + 1;
- bits += tab->len + 1;
- bit_buf <<= tab->len;
-
- sign = SBITS (bit_buf, 1);
- bit_buf <<= 1;
-
- if (f_code) {
- NEEDBITS (bit_buf, bits, bit_ptr);
- delta += UBITS (bit_buf, f_code);
- DUMPBITS (bit_buf, bits, f_code);
- }
-
- return (delta ^ sign) - sign;
-
- }
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-static inline int bound_motion_vector (const int vector, const int f_code)
-{
- return ((int32_t)vector << (27 - f_code)) >> (27 - f_code);
-}
-
-static inline int get_dmv (mpeg2_decoder_t * const decoder)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
-
- const DMVtab * tab;
-
- tab = DMV_2 + UBITS (bit_buf, 2);
- DUMPBITS (bit_buf, bits, tab->len);
- return tab->dmv;
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-static inline int get_coded_block_pattern (mpeg2_decoder_t * const decoder)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
-
- const CBPtab * tab;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- if (bit_buf >= 0x20000000) {
-
- tab = CBP_7 + (UBITS (bit_buf, 7) - 16);
- DUMPBITS (bit_buf, bits, tab->len);
- return tab->cbp;
-
- } else {
-
- tab = CBP_9 + UBITS (bit_buf, 9);
- DUMPBITS (bit_buf, bits, tab->len);
- return tab->cbp;
- }
-
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-static inline int get_luma_dc_dct_diff (mpeg2_decoder_t * const decoder)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
- const DCtab * tab;
- int size;
- int dc_diff;
-
- if (bit_buf < 0xf8000000) {
- tab = DC_lum_5 + UBITS (bit_buf, 5);
- size = tab->size;
- if (size) {
- bits += tab->len + size;
- bit_buf <<= tab->len;
- dc_diff =
- UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
- bit_buf <<= size;
- return dc_diff << decoder->intra_dc_precision;
- } else {
- DUMPBITS (bit_buf, bits, 3);
- return 0;
- }
- } else {
- tab = DC_long + (UBITS (bit_buf, 9) - 0x1e0);
- size = tab->size;
- DUMPBITS (bit_buf, bits, tab->len);
- NEEDBITS (bit_buf, bits, bit_ptr);
- dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
- DUMPBITS (bit_buf, bits, size);
- return dc_diff << decoder->intra_dc_precision;
- }
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-static inline int get_chroma_dc_dct_diff (mpeg2_decoder_t * const decoder)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
- const DCtab * tab;
- int size;
- int dc_diff;
-
- if (bit_buf < 0xf8000000) {
- tab = DC_chrom_5 + UBITS (bit_buf, 5);
- size = tab->size;
- if (size) {
- bits += tab->len + size;
- bit_buf <<= tab->len;
- dc_diff =
- UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
- bit_buf <<= size;
- return dc_diff << decoder->intra_dc_precision;
- } else {
- DUMPBITS (bit_buf, bits, 2);
- return 0;
- }
- } else {
- tab = DC_long + (UBITS (bit_buf, 10) - 0x3e0);
- size = tab->size;
- DUMPBITS (bit_buf, bits, tab->len + 1);
- NEEDBITS (bit_buf, bits, bit_ptr);
- dc_diff = UBITS (bit_buf, size) - UBITS (SBITS (~bit_buf, 1), size);
- DUMPBITS (bit_buf, bits, size);
- return dc_diff << decoder->intra_dc_precision;
- }
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-#define SATURATE(val) \
-do { \
- val <<= 4; \
- if (unlikely (val != (int16_t) val)) \
- val = (SBITS (val, 1) ^ 2047) << 4; \
-} while (0)
-
-static void get_intra_block_B14 (mpeg2_decoder_t * const decoder,
- const uint16_t * const quant_matrix)
-{
- int i;
- int j;
- int val;
- const uint8_t * const scan = decoder->scan;
- int mismatch;
- const DCTtab * tab;
- uint32_t bit_buf;
- int bits;
- const uint8_t * bit_ptr;
- int16_t * const dest = decoder->DCTblock;
-
- i = 0;
- mismatch = ~dest[0];
-
- bit_buf = decoder->bitstream_buf;
- bits = decoder->bitstream_bits;
- bit_ptr = decoder->bitstream_ptr;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- while (1) {
- if (bit_buf >= 0x28000000) {
-
- tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5);
-
- i += tab->run;
- if (i >= 64)
- break; /* end of block */
-
- normal_code:
- j = scan[i];
- bit_buf <<= tab->len;
- bits += tab->len + 1;
- val = (tab->level * quant_matrix[j]) >> 4;
-
- /* if (bitstream_get (1)) val = -val; */
- val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
-
- SATURATE (val);
- dest[j] = val;
- mismatch ^= val;
-
- bit_buf <<= 1;
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- } else if (bit_buf >= 0x04000000) {
-
- tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4);
-
- i += tab->run;
- if (i < 64)
- goto normal_code;
-
- /* escape code */
-
- i += UBITS (bit_buf << 6, 6) - 64;
- if (i >= 64)
- break; /* illegal, check needed to avoid buffer overflow */
-
- j = scan[i];
-
- DUMPBITS (bit_buf, bits, 12);
- NEEDBITS (bit_buf, bits, bit_ptr);
- val = (SBITS (bit_buf, 12) * quant_matrix[j]) / 16;
-
- SATURATE (val);
- dest[j] = val;
- mismatch ^= val;
-
- DUMPBITS (bit_buf, bits, 12);
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- } else if (bit_buf >= 0x02000000) {
- tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00800000) {
- tab = DCT_13 + (UBITS (bit_buf, 13) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00200000) {
- tab = DCT_15 + (UBITS (bit_buf, 15) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else {
- tab = DCT_16 + UBITS (bit_buf, 16);
- bit_buf <<= 16;
- GETWORD (bit_buf, bits + 16, bit_ptr);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- }
- break; /* illegal, check needed to avoid buffer overflow */
- }
- dest[63] ^= mismatch & 16;
- DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */
- decoder->bitstream_buf = bit_buf;
- decoder->bitstream_bits = bits;
- decoder->bitstream_ptr = bit_ptr;
-}
-
-static void get_intra_block_B15 (mpeg2_decoder_t * const decoder,
- const uint16_t * const quant_matrix)
-{
- int i;
- int j;
- int val;
- const uint8_t * const scan = decoder->scan;
- int mismatch;
- const DCTtab * tab;
- uint32_t bit_buf;
- int bits;
- const uint8_t * bit_ptr;
- int16_t * const dest = decoder->DCTblock;
-
- i = 0;
- mismatch = ~dest[0];
-
- bit_buf = decoder->bitstream_buf;
- bits = decoder->bitstream_bits;
- bit_ptr = decoder->bitstream_ptr;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- while (1) {
- if (bit_buf >= 0x04000000) {
-
- tab = DCT_B15_8 + (UBITS (bit_buf, 8) - 4);
-
- i += tab->run;
- if (i < 64) {
-
- normal_code:
- j = scan[i];
- bit_buf <<= tab->len;
- bits += tab->len + 1;
- val = (tab->level * quant_matrix[j]) >> 4;
-
- /* if (bitstream_get (1)) val = -val; */
- val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
-
- SATURATE (val);
- dest[j] = val;
- mismatch ^= val;
-
- bit_buf <<= 1;
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- } else {
-
- /* end of block. I commented out this code because if we */
- /* do not exit here we will still exit at the later test :) */
-
- /* if (i >= 128) break; */ /* end of block */
-
- /* escape code */
-
- i += UBITS (bit_buf << 6, 6) - 64;
- if (i >= 64)
- break; /* illegal, check against buffer overflow */
-
- j = scan[i];
-
- DUMPBITS (bit_buf, bits, 12);
- NEEDBITS (bit_buf, bits, bit_ptr);
- val = (SBITS (bit_buf, 12) * quant_matrix[j]) / 16;
-
- SATURATE (val);
- dest[j] = val;
- mismatch ^= val;
-
- DUMPBITS (bit_buf, bits, 12);
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- }
- } else if (bit_buf >= 0x02000000) {
- tab = DCT_B15_10 + (UBITS (bit_buf, 10) - 8);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00800000) {
- tab = DCT_13 + (UBITS (bit_buf, 13) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00200000) {
- tab = DCT_15 + (UBITS (bit_buf, 15) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else {
- tab = DCT_16 + UBITS (bit_buf, 16);
- bit_buf <<= 16;
- GETWORD (bit_buf, bits + 16, bit_ptr);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- }
- break; /* illegal, check needed to avoid buffer overflow */
- }
- dest[63] ^= mismatch & 16;
- DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */
- decoder->bitstream_buf = bit_buf;
- decoder->bitstream_bits = bits;
- decoder->bitstream_ptr = bit_ptr;
-}
-
-static int get_non_intra_block (mpeg2_decoder_t * const decoder,
- const uint16_t * const quant_matrix)
-{
- int i;
- int j;
- int val;
- const uint8_t * const scan = decoder->scan;
- int mismatch;
- const DCTtab * tab;
- uint32_t bit_buf;
- int bits;
- const uint8_t * bit_ptr;
- int16_t * const dest = decoder->DCTblock;
-
- i = -1;
- mismatch = -1;
-
- bit_buf = decoder->bitstream_buf;
- bits = decoder->bitstream_bits;
- bit_ptr = decoder->bitstream_ptr;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- if (bit_buf >= 0x28000000) {
- tab = DCT_B14DC_5 + (UBITS (bit_buf, 5) - 5);
- goto entry_1;
- } else
- goto entry_2;
-
- while (1) {
- if (bit_buf >= 0x28000000) {
-
- tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5);
-
- entry_1:
- i += tab->run;
- if (i >= 64)
- break; /* end of block */
-
- normal_code:
- j = scan[i];
- bit_buf <<= tab->len;
- bits += tab->len + 1;
- val = ((2 * tab->level + 1) * quant_matrix[j]) >> 5;
-
- /* if (bitstream_get (1)) val = -val; */
- val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
-
- SATURATE (val);
- dest[j] = val;
- mismatch ^= val;
-
- bit_buf <<= 1;
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- }
-
- entry_2:
- if (bit_buf >= 0x04000000) {
-
- tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4);
-
- i += tab->run;
- if (i < 64)
- goto normal_code;
-
- /* escape code */
-
- i += UBITS (bit_buf << 6, 6) - 64;
- if (i >= 64)
- break; /* illegal, check needed to avoid buffer overflow */
-
- j = scan[i];
-
- DUMPBITS (bit_buf, bits, 12);
- NEEDBITS (bit_buf, bits, bit_ptr);
- val = 2 * (SBITS (bit_buf, 12) + SBITS (bit_buf, 1)) + 1;
- val = (val * quant_matrix[j]) / 32;
-
- SATURATE (val);
- dest[j] = val;
- mismatch ^= val;
-
- DUMPBITS (bit_buf, bits, 12);
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- } else if (bit_buf >= 0x02000000) {
- tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00800000) {
- tab = DCT_13 + (UBITS (bit_buf, 13) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00200000) {
- tab = DCT_15 + (UBITS (bit_buf, 15) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else {
- tab = DCT_16 + UBITS (bit_buf, 16);
- bit_buf <<= 16;
- GETWORD (bit_buf, bits + 16, bit_ptr);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- }
- break; /* illegal, check needed to avoid buffer overflow */
- }
- dest[63] ^= mismatch & 16;
- DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */
- decoder->bitstream_buf = bit_buf;
- decoder->bitstream_bits = bits;
- decoder->bitstream_ptr = bit_ptr;
- return i;
-}
-
-static void get_mpeg1_intra_block (mpeg2_decoder_t * const decoder)
-{
- int i;
- int j;
- int val;
- const uint8_t * const scan = decoder->scan;
- const uint16_t * const quant_matrix = decoder->quantizer_matrix[0];
- const DCTtab * tab;
- uint32_t bit_buf;
- int bits;
- const uint8_t * bit_ptr;
- int16_t * const dest = decoder->DCTblock;
-
- i = 0;
-
- bit_buf = decoder->bitstream_buf;
- bits = decoder->bitstream_bits;
- bit_ptr = decoder->bitstream_ptr;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- while (1) {
- if (bit_buf >= 0x28000000) {
-
- tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5);
-
- i += tab->run;
- if (i >= 64)
- break; /* end of block */
-
- normal_code:
- j = scan[i];
- bit_buf <<= tab->len;
- bits += tab->len + 1;
- val = (tab->level * quant_matrix[j]) >> 4;
-
- /* oddification */
- val = (val - 1) | 1;
-
- /* if (bitstream_get (1)) val = -val; */
- val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
-
- SATURATE (val);
- dest[j] = val;
-
- bit_buf <<= 1;
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- } else if (bit_buf >= 0x04000000) {
-
- tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4);
-
- i += tab->run;
- if (i < 64)
- goto normal_code;
-
- /* escape code */
-
- i += UBITS (bit_buf << 6, 6) - 64;
- if (i >= 64)
- break; /* illegal, check needed to avoid buffer overflow */
-
- j = scan[i];
-
- DUMPBITS (bit_buf, bits, 12);
- NEEDBITS (bit_buf, bits, bit_ptr);
- val = SBITS (bit_buf, 8);
- if (! (val & 0x7f)) {
- DUMPBITS (bit_buf, bits, 8);
- val = UBITS (bit_buf, 8) + 2 * val;
- }
- val = (val * quant_matrix[j]) / 16;
-
- /* oddification */
- val = (val + ~SBITS (val, 1)) | 1;
-
- SATURATE (val);
- dest[j] = val;
-
- DUMPBITS (bit_buf, bits, 8);
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- } else if (bit_buf >= 0x02000000) {
- tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00800000) {
- tab = DCT_13 + (UBITS (bit_buf, 13) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00200000) {
- tab = DCT_15 + (UBITS (bit_buf, 15) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else {
- tab = DCT_16 + UBITS (bit_buf, 16);
- bit_buf <<= 16;
- GETWORD (bit_buf, bits + 16, bit_ptr);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- }
- break; /* illegal, check needed to avoid buffer overflow */
- }
- DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */
- decoder->bitstream_buf = bit_buf;
- decoder->bitstream_bits = bits;
- decoder->bitstream_ptr = bit_ptr;
-}
-
-static int get_mpeg1_non_intra_block (mpeg2_decoder_t * const decoder)
-{
- int i;
- int j;
- int val;
- const uint8_t * const scan = decoder->scan;
- const uint16_t * const quant_matrix = decoder->quantizer_matrix[1];
- const DCTtab * tab;
- uint32_t bit_buf;
- int bits;
- const uint8_t * bit_ptr;
- int16_t * const dest = decoder->DCTblock;
-
- i = -1;
-
- bit_buf = decoder->bitstream_buf;
- bits = decoder->bitstream_bits;
- bit_ptr = decoder->bitstream_ptr;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- if (bit_buf >= 0x28000000) {
- tab = DCT_B14DC_5 + (UBITS (bit_buf, 5) - 5);
- goto entry_1;
- } else
- goto entry_2;
-
- while (1) {
- if (bit_buf >= 0x28000000) {
-
- tab = DCT_B14AC_5 + (UBITS (bit_buf, 5) - 5);
-
- entry_1:
- i += tab->run;
- if (i >= 64)
- break; /* end of block */
-
- normal_code:
- j = scan[i];
- bit_buf <<= tab->len;
- bits += tab->len + 1;
- val = ((2 * tab->level + 1) * quant_matrix[j]) >> 5;
-
- /* oddification */
- val = (val - 1) | 1;
-
- /* if (bitstream_get (1)) val = -val; */
- val = (val ^ SBITS (bit_buf, 1)) - SBITS (bit_buf, 1);
-
- SATURATE (val);
- dest[j] = val;
-
- bit_buf <<= 1;
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- }
-
- entry_2:
- if (bit_buf >= 0x04000000) {
-
- tab = DCT_B14_8 + (UBITS (bit_buf, 8) - 4);
-
- i += tab->run;
- if (i < 64)
- goto normal_code;
-
- /* escape code */
-
- i += UBITS (bit_buf << 6, 6) - 64;
- if (i >= 64)
- break; /* illegal, check needed to avoid buffer overflow */
-
- j = scan[i];
-
- DUMPBITS (bit_buf, bits, 12);
- NEEDBITS (bit_buf, bits, bit_ptr);
- val = SBITS (bit_buf, 8);
- if (! (val & 0x7f)) {
- DUMPBITS (bit_buf, bits, 8);
- val = UBITS (bit_buf, 8) + 2 * val;
- }
- val = 2 * (val + SBITS (val, 1)) + 1;
- val = (val * quant_matrix[j]) / 32;
-
- /* oddification */
- val = (val + ~SBITS (val, 1)) | 1;
-
- SATURATE (val);
- dest[j] = val;
-
- DUMPBITS (bit_buf, bits, 8);
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- continue;
-
- } else if (bit_buf >= 0x02000000) {
- tab = DCT_B14_10 + (UBITS (bit_buf, 10) - 8);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00800000) {
- tab = DCT_13 + (UBITS (bit_buf, 13) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else if (bit_buf >= 0x00200000) {
- tab = DCT_15 + (UBITS (bit_buf, 15) - 16);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- } else {
- tab = DCT_16 + UBITS (bit_buf, 16);
- bit_buf <<= 16;
- GETWORD (bit_buf, bits + 16, bit_ptr);
- i += tab->run;
- if (i < 64)
- goto normal_code;
- }
- break; /* illegal, check needed to avoid buffer overflow */
- }
- DUMPBITS (bit_buf, bits, tab->len); /* dump end of block code */
- decoder->bitstream_buf = bit_buf;
- decoder->bitstream_bits = bits;
- decoder->bitstream_ptr = bit_ptr;
- return i;
-}
-
-static inline void slice_intra_DCT (mpeg2_decoder_t * const decoder,
- const int cc,
- uint8_t * const dest, const int stride)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
- NEEDBITS (bit_buf, bits, bit_ptr);
- /* Get the intra DC coefficient and inverse quantize it */
- if (cc == 0)
- decoder->DCTblock[0] =
- decoder->dc_dct_pred[0] += get_luma_dc_dct_diff (decoder);
- else
- decoder->DCTblock[0] =
- decoder->dc_dct_pred[cc] += get_chroma_dc_dct_diff (decoder);
-
- if (decoder->mpeg1) {
- if (decoder->coding_type != D_TYPE)
- get_mpeg1_intra_block (decoder);
- } else if (decoder->intra_vlc_format)
- get_intra_block_B15 (decoder, decoder->quantizer_matrix[cc ? 2 : 0]);
- else
- get_intra_block_B14 (decoder, decoder->quantizer_matrix[cc ? 2 : 0]);
- mpeg2_idct_copy (decoder->DCTblock, dest, stride);
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-static inline void slice_non_intra_DCT (mpeg2_decoder_t * const decoder,
- const int cc,
- uint8_t * const dest, const int stride)
-{
- int last;
-
- if (decoder->mpeg1)
- last = get_mpeg1_non_intra_block (decoder);
- else
- last = get_non_intra_block (decoder,
- decoder->quantizer_matrix[cc ? 3 : 1]);
- mpeg2_idct_add (last, decoder->DCTblock, dest, stride);
-}
-
-#define MOTION_420(table,ref,motion_x,motion_y,size,y) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y_ ## size)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \
- motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \
- ref[0] + (pos_x >> 1) + (pos_y >> 1) * decoder->stride, \
- decoder->stride, size); \
- motion_x /= 2; motion_y /= 2; \
- xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \
- offset = (((decoder->offset + motion_x) >> 1) + \
- ((((decoder->v_offset + motion_y) >> 1) + y/2) * \
- decoder->uv_stride)); \
- table[4+xy_half] (decoder->dest[1] + y/2 * decoder->uv_stride + \
- (decoder->offset >> 1), ref[1] + offset, \
- decoder->uv_stride, size/2); \
- table[4+xy_half] (decoder->dest[2] + y/2 * decoder->uv_stride + \
- (decoder->offset >> 1), ref[2] + offset, \
- decoder->uv_stride, size/2)
-
-#define MOTION_FIELD_420(table,ref,motion_x,motion_y,dest_field,op,src_field) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = decoder->v_offset + motion_y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
- motion_y = pos_y - decoder->v_offset; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \
- decoder->offset, \
- (ref[0] + (pos_x >> 1) + \
- ((pos_y op) + src_field) * decoder->stride), \
- 2 * decoder->stride, 8); \
- motion_x /= 2; motion_y /= 2; \
- xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \
- offset = (((decoder->offset + motion_x) >> 1) + \
- (((decoder->v_offset >> 1) + (motion_y op) + src_field) * \
- decoder->uv_stride)); \
- table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride + \
- (decoder->offset >> 1), ref[1] + offset, \
- 2 * decoder->uv_stride, 4); \
- table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride + \
- (decoder->offset >> 1), ref[2] + offset, \
- 2 * decoder->uv_stride, 4)
-
-#define MOTION_DMV_420(table,ref,motion_x,motion_y) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = decoder->v_offset + motion_y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
- motion_y = pos_y - decoder->v_offset; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \
- table[xy_half] (decoder->dest[0] + decoder->offset, \
- ref[0] + offset, 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \
- ref[0] + decoder->stride + offset, \
- 2 * decoder->stride, 8); \
- motion_x /= 2; motion_y /= 2; \
- xy_half = ((motion_y & 1) << 1) | (motion_x & 1); \
- offset = (((decoder->offset + motion_x) >> 1) + \
- (((decoder->v_offset >> 1) + (motion_y & ~1)) * \
- decoder->uv_stride)); \
- table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1), \
- ref[1] + offset, 2 * decoder->uv_stride, 4); \
- table[4+xy_half] (decoder->dest[1] + decoder->uv_stride + \
- (decoder->offset >> 1), \
- ref[1] + decoder->uv_stride + offset, \
- 2 * decoder->uv_stride, 4); \
- table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1), \
- ref[2] + offset, 2 * decoder->uv_stride, 4); \
- table[4+xy_half] (decoder->dest[2] + decoder->uv_stride + \
- (decoder->offset >> 1), \
- ref[2] + decoder->uv_stride + offset, \
- 2 * decoder->uv_stride, 4)
-
-#define MOTION_ZERO_420(table,ref) \
- table[0] (decoder->dest[0] + decoder->offset, \
- (ref[0] + decoder->offset + \
- decoder->v_offset * decoder->stride), decoder->stride, 16); \
- offset = ((decoder->offset >> 1) + \
- (decoder->v_offset >> 1) * decoder->uv_stride); \
- table[4] (decoder->dest[1] + (decoder->offset >> 1), \
- ref[1] + offset, decoder->uv_stride, 8); \
- table[4] (decoder->dest[2] + (decoder->offset >> 1), \
- ref[2] + offset, decoder->uv_stride, 8)
-
-#define MOTION_422(table,ref,motion_x,motion_y,size,y) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y_ ## size)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \
- motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride; \
- table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \
- ref[0] + offset, decoder->stride, size); \
- offset = (offset + (motion_x & (motion_x < 0))) >> 1; \
- motion_x /= 2; \
- xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \
- table[4+xy_half] (decoder->dest[1] + y * decoder->uv_stride + \
- (decoder->offset >> 1), ref[1] + offset, \
- decoder->uv_stride, size); \
- table[4+xy_half] (decoder->dest[2] + y * decoder->uv_stride + \
- (decoder->offset >> 1), ref[2] + offset, \
- decoder->uv_stride, size)
-
-#define MOTION_FIELD_422(table,ref,motion_x,motion_y,dest_field,op,src_field) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = decoder->v_offset + motion_y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
- motion_y = pos_y - decoder->v_offset; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride; \
- table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \
- decoder->offset, ref[0] + offset, \
- 2 * decoder->stride, 8); \
- offset = (offset + (motion_x & (motion_x < 0))) >> 1; \
- motion_x /= 2; \
- xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \
- table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride + \
- (decoder->offset >> 1), ref[1] + offset, \
- 2 * decoder->uv_stride, 8); \
- table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride + \
- (decoder->offset >> 1), ref[2] + offset, \
- 2 * decoder->uv_stride, 8)
-
-#define MOTION_DMV_422(table,ref,motion_x,motion_y) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = decoder->v_offset + motion_y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
- motion_y = pos_y - decoder->v_offset; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \
- table[xy_half] (decoder->dest[0] + decoder->offset, \
- ref[0] + offset, 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \
- ref[0] + decoder->stride + offset, \
- 2 * decoder->stride, 8); \
- offset = (offset + (motion_x & (motion_x < 0))) >> 1; \
- motion_x /= 2; \
- xy_half = ((pos_y & 1) << 1) | (motion_x & 1); \
- table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1), \
- ref[1] + offset, 2 * decoder->uv_stride, 8); \
- table[4+xy_half] (decoder->dest[1] + decoder->uv_stride + \
- (decoder->offset >> 1), \
- ref[1] + decoder->uv_stride + offset, \
- 2 * decoder->uv_stride, 8); \
- table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1), \
- ref[2] + offset, 2 * decoder->uv_stride, 8); \
- table[4+xy_half] (decoder->dest[2] + decoder->uv_stride + \
- (decoder->offset >> 1), \
- ref[2] + decoder->uv_stride + offset, \
- 2 * decoder->uv_stride, 8)
-
-#define MOTION_ZERO_422(table,ref) \
- offset = decoder->offset + decoder->v_offset * decoder->stride; \
- table[0] (decoder->dest[0] + decoder->offset, \
- ref[0] + offset, decoder->stride, 16); \
- offset >>= 1; \
- table[4] (decoder->dest[1] + (decoder->offset >> 1), \
- ref[1] + offset, decoder->uv_stride, 16); \
- table[4] (decoder->dest[2] + (decoder->offset >> 1), \
- ref[2] + offset, decoder->uv_stride, 16)
-
-#define MOTION_444(table,ref,motion_x,motion_y,size,y) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = 2 * decoder->v_offset + motion_y + 2 * y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y_ ## size)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size; \
- motion_y = pos_y - 2 * decoder->v_offset - 2 * y; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride; \
- table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \
- ref[0] + offset, decoder->stride, size); \
- table[xy_half] (decoder->dest[1] + y * decoder->stride + decoder->offset, \
- ref[1] + offset, decoder->stride, size); \
- table[xy_half] (decoder->dest[2] + y * decoder->stride + decoder->offset, \
- ref[2] + offset, decoder->stride, size)
-
-#define MOTION_FIELD_444(table,ref,motion_x,motion_y,dest_field,op,src_field) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = decoder->v_offset + motion_y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
- motion_y = pos_y - decoder->v_offset; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride; \
- table[xy_half] (decoder->dest[0] + dest_field * decoder->stride + \
- decoder->offset, ref[0] + offset, \
- 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[1] + dest_field * decoder->stride + \
- decoder->offset, ref[1] + offset, \
- 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[2] + dest_field * decoder->stride + \
- decoder->offset, ref[2] + offset, \
- 2 * decoder->stride, 8)
-
-#define MOTION_DMV_444(table,ref,motion_x,motion_y) \
- pos_x = 2 * decoder->offset + motion_x; \
- pos_y = decoder->v_offset + motion_y; \
- if (unlikely (pos_x > decoder->limit_x)) { \
- pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x; \
- motion_x = pos_x - 2 * decoder->offset; \
- } \
- if (unlikely (pos_y > decoder->limit_y)) { \
- pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y; \
- motion_y = pos_y - decoder->v_offset; \
- } \
- xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \
- offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride; \
- table[xy_half] (decoder->dest[0] + decoder->offset, \
- ref[0] + offset, 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset, \
- ref[0] + decoder->stride + offset, \
- 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[1] + decoder->offset, \
- ref[1] + offset, 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[1] + decoder->stride + decoder->offset, \
- ref[1] + decoder->stride + offset, \
- 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[2] + decoder->offset, \
- ref[2] + offset, 2 * decoder->stride, 8); \
- table[xy_half] (decoder->dest[2] + decoder->stride + decoder->offset, \
- ref[2] + decoder->stride + offset, \
- 2 * decoder->stride, 8)
-
-#define MOTION_ZERO_444(table,ref) \
- offset = decoder->offset + decoder->v_offset * decoder->stride; \
- table[0] (decoder->dest[0] + decoder->offset, \
- ref[0] + offset, decoder->stride, 16); \
- table[4] (decoder->dest[1] + decoder->offset, \
- ref[1] + offset, decoder->stride, 16); \
- table[4] (decoder->dest[2] + decoder->offset, \
- ref[2] + offset, decoder->stride, 16)
-
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
-
-static void motion_mp1 (mpeg2_decoder_t * const decoder,
- motion_t * const motion,
- mpeg2_mc_fct * const * const table)
-{
- int motion_x, motion_y;
- unsigned int pos_x, pos_y, xy_half, offset;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- motion_x = (motion->pmv[0][0] +
- (get_motion_delta (decoder,
- motion->f_code[0]) << motion->f_code[1]));
- motion_x = bound_motion_vector (motion_x,
- motion->f_code[0] + motion->f_code[1]);
- motion->pmv[0][0] = motion_x;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- motion_y = (motion->pmv[0][1] +
- (get_motion_delta (decoder,
- motion->f_code[0]) << motion->f_code[1]));
- motion_y = bound_motion_vector (motion_y,
- motion->f_code[0] + motion->f_code[1]);
- motion->pmv[0][1] = motion_y;
-
- MOTION_420 (table, motion->ref[0], motion_x, motion_y, 16, 0);
-}
-
-#define MOTION_FUNCTIONS(FORMAT,MOTION,MOTION_FIELD,MOTION_DMV,MOTION_ZERO) \
- \
-static void motion_fr_frame_##FORMAT (mpeg2_decoder_t * const decoder, \
- motion_t * const motion, \
- mpeg2_mc_fct * const * const table) \
-{ \
- int motion_x, motion_y; \
- unsigned int pos_x, pos_y, xy_half, offset; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
- motion->f_code[0]); \
- motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
- motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \
- motion->f_code[1]); \
- motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
- motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \
- \
- MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0); \
-} \
- \
-static void motion_fr_field_##FORMAT (mpeg2_decoder_t * const decoder, \
- motion_t * const motion, \
- mpeg2_mc_fct * const * const table) \
-{ \
- int motion_x, motion_y, field; \
- unsigned int pos_x, pos_y, xy_half, offset; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- field = UBITS (bit_buf, 1); \
- DUMPBITS (bit_buf, bits, 1); \
- \
- motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
- motion->f_code[0]); \
- motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
- motion->pmv[0][0] = motion_x; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_y = ((motion->pmv[0][1] >> 1) + \
- get_motion_delta (decoder, motion->f_code[1])); \
- /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \
- motion->pmv[0][1] = motion_y << 1; \
- \
- MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 0, & ~1, field); \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- field = UBITS (bit_buf, 1); \
- DUMPBITS (bit_buf, bits, 1); \
- \
- motion_x = motion->pmv[1][0] + get_motion_delta (decoder, \
- motion->f_code[0]); \
- motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
- motion->pmv[1][0] = motion_x; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_y = ((motion->pmv[1][1] >> 1) + \
- get_motion_delta (decoder, motion->f_code[1])); \
- /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \
- motion->pmv[1][1] = motion_y << 1; \
- \
- MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 1, & ~1, field); \
-} \
- \
-static void motion_fr_dmv_##FORMAT (mpeg2_decoder_t * const decoder, \
- motion_t * const motion, \
- mpeg2_mc_fct * const * const table) \
-{ \
- int motion_x, motion_y, dmv_x, dmv_y, m, other_x, other_y; \
- unsigned int pos_x, pos_y, xy_half, offset; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
- motion->f_code[0]); \
- motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
- motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- dmv_x = get_dmv (decoder); \
- \
- motion_y = ((motion->pmv[0][1] >> 1) + \
- get_motion_delta (decoder, motion->f_code[1])); \
- /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */ \
- motion->pmv[1][1] = motion->pmv[0][1] = motion_y << 1; \
- dmv_y = get_dmv (decoder); \
- \
- m = decoder->top_field_first ? 1 : 3; \
- other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x; \
- other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y - 1; \
- MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 0, | 1, 0); \
- \
- m = decoder->top_field_first ? 3 : 1; \
- other_x = ((motion_x * m + (motion_x > 0)) >> 1) + dmv_x; \
- other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y + 1; \
- MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 1, & ~1, 0);\
- \
- MOTION_DMV (mpeg2_mc.avg, motion->ref[0], motion_x, motion_y); \
-} \
- \
-static void motion_reuse_##FORMAT (mpeg2_decoder_t * const decoder, \
- motion_t * const motion, \
- mpeg2_mc_fct * const * const table) \
-{ \
- int motion_x, motion_y; \
- unsigned int pos_x, pos_y, xy_half, offset; \
- \
- motion_x = motion->pmv[0][0]; \
- motion_y = motion->pmv[0][1]; \
- \
- MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0); \
-} \
- \
-static void motion_zero_##FORMAT (mpeg2_decoder_t * const decoder, \
- motion_t * const motion, \
- mpeg2_mc_fct * const * const table) \
-{ \
- unsigned int offset; \
- \
- motion->pmv[0][0] = motion->pmv[0][1] = 0; \
- motion->pmv[1][0] = motion->pmv[1][1] = 0; \
- \
- MOTION_ZERO (table, motion->ref[0]); \
-} \
- \
-static void motion_fi_field_##FORMAT (mpeg2_decoder_t * const decoder, \
- motion_t * const motion, \
- mpeg2_mc_fct * const * const table) \
-{ \
- int motion_x, motion_y; \
- uint8_t ** ref_field; \
- unsigned int pos_x, pos_y, xy_half, offset; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- ref_field = motion->ref2[UBITS (bit_buf, 1)]; \
- DUMPBITS (bit_buf, bits, 1); \
- \
- motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
- motion->f_code[0]); \
- motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
- motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \
- motion->f_code[1]); \
- motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
- motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \
- \
- MOTION (table, ref_field, motion_x, motion_y, 16, 0); \
-} \
- \
-static void motion_fi_16x8_##FORMAT (mpeg2_decoder_t * const decoder, \
- motion_t * const motion, \
- mpeg2_mc_fct * const * const table) \
-{ \
- int motion_x, motion_y; \
- uint8_t ** ref_field; \
- unsigned int pos_x, pos_y, xy_half, offset; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- ref_field = motion->ref2[UBITS (bit_buf, 1)]; \
- DUMPBITS (bit_buf, bits, 1); \
- \
- motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
- motion->f_code[0]); \
- motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
- motion->pmv[0][0] = motion_x; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \
- motion->f_code[1]); \
- motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
- motion->pmv[0][1] = motion_y; \
- \
- MOTION (table, ref_field, motion_x, motion_y, 8, 0); \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- ref_field = motion->ref2[UBITS (bit_buf, 1)]; \
- DUMPBITS (bit_buf, bits, 1); \
- \
- motion_x = motion->pmv[1][0] + get_motion_delta (decoder, \
- motion->f_code[0]); \
- motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
- motion->pmv[1][0] = motion_x; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_y = motion->pmv[1][1] + get_motion_delta (decoder, \
- motion->f_code[1]); \
- motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
- motion->pmv[1][1] = motion_y; \
- \
- MOTION (table, ref_field, motion_x, motion_y, 8, 8); \
-} \
- \
-static void motion_fi_dmv_##FORMAT (mpeg2_decoder_t * const decoder, \
- motion_t * const motion, \
- mpeg2_mc_fct * const * const table) \
-{ \
- int motion_x, motion_y, other_x, other_y; \
- unsigned int pos_x, pos_y, xy_half, offset; \
- \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- motion_x = motion->pmv[0][0] + get_motion_delta (decoder, \
- motion->f_code[0]); \
- motion_x = bound_motion_vector (motion_x, motion->f_code[0]); \
- motion->pmv[1][0] = motion->pmv[0][0] = motion_x; \
- NEEDBITS (bit_buf, bits, bit_ptr); \
- other_x = ((motion_x + (motion_x > 0)) >> 1) + get_dmv (decoder); \
- \
- motion_y = motion->pmv[0][1] + get_motion_delta (decoder, \
- motion->f_code[1]); \
- motion_y = bound_motion_vector (motion_y, motion->f_code[1]); \
- motion->pmv[1][1] = motion->pmv[0][1] = motion_y; \
- other_y = (((motion_y + (motion_y > 0)) >> 1) + get_dmv (decoder) + \
- decoder->dmv_offset); \
- \
- MOTION (mpeg2_mc.put, motion->ref[0], motion_x, motion_y, 16, 0); \
- MOTION (mpeg2_mc.avg, motion->ref[1], other_x, other_y, 16, 0); \
-} \
-
-MOTION_FUNCTIONS (420, MOTION_420, MOTION_FIELD_420, MOTION_DMV_420,
- MOTION_ZERO_420)
-MOTION_FUNCTIONS (422, MOTION_422, MOTION_FIELD_422, MOTION_DMV_422,
- MOTION_ZERO_422)
-MOTION_FUNCTIONS (444, MOTION_444, MOTION_FIELD_444, MOTION_DMV_444,
- MOTION_ZERO_444)
-
-/* like motion_frame, but parsing without actual motion compensation */
-static void motion_fr_conceal (mpeg2_decoder_t * const decoder)
-{
- int tmp;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- tmp = (decoder->f_motion.pmv[0][0] +
- get_motion_delta (decoder, decoder->f_motion.f_code[0]));
- tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[0]);
- decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[0][0] = tmp;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- tmp = (decoder->f_motion.pmv[0][1] +
- get_motion_delta (decoder, decoder->f_motion.f_code[1]));
- tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[1]);
- decoder->f_motion.pmv[1][1] = decoder->f_motion.pmv[0][1] = tmp;
-
- DUMPBITS (bit_buf, bits, 1); /* remove marker_bit */
-}
-
-static void motion_fi_conceal (mpeg2_decoder_t * const decoder)
-{
- int tmp;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- DUMPBITS (bit_buf, bits, 1); /* remove field_select */
-
- tmp = (decoder->f_motion.pmv[0][0] +
- get_motion_delta (decoder, decoder->f_motion.f_code[0]));
- tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[0]);
- decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[0][0] = tmp;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- tmp = (decoder->f_motion.pmv[0][1] +
- get_motion_delta (decoder, decoder->f_motion.f_code[1]));
- tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[1]);
- decoder->f_motion.pmv[1][1] = decoder->f_motion.pmv[0][1] = tmp;
-
- DUMPBITS (bit_buf, bits, 1); /* remove marker_bit */
-}
-
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-
-#define MOTION_CALL(routine,direction) \
-do { \
- if ((direction) & MACROBLOCK_MOTION_FORWARD) \
- routine (decoder, &(decoder->f_motion), mpeg2_mc.put); \
- if ((direction) & MACROBLOCK_MOTION_BACKWARD) \
- routine (decoder, &(decoder->b_motion), \
- ((direction) & MACROBLOCK_MOTION_FORWARD ? \
- mpeg2_mc.avg : mpeg2_mc.put)); \
-} while (0)
-
-#define NEXT_MACROBLOCK \
-do { \
- if(decoder->quant_store) { \
- if (decoder->picture_structure == TOP_FIELD) \
- decoder->quant_store[2 * decoder->quant_stride \
- * (decoder->v_offset >> 4) \
- + (decoder->offset >> 4)] \
- = decoder->quantizer_scale; \
- else if (decoder->picture_structure == BOTTOM_FIELD) \
- decoder->quant_store[2 * decoder->quant_stride \
- * (decoder->v_offset >> 4) \
- + decoder->quant_stride \
- + (decoder->offset >> 4)] \
- = decoder->quantizer_scale; \
- else \
- decoder->quant_store[decoder->quant_stride \
- * (decoder->v_offset >> 4) \
- + (decoder->offset >> 4)] \
- = decoder->quantizer_scale; \
- } \
- decoder->offset += 16; \
- if (decoder->offset == decoder->width) { \
- do { /* just so we can use the break statement */ \
- if (decoder->convert) { \
- decoder->convert (decoder->convert_id, decoder->dest, \
- decoder->v_offset); \
- if (decoder->coding_type == B_TYPE) \
- break; \
- } \
- decoder->dest[0] += decoder->slice_stride; \
- decoder->dest[1] += decoder->slice_uv_stride; \
- decoder->dest[2] += decoder->slice_uv_stride; \
- } while (0); \
- decoder->v_offset += 16; \
- if (decoder->v_offset > decoder->limit_y) { \
- if (mpeg2_cpu_state_restore) \
- mpeg2_cpu_state_restore (&cpu_state); \
- return; \
- } \
- decoder->offset = 0; \
- } \
-} while (0)
-
-/**
- * Dummy motion decoding function, to avoid calling NULL in
- * case of malformed streams.
- */
-static void motion_dummy (mpeg2_decoder_t * const decoder,
- motion_t * const motion,
- mpeg2_mc_fct * const * const table)
-{
-}
-
-void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3],
- uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3])
-{
- int offset, stride, height, bottom_field;
-
- stride = decoder->stride_frame;
- bottom_field = (decoder->picture_structure == BOTTOM_FIELD);
- offset = bottom_field ? stride : 0;
- height = decoder->height;
-
- decoder->picture_dest[0] = current_fbuf[0] + offset;
- decoder->picture_dest[1] = current_fbuf[1] + (offset >> 1);
- decoder->picture_dest[2] = current_fbuf[2] + (offset >> 1);
-
- decoder->f_motion.ref[0][0] = forward_fbuf[0] + offset;
- decoder->f_motion.ref[0][1] = forward_fbuf[1] + (offset >> 1);
- decoder->f_motion.ref[0][2] = forward_fbuf[2] + (offset >> 1);
-
- decoder->b_motion.ref[0][0] = backward_fbuf[0] + offset;
- decoder->b_motion.ref[0][1] = backward_fbuf[1] + (offset >> 1);
- decoder->b_motion.ref[0][2] = backward_fbuf[2] + (offset >> 1);
-
- if (decoder->picture_structure != FRAME_PICTURE) {
- decoder->dmv_offset = bottom_field ? 1 : -1;
- decoder->f_motion.ref2[0] = decoder->f_motion.ref[bottom_field];
- decoder->f_motion.ref2[1] = decoder->f_motion.ref[!bottom_field];
- decoder->b_motion.ref2[0] = decoder->b_motion.ref[bottom_field];
- decoder->b_motion.ref2[1] = decoder->b_motion.ref[!bottom_field];
- offset = stride - offset;
-
- if (decoder->second_field && (decoder->coding_type != B_TYPE))
- forward_fbuf = current_fbuf;
-
- decoder->f_motion.ref[1][0] = forward_fbuf[0] + offset;
- decoder->f_motion.ref[1][1] = forward_fbuf[1] + (offset >> 1);
- decoder->f_motion.ref[1][2] = forward_fbuf[2] + (offset >> 1);
-
- decoder->b_motion.ref[1][0] = backward_fbuf[0] + offset;
- decoder->b_motion.ref[1][1] = backward_fbuf[1] + (offset >> 1);
- decoder->b_motion.ref[1][2] = backward_fbuf[2] + (offset >> 1);
-
- stride <<= 1;
- height >>= 1;
- }
-
- decoder->stride = stride;
- decoder->uv_stride = stride >> 1;
- decoder->slice_stride = 16 * stride;
- decoder->slice_uv_stride =
- decoder->slice_stride >> (2 - decoder->chroma_format);
- decoder->limit_x = 2 * decoder->width - 32;
- decoder->limit_y_16 = 2 * height - 32;
- decoder->limit_y_8 = 2 * height - 16;
- decoder->limit_y = height - 16;
-
- if (decoder->mpeg1) {
- decoder->motion_parser[0] = motion_zero_420;
- decoder->motion_parser[MC_FIELD] = motion_dummy;
- decoder->motion_parser[MC_FRAME] = motion_mp1;
- decoder->motion_parser[MC_DMV] = motion_dummy;
- decoder->motion_parser[4] = motion_reuse_420;
- } else if (decoder->picture_structure == FRAME_PICTURE) {
- if (decoder->chroma_format == 0) {
- decoder->motion_parser[0] = motion_zero_420;
- decoder->motion_parser[MC_FIELD] = motion_fr_field_420;
- decoder->motion_parser[MC_FRAME] = motion_fr_frame_420;
- decoder->motion_parser[MC_DMV] = motion_fr_dmv_420;
- decoder->motion_parser[4] = motion_reuse_420;
- } else if (decoder->chroma_format == 1) {
- decoder->motion_parser[0] = motion_zero_422;
- decoder->motion_parser[MC_FIELD] = motion_fr_field_422;
- decoder->motion_parser[MC_FRAME] = motion_fr_frame_422;
- decoder->motion_parser[MC_DMV] = motion_fr_dmv_422;
- decoder->motion_parser[4] = motion_reuse_422;
- } else {
- decoder->motion_parser[0] = motion_zero_444;
- decoder->motion_parser[MC_FIELD] = motion_fr_field_444;
- decoder->motion_parser[MC_FRAME] = motion_fr_frame_444;
- decoder->motion_parser[MC_DMV] = motion_fr_dmv_444;
- decoder->motion_parser[4] = motion_reuse_444;
- }
- } else {
- if (decoder->chroma_format == 0) {
- decoder->motion_parser[0] = motion_zero_420;
- decoder->motion_parser[MC_FIELD] = motion_fi_field_420;
- decoder->motion_parser[MC_16X8] = motion_fi_16x8_420;
- decoder->motion_parser[MC_DMV] = motion_fi_dmv_420;
- decoder->motion_parser[4] = motion_reuse_420;
- } else if (decoder->chroma_format == 1) {
- decoder->motion_parser[0] = motion_zero_422;
- decoder->motion_parser[MC_FIELD] = motion_fi_field_422;
- decoder->motion_parser[MC_16X8] = motion_fi_16x8_422;
- decoder->motion_parser[MC_DMV] = motion_fi_dmv_422;
- decoder->motion_parser[4] = motion_reuse_422;
- } else {
- decoder->motion_parser[0] = motion_zero_444;
- decoder->motion_parser[MC_FIELD] = motion_fi_field_444;
- decoder->motion_parser[MC_16X8] = motion_fi_16x8_444;
- decoder->motion_parser[MC_DMV] = motion_fi_dmv_444;
- decoder->motion_parser[4] = motion_reuse_444;
- }
- }
-}
-
-static inline int slice_init (mpeg2_decoder_t * const decoder, int code)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
- int offset;
- const MBAtab * mba;
-
- decoder->dc_dct_pred[0] = decoder->dc_dct_pred[1] =
- decoder->dc_dct_pred[2] = 16384;
-
- decoder->f_motion.pmv[0][0] = decoder->f_motion.pmv[0][1] = 0;
- decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[1][1] = 0;
- decoder->b_motion.pmv[0][0] = decoder->b_motion.pmv[0][1] = 0;
- decoder->b_motion.pmv[1][0] = decoder->b_motion.pmv[1][1] = 0;
-
- if (decoder->vertical_position_extension) {
- code += UBITS (bit_buf, 3) << 7;
- DUMPBITS (bit_buf, bits, 3);
- }
- decoder->v_offset = (code - 1) * 16;
- offset = 0;
- if (!(decoder->convert) || decoder->coding_type != B_TYPE)
- offset = (code - 1) * decoder->slice_stride;
-
- decoder->dest[0] = decoder->picture_dest[0] + offset;
- offset >>= (2 - decoder->chroma_format);
- decoder->dest[1] = decoder->picture_dest[1] + offset;
- decoder->dest[2] = decoder->picture_dest[2] + offset;
-
- get_quantizer_scale (decoder);
-
- /* ignore intra_slice and all the extra data */
- while (bit_buf & 0x80000000) {
- DUMPBITS (bit_buf, bits, 9);
- NEEDBITS (bit_buf, bits, bit_ptr);
- }
-
- /* decode initial macroblock address increment */
- offset = 0;
- while (1) {
- if (bit_buf >= 0x08000000) {
- mba = MBA_5 + (UBITS (bit_buf, 6) - 2);
- break;
- } else if (bit_buf >= 0x01800000) {
- mba = MBA_11 + (UBITS (bit_buf, 12) - 24);
- break;
- } else switch (UBITS (bit_buf, 12)) {
- case 8: /* macroblock_escape */
- offset += 33;
- DUMPBITS (bit_buf, bits, 11);
- NEEDBITS (bit_buf, bits, bit_ptr);
- continue;
- case 15: /* macroblock_stuffing (MPEG1 only) */
- bit_buf &= 0xfffff;
- DUMPBITS (bit_buf, bits, 11);
- NEEDBITS (bit_buf, bits, bit_ptr);
- continue;
- default: /* error */
- return 1;
- }
- }
- DUMPBITS (bit_buf, bits, mba->len + 1);
- decoder->offset = (offset + mba->mba) << 4;
-
- while (decoder->offset - decoder->width >= 0) {
- decoder->offset -= decoder->width;
- if (!(decoder->convert) || decoder->coding_type != B_TYPE) {
- decoder->dest[0] += decoder->slice_stride;
- decoder->dest[1] += decoder->slice_uv_stride;
- decoder->dest[2] += decoder->slice_uv_stride;
- }
- decoder->v_offset += 16;
- }
- if (decoder->v_offset > decoder->limit_y)
- return 1;
-
- return 0;
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
-
-void mpeg2_slice (mpeg2_decoder_t * const decoder, const int code,
- const uint8_t * const buffer)
-{
-#define bit_buf (decoder->bitstream_buf)
-#define bits (decoder->bitstream_bits)
-#define bit_ptr (decoder->bitstream_ptr)
- cpu_state_t cpu_state;
-
- bitstream_init (decoder, buffer);
-
- if (slice_init (decoder, code))
- return;
-
- if (mpeg2_cpu_state_save)
- mpeg2_cpu_state_save (&cpu_state);
-
- while (1) {
- int macroblock_modes;
- int mba_inc;
- const MBAtab * mba;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
-
- macroblock_modes = get_macroblock_modes (decoder);
-
- /* maybe integrate MACROBLOCK_QUANT test into get_macroblock_modes ? */
- if (macroblock_modes & MACROBLOCK_QUANT)
- get_quantizer_scale (decoder);
-
- if (macroblock_modes & MACROBLOCK_INTRA) {
-
- int DCT_offset, DCT_stride;
- int offset;
- uint8_t * dest_y;
-
- if (decoder->concealment_motion_vectors) {
- if (decoder->picture_structure == FRAME_PICTURE)
- motion_fr_conceal (decoder);
- else
- motion_fi_conceal (decoder);
- } else {
- decoder->f_motion.pmv[0][0] = decoder->f_motion.pmv[0][1] = 0;
- decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[1][1] = 0;
- decoder->b_motion.pmv[0][0] = decoder->b_motion.pmv[0][1] = 0;
- decoder->b_motion.pmv[1][0] = decoder->b_motion.pmv[1][1] = 0;
- }
-
- if (macroblock_modes & DCT_TYPE_INTERLACED) {
- DCT_offset = decoder->stride;
- DCT_stride = decoder->stride * 2;
- } else {
- DCT_offset = decoder->stride * 8;
- DCT_stride = decoder->stride;
- }
-
- offset = decoder->offset;
- dest_y = decoder->dest[0] + offset;
- slice_intra_DCT (decoder, 0, dest_y, DCT_stride);
- slice_intra_DCT (decoder, 0, dest_y + 8, DCT_stride);
- slice_intra_DCT (decoder, 0, dest_y + DCT_offset, DCT_stride);
- slice_intra_DCT (decoder, 0, dest_y + DCT_offset + 8, DCT_stride);
- if (likely (decoder->chroma_format == 0)) {
- slice_intra_DCT (decoder, 1, decoder->dest[1] + (offset >> 1),
- decoder->uv_stride);
- slice_intra_DCT (decoder, 2, decoder->dest[2] + (offset >> 1),
- decoder->uv_stride);
- if (decoder->coding_type == D_TYPE) {
- NEEDBITS (bit_buf, bits, bit_ptr);
- DUMPBITS (bit_buf, bits, 1);
- }
- } else if (likely (decoder->chroma_format == 1)) {
- uint8_t * dest_u = decoder->dest[1] + (offset >> 1);
- uint8_t * dest_v = decoder->dest[2] + (offset >> 1);
- DCT_stride >>= 1;
- DCT_offset >>= 1;
- slice_intra_DCT (decoder, 1, dest_u, DCT_stride);
- slice_intra_DCT (decoder, 2, dest_v, DCT_stride);
- slice_intra_DCT (decoder, 1, dest_u + DCT_offset, DCT_stride);
- slice_intra_DCT (decoder, 2, dest_v + DCT_offset, DCT_stride);
- } else {
- uint8_t * dest_u = decoder->dest[1] + offset;
- uint8_t * dest_v = decoder->dest[2] + offset;
- slice_intra_DCT (decoder, 1, dest_u, DCT_stride);
- slice_intra_DCT (decoder, 2, dest_v, DCT_stride);
- slice_intra_DCT (decoder, 1, dest_u + DCT_offset, DCT_stride);
- slice_intra_DCT (decoder, 2, dest_v + DCT_offset, DCT_stride);
- slice_intra_DCT (decoder, 1, dest_u + 8, DCT_stride);
- slice_intra_DCT (decoder, 2, dest_v + 8, DCT_stride);
- slice_intra_DCT (decoder, 1, dest_u + DCT_offset + 8,
- DCT_stride);
- slice_intra_DCT (decoder, 2, dest_v + DCT_offset + 8,
- DCT_stride);
- }
- } else {
-
- motion_parser_t * parser;
-
- if ( ((macroblock_modes >> MOTION_TYPE_SHIFT) < 0)
- || ((macroblock_modes >> MOTION_TYPE_SHIFT) >=
- (int)(sizeof(decoder->motion_parser)
- / sizeof(decoder->motion_parser[0])))
- ) {
- break; // Illegal !
- }
-
- parser =
- decoder->motion_parser[macroblock_modes >> MOTION_TYPE_SHIFT];
- MOTION_CALL (parser, macroblock_modes);
-
- if (macroblock_modes & MACROBLOCK_PATTERN) {
- int coded_block_pattern;
- int DCT_offset, DCT_stride;
-
- if (macroblock_modes & DCT_TYPE_INTERLACED) {
- DCT_offset = decoder->stride;
- DCT_stride = decoder->stride * 2;
- } else {
- DCT_offset = decoder->stride * 8;
- DCT_stride = decoder->stride;
- }
-
- coded_block_pattern = get_coded_block_pattern (decoder);
-
- if (likely (decoder->chroma_format == 0)) {
- int offset = decoder->offset;
- uint8_t * dest_y = decoder->dest[0] + offset;
- if (coded_block_pattern & 1)
- slice_non_intra_DCT (decoder, 0, dest_y, DCT_stride);
- if (coded_block_pattern & 2)
- slice_non_intra_DCT (decoder, 0, dest_y + 8,
- DCT_stride);
- if (coded_block_pattern & 4)
- slice_non_intra_DCT (decoder, 0, dest_y + DCT_offset,
- DCT_stride);
- if (coded_block_pattern & 8)
- slice_non_intra_DCT (decoder, 0,
- dest_y + DCT_offset + 8,
- DCT_stride);
- if (coded_block_pattern & 16)
- slice_non_intra_DCT (decoder, 1,
- decoder->dest[1] + (offset >> 1),
- decoder->uv_stride);
- if (coded_block_pattern & 32)
- slice_non_intra_DCT (decoder, 2,
- decoder->dest[2] + (offset >> 1),
- decoder->uv_stride);
- } else if (likely (decoder->chroma_format == 1)) {
- int offset;
- uint8_t * dest_y;
-
- coded_block_pattern |= bit_buf & (3 << 30);
- DUMPBITS (bit_buf, bits, 2);
-
- offset = decoder->offset;
- dest_y = decoder->dest[0] + offset;
- if (coded_block_pattern & 1)
- slice_non_intra_DCT (decoder, 0, dest_y, DCT_stride);
- if (coded_block_pattern & 2)
- slice_non_intra_DCT (decoder, 0, dest_y + 8,
- DCT_stride);
- if (coded_block_pattern & 4)
- slice_non_intra_DCT (decoder, 0, dest_y + DCT_offset,
- DCT_stride);
- if (coded_block_pattern & 8)
- slice_non_intra_DCT (decoder, 0,
- dest_y + DCT_offset + 8,
- DCT_stride);
-
- DCT_stride >>= 1;
- DCT_offset = (DCT_offset + offset) >> 1;
- if (coded_block_pattern & 16)
- slice_non_intra_DCT (decoder, 1,
- decoder->dest[1] + (offset >> 1),
- DCT_stride);
- if (coded_block_pattern & 32)
- slice_non_intra_DCT (decoder, 2,
- decoder->dest[2] + (offset >> 1),
- DCT_stride);
- if (coded_block_pattern & (2 << 30))
- slice_non_intra_DCT (decoder, 1,
- decoder->dest[1] + DCT_offset,
- DCT_stride);
- if (coded_block_pattern & (1 << 30))
- slice_non_intra_DCT (decoder, 2,
- decoder->dest[2] + DCT_offset,
- DCT_stride);
- } else {
- int offset;
- uint8_t * dest_y, * dest_u, * dest_v;
-
- coded_block_pattern |= bit_buf & (63 << 26);
- DUMPBITS (bit_buf, bits, 6);
-
- offset = decoder->offset;
- dest_y = decoder->dest[0] + offset;
- dest_u = decoder->dest[1] + offset;
- dest_v = decoder->dest[2] + offset;
-
- if (coded_block_pattern & 1)
- slice_non_intra_DCT (decoder, 0, dest_y, DCT_stride);
- if (coded_block_pattern & 2)
- slice_non_intra_DCT (decoder, 0, dest_y + 8,
- DCT_stride);
- if (coded_block_pattern & 4)
- slice_non_intra_DCT (decoder, 0, dest_y + DCT_offset,
- DCT_stride);
- if (coded_block_pattern & 8)
- slice_non_intra_DCT (decoder, 0,
- dest_y + DCT_offset + 8,
- DCT_stride);
-
- if (coded_block_pattern & 16)
- slice_non_intra_DCT (decoder, 1, dest_u, DCT_stride);
- if (coded_block_pattern & 32)
- slice_non_intra_DCT (decoder, 2, dest_v, DCT_stride);
- if (coded_block_pattern & (32 << 26))
- slice_non_intra_DCT (decoder, 1, dest_u + DCT_offset,
- DCT_stride);
- if (coded_block_pattern & (16 << 26))
- slice_non_intra_DCT (decoder, 2, dest_v + DCT_offset,
- DCT_stride);
- if (coded_block_pattern & (8 << 26))
- slice_non_intra_DCT (decoder, 1, dest_u + 8,
- DCT_stride);
- if (coded_block_pattern & (4 << 26))
- slice_non_intra_DCT (decoder, 2, dest_v + 8,
- DCT_stride);
- if (coded_block_pattern & (2 << 26))
- slice_non_intra_DCT (decoder, 1,
- dest_u + DCT_offset + 8,
- DCT_stride);
- if (coded_block_pattern & (1 << 26))
- slice_non_intra_DCT (decoder, 2,
- dest_v + DCT_offset + 8,
- DCT_stride);
- }
- }
-
- decoder->dc_dct_pred[0] = decoder->dc_dct_pred[1] =
- decoder->dc_dct_pred[2] = 16384;
- }
-
- NEXT_MACROBLOCK;
-
- NEEDBITS (bit_buf, bits, bit_ptr);
- mba_inc = 0;
- while (1) {
- if (bit_buf >= 0x10000000) {
- mba = MBA_5 + (UBITS (bit_buf, 5) - 2);
- break;
- } else if (bit_buf >= 0x03000000) {
- mba = MBA_11 + (UBITS (bit_buf, 11) - 24);
- break;
- } else switch (UBITS (bit_buf, 11)) {
- case 8: /* macroblock_escape */
- mba_inc += 33;
- /* pass through */
- case 15: /* macroblock_stuffing (MPEG1 only) */
- DUMPBITS (bit_buf, bits, 11);
- NEEDBITS (bit_buf, bits, bit_ptr);
- continue;
- default: /* end of slice, or error */
- if (mpeg2_cpu_state_restore)
- mpeg2_cpu_state_restore (&cpu_state);
- return;
- }
- }
- DUMPBITS (bit_buf, bits, mba->len);
- mba_inc += mba->mba;
-
- if (mba_inc) {
- decoder->dc_dct_pred[0] = decoder->dc_dct_pred[1] =
- decoder->dc_dct_pred[2] = 16384;
-
- if (decoder->coding_type == P_TYPE) {
- do {
- MOTION_CALL (decoder->motion_parser[0],
- MACROBLOCK_MOTION_FORWARD);
- NEXT_MACROBLOCK;
- } while (--mba_inc);
- } else {
- do {
- MOTION_CALL (decoder->motion_parser[4], macroblock_modes);
- NEXT_MACROBLOCK;
- } while (--mba_inc);
- }
- }
- }
-#undef bit_buf
-#undef bits
-#undef bit_ptr
-}
diff --git a/libmpeg2/vis.h b/libmpeg2/vis.h
deleted file mode 100644
index 8324c3eb2e..0000000000
--- a/libmpeg2/vis.h
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * vis.h
- * Copyright (C) 2003 David S. Miller <davem@redhat.com>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/* You may be asking why I hard-code the instruction opcodes and don't
- * use the normal VIS assembler mnenomics for the VIS instructions.
- *
- * The reason is that Sun, in their infinite wisdom, decided that a binary
- * using a VIS instruction will cause it to be marked (in the ELF headers)
- * as doing so, and this prevents the OS from loading such binaries if the
- * current cpu doesn't have VIS. There is no way to easily override this
- * behavior of the assembler that I am aware of.
- *
- * This totally defeats what libmpeg2 is trying to do which is allow a
- * single binary to be created, and then detect the availability of VIS
- * at runtime.
- *
- * I'm not saying that tainting the binary by default is bad, rather I'm
- * saying that not providing a way to override this easily unnecessarily
- * ties people's hands.
- *
- * Thus, we do the opcode encoding by hand and output 32-bit words in
- * the assembler to keep the binary from becoming tainted.
- */
-
-#ifndef LIBMPEG2_VIS_H
-#define LIBMPEG2_VIS_H
-
-#define vis_opc_base ((0x1 << 31) | (0x36 << 19))
-#define vis_opf(X) ((X) << 5)
-#define vis_sreg(X) (X)
-#define vis_dreg(X) (((X)&0x1f)|((X)>>5))
-#define vis_rs1_s(X) (vis_sreg(X) << 14)
-#define vis_rs1_d(X) (vis_dreg(X) << 14)
-#define vis_rs2_s(X) (vis_sreg(X) << 0)
-#define vis_rs2_d(X) (vis_dreg(X) << 0)
-#define vis_rd_s(X) (vis_sreg(X) << 25)
-#define vis_rd_d(X) (vis_dreg(X) << 25)
-
-#define vis_ss2s(opf,rs1,rs2,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs1_s(rs1) | \
- vis_rs2_s(rs2) | \
- vis_rd_s(rd)))
-
-#define vis_dd2d(opf,rs1,rs2,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs1_d(rs1) | \
- vis_rs2_d(rs2) | \
- vis_rd_d(rd)))
-
-#define vis_ss2d(opf,rs1,rs2,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs1_s(rs1) | \
- vis_rs2_s(rs2) | \
- vis_rd_d(rd)))
-
-#define vis_sd2d(opf,rs1,rs2,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs1_s(rs1) | \
- vis_rs2_d(rs2) | \
- vis_rd_d(rd)))
-
-#define vis_d2s(opf,rs2,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs2_d(rs2) | \
- vis_rd_s(rd)))
-
-#define vis_s2d(opf,rs2,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs2_s(rs2) | \
- vis_rd_d(rd)))
-
-#define vis_d12d(opf,rs1,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs1_d(rs1) | \
- vis_rd_d(rd)))
-
-#define vis_d22d(opf,rs2,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs2_d(rs2) | \
- vis_rd_d(rd)))
-
-#define vis_s12s(opf,rs1,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs1_s(rs1) | \
- vis_rd_s(rd)))
-
-#define vis_s22s(opf,rs2,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rs2_s(rs2) | \
- vis_rd_s(rd)))
-
-#define vis_s(opf,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rd_s(rd)))
-
-#define vis_d(opf,rd) \
- __asm__ __volatile__ (".word %0" \
- : : "i" (vis_opc_base | vis_opf(opf) | \
- vis_rd_d(rd)))
-
-#define vis_r2m(op,rd,mem) \
- __asm__ __volatile__ (#op "\t%%f" #rd ", [%0]" : : "r" (&(mem)) )
-
-#define vis_r2m_2(op,rd,mem1,mem2) \
- __asm__ __volatile__ (#op "\t%%f" #rd ", [%0 + %1]" : : "r" (mem1), "r" (mem2) )
-
-#define vis_m2r(op,mem,rd) \
- __asm__ __volatile__ (#op "\t[%0], %%f" #rd : : "r" (&(mem)) )
-
-#define vis_m2r_2(op,mem1,mem2,rd) \
- __asm__ __volatile__ (#op "\t[%0 + %1], %%f" #rd : : "r" (mem1), "r" (mem2) )
-
-static inline void vis_set_gsr(unsigned int _val)
-{
- register unsigned int val asm("g1");
-
- val = _val;
- __asm__ __volatile__(".word 0xa7804000"
- : : "r" (val));
-}
-
-#define VIS_GSR_ALIGNADDR_MASK 0x0000007
-#define VIS_GSR_ALIGNADDR_SHIFT 0
-#define VIS_GSR_SCALEFACT_MASK 0x0000078
-#define VIS_GSR_SCALEFACT_SHIFT 3
-
-#define vis_ld32(mem,rs1) vis_m2r(ld, mem, rs1)
-#define vis_ld32_2(mem1,mem2,rs1) vis_m2r_2(ld, mem1, mem2, rs1)
-#define vis_st32(rs1,mem) vis_r2m(st, rs1, mem)
-#define vis_st32_2(rs1,mem1,mem2) vis_r2m_2(st, rs1, mem1, mem2)
-#define vis_ld64(mem,rs1) vis_m2r(ldd, mem, rs1)
-#define vis_ld64_2(mem1,mem2,rs1) vis_m2r_2(ldd, mem1, mem2, rs1)
-#define vis_st64(rs1,mem) vis_r2m(std, rs1, mem)
-#define vis_st64_2(rs1,mem1,mem2) vis_r2m_2(std, rs1, mem1, mem2)
-
-#define vis_ldblk(mem, rd) \
-do { register void *__mem asm("g1"); \
- __mem = &(mem); \
- __asm__ __volatile__(".word 0xc1985e00 | %1" \
- : \
- : "r" (__mem), \
- "i" (vis_rd_d(rd)) \
- : "memory"); \
-} while (0)
-
-#define vis_stblk(rd, mem) \
-do { register void *__mem asm("g1"); \
- __mem = &(mem); \
- __asm__ __volatile__(".word 0xc1b85e00 | %1" \
- : \
- : "r" (__mem), \
- "i" (vis_rd_d(rd)) \
- : "memory"); \
-} while (0)
-
-#define vis_membar_storestore() \
- __asm__ __volatile__(".word 0x8143e008" : : : "memory")
-
-#define vis_membar_sync() \
- __asm__ __volatile__(".word 0x8143e040" : : : "memory")
-
-/* 16 and 32 bit partitioned addition and subtraction. The normal
- * versions perform 4 16-bit or 2 32-bit additions or subtractions.
- * The 's' versions perform 2 16-bit or 2 32-bit additions or
- * subtractions.
- */
-
-#define vis_padd16(rs1,rs2,rd) vis_dd2d(0x50, rs1, rs2, rd)
-#define vis_padd16s(rs1,rs2,rd) vis_ss2s(0x51, rs1, rs2, rd)
-#define vis_padd32(rs1,rs2,rd) vis_dd2d(0x52, rs1, rs2, rd)
-#define vis_padd32s(rs1,rs2,rd) vis_ss2s(0x53, rs1, rs2, rd)
-#define vis_psub16(rs1,rs2,rd) vis_dd2d(0x54, rs1, rs2, rd)
-#define vis_psub16s(rs1,rs2,rd) vis_ss2s(0x55, rs1, rs2, rd)
-#define vis_psub32(rs1,rs2,rd) vis_dd2d(0x56, rs1, rs2, rd)
-#define vis_psub32s(rs1,rs2,rd) vis_ss2s(0x57, rs1, rs2, rd)
-
-/* Pixel formatting instructions. */
-
-#define vis_pack16(rs2,rd) vis_d2s( 0x3b, rs2, rd)
-#define vis_pack32(rs1,rs2,rd) vis_dd2d(0x3a, rs1, rs2, rd)
-#define vis_packfix(rs2,rd) vis_d2s( 0x3d, rs2, rd)
-#define vis_expand(rs2,rd) vis_s2d( 0x4d, rs2, rd)
-#define vis_pmerge(rs1,rs2,rd) vis_ss2d(0x4b, rs1, rs2, rd)
-
-/* Partitioned multiply instructions. */
-
-#define vis_mul8x16(rs1,rs2,rd) vis_sd2d(0x31, rs1, rs2, rd)
-#define vis_mul8x16au(rs1,rs2,rd) vis_ss2d(0x33, rs1, rs2, rd)
-#define vis_mul8x16al(rs1,rs2,rd) vis_ss2d(0x35, rs1, rs2, rd)
-#define vis_mul8sux16(rs1,rs2,rd) vis_dd2d(0x36, rs1, rs2, rd)
-#define vis_mul8ulx16(rs1,rs2,rd) vis_dd2d(0x37, rs1, rs2, rd)
-#define vis_muld8sux16(rs1,rs2,rd) vis_ss2d(0x38, rs1, rs2, rd)
-#define vis_muld8ulx16(rs1,rs2,rd) vis_ss2d(0x39, rs1, rs2, rd)
-
-/* Alignment instructions. */
-
-static inline void *vis_alignaddr(void *_ptr)
-{
- register void *ptr asm("g1");
-
- ptr = _ptr;
-
- __asm__ __volatile__(".word %2"
- : "=&r" (ptr)
- : "0" (ptr),
- "i" (vis_opc_base | vis_opf(0x18) |
- vis_rs1_s(1) |
- vis_rs2_s(0) |
- vis_rd_s(1)));
-
- return ptr;
-}
-
-static inline void vis_alignaddr_g0(void *_ptr)
-{
- register void *ptr asm("g1");
-
- ptr = _ptr;
-
- __asm__ __volatile__(".word %2"
- : "=&r" (ptr)
- : "0" (ptr),
- "i" (vis_opc_base | vis_opf(0x18) |
- vis_rs1_s(1) |
- vis_rs2_s(0) |
- vis_rd_s(0)));
-}
-
-static inline void *vis_alignaddrl(void *_ptr)
-{
- register void *ptr asm("g1");
-
- ptr = _ptr;
-
- __asm__ __volatile__(".word %2"
- : "=&r" (ptr)
- : "0" (ptr),
- "i" (vis_opc_base | vis_opf(0x19) |
- vis_rs1_s(1) |
- vis_rs2_s(0) |
- vis_rd_s(1)));
-
- return ptr;
-}
-
-static inline void vis_alignaddrl_g0(void *_ptr)
-{
- register void *ptr asm("g1");
-
- ptr = _ptr;
-
- __asm__ __volatile__(".word %2"
- : "=&r" (ptr)
- : "0" (ptr),
- "i" (vis_opc_base | vis_opf(0x19) |
- vis_rs1_s(1) |
- vis_rs2_s(0) |
- vis_rd_s(0)));
-}
-
-#define vis_faligndata(rs1,rs2,rd) vis_dd2d(0x48, rs1, rs2, rd)
-
-/* Logical operate instructions. */
-
-#define vis_fzero(rd) vis_d( 0x60, rd)
-#define vis_fzeros(rd) vis_s( 0x61, rd)
-#define vis_fone(rd) vis_d( 0x7e, rd)
-#define vis_fones(rd) vis_s( 0x7f, rd)
-#define vis_src1(rs1,rd) vis_d12d(0x74, rs1, rd)
-#define vis_src1s(rs1,rd) vis_s12s(0x75, rs1, rd)
-#define vis_src2(rs2,rd) vis_d22d(0x78, rs2, rd)
-#define vis_src2s(rs2,rd) vis_s22s(0x79, rs2, rd)
-#define vis_not1(rs1,rd) vis_d12d(0x6a, rs1, rd)
-#define vis_not1s(rs1,rd) vis_s12s(0x6b, rs1, rd)
-#define vis_not2(rs2,rd) vis_d22d(0x66, rs2, rd)
-#define vis_not2s(rs2,rd) vis_s22s(0x67, rs2, rd)
-#define vis_or(rs1,rs2,rd) vis_dd2d(0x7c, rs1, rs2, rd)
-#define vis_ors(rs1,rs2,rd) vis_ss2s(0x7d, rs1, rs2, rd)
-#define vis_nor(rs1,rs2,rd) vis_dd2d(0x62, rs1, rs2, rd)
-#define vis_nors(rs1,rs2,rd) vis_ss2s(0x63, rs1, rs2, rd)
-#define vis_and(rs1,rs2,rd) vis_dd2d(0x70, rs1, rs2, rd)
-#define vis_ands(rs1,rs2,rd) vis_ss2s(0x71, rs1, rs2, rd)
-#define vis_nand(rs1,rs2,rd) vis_dd2d(0x6e, rs1, rs2, rd)
-#define vis_nands(rs1,rs2,rd) vis_ss2s(0x6f, rs1, rs2, rd)
-#define vis_xor(rs1,rs2,rd) vis_dd2d(0x6c, rs1, rs2, rd)
-#define vis_xors(rs1,rs2,rd) vis_ss2s(0x6d, rs1, rs2, rd)
-#define vis_xnor(rs1,rs2,rd) vis_dd2d(0x72, rs1, rs2, rd)
-#define vis_xnors(rs1,rs2,rd) vis_ss2s(0x73, rs1, rs2, rd)
-#define vis_ornot1(rs1,rs2,rd) vis_dd2d(0x7a, rs1, rs2, rd)
-#define vis_ornot1s(rs1,rs2,rd) vis_ss2s(0x7b, rs1, rs2, rd)
-#define vis_ornot2(rs1,rs2,rd) vis_dd2d(0x76, rs1, rs2, rd)
-#define vis_ornot2s(rs1,rs2,rd) vis_ss2s(0x77, rs1, rs2, rd)
-#define vis_andnot1(rs1,rs2,rd) vis_dd2d(0x68, rs1, rs2, rd)
-#define vis_andnot1s(rs1,rs2,rd) vis_ss2s(0x69, rs1, rs2, rd)
-#define vis_andnot2(rs1,rs2,rd) vis_dd2d(0x64, rs1, rs2, rd)
-#define vis_andnot2s(rs1,rs2,rd) vis_ss2s(0x65, rs1, rs2, rd)
-
-/* Pixel component distance. */
-
-#define vis_pdist(rs1,rs2,rd) vis_dd2d(0x3e, rs1, rs2, rd)
-
-#endif /* LIBMPEG2_VIS_H */
diff --git a/libmpeg2/vlc.h b/libmpeg2/vlc.h
deleted file mode 100644
index b3a868e54b..0000000000
--- a/libmpeg2/vlc.h
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * vlc.h
- * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
- * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
- *
- * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
- * See http://libmpeg2.sourceforge.net/ for updates.
- *
- * mpeg2dec is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * mpeg2dec 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef LIBMPEG2_VLC_H
-#define LIBMPEG2_VLC_H
-
-#define GETWORD(bit_buf,shift,bit_ptr) \
-do { \
- bit_buf |= ((bit_ptr[0] << 8) | bit_ptr[1]) << (shift); \
- bit_ptr += 2; \
-} while (0)
-
-static inline void bitstream_init (mpeg2_decoder_t * decoder,
- const uint8_t * start)
-{
- decoder->bitstream_buf =
- (start[0] << 24) | (start[1] << 16) | (start[2] << 8) | start[3];
- decoder->bitstream_ptr = start + 4;
- decoder->bitstream_bits = -16;
-}
-
-/* make sure that there are at least 16 valid bits in bit_buf */
-#define NEEDBITS(bit_buf,bits,bit_ptr) \
-do { \
- if (unlikely (bits > 0)) { \
- GETWORD (bit_buf, bits, bit_ptr); \
- bits -= 16; \
- } \
-} while (0)
-
-/* remove num valid bits from bit_buf */
-#define DUMPBITS(bit_buf,bits,num) \
-do { \
- bit_buf <<= (num); \
- bits += (num); \
-} while (0)
-
-/* take num bits from the high part of bit_buf and zero extend them */
-#define UBITS(bit_buf,num) (((uint32_t)(bit_buf)) >> (32 - (num)))
-
-/* take num bits from the high part of bit_buf and sign extend them */
-#define SBITS(bit_buf,num) (((int32_t)(bit_buf)) >> (32 - (num)))
-
-typedef struct {
- uint8_t modes;
- uint8_t len;
-} MBtab;
-
-typedef struct {
- uint8_t delta;
- uint8_t len;
-} MVtab;
-
-typedef struct {
- int8_t dmv;
- uint8_t len;
-} DMVtab;
-
-typedef struct {
- uint8_t cbp;
- uint8_t len;
-} CBPtab;
-
-typedef struct {
- uint8_t size;
- uint8_t len;
-} DCtab;
-
-typedef struct {
- uint8_t run;
- uint8_t level;
- uint8_t len;
-} DCTtab;
-
-typedef struct {
- uint8_t mba;
- uint8_t len;
-} MBAtab;
-
-
-#define INTRA MACROBLOCK_INTRA
-#define QUANT MACROBLOCK_QUANT
-
-static const MBtab MB_I [] = {
- {INTRA|QUANT, 2}, {INTRA, 1}
-};
-
-#define MC MACROBLOCK_MOTION_FORWARD
-#define CODED MACROBLOCK_PATTERN
-
-static const MBtab MB_P [] = {
- {INTRA|QUANT, 6}, {CODED|QUANT, 5}, {MC|CODED|QUANT, 5}, {INTRA, 5},
- {MC, 3}, {MC, 3}, {MC, 3}, {MC, 3},
- {CODED, 2}, {CODED, 2}, {CODED, 2}, {CODED, 2},
- {CODED, 2}, {CODED, 2}, {CODED, 2}, {CODED, 2},
- {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1},
- {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1},
- {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1},
- {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1}, {MC|CODED, 1}
-};
-
-#define FWD MACROBLOCK_MOTION_FORWARD
-#define BWD MACROBLOCK_MOTION_BACKWARD
-#define INTER MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD
-
-static const MBtab MB_B [] = {
- {0, 6}, {INTRA|QUANT, 6},
- {BWD|CODED|QUANT, 6}, {FWD|CODED|QUANT, 6},
- {INTER|CODED|QUANT, 5}, {INTER|CODED|QUANT, 5},
- {INTRA, 5}, {INTRA, 5},
- {FWD, 4}, {FWD, 4}, {FWD, 4}, {FWD, 4},
- {FWD|CODED, 4}, {FWD|CODED, 4}, {FWD|CODED, 4}, {FWD|CODED, 4},
- {BWD, 3}, {BWD, 3}, {BWD, 3}, {BWD, 3},
- {BWD, 3}, {BWD, 3}, {BWD, 3}, {BWD, 3},
- {BWD|CODED, 3}, {BWD|CODED, 3}, {BWD|CODED, 3}, {BWD|CODED, 3},
- {BWD|CODED, 3}, {BWD|CODED, 3}, {BWD|CODED, 3}, {BWD|CODED, 3},
- {INTER, 2}, {INTER, 2}, {INTER, 2}, {INTER, 2},
- {INTER, 2}, {INTER, 2}, {INTER, 2}, {INTER, 2},
- {INTER, 2}, {INTER, 2}, {INTER, 2}, {INTER, 2},
- {INTER, 2}, {INTER, 2}, {INTER, 2}, {INTER, 2},
- {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
- {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
- {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2},
- {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}, {INTER|CODED, 2}
-};
-
-#undef INTRA
-#undef QUANT
-#undef MC
-#undef CODED
-#undef FWD
-#undef BWD
-#undef INTER
-
-
-static const MVtab MV_4 [] = {
- { 3, 6}, { 2, 4}, { 1, 3}, { 1, 3}, { 0, 2}, { 0, 2}, { 0, 2}, { 0, 2}
-};
-
-static const MVtab MV_10 [] = {
- { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10}, { 0,10},
- { 0,10}, { 0,10}, { 0,10}, { 0,10}, {15,10}, {14,10}, {13,10}, {12,10},
- {11,10}, {10,10}, { 9, 9}, { 9, 9}, { 8, 9}, { 8, 9}, { 7, 9}, { 7, 9},
- { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7}, { 6, 7},
- { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7}, { 5, 7},
- { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}, { 4, 7}
-};
-
-
-static const DMVtab DMV_2 [] = {
- { 0, 1}, { 0, 1}, { 1, 2}, {-1, 2}
-};
-
-
-static const CBPtab CBP_7 [] = {
- {0x11, 7}, {0x12, 7}, {0x14, 7}, {0x18, 7},
- {0x21, 7}, {0x22, 7}, {0x24, 7}, {0x28, 7},
- {0x3f, 6}, {0x3f, 6}, {0x30, 6}, {0x30, 6},
- {0x09, 6}, {0x09, 6}, {0x06, 6}, {0x06, 6},
- {0x1f, 5}, {0x1f, 5}, {0x1f, 5}, {0x1f, 5},
- {0x10, 5}, {0x10, 5}, {0x10, 5}, {0x10, 5},
- {0x2f, 5}, {0x2f, 5}, {0x2f, 5}, {0x2f, 5},
- {0x20, 5}, {0x20, 5}, {0x20, 5}, {0x20, 5},
- {0x07, 5}, {0x07, 5}, {0x07, 5}, {0x07, 5},
- {0x0b, 5}, {0x0b, 5}, {0x0b, 5}, {0x0b, 5},
- {0x0d, 5}, {0x0d, 5}, {0x0d, 5}, {0x0d, 5},
- {0x0e, 5}, {0x0e, 5}, {0x0e, 5}, {0x0e, 5},
- {0x05, 5}, {0x05, 5}, {0x05, 5}, {0x05, 5},
- {0x0a, 5}, {0x0a, 5}, {0x0a, 5}, {0x0a, 5},
- {0x03, 5}, {0x03, 5}, {0x03, 5}, {0x03, 5},
- {0x0c, 5}, {0x0c, 5}, {0x0c, 5}, {0x0c, 5},
- {0x01, 4}, {0x01, 4}, {0x01, 4}, {0x01, 4},
- {0x01, 4}, {0x01, 4}, {0x01, 4}, {0x01, 4},
- {0x02, 4}, {0x02, 4}, {0x02, 4}, {0x02, 4},
- {0x02, 4}, {0x02, 4}, {0x02, 4}, {0x02, 4},
- {0x04, 4}, {0x04, 4}, {0x04, 4}, {0x04, 4},
- {0x04, 4}, {0x04, 4}, {0x04, 4}, {0x04, 4},
- {0x08, 4}, {0x08, 4}, {0x08, 4}, {0x08, 4},
- {0x08, 4}, {0x08, 4}, {0x08, 4}, {0x08, 4},
- {0x0f, 3}, {0x0f, 3}, {0x0f, 3}, {0x0f, 3},
- {0x0f, 3}, {0x0f, 3}, {0x0f, 3}, {0x0f, 3},
- {0x0f, 3}, {0x0f, 3}, {0x0f, 3}, {0x0f, 3},
- {0x0f, 3}, {0x0f, 3}, {0x0f, 3}, {0x0f, 3}
-};
-
-static const CBPtab CBP_9 [] = {
- {0, 9}, {0x00, 9}, {0x39, 9}, {0x36, 9},
- {0x37, 9}, {0x3b, 9}, {0x3d, 9}, {0x3e, 9},
- {0x17, 8}, {0x17, 8}, {0x1b, 8}, {0x1b, 8},
- {0x1d, 8}, {0x1d, 8}, {0x1e, 8}, {0x1e, 8},
- {0x27, 8}, {0x27, 8}, {0x2b, 8}, {0x2b, 8},
- {0x2d, 8}, {0x2d, 8}, {0x2e, 8}, {0x2e, 8},
- {0x19, 8}, {0x19, 8}, {0x16, 8}, {0x16, 8},
- {0x29, 8}, {0x29, 8}, {0x26, 8}, {0x26, 8},
- {0x35, 8}, {0x35, 8}, {0x3a, 8}, {0x3a, 8},
- {0x33, 8}, {0x33, 8}, {0x3c, 8}, {0x3c, 8},
- {0x15, 8}, {0x15, 8}, {0x1a, 8}, {0x1a, 8},
- {0x13, 8}, {0x13, 8}, {0x1c, 8}, {0x1c, 8},
- {0x25, 8}, {0x25, 8}, {0x2a, 8}, {0x2a, 8},
- {0x23, 8}, {0x23, 8}, {0x2c, 8}, {0x2c, 8},
- {0x31, 8}, {0x31, 8}, {0x32, 8}, {0x32, 8},
- {0x34, 8}, {0x34, 8}, {0x38, 8}, {0x38, 8}
-};
-
-
-static const DCtab DC_lum_5 [] = {
- {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}
-};
-
-static const DCtab DC_chrom_5 [] = {
- {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
- {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}
-};
-
-static const DCtab DC_long [] = {
- {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, { 6, 5}, { 6, 5},
- {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, {6, 5}, { 6, 5}, { 6, 5},
- {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, { 7, 6}, { 7, 6},
- {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10, 9}, {11, 9}
-};
-
-
-static const DCTtab DCT_16 [] = {
- {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
- {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
- {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
- {129, 0, 0}, {129, 0, 0}, {129, 0, 0}, {129, 0, 0},
- { 2,18, 0}, { 2,17, 0}, { 2,16, 0}, { 2,15, 0},
- { 7, 3, 0}, { 17, 2, 0}, { 16, 2, 0}, { 15, 2, 0},
- { 14, 2, 0}, { 13, 2, 0}, { 12, 2, 0}, { 32, 1, 0},
- { 31, 1, 0}, { 30, 1, 0}, { 29, 1, 0}, { 28, 1, 0}
-};
-
-static const DCTtab DCT_15 [] = {
- { 1,40,15}, { 1,39,15}, { 1,38,15}, { 1,37,15},
- { 1,36,15}, { 1,35,15}, { 1,34,15}, { 1,33,15},
- { 1,32,15}, { 2,14,15}, { 2,13,15}, { 2,12,15},
- { 2,11,15}, { 2,10,15}, { 2, 9,15}, { 2, 8,15},
- { 1,31,14}, { 1,31,14}, { 1,30,14}, { 1,30,14},
- { 1,29,14}, { 1,29,14}, { 1,28,14}, { 1,28,14},
- { 1,27,14}, { 1,27,14}, { 1,26,14}, { 1,26,14},
- { 1,25,14}, { 1,25,14}, { 1,24,14}, { 1,24,14},
- { 1,23,14}, { 1,23,14}, { 1,22,14}, { 1,22,14},
- { 1,21,14}, { 1,21,14}, { 1,20,14}, { 1,20,14},
- { 1,19,14}, { 1,19,14}, { 1,18,14}, { 1,18,14},
- { 1,17,14}, { 1,17,14}, { 1,16,14}, { 1,16,14}
-};
-
-static const DCTtab DCT_13 [] = {
- { 11, 2,13}, { 10, 2,13}, { 6, 3,13}, { 4, 4,13},
- { 3, 5,13}, { 2, 7,13}, { 2, 6,13}, { 1,15,13},
- { 1,14,13}, { 1,13,13}, { 1,12,13}, { 27, 1,13},
- { 26, 1,13}, { 25, 1,13}, { 24, 1,13}, { 23, 1,13},
- { 1,11,12}, { 1,11,12}, { 9, 2,12}, { 9, 2,12},
- { 5, 3,12}, { 5, 3,12}, { 1,10,12}, { 1,10,12},
- { 3, 4,12}, { 3, 4,12}, { 8, 2,12}, { 8, 2,12},
- { 22, 1,12}, { 22, 1,12}, { 21, 1,12}, { 21, 1,12},
- { 1, 9,12}, { 1, 9,12}, { 20, 1,12}, { 20, 1,12},
- { 19, 1,12}, { 19, 1,12}, { 2, 5,12}, { 2, 5,12},
- { 4, 3,12}, { 4, 3,12}, { 1, 8,12}, { 1, 8,12},
- { 7, 2,12}, { 7, 2,12}, { 18, 1,12}, { 18, 1,12}
-};
-
-static const DCTtab DCT_B14_10 [] = {
- { 17, 1,10}, { 6, 2,10}, { 1, 7,10}, { 3, 3,10},
- { 2, 4,10}, { 16, 1,10}, { 15, 1,10}, { 5, 2,10}
-};
-
-static const DCTtab DCT_B14_8 [] = {
- { 65, 0,12}, { 65, 0,12}, { 65, 0,12}, { 65, 0,12},
- { 3, 2, 7}, { 3, 2, 7}, { 10, 1, 7}, { 10, 1, 7},
- { 1, 4, 7}, { 1, 4, 7}, { 9, 1, 7}, { 9, 1, 7},
- { 8, 1, 6}, { 8, 1, 6}, { 8, 1, 6}, { 8, 1, 6},
- { 7, 1, 6}, { 7, 1, 6}, { 7, 1, 6}, { 7, 1, 6},
- { 2, 2, 6}, { 2, 2, 6}, { 2, 2, 6}, { 2, 2, 6},
- { 6, 1, 6}, { 6, 1, 6}, { 6, 1, 6}, { 6, 1, 6},
- { 14, 1, 8}, { 1, 6, 8}, { 13, 1, 8}, { 12, 1, 8},
- { 4, 2, 8}, { 2, 3, 8}, { 1, 5, 8}, { 11, 1, 8}
-};
-
-static const DCTtab DCT_B14AC_5 [] = {
- { 1, 3, 5}, { 5, 1, 5}, { 4, 1, 5},
- { 1, 2, 4}, { 1, 2, 4}, { 3, 1, 4}, { 3, 1, 4},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, {129, 0, 2},
- {129, 0, 2}, {129, 0, 2}, {129, 0, 2}, {129, 0, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}
-};
-
-static const DCTtab DCT_B14DC_5 [] = {
- { 1, 3, 5}, { 5, 1, 5}, { 4, 1, 5},
- { 1, 2, 4}, { 1, 2, 4}, { 3, 1, 4}, { 3, 1, 4},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1},
- { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1},
- { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1},
- { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1}, { 1, 1, 1}
-};
-
-static const DCTtab DCT_B15_10 [] = {
- { 6, 2, 9}, { 6, 2, 9}, { 15, 1, 9}, { 15, 1, 9},
- { 3, 4,10}, { 17, 1,10}, { 16, 1, 9}, { 16, 1, 9}
-};
-
-static const DCTtab DCT_B15_8 [] = {
- { 65, 0,12}, { 65, 0,12}, { 65, 0,12}, { 65, 0,12},
- { 8, 1, 7}, { 8, 1, 7}, { 9, 1, 7}, { 9, 1, 7},
- { 7, 1, 7}, { 7, 1, 7}, { 3, 2, 7}, { 3, 2, 7},
- { 1, 7, 6}, { 1, 7, 6}, { 1, 7, 6}, { 1, 7, 6},
- { 1, 6, 6}, { 1, 6, 6}, { 1, 6, 6}, { 1, 6, 6},
- { 5, 1, 6}, { 5, 1, 6}, { 5, 1, 6}, { 5, 1, 6},
- { 6, 1, 6}, { 6, 1, 6}, { 6, 1, 6}, { 6, 1, 6},
- { 2, 5, 8}, { 12, 1, 8}, { 1,11, 8}, { 1,10, 8},
- { 14, 1, 8}, { 13, 1, 8}, { 4, 2, 8}, { 2, 4, 8},
- { 3, 1, 5}, { 3, 1, 5}, { 3, 1, 5}, { 3, 1, 5},
- { 3, 1, 5}, { 3, 1, 5}, { 3, 1, 5}, { 3, 1, 5},
- { 2, 2, 5}, { 2, 2, 5}, { 2, 2, 5}, { 2, 2, 5},
- { 2, 2, 5}, { 2, 2, 5}, { 2, 2, 5}, { 2, 2, 5},
- { 4, 1, 5}, { 4, 1, 5}, { 4, 1, 5}, { 4, 1, 5},
- { 4, 1, 5}, { 4, 1, 5}, { 4, 1, 5}, { 4, 1, 5},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3}, { 2, 1, 3},
- {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
- {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
- {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
- {129, 0, 4}, {129, 0, 4}, {129, 0, 4}, {129, 0, 4},
- { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4},
- { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4},
- { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4},
- { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4}, { 1, 3, 4},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2}, { 1, 1, 2},
- { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3},
- { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3},
- { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3},
- { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3},
- { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3},
- { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3},
- { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3},
- { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3}, { 1, 2, 3},
- { 1, 4, 5}, { 1, 4, 5}, { 1, 4, 5}, { 1, 4, 5},
- { 1, 4, 5}, { 1, 4, 5}, { 1, 4, 5}, { 1, 4, 5},
- { 1, 5, 5}, { 1, 5, 5}, { 1, 5, 5}, { 1, 5, 5},
- { 1, 5, 5}, { 1, 5, 5}, { 1, 5, 5}, { 1, 5, 5},
- { 10, 1, 7}, { 10, 1, 7}, { 2, 3, 7}, { 2, 3, 7},
- { 11, 1, 7}, { 11, 1, 7}, { 1, 8, 7}, { 1, 8, 7},
- { 1, 9, 7}, { 1, 9, 7}, { 1,12, 8}, { 1,13, 8},
- { 3, 3, 8}, { 5, 2, 8}, { 1,14, 8}, { 1,15, 8}
-};
-
-
-static const MBAtab MBA_5 [] = {
- {6, 5}, {5, 5}, {4, 4}, {4, 4}, {3, 4}, {3, 4},
- {2, 3}, {2, 3}, {2, 3}, {2, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
- {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1},
- {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}
-};
-
-static const MBAtab MBA_11 [] = {
- {32, 11}, {31, 11}, {30, 11}, {29, 11},
- {28, 11}, {27, 11}, {26, 11}, {25, 11},
- {24, 11}, {23, 11}, {22, 11}, {21, 11},
- {20, 10}, {20, 10}, {19, 10}, {19, 10},
- {18, 10}, {18, 10}, {17, 10}, {17, 10},
- {16, 10}, {16, 10}, {15, 10}, {15, 10},
- {14, 8}, {14, 8}, {14, 8}, {14, 8},
- {14, 8}, {14, 8}, {14, 8}, {14, 8},
- {13, 8}, {13, 8}, {13, 8}, {13, 8},
- {13, 8}, {13, 8}, {13, 8}, {13, 8},
- {12, 8}, {12, 8}, {12, 8}, {12, 8},
- {12, 8}, {12, 8}, {12, 8}, {12, 8},
- {11, 8}, {11, 8}, {11, 8}, {11, 8},
- {11, 8}, {11, 8}, {11, 8}, {11, 8},
- {10, 8}, {10, 8}, {10, 8}, {10, 8},
- {10, 8}, {10, 8}, {10, 8}, {10, 8},
- { 9, 8}, { 9, 8}, { 9, 8}, { 9, 8},
- { 9, 8}, { 9, 8}, { 9, 8}, { 9, 8},
- { 8, 7}, { 8, 7}, { 8, 7}, { 8, 7},
- { 8, 7}, { 8, 7}, { 8, 7}, { 8, 7},
- { 8, 7}, { 8, 7}, { 8, 7}, { 8, 7},
- { 8, 7}, { 8, 7}, { 8, 7}, { 8, 7},
- { 7, 7}, { 7, 7}, { 7, 7}, { 7, 7},
- { 7, 7}, { 7, 7}, { 7, 7}, { 7, 7},
- { 7, 7}, { 7, 7}, { 7, 7}, { 7, 7},
- { 7, 7}, { 7, 7}, { 7, 7}, { 7, 7}
-};
-
-#endif /* LIBMPEG2_VLC_H */