3 * Copyright (c) 2000,2001 Gerard Lantau.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program 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
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "mpegvideo.h"
29 static const UINT16 rv_lum_code[256] =
31 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
32 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
33 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
34 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
35 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
36 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
37 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
38 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
39 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
40 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
41 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
42 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
43 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
44 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
45 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
46 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
47 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
48 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
49 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
50 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
51 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
52 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
53 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
54 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
55 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
56 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
57 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
58 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
59 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
60 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
61 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
62 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
65 static const UINT8 rv_lum_bits[256] =
67 14, 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, 12, 12, 12, 12, 12, 12, 12,
74 12, 12, 12, 12, 12, 12, 12, 12,
75 12, 10, 10, 10, 10, 10, 10, 10,
76 10, 10, 10, 10, 10, 10, 10, 10,
77 10, 10, 10, 10, 10, 10, 10, 10,
78 10, 10, 10, 10, 10, 10, 10, 10,
79 10, 8, 8, 8, 8, 8, 8, 8,
80 8, 8, 8, 8, 8, 8, 8, 8,
81 8, 7, 7, 7, 7, 7, 7, 7,
82 7, 6, 6, 6, 6, 5, 5, 4,
83 2, 4, 5, 5, 6, 6, 6, 6,
84 7, 7, 7, 7, 7, 7, 7, 7,
85 8, 8, 8, 8, 8, 8, 8, 8,
86 8, 8, 8, 8, 8, 8, 8, 8,
87 10, 10, 10, 10, 10, 10, 10, 10,
88 10, 10, 10, 10, 10, 10, 10, 10,
89 10, 10, 10, 10, 10, 10, 10, 10,
90 10, 10, 10, 10, 10, 10, 10, 10,
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,
97 12, 12, 12, 12, 12, 12, 12, 12,
98 12, 12, 12, 12, 12, 12, 12, 12,
101 static const UINT16 rv_chrom_code[256] =
103 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
104 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
105 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
106 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
107 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
108 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
109 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
110 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
111 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
112 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
113 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
114 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
115 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
116 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
117 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
118 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
119 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
120 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
121 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
122 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
123 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
124 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
125 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
126 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
127 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
128 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
129 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
130 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
131 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
132 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
133 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
134 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
137 static const UINT8 rv_chrom_bits[256] =
139 16, 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, 14, 14, 14, 14, 14, 14, 14,
146 14, 14, 14, 14, 14, 14, 14, 14,
147 14, 12, 12, 12, 12, 12, 12, 12,
148 12, 12, 12, 12, 12, 12, 12, 12,
149 12, 12, 12, 12, 12, 12, 12, 12,
150 12, 12, 12, 12, 12, 12, 12, 12,
151 12, 10, 10, 10, 10, 10, 10, 10,
152 10, 10, 10, 10, 10, 10, 10, 10,
153 10, 8, 8, 8, 8, 8, 8, 8,
154 8, 6, 6, 6, 6, 4, 4, 3,
155 2, 3, 4, 4, 6, 6, 6, 6,
156 8, 8, 8, 8, 8, 8, 8, 8,
157 10, 10, 10, 10, 10, 10, 10, 10,
158 10, 10, 10, 10, 10, 10, 10, 10,
159 12, 12, 12, 12, 12, 12, 12, 12,
160 12, 12, 12, 12, 12, 12, 12, 12,
161 12, 12, 12, 12, 12, 12, 12, 12,
162 12, 12, 12, 12, 12, 12, 12, 12,
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,
169 14, 14, 14, 14, 14, 14, 14, 14,
170 14, 14, 14, 14, 14, 14, 14, 14,
173 static VLC rv_dc_lum, rv_dc_chrom;
175 int rv_decode_dc(MpegEncContext *s, int n)
180 code = get_vlc(&s->gb, &rv_dc_lum);
182 /* XXX: I don't understand why they use LONGER codes than
183 necessary. The following code would be completely useless
184 if they had thought about it !!! */
185 code = get_bits(&s->gb, 7);
187 code = (INT8)(get_bits(&s->gb, 7) + 1);
188 } else if (code == 0x7d) {
189 code = -128 + get_bits(&s->gb, 7);
190 } else if (code == 0x7e) {
191 if (get_bits(&s->gb, 1) == 0)
192 code = (INT8)(get_bits(&s->gb, 8) + 1);
194 code = (INT8)(get_bits(&s->gb, 8));
195 } else if (code == 0x7f) {
196 get_bits(&s->gb, 11);
203 code = get_vlc(&s->gb, &rv_dc_chrom);
206 code = get_bits(&s->gb, 9);
208 code = (INT8)(get_bits(&s->gb, 7) + 1);
209 } else if (code == 0x1fd) {
210 code = -128 + get_bits(&s->gb, 7);
211 } else if (code == 0x1fe) {
224 /* write RV 1.0 compatible frame header */
225 void rv10_encode_picture_header(MpegEncContext *s, int picture_number)
227 align_put_bits(&s->pb);
229 put_bits(&s->pb, 1, 1); /* marker */
231 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
233 put_bits(&s->pb, 1, 0); /* not PB frame */
235 put_bits(&s->pb, 5, s->qscale);
237 if (s->pict_type == I_TYPE) {
238 /* specific MPEG like DC coding not used */
240 /* if multiple packets per frame are sent, the position at which
241 to display the macro blocks is coded here */
242 put_bits(&s->pb, 6, 0); /* mb_x */
243 put_bits(&s->pb, 6, 0); /* mb_y */
244 put_bits(&s->pb, 12, s->mb_width * s->mb_height);
246 put_bits(&s->pb, 3, 0); /* ignored */
249 static int get_num(GetBitContext *gb)
253 n = get_bits(gb, 16);
257 n1 = get_bits(gb, 16);
258 return (n << 16) | n1;
262 /* read RV 1.0 compatible frame header */
263 static int rv10_decode_picture_header(MpegEncContext *s)
265 int mb_count, pb_frame, marker, h, full_frame;
267 /* skip packet header */
268 h = get_bits(&s->gb, 8);
269 if ((h & 0xc0) == 0xc0) {
272 len = get_num(&s->gb);
273 pos = get_num(&s->gb);
275 int seq, frame_size, pos;
277 seq = get_bits(&s->gb, 8);
278 frame_size = get_num(&s->gb);
279 pos = get_num(&s->gb);
284 marker = get_bits(&s->gb, 1);
286 if (get_bits(&s->gb, 1))
287 s->pict_type = P_TYPE;
289 s->pict_type = I_TYPE;
291 pb_frame = get_bits(&s->gb, 1);
294 printf("pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
300 s->qscale = get_bits(&s->gb, 5);
302 if (s->pict_type == I_TYPE) {
303 if (s->rv10_version == 3) {
304 /* specific MPEG like DC coding not used */
305 s->last_dc[0] = get_bits(&s->gb, 8);
306 s->last_dc[1] = get_bits(&s->gb, 8);
307 s->last_dc[2] = get_bits(&s->gb, 8);
309 printf("DC:%d %d %d\n",
316 /* if multiple packets per frame are sent, the position at which
317 to display the macro blocks is coded here */
319 s->mb_x = get_bits(&s->gb, 6); /* mb_x */
320 s->mb_y = get_bits(&s->gb, 6); /* mb_y */
321 mb_count = get_bits(&s->gb, 12);
325 mb_count = s->mb_width * s->mb_height;
328 get_bits(&s->gb, 3); /* ignored */
330 s->unrestricted_mv = 1;
332 s->h263_long_vectors = 1;
337 static int rv10_decode_init(AVCodecContext *avctx)
339 MpegEncContext *s = avctx->priv_data;
343 s->out_format = FMT_H263;
345 s->width = avctx->width;
346 s->height = avctx->height;
349 s->rv10_version = avctx->sub_id;
351 if (MPV_common_init(s) < 0)
354 /* XXX: suppress this matrix init, only needed because using mpeg1
355 dequantize in mmx case */
357 s->non_intra_matrix[i] = default_non_intra_matrix[i];
359 h263_decode_init_vlc(s);
363 init_vlc(&rv_dc_lum, 9, 256,
366 init_vlc(&rv_dc_chrom, 9, 256,
368 rv_chrom_code, 2, 2);
375 static int rv10_decode_end(AVCodecContext *avctx)
377 MpegEncContext *s = avctx->priv_data;
383 static int rv10_decode_frame(AVCodecContext *avctx,
384 void *data, int *data_size,
385 UINT8 *buf, int buf_size)
387 MpegEncContext *s = avctx->priv_data;
388 int i, mb_count, mb_pos, left;
389 DCTELEM block[6][64];
390 AVPicture *pict = data;
393 printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
396 /* no supplementary picture */
402 init_get_bits(&s->gb, buf, buf_size);
404 mb_count = rv10_decode_picture_header(s);
407 printf("HEADER ERROR\n");
412 if (s->mb_x >= s->mb_width ||
413 s->mb_y >= s->mb_height) {
415 printf("POS ERROR %d %d\n", s->mb_x, s->mb_y);
419 mb_pos = s->mb_y * s->mb_width + s->mb_x;
420 left = s->mb_width * s->mb_height - mb_pos;
421 if (mb_count > left) {
423 printf("COUNT ERROR\n");
428 if (s->mb_x == 0 && s->mb_y == 0) {
433 printf("qscale=%d\n", s->qscale);
436 /* default quantization values */
439 s->rv10_first_dc_coded[0] = 0;
440 s->rv10_first_dc_coded[1] = 0;
441 s->rv10_first_dc_coded[2] = 0;
443 /* decode each macroblock */
444 for(i=0;i<mb_count;i++) {
446 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
449 memset(block, 0, sizeof(block));
450 s->mv_dir = MV_DIR_FORWARD;
451 s->mv_type = MV_TYPE_16X16;
452 if (h263_decode_mb(s, block) < 0) {
458 MPV_decode_mb(s, block);
459 if (++s->mb_x == s->mb_width) {
466 s->mb_y == s->mb_height) {
469 pict->data[0] = s->current_picture[0];
470 pict->data[1] = s->current_picture[1];
471 pict->data[2] = s->current_picture[2];
472 pict->linesize[0] = s->linesize;
473 pict->linesize[1] = s->linesize / 2;
474 pict->linesize[2] = s->linesize / 2;
476 avctx->quality = s->qscale;
477 *data_size = sizeof(AVPicture);
484 AVCodec rv10_decoder = {
488 sizeof(MpegEncContext),