Mercurial > libavcodec.hg
annotate rv10.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | ffb3668ff7af |
children |
rev | line source |
---|---|
0 | 1 /* |
10018 | 2 * RV10/RV20 decoder |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8590
diff
changeset
|
3 * Copyright (c) 2000,2001 Fabrice Bellard |
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1706
diff
changeset
|
4 * Copyright (c) 2002-2004 Michael Niedermayer |
0 | 5 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3796
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3796
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3796
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
429 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3796
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
0 | 12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3796
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
0 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 * Lesser General Public License for more details. | |
0 | 17 * |
429 | 18 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3796
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 21 */ |
1106 | 22 |
23 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
24 * @file |
10018 | 25 * RV10/RV20 decoder |
1106 | 26 */ |
2967 | 27 |
12372
914f484bb476
Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents:
12108
diff
changeset
|
28 #include "libavcore/imgutils.h" |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
350
diff
changeset
|
29 #include "avcodec.h" |
0 | 30 #include "dsputil.h" |
31 #include "mpegvideo.h" | |
11066
86bf7e0db6ea
Add include to fix implicit declaration of ff_mpeg4_init_direct_mv and
reimar
parents:
10828
diff
changeset
|
32 #include "mpeg4video.h" |
10828 | 33 #include "h263.h" |
0 | 34 |
35 //#define DEBUG | |
36 | |
622
a1e54c24f221
working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents:
621
diff
changeset
|
37 #define DC_VLC_BITS 14 //FIXME find a better solution |
547 | 38 |
1064 | 39 static const uint16_t rv_lum_code[256] = |
0 | 40 { |
41 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, | |
42 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e, | |
43 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16, | |
44 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e, | |
45 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26, | |
46 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e, | |
47 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36, | |
48 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e, | |
49 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, | |
50 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e, | |
51 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, | |
52 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, | |
53 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, | |
54 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, | |
55 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, | |
56 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004, | |
57 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027, | |
58 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, | |
59 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, | |
60 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, | |
61 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, | |
62 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, | |
63 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, | |
64 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, | |
65 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47, | |
66 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f, | |
67 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57, | |
68 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f, | |
69 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67, | |
70 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f, | |
71 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77, | |
72 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f, | |
73 }; | |
74 | |
2967 | 75 static const uint8_t rv_lum_bits[256] = |
0 | 76 { |
77 14, 12, 12, 12, 12, 12, 12, 12, | |
78 12, 12, 12, 12, 12, 12, 12, 12, | |
79 12, 12, 12, 12, 12, 12, 12, 12, | |
80 12, 12, 12, 12, 12, 12, 12, 12, | |
81 12, 12, 12, 12, 12, 12, 12, 12, | |
82 12, 12, 12, 12, 12, 12, 12, 12, | |
83 12, 12, 12, 12, 12, 12, 12, 12, | |
84 12, 12, 12, 12, 12, 12, 12, 12, | |
85 12, 10, 10, 10, 10, 10, 10, 10, | |
86 10, 10, 10, 10, 10, 10, 10, 10, | |
87 10, 10, 10, 10, 10, 10, 10, 10, | |
88 10, 10, 10, 10, 10, 10, 10, 10, | |
89 10, 8, 8, 8, 8, 8, 8, 8, | |
90 8, 8, 8, 8, 8, 8, 8, 8, | |
91 8, 7, 7, 7, 7, 7, 7, 7, | |
92 7, 6, 6, 6, 6, 5, 5, 4, | |
93 2, 4, 5, 5, 6, 6, 6, 6, | |
94 7, 7, 7, 7, 7, 7, 7, 7, | |
95 8, 8, 8, 8, 8, 8, 8, 8, | |
96 8, 8, 8, 8, 8, 8, 8, 8, | |
97 10, 10, 10, 10, 10, 10, 10, 10, | |
98 10, 10, 10, 10, 10, 10, 10, 10, | |
99 10, 10, 10, 10, 10, 10, 10, 10, | |
100 10, 10, 10, 10, 10, 10, 10, 10, | |
101 12, 12, 12, 12, 12, 12, 12, 12, | |
102 12, 12, 12, 12, 12, 12, 12, 12, | |
103 12, 12, 12, 12, 12, 12, 12, 12, | |
104 12, 12, 12, 12, 12, 12, 12, 12, | |
105 12, 12, 12, 12, 12, 12, 12, 12, | |
106 12, 12, 12, 12, 12, 12, 12, 12, | |
107 12, 12, 12, 12, 12, 12, 12, 12, | |
108 12, 12, 12, 12, 12, 12, 12, 12, | |
109 }; | |
110 | |
1064 | 111 static const uint16_t rv_chrom_code[256] = |
0 | 112 { |
113 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06, | |
114 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e, | |
115 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16, | |
116 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e, | |
117 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, | |
118 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, | |
119 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, | |
120 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e, | |
121 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86, | |
122 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e, | |
123 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96, | |
124 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e, | |
125 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, | |
126 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, | |
127 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, | |
128 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002, | |
129 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037, | |
130 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, | |
131 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7, | |
132 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df, | |
133 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7, | |
134 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf, | |
135 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7, | |
136 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf, | |
137 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47, | |
138 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f, | |
139 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57, | |
140 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, | |
141 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67, | |
142 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, | |
143 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, | |
144 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f, | |
145 }; | |
146 | |
1064 | 147 static const uint8_t rv_chrom_bits[256] = |
0 | 148 { |
149 16, 14, 14, 14, 14, 14, 14, 14, | |
150 14, 14, 14, 14, 14, 14, 14, 14, | |
151 14, 14, 14, 14, 14, 14, 14, 14, | |
152 14, 14, 14, 14, 14, 14, 14, 14, | |
153 14, 14, 14, 14, 14, 14, 14, 14, | |
154 14, 14, 14, 14, 14, 14, 14, 14, | |
155 14, 14, 14, 14, 14, 14, 14, 14, | |
156 14, 14, 14, 14, 14, 14, 14, 14, | |
157 14, 12, 12, 12, 12, 12, 12, 12, | |
158 12, 12, 12, 12, 12, 12, 12, 12, | |
159 12, 12, 12, 12, 12, 12, 12, 12, | |
160 12, 12, 12, 12, 12, 12, 12, 12, | |
161 12, 10, 10, 10, 10, 10, 10, 10, | |
162 10, 10, 10, 10, 10, 10, 10, 10, | |
163 10, 8, 8, 8, 8, 8, 8, 8, | |
164 8, 6, 6, 6, 6, 4, 4, 3, | |
165 2, 3, 4, 4, 6, 6, 6, 6, | |
166 8, 8, 8, 8, 8, 8, 8, 8, | |
167 10, 10, 10, 10, 10, 10, 10, 10, | |
168 10, 10, 10, 10, 10, 10, 10, 10, | |
169 12, 12, 12, 12, 12, 12, 12, 12, | |
170 12, 12, 12, 12, 12, 12, 12, 12, | |
171 12, 12, 12, 12, 12, 12, 12, 12, | |
172 12, 12, 12, 12, 12, 12, 12, 12, | |
173 14, 14, 14, 14, 14, 14, 14, 14, | |
174 14, 14, 14, 14, 14, 14, 14, 14, | |
175 14, 14, 14, 14, 14, 14, 14, 14, | |
176 14, 14, 14, 14, 14, 14, 14, 14, | |
177 14, 14, 14, 14, 14, 14, 14, 14, | |
178 14, 14, 14, 14, 14, 14, 14, 14, | |
179 14, 14, 14, 14, 14, 14, 14, 14, | |
180 14, 14, 14, 14, 14, 14, 14, 14, | |
181 }; | |
182 | |
183 static VLC rv_dc_lum, rv_dc_chrom; | |
184 | |
185 int rv_decode_dc(MpegEncContext *s, int n) | |
186 { | |
187 int code; | |
188 | |
189 if (n < 4) { | |
547 | 190 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2); |
0 | 191 if (code < 0) { |
192 /* XXX: I don't understand why they use LONGER codes than | |
193 necessary. The following code would be completely useless | |
194 if they had thought about it !!! */ | |
195 code = get_bits(&s->gb, 7); | |
196 if (code == 0x7c) { | |
1064 | 197 code = (int8_t)(get_bits(&s->gb, 7) + 1); |
0 | 198 } else if (code == 0x7d) { |
199 code = -128 + get_bits(&s->gb, 7); | |
200 } else if (code == 0x7e) { | |
5513 | 201 if (get_bits1(&s->gb) == 0) |
1064 | 202 code = (int8_t)(get_bits(&s->gb, 8) + 1); |
0 | 203 else |
1064 | 204 code = (int8_t)(get_bits(&s->gb, 8)); |
0 | 205 } else if (code == 0x7f) { |
5518 | 206 skip_bits(&s->gb, 11); |
0 | 207 code = 1; |
208 } | |
209 } else { | |
210 code -= 128; | |
211 } | |
212 } else { | |
547 | 213 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2); |
0 | 214 /* same remark */ |
215 if (code < 0) { | |
216 code = get_bits(&s->gb, 9); | |
217 if (code == 0x1fc) { | |
1064 | 218 code = (int8_t)(get_bits(&s->gb, 7) + 1); |
0 | 219 } else if (code == 0x1fd) { |
220 code = -128 + get_bits(&s->gb, 7); | |
221 } else if (code == 0x1fe) { | |
5518 | 222 skip_bits(&s->gb, 9); |
0 | 223 code = 1; |
224 } else { | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
225 av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n"); |
0 | 226 return 0xffff; |
227 } | |
228 } else { | |
229 code -= 128; | |
230 } | |
231 } | |
232 return -code; | |
233 } | |
234 | |
235 /* read RV 1.0 compatible frame header */ | |
236 static int rv10_decode_picture_header(MpegEncContext *s) | |
237 { | |
2378 | 238 int mb_count, pb_frame, marker, unk, mb_xy; |
2967 | 239 |
5513 | 240 marker = get_bits1(&s->gb); |
0 | 241 |
5513 | 242 if (get_bits1(&s->gb)) |
6481 | 243 s->pict_type = FF_P_TYPE; |
0 | 244 else |
6481 | 245 s->pict_type = FF_I_TYPE; |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
246 if(!marker) av_log(s->avctx, AV_LOG_ERROR, "marker missing\n"); |
5513 | 247 pb_frame = get_bits1(&s->gb); |
0 | 248 |
9992
7b2e5c91104e
Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents:
9990
diff
changeset
|
249 dprintf(s->avctx, "pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame); |
2967 | 250 |
622
a1e54c24f221
working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents:
621
diff
changeset
|
251 if (pb_frame){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
252 av_log(s->avctx, AV_LOG_ERROR, "pb frame not supported\n"); |
0 | 253 return -1; |
622
a1e54c24f221
working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents:
621
diff
changeset
|
254 } |
0 | 255 |
256 s->qscale = get_bits(&s->gb, 5); | |
621 | 257 if(s->qscale==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
258 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n"); |
621 | 259 return -1; |
260 } | |
0 | 261 |
6481 | 262 if (s->pict_type == FF_I_TYPE) { |
0 | 263 if (s->rv10_version == 3) { |
264 /* specific MPEG like DC coding not used */ | |
265 s->last_dc[0] = get_bits(&s->gb, 8); | |
266 s->last_dc[1] = get_bits(&s->gb, 8); | |
267 s->last_dc[2] = get_bits(&s->gb, 8); | |
9992
7b2e5c91104e
Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents:
9990
diff
changeset
|
268 dprintf(s->avctx, "DC:%d %d %d\n", s->last_dc[0], |
7b2e5c91104e
Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents:
9990
diff
changeset
|
269 s->last_dc[1], s->last_dc[2]); |
0 | 270 } |
271 } | |
272 /* if multiple packets per frame are sent, the position at which | |
7980 | 273 to display the macroblocks is coded here */ |
2378 | 274 |
275 mb_xy= s->mb_x + s->mb_y*s->mb_width; | |
276 if(show_bits(&s->gb, 12)==0 || (mb_xy && mb_xy < s->mb_num)){ | |
2979 | 277 s->mb_x = get_bits(&s->gb, 6); /* mb_x */ |
278 s->mb_y = get_bits(&s->gb, 6); /* mb_y */ | |
0 | 279 mb_count = get_bits(&s->gb, 12); |
280 } else { | |
281 s->mb_x = 0; | |
282 s->mb_y = 0; | |
283 mb_count = s->mb_width * s->mb_height; | |
284 } | |
2979 | 285 unk= get_bits(&s->gb, 3); /* ignored */ |
0 | 286 s->f_code = 1; |
287 s->unrestricted_mv = 1; | |
624
35353e4520d8
use extradata for h263_long_vector mode detection
michaelni
parents:
622
diff
changeset
|
288 |
0 | 289 return mb_count; |
290 } | |
291 | |
1639 | 292 static int rv20_decode_picture_header(MpegEncContext *s) |
293 { | |
1642 | 294 int seq, mb_pos, i; |
2967 | 295 |
2358 | 296 #if 0 |
297 GetBitContext gb= s->gb; | |
298 for(i=0; i<64; i++){ | |
299 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&gb)); | |
300 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " "); | |
301 } | |
302 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
303 #endif | |
2376 | 304 #if 0 |
3793 | 305 av_log(s->avctx, AV_LOG_DEBUG, "%3dx%03d/%02Xx%02X ", s->width, s->height, s->width/4, s->height/4); |
2376 | 306 for(i=0; i<s->avctx->extradata_size; i++){ |
3793 | 307 av_log(s->avctx, AV_LOG_DEBUG, "%02X ", ((uint8_t*)s->avctx->extradata)[i]); |
2376 | 308 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " "); |
309 } | |
310 av_log(s->avctx, AV_LOG_DEBUG, "\n"); | |
311 #endif | |
2967 | 312 |
1655 | 313 if(s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){ |
314 if (get_bits(&s->gb, 3)){ | |
315 av_log(s->avctx, AV_LOG_ERROR, "unknown triplet set\n"); | |
316 return -1; | |
2967 | 317 } |
318 } | |
1639 | 319 |
1642 | 320 i= get_bits(&s->gb, 2); |
321 switch(i){ | |
6481 | 322 case 0: s->pict_type= FF_I_TYPE; break; |
323 case 1: s->pict_type= FF_I_TYPE; break; //hmm ... | |
324 case 2: s->pict_type= FF_P_TYPE; break; | |
325 case 3: s->pict_type= FF_B_TYPE; break; | |
2967 | 326 default: |
1642 | 327 av_log(s->avctx, AV_LOG_ERROR, "unknown frame type\n"); |
328 return -1; | |
329 } | |
2967 | 330 |
6481 | 331 if(s->last_picture_ptr==NULL && s->pict_type==FF_B_TYPE){ |
1844 | 332 av_log(s->avctx, AV_LOG_ERROR, "early B pix\n"); |
333 return -1; | |
334 } | |
2967 | 335 |
5513 | 336 if (get_bits1(&s->gb)){ |
1642 | 337 av_log(s->avctx, AV_LOG_ERROR, "unknown bit set\n"); |
1639 | 338 return -1; |
339 } | |
340 | |
341 s->qscale = get_bits(&s->gb, 5); | |
342 if(s->qscale==0){ | |
343 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n"); | |
344 return -1; | |
345 } | |
1655 | 346 if(s->avctx->sub_id == 0x30203002){ |
5513 | 347 if (get_bits1(&s->gb)){ |
1655 | 348 av_log(s->avctx, AV_LOG_ERROR, "unknown bit2 set\n"); |
349 return -1; | |
350 } | |
351 } | |
2967 | 352 |
1657
aaaa1767acc2
set has_b_frames correctly, fixes rv20 dr1 with mplayer
michael
parents:
1655
diff
changeset
|
353 if(s->avctx->has_b_frames){ |
3793 | 354 int f, new_w, new_h; |
3796
83aa3105b758
seems only 3 bits are used for the number of resolutions, some rv30 files have this set to 10 even though there are just 2 resolutions in the extradata
michael
parents:
3795
diff
changeset
|
355 int v= s->avctx->extradata_size >= 4 ? 7&((uint8_t*)s->avctx->extradata)[1] : 0; |
2379 | 356 |
5513 | 357 if (get_bits1(&s->gb)){ |
2379 | 358 av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n"); |
1655 | 359 } |
3793 | 360 seq= get_bits(&s->gb, 13)<<2; |
361 | |
362 f= get_bits(&s->gb, av_log2(v)+1); | |
2387 | 363 |
3793 | 364 if(f){ |
365 new_w= 4*((uint8_t*)s->avctx->extradata)[6+2*f]; | |
366 new_h= 4*((uint8_t*)s->avctx->extradata)[7+2*f]; | |
367 }else{ | |
10614
b08c6f64a6c0
Store original width/height so that rv20 does not get stuck with some
michael
parents:
10613
diff
changeset
|
368 new_w= s->orig_width ; |
b08c6f64a6c0
Store original width/height so that rv20 does not get stuck with some
michael
parents:
10613
diff
changeset
|
369 new_h= s->orig_height; |
3793 | 370 } |
371 if(new_w != s->width || new_h != s->height){ | |
372 av_log(s->avctx, AV_LOG_DEBUG, "attempting to change resolution to %dx%d\n", new_w, new_h); | |
12462
ffb3668ff7af
Use new imgutils.h API names, fix deprecation warnings.
stefano
parents:
12372
diff
changeset
|
373 if (av_image_check_size(new_w, new_h, 0, s->avctx) < 0) |
4646
cd5964d440e8
Check dimensions to avoid division by zero due to invalid new dimensions.
reimar
parents:
4364
diff
changeset
|
374 return -1; |
3793 | 375 MPV_common_end(s); |
10558
16f0933d2c7f
Make sure avcodec_set_dimensions() is used when rv20 changes resolution.
michael
parents:
10018
diff
changeset
|
376 avcodec_set_dimensions(s->avctx, new_w, new_h); |
16f0933d2c7f
Make sure avcodec_set_dimensions() is used when rv20 changes resolution.
michael
parents:
10018
diff
changeset
|
377 s->width = new_w; |
16f0933d2c7f
Make sure avcodec_set_dimensions() is used when rv20 changes resolution.
michael
parents:
10018
diff
changeset
|
378 s->height = new_h; |
3793 | 379 if (MPV_common_init(s) < 0) |
380 return -1; | |
381 } | |
2630 | 382 |
2379 | 383 if(s->avctx->debug & FF_DEBUG_PICT_INFO){ |
2412
436a5f740f29
fixing decoding of http://mplayerhq.hu/~atmos4/ffrv20-crashing-atmos.rm
michael
parents:
2387
diff
changeset
|
384 av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, v); |
2359 | 385 } |
2630 | 386 }else{ |
387 seq= get_bits(&s->gb, 8)*128; | |
388 } | |
2376 | 389 |
2967 | 390 // if(s->avctx->sub_id <= 0x20201002){ //0x20201002 definitely needs this |
2630 | 391 mb_pos= ff_h263_decode_mba(s); |
392 /* }else{ | |
2376 | 393 mb_pos= get_bits(&s->gb, av_log2(s->mb_num-1)+1); |
394 s->mb_x= mb_pos % s->mb_width; | |
395 s->mb_y= mb_pos / s->mb_width; | |
2630 | 396 }*/ |
1917 | 397 //av_log(s->avctx, AV_LOG_DEBUG, "%d\n", seq); |
1655 | 398 seq |= s->time &~0x7FFF; |
399 if(seq - s->time > 0x4000) seq -= 0x8000; | |
400 if(seq - s->time < -0x4000) seq += 0x8000; | |
2967 | 401 if(seq != s->time){ |
6481 | 402 if(s->pict_type!=FF_B_TYPE){ |
1655 | 403 s->time= seq; |
404 s->pp_time= s->time - s->last_non_b_time; | |
405 s->last_non_b_time= s->time; | |
406 }else{ | |
407 s->time= seq; | |
408 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); | |
409 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){ | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2625
diff
changeset
|
410 av_log(s->avctx, AV_LOG_DEBUG, "messed up order, possible from seeking? skipping current b frame\n"); |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2625
diff
changeset
|
411 return FRAME_SKIPPED; |
1655 | 412 } |
3791
b1d5ef809e11
fix rv20 b frames (broke since r5264 Mon Apr 3 07:52:24 2006 UTC 2x faster ff_mpeg4_set_direct_mv)
michael
parents:
3771
diff
changeset
|
413 ff_mpeg4_init_direct_mv(s); |
1655 | 414 } |
415 } | |
416 // printf("%d %d %d %d %d\n", seq, (int)s->time, (int)s->last_non_b_time, s->pp_time, s->pb_time); | |
1917 | 417 /*for(i=0; i<32; i++){ |
418 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb)); | |
419 } | |
420 av_log(s->avctx, AV_LOG_DEBUG, "\n");*/ | |
1639 | 421 s->no_rounding= get_bits1(&s->gb); |
2967 | 422 |
1639 | 423 s->f_code = 1; |
424 s->unrestricted_mv = 1; | |
6481 | 425 s->h263_aic= s->pict_type == FF_I_TYPE; |
1639 | 426 // s->alt_inter_vlc=1; |
427 // s->obmc=1; | |
428 // s->umvplus=1; | |
1644 | 429 s->modified_quant=1; |
9696 | 430 if(!s->avctx->lowres) |
9697 | 431 s->loop_filter=1; |
2967 | 432 |
1639 | 433 if(s->avctx->debug & FF_DEBUG_PICT_INFO){ |
2967 | 434 av_log(s->avctx, AV_LOG_INFO, "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n", |
1639 | 435 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding); |
436 } | |
437 | |
6481 | 438 assert(s->pict_type != FF_B_TYPE || !s->low_delay); |
1642 | 439 |
1639 | 440 return s->mb_width*s->mb_height - mb_pos; |
441 } | |
442 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6481
diff
changeset
|
443 static av_cold int rv10_decode_init(AVCodecContext *avctx) |
0 | 444 { |
445 MpegEncContext *s = avctx->priv_data; | |
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
446 static int done=0; |
0 | 447 |
8345 | 448 if (avctx->extradata_size < 8) { |
449 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n"); | |
450 return -1; | |
451 } | |
452 | |
1892 | 453 MPV_decode_defaults(s); |
2967 | 454 |
643 | 455 s->avctx= avctx; |
0 | 456 s->out_format = FMT_H263; |
1640 | 457 s->codec_id= avctx->codec_id; |
0 | 458 |
10614
b08c6f64a6c0
Store original width/height so that rv20 does not get stuck with some
michael
parents:
10613
diff
changeset
|
459 s->orig_width = s->width = avctx->coded_width; |
b08c6f64a6c0
Store original width/height so that rv20 does not get stuck with some
michael
parents:
10613
diff
changeset
|
460 s->orig_height= s->height = avctx->coded_height; |
0 | 461 |
3794 | 462 s->h263_long_vectors= ((uint8_t*)avctx->extradata)[3] & 1; |
4364 | 463 avctx->sub_id= AV_RB32((uint8_t*)avctx->extradata + 4); |
3792 | 464 |
5248
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
465 if (avctx->sub_id == 0x10000000) { |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
466 s->rv10_version= 0; |
1655 | 467 s->low_delay=1; |
8733
91007f70b81a
Fix unknown header 10001000 / http://samples.mplayerhq.hu/real/VC-RV10/thankyou.rm / issue809
michael
parents:
8718
diff
changeset
|
468 } else if (avctx->sub_id == 0x10001000) { |
91007f70b81a
Fix unknown header 10001000 / http://samples.mplayerhq.hu/real/VC-RV10/thankyou.rm / issue809
michael
parents:
8718
diff
changeset
|
469 s->rv10_version= 3; |
91007f70b81a
Fix unknown header 10001000 / http://samples.mplayerhq.hu/real/VC-RV10/thankyou.rm / issue809
michael
parents:
8718
diff
changeset
|
470 s->low_delay=1; |
5248
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
471 } else if (avctx->sub_id == 0x10002000) { |
1796 | 472 s->rv10_version= 3; |
473 s->low_delay=1; | |
474 s->obmc=1; | |
5248
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
475 } else if (avctx->sub_id == 0x10003000) { |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
476 s->rv10_version= 3; |
1655 | 477 s->low_delay=1; |
5248
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
478 } else if (avctx->sub_id == 0x10003001) { |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
479 s->rv10_version= 3; |
1655 | 480 s->low_delay=1; |
5248
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
481 } else if ( avctx->sub_id == 0x20001000 |
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
482 || (avctx->sub_id >= 0x20100000 && avctx->sub_id < 0x201a0000)) { |
1657
aaaa1767acc2
set has_b_frames correctly, fixes rv20 dr1 with mplayer
michael
parents:
1655
diff
changeset
|
483 s->low_delay=1; |
5248
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
484 } else if ( avctx->sub_id == 0x30202002 |
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
485 || avctx->sub_id == 0x30203002 |
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
486 || (avctx->sub_id >= 0x20200002 && avctx->sub_id < 0x20300000)) { |
1657
aaaa1767acc2
set has_b_frames correctly, fixes rv20 dr1 with mplayer
michael
parents:
1655
diff
changeset
|
487 s->low_delay=0; |
aaaa1767acc2
set has_b_frames correctly, fixes rv20 dr1 with mplayer
michael
parents:
1655
diff
changeset
|
488 s->avctx->has_b_frames=1; |
5248
d138b2abf3d5
* Getting rid of the use of GCC language extensions
romansh
parents:
4646
diff
changeset
|
489 } else |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
490 av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id); |
2967 | 491 |
2376 | 492 if(avctx->debug & FF_DEBUG_PICT_INFO){ |
493 av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1); | |
494 } | |
2635 | 495 |
496 avctx->pix_fmt = PIX_FMT_YUV420P; | |
497 | |
0 | 498 if (MPV_common_init(s) < 0) |
499 return -1; | |
500 | |
501 h263_decode_init_vlc(s); | |
502 | |
503 /* init rv vlc */ | |
504 if (!done) { | |
9399 | 505 INIT_VLC_STATIC(&rv_dc_lum, DC_VLC_BITS, 256, |
0 | 506 rv_lum_bits, 1, 1, |
9399 | 507 rv_lum_code, 2, 2, 16384); |
508 INIT_VLC_STATIC(&rv_dc_chrom, DC_VLC_BITS, 256, | |
0 | 509 rv_chrom_bits, 1, 1, |
9399 | 510 rv_chrom_code, 2, 2, 16388); |
0 | 511 done = 1; |
512 } | |
513 | |
514 return 0; | |
515 } | |
516 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6481
diff
changeset
|
517 static av_cold int rv10_decode_end(AVCodecContext *avctx) |
0 | 518 { |
519 MpegEncContext *s = avctx->priv_data; | |
520 | |
521 MPV_common_end(s); | |
522 return 0; | |
523 } | |
524 | |
2967 | 525 static int rv10_decode_packet(AVCodecContext *avctx, |
10613 | 526 const uint8_t *buf, int buf_size, int buf_size2) |
0 | 527 { |
528 MpegEncContext *s = avctx->priv_data; | |
3768
c540147303fa
fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents:
3261
diff
changeset
|
529 int mb_count, mb_pos, left, start_mb_x; |
0 | 530 |
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
925
diff
changeset
|
531 init_get_bits(&s->gb, buf, buf_size*8); |
1639 | 532 if(s->codec_id ==CODEC_ID_RV10) |
533 mb_count = rv10_decode_picture_header(s); | |
534 else | |
535 mb_count = rv20_decode_picture_header(s); | |
0 | 536 if (mb_count < 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
537 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n"); |
0 | 538 return -1; |
539 } | |
2967 | 540 |
0 | 541 if (s->mb_x >= s->mb_width || |
542 s->mb_y >= s->mb_height) { | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
543 av_log(s->avctx, AV_LOG_ERROR, "POS ERROR %d %d\n", s->mb_x, s->mb_y); |
0 | 544 return -1; |
545 } | |
546 mb_pos = s->mb_y * s->mb_width + s->mb_x; | |
547 left = s->mb_width * s->mb_height - mb_pos; | |
548 if (mb_count > left) { | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
549 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n"); |
0 | 550 return -1; |
551 } | |
552 | |
1700 | 553 if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) { |
2848 | 554 if(s->current_picture_ptr){ //FIXME write parser so we always have complete frames? |
555 ff_er_frame_end(s); | |
556 MPV_frame_end(s); | |
557 s->mb_x= s->mb_y = s->resync_mb_x = s->resync_mb_y= 0; | |
558 } | |
771
d4cc92144266
handle direct rendering buffer allocation failure
michaelni
parents:
745
diff
changeset
|
559 if(MPV_frame_start(s, avctx) < 0) |
d4cc92144266
handle direct rendering buffer allocation failure
michaelni
parents:
745
diff
changeset
|
560 return -1; |
2848 | 561 ff_er_frame_start(s); |
0 | 562 } |
563 | |
9992
7b2e5c91104e
Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents:
9990
diff
changeset
|
564 dprintf(avctx, "qscale=%d\n", s->qscale); |
0 | 565 |
566 /* default quantization values */ | |
1639 | 567 if(s->codec_id== CODEC_ID_RV10){ |
568 if(s->mb_y==0) s->first_slice_line=1; | |
569 }else{ | |
2967 | 570 s->first_slice_line=1; |
3768
c540147303fa
fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents:
3261
diff
changeset
|
571 s->resync_mb_x= s->mb_x; |
1639 | 572 } |
3768
c540147303fa
fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents:
3261
diff
changeset
|
573 start_mb_x= s->mb_x; |
3260 | 574 s->resync_mb_y= s->mb_y; |
1639 | 575 if(s->h263_aic){ |
2967 | 576 s->y_dc_scale_table= |
1639 | 577 s->c_dc_scale_table= ff_aic_dc_scale_table; |
578 }else{ | |
579 s->y_dc_scale_table= | |
580 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
581 } | |
1644 | 582 |
583 if(s->modified_quant) | |
584 s->chroma_qscale_table= ff_h263_chroma_qscale_table; | |
2967 | 585 |
1652 | 586 ff_set_qscale(s, s->qscale); |
1644 | 587 |
0 | 588 s->rv10_first_dc_coded[0] = 0; |
589 s->rv10_first_dc_coded[1] = 0; | |
590 s->rv10_first_dc_coded[2] = 0; | |
450 | 591 s->block_wrap[0]= |
592 s->block_wrap[1]= | |
593 s->block_wrap[2]= | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1917
diff
changeset
|
594 s->block_wrap[3]= s->b8_stride; |
450 | 595 s->block_wrap[4]= |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1917
diff
changeset
|
596 s->block_wrap[5]= s->mb_stride; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
713
diff
changeset
|
597 ff_init_block_index(s); |
0 | 598 /* decode each macroblock */ |
1796 | 599 |
600 for(s->mb_num_left= mb_count; s->mb_num_left>0; s->mb_num_left--) { | |
1639 | 601 int ret; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
713
diff
changeset
|
602 ff_update_block_index(s); |
9992
7b2e5c91104e
Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents:
9990
diff
changeset
|
603 dprintf(avctx, "**mb x=%d y=%d\n", s->mb_x, s->mb_y); |
1796 | 604 |
0 | 605 s->mv_dir = MV_DIR_FORWARD; |
2967 | 606 s->mv_type = MV_TYPE_16X16; |
1639 | 607 ret=ff_h263_decode_mb(s, s->block); |
608 | |
10613 | 609 if (ret != SLICE_ERROR && s->gb.size_in_bits < get_bits_count(&s->gb) && 8*buf_size2 >= get_bits_count(&s->gb)){ |
610 av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n", s->gb.size_in_bits, 8*buf_size2); | |
611 s->gb.size_in_bits= 8*buf_size2; | |
612 ret= SLICE_OK; | |
613 } | |
614 | |
2848 | 615 if (ret == SLICE_ERROR || s->gb.size_in_bits < get_bits_count(&s->gb)) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1389
diff
changeset
|
616 av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y); |
0 | 617 return -1; |
618 } | |
6481 | 619 if(s->pict_type != FF_B_TYPE) |
1748 | 620 ff_h263_update_motion_val(s); |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
713
diff
changeset
|
621 MPV_decode_mb(s, s->block); |
1644 | 622 if(s->loop_filter) |
623 ff_h263_loop_filter(s); | |
624 | |
0 | 625 if (++s->mb_x == s->mb_width) { |
626 s->mb_x = 0; | |
627 s->mb_y++; | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
713
diff
changeset
|
628 ff_init_block_index(s); |
1639 | 629 } |
630 if(s->mb_x == s->resync_mb_x) | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
713
diff
changeset
|
631 s->first_slice_line=0; |
1639 | 632 if(ret == SLICE_END) break; |
0 | 633 } |
634 | |
3768
c540147303fa
fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents:
3261
diff
changeset
|
635 ff_er_add_slice(s, start_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); |
2848 | 636 |
10613 | 637 return s->gb.size_in_bits; |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
638 } |
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
639 |
6250 | 640 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n) |
5842 | 641 { |
642 if(avctx->slice_count) return avctx->slice_offset[n]; | |
643 else return AV_RL32(buf + n*8); | |
644 } | |
645 | |
2967 | 646 static int rv10_decode_frame(AVCodecContext *avctx, |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
647 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9028
diff
changeset
|
648 AVPacket *avpkt) |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
649 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9028
diff
changeset
|
650 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9028
diff
changeset
|
651 int buf_size = avpkt->size; |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
652 MpegEncContext *s = avctx->priv_data; |
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
653 int i; |
2967 | 654 AVFrame *pict = data; |
5842 | 655 int slice_count; |
6250 | 656 const uint8_t *slices_hdr = NULL; |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
657 |
9992
7b2e5c91104e
Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents:
9990
diff
changeset
|
658 dprintf(avctx, "*****frame %d size=%d\n", avctx->frame_number, buf_size); |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
659 |
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
660 /* no supplementary picture */ |
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
661 if (buf_size == 0) { |
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
662 return 0; |
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
663 } |
1748 | 664 |
5842 | 665 if(!avctx->slice_count){ |
666 slice_count = (*buf++) + 1; | |
667 slices_hdr = buf + 4; | |
668 buf += 8 * slice_count; | |
669 }else | |
670 slice_count = avctx->slice_count; | |
671 | |
5843 | 672 for(i=0; i<slice_count; i++){ |
673 int offset= get_slice_offset(avctx, slices_hdr, i); | |
10613 | 674 int size, size2; |
2967 | 675 |
5843 | 676 if(i+1 == slice_count) |
677 size= buf_size - offset; | |
678 else | |
679 size= get_slice_offset(avctx, slices_hdr, i+1) - offset; | |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
680 |
10613 | 681 if(i+2 >= slice_count) |
682 size2= buf_size - offset; | |
683 else | |
684 size2= get_slice_offset(avctx, slices_hdr, i+2) - offset; | |
685 | |
686 if(rv10_decode_packet(avctx, buf+offset, size, size2) > 8*size) | |
687 i++; | |
5843 | 688 } |
2967 | 689 |
3261 | 690 if(s->current_picture_ptr != NULL && s->mb_y>=s->mb_height){ |
2848 | 691 ff_er_frame_end(s); |
0 | 692 MPV_frame_end(s); |
2967 | 693 |
6481 | 694 if (s->pict_type == FF_B_TYPE || s->low_delay) { |
3185 | 695 *pict= *(AVFrame*)s->current_picture_ptr; |
696 } else if (s->last_picture_ptr != NULL) { | |
697 *pict= *(AVFrame*)s->last_picture_ptr; | |
698 } | |
699 | |
700 if(s->last_picture_ptr || s->low_delay){ | |
701 *data_size = sizeof(AVFrame); | |
1706
3ba5c493db6f
motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1701
diff
changeset
|
702 ff_print_debug_info(s, pict); |
1655 | 703 } |
2848 | 704 s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...) |
0 | 705 } |
713
e74a563eb643
rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents:
712
diff
changeset
|
706 |
0 | 707 return buf_size; |
708 } | |
709 | |
710 AVCodec rv10_decoder = { | |
711 "rv10", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11066
diff
changeset
|
712 AVMEDIA_TYPE_VIDEO, |
0 | 713 CODEC_ID_RV10, |
714 sizeof(MpegEncContext), | |
715 rv10_decode_init, | |
716 NULL, | |
717 rv10_decode_end, | |
718 rv10_decode_frame, | |
6712 | 719 CODEC_CAP_DR1, |
12108
c35d7bc64882
Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents:
11644
diff
changeset
|
720 .max_lowres = 3, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
721 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"), |
9028 | 722 .pix_fmts= ff_pixfmt_list_420, |
0 | 723 }; |
1639 | 724 |
725 AVCodec rv20_decoder = { | |
726 "rv20", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11066
diff
changeset
|
727 AVMEDIA_TYPE_VIDEO, |
1639 | 728 CODEC_ID_RV20, |
729 sizeof(MpegEncContext), | |
730 rv10_decode_init, | |
731 NULL, | |
732 rv10_decode_end, | |
733 rv10_decode_frame, | |
2453 | 734 CODEC_CAP_DR1 | CODEC_CAP_DELAY, |
2379 | 735 .flush= ff_mpeg_flush, |
12108
c35d7bc64882
Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents:
11644
diff
changeset
|
736 .max_lowres = 3, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
737 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 2.0"), |
9028 | 738 .pix_fmts= ff_pixfmt_list_420, |
1639 | 739 }; |