set pix_fmt in rv10 patch by (James Stembridge <jstembridge at users dot sourceforge...
[libav.git] / libavcodec / rv10.c
1 /*
2 * RV10 codec
3 * Copyright (c) 2000,2001 Fabrice Bellard.
4 *
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.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
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
18 */
19
20 /**
21 * @file rv10.c
22 * RV10 codec.
23 */
24
25 #include "avcodec.h"
26 #include "dsputil.h"
27 #include "mpegvideo.h"
28
29 //#define DEBUG
30
31 #define DC_VLC_BITS 14 //FIXME find a better solution
32
33 static const uint16_t rv_lum_code[256] =
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
69 static const uint8_t rv_lum_bits[256] =
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
105 static const uint16_t rv_chrom_code[256] =
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
141 static const uint8_t rv_chrom_bits[256] =
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
177 static VLC rv_dc_lum, rv_dc_chrom;
178
179 int rv_decode_dc(MpegEncContext *s, int n)
180 {
181 int code;
182
183 if (n < 4) {
184 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
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) {
191 code = (int8_t)(get_bits(&s->gb, 7) + 1);
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)
196 code = (int8_t)(get_bits(&s->gb, 8) + 1);
197 else
198 code = (int8_t)(get_bits(&s->gb, 8));
199 } else if (code == 0x7f) {
200 get_bits(&s->gb, 11);
201 code = 1;
202 }
203 } else {
204 code -= 128;
205 }
206 } else {
207 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
208 /* same remark */
209 if (code < 0) {
210 code = get_bits(&s->gb, 9);
211 if (code == 0x1fc) {
212 code = (int8_t)(get_bits(&s->gb, 7) + 1);
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 {
219 fprintf(stderr, "chroma dc error\n");
220 return 0xffff;
221 }
222 } else {
223 code -= 128;
224 }
225 }
226 return -code;
227 }
228
229 #ifdef CONFIG_ENCODERS
230
231 /* write RV 1.0 compatible frame header */
232 void rv10_encode_picture_header(MpegEncContext *s, int picture_number)
233 {
234 int full_frame= 0;
235
236 align_put_bits(&s->pb);
237
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 */
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 }
256
257 put_bits(&s->pb, 3, 0); /* ignored */
258 }
259
260 static 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
273 #endif //CONFIG_ENCODERS
274
275 /* read RV 1.0 compatible frame header */
276 static int rv10_decode_picture_header(MpegEncContext *s)
277 {
278 int mb_count, pb_frame, marker, full_frame, unk;
279
280 full_frame= s->avctx->slice_count==1;
281 //printf("ff:%d\n", full_frame);
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;
288 //printf("h:%X ver:%d\n",h,s->rv10_version);
289 if(!marker) printf("marker missing\n");
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
296 if (pb_frame){
297 fprintf(stderr, "pb frame not supported\n");
298 return -1;
299 }
300
301 s->qscale = get_bits(&s->gb, 5);
302 if(s->qscale==0){
303 fprintf(stderr, "error, qscale:0\n");
304 return -1;
305 }
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 */
323 if ((!full_frame) || show_bits(&s->gb, 12)==0) {
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 }
332 unk= get_bits(&s->gb, 3); /* ignored */
333 //printf("%d\n", unk);
334 s->f_code = 1;
335 s->unrestricted_mv = 1;
336
337 return mb_count;
338 }
339
340 static int rv10_decode_init(AVCodecContext *avctx)
341 {
342 MpegEncContext *s = avctx->priv_data;
343 static int done=0;
344
345 s->avctx= avctx;
346 s->out_format = FMT_H263;
347
348 s->width = avctx->width;
349 s->height = avctx->height;
350
351 s->h263_rv10 = 1;
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);
367 }
368 //printf("ver:%X\n", avctx->sub_id);
369 s->flags= avctx->flags;
370
371 if (MPV_common_init(s) < 0)
372 return -1;
373
374 h263_decode_init_vlc(s);
375
376 s->y_dc_scale_table=
377 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
378 s->progressive_sequence=1;
379
380 /* init rv vlc */
381 if (!done) {
382 init_vlc(&rv_dc_lum, DC_VLC_BITS, 256,
383 rv_lum_bits, 1, 1,
384 rv_lum_code, 2, 2);
385 init_vlc(&rv_dc_chrom, DC_VLC_BITS, 256,
386 rv_chrom_bits, 1, 1,
387 rv_chrom_code, 2, 2);
388 done = 1;
389 }
390
391 avctx->pix_fmt = PIX_FMT_YUV420P;
392
393 return 0;
394 }
395
396 static int rv10_decode_end(AVCodecContext *avctx)
397 {
398 MpegEncContext *s = avctx->priv_data;
399
400 MPV_common_end(s);
401 return 0;
402 }
403
404 static int rv10_decode_packet(AVCodecContext *avctx,
405 uint8_t *buf, int buf_size)
406 {
407 MpegEncContext *s = avctx->priv_data;
408 int i, mb_count, mb_pos, left;
409
410 init_get_bits(&s->gb, buf, buf_size*8);
411
412 mb_count = rv10_decode_picture_header(s);
413 if (mb_count < 0) {
414 fprintf(stderr, "HEADER ERROR\n");
415 return -1;
416 }
417
418 if (s->mb_x >= s->mb_width ||
419 s->mb_y >= s->mb_height) {
420 fprintf(stderr, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
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) {
426 fprintf(stderr, "COUNT ERROR\n");
427 return -1;
428 }
429
430 if (s->mb_x == 0 && s->mb_y == 0) {
431 if(MPV_frame_start(s, avctx) < 0)
432 return -1;
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;
445
446 if(s->mb_y==0) s->first_slice_line=1;
447
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;
454 ff_init_block_index(s);
455 /* decode each macroblock */
456 for(i=0;i<mb_count;i++) {
457 ff_update_block_index(s);
458 #ifdef DEBUG
459 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
460 #endif
461
462 s->dsp.clear_blocks(s->block[0]);
463 s->mv_dir = MV_DIR_FORWARD;
464 s->mv_type = MV_TYPE_16X16;
465 if (ff_h263_decode_mb(s, s->block) == SLICE_ERROR) {
466 fprintf(stderr, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
467 return -1;
468 }
469 MPV_decode_mb(s, s->block);
470 if (++s->mb_x == s->mb_width) {
471 s->mb_x = 0;
472 s->mb_y++;
473 ff_init_block_index(s);
474 s->first_slice_line=0;
475 }
476 }
477
478 return buf_size;
479 }
480
481 static int rv10_decode_frame(AVCodecContext *avctx,
482 void *data, int *data_size,
483 uint8_t *buf, int buf_size)
484 {
485 MpegEncContext *s = avctx->priv_data;
486 int i;
487 AVFrame *pict = data;
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){
518 MPV_frame_end(s);
519
520 *pict= *(AVFrame*)&s->current_picture;
521
522 *data_size = sizeof(AVFrame);
523 }else{
524 *data_size = 0;
525 }
526
527 return buf_size;
528 }
529
530 AVCodec 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,
539 CODEC_CAP_DR1
540 };