Mercurial > libavcodec.hg
annotate vc1.c @ 12463:04e68eb1aab7 libavcodec
Check rc_buffer_size value using integer arithmetic
Using floating-point here can cause erroneous rejection of
parameters due to rounding errors leading to a slightly too
large result.
This fixes the mxf regression test with gcc 4.5 on x86_32.
author | mru |
---|---|
date | Tue, 07 Sep 2010 19:54:48 +0000 |
parents | 9ba7d2a5b20a |
children | 5915f4f0e172 |
rev | line source |
---|---|
3359 | 1 /* |
9836
e678b20368cd
Split decoder-specific code off from vc1.c into vc1dec.c and keep code
diego
parents:
9815
diff
changeset
|
2 * VC-1 and WMV3 decoder common code |
4605 | 3 * Copyright (c) 2006-2007 Konstantin Shishkov |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
4 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer |
3359 | 5 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
3359 | 9 * modify it under the terms of the GNU Lesser General Public |
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:
3920
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
3359 | 12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
3359 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
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:
3920
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
3359 | 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 */ | |
22 | |
23 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
10379
diff
changeset
|
24 * @file |
9836
e678b20368cd
Split decoder-specific code off from vc1.c into vc1dec.c and keep code
diego
parents:
9815
diff
changeset
|
25 * VC-1 and WMV3 decoder common code |
3359 | 26 * |
27 */ | |
9011
90c99bda19f5
Approved hunks for VAAPI / our new shiny hwaccel API
michael
parents:
8955
diff
changeset
|
28 #include "internal.h" |
3359 | 29 #include "dsputil.h" |
30 #include "avcodec.h" | |
31 #include "mpegvideo.h" | |
4926 | 32 #include "vc1.h" |
3359 | 33 #include "vc1data.h" |
4965 | 34 #include "msmpeg4data.h" |
5605 | 35 #include "unary.h" |
5849 | 36 #include "simple_idct.h" |
3359 | 37 |
38 #undef NDEBUG | |
39 #include <assert.h> | |
40 | |
41 /***********************************************************************/ | |
42 /** | |
8685 | 43 * @defgroup vc1bitplane VC-1 Bitplane decoding |
3359 | 44 * @see 8.7, p56 |
45 * @{ | |
46 */ | |
47 | |
8685 | 48 /** |
3359 | 49 * Imode types |
50 * @{ | |
51 */ | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
52 enum Imode { |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
53 IMODE_RAW, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
54 IMODE_NORM2, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
55 IMODE_DIFF2, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
56 IMODE_NORM6, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
57 IMODE_DIFF6, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
58 IMODE_ROWSKIP, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
59 IMODE_COLSKIP |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
60 }; |
3359 | 61 /** @} */ //imode defines |
62 | |
63 /** Decode rows by checking if they are skipped | |
64 * @param plane Buffer to store decoded bits | |
65 * @param[in] width Width of this buffer | |
66 * @param[in] height Height of this buffer | |
67 * @param[in] stride of this buffer | |
68 */ | |
69 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ | |
70 int x, y; | |
71 | |
72 for (y=0; y<height; y++){ | |
5513 | 73 if (!get_bits1(gb)) //rowskip |
3359 | 74 memset(plane, 0, width); |
75 else | |
76 for (x=0; x<width; x++) | |
5513 | 77 plane[x] = get_bits1(gb); |
3359 | 78 plane += stride; |
79 } | |
80 } | |
81 | |
82 /** Decode columns by checking if they are skipped | |
83 * @param plane Buffer to store decoded bits | |
84 * @param[in] width Width of this buffer | |
85 * @param[in] height Height of this buffer | |
86 * @param[in] stride of this buffer | |
5299
4623928e3b9e
Replace non-existing @fixme doxygen tags with @todo.
diego
parents:
5228
diff
changeset
|
87 * @todo FIXME: Optimize |
3359 | 88 */ |
89 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ | |
90 int x, y; | |
91 | |
92 for (x=0; x<width; x++){ | |
5513 | 93 if (!get_bits1(gb)) //colskip |
3359 | 94 for (y=0; y<height; y++) |
95 plane[y*stride] = 0; | |
96 else | |
97 for (y=0; y<height; y++) | |
5513 | 98 plane[y*stride] = get_bits1(gb); |
3359 | 99 plane ++; |
100 } | |
101 } | |
102 | |
103 /** Decode a bitplane's bits | |
8685 | 104 * @param data bitplane where to store the decode bits |
105 * @param[out] raw_flag pointer to the flag indicating that this bitplane is not coded explicitly | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
106 * @param v VC-1 context for bit reading and logging |
3359 | 107 * @return Status |
5299
4623928e3b9e
Replace non-existing @fixme doxygen tags with @todo.
diego
parents:
5228
diff
changeset
|
108 * @todo FIXME: Optimize |
3359 | 109 */ |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
110 static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v) |
3359 | 111 { |
112 GetBitContext *gb = &v->s.gb; | |
113 | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
114 int imode, x, y, code, offset; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
115 uint8_t invert, *planep = data; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
116 int width, height, stride; |
3359 | 117 |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
118 width = v->s.mb_width; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
119 height = v->s.mb_height; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
120 stride = v->s.mb_stride; |
5513 | 121 invert = get_bits1(gb); |
4949 | 122 imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1); |
3359 | 123 |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
124 *raw_flag = 0; |
3359 | 125 switch (imode) |
126 { | |
127 case IMODE_RAW: | |
128 //Data is actually read in the MB layer (same for all tests == "raw") | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
129 *raw_flag = 1; //invert ignored |
3359 | 130 return invert; |
131 case IMODE_DIFF2: | |
132 case IMODE_NORM2: | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
133 if ((height * width) & 1) |
3359 | 134 { |
5513 | 135 *planep++ = get_bits1(gb); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
136 offset = 1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
137 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
138 else offset = 0; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
139 // decode bitplane as one long line |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
140 for (y = offset; y < height * width; y += 2) { |
4949 | 141 code = get_vlc2(gb, ff_vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
142 *planep++ = code & 1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
143 offset++; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
144 if(offset == width) { |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
145 offset = 0; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
146 planep += stride - width; |
3359 | 147 } |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
148 *planep++ = code >> 1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
149 offset++; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
150 if(offset == width) { |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
151 offset = 0; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
152 planep += stride - width; |
3359 | 153 } |
154 } | |
155 break; | |
156 case IMODE_DIFF6: | |
157 case IMODE_NORM6: | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
158 if(!(height % 3) && (width % 3)) { // use 2x3 decoding |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
159 for(y = 0; y < height; y+= 3) { |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
160 for(x = width & 1; x < width; x += 2) { |
4949 | 161 code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
162 if(code < 0){ |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
163 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
164 return -1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
165 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
166 planep[x + 0] = (code >> 0) & 1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
167 planep[x + 1] = (code >> 1) & 1; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
168 planep[x + 0 + stride] = (code >> 2) & 1; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
169 planep[x + 1 + stride] = (code >> 3) & 1; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
170 planep[x + 0 + stride * 2] = (code >> 4) & 1; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
171 planep[x + 1 + stride * 2] = (code >> 5) & 1; |
3359 | 172 } |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
173 planep += stride * 3; |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
174 } |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
175 if(width & 1) decode_colskip(data, 1, height, stride, &v->s.gb); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
176 } else { // 3x2 |
3405
58c4fd135462
Correctly choose global transform mode, MV mode and fix bitplane decoding
kostya
parents:
3404
diff
changeset
|
177 planep += (height & 1) * stride; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
178 for(y = height & 1; y < height; y += 2) { |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
179 for(x = width % 3; x < width; x += 3) { |
4949 | 180 code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
181 if(code < 0){ |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
182 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
183 return -1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
184 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
185 planep[x + 0] = (code >> 0) & 1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
186 planep[x + 1] = (code >> 1) & 1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
187 planep[x + 2] = (code >> 2) & 1; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
188 planep[x + 0 + stride] = (code >> 3) & 1; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
189 planep[x + 1 + stride] = (code >> 4) & 1; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
190 planep[x + 2 + stride] = (code >> 5) & 1; |
3359 | 191 } |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
192 planep += stride * 2; |
3359 | 193 } |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
194 x = width % 3; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
195 if(x) decode_colskip(data , x, height , stride, &v->s.gb); |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
196 if(height & 1) decode_rowskip(data+x, width - x, 1, stride, &v->s.gb); |
3359 | 197 } |
198 break; | |
199 case IMODE_ROWSKIP: | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
200 decode_rowskip(data, width, height, stride, &v->s.gb); |
3359 | 201 break; |
202 case IMODE_COLSKIP: | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
203 decode_colskip(data, width, height, stride, &v->s.gb); |
3359 | 204 break; |
205 default: break; | |
206 } | |
207 | |
208 /* Applying diff operator */ | |
209 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) | |
210 { | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
211 planep = data; |
3359 | 212 planep[0] ^= invert; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
213 for (x=1; x<width; x++) |
3359 | 214 planep[x] ^= planep[x-1]; |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
215 for (y=1; y<height; y++) |
3359 | 216 { |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
217 planep += stride; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
218 planep[0] ^= planep[-stride]; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
219 for (x=1; x<width; x++) |
3359 | 220 { |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
221 if (planep[x-1] != planep[x-stride]) planep[x] ^= invert; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
222 else planep[x] ^= planep[x-1]; |
3359 | 223 } |
224 } | |
225 } | |
226 else if (invert) | |
227 { | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
228 planep = data; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
229 for (x=0; x<stride*height; x++) planep[x] = !planep[x]; //FIXME stride |
3359 | 230 } |
231 return (imode<<1) + invert; | |
232 } | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
233 |
3359 | 234 /** @} */ //Bitplane group |
235 | |
236 /***********************************************************************/ | |
237 /** VOP Dquant decoding | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
238 * @param v VC-1 Context |
3359 | 239 */ |
240 static int vop_dquant_decoding(VC1Context *v) | |
241 { | |
242 GetBitContext *gb = &v->s.gb; | |
243 int pqdiff; | |
244 | |
245 //variable size | |
246 if (v->dquant == 2) | |
247 { | |
248 pqdiff = get_bits(gb, 3); | |
249 if (pqdiff == 7) v->altpq = get_bits(gb, 5); | |
250 else v->altpq = v->pq + pqdiff + 1; | |
251 } | |
252 else | |
253 { | |
5513 | 254 v->dquantfrm = get_bits1(gb); |
3359 | 255 if ( v->dquantfrm ) |
256 { | |
257 v->dqprofile = get_bits(gb, 2); | |
258 switch (v->dqprofile) | |
259 { | |
260 case DQPROFILE_SINGLE_EDGE: | |
261 case DQPROFILE_DOUBLE_EDGES: | |
262 v->dqsbedge = get_bits(gb, 2); | |
263 break; | |
264 case DQPROFILE_ALL_MBS: | |
5513 | 265 v->dqbilevel = get_bits1(gb); |
5682
8bf94c994691
In case when any quantizer may occur, HALFPQ should be zero
kostya
parents:
5605
diff
changeset
|
266 if(!v->dqbilevel) |
8bf94c994691
In case when any quantizer may occur, HALFPQ should be zero
kostya
parents:
5605
diff
changeset
|
267 v->halfpq = 0; |
3359 | 268 default: break; //Forbidden ? |
269 } | |
3451 | 270 if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) |
3359 | 271 { |
272 pqdiff = get_bits(gb, 3); | |
273 if (pqdiff == 7) v->altpq = get_bits(gb, 5); | |
274 else v->altpq = v->pq + pqdiff + 1; | |
275 } | |
276 } | |
277 } | |
278 return 0; | |
279 } | |
280 | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
281 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
282 |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
283 /** |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
284 * Decode Simple/Main Profiles sequence header |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
285 * @see Figure 7-8, p16-17 |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
286 * @param avctx Codec context |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
287 * @param gb GetBit context initialized from Codec context extra_data |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
288 * @return Status |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
289 */ |
9732
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
290 int vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb) |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
291 { |
3692 | 292 av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32)); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
293 v->profile = get_bits(gb, 2); |
4604 | 294 if (v->profile == PROFILE_COMPLEX) |
3359 | 295 { |
4604 | 296 av_log(avctx, AV_LOG_ERROR, "WMV3 Complex Profile is not fully supported\n"); |
3359 | 297 } |
298 | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
299 if (v->profile == PROFILE_ADVANCED) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
300 { |
6145
ddf5d7fae101
Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents:
6099
diff
changeset
|
301 v->zz_8x4 = ff_vc1_adv_progressive_8x4_zz; |
ddf5d7fae101
Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents:
6099
diff
changeset
|
302 v->zz_4x8 = ff_vc1_adv_progressive_4x8_zz; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
303 return decode_sequence_header_adv(v, gb); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
304 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
305 else |
3359 | 306 { |
7136 | 307 v->zz_8x4 = wmv2_scantableA; |
308 v->zz_4x8 = wmv2_scantableB; | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
309 v->res_sm = get_bits(gb, 2); //reserved |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
310 if (v->res_sm) |
3359 | 311 { |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
312 av_log(avctx, AV_LOG_ERROR, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
313 "Reserved RES_SM=%i is forbidden\n", v->res_sm); |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
314 return -1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
315 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
316 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
317 |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
318 // (fps-2)/4 (->30) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
319 v->frmrtq_postproc = get_bits(gb, 3); //common |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
320 // (bitrate-32kbps)/64kbps |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
321 v->bitrtq_postproc = get_bits(gb, 5); //common |
5513 | 322 v->s.loop_filter = get_bits1(gb); //common |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
323 if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
324 { |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
325 av_log(avctx, AV_LOG_ERROR, |
9858
53d5914a30ef
Fix typo in vc1.c, make capitalization in warning/error messages more consistent.
darkshikari
parents:
9836
diff
changeset
|
326 "LOOPFILTER shall not be enabled in Simple Profile\n"); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
327 } |
7846 | 328 if(v->s.avctx->skip_loop_filter >= AVDISCARD_ALL) |
329 v->s.loop_filter = 0; | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
330 |
5513 | 331 v->res_x8 = get_bits1(gb); //reserved |
332 v->multires = get_bits1(gb); | |
333 v->res_fasttx = get_bits1(gb); | |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
334 if (!v->res_fasttx) |
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
335 { |
6001 | 336 v->s.dsp.vc1_inv_trans_8x8 = ff_simple_idct; |
337 v->s.dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add; | |
338 v->s.dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add; | |
6008 | 339 v->s.dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add; |
9859
7a116de63777
idct_dc for VC-1/WMV3 decoder; ~11% faster decoding overall.
darkshikari
parents:
9858
diff
changeset
|
340 v->s.dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add; |
7a116de63777
idct_dc for VC-1/WMV3 decoder; ~11% faster decoding overall.
darkshikari
parents:
9858
diff
changeset
|
341 v->s.dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add; |
7a116de63777
idct_dc for VC-1/WMV3 decoder; ~11% faster decoding overall.
darkshikari
parents:
9858
diff
changeset
|
342 v->s.dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add; |
7a116de63777
idct_dc for VC-1/WMV3 decoder; ~11% faster decoding overall.
darkshikari
parents:
9858
diff
changeset
|
343 v->s.dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add; |
3359 | 344 } |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
345 |
5513 | 346 v->fastuvmc = get_bits1(gb); //common |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
347 if (!v->profile && !v->fastuvmc) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
348 { |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
349 av_log(avctx, AV_LOG_ERROR, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
350 "FASTUVMC unavailable in Simple Profile\n"); |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
351 return -1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
352 } |
5513 | 353 v->extended_mv = get_bits1(gb); //common |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
354 if (!v->profile && v->extended_mv) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
355 { |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
356 av_log(avctx, AV_LOG_ERROR, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
357 "Extended MVs unavailable in Simple Profile\n"); |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
358 return -1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
359 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
360 v->dquant = get_bits(gb, 2); //common |
5513 | 361 v->vstransform = get_bits1(gb); //common |
362 | |
363 v->res_transtab = get_bits1(gb); | |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
364 if (v->res_transtab) |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
365 { |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
366 av_log(avctx, AV_LOG_ERROR, |
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
367 "1 for reserved RES_TRANSTAB is forbidden\n"); |
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
368 return -1; |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
369 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
370 |
5513 | 371 v->overlap = get_bits1(gb); //common |
372 | |
373 v->s.resync_marker = get_bits1(gb); | |
374 v->rangered = get_bits1(gb); | |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
375 if (v->rangered && v->profile == PROFILE_SIMPLE) |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
376 { |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
377 av_log(avctx, AV_LOG_INFO, |
9858
53d5914a30ef
Fix typo in vc1.c, make capitalization in warning/error messages more consistent.
darkshikari
parents:
9836
diff
changeset
|
378 "RANGERED should be set to 0 in Simple Profile\n"); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
379 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
380 |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
381 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
382 v->quantizer_mode = get_bits(gb, 2); //common |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
383 |
5513 | 384 v->finterpflag = get_bits1(gb); //common |
385 v->res_rtm_flag = get_bits1(gb); //reserved | |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
386 if (!v->res_rtm_flag) |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
387 { |
3538
f26bf13bbb69
Don't try to decode P-frames from old WMV3 variant until their format is figured
kostya
parents:
3528
diff
changeset
|
388 // av_log(avctx, AV_LOG_ERROR, |
f26bf13bbb69
Don't try to decode P-frames from old WMV3 variant until their format is figured
kostya
parents:
3528
diff
changeset
|
389 // "0 for reserved RES_RTM_FLAG is forbidden\n"); |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
390 av_log(avctx, AV_LOG_ERROR, |
12127
9ba7d2a5b20a
Make WMV3 decoder print more errors when decoding beta WMV9 files.
kostya
parents:
11644
diff
changeset
|
391 "Old WMV3 version detected, some frames may be decoded incorrectly\n"); |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
392 //return -1; |
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
393 } |
4742 | 394 //TODO: figure out what they mean (always 0x402F) |
395 if(!v->res_fasttx) skip_bits(gb, 16); | |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
396 av_log(avctx, AV_LOG_DEBUG, |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
397 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n" |
3457 | 398 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n" |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
399 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n" |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
400 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n", |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
401 v->profile, v->frmrtq_postproc, v->bitrtq_postproc, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
402 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
403 v->rangered, v->vstransform, v->overlap, v->s.resync_marker, |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
404 v->dquant, v->quantizer_mode, avctx->max_b_frames |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
405 ); |
3691
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
406 return 0; |
3359 | 407 } |
408 | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
409 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
410 { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
411 v->res_rtm_flag = 1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
412 v->level = get_bits(gb, 3); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
413 if(v->level >= 5) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
414 { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
415 av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
416 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
417 v->chromaformat = get_bits(gb, 2); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
418 if (v->chromaformat != 1) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
419 { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
420 av_log(v->s.avctx, AV_LOG_ERROR, |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
421 "Only 4:2:0 chroma format supported\n"); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
422 return -1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
423 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
424 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
425 // (fps-2)/4 (->30) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
426 v->frmrtq_postproc = get_bits(gb, 3); //common |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
427 // (bitrate-32kbps)/64kbps |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
428 v->bitrtq_postproc = get_bits(gb, 5); //common |
5513 | 429 v->postprocflag = get_bits1(gb); //common |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
430 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
431 v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
432 v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1; |
4474 | 433 v->s.avctx->width = v->s.avctx->coded_width; |
434 v->s.avctx->height = v->s.avctx->coded_height; | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
435 v->broadcast = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
436 v->interlace = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
437 v->tfcntrflag = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
438 v->finterpflag = get_bits1(gb); |
5519 | 439 skip_bits1(gb); // reserved |
4402 | 440 |
4680 | 441 v->s.h_edge_pos = v->s.avctx->coded_width; |
442 v->s.v_edge_pos = v->s.avctx->coded_height; | |
443 | |
4402 | 444 av_log(v->s.avctx, AV_LOG_DEBUG, |
445 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n" | |
446 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n" | |
447 "TFCTRflag=%i, FINTERPflag=%i\n", | |
448 v->level, v->frmrtq_postproc, v->bitrtq_postproc, | |
449 v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace, | |
450 v->tfcntrflag, v->finterpflag | |
451 ); | |
452 | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
453 v->psf = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
454 if(v->psf) { //PsF, 6.1.13 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
455 av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n"); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
456 return -1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
457 } |
4486
1d2320afa864
B-frames could not be determined from broken_link/closed_entry, use fixed value
kostya
parents:
4485
diff
changeset
|
458 v->s.max_b_frames = v->s.avctx->max_b_frames = 7; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
459 if(get_bits1(gb)) { //Display Info - decoding is not affected by it |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
460 int w, h, ar = 0; |
4467 | 461 av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n"); |
9541
7afd4f44c450
Display dimensions should not affect the real size of coded frame, thus set
kostya
parents:
9537
diff
changeset
|
462 v->s.avctx->width = w = get_bits(gb, 14) + 1; |
7afd4f44c450
Display dimensions should not affect the real size of coded frame, thus set
kostya
parents:
9537
diff
changeset
|
463 v->s.avctx->height = h = get_bits(gb, 14) + 1; |
4467 | 464 av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
465 if(get_bits1(gb)) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
466 ar = get_bits(gb, 4); |
4414 | 467 if(ar && ar < 14){ |
4949 | 468 v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar]; |
4414 | 469 }else if(ar == 15){ |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
470 w = get_bits(gb, 8); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
471 h = get_bits(gb, 8); |
4414 | 472 v->s.avctx->sample_aspect_ratio = (AVRational){w, h}; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
473 } |
8583 | 474 av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n", v->s.avctx->sample_aspect_ratio.num, v->s.avctx->sample_aspect_ratio.den); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
475 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
476 if(get_bits1(gb)){ //framerate stuff |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
477 if(get_bits1(gb)) { |
4470 | 478 v->s.avctx->time_base.num = 32; |
479 v->s.avctx->time_base.den = get_bits(gb, 16) + 1; | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
480 } else { |
4470 | 481 int nr, dr; |
482 nr = get_bits(gb, 8); | |
483 dr = get_bits(gb, 4); | |
484 if(nr && nr < 8 && dr && dr < 3){ | |
4949 | 485 v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1]; |
486 v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000; | |
4470 | 487 } |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
488 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
489 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
490 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
491 if(get_bits1(gb)){ |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
492 v->color_prim = get_bits(gb, 8); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
493 v->transfer_char = get_bits(gb, 8); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
494 v->matrix_coef = get_bits(gb, 8); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
495 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
496 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
497 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
498 v->hrd_param_flag = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
499 if(v->hrd_param_flag) { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
500 int i; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
501 v->hrd_num_leaky_buckets = get_bits(gb, 5); |
5519 | 502 skip_bits(gb, 4); //bitrate exponent |
503 skip_bits(gb, 4); //buffer size exponent | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
504 for(i = 0; i < v->hrd_num_leaky_buckets; i++) { |
5519 | 505 skip_bits(gb, 16); //hrd_rate[n] |
506 skip_bits(gb, 16); //hrd_buffer[n] | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
507 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
508 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
509 return 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
510 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
511 |
9732
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
512 int vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb) |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
513 { |
8692
48442253aac2
Record B-fraction index from frame header and two fields from entry point structure
kostya
parents:
8685
diff
changeset
|
514 int i; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
515 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
516 av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32)); |
8692
48442253aac2
Record B-fraction index from frame header and two fields from entry point structure
kostya
parents:
8685
diff
changeset
|
517 v->broken_link = get_bits1(gb); |
48442253aac2
Record B-fraction index from frame header and two fields from entry point structure
kostya
parents:
8685
diff
changeset
|
518 v->closed_entry = get_bits1(gb); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
519 v->panscanflag = get_bits1(gb); |
8556 | 520 v->refdist_flag = get_bits1(gb); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
521 v->s.loop_filter = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
522 v->fastuvmc = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
523 v->extended_mv = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
524 v->dquant = get_bits(gb, 2); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
525 v->vstransform = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
526 v->overlap = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
527 v->quantizer_mode = get_bits(gb, 2); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
528 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
529 if(v->hrd_param_flag){ |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
530 for(i = 0; i < v->hrd_num_leaky_buckets; i++) { |
5519 | 531 skip_bits(gb, 8); //hrd_full[n] |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
532 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
533 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
534 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
535 if(get_bits1(gb)){ |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
536 avctx->coded_width = (get_bits(gb, 12)+1)<<1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
537 avctx->coded_height = (get_bits(gb, 12)+1)<<1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
538 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
539 if(v->extended_mv) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
540 v->extended_dmv = get_bits1(gb); |
8560 | 541 if((v->range_mapy_flag = get_bits1(gb))) { |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
542 av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n"); |
8560 | 543 v->range_mapy = get_bits(gb, 3); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
544 } |
8560 | 545 if((v->range_mapuv_flag = get_bits1(gb))) { |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
546 av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n"); |
8560 | 547 v->range_mapuv = get_bits(gb, 3); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
548 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
549 |
4402 | 550 av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n" |
551 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n" | |
552 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n" | |
553 "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n", | |
8692
48442253aac2
Record B-fraction index from frame header and two fields from entry point structure
kostya
parents:
8685
diff
changeset
|
554 v->broken_link, v->closed_entry, v->panscanflag, v->refdist_flag, v->s.loop_filter, |
4402 | 555 v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode); |
556 | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
557 return 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
558 } |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
559 |
9732
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
560 int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) |
3359 | 561 { |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
562 int pqindex, lowquant, status; |
3359 | 563 |
5513 | 564 if(v->finterpflag) v->interpfrm = get_bits1(gb); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
565 skip_bits(gb, 2); //framecnt unused |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
566 v->rangeredfrm = 0; |
5513 | 567 if (v->rangered) v->rangeredfrm = get_bits1(gb); |
568 v->s.pict_type = get_bits1(gb); | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
569 if (v->s.avctx->max_b_frames) { |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
570 if (!v->s.pict_type) { |
6481 | 571 if (get_bits1(gb)) v->s.pict_type = FF_I_TYPE; |
572 else v->s.pict_type = FF_B_TYPE; | |
573 } else v->s.pict_type = FF_P_TYPE; | |
574 } else v->s.pict_type = v->s.pict_type ? FF_P_TYPE : FF_I_TYPE; | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
575 |
3689 | 576 v->bi_type = 0; |
6481 | 577 if(v->s.pict_type == FF_B_TYPE) { |
8692
48442253aac2
Record B-fraction index from frame header and two fields from entry point structure
kostya
parents:
8685
diff
changeset
|
578 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1); |
48442253aac2
Record B-fraction index from frame header and two fields from entry point structure
kostya
parents:
8685
diff
changeset
|
579 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index]; |
3689 | 580 if(v->bfraction == 0) { |
6481 | 581 v->s.pict_type = FF_BI_TYPE; |
3515
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
582 } |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
583 } |
6481 | 584 if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE) |
5519 | 585 skip_bits(gb, 7); // skip buffer fullness |
3359 | 586 |
9732
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
587 if(v->parse_only) |
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
588 return 0; |
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
589 |
3474 | 590 /* calculate RND */ |
6481 | 591 if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE) |
3474 | 592 v->rnd = 1; |
6481 | 593 if(v->s.pict_type == FF_P_TYPE) |
3474 | 594 v->rnd ^= 1; |
595 | |
3359 | 596 /* Quantizer stuff */ |
597 pqindex = get_bits(gb, 5); | |
6150 | 598 if(!pqindex) return -1; |
3359 | 599 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
4949 | 600 v->pq = ff_vc1_pquant_table[0][pqindex]; |
3359 | 601 else |
4949 | 602 v->pq = ff_vc1_pquant_table[1][pqindex]; |
3359 | 603 |
3475 | 604 v->pquantizer = 1; |
3359 | 605 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
606 v->pquantizer = pqindex < 9; |
3475 | 607 if (v->quantizer_mode == QUANT_NON_UNIFORM) |
608 v->pquantizer = 0; | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
609 v->pqindex = pqindex; |
5513 | 610 if (pqindex < 9) v->halfpq = get_bits1(gb); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
611 else v->halfpq = 0; |
3359 | 612 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
5513 | 613 v->pquantizer = get_bits1(gb); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
614 v->dquantfrm = 0; |
5511 | 615 if (v->extended_mv == 1) v->mvrange = get_unary(gb, 0, 3); |
3452
f024ca7c768b
MVRANGE may occur in all frames and RESPIC in all but B-frames
kostya
parents:
3451
diff
changeset
|
616 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 |
f024ca7c768b
MVRANGE may occur in all frames and RESPIC in all but B-frames
kostya
parents:
3451
diff
changeset
|
617 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 |
f024ca7c768b
MVRANGE may occur in all frames and RESPIC in all but B-frames
kostya
parents:
3451
diff
changeset
|
618 v->range_x = 1 << (v->k_x - 1); |
f024ca7c768b
MVRANGE may occur in all frames and RESPIC in all but B-frames
kostya
parents:
3451
diff
changeset
|
619 v->range_y = 1 << (v->k_y - 1); |
8640
ad979489c6e7
Remove the block with always false condition from vc1_parse_frame_header()
kostya
parents:
8639
diff
changeset
|
620 if (v->multires && v->s.pict_type != FF_B_TYPE) v->respic = get_bits(gb, 2); |
6481 | 621 |
622 if(v->res_x8 && (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)){ | |
5887 | 623 v->x8_type = get_bits1(gb); |
624 }else v->x8_type = 0; | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
625 //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n", |
6481 | 626 // (v->s.pict_type == FF_P_TYPE) ? 'P' : ((v->s.pict_type == FF_I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm); |
627 | |
628 if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0; | |
3744
805aee1f7cce
For B-frames if the second reference frame signals intensity compensation
kostya
parents:
3743
diff
changeset
|
629 |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
630 switch(v->s.pict_type) { |
6481 | 631 case FF_P_TYPE: |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
632 if (v->pq < 5) v->tt_index = 0; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
633 else if(v->pq < 13) v->tt_index = 1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
634 else v->tt_index = 2; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
635 |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
636 lowquant = (v->pq > 12) ? 0 : 1; |
5511 | 637 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)]; |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
638 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
639 { |
3406 | 640 int scale, shift, i; |
5511 | 641 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)]; |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
642 v->lumscale = get_bits(gb, 6); |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
643 v->lumshift = get_bits(gb, 6); |
3744
805aee1f7cce
For B-frames if the second reference frame signals intensity compensation
kostya
parents:
3743
diff
changeset
|
644 v->use_ic = 1; |
3406 | 645 /* fill lookup tables for intensity compensation */ |
646 if(!v->lumscale) { | |
647 scale = -64; | |
648 shift = (255 - v->lumshift * 2) << 6; | |
649 if(v->lumshift > 31) | |
650 shift += 128 << 6; | |
651 } else { | |
652 scale = v->lumscale + 32; | |
653 if(v->lumshift > 31) | |
654 shift = (v->lumshift - 64) << 6; | |
655 else | |
656 shift = v->lumshift << 6; | |
657 } | |
658 for(i = 0; i < 256; i++) { | |
4594 | 659 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6); |
660 v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6); | |
3406 | 661 } |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
662 } |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
663 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN) |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
664 v->s.quarter_sample = 0; |
3401 | 665 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { |
666 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN) | |
667 v->s.quarter_sample = 0; | |
668 else | |
669 v->s.quarter_sample = 1; | |
670 } else | |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
671 v->s.quarter_sample = 1; |
3523
7407a264d243
Set MpegEncContext->mspel flag (here it indicates that bicubic MC will be use)
kostya
parents:
3522
diff
changeset
|
672 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)); |
3359 | 673 |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
674 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
675 v->mv_mode2 == MV_PMODE_MIXED_MV) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
676 || v->mv_mode == MV_PMODE_MIXED_MV) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
677 { |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
678 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
679 if (status < 0) return -1; |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
680 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
681 "Imode: %i, Invert: %i\n", status>>1, status&1); |
3367
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
682 } else { |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
683 v->mv_type_is_raw = 0; |
8c7b8ffc2485
Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents:
3366
diff
changeset
|
684 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
685 } |
3375
a1c2e1603be9
Use MpegEncContext->mbskip_table instead of custom bitplane.
kostya
parents:
3371
diff
changeset
|
686 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); |
3359 | 687 if (status < 0) return -1; |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
688 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " |
3359 | 689 "Imode: %i, Invert: %i\n", status>>1, status&1); |
690 | |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
691 /* Hopefully this is correct for P frames */ |
4949 | 692 v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables |
693 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)]; | |
3359 | 694 |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
695 if (v->dquant) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
696 { |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
697 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
698 vop_dquant_decoding(v); |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
699 } |
3359 | 700 |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
701 v->ttfrm = 0; //FIXME Is that so ? |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
702 if (v->vstransform) |
3359 | 703 { |
5513 | 704 v->ttmbf = get_bits1(gb); |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
705 if (v->ttmbf) |
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
706 { |
4949 | 707 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
708 } |
3506
e0996476198b
Set correctly quantizer and transform mode when parsing frame header.
kostya
parents:
3476
diff
changeset
|
709 } else { |
e0996476198b
Set correctly quantizer and transform mode when parsing frame header.
kostya
parents:
3476
diff
changeset
|
710 v->ttmbf = 1; |
e0996476198b
Set correctly quantizer and transform mode when parsing frame header.
kostya
parents:
3476
diff
changeset
|
711 v->ttfrm = TT_8X8; |
3359 | 712 } |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
713 break; |
6481 | 714 case FF_B_TYPE: |
3515
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
715 if (v->pq < 5) v->tt_index = 0; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
716 else if(v->pq < 13) v->tt_index = 1; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
717 else v->tt_index = 2; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
718 |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
719 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
720 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV); |
3523
7407a264d243
Set MpegEncContext->mspel flag (here it indicates that bicubic MC will be use)
kostya
parents:
3522
diff
changeset
|
721 v->s.mspel = v->s.quarter_sample; |
3515
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
722 |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
723 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v); |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
724 if (status < 0) return -1; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
725 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: " |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
726 "Imode: %i, Invert: %i\n", status>>1, status&1); |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
727 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
728 if (status < 0) return -1; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
729 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
730 "Imode: %i, Invert: %i\n", status>>1, status&1); |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
731 |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
732 v->s.mv_table_index = get_bits(gb, 2); |
4949 | 733 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)]; |
3515
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
734 |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
735 if (v->dquant) |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
736 { |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
737 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
738 vop_dquant_decoding(v); |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
739 } |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
740 |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
741 v->ttfrm = 0; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
742 if (v->vstransform) |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
743 { |
5513 | 744 v->ttmbf = get_bits1(gb); |
3515
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
745 if (v->ttmbf) |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
746 { |
4949 | 747 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; |
3515
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
748 } |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
749 } else { |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
750 v->ttmbf = 1; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
751 v->ttfrm = TT_8X8; |
20938be7b67b
Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents:
3514
diff
changeset
|
752 } |
3360
2c4ddf5b9217
VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents:
3359
diff
changeset
|
753 break; |
3359 | 754 } |
755 | |
5892 | 756 if(!v->x8_type) |
3359 | 757 { |
5892 | 758 /* AC Syntax */ |
759 v->c_ac_table_index = decode012(gb); | |
6481 | 760 if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE) |
5892 | 761 { |
762 v->y_ac_table_index = decode012(gb); | |
763 } | |
764 /* DC Syntax */ | |
765 v->s.dc_table_index = get_bits1(gb); | |
3359 | 766 } |
767 | |
6481 | 768 if(v->s.pict_type == FF_BI_TYPE) { |
769 v->s.pict_type = FF_B_TYPE; | |
3689 | 770 v->bi_type = 1; |
771 } | |
3359 | 772 return 0; |
773 } | |
774 | |
9732
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
775 int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
776 { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
777 int pqindex, lowquant; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
778 int status; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
779 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
780 v->p_frame_skipped = 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
781 |
4487
0a0a9f0c9c2d
Progressive frames disguised as interlaced are supported
kostya
parents:
4486
diff
changeset
|
782 if(v->interlace){ |
4471 | 783 v->fcm = decode012(gb); |
10379
d580026275a1
Print error message when true interlaced VC-1 frames are encountered
kostya
parents:
9859
diff
changeset
|
784 if(v->fcm){ |
d580026275a1
Print error message when true interlaced VC-1 frames are encountered
kostya
parents:
9859
diff
changeset
|
785 if(!v->warn_interlaced++) |
d580026275a1
Print error message when true interlaced VC-1 frames are encountered
kostya
parents:
9859
diff
changeset
|
786 av_log(v->s.avctx, AV_LOG_ERROR, "Interlaced frames/fields support is not implemented\n"); |
d580026275a1
Print error message when true interlaced VC-1 frames are encountered
kostya
parents:
9859
diff
changeset
|
787 return -1; |
d580026275a1
Print error message when true interlaced VC-1 frames are encountered
kostya
parents:
9859
diff
changeset
|
788 } |
4487
0a0a9f0c9c2d
Progressive frames disguised as interlaced are supported
kostya
parents:
4486
diff
changeset
|
789 } |
5511 | 790 switch(get_unary(gb, 0, 4)) { |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
791 case 0: |
6481 | 792 v->s.pict_type = FF_P_TYPE; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
793 break; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
794 case 1: |
6481 | 795 v->s.pict_type = FF_B_TYPE; |
4238 | 796 break; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
797 case 2: |
6481 | 798 v->s.pict_type = FF_I_TYPE; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
799 break; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
800 case 3: |
6481 | 801 v->s.pict_type = FF_BI_TYPE; |
3693 | 802 break; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
803 case 4: |
6481 | 804 v->s.pict_type = FF_P_TYPE; // skipped pic |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
805 v->p_frame_skipped = 1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
806 return 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
807 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
808 if(v->tfcntrflag) |
5519 | 809 skip_bits(gb, 8); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
810 if(v->broadcast) { |
4485 | 811 if(!v->interlace || v->psf) { |
4471 | 812 v->rptfrm = get_bits(gb, 2); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
813 } else { |
4471 | 814 v->tff = get_bits1(gb); |
815 v->rptfrm = get_bits1(gb); | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
816 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
817 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
818 if(v->panscanflag) { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
819 //... |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
820 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
821 v->rnd = get_bits1(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
822 if(v->interlace) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
823 v->uvsamp = get_bits1(gb); |
5513 | 824 if(v->finterpflag) v->interpfrm = get_bits1(gb); |
6481 | 825 if(v->s.pict_type == FF_B_TYPE) { |
8692
48442253aac2
Record B-fraction index from frame header and two fields from entry point structure
kostya
parents:
8685
diff
changeset
|
826 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1); |
48442253aac2
Record B-fraction index from frame header and two fields from entry point structure
kostya
parents:
8685
diff
changeset
|
827 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index]; |
4238 | 828 if(v->bfraction == 0) { |
6481 | 829 v->s.pict_type = FF_BI_TYPE; /* XXX: should not happen here */ |
4238 | 830 } |
831 } | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
832 pqindex = get_bits(gb, 5); |
6150 | 833 if(!pqindex) return -1; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
834 v->pqindex = pqindex; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
835 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
4949 | 836 v->pq = ff_vc1_pquant_table[0][pqindex]; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
837 else |
4949 | 838 v->pq = ff_vc1_pquant_table[1][pqindex]; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
839 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
840 v->pquantizer = 1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
841 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
842 v->pquantizer = pqindex < 9; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
843 if (v->quantizer_mode == QUANT_NON_UNIFORM) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
844 v->pquantizer = 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
845 v->pqindex = pqindex; |
5513 | 846 if (pqindex < 9) v->halfpq = get_bits1(gb); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
847 else v->halfpq = 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
848 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
5513 | 849 v->pquantizer = get_bits1(gb); |
8152
cddc3677e7dc
421l: postproc flag may be present in any VC-1 AP frame type
kostya
parents:
7846
diff
changeset
|
850 if(v->postprocflag) |
8639
29096719e684
VC-1 postproc field is 2 bits wide while decoder read only single bit.
kostya
parents:
8632
diff
changeset
|
851 v->postproc = get_bits(gb, 2); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
852 |
6481 | 853 if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0; |
4518
e3c43b4aa9ac
Intensity compensation for B-frames in AP was missing
kostya
parents:
4487
diff
changeset
|
854 |
9732
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
855 if(v->parse_only) |
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
856 return 0; |
c25359a56edf
set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents:
9645
diff
changeset
|
857 |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
858 switch(v->s.pict_type) { |
6481 | 859 case FF_I_TYPE: |
860 case FF_BI_TYPE: | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
861 status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
862 if (status < 0) return -1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
863 av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: " |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
864 "Imode: %i, Invert: %i\n", status>>1, status&1); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
865 v->condover = CONDOVER_NONE; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
866 if(v->overlap && v->pq <= 8) { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
867 v->condover = decode012(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
868 if(v->condover == CONDOVER_SELECT) { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
869 status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
870 if (status < 0) return -1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
871 av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: " |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
872 "Imode: %i, Invert: %i\n", status>>1, status&1); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
873 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
874 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
875 break; |
6481 | 876 case FF_P_TYPE: |
5511 | 877 if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
878 else v->mvrange = 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
879 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
880 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
881 v->range_x = 1 << (v->k_x - 1); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
882 v->range_y = 1 << (v->k_y - 1); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
883 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
884 if (v->pq < 5) v->tt_index = 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
885 else if(v->pq < 13) v->tt_index = 1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
886 else v->tt_index = 2; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
887 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
888 lowquant = (v->pq > 12) ? 0 : 1; |
5511 | 889 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)]; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
890 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
891 { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
892 int scale, shift, i; |
5511 | 893 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)]; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
894 v->lumscale = get_bits(gb, 6); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
895 v->lumshift = get_bits(gb, 6); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
896 /* fill lookup tables for intensity compensation */ |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
897 if(!v->lumscale) { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
898 scale = -64; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
899 shift = (255 - v->lumshift * 2) << 6; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
900 if(v->lumshift > 31) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
901 shift += 128 << 6; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
902 } else { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
903 scale = v->lumscale + 32; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
904 if(v->lumshift > 31) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
905 shift = (v->lumshift - 64) << 6; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
906 else |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
907 shift = v->lumshift << 6; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
908 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
909 for(i = 0; i < 256; i++) { |
4594 | 910 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6); |
911 v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6); | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
912 } |
4518
e3c43b4aa9ac
Intensity compensation for B-frames in AP was missing
kostya
parents:
4487
diff
changeset
|
913 v->use_ic = 1; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
914 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
915 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
916 v->s.quarter_sample = 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
917 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
918 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
919 v->s.quarter_sample = 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
920 else |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
921 v->s.quarter_sample = 1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
922 } else |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
923 v->s.quarter_sample = 1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
924 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
925 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
926 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
927 v->mv_mode2 == MV_PMODE_MIXED_MV) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
928 || v->mv_mode == MV_PMODE_MIXED_MV) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
929 { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
930 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
931 if (status < 0) return -1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
932 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
933 "Imode: %i, Invert: %i\n", status>>1, status&1); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
934 } else { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
935 v->mv_type_is_raw = 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
936 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
937 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
938 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
939 if (status < 0) return -1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
940 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
941 "Imode: %i, Invert: %i\n", status>>1, status&1); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
942 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
943 /* Hopefully this is correct for P frames */ |
4949 | 944 v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables |
945 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)]; | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
946 if (v->dquant) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
947 { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
948 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
949 vop_dquant_decoding(v); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
950 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
951 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
952 v->ttfrm = 0; //FIXME Is that so ? |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
953 if (v->vstransform) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
954 { |
5513 | 955 v->ttmbf = get_bits1(gb); |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
956 if (v->ttmbf) |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
957 { |
4949 | 958 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
959 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
960 } else { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
961 v->ttmbf = 1; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
962 v->ttfrm = TT_8X8; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
963 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
964 break; |
6481 | 965 case FF_B_TYPE: |
5511 | 966 if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3); |
4238 | 967 else v->mvrange = 0; |
968 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13 | |
969 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11 | |
970 v->range_x = 1 << (v->k_x - 1); | |
971 v->range_y = 1 << (v->k_y - 1); | |
972 | |
973 if (v->pq < 5) v->tt_index = 0; | |
974 else if(v->pq < 13) v->tt_index = 1; | |
975 else v->tt_index = 2; | |
976 | |
977 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN; | |
978 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV); | |
979 v->s.mspel = v->s.quarter_sample; | |
980 | |
981 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v); | |
982 if (status < 0) return -1; | |
983 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: " | |
984 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
985 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v); | |
986 if (status < 0) return -1; | |
987 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " | |
988 "Imode: %i, Invert: %i\n", status>>1, status&1); | |
989 | |
990 v->s.mv_table_index = get_bits(gb, 2); | |
4949 | 991 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)]; |
4238 | 992 |
993 if (v->dquant) | |
994 { | |
995 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); | |
996 vop_dquant_decoding(v); | |
997 } | |
998 | |
999 v->ttfrm = 0; | |
1000 if (v->vstransform) | |
1001 { | |
5513 | 1002 v->ttmbf = get_bits1(gb); |
4238 | 1003 if (v->ttmbf) |
1004 { | |
4949 | 1005 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)]; |
4238 | 1006 } |
1007 } else { | |
1008 v->ttmbf = 1; | |
1009 v->ttfrm = TT_8X8; | |
1010 } | |
1011 break; | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1012 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1013 |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1014 /* AC Syntax */ |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1015 v->c_ac_table_index = decode012(gb); |
6481 | 1016 if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE) |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1017 { |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1018 v->y_ac_table_index = decode012(gb); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1019 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1020 /* DC Syntax */ |
5513 | 1021 v->s.dc_table_index = get_bits1(gb); |
6481 | 1022 if ((v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE) && v->dquant) { |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1023 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n"); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1024 vop_dquant_decoding(v); |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1025 } |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1026 |
3693 | 1027 v->bi_type = 0; |
6481 | 1028 if(v->s.pict_type == FF_BI_TYPE) { |
1029 v->s.pict_type = FF_B_TYPE; | |
3693 | 1030 v->bi_type = 1; |
1031 } | |
3672
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1032 return 0; |
9d4583fe8fca
VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents:
3664
diff
changeset
|
1033 } |