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