Mercurial > libavcodec.hg
annotate arm/mpegvideo_armv5te.c @ 11032:01bd040f8607 libavcodec
Unroll main loop so the edge==0 case is seperate.
This allows many things to be simplified away.
h264 decoder is overall 1% faster with a mbaff sample and
0.1% slower with the cathedral sample, probably because the slow loop
filter code must be loaded into the code cache for each first MB of each
row but isnt used for the following MBs.
author | michael |
---|---|
date | Thu, 28 Jan 2010 01:24:25 +0000 |
parents | 9281a8a9387a |
children | 58c4d851d1c7 |
rev | line source |
---|---|
4341 | 1 /* |
2 * Optimization of some functions from mpegvideo.c for armv5te | |
3 * Copyright (c) 2007 Siarhei Siamashka <ssvb@users.sourceforge.net> | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
6763 | 22 #include "libavcodec/avcodec.h" |
23 #include "libavcodec/dsputil.h" | |
24 #include "libavcodec/mpegvideo.h" | |
4341 | 25 |
8250 | 26 void ff_dct_unquantize_h263_armv5te(DCTELEM *block, int qmul, int qadd, int count); |
4341 | 27 |
28 #ifdef ENABLE_ARM_TESTS | |
29 /** | |
30 * h263 dequantizer supplementary function, it is performance critical and needs to | |
31 * have optimized implementations for each architecture. Is also used as a reference | |
32 * implementation in regression tests | |
33 */ | |
34 static inline void dct_unquantize_h263_helper_c(DCTELEM *block, int qmul, int qadd, int count) | |
35 { | |
36 int i, level; | |
37 for (i = 0; i < count; i++) { | |
38 level = block[i]; | |
39 if (level) { | |
40 if (level < 0) { | |
41 level = level * qmul - qadd; | |
42 } else { | |
43 level = level * qmul + qadd; | |
44 } | |
45 block[i] = level; | |
46 } | |
47 } | |
48 } | |
49 #endif | |
50 | |
51 static void dct_unquantize_h263_intra_armv5te(MpegEncContext *s, | |
52 DCTELEM *block, int n, int qscale) | |
53 { | |
5100 | 54 int level, qmul, qadd; |
4341 | 55 int nCoeffs; |
56 | |
57 assert(s->block_last_index[n]>=0); | |
58 | |
59 qmul = qscale << 1; | |
60 | |
61 if (!s->h263_aic) { | |
62 if (n < 4) | |
63 level = block[0] * s->y_dc_scale; | |
64 else | |
65 level = block[0] * s->c_dc_scale; | |
66 qadd = (qscale - 1) | 1; | |
67 }else{ | |
68 qadd = 0; | |
69 level = block[0]; | |
70 } | |
71 if(s->ac_pred) | |
72 nCoeffs=63; | |
73 else | |
74 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ]; | |
75 | |
8197
06acc3ab4bdc
ARM: move dct_unquantize_h263_*_armv5te asm to separate file
mru
parents:
8031
diff
changeset
|
76 ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1); |
4341 | 77 block[0] = level; |
78 } | |
79 | |
80 static void dct_unquantize_h263_inter_armv5te(MpegEncContext *s, | |
81 DCTELEM *block, int n, int qscale) | |
82 { | |
5100 | 83 int qmul, qadd; |
4341 | 84 int nCoeffs; |
85 | |
86 assert(s->block_last_index[n]>=0); | |
87 | |
88 qadd = (qscale - 1) | 1; | |
89 qmul = qscale << 1; | |
90 | |
91 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ]; | |
92 | |
8197
06acc3ab4bdc
ARM: move dct_unquantize_h263_*_armv5te asm to separate file
mru
parents:
8031
diff
changeset
|
93 ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1); |
4341 | 94 } |
95 | |
96 void MPV_common_init_armv5te(MpegEncContext *s) | |
97 { | |
98 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_armv5te; | |
99 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_armv5te; | |
100 } |