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 |
|
---|