annotate bfin/mpegvideo_bfin.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 5d5528c6eaf7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5131
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
1 /*
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
2 * BlackFin MPEGVIDEO OPTIMIZATIONS
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
3 *
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
4 * Copyright (C) 2007 Marc Hoffman <mmh@pleasantst.com>
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
5 *
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
6 * This file is part of FFmpeg.
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
7 *
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
12 *
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
16 * Lesser General Public License for more details.
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
17 *
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
21 */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
22
6763
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 5131
diff changeset
23 #include "libavcodec/avcodec.h"
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 5131
diff changeset
24 #include "libavcodec/dsputil.h"
f7cbb7733146 Use full path for #includes from another directory.
diego
parents: 5131
diff changeset
25 #include "libavcodec/mpegvideo.h"
5131
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
26 #include "dsputil_bfin.h"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
27
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
28 static int dct_quantize_bfin (MpegEncContext *s,
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
29 DCTELEM *block, int n,
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
30 int qscale, int *overflow)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
31 {
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
32 int last_non_zero, q, start_i;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
33 const short *qmat;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
34 short *bias;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
35 const uint8_t *scantable= s->intra_scantable.scantable;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
36 short dc;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
37 int max=0;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
38
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
39 PROF("fdct",0);
9725
4b63d4691d4a blackfin: use DCT function pointer in dct_quantize_bfin()
mru
parents: 8250
diff changeset
40 s->dsp.fdct(block);
5131
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
41 EPROF();
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
42
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
43 PROF("denoise",1);
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
44 if(s->dct_error_sum)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
45 s->denoise_dct(s, block);
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
46 EPROF();
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
47
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
48 PROF("quant-init",2);
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
49 if (s->mb_intra) {
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
50 if (!s->h263_aic) {
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
51 if (n < 4)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
52 q = s->y_dc_scale;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
53 else
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
54 q = s->c_dc_scale;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
55 q = q << 3;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
56 } else
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
57 /* For AIC we skip quant/dequant of INTRADC */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
58 q = 1 << 3;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
59
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
60 /* note: block[0] is assumed to be positive */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
61 dc = block[0] = (block[0] + (q >> 1)) / q;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
62 start_i = 1;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
63 last_non_zero = 0;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
64 bias = s->q_intra_matrix16[qscale][1];
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
65 qmat = s->q_intra_matrix16[qscale][0];
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
66
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
67 } else {
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
68 start_i = 0;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
69 last_non_zero = -1;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
70 bias = s->q_inter_matrix16[qscale][1];
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
71 qmat = s->q_inter_matrix16[qscale][0];
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
72
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
73 }
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
74 EPROF();
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
75
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
76 PROF("quantize",4);
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
77
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
78 /* for(i=start_i; i<64; i++) { */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
79 /* sign = (block[i]>>15)|1; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
80 /* level = ((abs(block[i])+bias[0])*qmat[i])>>16; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
81 /* if (level < 0) level = 0; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
82 /* max |= level; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
83 /* level = level * sign; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
84 /* block[i] = level; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
85 /* } */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
86
8031
eebc7209c47f Convert asm keyword into __asm__.
flameeyes
parents: 6763
diff changeset
87 __asm__ volatile
5131
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
88 ("i2=%1;\n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
89 "r1=[%1++]; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
90 "r0=r1>>>15 (v); \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
91 "lsetup (0f,1f) lc0=%3; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
92 "0: r0=r0|%4; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
93 " r1=abs r1 (v) || r2=[%2++];\n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
94 " r1=r1+|+%5; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
95 " r1=max(r1,%6) (v); \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
96 " r1.h=(a1 =r1.h*r2.h), r1.l=(a0 =r1.l*r2.l) (tfu); \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
97 " %0=%0|r1; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
98 " r0.h=(a1 =r1.h*r0.h), r0.l=(a0 =r1.l*r0.l) (is) || r1=[%1++];\n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
99 "1: r0=r1>>>15 (v) || [i2++]=r0;\n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
100 "r1=%0>>16; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
101 "%0=%0|r1; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
102 "%0.h=0; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
103 : "=&d" (max)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
104 : "b" (block), "b" (qmat), "a" (32), "d" (0x00010001), "d" (bias[0]*0x10001), "d" (0)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
105 : "R0","R1","R2", "I2");
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
106 if (start_i == 1) block[0] = dc;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
107
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
108 EPROF();
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
109
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
110
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
111 PROF("zzscan",5);
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
112
8031
eebc7209c47f Convert asm keyword into __asm__.
flameeyes
parents: 6763
diff changeset
113 __asm__ volatile
5131
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
114 ("r0=b[%1--] (x); \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
115 "lsetup (0f,1f) lc0=%3; \n\t" /* for(i=63; i>=start_i; i--) { */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
116 "0: p0=r0; \n\t" /* j = scantable[i]; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
117 " p0=%2+(p0<<1); \n\t" /* if (block[j]) { */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
118 " r0=w[p0]; \n\t" /* last_non_zero = i; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
119 " cc=r0==0; \n\t" /* break; */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
120 " if !cc jump 2f; \n\t" /* } */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
121 "1: r0=b[%1--] (x); \n\t" /* } */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
122 " %0=%4; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
123 " jump 3f; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
124 "2: %0=lc0; \n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
125 "3:\n\t"
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
126
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
127 : "=d" (last_non_zero)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
128 : "a" (scantable+63), "a" (block), "a" (63), "d" (last_non_zero)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
129 : "P0","R0");
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
130
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
131 EPROF();
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
132
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
133 *overflow= s->max_qcoeff < max; //overflow might have happened
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
134
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
135 bfprof();
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
136
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
137 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
138 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
139 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
140
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
141 return last_non_zero;
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
142 }
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
143
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
144 void MPV_common_init_bfin (MpegEncContext *s)
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
145 {
9728
5d5528c6eaf7 blackfin: disable broken dsputil functions
mru
parents: 9725
diff changeset
146 /* s->dct_quantize= dct_quantize_bfin; */
5131
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
147 }
757efe20a3c8 Blackfin dct_quantize_bfin routine
mhoffman
parents:
diff changeset
148