3 * Copyright (c) 2000,2001 Fabrice Bellard.
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.
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.
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
21 #include "mpegvideo.h"
25 #define DC_VLC_BITS 14 //FIXME find a better solution
27 static const UINT16 rv_lum_code[256] =
29 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
30 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
31 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
32 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
33 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
34 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
35 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
36 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
37 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
38 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
39 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
40 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
41 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
42 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
43 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
44 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
45 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
46 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
47 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
48 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
49 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
50 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
51 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
52 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
53 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
54 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
55 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
56 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
57 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
58 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
59 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
60 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
63 static const UINT8 rv_lum_bits[256] =
65 14, 12, 12, 12, 12, 12, 12, 12,
66 12, 12, 12, 12, 12, 12, 12, 12,
67 12, 12, 12, 12, 12, 12, 12, 12,
68 12, 12, 12, 12, 12, 12, 12, 12,
69 12, 12, 12, 12, 12, 12, 12, 12,
70 12, 12, 12, 12, 12, 12, 12, 12,
71 12, 12, 12, 12, 12, 12, 12, 12,
72 12, 12, 12, 12, 12, 12, 12, 12,
73 12, 10, 10, 10, 10, 10, 10, 10,
74 10, 10, 10, 10, 10, 10, 10, 10,
75 10, 10, 10, 10, 10, 10, 10, 10,
76 10, 10, 10, 10, 10, 10, 10, 10,
77 10, 8, 8, 8, 8, 8, 8, 8,
78 8, 8, 8, 8, 8, 8, 8, 8,
79 8, 7, 7, 7, 7, 7, 7, 7,
80 7, 6, 6, 6, 6, 5, 5, 4,
81 2, 4, 5, 5, 6, 6, 6, 6,
82 7, 7, 7, 7, 7, 7, 7, 7,
83 8, 8, 8, 8, 8, 8, 8, 8,
84 8, 8, 8, 8, 8, 8, 8, 8,
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, 10, 10, 10, 10, 10, 10, 10,
89 12, 12, 12, 12, 12, 12, 12, 12,
90 12, 12, 12, 12, 12, 12, 12, 12,
91 12, 12, 12, 12, 12, 12, 12, 12,
92 12, 12, 12, 12, 12, 12, 12, 12,
93 12, 12, 12, 12, 12, 12, 12, 12,
94 12, 12, 12, 12, 12, 12, 12, 12,
95 12, 12, 12, 12, 12, 12, 12, 12,
96 12, 12, 12, 12, 12, 12, 12, 12,
99 static const UINT16 rv_chrom_code[256] =
101 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
102 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
103 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
104 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
105 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
106 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
107 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
108 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
109 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
110 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
111 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
112 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
113 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
114 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
115 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
116 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
117 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
118 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
119 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
120 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
121 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
122 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
123 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
124 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
125 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
126 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
127 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
128 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
129 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
130 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
131 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
132 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
135 static const UINT8 rv_chrom_bits[256] =
137 16, 14, 14, 14, 14, 14, 14, 14,
138 14, 14, 14, 14, 14, 14, 14, 14,
139 14, 14, 14, 14, 14, 14, 14, 14,
140 14, 14, 14, 14, 14, 14, 14, 14,
141 14, 14, 14, 14, 14, 14, 14, 14,
142 14, 14, 14, 14, 14, 14, 14, 14,
143 14, 14, 14, 14, 14, 14, 14, 14,
144 14, 14, 14, 14, 14, 14, 14, 14,
145 14, 12, 12, 12, 12, 12, 12, 12,
146 12, 12, 12, 12, 12, 12, 12, 12,
147 12, 12, 12, 12, 12, 12, 12, 12,
148 12, 12, 12, 12, 12, 12, 12, 12,
149 12, 10, 10, 10, 10, 10, 10, 10,
150 10, 10, 10, 10, 10, 10, 10, 10,
151 10, 8, 8, 8, 8, 8, 8, 8,
152 8, 6, 6, 6, 6, 4, 4, 3,
153 2, 3, 4, 4, 6, 6, 6, 6,
154 8, 8, 8, 8, 8, 8, 8, 8,
155 10, 10, 10, 10, 10, 10, 10, 10,
156 10, 10, 10, 10, 10, 10, 10, 10,
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, 12, 12, 12, 12, 12, 12, 12,
161 14, 14, 14, 14, 14, 14, 14, 14,
162 14, 14, 14, 14, 14, 14, 14, 14,
163 14, 14, 14, 14, 14, 14, 14, 14,
164 14, 14, 14, 14, 14, 14, 14, 14,
165 14, 14, 14, 14, 14, 14, 14, 14,
166 14, 14, 14, 14, 14, 14, 14, 14,
167 14, 14, 14, 14, 14, 14, 14, 14,
168 14, 14, 14, 14, 14, 14, 14, 14,
171 static VLC rv_dc_lum, rv_dc_chrom;
173 int rv_decode_dc(MpegEncContext *s, int n)
178 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
180 /* XXX: I don't understand why they use LONGER codes than
181 necessary. The following code would be completely useless
182 if they had thought about it !!! */
183 code = get_bits(&s->gb, 7);
185 code = (INT8)(get_bits(&s->gb, 7) + 1);
186 } else if (code == 0x7d) {
187 code = -128 + get_bits(&s->gb, 7);
188 } else if (code == 0x7e) {
189 if (get_bits(&s->gb, 1) == 0)
190 code = (INT8)(get_bits(&s->gb, 8) + 1);
192 code = (INT8)(get_bits(&s->gb, 8));
193 } else if (code == 0x7f) {
194 get_bits(&s->gb, 11);
201 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
204 code = get_bits(&s->gb, 9);
206 code = (INT8)(get_bits(&s->gb, 7) + 1);
207 } else if (code == 0x1fd) {
208 code = -128 + get_bits(&s->gb, 7);
209 } else if (code == 0x1fe) {
213 fprintf(stderr, "chroma dc error\n");
223 /* write RV 1.0 compatible frame header */
224 void rv10_encode_picture_header(MpegEncContext *s, int picture_number)
228 align_put_bits(&s->pb);
231 put_bits(&s->pb, 8, 0xc0); /* packet header */
232 put_bits(&s->pb, 16, 0x4000); /* len */
233 put_bits(&s->pb, 16, 0x4000); /* pos */
236 put_bits(&s->pb, 8, picture_number&0xFF);
238 put_bits(&s->pb, 1, 1); /* marker */
240 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
242 put_bits(&s->pb, 1, 0); /* not PB frame */
244 put_bits(&s->pb, 5, s->qscale);
246 if (s->pict_type == I_TYPE) {
247 /* specific MPEG like DC coding not used */
249 /* if multiple packets per frame are sent, the position at which
250 to display the macro blocks is coded here */
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);
257 put_bits(&s->pb, 3, 0); /* ignored */
260 static int get_num(GetBitContext *gb)
264 n = get_bits(gb, 16);
268 n1 = get_bits(gb, 16);
269 return (n << 16) | n1;
273 /* read RV 1.0 compatible frame header */
274 static int rv10_decode_picture_header(MpegEncContext *s)
276 int mb_count, pb_frame, marker, h, full_frame;
279 /* skip packet header */
280 h = get_bits(&s->gb, 8);
281 if ((h & 0xc0) == 0xc0) {
284 len = get_num(&s->gb);
285 pos = get_num(&s->gb);
286 //printf("pos:%d\n",len);
288 int seq, frame_size, pos;
290 seq = get_bits(&s->gb, 8);
291 frame_size = get_num(&s->gb);
292 pos = get_num(&s->gb);
293 //printf("seq:%d, size:%d, pos:%d\n",seq,frame_size,pos);
296 pic_num= get_bits(&s->gb, 8);
298 marker = get_bits(&s->gb, 1);
300 if (get_bits(&s->gb, 1))
301 s->pict_type = P_TYPE;
303 s->pict_type = I_TYPE;
304 //printf("h:%d ver:%d\n",h,s->rv10_version);
305 if(!marker) printf("marker missing\n");
306 pb_frame = get_bits(&s->gb, 1);
309 printf("pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
313 fprintf(stderr, "pb frame not supported\n");
317 s->qscale = get_bits(&s->gb, 5);
319 fprintf(stderr, "error, qscale:0\n");
323 if (s->pict_type == I_TYPE) {
324 if (s->rv10_version == 3) {
325 /* specific MPEG like DC coding not used */
326 s->last_dc[0] = get_bits(&s->gb, 8);
327 s->last_dc[1] = get_bits(&s->gb, 8);
328 s->last_dc[2] = get_bits(&s->gb, 8);
330 printf("DC:%d %d %d\n",
337 /* if multiple packets per frame are sent, the position at which
338 to display the macro blocks is coded here */
340 s->mb_x = get_bits(&s->gb, 6); /* mb_x */
341 s->mb_y = get_bits(&s->gb, 6); /* mb_y */
342 mb_count = get_bits(&s->gb, 12);
346 mb_count = s->mb_width * s->mb_height;
348 unk= get_bits(&s->gb, 3); /* ignored */
349 //printf("%d\n", unk);
351 s->unrestricted_mv = 1;
356 static int rv10_decode_init(AVCodecContext *avctx)
358 MpegEncContext *s = avctx->priv_data;
362 s->out_format = FMT_H263;
364 s->width = avctx->width;
365 s->height = avctx->height;
368 if(avctx->extradata_size >= 8){
369 switch(((uint32_t*)avctx->extradata)[1]){
372 s->h263_long_vectors=0;
376 s->h263_long_vectors=1;
380 s->h263_long_vectors=0;
383 fprintf(stderr, "unknown header %X\n", ((uint32_t*)avctx->extradata)[1]);
386 // for backward compatibility
387 s->rv10_version= avctx->sub_id;
390 s->flags= avctx->flags;
392 if (MPV_common_init(s) < 0)
395 h263_decode_init_vlc(s);
398 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
402 init_vlc(&rv_dc_lum, DC_VLC_BITS, 256,
405 init_vlc(&rv_dc_chrom, DC_VLC_BITS, 256,
407 rv_chrom_code, 2, 2);
414 static int rv10_decode_end(AVCodecContext *avctx)
416 MpegEncContext *s = avctx->priv_data;
422 static int rv10_decode_frame(AVCodecContext *avctx,
423 void *data, int *data_size,
424 UINT8 *buf, int buf_size)
426 MpegEncContext *s = avctx->priv_data;
427 int i, mb_count, mb_pos, left;
428 DCTELEM block[6][64];
429 AVPicture *pict = data;
432 printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
435 /* no supplementary picture */
441 init_get_bits(&s->gb, buf, buf_size);
443 mb_count = rv10_decode_picture_header(s);
445 fprintf(stderr, "HEADER ERROR\n");
449 if (s->mb_x >= s->mb_width ||
450 s->mb_y >= s->mb_height) {
451 fprintf(stderr, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
454 mb_pos = s->mb_y * s->mb_width + s->mb_x;
455 left = s->mb_width * s->mb_height - mb_pos;
456 if (mb_count > left) {
457 fprintf(stderr, "COUNT ERROR\n");
461 if (s->mb_x == 0 && s->mb_y == 0) {
462 MPV_frame_start(s, avctx);
466 printf("qscale=%d\n", s->qscale);
469 /* default quantization values */
472 s->rv10_first_dc_coded[0] = 0;
473 s->rv10_first_dc_coded[1] = 0;
474 s->rv10_first_dc_coded[2] = 0;
479 s->block_wrap[3]= s->mb_width*2 + 2;
481 s->block_wrap[5]= s->mb_width + 2;
482 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
483 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2;
484 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
485 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2;
486 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
487 s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
488 /* decode each macroblock */
489 for(i=0;i<mb_count;i++) {
490 s->block_index[0]+=2;
491 s->block_index[1]+=2;
492 s->block_index[2]+=2;
493 s->block_index[3]+=2;
497 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
500 memset(block, 0, sizeof(block));
501 s->mv_dir = MV_DIR_FORWARD;
502 s->mv_type = MV_TYPE_16X16;
503 if (h263_decode_mb(s, block) < 0) {
504 fprintf(stderr, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
507 MPV_decode_mb(s, block);
508 if (++s->mb_x == s->mb_width) {
511 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1;
512 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1);
513 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1;
514 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2);
515 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2);
516 s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2);
521 s->mb_y == s->mb_height) {
524 pict->data[0] = s->current_picture[0];
525 pict->data[1] = s->current_picture[1];
526 pict->data[2] = s->current_picture[2];
527 pict->linesize[0] = s->linesize;
528 pict->linesize[1] = s->uvlinesize;
529 pict->linesize[2] = s->uvlinesize;
531 avctx->quality = s->qscale;
532 *data_size = sizeof(AVPicture);
539 AVCodec rv10_decoder = {
543 sizeof(MpegEncContext),