mpegvideo_ppc.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:3k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 2002 Dieter Shirley
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  */
  18.  
  19. #include "../dsputil.h"
  20. #include "../mpegvideo.h"
  21. #include <time.h>
  22. #ifdef HAVE_ALTIVEC
  23. #include "dsputil_altivec.h"
  24. #endif
  25. extern int dct_quantize_altivec(MpegEncContext *s,  
  26.         DCTELEM *block, int n,
  27.         int qscale, int *overflow);
  28. extern void dct_unquantize_h263_altivec(MpegEncContext *s,
  29.                                         DCTELEM *block, int n, int qscale);
  30. extern void idct_put_altivec(uint8_t *dest, int line_size, int16_t *block);
  31. extern void idct_add_altivec(uint8_t *dest, int line_size, int16_t *block);
  32. void MPV_common_init_ppc(MpegEncContext *s)
  33. {
  34. #ifdef HAVE_ALTIVEC
  35.     if (has_altivec())
  36.     {
  37.       if (s->avctx->lowres==0)
  38.       {
  39.         if ((s->avctx->idct_algo == FF_IDCT_AUTO) ||
  40.                 (s->avctx->idct_algo == FF_IDCT_ALTIVEC))
  41.         {
  42.             s->dsp.idct_put = idct_put_altivec;
  43.             s->dsp.idct_add = idct_add_altivec;
  44. #ifndef ALTIVEC_USE_REFERENCE_C_CODE
  45.             s->dsp.idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
  46. #else /* ALTIVEC_USE_REFERENCE_C_CODE */
  47.             s->dsp.idct_permutation_type = FF_NO_IDCT_PERM;
  48. #endif /* ALTIVEC_USE_REFERENCE_C_CODE */
  49.         }
  50.       }
  51.         // Test to make sure that the dct required alignments are met.
  52.         if ((((long)(s->q_intra_matrix) & 0x0f) != 0) ||
  53.                 (((long)(s->q_inter_matrix) & 0x0f) != 0))
  54.         {
  55.             av_log(s->avctx, AV_LOG_INFO, "Internal Error: q-matrix blocks must be 16-byte aligned "
  56.                     "to use Altivec DCT. Reverting to non-altivec version.n");
  57.             return;
  58.         }
  59.         if (((long)(s->intra_scantable.inverse) & 0x0f) != 0)
  60.         {
  61.             av_log(s->avctx, AV_LOG_INFO, "Internal Error: scan table blocks must be 16-byte aligned "
  62.                     "to use Altivec DCT. Reverting to non-altivec version.n");
  63.             return;
  64.         }
  65.         if ((s->avctx->dct_algo == FF_DCT_AUTO) ||
  66.                 (s->avctx->dct_algo == FF_DCT_ALTIVEC))
  67.         {
  68. #if 0 /* seems to cause trouble under some circumstances */
  69.             s->dct_quantize = dct_quantize_altivec;
  70. #endif
  71.             s->dct_unquantize_h263_intra = dct_unquantize_h263_altivec;
  72.             s->dct_unquantize_h263_inter = dct_unquantize_h263_altivec;
  73.         }
  74.     } else
  75. #endif
  76.     {
  77.         /* Non-AltiVec PPC optimisations here */
  78.     }
  79. }