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