Mercurial > libavcodec.hg
annotate alpha/mpegvideo_alpha.c @ 594:7e26eb37bbbc libavcodec
supporting rare overflow mess even with error_resilience>=0
author | michaelni |
---|---|
date | Sun, 04 Aug 2002 16:46:18 +0000 |
parents | 86f73263a61c |
children | fb7d96d818cf |
rev | line source |
---|---|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
1 /* |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
2 * Alpha optimized DSP utils |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
3 * Copyright (c) 2002 Falk Hueffner <falk@debian.org> |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
4 * |
429 | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
9 * |
429 | 10 * This library is distributed in the hope that it will be useful, |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 * Lesser General Public License for more details. | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
14 * |
429 | 15 * You should have received a copy of the GNU Lesser General Public |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
18 */ |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
19 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
20 #include "asm.h" |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
21 #include "../dsputil.h" |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
22 #include "../mpegvideo.h" |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
23 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
24 extern UINT8 zigzag_end[64]; |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
25 |
515
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
26 static void dct_unquantize_h263_axp(MpegEncContext *s, DCTELEM *block, |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
27 int n, int qscale) |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
28 { |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
29 int i, n_coeffs; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
30 uint64_t qmul, qadd; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
31 uint64_t correction; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
32 DCTELEM *orig_block = block; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
33 DCTELEM block0; |
505
7a976bf93394
Ugly hack to make the assembler accept MVI instructions.
mellum
parents:
429
diff
changeset
|
34 |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
35 if (s->mb_intra) { |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
36 if (!s->h263_aic) { |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
37 if (n < 4) |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
38 block0 = block[0] * s->y_dc_scale; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
39 else |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
40 block0 = block[0] * s->c_dc_scale; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
41 } |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
42 n_coeffs = 64; // does not always use zigzag table |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
43 } else { |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
44 n_coeffs = zigzag_end[s->block_last_index[n]]; |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
45 } |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
46 |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
47 qmul = qscale << 1; |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
48 qadd = WORD_VEC((qscale - 1) | 1); |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
49 /* This mask kills spill from negative subwords to the next subword. */ |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
50 correction = WORD_VEC((qmul - 1) + 1); /* multiplication / addition */ |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
51 |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
52 for(i = 0; i < n_coeffs; block += 4, i += 4) { |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
53 uint64_t levels, negmask, zeros, add; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
54 |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
55 levels = ldq(block); |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
56 if (levels == 0) |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
57 continue; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
58 |
515
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
59 #ifdef __alpha_max__ |
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
60 /* I don't think the speed difference justifies runtime |
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
61 detection. */ |
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
62 ASM_ACCEPT_MVI; |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
63 negmask = maxsw4(levels, -1); /* negative -> ffff (-1) */ |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
64 negmask = minsw4(negmask, 0); /* positive -> 0000 (0) */ |
515
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
65 #else |
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
66 negmask = cmpbge(WORD_VEC(0x7fff), levels); |
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
67 negmask &= (negmask >> 1) | (1 << 7); |
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
68 negmask = zap(-1, negmask); |
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
69 #endif |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
70 |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
71 zeros = cmpbge(0, levels); |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
72 zeros &= zeros >> 1; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
73 /* zeros |= zeros << 1 is not needed since qadd <= 255, so |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
74 zapping the lower byte suffices. */ |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
75 |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
76 levels *= qmul; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
77 levels -= correction & (negmask << 16); |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
78 |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
79 /* Negate qadd for negative levels. */ |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
80 add = qadd ^ negmask; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
81 add += WORD_VEC(0x0001) & negmask; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
82 /* Set qadd to 0 for levels == 0. */ |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
83 add = zap(add, zeros); |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
84 |
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
85 levels += add; |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
86 |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
87 stq(levels, block); |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
88 } |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
89 |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
90 if (s->mb_intra && !s->h263_aic) |
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to Mns Rullgrd
mellum
parents:
505
diff
changeset
|
91 orig_block[0] = block0; |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
92 } |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
93 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
94 void MPV_common_init_axp(MpegEncContext *s) |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
95 { |
515
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
96 s->dct_unquantize_h263 = dct_unquantize_h263_axp; |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
97 } |