annotate rv10.c @ 5306:abc5c130b448 libavcodec

AC-3 decoder, soc revision 32, Jul 17 09:37:32 2006 UTC by cloud9 Latest commit. There is no error in parsing and or recovering transform coefficients. Double checked with ac3dec. Getting consistent results with the bit allocation routine and transform coefficients. The code is able to parse valid ac3 bitstreams without error from start to end. I have also implemented the imdct when block switching is not enabled. However, can anybody provide an insight into how to convert float samples to int16_t ? lrint is of no help cuz it produces output -1, 0 or 1 whereas the output should be between -32768 to 32767.
author jbr
date Sat, 14 Jul 2007 15:48:28 +0000
parents d138b2abf3d5
children 9f8219a3b86f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 * RV10 codec
429
718a22dc121f license/copyright change
glantau
parents: 396
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
986e461dc072 Initial revision
glantau
parents:
diff changeset
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
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
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
986e461dc072 Initial revision
glantau
parents:
diff changeset
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
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
16 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
17 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
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
986e461dc072 Initial revision
glantau
parents:
diff changeset
21 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
22
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
23 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
24 * @file rv10.c
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
25 * RV10 codec.
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
26 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
27
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 350
diff changeset
28 #include "avcodec.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
29 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
30 #include "mpegvideo.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
31
986e461dc072 Initial revision
glantau
parents:
diff changeset
32 //#define DEBUG
986e461dc072 Initial revision
glantau
parents:
diff changeset
33
622
a1e54c24f221 working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents: 621
diff changeset
34 #define DC_VLC_BITS 14 //FIXME find a better solution
547
31be0f0b0792 get_vlc -> get_vlc2
michaelni
parents: 450
diff changeset
35
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
36 static const uint16_t rv_lum_code[256] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
48 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
50 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
986e461dc072 Initial revision
glantau
parents:
diff changeset
53 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
986e461dc072 Initial revision
glantau
parents:
diff changeset
55 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
986e461dc072 Initial revision
glantau
parents:
diff changeset
69 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
71
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
72 static const uint8_t rv_lum_bits[256] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 14, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
76 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
82 12, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 10, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 8, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 8, 7, 7, 7, 7, 7, 7, 7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 7, 6, 6, 6, 6, 5, 5, 4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 2, 4, 5, 5, 6, 6, 6, 6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 7, 7, 7, 7, 7, 7, 7, 7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 8, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 8, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
96 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
99 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
101 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
102 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
107
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
108 static const uint16_t rv_chrom_code[256] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
109 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
110 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
112 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
986e461dc072 Initial revision
glantau
parents:
diff changeset
113 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
114 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
986e461dc072 Initial revision
glantau
parents:
diff changeset
124 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
143
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
144 static const uint8_t rv_chrom_bits[256] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 16, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
147 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
149 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 14, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
155 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 12, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
159 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 10, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 8, 6, 6, 6, 6, 4, 4, 3,
986e461dc072 Initial revision
glantau
parents:
diff changeset
162 2, 3, 4, 4, 6, 6, 6, 6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 8, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
173 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
175 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
176 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
177 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
179
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 static VLC rv_dc_lum, rv_dc_chrom;
986e461dc072 Initial revision
glantau
parents:
diff changeset
181
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 int rv_decode_dc(MpegEncContext *s, int n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 int code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
185
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 if (n < 4) {
547
31be0f0b0792 get_vlc -> get_vlc2
michaelni
parents: 450
diff changeset
187 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 if (code < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
189 /* XXX: I don't understand why they use LONGER codes than
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 necessary. The following code would be completely useless
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 if they had thought about it !!! */
986e461dc072 Initial revision
glantau
parents:
diff changeset
192 code = get_bits(&s->gb, 7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
193 if (code == 0x7c) {
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
194 code = (int8_t)(get_bits(&s->gb, 7) + 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 } else if (code == 0x7d) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
196 code = -128 + get_bits(&s->gb, 7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 } else if (code == 0x7e) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 if (get_bits(&s->gb, 1) == 0)
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
199 code = (int8_t)(get_bits(&s->gb, 8) + 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 else
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
201 code = (int8_t)(get_bits(&s->gb, 8));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 } else if (code == 0x7f) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 get_bits(&s->gb, 11);
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 code = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 code -= 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 } else {
547
31be0f0b0792 get_vlc -> get_vlc2
michaelni
parents: 450
diff changeset
210 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 /* same remark */
986e461dc072 Initial revision
glantau
parents:
diff changeset
212 if (code < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 code = get_bits(&s->gb, 9);
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 if (code == 0x1fc) {
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
215 code = (int8_t)(get_bits(&s->gb, 7) + 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 } else if (code == 0x1fd) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 code = -128 + get_bits(&s->gb, 7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
218 } else if (code == 0x1fe) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 get_bits(&s->gb, 9);
986e461dc072 Initial revision
glantau
parents:
diff changeset
220 code = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 } else {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
222 av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 return 0xffff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
224 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
225 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 code -= 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
227 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
228 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
229 return -code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
231
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
232 #ifdef CONFIG_ENCODERS
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
233
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
234 /* write RV 1.0 compatible frame header */
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 void rv10_encode_picture_header(MpegEncContext *s, int picture_number)
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 {
712
e55b91623e09 fixing rv10, this isnt the cleanest solution (parsing the packet header in the codec & creating it in the muxer) but it was that way before things broke, and its the simplest solution
michaelni
parents: 646
diff changeset
237 int full_frame= 0;
646
f87dc45d921d fixing rv10 encoding (ffmpeg can at least decode its own rv10 files now)
michaelni
parents: 643
diff changeset
238
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
239 align_put_bits(&s->pb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
240
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
241 put_bits(&s->pb, 1, 1); /* marker */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
242
986e461dc072 Initial revision
glantau
parents:
diff changeset
243 put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
986e461dc072 Initial revision
glantau
parents:
diff changeset
244
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
245 put_bits(&s->pb, 1, 0); /* not PB frame */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
246
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 put_bits(&s->pb, 5, s->qscale);
986e461dc072 Initial revision
glantau
parents:
diff changeset
248
986e461dc072 Initial revision
glantau
parents:
diff changeset
249 if (s->pict_type == I_TYPE) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
250 /* specific MPEG like DC coding not used */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
251 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
252 /* if multiple packets per frame are sent, the position at which
986e461dc072 Initial revision
glantau
parents:
diff changeset
253 to display the macro blocks is coded here */
646
f87dc45d921d fixing rv10 encoding (ffmpeg can at least decode its own rv10 files now)
michaelni
parents: 643
diff changeset
254 if(!full_frame){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
255 put_bits(&s->pb, 6, 0); /* mb_x */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
256 put_bits(&s->pb, 6, 0); /* mb_y */
646
f87dc45d921d fixing rv10 encoding (ffmpeg can at least decode its own rv10 files now)
michaelni
parents: 643
diff changeset
257 put_bits(&s->pb, 12, s->mb_width * s->mb_height);
f87dc45d921d fixing rv10 encoding (ffmpeg can at least decode its own rv10 files now)
michaelni
parents: 643
diff changeset
258 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
259
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
260 put_bits(&s->pb, 3, 0); /* ignored */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
261 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
262
2380
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
263 void rv20_encode_picture_header(MpegEncContext *s, int picture_number){
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
264 put_bits(&s->pb, 2, s->pict_type); //I 0 vs. 1 ?
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
265 put_bits(&s->pb, 1, 0); /* unknown bit */
2380
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
266 put_bits(&s->pb, 5, s->qscale);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
267
2380
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
268 put_bits(&s->pb, 8, picture_number&0xFF); //FIXME wrong, but correct is not known
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
269 s->mb_x= s->mb_y= 0;
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
270 ff_h263_encode_mba(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
271
2380
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
272 put_bits(&s->pb, 1, s->no_rounding);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
273
2380
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
274 assert(s->f_code == 1);
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
275 assert(s->unrestricted_mv == 1);
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
276 // assert(s->h263_aic== (s->pict_type == I_TYPE));
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
277 assert(s->alt_inter_vlc == 0);
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
278 assert(s->umvplus == 0);
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
279 assert(s->modified_quant==1);
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
280 assert(s->loop_filter==1);
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
281
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
282 s->h263_aic= s->pict_type == I_TYPE;
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
283 if(s->h263_aic){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
284 s->y_dc_scale_table=
2380
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
285 s->c_dc_scale_table= ff_aic_dc_scale_table;
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
286 }else{
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
287 s->y_dc_scale_table=
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
288 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
289 }
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
290 }
3daf36fd1999 rv20 encoding
michael
parents: 2379
diff changeset
291
2522
e25782262d7d kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents: 2453
diff changeset
292 #if 0 /* unused, remove? */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
293 static int get_num(GetBitContext *gb)
986e461dc072 Initial revision
glantau
parents:
diff changeset
294 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
295 int n, n1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
296
986e461dc072 Initial revision
glantau
parents:
diff changeset
297 n = get_bits(gb, 16);
986e461dc072 Initial revision
glantau
parents:
diff changeset
298 if (n >= 0x4000) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
299 return n - 0x4000;
986e461dc072 Initial revision
glantau
parents:
diff changeset
300 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
301 n1 = get_bits(gb, 16);
986e461dc072 Initial revision
glantau
parents:
diff changeset
302 return (n << 16) | n1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
303 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
304 }
2522
e25782262d7d kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents: 2453
diff changeset
305 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
306
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
307 #endif //CONFIG_ENCODERS
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
308
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
309 /* read RV 1.0 compatible frame header */
986e461dc072 Initial revision
glantau
parents:
diff changeset
310 static int rv10_decode_picture_header(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
311 {
2378
1f56314b3770 rv10 thread safety fix / rv10 ffplay fix
michael
parents: 2376
diff changeset
312 int mb_count, pb_frame, marker, unk, mb_xy;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
313
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
314 //printf("ff:%d\n", full_frame);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
315 marker = get_bits(&s->gb, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
316
986e461dc072 Initial revision
glantau
parents:
diff changeset
317 if (get_bits(&s->gb, 1))
986e461dc072 Initial revision
glantau
parents:
diff changeset
318 s->pict_type = P_TYPE;
986e461dc072 Initial revision
glantau
parents:
diff changeset
319 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
320 s->pict_type = I_TYPE;
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
321 //printf("h:%X ver:%d\n",h,s->rv10_version);
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
322 if(!marker) av_log(s->avctx, AV_LOG_ERROR, "marker missing\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
323 pb_frame = get_bits(&s->gb, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
324
986e461dc072 Initial revision
glantau
parents:
diff changeset
325 #ifdef DEBUG
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
326 av_log(s->avctx, AV_LOG_DEBUG, "pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
327 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
328
622
a1e54c24f221 working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents: 621
diff changeset
329 if (pb_frame){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
330 av_log(s->avctx, AV_LOG_ERROR, "pb frame not supported\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
331 return -1;
622
a1e54c24f221 working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents: 621
diff changeset
332 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
333
986e461dc072 Initial revision
glantau
parents:
diff changeset
334 s->qscale = get_bits(&s->gb, 5);
621
980b661a494a fixes rv10 decoding crash
michaelni
parents: 559
diff changeset
335 if(s->qscale==0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
336 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
621
980b661a494a fixes rv10 decoding crash
michaelni
parents: 559
diff changeset
337 return -1;
980b661a494a fixes rv10 decoding crash
michaelni
parents: 559
diff changeset
338 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
339
986e461dc072 Initial revision
glantau
parents:
diff changeset
340 if (s->pict_type == I_TYPE) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
341 if (s->rv10_version == 3) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
342 /* specific MPEG like DC coding not used */
986e461dc072 Initial revision
glantau
parents:
diff changeset
343 s->last_dc[0] = get_bits(&s->gb, 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
344 s->last_dc[1] = get_bits(&s->gb, 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
345 s->last_dc[2] = get_bits(&s->gb, 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
346 #ifdef DEBUG
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
347 av_log(s->avctx, AV_LOG_DEBUG, "DC:%d %d %d\n",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
348 s->last_dc[0],
986e461dc072 Initial revision
glantau
parents:
diff changeset
349 s->last_dc[1],
986e461dc072 Initial revision
glantau
parents:
diff changeset
350 s->last_dc[2]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
351 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
352 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
353 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 /* if multiple packets per frame are sent, the position at which
986e461dc072 Initial revision
glantau
parents:
diff changeset
355 to display the macro blocks is coded here */
2378
1f56314b3770 rv10 thread safety fix / rv10 ffplay fix
michael
parents: 2376
diff changeset
356
1f56314b3770 rv10 thread safety fix / rv10 ffplay fix
michael
parents: 2376
diff changeset
357 mb_xy= s->mb_x + s->mb_y*s->mb_width;
1f56314b3770 rv10 thread safety fix / rv10 ffplay fix
michael
parents: 2376
diff changeset
358 if(show_bits(&s->gb, 12)==0 || (mb_xy && mb_xy < s->mb_num)){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
359 s->mb_x = get_bits(&s->gb, 6); /* mb_x */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
360 s->mb_y = get_bits(&s->gb, 6); /* mb_y */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
361 mb_count = get_bits(&s->gb, 12);
986e461dc072 Initial revision
glantau
parents:
diff changeset
362 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
363 s->mb_x = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
364 s->mb_y = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
365 mb_count = s->mb_width * s->mb_height;
986e461dc072 Initial revision
glantau
parents:
diff changeset
366 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
367 unk= get_bits(&s->gb, 3); /* ignored */
622
a1e54c24f221 working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents: 621
diff changeset
368 //printf("%d\n", unk);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
369 s->f_code = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
370 s->unrestricted_mv = 1;
624
35353e4520d8 use extradata for h263_long_vector mode detection
michaelni
parents: 622
diff changeset
371
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
372 return mb_count;
986e461dc072 Initial revision
glantau
parents:
diff changeset
373 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
374
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
375 static int rv20_decode_picture_header(MpegEncContext *s)
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
376 {
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
377 int seq, mb_pos, i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
378
2358
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
379 #if 0
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
380 GetBitContext gb= s->gb;
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
381 for(i=0; i<64; i++){
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
382 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&gb));
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
383 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
384 }
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
385 av_log(s->avctx, AV_LOG_DEBUG, "\n");
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
386 #endif
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
387 #if 0
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
388 av_log(s->avctx, AV_LOG_DEBUG, "%3dx%03d/%02Xx%02X ", s->width, s->height, s->width/4, s->height/4);
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
389 for(i=0; i<s->avctx->extradata_size; i++){
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
390 av_log(s->avctx, AV_LOG_DEBUG, "%02X ", ((uint8_t*)s->avctx->extradata)[i]);
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
391 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
392 }
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
393 av_log(s->avctx, AV_LOG_DEBUG, "\n");
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
394 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
395
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
396 if(s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
397 if (get_bits(&s->gb, 3)){
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
398 av_log(s->avctx, AV_LOG_ERROR, "unknown triplet set\n");
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
399 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
400 }
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
401 }
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
402
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
403 i= get_bits(&s->gb, 2);
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
404 switch(i){
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
405 case 0: s->pict_type= I_TYPE; break;
1643
9bb07bd315d9 4th frame type ...
michael
parents: 1642
diff changeset
406 case 1: s->pict_type= I_TYPE; break; //hmm ...
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
407 case 2: s->pict_type= P_TYPE; break;
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
408 case 3: s->pict_type= B_TYPE; break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
409 default:
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
410 av_log(s->avctx, AV_LOG_ERROR, "unknown frame type\n");
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
411 return -1;
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
412 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
413
1844
2de13087f46e skip b frames before first i frame
michael
parents: 1823
diff changeset
414 if(s->last_picture_ptr==NULL && s->pict_type==B_TYPE){
2de13087f46e skip b frames before first i frame
michael
parents: 1823
diff changeset
415 av_log(s->avctx, AV_LOG_ERROR, "early B pix\n");
2de13087f46e skip b frames before first i frame
michael
parents: 1823
diff changeset
416 return -1;
2de13087f46e skip b frames before first i frame
michael
parents: 1823
diff changeset
417 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
418
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
419 if (get_bits(&s->gb, 1)){
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
420 av_log(s->avctx, AV_LOG_ERROR, "unknown bit set\n");
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
421 return -1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
422 }
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
423
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
424 s->qscale = get_bits(&s->gb, 5);
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
425 if(s->qscale==0){
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
426 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
427 return -1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
428 }
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
429 if(s->avctx->sub_id == 0x30203002){
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
430 if (get_bits(&s->gb, 1)){
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
431 av_log(s->avctx, AV_LOG_ERROR, "unknown bit2 set\n");
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
432 return -1;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
433 }
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
434 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
435
1657
aaaa1767acc2 set has_b_frames correctly, fixes rv20 dr1 with mplayer
michael
parents: 1655
diff changeset
436 if(s->avctx->has_b_frames){
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
437 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
438 int v= s->avctx->extradata_size >= 4 ? 7&((uint8_t*)s->avctx->extradata)[1] : 0;
2379
a9aae760463e seeking in rm
michael
parents: 2378
diff changeset
439
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
440 if (get_bits(&s->gb, 1)){
2379
a9aae760463e seeking in rm
michael
parents: 2378
diff changeset
441 av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n");
1700
651b422d51d8 fix crash
michael
parents: 1675
diff changeset
442 // return -1;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
443 }
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
444 seq= get_bits(&s->gb, 13)<<2;
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
445
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
446 f= get_bits(&s->gb, av_log2(v)+1);
2387
f45248df9796 another try at fixing rv20 ...
michael
parents: 2380
diff changeset
447
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
448 if(f){
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
449 new_w= 4*((uint8_t*)s->avctx->extradata)[6+2*f];
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
450 new_h= 4*((uint8_t*)s->avctx->extradata)[7+2*f];
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
451 }else{
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
452 new_w= s->width; //FIXME wrong we of course must save the original in the context
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
453 new_h= s->height;
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
454 }
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
455 if(new_w != s->width || new_h != s->height){
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
456 av_log(s->avctx, AV_LOG_DEBUG, "attempting to change resolution to %dx%d\n", new_w, new_h);
4646
cd5964d440e8 Check dimensions to avoid division by zero due to invalid new dimensions.
reimar
parents: 4364
diff changeset
457 if (avcodec_check_dimensions(s->avctx, new_h, new_w) < 0)
cd5964d440e8 Check dimensions to avoid division by zero due to invalid new dimensions.
reimar
parents: 4364
diff changeset
458 return -1;
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
459 MPV_common_end(s);
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
460 s->width = s->avctx->width = new_w;
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
461 s->height = s->avctx->height= new_h;
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
462 if (MPV_common_init(s) < 0)
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
463 return -1;
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
464 }
2630
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
465
2379
a9aae760463e seeking in rm
michael
parents: 2378
diff changeset
466 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
467 av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, v);
2359
a3c029107a88 fixing rv20201002
michael
parents: 2358
diff changeset
468 }
2630
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
469 }else{
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
470 seq= get_bits(&s->gb, 8)*128;
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
471 }
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
472
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
473 // if(s->avctx->sub_id <= 0x20201002){ //0x20201002 definitely needs this
2630
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
474 mb_pos= ff_h263_decode_mba(s);
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
475 /* }else{
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
476 mb_pos= get_bits(&s->gb, av_log2(s->mb_num-1)+1);
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
477 s->mb_x= mb_pos % s->mb_width;
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
478 s->mb_y= mb_pos / s->mb_width;
2630
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
479 }*/
1917
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
480 //av_log(s->avctx, AV_LOG_DEBUG, "%d\n", seq);
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
481 seq |= s->time &~0x7FFF;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
482 if(seq - s->time > 0x4000) seq -= 0x8000;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
483 if(seq - s->time < -0x4000) seq += 0x8000;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
484 if(seq != s->time){
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
485 if(s->pict_type!=B_TYPE){
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
486 s->time= seq;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
487 s->pp_time= s->time - s->last_non_b_time;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
488 s->last_non_b_time= s->time;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
489 }else{
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
490 s->time= seq;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
491 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
492 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
493 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
494 return FRAME_SKIPPED;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
495 }
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
496 ff_mpeg4_init_direct_mv(s);
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
497 }
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
498 }
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
499 // printf("%d %d %d %d %d\n", seq, (int)s->time, (int)s->last_non_b_time, s->pp_time, s->pb_time);
1917
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
500 /*for(i=0; i<32; i++){
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
501 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
502 }
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
503 av_log(s->avctx, AV_LOG_DEBUG, "\n");*/
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
504 s->no_rounding= get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
505
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
506 s->f_code = 1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
507 s->unrestricted_mv = 1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
508 s->h263_aic= s->pict_type == I_TYPE;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
509 // s->alt_inter_vlc=1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
510 // s->obmc=1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
511 // s->umvplus=1;
1644
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
512 s->modified_quant=1;
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
513 s->loop_filter=1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
514
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
515 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
516 av_log(s->avctx, AV_LOG_INFO, "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n",
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
517 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding);
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
518 }
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
519
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
520 assert(s->pict_type != B_TYPE || !s->low_delay);
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
521
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
522 return s->mb_width*s->mb_height - mb_pos;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
523 }
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
524
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
525 static int rv10_decode_init(AVCodecContext *avctx)
986e461dc072 Initial revision
glantau
parents:
diff changeset
526 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
527 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
528 static int done=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
529
1892
5ac49e7a1b8f init cleanup
michael
parents: 1844
diff changeset
530 MPV_decode_defaults(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
531
643
3db611caee55 fixing segfault
michaelni
parents: 624
diff changeset
532 s->avctx= avctx;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
533 s->out_format = FMT_H263;
1640
3bc71266e644 rv10 fix
michael
parents: 1639
diff changeset
534 s->codec_id= avctx->codec_id;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
535
986e461dc072 Initial revision
glantau
parents:
diff changeset
536 s->width = avctx->width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
537 s->height = avctx->height;
986e461dc072 Initial revision
glantau
parents:
diff changeset
538
3794
339f1741fbfa big endian fix
michael
parents: 3793
diff changeset
539 s->h263_long_vectors= ((uint8_t*)avctx->extradata)[3] & 1;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
540 avctx->sub_id= AV_RB32((uint8_t*)avctx->extradata + 4);
3792
036780cfa4c2 simplify
michael
parents: 3791
diff changeset
541
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
542 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
543 s->rv10_version= 0;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
544 s->low_delay=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
545 } else if (avctx->sub_id == 0x10002000) {
1796
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
546 s->rv10_version= 3;
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
547 s->low_delay=1;
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
548 s->obmc=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
549 } 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
550 s->rv10_version= 3;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
551 s->low_delay=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
552 } 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
553 s->rv10_version= 3;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
554 s->low_delay=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
555 } else if ( avctx->sub_id == 0x20001000
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
556 || (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
557 s->low_delay=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
558 } else if ( avctx->sub_id == 0x30202002
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
559 || avctx->sub_id == 0x30203002
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
560 || (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
561 s->low_delay=0;
aaaa1767acc2 set has_b_frames correctly, fixes rv20 dr1 with mplayer
michael
parents: 1655
diff changeset
562 s->avctx->has_b_frames=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
563 } else
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
564 av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
565
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
566 if(avctx->debug & FF_DEBUG_PICT_INFO){
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
567 av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1);
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
568 }
2635
eaa57c3336fc PIX_FMT_NONE and related fixes
michael
parents: 2632
diff changeset
569
eaa57c3336fc PIX_FMT_NONE and related fixes
michael
parents: 2632
diff changeset
570 avctx->pix_fmt = PIX_FMT_YUV420P;
eaa57c3336fc PIX_FMT_NONE and related fixes
michael
parents: 2632
diff changeset
571
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
572 if (MPV_common_init(s) < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
573 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
574
986e461dc072 Initial revision
glantau
parents:
diff changeset
575 h263_decode_init_vlc(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
576
986e461dc072 Initial revision
glantau
parents:
diff changeset
577 /* init rv vlc */
986e461dc072 Initial revision
glantau
parents:
diff changeset
578 if (!done) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
579 init_vlc(&rv_dc_lum, DC_VLC_BITS, 256,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
580 rv_lum_bits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2359
diff changeset
581 rv_lum_code, 2, 2, 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
582 init_vlc(&rv_dc_chrom, DC_VLC_BITS, 256,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
583 rv_chrom_bits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2359
diff changeset
584 rv_chrom_code, 2, 2, 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
585 done = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
586 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
587
986e461dc072 Initial revision
glantau
parents:
diff changeset
588 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
589 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
590
986e461dc072 Initial revision
glantau
parents:
diff changeset
591 static int rv10_decode_end(AVCodecContext *avctx)
986e461dc072 Initial revision
glantau
parents:
diff changeset
592 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
593 MpegEncContext *s = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
594
986e461dc072 Initial revision
glantau
parents:
diff changeset
595 MPV_common_end(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
596 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
597 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
598
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
599 static int rv10_decode_packet(AVCodecContext *avctx,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
600 uint8_t *buf, int buf_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
601 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
602 MpegEncContext *s = avctx->priv_data;
3768
c540147303fa fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents: 3261
diff changeset
603 int mb_count, mb_pos, left, start_mb_x;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
604
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
605 init_get_bits(&s->gb, buf, buf_size*8);
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
606 if(s->codec_id ==CODEC_ID_RV10)
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
607 mb_count = rv10_decode_picture_header(s);
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
608 else
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
609 mb_count = rv20_decode_picture_header(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
610 if (mb_count < 0) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
611 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
612 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
613 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
614
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
615 if (s->mb_x >= s->mb_width ||
986e461dc072 Initial revision
glantau
parents:
diff changeset
616 s->mb_y >= s->mb_height) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
617 av_log(s->avctx, AV_LOG_ERROR, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
618 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
619 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
620 mb_pos = s->mb_y * s->mb_width + s->mb_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
621 left = s->mb_width * s->mb_height - mb_pos;
986e461dc072 Initial revision
glantau
parents:
diff changeset
622 if (mb_count > left) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
623 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
624 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
625 }
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
626 //if(s->pict_type == P_TYPE) return 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
627
1700
651b422d51d8 fix crash
michael
parents: 1675
diff changeset
628 if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) {
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
629 if(s->current_picture_ptr){ //FIXME write parser so we always have complete frames?
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
630 ff_er_frame_end(s);
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
631 MPV_frame_end(s);
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
632 s->mb_x= s->mb_y = s->resync_mb_x = s->resync_mb_y= 0;
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
633 }
771
d4cc92144266 handle direct rendering buffer allocation failure
michaelni
parents: 745
diff changeset
634 if(MPV_frame_start(s, avctx) < 0)
d4cc92144266 handle direct rendering buffer allocation failure
michaelni
parents: 745
diff changeset
635 return -1;
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
636 ff_er_frame_start(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
637 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
638
986e461dc072 Initial revision
glantau
parents:
diff changeset
639 #ifdef DEBUG
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
640 av_log(avctx, AV_LOG_DEBUG, "qscale=%d\n", s->qscale);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
641 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
642
986e461dc072 Initial revision
glantau
parents:
diff changeset
643 /* default quantization values */
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
644 if(s->codec_id== CODEC_ID_RV10){
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
645 if(s->mb_y==0) s->first_slice_line=1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
646 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
647 s->first_slice_line=1;
3768
c540147303fa fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents: 3261
diff changeset
648 s->resync_mb_x= s->mb_x;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
649 }
3768
c540147303fa fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents: 3261
diff changeset
650 start_mb_x= s->mb_x;
3260
525c73deb1d5 fix "concealing 0 DC, 0 AC, 0 MV errors" bug
michael
parents: 3185
diff changeset
651 s->resync_mb_y= s->mb_y;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
652 if(s->h263_aic){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
653 s->y_dc_scale_table=
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
654 s->c_dc_scale_table= ff_aic_dc_scale_table;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
655 }else{
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
656 s->y_dc_scale_table=
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
657 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
658 }
1644
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
659
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
660 if(s->modified_quant)
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
661 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
662
1652
834922115010 cleanup
michael
parents: 1644
diff changeset
663 ff_set_qscale(s, s->qscale);
1644
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
664
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
665 s->rv10_first_dc_coded[0] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
666 s->rv10_first_dc_coded[1] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
667 s->rv10_first_dc_coded[2] = 0;
1748
8336c5e14765 rv20 mv prediction in b frames fix
michael
parents: 1739
diff changeset
668 //printf("%d %X %X\n", s->pict_type, s->current_picture.motion_val[0], s->current_picture.motion_val[1]);
450
michaelni
parents: 429
diff changeset
669 s->block_wrap[0]=
michaelni
parents: 429
diff changeset
670 s->block_wrap[1]=
michaelni
parents: 429
diff changeset
671 s->block_wrap[2]=
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1917
diff changeset
672 s->block_wrap[3]= s->b8_stride;
450
michaelni
parents: 429
diff changeset
673 s->block_wrap[4]=
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1917
diff changeset
674 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
675 ff_init_block_index(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
676 /* decode each macroblock */
1796
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
677
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
678 for(s->mb_num_left= mb_count; s->mb_num_left>0; s->mb_num_left--) {
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
679 int ret;
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 713
diff changeset
680 ff_update_block_index(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
681 #ifdef DEBUG
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
682 av_log(avctx, AV_LOG_DEBUG, "**mb x=%d y=%d\n", s->mb_x, s->mb_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
683 #endif
1796
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
684
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
685 s->mv_dir = MV_DIR_FORWARD;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
686 s->mv_type = MV_TYPE_16X16;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
687 ret=ff_h263_decode_mb(s, s->block);
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
688
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
689 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
690 av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
691 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
692 }
1748
8336c5e14765 rv20 mv prediction in b frames fix
michael
parents: 1739
diff changeset
693 if(s->pict_type != B_TYPE)
8336c5e14765 rv20 mv prediction in b frames fix
michael
parents: 1739
diff changeset
694 ff_h263_update_motion_val(s);
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 713
diff changeset
695 MPV_decode_mb(s, s->block);
1644
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
696 if(s->loop_filter)
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
697 ff_h263_loop_filter(s);
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
698
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
699 if (++s->mb_x == s->mb_width) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
700 s->mb_x = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
701 s->mb_y++;
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 713
diff changeset
702 ff_init_block_index(s);
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
703 }
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
704 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
705 s->first_slice_line=0;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
706 if(ret == SLICE_END) break;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
707 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
708
3768
c540147303fa fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents: 3261
diff changeset
709 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
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
710
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
711 return buf_size;
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
712 }
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
713
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
714 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
715 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
716 uint8_t *buf, int buf_size)
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
717 {
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
718 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
719 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
720 AVFrame *pict = data;
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
721
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
722 #ifdef DEBUG
3177
8d1b2cc2a75b (f)printf --> av_log conversion
diego
parents: 3036
diff changeset
723 av_log(avctx, AV_LOG_DEBUG, "*****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
724 #endif
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
725
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
726 /* no supplementary picture */
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
727 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
728 return 0;
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
729 }
1748
8336c5e14765 rv20 mv prediction in b frames fix
michael
parents: 1739
diff changeset
730
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
731 if(avctx->slice_count){
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
732 for(i=0; i<avctx->slice_count; i++){
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
733 int offset= avctx->slice_offset[i];
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
734 int size;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
735
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
736 if(i+1 == avctx->slice_count)
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
737 size= buf_size - offset;
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
738 else
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
739 size= avctx->slice_offset[i+1] - offset;
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
740
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
741 rv10_decode_packet(avctx, buf+offset, size);
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
742 }
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
743 }else{
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
744 rv10_decode_packet(avctx, buf, buf_size);
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
745 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
746
3261
61bf38dbf774 Fix SIGSEGV in rv10-null-pointer-500k.rm.
diego
parents: 3260
diff changeset
747 if(s->current_picture_ptr != NULL && s->mb_y>=s->mb_height){
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
748 ff_er_frame_end(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
749 MPV_frame_end(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
750
3185
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
751 if (s->pict_type == B_TYPE || s->low_delay) {
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
752 *pict= *(AVFrame*)s->current_picture_ptr;
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
753 } else if (s->last_picture_ptr != NULL) {
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
754 *pict= *(AVFrame*)s->last_picture_ptr;
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
755 }
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
756
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
757 if(s->last_picture_ptr || s->low_delay){
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
758 *data_size = sizeof(AVFrame);
1706
3ba5c493db6f motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents: 1701
diff changeset
759 ff_print_debug_info(s, pict);
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
760 }
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
761 s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
762 }
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
763
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
764 return buf_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
765 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
766
986e461dc072 Initial revision
glantau
parents:
diff changeset
767 AVCodec rv10_decoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
768 "rv10",
986e461dc072 Initial revision
glantau
parents:
diff changeset
769 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
770 CODEC_ID_RV10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
771 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
772 rv10_decode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
773 NULL,
986e461dc072 Initial revision
glantau
parents:
diff changeset
774 rv10_decode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
775 rv10_decode_frame,
559
michaelni
parents: 556
diff changeset
776 CODEC_CAP_DR1
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
777 };
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
778
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
779 AVCodec rv20_decoder = {
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
780 "rv20",
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
781 CODEC_TYPE_VIDEO,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
782 CODEC_ID_RV20,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
783 sizeof(MpegEncContext),
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
784 rv10_decode_init,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
785 NULL,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
786 rv10_decode_end,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
787 rv10_decode_frame,
2453
f67b63ed036d avoid buf_size == 0 checks in every decoder
michael
parents: 2412
diff changeset
788 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
2379
a9aae760463e seeking in rm
michael
parents: 2378
diff changeset
789 .flush= ff_mpeg_flush,
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
790 };
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
791