]> git.sesse.net Git - ffmpeg/blob - libavcodec/ppc/mpegvideo_ppc.c
Clean up:make dsputil subfile names consistent
[ffmpeg] / libavcodec / ppc / mpegvideo_ppc.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18
19 #include "../dsputil.h"
20 #include "../mpegvideo.h"
21 #include <time.h>
22
23 #ifdef HAVE_ALTIVEC
24 #include "dsputil_altivec.h"
25 #endif
26
27 extern int dct_quantize_altivec(MpegEncContext *s,
28         DCTELEM *block, int n,
29         int qscale, int *overflow);
30 extern void dct_unquantize_h263_altivec(MpegEncContext *s,
31                                         DCTELEM *block, int n, int qscale);
32
33 extern void idct_put_altivec(uint8_t *dest, int line_size, int16_t *block);
34 extern void idct_add_altivec(uint8_t *dest, int line_size, int16_t *block);
35
36
37 void MPV_common_init_ppc(MpegEncContext *s)
38 {
39 #ifdef HAVE_ALTIVEC
40     if (has_altivec())
41     {
42       if (s->avctx->lowres==0)
43       {
44         if ((s->avctx->idct_algo == FF_IDCT_AUTO) ||
45                 (s->avctx->idct_algo == FF_IDCT_ALTIVEC))
46         {
47             s->dsp.idct_put = idct_put_altivec;
48             s->dsp.idct_add = idct_add_altivec;
49 #ifndef ALTIVEC_USE_REFERENCE_C_CODE
50             s->dsp.idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
51 #else /* ALTIVEC_USE_REFERENCE_C_CODE */
52             s->dsp.idct_permutation_type = FF_NO_IDCT_PERM;
53 #endif /* ALTIVEC_USE_REFERENCE_C_CODE */
54         }
55       }
56
57         // Test to make sure that the dct required alignments are met.
58         if ((((long)(s->q_intra_matrix) & 0x0f) != 0) ||
59                 (((long)(s->q_inter_matrix) & 0x0f) != 0))
60         {
61             av_log(s->avctx, AV_LOG_INFO, "Internal Error: q-matrix blocks must be 16-byte aligned "
62                     "to use Altivec DCT. Reverting to non-altivec version.\n");
63             return;
64         }
65
66         if (((long)(s->intra_scantable.inverse) & 0x0f) != 0)
67         {
68             av_log(s->avctx, AV_LOG_INFO, "Internal Error: scan table blocks must be 16-byte aligned "
69                     "to use Altivec DCT. Reverting to non-altivec version.\n");
70             return;
71         }
72
73
74         if ((s->avctx->dct_algo == FF_DCT_AUTO) ||
75                 (s->avctx->dct_algo == FF_DCT_ALTIVEC))
76         {
77 #if 0 /* seems to cause trouble under some circumstances */
78             s->dct_quantize = dct_quantize_altivec;
79 #endif
80             s->dct_unquantize_h263_intra = dct_unquantize_h263_altivec;
81             s->dct_unquantize_h263_inter = dct_unquantize_h263_altivec;
82         }
83     } else
84 #endif
85     {
86         /* Non-AltiVec PPC optimisations here */
87     }
88 }
89