diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2011-02-01 20:10:27 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2011-02-01 20:10:27 +0200 |
commit | 7cd7416c7316ce28cfa663b1f1d578b9c768a6ba (patch) | |
tree | 9ac07232011a1488a0f502835f6aba41631a71c2 | |
parent | 156ba34ac7b6099f867a66295fbfe650db63e598 (diff) |
libmpeg2: drop libmpeg2 support
libavcodec mpeg2 decoder has been the default for a while and seems to
work fine.
31 files changed, 0 insertions, 13963 deletions
@@ -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/ @@ -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 \ @@ -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 */ |