annotate vc1.c @ 11455:70472d1d2524 libavcodec

Check level_prefix a bit (this just checks the max our bitreader can handle, as i did nt find a limit in the spec) This should stop cavlc_decode_residual() on a zero bitstream
author michael
date Wed, 10 Mar 2010 09:55:03 +0000
parents d580026275a1
children 7dd2a45249a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
d4feec96fd64 Looks like I'll work on it this year too
kostya
parents: 4604
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3920
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
16 * Lesser General Public License for more details.
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
17 *
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3920
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
21 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
22
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
23 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8692
diff changeset
24 * @file libavcodec/vc1.c
9836
e678b20368cd Split decoder-specific code off from vc1.c into vc1dec.c and keep code
diego
parents: 9815
diff changeset
25 * VC-1 and WMV3 decoder common code
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
26 *
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
27 */
9011
90c99bda19f5 Approved hunks for VAAPI / our new shiny hwaccel API
michael
parents: 8955
diff changeset
28 #include "internal.h"
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
29 #include "dsputil.h"
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
30 #include "avcodec.h"
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
31 #include "mpegvideo.h"
4926
194f4ced7c50 Move variables to vc1data.h
kostya
parents: 4902
diff changeset
32 #include "vc1.h"
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
33 #include "vc1data.h"
4965
f9bb3aca0888 use header instead of copying table declarations
aurel
parents: 4962
diff changeset
34 #include "msmpeg4data.h"
5605
d92fa6e5fc8c move get_unary() to its own file
aurel
parents: 5519
diff changeset
35 #include "unary.h"
5849
c1d42c875be8 Use simple IDCT for now
kostya
parents: 5848
diff changeset
36 #include "simple_idct.h"
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
37
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
38 #undef NDEBUG
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
39 #include <assert.h>
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
40
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
41 /***********************************************************************/
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
42 /**
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
43 * @defgroup vc1bitplane VC-1 Bitplane decoding
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
44 * @see 8.7, p56
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
45 * @{
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
46 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
47
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
48 /**
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
49 * Imode types
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
50 * @{
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
61 /** @} */ //imode defines
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
62
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
63 /** Decode rows by checking if they are skipped
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
64 * @param plane Buffer to store decoded bits
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
65 * @param[in] width Width of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
66 * @param[in] height Height of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
67 * @param[in] stride of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
68 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
69 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
70 int x, y;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
71
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
72 for (y=0; y<height; y++){
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
73 if (!get_bits1(gb)) //rowskip
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
74 memset(plane, 0, width);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
75 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
76 for (x=0; x<width; x++)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
77 plane[x] = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
78 plane += stride;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
79 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
80 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
81
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
82 /** Decode columns by checking if they are skipped
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
83 * @param plane Buffer to store decoded bits
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
84 * @param[in] width Width of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
85 * @param[in] height Height of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
88 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
89 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
90 int x, y;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
91
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
92 for (x=0; x<width; x++){
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
93 if (!get_bits1(gb)) //colskip
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
94 for (y=0; y<height; y++)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
95 plane[y*stride] = 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
96 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
97 for (y=0; y<height; y++)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
98 plane[y*stride] = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
99 plane ++;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
100 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
101 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
102
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
103 /** Decode a bitplane's bits
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
104 * @param data bitplane where to store the decode bits
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
107 * @return Status
5299
4623928e3b9e Replace non-existing @fixme doxygen tags with @todo.
diego
parents: 5228
diff changeset
108 * @todo FIXME: Optimize
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
111 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
112 GetBitContext *gb = &v->s.gb;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
121 invert = get_bits1(gb);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
122 imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
123
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
124 *raw_flag = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
125 switch (imode)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
126 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
127 case IMODE_RAW:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
130 return invert;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
131 case IMODE_DIFF2:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
134 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
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
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
153 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
154 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
155 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
156 case IMODE_DIFF6:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
191 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
192 planep += stride * 2;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
197 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
198 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
201 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
204 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
205 default: break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
206 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
207
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
208 /* Applying diff operator */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
209 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
210 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
211 planep = data;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
223 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
224 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
225 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
226 else if (invert)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
230 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
231 return (imode<<1) + invert;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
232 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
233
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
234 /** @} */ //Bitplane group
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
235
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
236 /***********************************************************************/
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
239 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
240 static int vop_dquant_decoding(VC1Context *v)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
241 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
242 GetBitContext *gb = &v->s.gb;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
243 int pqdiff;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
244
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
245 //variable size
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
246 if (v->dquant == 2)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
247 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
248 pqdiff = get_bits(gb, 3);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
249 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
250 else v->altpq = v->pq + pqdiff + 1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
251 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
252 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
253 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
254 v->dquantfrm = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
255 if ( v->dquantfrm )
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
256 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
257 v->dqprofile = get_bits(gb, 2);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
258 switch (v->dqprofile)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
259 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
260 case DQPROFILE_SINGLE_EDGE:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
261 case DQPROFILE_DOUBLE_EDGES:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
262 v->dqsbedge = get_bits(gb, 2);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
263 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
264 case DQPROFILE_ALL_MBS:
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
268 default: break; //Forbidden ?
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
269 }
3451
45724ba8d666 Fix mquant selection for ALL_MBS mode
kostya
parents: 3450
diff changeset
270 if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
271 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
272 pqdiff = get_bits(gb, 3);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
273 if (pqdiff == 7) v->altpq = get_bits(gb, 5);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
274 else v->altpq = v->pq + pqdiff + 1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
275 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
276 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
277 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
278 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
279 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
7857ae840b0b Don't print header bits by default
kostya
parents: 3691
diff changeset
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
40cd5f7f34e7 WMV3 Complex Profile initial support
kostya
parents: 4594
diff changeset
294 if (v->profile == PROFILE_COMPLEX)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
295 {
4604
40cd5f7f34e7 WMV3 Complex Profile initial support
kostya
parents: 4594
diff changeset
296 av_log(avctx, AV_LOG_ERROR, "WMV3 Complex Profile is not fully supported\n");
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
297 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
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
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
306 {
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
307 v->zz_8x4 = wmv2_scantableA;
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
308 v->zz_4x8 = wmv2_scantableB;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
309 v->res_sm = get_bits(gb, 2); //reserved
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
310 if (v->res_sm)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
311 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
312 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
313 "Reserved RES_SM=%i is forbidden\n", v->res_sm);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
314 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
315 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
316 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
317
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
318 // (fps-2)/4 (->30)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
319 v->frmrtq_postproc = get_bits(gb, 3); //common
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
320 // (bitrate-32kbps)/64kbps
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
321 v->bitrtq_postproc = get_bits(gb, 5); //common
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
322 v->s.loop_filter = get_bits1(gb); //common
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
323 if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
324 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
325 av_log(avctx, AV_LOG_ERROR,
9858
53d5914a30ef Fix typo in vc1.c, make capitalization in warning/error messages more consistent.
darkshikari
parents: 9836
diff changeset
326 "LOOPFILTER shall not be enabled in Simple Profile\n");
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
327 }
7846
a7162bb60138 Make it possible to disable loop filter in VC-1.
kostya
parents: 7429
diff changeset
328 if(v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
a7162bb60138 Make it possible to disable loop filter in VC-1.
kostya
parents: 7429
diff changeset
329 v->s.loop_filter = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
330
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
331 v->res_x8 = get_bits1(gb); //reserved
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
332 v->multires = get_bits1(gb);
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
333 v->res_fasttx = get_bits1(gb);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
334 if (!v->res_fasttx)
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
335 {
6001
f4859c13426b add ff_ prefix to all simple_idct symbols
aurel
parents: 5998
diff changeset
336 v->s.dsp.vc1_inv_trans_8x8 = ff_simple_idct;
f4859c13426b add ff_ prefix to all simple_idct symbols
aurel
parents: 5998
diff changeset
337 v->s.dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
f4859c13426b add ff_ prefix to all simple_idct symbols
aurel
parents: 5998
diff changeset
338 v->s.dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
6008
2c4164b26d53 Enable 4x4 IDCT for FASTTX=0 mode in WMV3
kostya
parents: 6001
diff changeset
339 v->s.dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
9859
7a116de63777 idct_dc for VC-1/WMV3 decoder; ~11% faster decoding overall.
darkshikari
parents: 9858
diff changeset
340 v->s.dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add;
7a116de63777 idct_dc for VC-1/WMV3 decoder; ~11% faster decoding overall.
darkshikari
parents: 9858
diff changeset
341 v->s.dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
7a116de63777 idct_dc for VC-1/WMV3 decoder; ~11% faster decoding overall.
darkshikari
parents: 9858
diff changeset
342 v->s.dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
7a116de63777 idct_dc for VC-1/WMV3 decoder; ~11% faster decoding overall.
darkshikari
parents: 9858
diff changeset
343 v->s.dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
344 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
345
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
346 v->fastuvmc = get_bits1(gb); //common
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
347 if (!v->profile && !v->fastuvmc)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
348 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
349 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
350 "FASTUVMC unavailable in Simple Profile\n");
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
351 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
352 }
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
353 v->extended_mv = get_bits1(gb); //common
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
354 if (!v->profile && v->extended_mv)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
355 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
356 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
357 "Extended MVs unavailable in Simple Profile\n");
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
358 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
359 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
360 v->dquant = get_bits(gb, 2); //common
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
361 v->vstransform = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
362
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
363 v->res_transtab = get_bits1(gb);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
364 if (v->res_transtab)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
365 {
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
366 av_log(avctx, AV_LOG_ERROR,
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
367 "1 for reserved RES_TRANSTAB is forbidden\n");
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
368 return -1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
369 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
370
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
371 v->overlap = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
372
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
373 v->s.resync_marker = get_bits1(gb);
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
374 v->rangered = get_bits1(gb);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
375 if (v->rangered && v->profile == PROFILE_SIMPLE)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
376 {
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
377 av_log(avctx, AV_LOG_INFO,
9858
53d5914a30ef Fix typo in vc1.c, make capitalization in warning/error messages more consistent.
darkshikari
parents: 9836
diff changeset
378 "RANGERED should be set to 0 in Simple Profile\n");
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
379 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
380
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
381 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
382 v->quantizer_mode = get_bits(gb, 2); //common
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
383
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
384 v->finterpflag = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
385 v->res_rtm_flag = get_bits1(gb); //reserved
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
386 if (!v->res_rtm_flag)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
387 {
3538
f26bf13bbb69 Don't try to decode P-frames from old WMV3 variant until their format is figured
kostya
parents: 3528
diff changeset
388 // av_log(avctx, AV_LOG_ERROR,
f26bf13bbb69 Don't try to decode P-frames from old WMV3 variant until their format is figured
kostya
parents: 3528
diff changeset
389 // "0 for reserved RES_RTM_FLAG is forbidden\n");
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
390 av_log(avctx, AV_LOG_ERROR,
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
391 "Old WMV3 version detected, only I-frames will be decoded\n");
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
392 //return -1;
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
393 }
4742
184d33cce3b6 FASTTX==0 means additional 16 bits in extradata
kostya
parents: 4741
diff changeset
394 //TODO: figure out what they mean (always 0x402F)
184d33cce3b6 FASTTX==0 means additional 16 bits in extradata
kostya
parents: 4741
diff changeset
395 if(!v->res_fasttx) skip_bits(gb, 16);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
396 av_log(avctx, AV_LOG_DEBUG,
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
397 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
3457
ad66c11aeab4 FastUVMV vs FastUVMC typo, noticed by bond
diego
parents: 3453
diff changeset
398 "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
399 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
400 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
401 v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
402 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
403 v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
404 v->dquant, v->quantizer_mode, avctx->max_b_frames
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
405 );
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
406 return 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
407 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
408
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
409 static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
410 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
411 v->res_rtm_flag = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
412 v->level = get_bits(gb, 3);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
413 if(v->level >= 5)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
414 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
415 av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
416 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
417 v->chromaformat = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
418 if (v->chromaformat != 1)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
419 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
420 av_log(v->s.avctx, AV_LOG_ERROR,
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
421 "Only 4:2:0 chroma format supported\n");
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
422 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
423 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
424
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
425 // (fps-2)/4 (->30)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
426 v->frmrtq_postproc = get_bits(gb, 3); //common
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
427 // (bitrate-32kbps)/64kbps
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
428 v->bitrtq_postproc = get_bits(gb, 5); //common
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
429 v->postprocflag = get_bits1(gb); //common
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
430
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
431 v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
432 v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
4474
82277cf5f051 Set codec dimensions in extradata parsing
kostya
parents: 4471
diff changeset
433 v->s.avctx->width = v->s.avctx->coded_width;
82277cf5f051 Set codec dimensions in extradata parsing
kostya
parents: 4471
diff changeset
434 v->s.avctx->height = v->s.avctx->coded_height;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
435 v->broadcast = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
436 v->interlace = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
437 v->tfcntrflag = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
438 v->finterpflag = get_bits1(gb);
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
439 skip_bits1(gb); // reserved
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
440
4680
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
441 v->s.h_edge_pos = v->s.avctx->coded_width;
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
442 v->s.v_edge_pos = v->s.avctx->coded_height;
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
443
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
444 av_log(v->s.avctx, AV_LOG_DEBUG,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
445 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
446 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
447 "TFCTRflag=%i, FINTERPflag=%i\n",
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
448 v->level, v->frmrtq_postproc, v->bitrtq_postproc,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
449 v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
450 v->tfcntrflag, v->finterpflag
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
451 );
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
452
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
453 v->psf = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
454 if(v->psf) { //PsF, 6.1.13
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
455 av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n");
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
456 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
457 }
4486
1d2320afa864 B-frames could not be determined from broken_link/closed_entry, use fixed value
kostya
parents: 4485
diff changeset
458 v->s.max_b_frames = v->s.avctx->max_b_frames = 7;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
459 if(get_bits1(gb)) { //Display Info - decoding is not affected by it
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
460 int w, h, ar = 0;
4467
a9f64d2a2e69 These messages are just for debug purposes
kostya
parents: 4466
diff changeset
461 av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n");
9541
7afd4f44c450 Display dimensions should not affect the real size of coded frame, thus set
kostya
parents: 9537
diff changeset
462 v->s.avctx->width = w = get_bits(gb, 14) + 1;
7afd4f44c450 Display dimensions should not affect the real size of coded frame, thus set
kostya
parents: 9537
diff changeset
463 v->s.avctx->height = h = get_bits(gb, 14) + 1;
4467
a9f64d2a2e69 These messages are just for debug purposes
kostya
parents: 4466
diff changeset
464 av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
465 if(get_bits1(gb))
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
466 ar = get_bits(gb, 4);
4414
7c42c51b1130 Set aspect ratio if present (for AP only)
kostya
parents: 4402
diff changeset
467 if(ar && ar < 14){
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
468 v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar];
4414
7c42c51b1130 Set aspect ratio if present (for AP only)
kostya
parents: 4402
diff changeset
469 }else if(ar == 15){
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
470 w = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
471 h = get_bits(gb, 8);
4414
7c42c51b1130 Set aspect ratio if present (for AP only)
kostya
parents: 4402
diff changeset
472 v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
473 }
8583
d94775e24b0e Print VC-1 aspect ratio in debug
kostya
parents: 8582
diff changeset
474 av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n", v->s.avctx->sample_aspect_ratio.num, v->s.avctx->sample_aspect_ratio.den);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
475
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
476 if(get_bits1(gb)){ //framerate stuff
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
477 if(get_bits1(gb)) {
4470
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
478 v->s.avctx->time_base.num = 32;
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
479 v->s.avctx->time_base.den = get_bits(gb, 16) + 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
480 } else {
4470
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
481 int nr, dr;
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
482 nr = get_bits(gb, 8);
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
483 dr = get_bits(gb, 4);
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
484 if(nr && nr < 8 && dr && dr < 3){
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
485 v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1];
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
486 v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000;
4470
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
487 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
488 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
489 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
490
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
491 if(get_bits1(gb)){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
492 v->color_prim = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
493 v->transfer_char = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
494 v->matrix_coef = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
495 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
496 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
497
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
498 v->hrd_param_flag = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
499 if(v->hrd_param_flag) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
500 int i;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
501 v->hrd_num_leaky_buckets = get_bits(gb, 5);
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
502 skip_bits(gb, 4); //bitrate exponent
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
503 skip_bits(gb, 4); //buffer size exponent
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
504 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
505 skip_bits(gb, 16); //hrd_rate[n]
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
506 skip_bits(gb, 16); //hrd_buffer[n]
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
507 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
508 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
509 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
510 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
511
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
512 int vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
513 {
8692
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
514 int i;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
515
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
516 av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
8692
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
517 v->broken_link = get_bits1(gb);
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
518 v->closed_entry = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
519 v->panscanflag = get_bits1(gb);
8556
ce9d640decd1 Add refdist_flag to VC1Context.
cehoyos
parents: 8152
diff changeset
520 v->refdist_flag = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
521 v->s.loop_filter = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
522 v->fastuvmc = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
523 v->extended_mv = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
524 v->dquant = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
525 v->vstransform = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
526 v->overlap = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
527 v->quantizer_mode = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
528
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
529 if(v->hrd_param_flag){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
530 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
531 skip_bits(gb, 8); //hrd_full[n]
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
532 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
533 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
534
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
535 if(get_bits1(gb)){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
536 avctx->coded_width = (get_bits(gb, 12)+1)<<1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
537 avctx->coded_height = (get_bits(gb, 12)+1)<<1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
538 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
539 if(v->extended_mv)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
540 v->extended_dmv = get_bits1(gb);
8560
a683a89503eb Fill range_map* in VC1Context.
cehoyos
parents: 8556
diff changeset
541 if((v->range_mapy_flag = get_bits1(gb))) {
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
542 av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
8560
a683a89503eb Fill range_map* in VC1Context.
cehoyos
parents: 8556
diff changeset
543 v->range_mapy = get_bits(gb, 3);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
544 }
8560
a683a89503eb Fill range_map* in VC1Context.
cehoyos
parents: 8556
diff changeset
545 if((v->range_mapuv_flag = get_bits1(gb))) {
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
546 av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n");
8560
a683a89503eb Fill range_map* in VC1Context.
cehoyos
parents: 8556
diff changeset
547 v->range_mapuv = get_bits(gb, 3);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
548 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
549
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
550 av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
551 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
552 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
553 "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
8692
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
554 v->broken_link, v->closed_entry, v->panscanflag, v->refdist_flag, v->s.loop_filter,
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
555 v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode);
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
556
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
557 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
558 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
559
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
560 int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
561 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
562 int pqindex, lowquant, status;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
563
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
564 if(v->finterpflag) v->interpfrm = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
565 skip_bits(gb, 2); //framecnt unused
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
566 v->rangeredfrm = 0;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
567 if (v->rangered) v->rangeredfrm = get_bits1(gb);
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
568 v->s.pict_type = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
569 if (v->s.avctx->max_b_frames) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
570 if (!v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
571 if (get_bits1(gb)) v->s.pict_type = FF_I_TYPE;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
572 else v->s.pict_type = FF_B_TYPE;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
573 } else v->s.pict_type = FF_P_TYPE;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
574 } else v->s.pict_type = v->s.pict_type ? FF_P_TYPE : FF_I_TYPE;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
575
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
576 v->bi_type = 0;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
577 if(v->s.pict_type == FF_B_TYPE) {
8692
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
578 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
579 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
580 if(v->bfraction == 0) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
581 v->s.pict_type = FF_BI_TYPE;
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
582 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
583 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
584 if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
585 skip_bits(gb, 7); // skip buffer fullness
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
586
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
587 if(v->parse_only)
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
588 return 0;
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
589
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
590 /* calculate RND */
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
591 if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
592 v->rnd = 1;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
593 if(v->s.pict_type == FF_P_TYPE)
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
594 v->rnd ^= 1;
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
595
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
596 /* Quantizer stuff */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
597 pqindex = get_bits(gb, 5);
6150
49a4e4d78692 pqindex=0 is forbidden
kostya
parents: 6145
diff changeset
598 if(!pqindex) return -1;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
599 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
600 v->pq = ff_vc1_pquant_table[0][pqindex];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
601 else
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
602 v->pq = ff_vc1_pquant_table[1][pqindex];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
603
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
604 v->pquantizer = 1;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
605 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
606 v->pquantizer = pqindex < 9;
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
607 if (v->quantizer_mode == QUANT_NON_UNIFORM)
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
608 v->pquantizer = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
609 v->pqindex = pqindex;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
610 if (pqindex < 9) v->halfpq = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
611 else v->halfpq = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
612 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
613 v->pquantizer = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
614 v->dquantfrm = 0;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
615 if (v->extended_mv == 1) v->mvrange = get_unary(gb, 0, 3);
3452
f024ca7c768b MVRANGE may occur in all frames and RESPIC in all but B-frames
kostya
parents: 3451
diff changeset
616 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
f024ca7c768b MVRANGE may occur in all frames and RESPIC in all but B-frames
kostya
parents: 3451
diff changeset
617 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
f024ca7c768b MVRANGE may occur in all frames and RESPIC in all but B-frames
kostya
parents: 3451
diff changeset
618 v->range_x = 1 << (v->k_x - 1);
f024ca7c768b MVRANGE may occur in all frames and RESPIC in all but B-frames
kostya
parents: 3451
diff changeset
619 v->range_y = 1 << (v->k_y - 1);
8640
ad979489c6e7 Remove the block with always false condition from vc1_parse_frame_header()
kostya
parents: 8639
diff changeset
620 if (v->multires && v->s.pict_type != FF_B_TYPE) v->respic = get_bits(gb, 2);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
621
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
622 if(v->res_x8 && (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)){
5887
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
623 v->x8_type = get_bits1(gb);
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
624 }else v->x8_type = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
625 //av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
626 // (v->s.pict_type == FF_P_TYPE) ? 'P' : ((v->s.pict_type == FF_I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
627
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
628 if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0;
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
629
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
630 switch(v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
631 case FF_P_TYPE:
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
632 if (v->pq < 5) v->tt_index = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
633 else if(v->pq < 13) v->tt_index = 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
634 else v->tt_index = 2;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
635
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
636 lowquant = (v->pq > 12) ? 0 : 1;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
637 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
638 if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
639 {
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
640 int scale, shift, i;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
641 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
642 v->lumscale = get_bits(gb, 6);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
643 v->lumshift = get_bits(gb, 6);
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
644 v->use_ic = 1;
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
645 /* fill lookup tables for intensity compensation */
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
646 if(!v->lumscale) {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
647 scale = -64;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
648 shift = (255 - v->lumshift * 2) << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
649 if(v->lumshift > 31)
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
650 shift += 128 << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
651 } else {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
652 scale = v->lumscale + 32;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
653 if(v->lumshift > 31)
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
654 shift = (v->lumshift - 64) << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
655 else
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
656 shift = v->lumshift << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
657 }
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
658 for(i = 0; i < 256; i++) {
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
659 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
660 v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
661 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
662 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
663 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
664 v->s.quarter_sample = 0;
3401
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
665 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
666 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
667 v->s.quarter_sample = 0;
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
668 else
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
669 v->s.quarter_sample = 1;
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
670 } else
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
671 v->s.quarter_sample = 1;
3523
7407a264d243 Set MpegEncContext->mspel flag (here it indicates that bicubic MC will be use)
kostya
parents: 3522
diff changeset
672 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
673
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
674 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
675 v->mv_mode2 == MV_PMODE_MIXED_MV)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
676 || v->mv_mode == MV_PMODE_MIXED_MV)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
677 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
678 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
679 if (status < 0) return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
680 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
681 "Imode: %i, Invert: %i\n", status>>1, status&1);
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
682 } else {
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
683 v->mv_type_is_raw = 0;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
684 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
685 }
3375
a1c2e1603be9 Use MpegEncContext->mbskip_table instead of custom bitplane.
kostya
parents: 3371
diff changeset
686 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
687 if (status < 0) return -1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
688 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
689 "Imode: %i, Invert: %i\n", status>>1, status&1);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
690
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
691 /* Hopefully this is correct for P frames */
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
692 v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
693 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
694
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
695 if (v->dquant)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
696 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
697 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
698 vop_dquant_decoding(v);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
699 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
700
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
701 v->ttfrm = 0; //FIXME Is that so ?
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
702 if (v->vstransform)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
703 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
704 v->ttmbf = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
705 if (v->ttmbf)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
706 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
707 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
708 }
3506
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
709 } else {
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
710 v->ttmbf = 1;
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
711 v->ttfrm = TT_8X8;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
712 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
713 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
714 case FF_B_TYPE:
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
715 if (v->pq < 5) v->tt_index = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
716 else if(v->pq < 13) v->tt_index = 1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
717 else v->tt_index = 2;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
718
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
719 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
720 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
3523
7407a264d243 Set MpegEncContext->mspel flag (here it indicates that bicubic MC will be use)
kostya
parents: 3522
diff changeset
721 v->s.mspel = v->s.quarter_sample;
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
722
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
723 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
724 if (status < 0) return -1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
725 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
726 "Imode: %i, Invert: %i\n", status>>1, status&1);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
727 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
728 if (status < 0) return -1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
729 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
730 "Imode: %i, Invert: %i\n", status>>1, status&1);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
731
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
732 v->s.mv_table_index = get_bits(gb, 2);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
733 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
734
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
735 if (v->dquant)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
736 {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
737 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
738 vop_dquant_decoding(v);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
739 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
740
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
741 v->ttfrm = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
742 if (v->vstransform)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
743 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
744 v->ttmbf = get_bits1(gb);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
745 if (v->ttmbf)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
746 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
747 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
748 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
749 } else {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
750 v->ttmbf = 1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
751 v->ttfrm = TT_8X8;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
752 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
753 break;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
754 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
755
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
756 if(!v->x8_type)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
757 {
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
758 /* AC Syntax */
efc1e9a01671 indention
michael
parents: 5887
diff changeset
759 v->c_ac_table_index = decode012(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
760 if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
761 {
efc1e9a01671 indention
michael
parents: 5887
diff changeset
762 v->y_ac_table_index = decode012(gb);
efc1e9a01671 indention
michael
parents: 5887
diff changeset
763 }
efc1e9a01671 indention
michael
parents: 5887
diff changeset
764 /* DC Syntax */
efc1e9a01671 indention
michael
parents: 5887
diff changeset
765 v->s.dc_table_index = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
766 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
767
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
768 if(v->s.pict_type == FF_BI_TYPE) {
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
769 v->s.pict_type = FF_B_TYPE;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
770 v->bi_type = 1;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
771 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
772 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
773 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
774
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
775 int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
776 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
777 int pqindex, lowquant;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
778 int status;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
779
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
780 v->p_frame_skipped = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
781
4487
0a0a9f0c9c2d Progressive frames disguised as interlaced are supported
kostya
parents: 4486
diff changeset
782 if(v->interlace){
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
783 v->fcm = decode012(gb);
10379
d580026275a1 Print error message when true interlaced VC-1 frames are encountered
kostya
parents: 9859
diff changeset
784 if(v->fcm){
d580026275a1 Print error message when true interlaced VC-1 frames are encountered
kostya
parents: 9859
diff changeset
785 if(!v->warn_interlaced++)
d580026275a1 Print error message when true interlaced VC-1 frames are encountered
kostya
parents: 9859
diff changeset
786 av_log(v->s.avctx, AV_LOG_ERROR, "Interlaced frames/fields support is not implemented\n");
d580026275a1 Print error message when true interlaced VC-1 frames are encountered
kostya
parents: 9859
diff changeset
787 return -1;
d580026275a1 Print error message when true interlaced VC-1 frames are encountered
kostya
parents: 9859
diff changeset
788 }
4487
0a0a9f0c9c2d Progressive frames disguised as interlaced are supported
kostya
parents: 4486
diff changeset
789 }
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
790 switch(get_unary(gb, 0, 4)) {
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
791 case 0:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
792 v->s.pict_type = FF_P_TYPE;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
793 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
794 case 1:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
795 v->s.pict_type = FF_B_TYPE;
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
796 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
797 case 2:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
798 v->s.pict_type = FF_I_TYPE;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
799 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
800 case 3:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
801 v->s.pict_type = FF_BI_TYPE;
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
802 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
803 case 4:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
804 v->s.pict_type = FF_P_TYPE; // skipped pic
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
805 v->p_frame_skipped = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
806 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
807 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
808 if(v->tfcntrflag)
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
809 skip_bits(gb, 8);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
810 if(v->broadcast) {
4485
81a120f5f8d0 Wrong flag tested
kostya
parents: 4474
diff changeset
811 if(!v->interlace || v->psf) {
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
812 v->rptfrm = get_bits(gb, 2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
813 } else {
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
814 v->tff = get_bits1(gb);
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
815 v->rptfrm = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
816 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
817 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
818 if(v->panscanflag) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
819 //...
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
820 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
821 v->rnd = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
822 if(v->interlace)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
823 v->uvsamp = get_bits1(gb);
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
824 if(v->finterpflag) v->interpfrm = get_bits1(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
825 if(v->s.pict_type == FF_B_TYPE) {
8692
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
826 v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
827 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
828 if(v->bfraction == 0) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
829 v->s.pict_type = FF_BI_TYPE; /* XXX: should not happen here */
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
830 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
831 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
832 pqindex = get_bits(gb, 5);
6150
49a4e4d78692 pqindex=0 is forbidden
kostya
parents: 6145
diff changeset
833 if(!pqindex) return -1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
834 v->pqindex = pqindex;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
835 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
836 v->pq = ff_vc1_pquant_table[0][pqindex];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
837 else
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
838 v->pq = ff_vc1_pquant_table[1][pqindex];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
839
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
840 v->pquantizer = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
841 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
842 v->pquantizer = pqindex < 9;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
843 if (v->quantizer_mode == QUANT_NON_UNIFORM)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
844 v->pquantizer = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
845 v->pqindex = pqindex;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
846 if (pqindex < 9) v->halfpq = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
847 else v->halfpq = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
848 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
849 v->pquantizer = get_bits1(gb);
8152
cddc3677e7dc 421l: postproc flag may be present in any VC-1 AP frame type
kostya
parents: 7846
diff changeset
850 if(v->postprocflag)
8639
29096719e684 VC-1 postproc field is 2 bits wide while decoder read only single bit.
kostya
parents: 8632
diff changeset
851 v->postproc = get_bits(gb, 2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
852
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
853 if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0;
4518
e3c43b4aa9ac Intensity compensation for B-frames in AP was missing
kostya
parents: 4487
diff changeset
854
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
855 if(v->parse_only)
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
856 return 0;
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
857
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
858 switch(v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
859 case FF_I_TYPE:
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
860 case FF_BI_TYPE:
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
861 status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
862 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
863 av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
864 "Imode: %i, Invert: %i\n", status>>1, status&1);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
865 v->condover = CONDOVER_NONE;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
866 if(v->overlap && v->pq <= 8) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
867 v->condover = decode012(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
868 if(v->condover == CONDOVER_SELECT) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
869 status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
870 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
871 av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: "
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
872 "Imode: %i, Invert: %i\n", status>>1, status&1);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
873 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
874 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
875 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
876 case FF_P_TYPE:
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
877 if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
878 else v->mvrange = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
879 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
880 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
881 v->range_x = 1 << (v->k_x - 1);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
882 v->range_y = 1 << (v->k_y - 1);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
883
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
884 if (v->pq < 5) v->tt_index = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
885 else if(v->pq < 13) v->tt_index = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
886 else v->tt_index = 2;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
887
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
888 lowquant = (v->pq > 12) ? 0 : 1;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
889 v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
890 if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
891 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
892 int scale, shift, i;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
893 v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
894 v->lumscale = get_bits(gb, 6);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
895 v->lumshift = get_bits(gb, 6);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
896 /* fill lookup tables for intensity compensation */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
897 if(!v->lumscale) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
898 scale = -64;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
899 shift = (255 - v->lumshift * 2) << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
900 if(v->lumshift > 31)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
901 shift += 128 << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
902 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
903 scale = v->lumscale + 32;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
904 if(v->lumshift > 31)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
905 shift = (v->lumshift - 64) << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
906 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
907 shift = v->lumshift << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
908 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
909 for(i = 0; i < 256; i++) {
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
910 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
911 v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
912 }
4518
e3c43b4aa9ac Intensity compensation for B-frames in AP was missing
kostya
parents: 4487
diff changeset
913 v->use_ic = 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
914 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
915 if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
916 v->s.quarter_sample = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
917 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
918 if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
919 v->s.quarter_sample = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
920 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
921 v->s.quarter_sample = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
922 } else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
923 v->s.quarter_sample = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
924 v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
925
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
926 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
927 v->mv_mode2 == MV_PMODE_MIXED_MV)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
928 || v->mv_mode == MV_PMODE_MIXED_MV)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
929 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
930 status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
931 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
932 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
933 "Imode: %i, Invert: %i\n", status>>1, status&1);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
934 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
935 v->mv_type_is_raw = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
936 memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
937 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
938 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
939 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
940 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
941 "Imode: %i, Invert: %i\n", status>>1, status&1);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
942
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
943 /* Hopefully this is correct for P frames */
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
944 v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
945 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
946 if (v->dquant)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
947 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
948 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
949 vop_dquant_decoding(v);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
950 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
951
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
952 v->ttfrm = 0; //FIXME Is that so ?
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
953 if (v->vstransform)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
954 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
955 v->ttmbf = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
956 if (v->ttmbf)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
957 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
958 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
959 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
960 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
961 v->ttmbf = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
962 v->ttfrm = TT_8X8;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
963 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
964 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
965 case FF_B_TYPE:
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
966 if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3);
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
967 else v->mvrange = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
968 v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
969 v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
970 v->range_x = 1 << (v->k_x - 1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
971 v->range_y = 1 << (v->k_y - 1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
972
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
973 if (v->pq < 5) v->tt_index = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
974 else if(v->pq < 13) v->tt_index = 1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
975 else v->tt_index = 2;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
976
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
977 v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
978 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
979 v->s.mspel = v->s.quarter_sample;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
980
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
981 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
982 if (status < 0) return -1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
983 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
984 "Imode: %i, Invert: %i\n", status>>1, status&1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
985 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
986 if (status < 0) return -1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
987 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
988 "Imode: %i, Invert: %i\n", status>>1, status&1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
989
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
990 v->s.mv_table_index = get_bits(gb, 2);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
991 v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
992
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
993 if (v->dquant)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
994 {
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
995 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
996 vop_dquant_decoding(v);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
997 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
998
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
999 v->ttfrm = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1000 if (v->vstransform)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1001 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1002 v->ttmbf = get_bits1(gb);
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1003 if (v->ttmbf)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1004 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1005 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1006 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1007 } else {
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1008 v->ttmbf = 1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1009 v->ttfrm = TT_8X8;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1010 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1011 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1012 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1013
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1014 /* AC Syntax */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1015 v->c_ac_table_index = decode012(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1016 if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1017 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1018 v->y_ac_table_index = decode012(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1019 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1020 /* DC Syntax */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1021 v->s.dc_table_index = get_bits1(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1022 if ((v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE) && v->dquant) {
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1023 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1024 vop_dquant_decoding(v);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1025 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1026
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1027 v->bi_type = 0;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1028 if(v->s.pict_type == FF_BI_TYPE) {
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1029 v->s.pict_type = FF_B_TYPE;
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1030 v->bi_type = 1;
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1031 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1032 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1033 }