annotate vc1.c @ 9836:e678b20368cd libavcodec

Split decoder-specific code off from vc1.c into vc1dec.c and keep code shared between decoder and parser in vc1.c.
author diego
date Thu, 11 Jun 2009 09:31:31 +0000
parents 0f281bed6d7b
children 53d5914a30ef
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,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
326 "LOOPFILTER shell not be enabled in simple profile\n");
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;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
340 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
341
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
342 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
343 if (!v->profile && !v->fastuvmc)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
344 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
345 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
346 "FASTUVMC unavailable in Simple Profile\n");
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
347 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
348 }
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
349 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
350 if (!v->profile && v->extended_mv)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
351 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
352 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
353 "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
354 return -1;
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 v->dquant = get_bits(gb, 2); //common
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
357 v->vstransform = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
358
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
359 v->res_transtab = get_bits1(gb);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
360 if (v->res_transtab)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
361 {
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
362 av_log(avctx, AV_LOG_ERROR,
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
363 "1 for reserved RES_TRANSTAB is forbidden\n");
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
364 return -1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
365 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
366
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
367 v->overlap = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
368
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
369 v->s.resync_marker = get_bits1(gb);
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
370 v->rangered = get_bits1(gb);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
371 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
372 {
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
373 av_log(avctx, AV_LOG_INFO,
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
374 "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
375 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
376
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
377 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
378 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
379
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
380 v->finterpflag = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
381 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
382 if (!v->res_rtm_flag)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
383 {
3538
f26bf13bbb69 Don't try to decode P-frames from old WMV3 variant until their format is figured
kostya
parents: 3528
diff changeset
384 // 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
385 // "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
386 av_log(avctx, AV_LOG_ERROR,
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
387 "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
388 //return -1;
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
389 }
4742
184d33cce3b6 FASTTX==0 means additional 16 bits in extradata
kostya
parents: 4741
diff changeset
390 //TODO: figure out what they mean (always 0x402F)
184d33cce3b6 FASTTX==0 means additional 16 bits in extradata
kostya
parents: 4741
diff changeset
391 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
392 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
393 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
3457
ad66c11aeab4 FastUVMV vs FastUVMC typo, noticed by bond
diego
parents: 3453
diff changeset
394 "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
395 "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
396 "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
397 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
398 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
399 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
400 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
401 );
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
402 return 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
403 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
404
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
405 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
406 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
407 v->res_rtm_flag = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
408 v->level = get_bits(gb, 3);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
409 if(v->level >= 5)
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 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
412 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
413 v->chromaformat = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
414 if (v->chromaformat != 1)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
415 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
416 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
417 "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
418 return -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
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
421 // (fps-2)/4 (->30)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
422 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
423 // (bitrate-32kbps)/64kbps
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
424 v->bitrtq_postproc = get_bits(gb, 5); //common
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
425 v->postprocflag = get_bits1(gb); //common
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
426
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
427 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
428 v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
4474
82277cf5f051 Set codec dimensions in extradata parsing
kostya
parents: 4471
diff changeset
429 v->s.avctx->width = v->s.avctx->coded_width;
82277cf5f051 Set codec dimensions in extradata parsing
kostya
parents: 4471
diff changeset
430 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
431 v->broadcast = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
432 v->interlace = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
433 v->tfcntrflag = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
434 v->finterpflag = get_bits1(gb);
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
435 skip_bits1(gb); // reserved
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
436
4680
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
437 v->s.h_edge_pos = v->s.avctx->coded_width;
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
438 v->s.v_edge_pos = v->s.avctx->coded_height;
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
439
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
440 av_log(v->s.avctx, AV_LOG_DEBUG,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
441 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
442 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
443 "TFCTRflag=%i, FINTERPflag=%i\n",
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
444 v->level, v->frmrtq_postproc, v->bitrtq_postproc,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
445 v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
446 v->tfcntrflag, v->finterpflag
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
447 );
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
448
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
449 v->psf = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
450 if(v->psf) { //PsF, 6.1.13
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
451 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
452 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
453 }
4486
1d2320afa864 B-frames could not be determined from broken_link/closed_entry, use fixed value
kostya
parents: 4485
diff changeset
454 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
455 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
456 int w, h, ar = 0;
4467
a9f64d2a2e69 These messages are just for debug purposes
kostya
parents: 4466
diff changeset
457 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
458 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
459 v->s.avctx->height = h = get_bits(gb, 14) + 1;
4467
a9f64d2a2e69 These messages are just for debug purposes
kostya
parents: 4466
diff changeset
460 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
461 if(get_bits1(gb))
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
462 ar = get_bits(gb, 4);
4414
7c42c51b1130 Set aspect ratio if present (for AP only)
kostya
parents: 4402
diff changeset
463 if(ar && ar < 14){
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
464 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
465 }else if(ar == 15){
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
466 w = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
467 h = get_bits(gb, 8);
4414
7c42c51b1130 Set aspect ratio if present (for AP only)
kostya
parents: 4402
diff changeset
468 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
469 }
8583
d94775e24b0e Print VC-1 aspect ratio in debug
kostya
parents: 8582
diff changeset
470 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
471
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
472 if(get_bits1(gb)){ //framerate stuff
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
473 if(get_bits1(gb)) {
4470
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
474 v->s.avctx->time_base.num = 32;
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
475 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
476 } else {
4470
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
477 int nr, dr;
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
478 nr = get_bits(gb, 8);
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
479 dr = get_bits(gb, 4);
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
480 if(nr && nr < 8 && dr && dr < 3){
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
481 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
482 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
483 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
484 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
485 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
486
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
487 if(get_bits1(gb)){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
488 v->color_prim = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
489 v->transfer_char = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
490 v->matrix_coef = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
491 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
492 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
493
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
494 v->hrd_param_flag = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
495 if(v->hrd_param_flag) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
496 int i;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
497 v->hrd_num_leaky_buckets = get_bits(gb, 5);
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
498 skip_bits(gb, 4); //bitrate exponent
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
499 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
500 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
501 skip_bits(gb, 16); //hrd_rate[n]
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
502 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
503 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
504 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
505 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
506 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
507
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
508 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
509 {
8692
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
510 int i;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
511
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
512 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
513 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
514 v->closed_entry = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
515 v->panscanflag = get_bits1(gb);
8556
ce9d640decd1 Add refdist_flag to VC1Context.
cehoyos
parents: 8152
diff changeset
516 v->refdist_flag = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
517 v->s.loop_filter = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
518 v->fastuvmc = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
519 v->extended_mv = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
520 v->dquant = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
521 v->vstransform = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
522 v->overlap = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
523 v->quantizer_mode = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
524
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
525 if(v->hrd_param_flag){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
526 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
527 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
528 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
529 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
530
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
531 if(get_bits1(gb)){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
532 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
533 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
534 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
535 if(v->extended_mv)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
536 v->extended_dmv = get_bits1(gb);
8560
a683a89503eb Fill range_map* in VC1Context.
cehoyos
parents: 8556
diff changeset
537 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
538 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
539 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
540 }
8560
a683a89503eb Fill range_map* in VC1Context.
cehoyos
parents: 8556
diff changeset
541 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
542 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
543 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
544 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
545
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
546 av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
547 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
548 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
549 "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
550 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
551 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
552
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
553 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
554 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
555
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
556 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
557 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
558 int pqindex, lowquant, status;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
559
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
560 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
561 skip_bits(gb, 2); //framecnt unused
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
562 v->rangeredfrm = 0;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
563 if (v->rangered) v->rangeredfrm = get_bits1(gb);
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
564 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
565 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
566 if (!v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
567 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
568 else v->s.pict_type = FF_B_TYPE;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
569 } else v->s.pict_type = FF_P_TYPE;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
570 } 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
571
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
572 v->bi_type = 0;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
573 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
574 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
575 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
576 if(v->bfraction == 0) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
577 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
578 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
579 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
580 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
581 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
582
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
583 if(v->parse_only)
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
584 return 0;
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
585
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
586 /* calculate RND */
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
587 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
588 v->rnd = 1;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
589 if(v->s.pict_type == FF_P_TYPE)
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
590 v->rnd ^= 1;
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
591
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
592 /* Quantizer stuff */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
593 pqindex = get_bits(gb, 5);
6150
49a4e4d78692 pqindex=0 is forbidden
kostya
parents: 6145
diff changeset
594 if(!pqindex) return -1;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
595 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
596 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
597 else
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
598 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
599
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
600 v->pquantizer = 1;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
601 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
602 v->pquantizer = pqindex < 9;
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
603 if (v->quantizer_mode == QUANT_NON_UNIFORM)
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
604 v->pquantizer = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
605 v->pqindex = pqindex;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
606 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
607 else v->halfpq = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
608 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
609 v->pquantizer = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
610 v->dquantfrm = 0;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
611 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
612 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
613 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
614 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
615 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
616 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
617
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
618 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
619 v->x8_type = get_bits1(gb);
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
620 }else v->x8_type = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
621 //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
622 // (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
623
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
624 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
625
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
626 switch(v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
627 case FF_P_TYPE:
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
628 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
629 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
630 else v->tt_index = 2;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
631
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
632 lowquant = (v->pq > 12) ? 0 : 1;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
633 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
634 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
635 {
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
636 int scale, shift, i;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
637 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
638 v->lumscale = get_bits(gb, 6);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
639 v->lumshift = get_bits(gb, 6);
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
640 v->use_ic = 1;
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
641 /* fill lookup tables for intensity compensation */
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
642 if(!v->lumscale) {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
643 scale = -64;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
644 shift = (255 - v->lumshift * 2) << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
645 if(v->lumshift > 31)
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
646 shift += 128 << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
647 } else {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
648 scale = v->lumscale + 32;
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 = (v->lumshift - 64) << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
651 else
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
652 shift = v->lumshift << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
653 }
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
654 for(i = 0; i < 256; i++) {
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
655 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
656 v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
657 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
658 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
659 if(v->mv_mode == MV_PMODE_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
660 v->s.quarter_sample = 0;
3401
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
661 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
662 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
663 v->s.quarter_sample = 0;
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
664 else
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
665 v->s.quarter_sample = 1;
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
666 } else
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
667 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
668 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
669
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
670 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
671 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
672 || 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
673 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
674 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
675 if (status < 0) return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
676 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
677 "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
678 } else {
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
679 v->mv_type_is_raw = 0;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
680 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
681 }
3375
a1c2e1603be9 Use MpegEncContext->mbskip_table instead of custom bitplane.
kostya
parents: 3371
diff changeset
682 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
683 if (status < 0) return -1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
684 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
685 "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
686
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
687 /* Hopefully this is correct for P frames */
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
688 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
689 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
690
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
691 if (v->dquant)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
692 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
693 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
694 vop_dquant_decoding(v);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
695 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
696
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
697 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
698 if (v->vstransform)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
699 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
700 v->ttmbf = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
701 if (v->ttmbf)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
702 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
703 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
704 }
3506
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
705 } else {
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
706 v->ttmbf = 1;
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
707 v->ttfrm = TT_8X8;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
708 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
709 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
710 case FF_B_TYPE:
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
711 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
712 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
713 else v->tt_index = 2;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
714
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
715 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
716 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
717 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
718
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
719 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
720 if (status < 0) return -1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
721 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
722 "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
723 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
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 Skip 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
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
728 v->s.mv_table_index = get_bits(gb, 2);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
729 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
730
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
731 if (v->dquant)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
732 {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
733 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
734 vop_dquant_decoding(v);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
735 }
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 v->ttfrm = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
738 if (v->vstransform)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
739 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
740 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
741 if (v->ttmbf)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
742 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
743 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
744 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
745 } else {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
746 v->ttmbf = 1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
747 v->ttfrm = TT_8X8;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
748 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
749 break;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
750 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
751
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
752 if(!v->x8_type)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
753 {
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
754 /* AC Syntax */
efc1e9a01671 indention
michael
parents: 5887
diff changeset
755 v->c_ac_table_index = decode012(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
756 if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
757 {
efc1e9a01671 indention
michael
parents: 5887
diff changeset
758 v->y_ac_table_index = decode012(gb);
efc1e9a01671 indention
michael
parents: 5887
diff changeset
759 }
efc1e9a01671 indention
michael
parents: 5887
diff changeset
760 /* DC Syntax */
efc1e9a01671 indention
michael
parents: 5887
diff changeset
761 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
762 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
763
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
764 if(v->s.pict_type == FF_BI_TYPE) {
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
765 v->s.pict_type = FF_B_TYPE;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
766 v->bi_type = 1;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
767 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
768 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
769 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
770
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
771 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
772 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
773 int pqindex, lowquant;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
774 int status;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
775
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
776 v->p_frame_skipped = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
777
4487
0a0a9f0c9c2d Progressive frames disguised as interlaced are supported
kostya
parents: 4486
diff changeset
778 if(v->interlace){
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
779 v->fcm = decode012(gb);
4487
0a0a9f0c9c2d Progressive frames disguised as interlaced are supported
kostya
parents: 4486
diff changeset
780 if(v->fcm) return -1; // interlaced frames/fields are not implemented
0a0a9f0c9c2d Progressive frames disguised as interlaced are supported
kostya
parents: 4486
diff changeset
781 }
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
782 switch(get_unary(gb, 0, 4)) {
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
783 case 0:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
784 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
785 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
786 case 1:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
787 v->s.pict_type = FF_B_TYPE;
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
788 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
789 case 2:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
790 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
791 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
792 case 3:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
793 v->s.pict_type = FF_BI_TYPE;
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
794 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
795 case 4:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
796 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
797 v->p_frame_skipped = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
798 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
799 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
800 if(v->tfcntrflag)
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
801 skip_bits(gb, 8);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
802 if(v->broadcast) {
4485
81a120f5f8d0 Wrong flag tested
kostya
parents: 4474
diff changeset
803 if(!v->interlace || v->psf) {
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
804 v->rptfrm = get_bits(gb, 2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
805 } else {
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
806 v->tff = get_bits1(gb);
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
807 v->rptfrm = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
808 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
809 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
810 if(v->panscanflag) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
811 //...
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
812 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
813 v->rnd = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
814 if(v->interlace)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
815 v->uvsamp = get_bits1(gb);
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
816 if(v->finterpflag) v->interpfrm = get_bits1(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
817 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
818 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
819 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
820 if(v->bfraction == 0) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
821 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
822 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
823 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
824 pqindex = get_bits(gb, 5);
6150
49a4e4d78692 pqindex=0 is forbidden
kostya
parents: 6145
diff changeset
825 if(!pqindex) return -1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
826 v->pqindex = pqindex;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
827 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
828 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
829 else
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
830 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
831
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
832 v->pquantizer = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
833 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
834 v->pquantizer = pqindex < 9;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
835 if (v->quantizer_mode == QUANT_NON_UNIFORM)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
836 v->pquantizer = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
837 v->pqindex = pqindex;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
838 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
839 else v->halfpq = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
840 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
841 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
842 if(v->postprocflag)
8639
29096719e684 VC-1 postproc field is 2 bits wide while decoder read only single bit.
kostya
parents: 8632
diff changeset
843 v->postproc = get_bits(gb, 2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
844
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
845 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
846
9732
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
847 if(v->parse_only)
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
848 return 0;
c25359a56edf set pict_type in VC-1 parser, fix some timestamps problems
bcoudurier
parents: 9645
diff changeset
849
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
850 switch(v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
851 case FF_I_TYPE:
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
852 case FF_BI_TYPE:
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
853 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
854 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
855 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
856 "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
857 v->condover = CONDOVER_NONE;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
858 if(v->overlap && v->pq <= 8) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
859 v->condover = decode012(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
860 if(v->condover == CONDOVER_SELECT) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
861 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
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, "CONDOVER 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 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
866 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
867 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
868 case FF_P_TYPE:
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
869 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
870 else v->mvrange = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
871 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
872 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
873 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
874 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
875
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
876 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
877 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
878 else v->tt_index = 2;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
879
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
880 lowquant = (v->pq > 12) ? 0 : 1;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
881 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
882 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
883 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
884 int scale, shift, i;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
885 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
886 v->lumscale = get_bits(gb, 6);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
887 v->lumshift = get_bits(gb, 6);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
888 /* fill lookup tables for intensity compensation */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
889 if(!v->lumscale) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
890 scale = -64;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
891 shift = (255 - v->lumshift * 2) << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
892 if(v->lumshift > 31)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
893 shift += 128 << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
894 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
895 scale = v->lumscale + 32;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
896 if(v->lumshift > 31)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
897 shift = (v->lumshift - 64) << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
898 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
899 shift = v->lumshift << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
900 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
901 for(i = 0; i < 256; i++) {
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
902 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
903 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
904 }
4518
e3c43b4aa9ac Intensity compensation for B-frames in AP was missing
kostya
parents: 4487
diff changeset
905 v->use_ic = 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
906 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
907 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
908 v->s.quarter_sample = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
909 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
910 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
911 v->s.quarter_sample = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
912 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
913 v->s.quarter_sample = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
914 } else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
915 v->s.quarter_sample = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
916 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
917
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
918 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
919 v->mv_mode2 == MV_PMODE_MIXED_MV)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
920 || v->mv_mode == MV_PMODE_MIXED_MV)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
921 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
922 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
923 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
924 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
925 "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
926 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
927 v->mv_type_is_raw = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
928 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
929 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
930 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
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 Skip 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
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
935 /* Hopefully this is correct for P frames */
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
936 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
937 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
938 if (v->dquant)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
939 {
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, "VOP DQuant info\n");
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
941 vop_dquant_decoding(v);
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
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
944 v->ttfrm = 0; //FIXME Is that so ?
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
945 if (v->vstransform)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
946 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
947 v->ttmbf = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
948 if (v->ttmbf)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
949 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
950 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
951 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
952 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
953 v->ttmbf = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
954 v->ttfrm = TT_8X8;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
955 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
956 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
957 case FF_B_TYPE:
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
958 if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3);
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
959 else v->mvrange = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
960 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
961 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
962 v->range_x = 1 << (v->k_x - 1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
963 v->range_y = 1 << (v->k_y - 1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
964
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
965 if (v->pq < 5) v->tt_index = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
966 else if(v->pq < 13) v->tt_index = 1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
967 else v->tt_index = 2;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
968
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
969 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
970 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
971 v->s.mspel = v->s.quarter_sample;
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 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
974 if (status < 0) return -1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
975 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
976 "Imode: %i, Invert: %i\n", status>>1, status&1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
977 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
978 if (status < 0) return -1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
979 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
980 "Imode: %i, Invert: %i\n", status>>1, status&1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
981
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
982 v->s.mv_table_index = get_bits(gb, 2);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
983 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
984
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
985 if (v->dquant)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
986 {
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
987 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
988 vop_dquant_decoding(v);
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
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
991 v->ttfrm = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
992 if (v->vstransform)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
993 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
994 v->ttmbf = get_bits1(gb);
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
995 if (v->ttmbf)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
996 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
997 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
4238
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 } else {
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1000 v->ttmbf = 1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1001 v->ttfrm = TT_8X8;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1002 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1003 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1004 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1005
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1006 /* AC Syntax */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1007 v->c_ac_table_index = decode012(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1008 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
1009 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1010 v->y_ac_table_index = decode012(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1011 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1012 /* DC Syntax */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1013 v->s.dc_table_index = get_bits1(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1014 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
1015 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
1016 vop_dquant_decoding(v);
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
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1019 v->bi_type = 0;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1020 if(v->s.pict_type == FF_BI_TYPE) {
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1021 v->s.pict_type = FF_B_TYPE;
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1022 v->bi_type = 1;
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1023 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1024 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1025 }