Mercurial > libavcodec.hg
annotate vc1.c @ 10874:bcfe2acbf190 libavcodec
AAC: Compress codebook tables and optimise sign bit handling
The codebooks each consist of small number of values repeated in
groups of 2 or 4. Storing the codebooks as a packed list of 2- or
4-bit indexes into a table reduces their size substantially (from 7.5k
to 1.5k), resulting in less cache pressure.
For the band types with sign bits in the bitstream, storing the number
and position of non-zero codebook values using a few bits avoids
multiple get_bits() calls and floating-point comparisons which gcc
handles miserably.
Some float/int type punning also avoids gcc brain damage.
Overall speedup 20-35% on Cortex-A8, 20% on Core i7.
author | mru |
---|---|
date | Wed, 13 Jan 2010 16:46:28 +0000 |
parents | d580026275a1 |
children | 7dd2a45249a9 |
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 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8692
diff
changeset
|
24 * @file libavcodec/vc1.c |
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, |
ff18ceefe3d8
[Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents:
3690
diff
changeset
|
391 "Old WMV3 version detected, only I-frames will be decoded\n"); |
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 } |