set pix_fmt in rv10 patch by (James Stembridge <jstembridge at users dot sourceforge...
[libav.git] / libavcodec / rv10.c
CommitLineData
de6d9b64
FB
1/*
2 * RV10 codec
ff4ec49e 3 * Copyright (c) 2000,2001 Fabrice Bellard.
de6d9b64 4 *
ff4ec49e
FB
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
de6d9b64 9 *
ff4ec49e 10 * This library is distributed in the hope that it will be useful,
de6d9b64 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ff4ec49e
FB
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
de6d9b64 14 *
ff4ec49e
FB
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
de6d9b64 18 */
983e3246
MN
19
20/**
21 * @file rv10.c
22 * RV10 codec.
23 */
24
de6d9b64 25#include "avcodec.h"
6000abfa 26#include "dsputil.h"
de6d9b64
FB
27#include "mpegvideo.h"
28
29//#define DEBUG
30
68bd11f5 31#define DC_VLC_BITS 14 //FIXME find a better solution
a3494679 32
0c1a9eda 33static const uint16_t rv_lum_code[256] =
de6d9b64
FB
34{
35 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
36 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
37 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
38 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
39 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
40 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
41 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
42 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
43 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
44 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
45 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
46 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
47 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
48 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
49 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
50 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
51 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
52 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
53 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
54 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
55 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
56 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
57 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
58 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
59 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
60 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
61 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
62 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
63 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
64 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
65 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
66 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
67};
68
0c1a9eda 69static const uint8_t rv_lum_bits[256] =
de6d9b64
FB
70{
71 14, 12, 12, 12, 12, 12, 12, 12,
72 12, 12, 12, 12, 12, 12, 12, 12,
73 12, 12, 12, 12, 12, 12, 12, 12,
74 12, 12, 12, 12, 12, 12, 12, 12,
75 12, 12, 12, 12, 12, 12, 12, 12,
76 12, 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, 10, 10, 10, 10, 10, 10, 10,
80 10, 10, 10, 10, 10, 10, 10, 10,
81 10, 10, 10, 10, 10, 10, 10, 10,
82 10, 10, 10, 10, 10, 10, 10, 10,
83 10, 8, 8, 8, 8, 8, 8, 8,
84 8, 8, 8, 8, 8, 8, 8, 8,
85 8, 7, 7, 7, 7, 7, 7, 7,
86 7, 6, 6, 6, 6, 5, 5, 4,
87 2, 4, 5, 5, 6, 6, 6, 6,
88 7, 7, 7, 7, 7, 7, 7, 7,
89 8, 8, 8, 8, 8, 8, 8, 8,
90 8, 8, 8, 8, 8, 8, 8, 8,
91 10, 10, 10, 10, 10, 10, 10, 10,
92 10, 10, 10, 10, 10, 10, 10, 10,
93 10, 10, 10, 10, 10, 10, 10, 10,
94 10, 10, 10, 10, 10, 10, 10, 10,
95 12, 12, 12, 12, 12, 12, 12, 12,
96 12, 12, 12, 12, 12, 12, 12, 12,
97 12, 12, 12, 12, 12, 12, 12, 12,
98 12, 12, 12, 12, 12, 12, 12, 12,
99 12, 12, 12, 12, 12, 12, 12, 12,
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};
104
0c1a9eda 105static const uint16_t rv_chrom_code[256] =
de6d9b64
FB
106{
107 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
108 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
109 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
110 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
111 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
112 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
113 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
114 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
115 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
116 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
117 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
118 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
119 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
120 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
121 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
122 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
123 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
124 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
125 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
126 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
127 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
128 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
129 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
130 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
131 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
132 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
133 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
134 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
135 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
136 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
137 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
138 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
139};
140
0c1a9eda 141static const uint8_t rv_chrom_bits[256] =
de6d9b64
FB
142{
143 16, 14, 14, 14, 14, 14, 14, 14,
144 14, 14, 14, 14, 14, 14, 14, 14,
145 14, 14, 14, 14, 14, 14, 14, 14,
146 14, 14, 14, 14, 14, 14, 14, 14,
147 14, 14, 14, 14, 14, 14, 14, 14,
148 14, 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, 12, 12, 12, 12, 12, 12, 12,
152 12, 12, 12, 12, 12, 12, 12, 12,
153 12, 12, 12, 12, 12, 12, 12, 12,
154 12, 12, 12, 12, 12, 12, 12, 12,
155 12, 10, 10, 10, 10, 10, 10, 10,
156 10, 10, 10, 10, 10, 10, 10, 10,
157 10, 8, 8, 8, 8, 8, 8, 8,
158 8, 6, 6, 6, 6, 4, 4, 3,
159 2, 3, 4, 4, 6, 6, 6, 6,
160 8, 8, 8, 8, 8, 8, 8, 8,
161 10, 10, 10, 10, 10, 10, 10, 10,
162 10, 10, 10, 10, 10, 10, 10, 10,
163 12, 12, 12, 12, 12, 12, 12, 12,
164 12, 12, 12, 12, 12, 12, 12, 12,
165 12, 12, 12, 12, 12, 12, 12, 12,
166 12, 12, 12, 12, 12, 12, 12, 12,
167 14, 14, 14, 14, 14, 14, 14, 14,
168 14, 14, 14, 14, 14, 14, 14, 14,
169 14, 14, 14, 14, 14, 14, 14, 14,
170 14, 14, 14, 14, 14, 14, 14, 14,
171 14, 14, 14, 14, 14, 14, 14, 14,
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};
176
177static VLC rv_dc_lum, rv_dc_chrom;
178
179int rv_decode_dc(MpegEncContext *s, int n)
180{
181 int code;
182
183 if (n < 4) {
a3494679 184 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
de6d9b64
FB
185 if (code < 0) {
186 /* XXX: I don't understand why they use LONGER codes than
187 necessary. The following code would be completely useless
188 if they had thought about it !!! */
189 code = get_bits(&s->gb, 7);
190 if (code == 0x7c) {
0c1a9eda 191 code = (int8_t)(get_bits(&s->gb, 7) + 1);
de6d9b64
FB
192 } else if (code == 0x7d) {
193 code = -128 + get_bits(&s->gb, 7);
194 } else if (code == 0x7e) {
195 if (get_bits(&s->gb, 1) == 0)
0c1a9eda 196 code = (int8_t)(get_bits(&s->gb, 8) + 1);
de6d9b64 197 else
0c1a9eda 198 code = (int8_t)(get_bits(&s->gb, 8));
de6d9b64
FB
199 } else if (code == 0x7f) {
200 get_bits(&s->gb, 11);
201 code = 1;
202 }
203 } else {
204 code -= 128;
205 }
206 } else {
a3494679 207 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
de6d9b64
FB
208 /* same remark */
209 if (code < 0) {
210 code = get_bits(&s->gb, 9);
211 if (code == 0x1fc) {
0c1a9eda 212 code = (int8_t)(get_bits(&s->gb, 7) + 1);
de6d9b64
FB
213 } else if (code == 0x1fd) {
214 code = -128 + get_bits(&s->gb, 7);
215 } else if (code == 0x1fe) {
216 get_bits(&s->gb, 9);
217 code = 1;
218 } else {
68bd11f5 219 fprintf(stderr, "chroma dc error\n");
de6d9b64
FB
220 return 0xffff;
221 }
222 } else {
223 code -= 128;
224 }
225 }
226 return -code;
227}
228
7604246d
WH
229#ifdef CONFIG_ENCODERS
230
de6d9b64
FB
231/* write RV 1.0 compatible frame header */
232void rv10_encode_picture_header(MpegEncContext *s, int picture_number)
233{
4c2bc159 234 int full_frame= 0;
0b61920a 235
de6d9b64 236 align_put_bits(&s->pb);
0b61920a 237
de6d9b64
FB
238 put_bits(&s->pb, 1, 1); /* marker */
239
240 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
241
242 put_bits(&s->pb, 1, 0); /* not PB frame */
243
244 put_bits(&s->pb, 5, s->qscale);
245
246 if (s->pict_type == I_TYPE) {
247 /* specific MPEG like DC coding not used */
248 }
249 /* if multiple packets per frame are sent, the position at which
250 to display the macro blocks is coded here */
0b61920a
MN
251 if(!full_frame){
252 put_bits(&s->pb, 6, 0); /* mb_x */
253 put_bits(&s->pb, 6, 0); /* mb_y */
254 put_bits(&s->pb, 12, s->mb_width * s->mb_height);
255 }
de6d9b64
FB
256
257 put_bits(&s->pb, 3, 0); /* ignored */
258}
259
260static int get_num(GetBitContext *gb)
261{
262 int n, n1;
263
264 n = get_bits(gb, 16);
265 if (n >= 0x4000) {
266 return n - 0x4000;
267 } else {
268 n1 = get_bits(gb, 16);
269 return (n << 16) | n1;
270 }
271}
272
7604246d
WH
273#endif //CONFIG_ENCODERS
274
de6d9b64
FB
275/* read RV 1.0 compatible frame header */
276static int rv10_decode_picture_header(MpegEncContext *s)
277{
144f0625 278 int mb_count, pb_frame, marker, full_frame, unk;
de6d9b64 279
144f0625
MN
280 full_frame= s->avctx->slice_count==1;
281//printf("ff:%d\n", full_frame);
de6d9b64
FB
282 marker = get_bits(&s->gb, 1);
283
284 if (get_bits(&s->gb, 1))
285 s->pict_type = P_TYPE;
286 else
287 s->pict_type = I_TYPE;
144f0625 288//printf("h:%X ver:%d\n",h,s->rv10_version);
255b3ac2 289 if(!marker) printf("marker missing\n");
de6d9b64
FB
290 pb_frame = get_bits(&s->gb, 1);
291
292#ifdef DEBUG
293 printf("pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
294#endif
295
68bd11f5
MN
296 if (pb_frame){
297 fprintf(stderr, "pb frame not supported\n");
de6d9b64 298 return -1;
68bd11f5 299 }
de6d9b64
FB
300
301 s->qscale = get_bits(&s->gb, 5);
ee3b2be6
MN
302 if(s->qscale==0){
303 fprintf(stderr, "error, qscale:0\n");
304 return -1;
305 }
de6d9b64
FB
306
307 if (s->pict_type == I_TYPE) {
308 if (s->rv10_version == 3) {
309 /* specific MPEG like DC coding not used */
310 s->last_dc[0] = get_bits(&s->gb, 8);
311 s->last_dc[1] = get_bits(&s->gb, 8);
312 s->last_dc[2] = get_bits(&s->gb, 8);
313#ifdef DEBUG
314 printf("DC:%d %d %d\n",
315 s->last_dc[0],
316 s->last_dc[1],
317 s->last_dc[2]);
318#endif
319 }
320 }
321 /* if multiple packets per frame are sent, the position at which
322 to display the macro blocks is coded here */
144f0625 323 if ((!full_frame) || show_bits(&s->gb, 12)==0) {
de6d9b64
FB
324 s->mb_x = get_bits(&s->gb, 6); /* mb_x */
325 s->mb_y = get_bits(&s->gb, 6); /* mb_y */
326 mb_count = get_bits(&s->gb, 12);
327 } else {
328 s->mb_x = 0;
329 s->mb_y = 0;
330 mb_count = s->mb_width * s->mb_height;
331 }
68bd11f5
MN
332 unk= get_bits(&s->gb, 3); /* ignored */
333//printf("%d\n", unk);
de6d9b64
FB
334 s->f_code = 1;
335 s->unrestricted_mv = 1;
255b3ac2 336
de6d9b64
FB
337 return mb_count;
338}
339
340static int rv10_decode_init(AVCodecContext *avctx)
341{
342 MpegEncContext *s = avctx->priv_data;
7604246d 343 static int done=0;
de6d9b64 344
9db99069 345 s->avctx= avctx;
de6d9b64
FB
346 s->out_format = FMT_H263;
347
348 s->width = avctx->width;
349 s->height = avctx->height;
350
351 s->h263_rv10 = 1;
144f0625
MN
352 switch(avctx->sub_id){
353 case 0x10000000:
354 s->rv10_version= 0;
355 s->h263_long_vectors=0;
356 break;
357 case 0x10003000:
358 s->rv10_version= 3;
359 s->h263_long_vectors=1;
360 break;
361 case 0x10003001:
362 s->rv10_version= 3;
363 s->h263_long_vectors=0;
364 break;
365 default:
366 fprintf(stderr, "unknown header %X\n", avctx->sub_id);
255b3ac2 367 }
144f0625 368//printf("ver:%X\n", avctx->sub_id);
3cf33c37 369 s->flags= avctx->flags;
de6d9b64
FB
370
371 if (MPV_common_init(s) < 0)
372 return -1;
373
374 h263_decode_init_vlc(s);
375
ee3b2be6
MN
376 s->y_dc_scale_table=
377 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
4d2858de 378 s->progressive_sequence=1;
ee3b2be6 379
de6d9b64
FB
380 /* init rv vlc */
381 if (!done) {
a3494679 382 init_vlc(&rv_dc_lum, DC_VLC_BITS, 256,
de6d9b64
FB
383 rv_lum_bits, 1, 1,
384 rv_lum_code, 2, 2);
a3494679 385 init_vlc(&rv_dc_chrom, DC_VLC_BITS, 256,
de6d9b64
FB
386 rv_chrom_bits, 1, 1,
387 rv_chrom_code, 2, 2);
388 done = 1;
389 }
ebc51331
JS
390
391 avctx->pix_fmt = PIX_FMT_YUV420P;
de6d9b64
FB
392
393 return 0;
394}
395
396static int rv10_decode_end(AVCodecContext *avctx)
397{
398 MpegEncContext *s = avctx->priv_data;
399
400 MPV_common_end(s);
401 return 0;
402}
403
144f0625 404static int rv10_decode_packet(AVCodecContext *avctx,
0c1a9eda 405 uint8_t *buf, int buf_size)
de6d9b64
FB
406{
407 MpegEncContext *s = avctx->priv_data;
408 int i, mb_count, mb_pos, left;
de6d9b64 409
68f593b4 410 init_get_bits(&s->gb, buf, buf_size*8);
144f0625 411
de6d9b64
FB
412 mb_count = rv10_decode_picture_header(s);
413 if (mb_count < 0) {
68bd11f5 414 fprintf(stderr, "HEADER ERROR\n");
de6d9b64
FB
415 return -1;
416 }
417
418 if (s->mb_x >= s->mb_width ||
419 s->mb_y >= s->mb_height) {
68bd11f5 420 fprintf(stderr, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
de6d9b64
FB
421 return -1;
422 }
423 mb_pos = s->mb_y * s->mb_width + s->mb_x;
424 left = s->mb_width * s->mb_height - mb_pos;
425 if (mb_count > left) {
68bd11f5 426 fprintf(stderr, "COUNT ERROR\n");
de6d9b64
FB
427 return -1;
428 }
429
430 if (s->mb_x == 0 && s->mb_y == 0) {
d6db1c9c
MN
431 if(MPV_frame_start(s, avctx) < 0)
432 return -1;
de6d9b64
FB
433 }
434
435#ifdef DEBUG
436 printf("qscale=%d\n", s->qscale);
437#endif
438
439 /* default quantization values */
440 s->y_dc_scale = 8;
441 s->c_dc_scale = 8;
442 s->rv10_first_dc_coded[0] = 0;
443 s->rv10_first_dc_coded[1] = 0;
444 s->rv10_first_dc_coded[2] = 0;
ab00685a 445
4d2858de
MN
446 if(s->mb_y==0) s->first_slice_line=1;
447
ab00685a
MN
448 s->block_wrap[0]=
449 s->block_wrap[1]=
450 s->block_wrap[2]=
451 s->block_wrap[3]= s->mb_width*2 + 2;
452 s->block_wrap[4]=
453 s->block_wrap[5]= s->mb_width + 2;
4d2858de 454 ff_init_block_index(s);
de6d9b64
FB
455 /* decode each macroblock */
456 for(i=0;i<mb_count;i++) {
4d2858de 457 ff_update_block_index(s);
de6d9b64
FB
458#ifdef DEBUG
459 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
460#endif
461
eb4b3dd3 462 s->dsp.clear_blocks(s->block[0]);
de6d9b64
FB
463 s->mv_dir = MV_DIR_FORWARD;
464 s->mv_type = MV_TYPE_16X16;
4d2858de 465 if (ff_h263_decode_mb(s, s->block) == SLICE_ERROR) {
68bd11f5 466 fprintf(stderr, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
de6d9b64
FB
467 return -1;
468 }
4d2858de 469 MPV_decode_mb(s, s->block);
de6d9b64
FB
470 if (++s->mb_x == s->mb_width) {
471 s->mb_x = 0;
472 s->mb_y++;
4d2858de
MN
473 ff_init_block_index(s);
474 s->first_slice_line=0;
de6d9b64
FB
475 }
476 }
477
144f0625
MN
478 return buf_size;
479}
480
481static int rv10_decode_frame(AVCodecContext *avctx,
482 void *data, int *data_size,
0c1a9eda 483 uint8_t *buf, int buf_size)
144f0625
MN
484{
485 MpegEncContext *s = avctx->priv_data;
486 int i;
492cd3a9 487 AVFrame *pict = data;
144f0625
MN
488
489#ifdef DEBUG
490 printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
491#endif
492
493 /* no supplementary picture */
494 if (buf_size == 0) {
495 *data_size = 0;
496 return 0;
497 }
498
499 if(avctx->slice_count){
500 for(i=0; i<avctx->slice_count; i++){
501 int offset= avctx->slice_offset[i];
502 int size;
503
504 if(i+1 == avctx->slice_count)
505 size= buf_size - offset;
506 else
507 size= avctx->slice_offset[i+1] - offset;
508
509 if( rv10_decode_packet(avctx, buf+offset, size) < 0 )
510 return -1;
511 }
512 }else{
513 if( rv10_decode_packet(avctx, buf, buf_size) < 0 )
514 return -1;
515 }
516
517 if(s->mb_y>=s->mb_height){
de6d9b64
FB
518 MPV_frame_end(s);
519
492cd3a9 520 *pict= *(AVFrame*)&s->current_picture;
144f0625 521
492cd3a9 522 *data_size = sizeof(AVFrame);
144f0625 523 }else{
de6d9b64
FB
524 *data_size = 0;
525 }
144f0625 526
de6d9b64
FB
527 return buf_size;
528}
529
530AVCodec rv10_decoder = {
531 "rv10",
532 CODEC_TYPE_VIDEO,
533 CODEC_ID_RV10,
534 sizeof(MpegEncContext),
535 rv10_decode_init,
536 NULL,
537 rv10_decode_end,
538 rv10_decode_frame,
3cf33c37 539 CODEC_CAP_DR1
de6d9b64 540};