Mercurial > libavcodec.hg
annotate alpha/mpegvideo_alpha.c @ 2497:69adfbbdcdeb libavcodec
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
which isn't the advanced one; and indeed, using adv. profile parser fails.
Using normal parser works, and that's what is done
- attempt at taking care of stride for NORM2 bitplane decoding
- duplication of much code from msmpeg4.c; this code isn't yet used, but
goes down as far as the block layer (mainly Transform Type stuff, the
remains are wild editing without checking). Unusable yet, and lacks the AC
decoding (but a step further in bitstream parsing)
patch by anonymous
| author | michael |
|---|---|
| date | Fri, 04 Feb 2005 02:20:38 +0000 |
| parents | 61cebcb5a997 |
| children | dc544c0e6220 |
| 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 |
| 1693 | 24 static void dct_unquantize_h263_intra_axp(MpegEncContext *s, DCTELEM *block, |
|
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
25 int n, int qscale) |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
26 { |
|
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
27 int i, n_coeffs; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
28 uint64_t qmul, qadd; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
29 uint64_t correction; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
30 DCTELEM *orig_block = block; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
31 DCTELEM block0; |
|
505
7a976bf93394
Ugly hack to make the assembler accept MVI instructions.
mellum
parents:
429
diff
changeset
|
32 |
|
732
bf4304c46cda
* Fix dct_unquantize_h263_axp for changed block_last_index indexing.
mellum
parents:
729
diff
changeset
|
33 qadd = WORD_VEC((qscale - 1) | 1); |
|
bf4304c46cda
* Fix dct_unquantize_h263_axp for changed block_last_index indexing.
mellum
parents:
729
diff
changeset
|
34 qmul = qscale << 1; |
|
bf4304c46cda
* Fix dct_unquantize_h263_axp for changed block_last_index indexing.
mellum
parents:
729
diff
changeset
|
35 /* This mask kills spill from negative subwords to the next subword. */ |
|
bf4304c46cda
* Fix dct_unquantize_h263_axp for changed block_last_index indexing.
mellum
parents:
729
diff
changeset
|
36 correction = WORD_VEC((qmul - 1) + 1); /* multiplication / addition */ |
|
bf4304c46cda
* Fix dct_unquantize_h263_axp for changed block_last_index indexing.
mellum
parents:
729
diff
changeset
|
37 |
| 1693 | 38 if (!s->h263_aic) { |
| 39 if (n < 4) | |
| 40 block0 = block[0] * s->y_dc_scale; | |
| 41 else | |
| 42 block0 = block[0] * s->c_dc_scale; | |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
43 } else { |
| 1693 | 44 qadd = 0; |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
45 } |
| 1693 | 46 n_coeffs = 63; // does not always use zigzag table |
|
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
47 |
|
732
bf4304c46cda
* Fix dct_unquantize_h263_axp for changed block_last_index indexing.
mellum
parents:
729
diff
changeset
|
48 for(i = 0; i <= n_coeffs; block += 4, i += 4) { |
|
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
49 uint64_t levels, negmask, zeros, add; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
50 |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
51 levels = ldq(block); |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
52 if (levels == 0) |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
53 continue; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
54 |
|
515
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
55 #ifdef __alpha_max__ |
|
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
56 /* 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
|
57 detection. */ |
|
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
58 negmask = maxsw4(levels, -1); /* negative -> ffff (-1) */ |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
59 negmask = minsw4(negmask, 0); /* positive -> 0000 (0) */ |
|
515
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
60 #else |
|
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
61 negmask = cmpbge(WORD_VEC(0x7fff), levels); |
|
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
62 negmask &= (negmask >> 1) | (1 << 7); |
|
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
63 negmask = zap(-1, negmask); |
|
86f73263a61c
Make dct_unquantize_h263 work on systems without MVI extension.
mellum
parents:
514
diff
changeset
|
64 #endif |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
65 |
|
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
66 zeros = cmpbge(0, levels); |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
67 zeros &= zeros >> 1; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
68 /* zeros |= zeros << 1 is not needed since qadd <= 255, so |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
69 zapping the lower byte suffices. */ |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
70 |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
71 levels *= qmul; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
72 levels -= correction & (negmask << 16); |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
73 |
|
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
74 /* Negate qadd for negative levels. */ |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
75 add = qadd ^ negmask; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
76 add += WORD_VEC(0x0001) & negmask; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
77 /* Set qadd to 0 for levels == 0. */ |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
78 add = zap(add, zeros); |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
79 |
|
514
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
80 levels += add; |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
81 |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
82 stq(levels, block); |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
83 } |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
84 |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
85 if (s->mb_intra && !s->h263_aic) |
|
c9f724e3a797
Update and activate dct_unquantize_h263_mvi. Thanks to M?ns Rullg?rd
mellum
parents:
505
diff
changeset
|
86 orig_block[0] = block0; |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
87 } |
|
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
88 |
| 1693 | 89 static void dct_unquantize_h263_inter_axp(MpegEncContext *s, DCTELEM *block, |
| 90 int n, int qscale) | |
| 91 { | |
| 92 int i, n_coeffs; | |
| 93 uint64_t qmul, qadd; | |
| 94 uint64_t correction; | |
| 95 DCTELEM *orig_block = block; | |
| 96 DCTELEM block0; | |
| 97 | |
| 98 qadd = WORD_VEC((qscale - 1) | 1); | |
| 99 qmul = qscale << 1; | |
| 100 /* This mask kills spill from negative subwords to the next subword. */ | |
| 101 correction = WORD_VEC((qmul - 1) + 1); /* multiplication / addition */ | |
| 102 | |
| 103 n_coeffs = s->intra_scantable.raster_end[s->block_last_index[n]]; | |
| 104 | |
| 105 for(i = 0; i <= n_coeffs; block += 4, i += 4) { | |
| 106 uint64_t levels, negmask, zeros, add; | |
| 107 | |
| 108 levels = ldq(block); | |
| 109 if (levels == 0) | |
| 110 continue; | |
| 111 | |
| 112 #ifdef __alpha_max__ | |
| 113 /* I don't think the speed difference justifies runtime | |
| 114 detection. */ | |
| 115 negmask = maxsw4(levels, -1); /* negative -> ffff (-1) */ | |
| 116 negmask = minsw4(negmask, 0); /* positive -> 0000 (0) */ | |
| 117 #else | |
| 118 negmask = cmpbge(WORD_VEC(0x7fff), levels); | |
| 119 negmask &= (negmask >> 1) | (1 << 7); | |
| 120 negmask = zap(-1, negmask); | |
| 121 #endif | |
| 122 | |
| 123 zeros = cmpbge(0, levels); | |
| 124 zeros &= zeros >> 1; | |
| 125 /* zeros |= zeros << 1 is not needed since qadd <= 255, so | |
| 126 zapping the lower byte suffices. */ | |
| 127 | |
| 128 levels *= qmul; | |
| 129 levels -= correction & (negmask << 16); | |
| 130 | |
| 131 /* Negate qadd for negative levels. */ | |
| 132 add = qadd ^ negmask; | |
| 133 add += WORD_VEC(0x0001) & negmask; | |
| 134 /* Set qadd to 0 for levels == 0. */ | |
| 135 add = zap(add, zeros); | |
| 136 | |
| 137 levels += add; | |
| 138 | |
| 139 stq(levels, block); | |
| 140 } | |
| 141 } | |
| 142 | |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
143 void MPV_common_init_axp(MpegEncContext *s) |
|
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
144 { |
| 1693 | 145 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_axp; |
| 146 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_axp; | |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
diff
changeset
|
147 } |
