annotate rv10.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents ffb3668ff7af
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
10018
46f8d58fbdfb Split RV10 encoder off into its own file.
diego
parents: 10017
diff changeset
2 * RV10/RV20 decoder
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8590
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 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
24 * @file
10018
46f8d58fbdfb Split RV10 encoder off into its own file.
diego
parents: 10017
diff changeset
25 * RV10/RV20 decoder
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1070
diff changeset
26 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
27
12372
914f484bb476 Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents: 12108
diff changeset
28 #include "libavcore/imgutils.h"
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 350
diff changeset
29 #include "avcodec.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
30 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
31 #include "mpegvideo.h"
11066
86bf7e0db6ea Add include to fix implicit declaration of ff_mpeg4_init_direct_mv and
reimar
parents: 10828
diff changeset
32 #include "mpeg4video.h"
10828
d0657e337f91 Split H263 encoder and decoder from common code.
michael
parents: 10614
diff changeset
33 #include "h263.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
34
986e461dc072 Initial revision
glantau
parents:
diff changeset
35 //#define DEBUG
986e461dc072 Initial revision
glantau
parents:
diff changeset
36
622
a1e54c24f221 working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents: 621
diff changeset
37 #define DC_VLC_BITS 14 //FIXME find a better solution
547
31be0f0b0792 get_vlc -> get_vlc2
michaelni
parents: 450
diff changeset
38
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
39 static const uint16_t rv_lum_code[256] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
986e461dc072 Initial revision
glantau
parents:
diff changeset
48 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
986e461dc072 Initial revision
glantau
parents:
diff changeset
50 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
53 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
986e461dc072 Initial revision
glantau
parents:
diff changeset
55 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
69 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
71 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
986e461dc072 Initial revision
glantau
parents:
diff changeset
72 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
74
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
75 static const uint8_t rv_lum_bits[256] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
76 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 14, 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, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 12, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 10, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 8, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 8, 7, 7, 7, 7, 7, 7, 7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 7, 6, 6, 6, 6, 5, 5, 4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 2, 4, 5, 5, 6, 6, 6, 6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 7, 7, 7, 7, 7, 7, 7, 7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 8, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
96 8, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
99 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 10, 10, 10, 10, 10, 10, 10, 10,
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 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
107 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
108 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
109 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
110
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
111 static const uint16_t rv_chrom_code[256] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
112 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
113 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
986e461dc072 Initial revision
glantau
parents:
diff changeset
114 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
986e461dc072 Initial revision
glantau
parents:
diff changeset
124 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
146
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
147 static const uint8_t rv_chrom_bits[256] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
149 16, 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, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
155 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 14, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
159 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 12, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
162 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 10, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 8, 6, 6, 6, 6, 4, 4, 3,
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 2, 3, 4, 4, 6, 6, 6, 6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 8, 8, 8, 8, 8, 8, 8, 8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 10, 10, 10, 10, 10, 10, 10, 10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 12, 12, 12, 12, 12, 12, 12, 12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 12, 12, 12, 12, 12, 12, 12, 12,
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 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 14, 14, 14, 14, 14, 14, 14, 14,
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
182
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 static VLC rv_dc_lum, rv_dc_chrom;
986e461dc072 Initial revision
glantau
parents:
diff changeset
184
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 int rv_decode_dc(MpegEncContext *s, int n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 int code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
188
986e461dc072 Initial revision
glantau
parents:
diff changeset
189 if (n < 4) {
547
31be0f0b0792 get_vlc -> get_vlc2
michaelni
parents: 450
diff changeset
190 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 if (code < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
192 /* XXX: I don't understand why they use LONGER codes than
986e461dc072 Initial revision
glantau
parents:
diff changeset
193 necessary. The following code would be completely useless
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 if they had thought about it !!! */
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 code = get_bits(&s->gb, 7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
196 if (code == 0x7c) {
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
197 code = (int8_t)(get_bits(&s->gb, 7) + 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 } else if (code == 0x7d) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 code = -128 + get_bits(&s->gb, 7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 } else if (code == 0x7e) {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5248
diff changeset
201 if (get_bits1(&s->gb) == 0)
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
202 code = (int8_t)(get_bits(&s->gb, 8) + 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 else
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
204 code = (int8_t)(get_bits(&s->gb, 8));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 } else if (code == 0x7f) {
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
206 skip_bits(&s->gb, 11);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 code = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 code -= 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
212 } else {
547
31be0f0b0792 get_vlc -> get_vlc2
michaelni
parents: 450
diff changeset
213 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 /* same remark */
986e461dc072 Initial revision
glantau
parents:
diff changeset
215 if (code < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 code = get_bits(&s->gb, 9);
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 if (code == 0x1fc) {
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1025
diff changeset
218 code = (int8_t)(get_bits(&s->gb, 7) + 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 } else if (code == 0x1fd) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
220 code = -128 + get_bits(&s->gb, 7);
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 } else if (code == 0x1fe) {
5518
d2ef80f5fd7e use skip_bits where appropriate
alex
parents: 5513
diff changeset
222 skip_bits(&s->gb, 9);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 code = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
224 } else {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
225 av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 return 0xffff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
227 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
228 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
229 code -= 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
231 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
232 return -code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
233 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
234
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 /* read RV 1.0 compatible frame header */
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 static int rv10_decode_picture_header(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 {
2378
1f56314b3770 rv10 thread safety fix / rv10 ffplay fix
michael
parents: 2376
diff changeset
238 int mb_count, pb_frame, marker, unk, mb_xy;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
239
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5248
diff changeset
240 marker = get_bits1(&s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
241
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5248
diff changeset
242 if (get_bits1(&s->gb))
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
243 s->pict_type = FF_P_TYPE;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
244 else
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
245 s->pict_type = FF_I_TYPE;
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
246 if(!marker) av_log(s->avctx, AV_LOG_ERROR, "marker missing\n");
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5248
diff changeset
247 pb_frame = get_bits1(&s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
248
9992
7b2e5c91104e Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents: 9990
diff changeset
249 dprintf(s->avctx, "pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
250
622
a1e54c24f221 working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents: 621
diff changeset
251 if (pb_frame){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
252 av_log(s->avctx, AV_LOG_ERROR, "pb frame not supported\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
253 return -1;
622
a1e54c24f221 working around undefined behavior of get-vlc if the vlc s invalid
michaelni
parents: 621
diff changeset
254 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
255
986e461dc072 Initial revision
glantau
parents:
diff changeset
256 s->qscale = get_bits(&s->gb, 5);
621
980b661a494a fixes rv10 decoding crash
michaelni
parents: 559
diff changeset
257 if(s->qscale==0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
258 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
621
980b661a494a fixes rv10 decoding crash
michaelni
parents: 559
diff changeset
259 return -1;
980b661a494a fixes rv10 decoding crash
michaelni
parents: 559
diff changeset
260 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
261
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
262 if (s->pict_type == FF_I_TYPE) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
263 if (s->rv10_version == 3) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
264 /* specific MPEG like DC coding not used */
986e461dc072 Initial revision
glantau
parents:
diff changeset
265 s->last_dc[0] = get_bits(&s->gb, 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
266 s->last_dc[1] = get_bits(&s->gb, 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
267 s->last_dc[2] = get_bits(&s->gb, 8);
9992
7b2e5c91104e Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents: 9990
diff changeset
268 dprintf(s->avctx, "DC:%d %d %d\n", s->last_dc[0],
7b2e5c91104e Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents: 9990
diff changeset
269 s->last_dc[1], s->last_dc[2]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
271 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 /* if multiple packets per frame are sent, the position at which
7980
3b5964de95cd spelling cosmetics
diego
parents: 7782
diff changeset
273 to display the macroblocks is coded here */
2378
1f56314b3770 rv10 thread safety fix / rv10 ffplay fix
michael
parents: 2376
diff changeset
274
1f56314b3770 rv10 thread safety fix / rv10 ffplay fix
michael
parents: 2376
diff changeset
275 mb_xy= s->mb_x + s->mb_y*s->mb_width;
1f56314b3770 rv10 thread safety fix / rv10 ffplay fix
michael
parents: 2376
diff changeset
276 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
277 s->mb_x = get_bits(&s->gb, 6); /* mb_x */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
278 s->mb_y = get_bits(&s->gb, 6); /* mb_y */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
279 mb_count = get_bits(&s->gb, 12);
986e461dc072 Initial revision
glantau
parents:
diff changeset
280 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
281 s->mb_x = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
282 s->mb_y = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
283 mb_count = s->mb_width * s->mb_height;
986e461dc072 Initial revision
glantau
parents:
diff changeset
284 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
285 unk= get_bits(&s->gb, 3); /* ignored */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
286 s->f_code = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
287 s->unrestricted_mv = 1;
624
35353e4520d8 use extradata for h263_long_vector mode detection
michaelni
parents: 622
diff changeset
288
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
289 return mb_count;
986e461dc072 Initial revision
glantau
parents:
diff changeset
290 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
291
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
292 static int rv20_decode_picture_header(MpegEncContext *s)
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
293 {
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
294 int seq, mb_pos, i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
295
2358
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
296 #if 0
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
297 GetBitContext gb= s->gb;
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
298 for(i=0; i<64; i++){
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
299 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&gb));
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
300 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
301 }
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
302 av_log(s->avctx, AV_LOG_DEBUG, "\n");
622a0b0f2d56 rv20103001 support
michael
parents: 2158
diff changeset
303 #endif
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
304 #if 0
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
305 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
306 for(i=0; i<s->avctx->extradata_size; i++){
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
307 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
308 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
309 }
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
310 av_log(s->avctx, AV_LOG_DEBUG, "\n");
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
311 #endif
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
312
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
313 if(s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
314 if (get_bits(&s->gb, 3)){
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
315 av_log(s->avctx, AV_LOG_ERROR, "unknown triplet set\n");
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
316 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
317 }
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
318 }
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
319
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
320 i= get_bits(&s->gb, 2);
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
321 switch(i){
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
322 case 0: s->pict_type= FF_I_TYPE; break;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
323 case 1: s->pict_type= FF_I_TYPE; break; //hmm ...
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
324 case 2: s->pict_type= FF_P_TYPE; break;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
325 case 3: s->pict_type= FF_B_TYPE; break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
326 default:
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
327 av_log(s->avctx, AV_LOG_ERROR, "unknown frame type\n");
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
328 return -1;
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
329 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
330
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
331 if(s->last_picture_ptr==NULL && s->pict_type==FF_B_TYPE){
1844
2de13087f46e skip b frames before first i frame
michael
parents: 1823
diff changeset
332 av_log(s->avctx, AV_LOG_ERROR, "early B pix\n");
2de13087f46e skip b frames before first i frame
michael
parents: 1823
diff changeset
333 return -1;
2de13087f46e skip b frames before first i frame
michael
parents: 1823
diff changeset
334 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
335
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5248
diff changeset
336 if (get_bits1(&s->gb)){
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
337 av_log(s->avctx, AV_LOG_ERROR, "unknown bit set\n");
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
338 return -1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
339 }
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
340
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
341 s->qscale = get_bits(&s->gb, 5);
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
342 if(s->qscale==0){
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
343 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
344 return -1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
345 }
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
346 if(s->avctx->sub_id == 0x30203002){
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5248
diff changeset
347 if (get_bits1(&s->gb)){
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
348 av_log(s->avctx, AV_LOG_ERROR, "unknown bit2 set\n");
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
349 return -1;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
350 }
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
351 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
352
1657
aaaa1767acc2 set has_b_frames correctly, fixes rv20 dr1 with mplayer
michael
parents: 1655
diff changeset
353 if(s->avctx->has_b_frames){
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
354 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
355 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
356
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5248
diff changeset
357 if (get_bits1(&s->gb)){
2379
a9aae760463e seeking in rm
michael
parents: 2378
diff changeset
358 av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n");
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
359 }
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
360 seq= get_bits(&s->gb, 13)<<2;
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
361
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
362 f= get_bits(&s->gb, av_log2(v)+1);
2387
f45248df9796 another try at fixing rv20 ...
michael
parents: 2380
diff changeset
363
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
364 if(f){
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
365 new_w= 4*((uint8_t*)s->avctx->extradata)[6+2*f];
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
366 new_h= 4*((uint8_t*)s->avctx->extradata)[7+2*f];
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
367 }else{
10614
b08c6f64a6c0 Store original width/height so that rv20 does not get stuck with some
michael
parents: 10613
diff changeset
368 new_w= s->orig_width ;
b08c6f64a6c0 Store original width/height so that rv20 does not get stuck with some
michael
parents: 10613
diff changeset
369 new_h= s->orig_height;
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
370 }
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
371 if(new_w != s->width || new_h != s->height){
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
372 av_log(s->avctx, AV_LOG_DEBUG, "attempting to change resolution to %dx%d\n", new_w, new_h);
12462
ffb3668ff7af Use new imgutils.h API names, fix deprecation warnings.
stefano
parents: 12372
diff changeset
373 if (av_image_check_size(new_w, new_h, 0, s->avctx) < 0)
4646
cd5964d440e8 Check dimensions to avoid division by zero due to invalid new dimensions.
reimar
parents: 4364
diff changeset
374 return -1;
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
375 MPV_common_end(s);
10558
16f0933d2c7f Make sure avcodec_set_dimensions() is used when rv20 changes resolution.
michael
parents: 10018
diff changeset
376 avcodec_set_dimensions(s->avctx, new_w, new_h);
16f0933d2c7f Make sure avcodec_set_dimensions() is used when rv20 changes resolution.
michael
parents: 10018
diff changeset
377 s->width = new_w;
16f0933d2c7f Make sure avcodec_set_dimensions() is used when rv20 changes resolution.
michael
parents: 10018
diff changeset
378 s->height = new_h;
3793
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
379 if (MPV_common_init(s) < 0)
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
380 return -1;
25ebc28bc383 support resolution switching, fixes rv20errors.rm
michael
parents: 3792
diff changeset
381 }
2630
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
382
2379
a9aae760463e seeking in rm
michael
parents: 2378
diff changeset
383 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
384 av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, v);
2359
a3c029107a88 fixing rv20201002
michael
parents: 2358
diff changeset
385 }
2630
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
386 }else{
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
387 seq= get_bits(&s->gb, 8)*128;
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
388 }
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
389
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
390 // if(s->avctx->sub_id <= 0x20201002){ //0x20201002 definitely needs this
2630
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
391 mb_pos= ff_h263_decode_mba(s);
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
392 /* }else{
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
393 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
394 s->mb_x= mb_pos % s->mb_width;
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
395 s->mb_y= mb_pos / s->mb_width;
2630
026c1600b532 fixing broken_rv20_1mb_.rm
michael
parents: 2628
diff changeset
396 }*/
1917
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
397 //av_log(s->avctx, AV_LOG_DEBUG, "%d\n", seq);
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
398 seq |= s->time &~0x7FFF;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
399 if(seq - s->time > 0x4000) seq -= 0x8000;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
400 if(seq - s->time < -0x4000) seq += 0x8000;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
401 if(seq != s->time){
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
402 if(s->pict_type!=FF_B_TYPE){
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
403 s->time= seq;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
404 s->pp_time= s->time - s->last_non_b_time;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
405 s->last_non_b_time= s->time;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
406 }else{
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
407 s->time= seq;
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
408 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
409 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
410 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
411 return FRAME_SKIPPED;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
412 }
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
413 ff_mpeg4_init_direct_mv(s);
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
414 }
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
415 }
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
416 // 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
417 /*for(i=0; i<32; i++){
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
418 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
419 }
1c382d137275 rv20 (0x20201002) support
michael
parents: 1892
diff changeset
420 av_log(s->avctx, AV_LOG_DEBUG, "\n");*/
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
421 s->no_rounding= get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
422
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
423 s->f_code = 1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
424 s->unrestricted_mv = 1;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
425 s->h263_aic= s->pict_type == FF_I_TYPE;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
426 // s->alt_inter_vlc=1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
427 // s->obmc=1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
428 // s->umvplus=1;
1644
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
429 s->modified_quant=1;
9696
d3b8845e7f55 Fix lowres with rv20.
michael
parents: 9399
diff changeset
430 if(!s->avctx->lowres)
9697
michael
parents: 9696
diff changeset
431 s->loop_filter=1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
432
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
433 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
434 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
435 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding);
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
436 }
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
437
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
438 assert(s->pict_type != FF_B_TYPE || !s->low_delay);
1642
e83980313d3f rv20 sub_id == 0x20200002 support
michael
parents: 1641
diff changeset
439
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
440 return s->mb_width*s->mb_height - mb_pos;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
441 }
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
442
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
443 static av_cold int rv10_decode_init(AVCodecContext *avctx)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
444 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
445 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
446 static int done=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
447
8345
5d41a95e6a75 Check extradata is large enough.
benoit
parents: 7980
diff changeset
448 if (avctx->extradata_size < 8) {
5d41a95e6a75 Check extradata is large enough.
benoit
parents: 7980
diff changeset
449 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
5d41a95e6a75 Check extradata is large enough.
benoit
parents: 7980
diff changeset
450 return -1;
5d41a95e6a75 Check extradata is large enough.
benoit
parents: 7980
diff changeset
451 }
5d41a95e6a75 Check extradata is large enough.
benoit
parents: 7980
diff changeset
452
1892
5ac49e7a1b8f init cleanup
michael
parents: 1844
diff changeset
453 MPV_decode_defaults(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
454
643
3db611caee55 fixing segfault
michaelni
parents: 624
diff changeset
455 s->avctx= avctx;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
456 s->out_format = FMT_H263;
1640
3bc71266e644 rv10 fix
michael
parents: 1639
diff changeset
457 s->codec_id= avctx->codec_id;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
458
10614
b08c6f64a6c0 Store original width/height so that rv20 does not get stuck with some
michael
parents: 10613
diff changeset
459 s->orig_width = s->width = avctx->coded_width;
b08c6f64a6c0 Store original width/height so that rv20 does not get stuck with some
michael
parents: 10613
diff changeset
460 s->orig_height= s->height = avctx->coded_height;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
461
3794
339f1741fbfa big endian fix
michael
parents: 3793
diff changeset
462 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
463 avctx->sub_id= AV_RB32((uint8_t*)avctx->extradata + 4);
3792
036780cfa4c2 simplify
michael
parents: 3791
diff changeset
464
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
465 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
466 s->rv10_version= 0;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
467 s->low_delay=1;
8733
91007f70b81a Fix unknown header 10001000 / http://samples.mplayerhq.hu/real/VC-RV10/thankyou.rm / issue809
michael
parents: 8718
diff changeset
468 } else if (avctx->sub_id == 0x10001000) {
91007f70b81a Fix unknown header 10001000 / http://samples.mplayerhq.hu/real/VC-RV10/thankyou.rm / issue809
michael
parents: 8718
diff changeset
469 s->rv10_version= 3;
91007f70b81a Fix unknown header 10001000 / http://samples.mplayerhq.hu/real/VC-RV10/thankyou.rm / issue809
michael
parents: 8718
diff changeset
470 s->low_delay=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
471 } else if (avctx->sub_id == 0x10002000) {
1796
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
472 s->rv10_version= 3;
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
473 s->low_delay=1;
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
474 s->obmc=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
475 } 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
476 s->rv10_version= 3;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
477 s->low_delay=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
478 } 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
479 s->rv10_version= 3;
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
480 s->low_delay=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
481 } else if ( avctx->sub_id == 0x20001000
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
482 || (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
483 s->low_delay=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
484 } else if ( avctx->sub_id == 0x30202002
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
485 || avctx->sub_id == 0x30203002
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
486 || (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
487 s->low_delay=0;
aaaa1767acc2 set has_b_frames correctly, fixes rv20 dr1 with mplayer
michael
parents: 1655
diff changeset
488 s->avctx->has_b_frames=1;
5248
d138b2abf3d5 * Getting rid of the use of GCC language extensions
romansh
parents: 4646
diff changeset
489 } else
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
490 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
491
2376
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
492 if(avctx->debug & FF_DEBUG_PICT_INFO){
ed9bb4a45afa next try at fixing rv20 decoding
michael
parents: 2370
diff changeset
493 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
494 }
2635
eaa57c3336fc PIX_FMT_NONE and related fixes
michael
parents: 2632
diff changeset
495
eaa57c3336fc PIX_FMT_NONE and related fixes
michael
parents: 2632
diff changeset
496 avctx->pix_fmt = PIX_FMT_YUV420P;
eaa57c3336fc PIX_FMT_NONE and related fixes
michael
parents: 2632
diff changeset
497
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
498 if (MPV_common_init(s) < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
499 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
500
986e461dc072 Initial revision
glantau
parents:
diff changeset
501 h263_decode_init_vlc(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
502
986e461dc072 Initial revision
glantau
parents:
diff changeset
503 /* init rv vlc */
986e461dc072 Initial revision
glantau
parents:
diff changeset
504 if (!done) {
9399
f4583123072a Get rid of INIT_VLC_USE_STATIC in rv10/rv20.
michael
parents: 9393
diff changeset
505 INIT_VLC_STATIC(&rv_dc_lum, DC_VLC_BITS, 256,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
506 rv_lum_bits, 1, 1,
9399
f4583123072a Get rid of INIT_VLC_USE_STATIC in rv10/rv20.
michael
parents: 9393
diff changeset
507 rv_lum_code, 2, 2, 16384);
f4583123072a Get rid of INIT_VLC_USE_STATIC in rv10/rv20.
michael
parents: 9393
diff changeset
508 INIT_VLC_STATIC(&rv_dc_chrom, DC_VLC_BITS, 256,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
509 rv_chrom_bits, 1, 1,
9399
f4583123072a Get rid of INIT_VLC_USE_STATIC in rv10/rv20.
michael
parents: 9393
diff changeset
510 rv_chrom_code, 2, 2, 16388);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
511 done = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
512 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
513
986e461dc072 Initial revision
glantau
parents:
diff changeset
514 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
515 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
516
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
517 static av_cold int rv10_decode_end(AVCodecContext *avctx)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
518 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
519 MpegEncContext *s = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
520
986e461dc072 Initial revision
glantau
parents:
diff changeset
521 MPV_common_end(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
522 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
523 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
524
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
525 static int rv10_decode_packet(AVCodecContext *avctx,
10613
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
526 const uint8_t *buf, int buf_size, int buf_size2)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
527 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
528 MpegEncContext *s = avctx->priv_data;
3768
c540147303fa fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents: 3261
diff changeset
529 int mb_count, mb_pos, left, start_mb_x;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
530
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
531 init_get_bits(&s->gb, buf, buf_size*8);
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
532 if(s->codec_id ==CODEC_ID_RV10)
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
533 mb_count = rv10_decode_picture_header(s);
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
534 else
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
535 mb_count = rv20_decode_picture_header(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
536 if (mb_count < 0) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
537 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
538 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
539 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
540
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
541 if (s->mb_x >= s->mb_width ||
986e461dc072 Initial revision
glantau
parents:
diff changeset
542 s->mb_y >= s->mb_height) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
543 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
544 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
545 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
546 mb_pos = s->mb_y * s->mb_width + s->mb_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
547 left = s->mb_width * s->mb_height - mb_pos;
986e461dc072 Initial revision
glantau
parents:
diff changeset
548 if (mb_count > left) {
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1389
diff changeset
549 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
550 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
551 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
552
1700
651b422d51d8 fix crash
michael
parents: 1675
diff changeset
553 if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) {
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
554 if(s->current_picture_ptr){ //FIXME write parser so we always have complete frames?
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
555 ff_er_frame_end(s);
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
556 MPV_frame_end(s);
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
557 s->mb_x= s->mb_y = s->resync_mb_x = s->resync_mb_y= 0;
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
558 }
771
d4cc92144266 handle direct rendering buffer allocation failure
michaelni
parents: 745
diff changeset
559 if(MPV_frame_start(s, avctx) < 0)
d4cc92144266 handle direct rendering buffer allocation failure
michaelni
parents: 745
diff changeset
560 return -1;
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
561 ff_er_frame_start(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
562 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
563
9992
7b2e5c91104e Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents: 9990
diff changeset
564 dprintf(avctx, "qscale=%d\n", s->qscale);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
565
986e461dc072 Initial revision
glantau
parents:
diff changeset
566 /* default quantization values */
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
567 if(s->codec_id== CODEC_ID_RV10){
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
568 if(s->mb_y==0) s->first_slice_line=1;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
569 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
570 s->first_slice_line=1;
3768
c540147303fa fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents: 3261
diff changeset
571 s->resync_mb_x= s->mb_x;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
572 }
3768
c540147303fa fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents: 3261
diff changeset
573 start_mb_x= s->mb_x;
3260
525c73deb1d5 fix "concealing 0 DC, 0 AC, 0 MV errors" bug
michael
parents: 3185
diff changeset
574 s->resync_mb_y= s->mb_y;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
575 if(s->h263_aic){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
576 s->y_dc_scale_table=
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
577 s->c_dc_scale_table= ff_aic_dc_scale_table;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
578 }else{
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
579 s->y_dc_scale_table=
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
580 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
581 }
1644
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
582
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
583 if(s->modified_quant)
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
584 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
585
1652
834922115010 cleanup
michael
parents: 1644
diff changeset
586 ff_set_qscale(s, s->qscale);
1644
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
587
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
588 s->rv10_first_dc_coded[0] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
589 s->rv10_first_dc_coded[1] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
590 s->rv10_first_dc_coded[2] = 0;
450
michaelni
parents: 429
diff changeset
591 s->block_wrap[0]=
michaelni
parents: 429
diff changeset
592 s->block_wrap[1]=
michaelni
parents: 429
diff changeset
593 s->block_wrap[2]=
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1917
diff changeset
594 s->block_wrap[3]= s->b8_stride;
450
michaelni
parents: 429
diff changeset
595 s->block_wrap[4]=
1938
e2501e6e7ff7 unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents: 1917
diff changeset
596 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
597 ff_init_block_index(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
598 /* decode each macroblock */
1796
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
599
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
600 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
601 int ret;
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 713
diff changeset
602 ff_update_block_index(s);
9992
7b2e5c91104e Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents: 9990
diff changeset
603 dprintf(avctx, "**mb x=%d y=%d\n", s->mb_x, s->mb_y);
1796
7186712b391e rv10/obmc fixes
michael
parents: 1754
diff changeset
604
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
605 s->mv_dir = MV_DIR_FORWARD;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
606 s->mv_type = MV_TYPE_16X16;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
607 ret=ff_h263_decode_mb(s, s->block);
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
608
10613
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
609 if (ret != SLICE_ERROR && s->gb.size_in_bits < get_bits_count(&s->gb) && 8*buf_size2 >= get_bits_count(&s->gb)){
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
610 av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n", s->gb.size_in_bits, 8*buf_size2);
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
611 s->gb.size_in_bits= 8*buf_size2;
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
612 ret= SLICE_OK;
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
613 }
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
614
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
615 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
616 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
617 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
618 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
619 if(s->pict_type != FF_B_TYPE)
1748
8336c5e14765 rv20 mv prediction in b frames fix
michael
parents: 1739
diff changeset
620 ff_h263_update_motion_val(s);
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 713
diff changeset
621 MPV_decode_mb(s, s->block);
1644
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
622 if(s->loop_filter)
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
623 ff_h263_loop_filter(s);
835cf346975e h263 loop filter
michael
parents: 1643
diff changeset
624
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
625 if (++s->mb_x == s->mb_width) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
626 s->mb_x = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
627 s->mb_y++;
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 713
diff changeset
628 ff_init_block_index(s);
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
629 }
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
630 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
631 s->first_slice_line=0;
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
632 if(ret == SLICE_END) break;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
633 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
634
3768
c540147303fa fix decoding of bastard1.rm (rv ver=0x10003001 ver0=0x8000000)
michael
parents: 3261
diff changeset
635 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
636
10613
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
637 return s->gb.size_in_bits;
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
638 }
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
639
6250
michael
parents: 5843
diff changeset
640 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
5842
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
641 {
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
642 if(avctx->slice_count) return avctx->slice_offset[n];
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
643 else return AV_RL32(buf + n*8);
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
644 }
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
645
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
646 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
647 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9028
diff changeset
648 AVPacket *avpkt)
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
649 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9028
diff changeset
650 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9028
diff changeset
651 int buf_size = avpkt->size;
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
652 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
653 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
654 AVFrame *pict = data;
5842
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
655 int slice_count;
6250
michael
parents: 5843
diff changeset
656 const uint8_t *slices_hdr = NULL;
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
657
9992
7b2e5c91104e Use dprintf() instead of '#ifdef DEBUG' and av_log().
diego
parents: 9990
diff changeset
658 dprintf(avctx, "*****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
659
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
660 /* no supplementary picture */
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
661 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
662 return 0;
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
663 }
1748
8336c5e14765 rv20 mv prediction in b frames fix
michael
parents: 1739
diff changeset
664
5842
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
665 if(!avctx->slice_count){
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
666 slice_count = (*buf++) + 1;
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
667 slices_hdr = buf + 4;
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
668 buf += 8 * slice_count;
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
669 }else
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
670 slice_count = avctx->slice_count;
6eade0a54b19 Make RV10/20 decoder work with new frame format
kostya
parents: 5518
diff changeset
671
5843
ad72b1e8934a indentation after last commit
kostya
parents: 5842
diff changeset
672 for(i=0; i<slice_count; i++){
ad72b1e8934a indentation after last commit
kostya
parents: 5842
diff changeset
673 int offset= get_slice_offset(avctx, slices_hdr, i);
10613
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
674 int size, size2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
675
5843
ad72b1e8934a indentation after last commit
kostya
parents: 5842
diff changeset
676 if(i+1 == slice_count)
ad72b1e8934a indentation after last commit
kostya
parents: 5842
diff changeset
677 size= buf_size - offset;
ad72b1e8934a indentation after last commit
kostya
parents: 5842
diff changeset
678 else
ad72b1e8934a indentation after last commit
kostya
parents: 5842
diff changeset
679 size= get_slice_offset(avctx, slices_hdr, i+1) - offset;
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
680
10613
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
681 if(i+2 >= slice_count)
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
682 size2= buf_size - offset;
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
683 else
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
684 size2= get_slice_offset(avctx, slices_hdr, i+2) - offset;
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
685
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
686 if(rv10_decode_packet(avctx, buf+offset, size, size2) > 8*size)
2ae4eb19665a Make rv1/2 decoder use the next slice if needed.
michael
parents: 10559
diff changeset
687 i++;
5843
ad72b1e8934a indentation after last commit
kostya
parents: 5842
diff changeset
688 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
689
3261
61bf38dbf774 Fix SIGSEGV in rv10-null-pointer-500k.rm.
diego
parents: 3260
diff changeset
690 if(s->current_picture_ptr != NULL && s->mb_y>=s->mb_height){
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
691 ff_er_frame_end(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
692 MPV_frame_end(s);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2848
diff changeset
693
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6250
diff changeset
694 if (s->pict_type == FF_B_TYPE || s->low_delay) {
3185
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
695 *pict= *(AVFrame*)s->current_picture_ptr;
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
696 } else if (s->last_picture_ptr != NULL) {
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
697 *pict= *(AVFrame*)s->last_picture_ptr;
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
698 }
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
699
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
700 if(s->last_picture_ptr || s->low_delay){
333e016c2c8a cleanup picture / debug output code
michael
parents: 3177
diff changeset
701 *data_size = sizeof(AVFrame);
1706
3ba5c493db6f motion vector vissualization improvements patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents: 1701
diff changeset
702 ff_print_debug_info(s, pict);
1655
c92147a61d97 rv20 (h263) b frame decoding support
michael
parents: 1652
diff changeset
703 }
2848
78ad77267785 error concealment fix
michael
parents: 2635
diff changeset
704 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
705 }
713
e74a563eb643 rv10 cleanup (de)muxer still needs to be cleaned up (still searching volunteer for that ;) )
michaelni
parents: 712
diff changeset
706
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
707 return buf_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
708 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
709
986e461dc072 Initial revision
glantau
parents:
diff changeset
710 AVCodec rv10_decoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
711 "rv10",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11066
diff changeset
712 AVMEDIA_TYPE_VIDEO,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
713 CODEC_ID_RV10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
714 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
715 rv10_decode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
716 NULL,
986e461dc072 Initial revision
glantau
parents:
diff changeset
717 rv10_decode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
718 rv10_decode_frame,
6712
5b3acf9fd50a Add long names to AVCodec declarations.
diego
parents: 6517
diff changeset
719 CODEC_CAP_DR1,
12108
c35d7bc64882 Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents: 11644
diff changeset
720 .max_lowres = 3,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6712
diff changeset
721 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
9028
0f95e4f0a3f5 Add and use ff_pixfmt_list_420.
michael
parents: 8733
diff changeset
722 .pix_fmts= ff_pixfmt_list_420,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
723 };
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
724
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
725 AVCodec rv20_decoder = {
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
726 "rv20",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11066
diff changeset
727 AVMEDIA_TYPE_VIDEO,
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
728 CODEC_ID_RV20,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
729 sizeof(MpegEncContext),
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
730 rv10_decode_init,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
731 NULL,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
732 rv10_decode_end,
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
733 rv10_decode_frame,
2453
f67b63ed036d avoid buf_size == 0 checks in every decoder
michael
parents: 2412
diff changeset
734 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
2379
a9aae760463e seeking in rm
michael
parents: 2378
diff changeset
735 .flush= ff_mpeg_flush,
12108
c35d7bc64882 Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents: 11644
diff changeset
736 .max_lowres = 3,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6712
diff changeset
737 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
9028
0f95e4f0a3f5 Add and use ff_pixfmt_list_420.
michael
parents: 8733
diff changeset
738 .pix_fmts= ff_pixfmt_list_420,
1639
3e2b774edce4 rv20 decoder
michael
parents: 1598
diff changeset
739 };