annotate vc1.c @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents e90d0068a03f
children d8e5002210cb
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 /*
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2 * VC-1 and WMV3 decoder
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
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
25 * VC-1 and WMV3 decoder
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"
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
34 #include "vc1acdata.h"
4965
f9bb3aca0888 use header instead of copying table declarations
aurel
parents: 4962
diff changeset
35 #include "msmpeg4data.h"
5605
d92fa6e5fc8c move get_unary() to its own file
aurel
parents: 5519
diff changeset
36 #include "unary.h"
5849
c1d42c875be8 Use simple IDCT for now
kostya
parents: 5848
diff changeset
37 #include "simple_idct.h"
8627
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8624
diff changeset
38 #include "mathops.h"
8631
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
39 #include "vdpau_internal.h"
3359
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 #undef NDEBUG
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
42 #include <assert.h>
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
43
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
44 #define MB_INTRA_VLC_BITS 9
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
45 #define DC_VLC_BITS 9
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
46 #define AC_VLC_BITS 9
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
47 static const uint16_t table_mb_intra[64][2];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
48
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
49
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 * Init VC-1 specific tables and VC1Context members
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
52 * @param v The VC1Context to initialize
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
53 * @return Status
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
54 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
55 static int vc1_init_common(VC1Context *v)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
56 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
57 static int done = 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
58 int i = 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
59
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
60 v->hrd_rate = v->hrd_buffer = NULL;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
61
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
62 /* VLC tables */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
63 if(!done)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
64 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
65 done = 1;
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
66 init_vlc(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
67 ff_vc1_bfraction_bits, 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
68 ff_vc1_bfraction_codes, 1, 1, INIT_VLC_USE_STATIC);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
69 init_vlc(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
70 ff_vc1_norm2_bits, 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
71 ff_vc1_norm2_codes, 1, 1, INIT_VLC_USE_STATIC);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
72 init_vlc(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
73 ff_vc1_norm6_bits, 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
74 ff_vc1_norm6_codes, 2, 2, INIT_VLC_USE_STATIC);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
75 init_vlc(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
76 ff_vc1_imode_bits, 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
77 ff_vc1_imode_codes, 1, 1, INIT_VLC_USE_STATIC);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
78 for (i=0; i<3; i++)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
79 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
80 init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
81 ff_vc1_ttmb_bits[i], 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
82 ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_STATIC);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
83 init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
84 ff_vc1_ttblk_bits[i], 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
85 ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_STATIC);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
86 init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
87 ff_vc1_subblkpat_bits[i], 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
88 ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_STATIC);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
89 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
90 for(i=0; i<4; i++)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
91 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
92 init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
93 ff_vc1_4mv_block_pattern_bits[i], 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
94 ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_STATIC);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
95 init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
96 ff_vc1_cbpcy_p_bits[i], 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
97 ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_STATIC);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
98 init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
99 ff_vc1_mv_diff_bits[i], 1, 1,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
100 ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_STATIC);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
101 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
102 for(i=0; i<8; i++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
103 init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i],
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
104 &vc1_ac_tables[i][0][1], 8, 4,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
105 &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_STATIC);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
106 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
107 &ff_msmp4_mb_i_table[0][1], 4, 2,
9393
25b3650b4db5 Use INIT_VLC_USE_STATIC and not its value "1".
cehoyos
parents: 9355
diff changeset
108 &ff_msmp4_mb_i_table[0][0], 4, 2, INIT_VLC_USE_STATIC);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
109 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
110
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
111 /* Other defaults */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
112 v->pq = -1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
113 v->mvrange = 0; /* 7.1.1.18, p80 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
114
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
115 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
116 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
117
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
118 /***********************************************************************/
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
119 /**
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
120 * @defgroup vc1bitplane VC-1 Bitplane decoding
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
121 * @see 8.7, p56
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
122 * @{
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
123 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
124
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
125 /**
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
126 * Imode types
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
127 * @{
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
128 */
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
129 enum Imode {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
130 IMODE_RAW,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
131 IMODE_NORM2,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
132 IMODE_DIFF2,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
133 IMODE_NORM6,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
134 IMODE_DIFF6,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
135 IMODE_ROWSKIP,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
136 IMODE_COLSKIP
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
137 };
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
138 /** @} */ //imode defines
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
139
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
140 /** 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
141 * @param plane Buffer to store decoded bits
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
142 * @param[in] width Width of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
143 * @param[in] height Height of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
144 * @param[in] stride of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
145 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
146 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
147 int x, y;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
148
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
149 for (y=0; y<height; y++){
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
150 if (!get_bits1(gb)) //rowskip
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
151 memset(plane, 0, width);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
152 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
153 for (x=0; x<width; x++)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
154 plane[x] = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
155 plane += stride;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
156 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
157 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
158
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
159 /** 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
160 * @param plane Buffer to store decoded bits
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
161 * @param[in] width Width of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
162 * @param[in] height Height of this buffer
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
163 * @param[in] stride of this buffer
5299
4623928e3b9e Replace non-existing @fixme doxygen tags with @todo.
diego
parents: 5228
diff changeset
164 * @todo FIXME: Optimize
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
165 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
166 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
167 int x, y;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
168
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
169 for (x=0; x<width; x++){
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
170 if (!get_bits1(gb)) //colskip
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
171 for (y=0; y<height; y++)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
172 plane[y*stride] = 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
173 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
174 for (y=0; y<height; y++)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
175 plane[y*stride] = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
176 plane ++;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
177 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
178 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
179
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
180 /** Decode a bitplane's bits
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
181 * @param data bitplane where to store the decode bits
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
182 * @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
183 * @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
184 * @return Status
5299
4623928e3b9e Replace non-existing @fixme doxygen tags with @todo.
diego
parents: 5228
diff changeset
185 * @todo FIXME: Optimize
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
186 */
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
187 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
188 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
189 GetBitContext *gb = &v->s.gb;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
190
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
191 int imode, x, y, code, offset;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
192 uint8_t invert, *planep = data;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
193 int width, height, stride;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
194
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
195 width = v->s.mb_width;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
196 height = v->s.mb_height;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
197 stride = v->s.mb_stride;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
198 invert = get_bits1(gb);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
199 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
200
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
201 *raw_flag = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
202 switch (imode)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
203 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
204 case IMODE_RAW:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
205 //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
206 *raw_flag = 1; //invert ignored
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
207 return invert;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
208 case IMODE_DIFF2:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
209 case IMODE_NORM2:
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
210 if ((height * width) & 1)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
211 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
212 *planep++ = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
213 offset = 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
214 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
215 else offset = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
216 // decode bitplane as one long line
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
217 for (y = offset; y < height * width; y += 2) {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
218 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
219 *planep++ = code & 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
220 offset++;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
221 if(offset == width) {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
222 offset = 0;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
223 planep += stride - width;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
224 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
225 *planep++ = code >> 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
226 offset++;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
227 if(offset == width) {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
228 offset = 0;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
229 planep += stride - width;
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 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
232 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
233 case IMODE_DIFF6:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
234 case IMODE_NORM6:
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
235 if(!(height % 3) && (width % 3)) { // use 2x3 decoding
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
236 for(y = 0; y < height; y+= 3) {
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
237 for(x = width & 1; x < width; x += 2) {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
238 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
239 if(code < 0){
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
240 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
241 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
242 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
243 planep[x + 0] = (code >> 0) & 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
244 planep[x + 1] = (code >> 1) & 1;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
245 planep[x + 0 + stride] = (code >> 2) & 1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
246 planep[x + 1 + stride] = (code >> 3) & 1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
247 planep[x + 0 + stride * 2] = (code >> 4) & 1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
248 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
249 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
250 planep += stride * 3;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
251 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
252 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
253 } else { // 3x2
3405
58c4fd135462 Correctly choose global transform mode, MV mode and fix bitplane decoding
kostya
parents: 3404
diff changeset
254 planep += (height & 1) * stride;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
255 for(y = height & 1; y < height; y += 2) {
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
256 for(x = width % 3; x < width; x += 3) {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
257 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
258 if(code < 0){
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
259 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
260 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
261 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
262 planep[x + 0] = (code >> 0) & 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
263 planep[x + 1] = (code >> 1) & 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
264 planep[x + 2] = (code >> 2) & 1;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
265 planep[x + 0 + stride] = (code >> 3) & 1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
266 planep[x + 1 + stride] = (code >> 4) & 1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
267 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
268 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
269 planep += stride * 2;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
270 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
271 x = width % 3;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
272 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
273 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
274 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
275 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
276 case IMODE_ROWSKIP:
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
277 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
278 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
279 case IMODE_COLSKIP:
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
280 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
281 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
282 default: break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
283 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
284
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
285 /* Applying diff operator */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
286 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
287 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
288 planep = data;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
289 planep[0] ^= invert;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
290 for (x=1; x<width; x++)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
291 planep[x] ^= planep[x-1];
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
292 for (y=1; y<height; y++)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
293 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
294 planep += stride;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
295 planep[0] ^= planep[-stride];
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
296 for (x=1; x<width; x++)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
297 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
298 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
299 else planep[x] ^= planep[x-1];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
300 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
301 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
302 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
303 else if (invert)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
304 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
305 planep = data;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
306 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
307 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
308 return (imode<<1) + invert;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
309 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
310
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
311 /** @} */ //Bitplane group
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
312
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
313 static void vc1_loop_filter_iblk(MpegEncContext *s, int pq)
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
314 {
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
315 int i, j;
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
316 if(!s->first_slice_line)
9443
3970fe47fea3 Split VC1 loop filter into separate functions for h/v and size
conrad
parents: 9442
diff changeset
317 s->dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
3970fe47fea3 Split VC1 loop filter into separate functions for h/v and size
conrad
parents: 9442
diff changeset
318 s->dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
319 for(i = !s->mb_x*8; i < 16; i += 8)
9443
3970fe47fea3 Split VC1 loop filter into separate functions for h/v and size
conrad
parents: 9442
diff changeset
320 s->dsp.vc1_h_loop_filter16(s->dest[0] + i, s->linesize, pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
321 for(j = 0; j < 2; j++){
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
322 if(!s->first_slice_line)
9443
3970fe47fea3 Split VC1 loop filter into separate functions for h/v and size
conrad
parents: 9442
diff changeset
323 s->dsp.vc1_v_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
324 if(s->mb_x)
9443
3970fe47fea3 Split VC1 loop filter into separate functions for h/v and size
conrad
parents: 9442
diff changeset
325 s->dsp.vc1_h_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
326 }
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
327 }
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
328
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
329 /***********************************************************************/
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
330 /** VOP Dquant decoding
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
331 * @param v VC-1 Context
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
332 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
333 static int vop_dquant_decoding(VC1Context *v)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
334 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
335 GetBitContext *gb = &v->s.gb;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
336 int pqdiff;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
337
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
338 //variable size
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
339 if (v->dquant == 2)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
340 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
341 pqdiff = get_bits(gb, 3);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
342 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
343 else v->altpq = v->pq + pqdiff + 1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
344 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
345 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
346 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
347 v->dquantfrm = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
348 if ( v->dquantfrm )
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
349 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
350 v->dqprofile = get_bits(gb, 2);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
351 switch (v->dqprofile)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
352 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
353 case DQPROFILE_SINGLE_EDGE:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
354 case DQPROFILE_DOUBLE_EDGES:
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
355 v->dqsbedge = get_bits(gb, 2);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
356 break;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
357 case DQPROFILE_ALL_MBS:
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
358 v->dqbilevel = get_bits1(gb);
5682
8bf94c994691 In case when any quantizer may occur, HALFPQ should be zero
kostya
parents: 5605
diff changeset
359 if(!v->dqbilevel)
8bf94c994691 In case when any quantizer may occur, HALFPQ should be zero
kostya
parents: 5605
diff changeset
360 v->halfpq = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
361 default: break; //Forbidden ?
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
362 }
3451
45724ba8d666 Fix mquant selection for ALL_MBS mode
kostya
parents: 3450
diff changeset
363 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
364 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
365 pqdiff = get_bits(gb, 3);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
366 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
367 else v->altpq = v->pq + pqdiff + 1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
368 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
369 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
370 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
371 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
372 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
373
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
374 /** Put block onto picture
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 static void vc1_put_block(VC1Context *v, DCTELEM block[6][64])
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
377 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
378 uint8_t *Y;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
379 int ys, us, vs;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
380 DSPContext *dsp = &v->s.dsp;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
381
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
382 if(v->rangeredfrm) {
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
383 int i, j, k;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
384 for(k = 0; k < 6; k++)
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
385 for(j = 0; j < 8; j++)
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
386 for(i = 0; i < 8; i++)
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
387 block[k][i + j*8] = ((block[k][i + j*8] - 128) << 1) + 128;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
388
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
389 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
390 ys = v->s.current_picture.linesize[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
391 us = v->s.current_picture.linesize[1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
392 vs = v->s.current_picture.linesize[2];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
393 Y = v->s.dest[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
394
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
395 dsp->put_pixels_clamped(block[0], Y, ys);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
396 dsp->put_pixels_clamped(block[1], Y + 8, ys);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
397 Y += ys * 8;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
398 dsp->put_pixels_clamped(block[2], Y, ys);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
399 dsp->put_pixels_clamped(block[3], Y + 8, ys);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
400
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
401 if(!(v->s.flags & CODEC_FLAG_GRAY)) {
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
402 dsp->put_pixels_clamped(block[4], v->s.dest[1], us);
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
403 dsp->put_pixels_clamped(block[5], v->s.dest[2], vs);
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
404 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
405 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
406
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
407 /** Do motion compensation over 1 macroblock
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
408 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
409 */
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
410 static void vc1_mc_1mv(VC1Context *v, int dir)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
411 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
412 MpegEncContext *s = &v->s;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
413 DSPContext *dsp = &v->s.dsp;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
414 uint8_t *srcY, *srcU, *srcV;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
415 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
416
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
417 if(!v->s.last_picture.data[0])return;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
418
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
419 mx = s->mv[dir][0][0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
420 my = s->mv[dir][0][1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
421
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
422 // store motion vectors for further use in B frames
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
423 if(s->pict_type == FF_P_TYPE) {
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
424 s->current_picture.motion_val[1][s->block_index[0]][0] = mx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
425 s->current_picture.motion_val[1][s->block_index[0]][1] = my;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
426 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
427 uvmx = (mx + ((mx & 3) == 3)) >> 1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
428 uvmy = (my + ((my & 3) == 3)) >> 1;
4258
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
429 if(v->fastuvmc) {
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
430 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
431 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
432 }
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
433 if(!dir) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
434 srcY = s->last_picture.data[0];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
435 srcU = s->last_picture.data[1];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
436 srcV = s->last_picture.data[2];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
437 } else {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
438 srcY = s->next_picture.data[0];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
439 srcU = s->next_picture.data[1];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
440 srcV = s->next_picture.data[2];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
441 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
442
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
443 src_x = s->mb_x * 16 + (mx >> 2);
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
444 src_y = s->mb_y * 16 + (my >> 2);
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
445 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
446 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
447
4681
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
448 if(v->profile != PROFILE_ADVANCED){
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
449 src_x = av_clip( src_x, -16, s->mb_width * 16);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
450 src_y = av_clip( src_y, -16, s->mb_height * 16);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
451 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
452 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
453 }else{
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
454 src_x = av_clip( src_x, -17, s->avctx->coded_width);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
455 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
456 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
457 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
458 }
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
459
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
460 srcY += src_y * s->linesize + src_x;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
461 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
462 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
463
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
464 /* for grayscale we should not try to read from unknown area */
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
465 if(s->flags & CODEC_FLAG_GRAY) {
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
466 srcU = s->edge_emu_buffer + 18 * s->linesize;
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
467 srcV = s->edge_emu_buffer + 18 * s->linesize;
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
468 }
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
469
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
470 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
471 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
472 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
473 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
474
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
475 srcY -= s->mspel * (1 + s->linesize);
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
476 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
477 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
478 srcY = s->edge_emu_buffer;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
479 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
480 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
481 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
482 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
483 srcU = uvbuf;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
484 srcV = uvbuf + 16;
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
485 /* if we deal with range reduction we need to scale source blocks */
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
486 if(v->rangeredfrm) {
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
487 int i, j;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
488 uint8_t *src, *src2;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
489
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
490 src = srcY;
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
491 for(j = 0; j < 17 + s->mspel*2; j++) {
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
492 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
493 src += s->linesize;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
494 }
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
495 src = srcU; src2 = srcV;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
496 for(j = 0; j < 9; j++) {
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
497 for(i = 0; i < 9; i++) {
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
498 src[i] = ((src[i] - 128) >> 1) + 128;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
499 src2[i] = ((src2[i] - 128) >> 1) + 128;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
500 }
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
501 src += s->uvlinesize;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
502 src2 += s->uvlinesize;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
503 }
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
504 }
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
505 /* if we deal with intensity compensation we need to scale source blocks */
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
506 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
507 int i, j;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
508 uint8_t *src, *src2;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
509
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
510 src = srcY;
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
511 for(j = 0; j < 17 + s->mspel*2; j++) {
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
512 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]];
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
513 src += s->linesize;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
514 }
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
515 src = srcU; src2 = srcV;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
516 for(j = 0; j < 9; j++) {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
517 for(i = 0; i < 9; i++) {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
518 src[i] = v->lutuv[src[i]];
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
519 src2[i] = v->lutuv[src2[i]];
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
520 }
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
521 src += s->uvlinesize;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
522 src2 += s->uvlinesize;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
523 }
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
524 }
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
525 srcY += s->mspel * (1 + s->linesize);
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
526 }
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
527
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
528 if(s->mspel) {
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
529 dxy = ((my & 3) << 2) | (mx & 3);
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
530 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
531 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
532 srcY += s->linesize * 8;
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
533 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
534 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
3654
565d9ddd8eb3 Motion compensation for luma always use halfpel precision.
kostya
parents: 3573
diff changeset
535 } else { // hpel mc - always used for luma
565d9ddd8eb3 Motion compensation for luma always use halfpel precision.
kostya
parents: 3573
diff changeset
536 dxy = (my & 2) | ((mx & 2) >> 1);
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
537
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
538 if(!v->rnd)
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
539 dsp->put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
540 else
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
541 dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
542 }
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
543
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
544 if(s->flags & CODEC_FLAG_GRAY) return;
3655
8dbf728f3967 Spelling
kostya
parents: 3654
diff changeset
545 /* Chroma MC always uses qpel bilinear */
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
546 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
3664
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
547 uvmx = (uvmx&3)<<1;
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
548 uvmy = (uvmy&3)<<1;
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
549 if(!v->rnd){
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
550 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
551 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
552 }else{
9439
ef3a7b711cc0 Rename put_no_rnd_h264_chroma* to reflect its usage in VC1 only
conrad
parents: 9437
diff changeset
553 dsp->put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
ef3a7b711cc0 Rename put_no_rnd_h264_chroma* to reflect its usage in VC1 only
conrad
parents: 9437
diff changeset
554 dsp->put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
3664
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
555 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
556 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
557
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
558 /** Do motion compensation for 4-MV macroblock - luminance block
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
559 */
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
560 static void vc1_mc_4mv_luma(VC1Context *v, int n)
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
561 {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
562 MpegEncContext *s = &v->s;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
563 DSPContext *dsp = &v->s.dsp;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
564 uint8_t *srcY;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
565 int dxy, mx, my, src_x, src_y;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
566 int off;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
567
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
568 if(!v->s.last_picture.data[0])return;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
569 mx = s->mv[0][n][0];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
570 my = s->mv[0][n][1];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
571 srcY = s->last_picture.data[0];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
572
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
573 off = s->linesize * 4 * (n&2) + (n&1) * 8;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
574
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
575 src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
576 src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
577
4681
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
578 if(v->profile != PROFILE_ADVANCED){
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
579 src_x = av_clip( src_x, -16, s->mb_width * 16);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
580 src_y = av_clip( src_y, -16, s->mb_height * 16);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
581 }else{
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
582 src_x = av_clip( src_x, -17, s->avctx->coded_width);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
583 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
584 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
585
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
586 srcY += src_y * s->linesize + src_x;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
587
3548
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
588 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
3552
4a0f82c8dc43 Bicubic interpolation requires two additional pixels for block
kostya
parents: 3548
diff changeset
589 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2
4a0f82c8dc43 Bicubic interpolation requires two additional pixels for block
kostya
parents: 3548
diff changeset
590 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel*2){
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
591 srcY -= s->mspel * (1 + s->linesize);
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
592 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2,
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
593 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
594 srcY = s->edge_emu_buffer;
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
595 /* if we deal with range reduction we need to scale source blocks */
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
596 if(v->rangeredfrm) {
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
597 int i, j;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
598 uint8_t *src;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
599
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
600 src = srcY;
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
601 for(j = 0; j < 9 + s->mspel*2; j++) {
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
602 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
603 src += s->linesize;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
604 }
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
605 }
3548
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
606 /* if we deal with intensity compensation we need to scale source blocks */
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
607 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
608 int i, j;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
609 uint8_t *src;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
610
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
611 src = srcY;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
612 for(j = 0; j < 9 + s->mspel*2; j++) {
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
613 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = v->luty[src[i]];
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
614 src += s->linesize;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
615 }
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
616 }
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
617 srcY += s->mspel * (1 + s->linesize);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
618 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
619
3528
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
620 if(s->mspel) {
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
621 dxy = ((my & 3) << 2) | (mx & 3);
79ad5cd43686 Use bicubic MC (should also remove those ringing artifacts) when needed
kostya
parents: 3527
diff changeset
622 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd);
3654
565d9ddd8eb3 Motion compensation for luma always use halfpel precision.
kostya
parents: 3573
diff changeset
623 } else { // hpel mc - always used for luma
565d9ddd8eb3 Motion compensation for luma always use halfpel precision.
kostya
parents: 3573
diff changeset
624 dxy = (my & 2) | ((mx & 2) >> 1);
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
625 if(!v->rnd)
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
626 dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
627 else
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
628 dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
629 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
630 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
631
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
632 static inline int median4(int a, int b, int c, int d)
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
633 {
3404
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
634 if(a < b) {
3430
d0e85690841d Improve chroma MC: correct case for FASTUVMC=1, use slower but correct /2, and always use halfpel MC.
kostya
parents: 3429
diff changeset
635 if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
d0e85690841d Improve chroma MC: correct case for FASTUVMC=1, use slower but correct /2, and always use halfpel MC.
kostya
parents: 3429
diff changeset
636 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
3404
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
637 } else {
3430
d0e85690841d Improve chroma MC: correct case for FASTUVMC=1, use slower but correct /2, and always use halfpel MC.
kostya
parents: 3429
diff changeset
638 if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
d0e85690841d Improve chroma MC: correct case for FASTUVMC=1, use slower but correct /2, and always use halfpel MC.
kostya
parents: 3429
diff changeset
639 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
3404
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
640 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
641 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
642
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
643
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
644 /** Do motion compensation for 4-MV macroblock - both chroma blocks
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
645 */
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
646 static void vc1_mc_4mv_chroma(VC1Context *v)
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
647 {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
648 MpegEncContext *s = &v->s;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
649 DSPContext *dsp = &v->s.dsp;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
650 uint8_t *srcU, *srcV;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
651 int uvdxy, uvmx, uvmy, uvsrc_x, uvsrc_y;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
652 int i, idx, tx = 0, ty = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
653 int mvx[4], mvy[4], intra[4];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
654 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
655
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
656 if(!v->s.last_picture.data[0])return;
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
657 if(s->flags & CODEC_FLAG_GRAY) return;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
658
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
659 for(i = 0; i < 4; i++) {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
660 mvx[i] = s->mv[0][i][0];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
661 mvy[i] = s->mv[0][i][1];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
662 intra[i] = v->mb_type[0][s->block_index[i]];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
663 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
664
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
665 /* calculate chroma MV vector from four luma MVs */
3419
b4363f96013d Fix one case of choosing MV for chroma
kostya
parents: 3406
diff changeset
666 idx = (intra[3] << 3) | (intra[2] << 2) | (intra[1] << 1) | intra[0];
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
667 if(!idx) { // all blocks are inter
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
668 tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
669 ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
670 } else if(count[idx] == 1) { // 3 inter blocks
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
671 switch(idx) {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
672 case 0x1:
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
673 tx = mid_pred(mvx[1], mvx[2], mvx[3]);
3419
b4363f96013d Fix one case of choosing MV for chroma
kostya
parents: 3406
diff changeset
674 ty = mid_pred(mvy[1], mvy[2], mvy[3]);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
675 break;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
676 case 0x2:
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
677 tx = mid_pred(mvx[0], mvx[2], mvx[3]);
3419
b4363f96013d Fix one case of choosing MV for chroma
kostya
parents: 3406
diff changeset
678 ty = mid_pred(mvy[0], mvy[2], mvy[3]);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
679 break;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
680 case 0x4:
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
681 tx = mid_pred(mvx[0], mvx[1], mvx[3]);
3419
b4363f96013d Fix one case of choosing MV for chroma
kostya
parents: 3406
diff changeset
682 ty = mid_pred(mvy[0], mvy[1], mvy[3]);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
683 break;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
684 case 0x8:
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
685 tx = mid_pred(mvx[0], mvx[1], mvx[2]);
3419
b4363f96013d Fix one case of choosing MV for chroma
kostya
parents: 3406
diff changeset
686 ty = mid_pred(mvy[0], mvy[1], mvy[2]);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
687 break;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
688 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
689 } else if(count[idx] == 2) {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
690 int t1 = 0, t2 = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
691 for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;}
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
692 for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;}
3430
d0e85690841d Improve chroma MC: correct case for FASTUVMC=1, use slower but correct /2, and always use halfpel MC.
kostya
parents: 3429
diff changeset
693 tx = (mvx[t1] + mvx[t2]) / 2;
d0e85690841d Improve chroma MC: correct case for FASTUVMC=1, use slower but correct /2, and always use halfpel MC.
kostya
parents: 3429
diff changeset
694 ty = (mvy[t1] + mvy[t2]) / 2;
4683
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
695 } else {
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
696 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
697 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
698 return; //no need to do MC for inter blocks
4683
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
699 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
700
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
701 s->current_picture.motion_val[1][s->block_index[0]][0] = tx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
702 s->current_picture.motion_val[1][s->block_index[0]][1] = ty;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
703 uvmx = (tx + ((tx&3) == 3)) >> 1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
704 uvmy = (ty + ((ty&3) == 3)) >> 1;
4258
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
705 if(v->fastuvmc) {
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
706 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
707 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
708 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
709
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
710 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
711 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
712
4681
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
713 if(v->profile != PROFILE_ADVANCED){
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
714 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
715 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
716 }else{
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
717 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
718 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
719 }
4680
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
720
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
721 srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
722 srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
3548
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
723 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
724 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
3511
f88787aeed6b Correct edge MC for chroma
kostya
parents: 3510
diff changeset
725 || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
726 ff_emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, 8+1, 8+1,
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
727 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
728 ff_emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1,
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
729 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
730 srcU = s->edge_emu_buffer;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
731 srcV = s->edge_emu_buffer + 16;
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
732
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
733 /* if we deal with range reduction we need to scale source blocks */
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
734 if(v->rangeredfrm) {
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
735 int i, j;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
736 uint8_t *src, *src2;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
737
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
738 src = srcU; src2 = srcV;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
739 for(j = 0; j < 9; j++) {
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
740 for(i = 0; i < 9; i++) {
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
741 src[i] = ((src[i] - 128) >> 1) + 128;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
742 src2[i] = ((src2[i] - 128) >> 1) + 128;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
743 }
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
744 src += s->uvlinesize;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
745 src2 += s->uvlinesize;
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
746 }
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
747 }
3548
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
748 /* if we deal with intensity compensation we need to scale source blocks */
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
749 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
750 int i, j;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
751 uint8_t *src, *src2;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
752
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
753 src = srcU; src2 = srcV;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
754 for(j = 0; j < 9; j++) {
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
755 for(i = 0; i < 9; i++) {
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
756 src[i] = v->lutuv[src[i]];
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
757 src2[i] = v->lutuv[src2[i]];
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
758 }
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
759 src += s->uvlinesize;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
760 src2 += s->uvlinesize;
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
761 }
f7b09917c680 100l: intensity compensation must be also done in 4-MV mode
kostya
parents: 3538
diff changeset
762 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
763 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
764
3655
8dbf728f3967 Spelling
kostya
parents: 3654
diff changeset
765 /* Chroma MC always uses qpel bilinear */
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
766 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
3664
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
767 uvmx = (uvmx&3)<<1;
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
768 uvmy = (uvmy&3)<<1;
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
769 if(!v->rnd){
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
770 dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
771 dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
772 }else{
9439
ef3a7b711cc0 Rename put_no_rnd_h264_chroma* to reflect its usage in VC1 only
conrad
parents: 9437
diff changeset
773 dsp->put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
ef3a7b711cc0 Rename put_no_rnd_h264_chroma* to reflect its usage in VC1 only
conrad
parents: 9437
diff changeset
774 dsp->put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
3664
de842f000384 Replace usage of put_*_vc1_qpel_pixels_tab with put_*_h264_chroma_pixels_tab
kostya
parents: 3656
diff changeset
775 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
776 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
777
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
778 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
779
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
780 /**
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
781 * Decode Simple/Main Profiles sequence header
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
782 * @see Figure 7-8, p16-17
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
783 * @param avctx Codec context
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
784 * @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
785 * @return Status
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
786 */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
787 static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
788 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
789 VC1Context *v = avctx->priv_data;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
790
3692
7857ae840b0b Don't print header bits by default
kostya
parents: 3691
diff changeset
791 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
792 v->profile = get_bits(gb, 2);
4604
40cd5f7f34e7 WMV3 Complex Profile initial support
kostya
parents: 4594
diff changeset
793 if (v->profile == PROFILE_COMPLEX)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
794 {
4604
40cd5f7f34e7 WMV3 Complex Profile initial support
kostya
parents: 4594
diff changeset
795 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
796 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
797
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
798 if (v->profile == PROFILE_ADVANCED)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
799 {
6145
ddf5d7fae101 Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents: 6099
diff changeset
800 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
801 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
802 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
803 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
804 else
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
805 {
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
806 v->zz_8x4 = wmv2_scantableA;
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
807 v->zz_4x8 = wmv2_scantableB;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
808 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
809 if (v->res_sm)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
810 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
811 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
812 "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
813 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
814 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
815 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
816
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
817 // (fps-2)/4 (->30)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
818 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
819 // (bitrate-32kbps)/64kbps
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
820 v->bitrtq_postproc = get_bits(gb, 5); //common
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
821 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
822 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
823 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
824 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
825 "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
826 }
7846
a7162bb60138 Make it possible to disable loop filter in VC-1.
kostya
parents: 7429
diff changeset
827 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
828 v->s.loop_filter = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
829
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
830 v->res_x8 = get_bits1(gb); //reserved
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
831 v->multires = get_bits1(gb);
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
832 v->res_fasttx = get_bits1(gb);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
833 if (!v->res_fasttx)
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
834 {
6001
f4859c13426b add ff_ prefix to all simple_idct symbols
aurel
parents: 5998
diff changeset
835 v->s.dsp.vc1_inv_trans_8x8 = ff_simple_idct;
f4859c13426b add ff_ prefix to all simple_idct symbols
aurel
parents: 5998
diff changeset
836 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
837 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
838 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
839 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
840
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
841 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
842 if (!v->profile && !v->fastuvmc)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
843 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
844 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
845 "FASTUVMC unavailable in Simple Profile\n");
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
846 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
847 }
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
848 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
849 if (!v->profile && v->extended_mv)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
850 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
851 av_log(avctx, AV_LOG_ERROR,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
852 "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
853 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
854 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
855 v->dquant = get_bits(gb, 2); //common
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
856 v->vstransform = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
857
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
858 v->res_transtab = get_bits1(gb);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
859 if (v->res_transtab)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
860 {
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
861 av_log(avctx, AV_LOG_ERROR,
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
862 "1 for reserved RES_TRANSTAB is forbidden\n");
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
863 return -1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
864 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
865
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
866 v->overlap = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
867
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
868 v->s.resync_marker = get_bits1(gb);
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
869 v->rangered = get_bits1(gb);
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
870 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
871 {
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
872 av_log(avctx, AV_LOG_INFO,
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
873 "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
874 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
875
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
876 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
877 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
878
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
879 v->finterpflag = get_bits1(gb); //common
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
880 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
881 if (!v->res_rtm_flag)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
882 {
3538
f26bf13bbb69 Don't try to decode P-frames from old WMV3 variant until their format is figured
kostya
parents: 3528
diff changeset
883 // 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
884 // "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
885 av_log(avctx, AV_LOG_ERROR,
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
886 "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
887 //return -1;
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
888 }
4742
184d33cce3b6 FASTTX==0 means additional 16 bits in extradata
kostya
parents: 4741
diff changeset
889 //TODO: figure out what they mean (always 0x402F)
184d33cce3b6 FASTTX==0 means additional 16 bits in extradata
kostya
parents: 4741
diff changeset
890 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
891 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
892 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
3457
ad66c11aeab4 FastUVMV vs FastUVMC typo, noticed by bond
diego
parents: 3453
diff changeset
893 "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
894 "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
895 "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
896 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
897 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
898 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
899 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
900 );
3691
ff18ceefe3d8 [Cosmetics] Remove if(profile < PROFILE_ADVANCED) from decode_sequence_header()
kostya
parents: 3690
diff changeset
901 return 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
902 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
903
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
904 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
905 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
906 v->res_rtm_flag = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
907 v->level = get_bits(gb, 3);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
908 if(v->level >= 5)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
909 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
910 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
911 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
912 v->chromaformat = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
913 if (v->chromaformat != 1)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
914 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
915 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
916 "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
917 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
918 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
919
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
920 // (fps-2)/4 (->30)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
921 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
922 // (bitrate-32kbps)/64kbps
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
923 v->bitrtq_postproc = get_bits(gb, 5); //common
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
924 v->postprocflag = get_bits1(gb); //common
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
925
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
926 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
927 v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
4474
82277cf5f051 Set codec dimensions in extradata parsing
kostya
parents: 4471
diff changeset
928 v->s.avctx->width = v->s.avctx->coded_width;
82277cf5f051 Set codec dimensions in extradata parsing
kostya
parents: 4471
diff changeset
929 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
930 v->broadcast = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
931 v->interlace = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
932 v->tfcntrflag = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
933 v->finterpflag = get_bits1(gb);
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
934 skip_bits1(gb); // reserved
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
935
4680
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
936 v->s.h_edge_pos = v->s.avctx->coded_width;
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
937 v->s.v_edge_pos = v->s.avctx->coded_height;
71c1e1171e83 Proper handling of motion vectors for adv. profile
kostya
parents: 4605
diff changeset
938
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
939 av_log(v->s.avctx, AV_LOG_DEBUG,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
940 "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
941 "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
942 "TFCTRflag=%i, FINTERPflag=%i\n",
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
943 v->level, v->frmrtq_postproc, v->bitrtq_postproc,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
944 v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
945 v->tfcntrflag, v->finterpflag
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
946 );
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
947
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
948 v->psf = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
949 if(v->psf) { //PsF, 6.1.13
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
950 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
951 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
952 }
4486
1d2320afa864 B-frames could not be determined from broken_link/closed_entry, use fixed value
kostya
parents: 4485
diff changeset
953 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
954 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
955 int w, h, ar = 0;
4467
a9f64d2a2e69 These messages are just for debug purposes
kostya
parents: 4466
diff changeset
956 av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n");
8584
8a47574d9fbc VC-1 display dimensions should affect coded dimensions only (I think)
kostya
parents: 8583
diff changeset
957 v->s.avctx->coded_width = w = get_bits(gb, 14) + 1;
8a47574d9fbc VC-1 display dimensions should affect coded dimensions only (I think)
kostya
parents: 8583
diff changeset
958 v->s.avctx->coded_height = h = get_bits(gb, 14) + 1;
4467
a9f64d2a2e69 These messages are just for debug purposes
kostya
parents: 4466
diff changeset
959 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
960 if(get_bits1(gb))
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
961 ar = get_bits(gb, 4);
4414
7c42c51b1130 Set aspect ratio if present (for AP only)
kostya
parents: 4402
diff changeset
962 if(ar && ar < 14){
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
963 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
964 }else if(ar == 15){
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
965 w = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
966 h = get_bits(gb, 8);
4414
7c42c51b1130 Set aspect ratio if present (for AP only)
kostya
parents: 4402
diff changeset
967 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
968 }
8583
d94775e24b0e Print VC-1 aspect ratio in debug
kostya
parents: 8582
diff changeset
969 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
970
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
971 if(get_bits1(gb)){ //framerate stuff
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
972 if(get_bits1(gb)) {
4470
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
973 v->s.avctx->time_base.num = 32;
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
974 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
975 } else {
4470
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
976 int nr, dr;
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
977 nr = get_bits(gb, 8);
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
978 dr = get_bits(gb, 4);
2c9a66c5223a Set frame rate from extradata
kostya
parents: 4467
diff changeset
979 if(nr && nr < 8 && dr && dr < 3){
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
980 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
981 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
982 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
983 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
984 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
985
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
986 if(get_bits1(gb)){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
987 v->color_prim = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
988 v->transfer_char = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
989 v->matrix_coef = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
990 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
991 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
992
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
993 v->hrd_param_flag = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
994 if(v->hrd_param_flag) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
995 int i;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
996 v->hrd_num_leaky_buckets = get_bits(gb, 5);
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
997 skip_bits(gb, 4); //bitrate exponent
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
998 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
999 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
1000 skip_bits(gb, 16); //hrd_rate[n]
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
1001 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
1002 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1003 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1004 return 0;
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
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1007 static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1008 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1009 VC1Context *v = avctx->priv_data;
8692
48442253aac2 Record B-fraction index from frame header and two fields from entry point structure
kostya
parents: 8685
diff changeset
1010 int i;
3672
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 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
1013 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
1014 v->closed_entry = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1015 v->panscanflag = get_bits1(gb);
8556
ce9d640decd1 Add refdist_flag to VC1Context.
cehoyos
parents: 8152
diff changeset
1016 v->refdist_flag = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1017 v->s.loop_filter = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1018 v->fastuvmc = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1019 v->extended_mv = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1020 v->dquant = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1021 v->vstransform = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1022 v->overlap = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1023 v->quantizer_mode = get_bits(gb, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1024
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1025 if(v->hrd_param_flag){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1026 for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
1027 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
1028 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1029 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1030
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1031 if(get_bits1(gb)){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1032 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
1033 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
1034 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1035 if(v->extended_mv)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1036 v->extended_dmv = get_bits1(gb);
8560
a683a89503eb Fill range_map* in VC1Context.
cehoyos
parents: 8556
diff changeset
1037 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
1038 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
1039 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
1040 }
8560
a683a89503eb Fill range_map* in VC1Context.
cehoyos
parents: 8556
diff changeset
1041 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
1042 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
1043 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
1044 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1045
4402
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
1046 av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
1047 "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
1048 "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
43f4d0d7672c Add debug messages for AP headers
kostya
parents: 4401
diff changeset
1049 "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
1050 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
1051 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
1052
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1053 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1054 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1055
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1056 static 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
1057 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1058 int pqindex, lowquant, status;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1059
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1060 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
1061 skip_bits(gb, 2); //framecnt unused
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1062 v->rangeredfrm = 0;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1063 if (v->rangered) v->rangeredfrm = get_bits1(gb);
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1064 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
1065 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
1066 if (!v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1067 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
1068 else v->s.pict_type = FF_B_TYPE;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1069 } else v->s.pict_type = FF_P_TYPE;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1070 } 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
1071
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1072 v->bi_type = 0;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1073 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
1074 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
1075 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1076 if(v->bfraction == 0) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1077 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
1078 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1079 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1080 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
1081 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
1082
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
1083 /* calculate RND */
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1084 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
1085 v->rnd = 1;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1086 if(v->s.pict_type == FF_P_TYPE)
3474
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
1087 v->rnd ^= 1;
24f293c3f3ef Rounding control for motion compensation.
kostya
parents: 3457
diff changeset
1088
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1089 /* Quantizer stuff */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1090 pqindex = get_bits(gb, 5);
6150
49a4e4d78692 pqindex=0 is forbidden
kostya
parents: 6145
diff changeset
1091 if(!pqindex) return -1;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1092 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1093 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
1094 else
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1095 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
1096
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
1097 v->pquantizer = 1;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1098 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
1099 v->pquantizer = pqindex < 9;
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
1100 if (v->quantizer_mode == QUANT_NON_UNIFORM)
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
1101 v->pquantizer = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1102 v->pqindex = pqindex;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1103 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
1104 else v->halfpq = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1105 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1106 v->pquantizer = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1107 v->dquantfrm = 0;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
1108 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
1109 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
1110 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
1111 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
1112 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
1113 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
1114
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1115 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
1116 v->x8_type = get_bits1(gb);
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
1117 }else v->x8_type = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1118 //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
1119 // (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
1120
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1121 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
1122
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1123 switch(v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1124 case FF_P_TYPE:
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1125 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
1126 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
1127 else v->tt_index = 2;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1128
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1129 lowquant = (v->pq > 12) ? 0 : 1;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
1130 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
1131 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
1132 {
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1133 int scale, shift, i;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
1134 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
1135 v->lumscale = get_bits(gb, 6);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1136 v->lumshift = get_bits(gb, 6);
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1137 v->use_ic = 1;
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1138 /* fill lookup tables for intensity compensation */
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1139 if(!v->lumscale) {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1140 scale = -64;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1141 shift = (255 - v->lumshift * 2) << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1142 if(v->lumshift > 31)
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1143 shift += 128 << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1144 } else {
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1145 scale = v->lumscale + 32;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1146 if(v->lumshift > 31)
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1147 shift = (v->lumshift - 64) << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1148 else
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1149 shift = v->lumshift << 6;
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1150 }
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1151 for(i = 0; i < 256; i++) {
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
1152 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
1153 v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
3406
75ab0c53742a Implement intensity compensation
kostya
parents: 3405
diff changeset
1154 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1155 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1156 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
1157 v->s.quarter_sample = 0;
3401
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
1158 else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
1159 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
1160 v->s.quarter_sample = 0;
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
1161 else
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
1162 v->s.quarter_sample = 1;
e88c3bc82b15 Correctly detect when use hpel or qpel mode
kostya
parents: 3400
diff changeset
1163 } else
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1164 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
1165 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
1166
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1167 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
1168 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
1169 || 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
1170 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1171 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
1172 if (status < 0) return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1173 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
1174 "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
1175 } else {
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1176 v->mv_type_is_raw = 0;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1177 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
1178 }
3375
a1c2e1603be9 Use MpegEncContext->mbskip_table instead of custom bitplane.
kostya
parents: 3371
diff changeset
1179 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
1180 if (status < 0) return -1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1181 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
1182 "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
1183
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1184 /* Hopefully this is correct for P frames */
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1185 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
1186 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
1187
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1188 if (v->dquant)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1189 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1190 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
1191 vop_dquant_decoding(v);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1192 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1193
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1194 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
1195 if (v->vstransform)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1196 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1197 v->ttmbf = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1198 if (v->ttmbf)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1199 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1200 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
1201 }
3506
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
1202 } else {
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
1203 v->ttmbf = 1;
e0996476198b Set correctly quantizer and transform mode when parsing frame header.
kostya
parents: 3476
diff changeset
1204 v->ttfrm = TT_8X8;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1205 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1206 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1207 case FF_B_TYPE:
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1208 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
1209 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
1210 else v->tt_index = 2;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1211
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1212 lowquant = (v->pq > 12) ? 0 : 1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1213 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
1214 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
1215 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
1216
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1217 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
1218 if (status < 0) return -1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1219 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
1220 "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
1221 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
1222 if (status < 0) return -1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1223 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
1224 "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
1225
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1226 v->s.mv_table_index = get_bits(gb, 2);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1227 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
1228
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1229 if (v->dquant)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1230 {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1231 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
1232 vop_dquant_decoding(v);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1233 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1234
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1235 v->ttfrm = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1236 if (v->vstransform)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1237 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1238 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
1239 if (v->ttmbf)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1240 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1241 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
1242 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1243 } else {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1244 v->ttmbf = 1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1245 v->ttfrm = TT_8X8;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1246 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1247 break;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1248 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1249
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
1250 if(!v->x8_type)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1251 {
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
1252 /* AC Syntax */
efc1e9a01671 indention
michael
parents: 5887
diff changeset
1253 v->c_ac_table_index = decode012(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1254 if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
5892
efc1e9a01671 indention
michael
parents: 5887
diff changeset
1255 {
efc1e9a01671 indention
michael
parents: 5887
diff changeset
1256 v->y_ac_table_index = decode012(gb);
efc1e9a01671 indention
michael
parents: 5887
diff changeset
1257 }
efc1e9a01671 indention
michael
parents: 5887
diff changeset
1258 /* DC Syntax */
efc1e9a01671 indention
michael
parents: 5887
diff changeset
1259 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
1260 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1261
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1262 if(v->s.pict_type == FF_BI_TYPE) {
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1263 v->s.pict_type = FF_B_TYPE;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1264 v->bi_type = 1;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1265 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1266 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1267 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1268
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1269 static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1270 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1271 int pqindex, lowquant;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1272 int status;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1273
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1274 v->p_frame_skipped = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1275
4487
0a0a9f0c9c2d Progressive frames disguised as interlaced are supported
kostya
parents: 4486
diff changeset
1276 if(v->interlace){
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
1277 v->fcm = decode012(gb);
4487
0a0a9f0c9c2d Progressive frames disguised as interlaced are supported
kostya
parents: 4486
diff changeset
1278 if(v->fcm) return -1; // interlaced frames/fields are not implemented
0a0a9f0c9c2d Progressive frames disguised as interlaced are supported
kostya
parents: 4486
diff changeset
1279 }
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
1280 switch(get_unary(gb, 0, 4)) {
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1281 case 0:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1282 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
1283 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1284 case 1:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1285 v->s.pict_type = FF_B_TYPE;
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1286 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1287 case 2:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1288 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
1289 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1290 case 3:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1291 v->s.pict_type = FF_BI_TYPE;
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1292 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1293 case 4:
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1294 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
1295 v->p_frame_skipped = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1296 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1297 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1298 if(v->tfcntrflag)
5519
b790f8c0ee24 use skip_bits where appropriate
alex
parents: 5513
diff changeset
1299 skip_bits(gb, 8);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1300 if(v->broadcast) {
4485
81a120f5f8d0 Wrong flag tested
kostya
parents: 4474
diff changeset
1301 if(!v->interlace || v->psf) {
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
1302 v->rptfrm = get_bits(gb, 2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1303 } else {
4471
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
1304 v->tff = get_bits1(gb);
cfbd1f3d457c Save frame header info in context variables
kostya
parents: 4470
diff changeset
1305 v->rptfrm = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1306 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1307 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1308 if(v->panscanflag) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1309 //...
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1310 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1311 v->rnd = get_bits1(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1312 if(v->interlace)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1313 v->uvsamp = get_bits1(gb);
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1314 if(v->finterpflag) v->interpfrm = get_bits1(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1315 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
1316 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
1317 v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1318 if(v->bfraction == 0) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1319 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
1320 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1321 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1322 pqindex = get_bits(gb, 5);
6150
49a4e4d78692 pqindex=0 is forbidden
kostya
parents: 6145
diff changeset
1323 if(!pqindex) return -1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1324 v->pqindex = pqindex;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1325 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1326 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
1327 else
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1328 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
1329
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1330 v->pquantizer = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1331 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1332 v->pquantizer = pqindex < 9;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1333 if (v->quantizer_mode == QUANT_NON_UNIFORM)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1334 v->pquantizer = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1335 v->pqindex = pqindex;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1336 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
1337 else v->halfpq = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1338 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1339 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
1340 if(v->postprocflag)
8639
29096719e684 VC-1 postproc field is 2 bits wide while decoder read only single bit.
kostya
parents: 8632
diff changeset
1341 v->postproc = get_bits(gb, 2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1342
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1343 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
1344
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1345 switch(v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1346 case FF_I_TYPE:
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1347 case FF_BI_TYPE:
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1348 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
1349 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1350 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
1351 "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
1352 v->condover = CONDOVER_NONE;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1353 if(v->overlap && v->pq <= 8) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1354 v->condover = decode012(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1355 if(v->condover == CONDOVER_SELECT) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1356 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
1357 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1358 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
1359 "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
1360 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1361 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1362 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1363 case FF_P_TYPE:
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
1364 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
1365 else v->mvrange = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1366 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
1367 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
1368 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
1369 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
1370
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1371 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
1372 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
1373 else v->tt_index = 2;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1374
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1375 lowquant = (v->pq > 12) ? 0 : 1;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
1376 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
1377 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
1378 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1379 int scale, shift, i;
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
1380 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
1381 v->lumscale = get_bits(gb, 6);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1382 v->lumshift = get_bits(gb, 6);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1383 /* fill lookup tables for intensity compensation */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1384 if(!v->lumscale) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1385 scale = -64;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1386 shift = (255 - v->lumshift * 2) << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1387 if(v->lumshift > 31)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1388 shift += 128 << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1389 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1390 scale = v->lumscale + 32;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1391 if(v->lumshift > 31)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1392 shift = (v->lumshift - 64) << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1393 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1394 shift = v->lumshift << 6;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1395 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1396 for(i = 0; i < 256; i++) {
4594
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
1397 v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
a96d905dcbaa Add av_ prefix to clip functions
reimar
parents: 4518
diff changeset
1398 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
1399 }
4518
e3c43b4aa9ac Intensity compensation for B-frames in AP was missing
kostya
parents: 4487
diff changeset
1400 v->use_ic = 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1401 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1402 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
1403 v->s.quarter_sample = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1404 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
1405 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
1406 v->s.quarter_sample = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1407 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1408 v->s.quarter_sample = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1409 } else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1410 v->s.quarter_sample = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1411 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
1412
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1413 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
1414 v->mv_mode2 == MV_PMODE_MIXED_MV)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1415 || v->mv_mode == MV_PMODE_MIXED_MV)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1416 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1417 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
1418 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1419 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
1420 "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
1421 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1422 v->mv_type_is_raw = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1423 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
1424 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1425 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
1426 if (status < 0) return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1427 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
1428 "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
1429
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1430 /* Hopefully this is correct for P frames */
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1431 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
1432 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
1433 if (v->dquant)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1434 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1435 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
1436 vop_dquant_decoding(v);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1437 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1438
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1439 v->ttfrm = 0; //FIXME Is that so ?
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1440 if (v->vstransform)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1441 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1442 v->ttmbf = get_bits1(gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1443 if (v->ttmbf)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1444 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1445 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
1446 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1447 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1448 v->ttmbf = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1449 v->ttfrm = TT_8X8;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1450 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1451 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1452 case FF_B_TYPE:
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
1453 if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3);
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1454 else v->mvrange = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1455 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
1456 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
1457 v->range_x = 1 << (v->k_x - 1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1458 v->range_y = 1 << (v->k_y - 1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1459
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1460 if (v->pq < 5) v->tt_index = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1461 else if(v->pq < 13) v->tt_index = 1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1462 else v->tt_index = 2;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1463
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1464 lowquant = (v->pq > 12) ? 0 : 1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1465 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
1466 v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1467 v->s.mspel = v->s.quarter_sample;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1468
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1469 status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1470 if (status < 0) return -1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1471 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
1472 "Imode: %i, Invert: %i\n", status>>1, status&1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1473 status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1474 if (status < 0) return -1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1475 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1476 "Imode: %i, Invert: %i\n", status>>1, status&1);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1477
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1478 v->s.mv_table_index = get_bits(gb, 2);
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1479 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
1480
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1481 if (v->dquant)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1482 {
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1483 av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1484 vop_dquant_decoding(v);
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1485 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1486
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1487 v->ttfrm = 0;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1488 if (v->vstransform)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1489 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1490 v->ttmbf = get_bits1(gb);
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1491 if (v->ttmbf)
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1492 {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1493 v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
4238
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1494 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1495 } else {
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1496 v->ttmbf = 1;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1497 v->ttfrm = TT_8X8;
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1498 }
a784639411d6 B-frames support for adv. profile
kostya
parents: 4237
diff changeset
1499 break;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1500 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1501
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1502 /* AC Syntax */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1503 v->c_ac_table_index = decode012(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1504 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
1505 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1506 v->y_ac_table_index = decode012(gb);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1507 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1508 /* DC Syntax */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1509 v->s.dc_table_index = get_bits1(gb);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1510 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
1511 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
1512 vop_dquant_decoding(v);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1513 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1514
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1515 v->bi_type = 0;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1516 if(v->s.pict_type == FF_BI_TYPE) {
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
1517 v->s.pict_type = FF_B_TYPE;
3693
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1518 v->bi_type = 1;
e9be5d4bad80 Support for BI-frames in Advanced Profile
kostya
parents: 3692
diff changeset
1519 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1520 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1521 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
1522
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1523 /***********************************************************************/
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1524 /**
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
1525 * @defgroup vc1block VC-1 Block-level functions
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1526 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1527 * @{
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1528 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1529
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1530 /**
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1531 * @def GET_MQUANT
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1532 * @brief Get macroblock-level quantizer scale
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1533 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1534 #define GET_MQUANT() \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1535 if (v->dquantfrm) \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1536 { \
3404
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1537 int edges = 0; \
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1538 if (v->dqprofile == DQPROFILE_ALL_MBS) \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1539 { \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1540 if (v->dqbilevel) \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1541 { \
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
1542 mquant = (get_bits1(gb)) ? v->altpq : v->pq; \
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1543 } \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1544 else \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1545 { \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1546 mqdiff = get_bits(gb, 3); \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1547 if (mqdiff != 7) mquant = v->pq + mqdiff; \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1548 else mquant = get_bits(gb, 5); \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1549 } \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1550 } \
3404
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1551 if(v->dqprofile == DQPROFILE_SINGLE_EDGE) \
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1552 edges = 1 << v->dqsbedge; \
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1553 else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
3404
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1554 edges = (3 << v->dqsbedge) % 15; \
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1555 else if(v->dqprofile == DQPROFILE_FOUR_EDGES) \
3404
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1556 edges = 15; \
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1557 if((edges&1) && !s->mb_x) \
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1558 mquant = v->altpq; \
3451
45724ba8d666 Fix mquant selection for ALL_MBS mode
kostya
parents: 3450
diff changeset
1559 if((edges&2) && s->first_slice_line) \
3404
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1560 mquant = v->altpq; \
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1561 if((edges&4) && s->mb_x == (s->mb_width - 1)) \
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1562 mquant = v->altpq; \
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1563 if((edges&8) && s->mb_y == (s->mb_height - 1)) \
0f56ae23d338 Optimizations suggested by Michael Niedermayer
kostya
parents: 3401
diff changeset
1564 mquant = v->altpq; \
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1565 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1566
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1567 /**
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1568 * @def GET_MVDATA(_dmv_x, _dmv_y)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1569 * @brief Get MV differentials
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1570 * @see MVDATA decoding from 8.3.5.2, p(1)20
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1571 * @param _dmv_x Horizontal differential for decoded MV
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1572 * @param _dmv_y Vertical differential for decoded MV
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1573 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1574 #define GET_MVDATA(_dmv_x, _dmv_y) \
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
1575 index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table,\
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1576 VC1_MV_DIFF_VLC_BITS, 2); \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1577 if (index > 36) \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1578 { \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1579 mb_has_coeffs = 1; \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1580 index -= 37; \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1581 } \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1582 else mb_has_coeffs = 0; \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1583 s->mb_intra = 0; \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1584 if (!index) { _dmv_x = _dmv_y = 0; } \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1585 else if (index == 35) \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1586 { \
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1587 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1588 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1589 } \
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1590 else if (index == 36) \
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1591 { \
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1592 _dmv_x = 0; \
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1593 _dmv_y = 0; \
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1594 s->mb_intra = 1; \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1595 } \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1596 else \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1597 { \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1598 index1 = index%6; \
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1599 if (!s->quarter_sample && index1 == 5) val = 1; \
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1600 else val = 0; \
3366
c59aa4cdf042 This should make P-frames decoding work on x86 (by avoiding get_bits(0))
kostya
parents: 3364
diff changeset
1601 if(size_table[index1] - val > 0) \
c59aa4cdf042 This should make P-frames decoding work on x86 (by avoiding get_bits(0))
kostya
parents: 3364
diff changeset
1602 val = get_bits(gb, size_table[index1] - val); \
c59aa4cdf042 This should make P-frames decoding work on x86 (by avoiding get_bits(0))
kostya
parents: 3364
diff changeset
1603 else val = 0; \
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1604 sign = 0 - (val&1); \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1605 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1606 \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1607 index1 = index/6; \
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1608 if (!s->quarter_sample && index1 == 5) val = 1; \
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1609 else val = 0; \
3366
c59aa4cdf042 This should make P-frames decoding work on x86 (by avoiding get_bits(0))
kostya
parents: 3364
diff changeset
1610 if(size_table[index1] - val > 0) \
c59aa4cdf042 This should make P-frames decoding work on x86 (by avoiding get_bits(0))
kostya
parents: 3364
diff changeset
1611 val = get_bits(gb, size_table[index1] - val); \
c59aa4cdf042 This should make P-frames decoding work on x86 (by avoiding get_bits(0))
kostya
parents: 3364
diff changeset
1612 else val = 0; \
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1613 sign = 0 - (val&1); \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1614 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1615 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
1616
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1617 /** Predict and set motion vector
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1618 */
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1619 static inline void vc1_pred_mv(MpegEncContext *s, int n, int dmv_x, int dmv_y, int mv1, int r_x, int r_y, uint8_t* is_intra)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1620 {
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1621 int xy, wrap, off = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1622 int16_t *A, *B, *C;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1623 int px, py;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1624 int sum;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1625
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1626 /* scale MV difference to be quad-pel */
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1627 dmv_x <<= 1 - s->quarter_sample;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
1628 dmv_y <<= 1 - s->quarter_sample;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1629
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1630 wrap = s->b8_stride;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1631 xy = s->block_index[n];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1632
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1633 if(s->mb_intra){
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1634 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1635 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0;
4683
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
1636 s->current_picture.motion_val[1][xy][0] = 0;
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
1637 s->current_picture.motion_val[1][xy][1] = 0;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1638 if(mv1) { /* duplicate motion data for 1-MV block */
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1639 s->current_picture.motion_val[0][xy + 1][0] = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1640 s->current_picture.motion_val[0][xy + 1][1] = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1641 s->current_picture.motion_val[0][xy + wrap][0] = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1642 s->current_picture.motion_val[0][xy + wrap][1] = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1643 s->current_picture.motion_val[0][xy + wrap + 1][0] = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1644 s->current_picture.motion_val[0][xy + wrap + 1][1] = 0;
4683
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
1645 s->current_picture.motion_val[1][xy + 1][0] = 0;
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
1646 s->current_picture.motion_val[1][xy + 1][1] = 0;
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
1647 s->current_picture.motion_val[1][xy + wrap][0] = 0;
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
1648 s->current_picture.motion_val[1][xy + wrap][1] = 0;
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
1649 s->current_picture.motion_val[1][xy + wrap + 1][0] = 0;
b4dd7005d807 Zero MV vectors for P frame intra blocks
kostya
parents: 4681
diff changeset
1650 s->current_picture.motion_val[1][xy + wrap + 1][1] = 0;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1651 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1652 return;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1653 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1654
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1655 C = s->current_picture.motion_val[0][xy - 1];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1656 A = s->current_picture.motion_val[0][xy - wrap];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1657 if(mv1)
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1658 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1659 else {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1660 //in 4-MV mode different blocks have different B predictor position
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1661 switch(n){
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1662 case 0:
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1663 off = (s->mb_x > 0) ? -1 : 1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1664 break;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1665 case 1:
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1666 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1667 break;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1668 case 2:
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1669 off = 1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1670 break;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1671 case 3:
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1672 off = -1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1673 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1674 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1675 B = s->current_picture.motion_val[0][xy - wrap + off];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1676
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1677 if(!s->first_slice_line || (n==2 || n==3)) { // predictor A is not out of bounds
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1678 if(s->mb_width == 1) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1679 px = A[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1680 py = A[1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1681 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1682 px = mid_pred(A[0], B[0], C[0]);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1683 py = mid_pred(A[1], B[1], C[1]);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1684 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1685 } else if(s->mb_x || (n==1 || n==3)) { // predictor C is not out of bounds
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1686 px = C[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1687 py = C[1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1688 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1689 px = py = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1690 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1691 /* Pullback MV as specified in 8.3.5.3.4 */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1692 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1693 int qx, qy, X, Y;
3400
84de54d536bd 4-MV mode final fixes (now it works for non-exotic modes)
kostya
parents: 3399
diff changeset
1694 qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0);
84de54d536bd 4-MV mode final fixes (now it works for non-exotic modes)
kostya
parents: 3399
diff changeset
1695 qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1696 X = (s->mb_width << 6) - 4;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1697 Y = (s->mb_height << 6) - 4;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1698 if(mv1) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1699 if(qx + px < -60) px = -60 - qx;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1700 if(qy + py < -60) py = -60 - qy;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1701 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1702 if(qx + px < -28) px = -28 - qx;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1703 if(qy + py < -28) py = -28 - qy;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1704 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1705 if(qx + px > X) px = X - qx;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1706 if(qy + py > Y) py = Y - qy;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1707 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1708 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1709 if((!s->first_slice_line || (n==2 || n==3)) && (s->mb_x || (n==1 || n==3))) {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1710 if(is_intra[xy - wrap])
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
1711 sum = FFABS(px) + FFABS(py);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1712 else
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
1713 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1714 if(sum > 32) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1715 if(get_bits1(&s->gb)) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1716 px = A[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1717 py = A[1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1718 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1719 px = C[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1720 py = C[1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1721 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1722 } else {
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1723 if(is_intra[xy - 1])
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
1724 sum = FFABS(px) + FFABS(py);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1725 else
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
1726 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1727 if(sum > 32) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1728 if(get_bits1(&s->gb)) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1729 px = A[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1730 py = A[1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1731 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1732 px = C[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1733 py = C[1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1734 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1735 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1736 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1737 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1738 /* store MV using signed modulus of MV range defined in 4.11 */
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1739 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1740 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1741 if(mv1) { /* duplicate motion data for 1-MV block */
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1742 s->current_picture.motion_val[0][xy + 1][0] = s->current_picture.motion_val[0][xy][0];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1743 s->current_picture.motion_val[0][xy + 1][1] = s->current_picture.motion_val[0][xy][1];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1744 s->current_picture.motion_val[0][xy + wrap][0] = s->current_picture.motion_val[0][xy][0];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1745 s->current_picture.motion_val[0][xy + wrap][1] = s->current_picture.motion_val[0][xy][1];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1746 s->current_picture.motion_val[0][xy + wrap + 1][0] = s->current_picture.motion_val[0][xy][0];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1747 s->current_picture.motion_val[0][xy + wrap + 1][1] = s->current_picture.motion_val[0][xy][1];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
1748 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1749 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
1750
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1751 /** Motion compensation for direct or interpolated blocks in B-frames
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1752 */
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1753 static void vc1_interp_mc(VC1Context *v)
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1754 {
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1755 MpegEncContext *s = &v->s;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1756 DSPContext *dsp = &v->s.dsp;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1757 uint8_t *srcY, *srcU, *srcV;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1758 int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1759
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1760 if(!v->s.next_picture.data[0])return;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1761
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1762 mx = s->mv[1][0][0];
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1763 my = s->mv[1][0][1];
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1764 uvmx = (mx + ((mx & 3) == 3)) >> 1;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1765 uvmy = (my + ((my & 3) == 3)) >> 1;
4258
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
1766 if(v->fastuvmc) {
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
1767 uvmx = uvmx + ((uvmx<0)?-(uvmx&1):(uvmx&1));
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
1768 uvmy = uvmy + ((uvmy<0)?-(uvmy&1):(uvmy&1));
4d2f162506e3 10e6l FastUVMC was done right but in the wrong place
kostya
parents: 4247
diff changeset
1769 }
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1770 srcY = s->next_picture.data[0];
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1771 srcU = s->next_picture.data[1];
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1772 srcV = s->next_picture.data[2];
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1773
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1774 src_x = s->mb_x * 16 + (mx >> 2);
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1775 src_y = s->mb_y * 16 + (my >> 2);
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1776 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1777 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1778
4681
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1779 if(v->profile != PROFILE_ADVANCED){
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1780 src_x = av_clip( src_x, -16, s->mb_width * 16);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1781 src_y = av_clip( src_y, -16, s->mb_height * 16);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1782 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1783 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1784 }else{
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1785 src_x = av_clip( src_x, -17, s->avctx->coded_width);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1786 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1787 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1788 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
b82cff2e2e83 indentation
kostya
parents: 4680
diff changeset
1789 }
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1790
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1791 srcY += src_y * s->linesize + src_x;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1792 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1793 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1794
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1795 /* for grayscale we should not try to read from unknown area */
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1796 if(s->flags & CODEC_FLAG_GRAY) {
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1797 srcU = s->edge_emu_buffer + 18 * s->linesize;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1798 srcV = s->edge_emu_buffer + 18 * s->linesize;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1799 }
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1800
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1801 if(v->rangeredfrm
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1802 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1803 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1804 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1805
3708
a8d2bd2e1928 Fix edge emulation for bicubic MC in B frames
kostya
parents: 3707
diff changeset
1806 srcY -= s->mspel * (1 + s->linesize);
a8d2bd2e1928 Fix edge emulation for bicubic MC in B frames
kostya
parents: 3707
diff changeset
1807 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1808 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1809 srcY = s->edge_emu_buffer;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1810 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1,
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1811 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1812 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1813 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1814 srcU = uvbuf;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1815 srcV = uvbuf + 16;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1816 /* if we deal with range reduction we need to scale source blocks */
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1817 if(v->rangeredfrm) {
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1818 int i, j;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1819 uint8_t *src, *src2;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1820
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1821 src = srcY;
3708
a8d2bd2e1928 Fix edge emulation for bicubic MC in B frames
kostya
parents: 3707
diff changeset
1822 for(j = 0; j < 17 + s->mspel*2; j++) {
a8d2bd2e1928 Fix edge emulation for bicubic MC in B frames
kostya
parents: 3707
diff changeset
1823 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1824 src += s->linesize;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1825 }
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1826 src = srcU; src2 = srcV;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1827 for(j = 0; j < 9; j++) {
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1828 for(i = 0; i < 9; i++) {
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1829 src[i] = ((src[i] - 128) >> 1) + 128;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1830 src2[i] = ((src2[i] - 128) >> 1) + 128;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1831 }
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1832 src += s->uvlinesize;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1833 src2 += s->uvlinesize;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1834 }
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1835 }
3708
a8d2bd2e1928 Fix edge emulation for bicubic MC in B frames
kostya
parents: 3707
diff changeset
1836 srcY += s->mspel * (1 + s->linesize);
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1837 }
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1838
9437
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1839 if(s->mspel) {
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1840 dxy = ((my & 3) << 2) | (mx & 3);
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1841 dsp->avg_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd);
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1842 dsp->avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1843 srcY += s->linesize * 8;
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1844 dsp->avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd);
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1845 dsp->avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1846 } else { // hpel mc
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1847 dxy = (my & 2) | ((mx & 2) >> 1);
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1848
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1849 if(!v->rnd)
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1850 dsp->avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1851 else
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1852 dsp->avg_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
8aa2e86549cd VC1: Do qpel when needed for both MVs in a B frame
conrad
parents: 9393
diff changeset
1853 }
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1854
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1855 if(s->flags & CODEC_FLAG_GRAY) return;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1856 /* Chroma MC always uses qpel blilinear */
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1857 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
3709
44f5de5a7d03 Use h264_chroma funcs in B-frames MC too
kostya
parents: 3708
diff changeset
1858 uvmx = (uvmx&3)<<1;
44f5de5a7d03 Use h264_chroma funcs in B-frames MC too
kostya
parents: 3708
diff changeset
1859 uvmy = (uvmy&3)<<1;
9440
daee921fb6bb VC1: add and use avg_no_rnd chroma MC functions
conrad
parents: 9439
diff changeset
1860 if(!v->rnd){
daee921fb6bb VC1: add and use avg_no_rnd chroma MC functions
conrad
parents: 9439
diff changeset
1861 dsp->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
daee921fb6bb VC1: add and use avg_no_rnd chroma MC functions
conrad
parents: 9439
diff changeset
1862 dsp->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
daee921fb6bb VC1: add and use avg_no_rnd chroma MC functions
conrad
parents: 9439
diff changeset
1863 }else{
daee921fb6bb VC1: add and use avg_no_rnd chroma MC functions
conrad
parents: 9439
diff changeset
1864 dsp->avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
daee921fb6bb VC1: add and use avg_no_rnd chroma MC functions
conrad
parents: 9439
diff changeset
1865 dsp->avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
daee921fb6bb VC1: add and use avg_no_rnd chroma MC functions
conrad
parents: 9439
diff changeset
1866 }
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1867 }
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1868
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 4258
diff changeset
1869 static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1870 {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1871 int n = bfrac;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1872
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1873 #if B_FRACTION_DEN==256
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1874 if(inv)
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1875 n -= 256;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1876 if(!qs)
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1877 return 2 * ((value * n + 255) >> 9);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1878 return (value * n + 128) >> 8;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1879 #else
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1880 if(inv)
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1881 n -= B_FRACTION_DEN;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1882 if(!qs)
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1883 return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1884 return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1885 #endif
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1886 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1887
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1888 /** Reconstruct motion vector for B-frame and do motion compensation
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1889 */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1890 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mode)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1891 {
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1892 if(v->use_ic) {
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1893 v->mv_mode2 = v->mv_mode;
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1894 v->mv_mode = MV_PMODE_INTENSITY_COMP;
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1895 }
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1896 if(direct) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1897 vc1_mc_1mv(v, 0);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1898 vc1_interp_mc(v);
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1899 if(v->use_ic) v->mv_mode = v->mv_mode2;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1900 return;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1901 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1902 if(mode == BMV_TYPE_INTERPOLATED) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1903 vc1_mc_1mv(v, 0);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1904 vc1_interp_mc(v);
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1905 if(v->use_ic) v->mv_mode = v->mv_mode2;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1906 return;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1907 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1908
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1909 if(v->use_ic && (mode == BMV_TYPE_BACKWARD)) v->mv_mode = v->mv_mode2;
3711
4a5536551692 Swap back and forward motion vectors to achieve correct picture
kostya
parents: 3710
diff changeset
1910 vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
3744
805aee1f7cce For B-frames if the second reference frame signals intensity compensation
kostya
parents: 3743
diff changeset
1911 if(v->use_ic) v->mv_mode = v->mv_mode2;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1912 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1913
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1914 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mvtype)
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1915 {
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1916 MpegEncContext *s = &v->s;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1917 int xy, wrap, off = 0;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1918 int16_t *A, *B, *C;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1919 int px, py;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1920 int sum;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1921 int r_x, r_y;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1922 const uint8_t *is_intra = v->mb_type[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1923
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1924 r_x = v->range_x;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1925 r_y = v->range_y;
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1926 /* scale MV difference to be quad-pel */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1927 dmv_x[0] <<= 1 - s->quarter_sample;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1928 dmv_y[0] <<= 1 - s->quarter_sample;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1929 dmv_x[1] <<= 1 - s->quarter_sample;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1930 dmv_y[1] <<= 1 - s->quarter_sample;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
1931
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1932 wrap = s->b8_stride;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1933 xy = s->block_index[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1934
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1935 if(s->mb_intra) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1936 s->current_picture.motion_val[0][xy][0] =
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1937 s->current_picture.motion_val[0][xy][1] =
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1938 s->current_picture.motion_val[1][xy][0] =
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1939 s->current_picture.motion_val[1][xy][1] = 0;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1940 return;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1941 }
3743
fc613a610303 Reorder MV order in B-frames so no swapping in vc1_b_mc() is needed
kostya
parents: 3711
diff changeset
1942 s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
fc613a610303 Reorder MV order in B-frames so no swapping in vc1_b_mc() is needed
kostya
parents: 3711
diff changeset
1943 s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
fc613a610303 Reorder MV order in B-frames so no swapping in vc1_b_mc() is needed
kostya
parents: 3711
diff changeset
1944 s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
fc613a610303 Reorder MV order in B-frames so no swapping in vc1_b_mc() is needed
kostya
parents: 3711
diff changeset
1945 s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
4859
bc40c297ea15 Pullback should be performed on scaled motion vectors in B-frames
kostya
parents: 4834
diff changeset
1946
bc40c297ea15 Pullback should be performed on scaled motion vectors in B-frames
kostya
parents: 4834
diff changeset
1947 /* Pullback predicted motion vectors as specified in 8.4.5.4 */
bc40c297ea15 Pullback should be performed on scaled motion vectors in B-frames
kostya
parents: 4834
diff changeset
1948 s->mv[0][0][0] = av_clip(s->mv[0][0][0], -60 - (s->mb_x << 6), (s->mb_width << 6) - 4 - (s->mb_x << 6));
bc40c297ea15 Pullback should be performed on scaled motion vectors in B-frames
kostya
parents: 4834
diff changeset
1949 s->mv[0][0][1] = av_clip(s->mv[0][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
bc40c297ea15 Pullback should be performed on scaled motion vectors in B-frames
kostya
parents: 4834
diff changeset
1950 s->mv[1][0][0] = av_clip(s->mv[1][0][0], -60 - (s->mb_x << 6), (s->mb_width << 6) - 4 - (s->mb_x << 6));
bc40c297ea15 Pullback should be performed on scaled motion vectors in B-frames
kostya
parents: 4834
diff changeset
1951 s->mv[1][0][1] = av_clip(s->mv[1][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1952 if(direct) {
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1953 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1954 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1955 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1956 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1957 return;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
1958 }
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1959
3743
fc613a610303 Reorder MV order in B-frames so no swapping in vc1_b_mc() is needed
kostya
parents: 3711
diff changeset
1960 if((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1961 C = s->current_picture.motion_val[0][xy - 2];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1962 A = s->current_picture.motion_val[0][xy - wrap*2];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1963 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1964 B = s->current_picture.motion_val[0][xy - wrap*2 + off];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1965
4834
300b60dee58c Set C predictor to zero if unavailable (should fix B-frame border artifacts)
kostya
parents: 4784
diff changeset
1966 if(!s->mb_x) C[0] = C[1] = 0;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1967 if(!s->first_slice_line) { // predictor A is not out of bounds
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1968 if(s->mb_width == 1) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1969 px = A[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1970 py = A[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1971 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1972 px = mid_pred(A[0], B[0], C[0]);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1973 py = mid_pred(A[1], B[1], C[1]);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1974 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1975 } else if(s->mb_x) { // predictor C is not out of bounds
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1976 px = C[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1977 py = C[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1978 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1979 px = py = 0;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1980 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1981 /* Pullback MV as specified in 8.3.5.3.4 */
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1982 {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1983 int qx, qy, X, Y;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1984 if(v->profile < PROFILE_ADVANCED) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1985 qx = (s->mb_x << 5);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1986 qy = (s->mb_y << 5);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1987 X = (s->mb_width << 5) - 4;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1988 Y = (s->mb_height << 5) - 4;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1989 if(qx + px < -28) px = -28 - qx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1990 if(qy + py < -28) py = -28 - qy;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1991 if(qx + px > X) px = X - qx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1992 if(qy + py > Y) py = Y - qy;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1993 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1994 qx = (s->mb_x << 6);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1995 qy = (s->mb_y << 6);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1996 X = (s->mb_width << 6) - 4;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1997 Y = (s->mb_height << 6) - 4;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1998 if(qx + px < -60) px = -60 - qx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
1999 if(qy + py < -60) py = -60 - qy;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2000 if(qx + px > X) px = X - qx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2001 if(qy + py > Y) py = Y - qy;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2002 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2003 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2004 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2005 if(0 && !s->first_slice_line && s->mb_x) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2006 if(is_intra[xy - wrap])
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
2007 sum = FFABS(px) + FFABS(py);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2008 else
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
2009 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2010 if(sum > 32) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2011 if(get_bits1(&s->gb)) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2012 px = A[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2013 py = A[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2014 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2015 px = C[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2016 py = C[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2017 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2018 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2019 if(is_intra[xy - 2])
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
2020 sum = FFABS(px) + FFABS(py);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2021 else
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
2022 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2023 if(sum > 32) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2024 if(get_bits1(&s->gb)) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2025 px = A[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2026 py = A[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2027 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2028 px = C[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2029 py = C[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2030 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2031 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2032 }
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
2033 }
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2034 /* store MV using signed modulus of MV range defined in 4.11 */
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2035 s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2036 s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
2037 }
3743
fc613a610303 Reorder MV order in B-frames so no swapping in vc1_b_mc() is needed
kostya
parents: 3711
diff changeset
2038 if((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2039 C = s->current_picture.motion_val[1][xy - 2];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2040 A = s->current_picture.motion_val[1][xy - wrap*2];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2041 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2042 B = s->current_picture.motion_val[1][xy - wrap*2 + off];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2043
4834
300b60dee58c Set C predictor to zero if unavailable (should fix B-frame border artifacts)
kostya
parents: 4784
diff changeset
2044 if(!s->mb_x) C[0] = C[1] = 0;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2045 if(!s->first_slice_line) { // predictor A is not out of bounds
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2046 if(s->mb_width == 1) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2047 px = A[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2048 py = A[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2049 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2050 px = mid_pred(A[0], B[0], C[0]);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2051 py = mid_pred(A[1], B[1], C[1]);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2052 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2053 } else if(s->mb_x) { // predictor C is not out of bounds
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2054 px = C[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2055 py = C[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2056 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2057 px = py = 0;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2058 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2059 /* Pullback MV as specified in 8.3.5.3.4 */
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2060 {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2061 int qx, qy, X, Y;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2062 if(v->profile < PROFILE_ADVANCED) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2063 qx = (s->mb_x << 5);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2064 qy = (s->mb_y << 5);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2065 X = (s->mb_width << 5) - 4;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2066 Y = (s->mb_height << 5) - 4;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2067 if(qx + px < -28) px = -28 - qx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2068 if(qy + py < -28) py = -28 - qy;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2069 if(qx + px > X) px = X - qx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2070 if(qy + py > Y) py = Y - qy;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2071 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2072 qx = (s->mb_x << 6);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2073 qy = (s->mb_y << 6);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2074 X = (s->mb_width << 6) - 4;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2075 Y = (s->mb_height << 6) - 4;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2076 if(qx + px < -60) px = -60 - qx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2077 if(qy + py < -60) py = -60 - qy;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2078 if(qx + px > X) px = X - qx;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2079 if(qy + py > Y) py = Y - qy;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2080 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2081 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2082 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2083 if(0 && !s->first_slice_line && s->mb_x) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2084 if(is_intra[xy - wrap])
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
2085 sum = FFABS(px) + FFABS(py);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2086 else
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
2087 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2088 if(sum > 32) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2089 if(get_bits1(&s->gb)) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2090 px = A[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2091 py = A[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2092 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2093 px = C[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2094 py = C[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2095 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2096 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2097 if(is_intra[xy - 2])
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
2098 sum = FFABS(px) + FFABS(py);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2099 else
4001
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 3947
diff changeset
2100 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2101 if(sum > 32) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2102 if(get_bits1(&s->gb)) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2103 px = A[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2104 py = A[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2105 } else {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2106 px = C[0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2107 py = C[1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2108 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2109 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2110 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2111 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2112 /* store MV using signed modulus of MV range defined in 4.11 */
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2113
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2114 s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2115 s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2116 }
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2117 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2118 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2119 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
2120 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
2121 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
2122
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2123 /** Get predicted DC value for I-frames only
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2124 * prediction dir: left=0, top=1
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2125 * @param s MpegEncContext
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2126 * @param overlap flag indicating that overlap filtering is used
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2127 * @param pq integer part of picture quantizer
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2128 * @param[in] n block index in the current MB
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2129 * @param dc_val_ptr Pointer to DC predictor
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2130 * @param dir_ptr Prediction direction for use in AC prediction
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2131 */
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2132 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
3781
8e79b099d354 dc_val should be signed
mru
parents: 3776
diff changeset
2133 int16_t **dc_val_ptr, int *dir_ptr)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2134 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2135 int a, b, c, wrap, pred, scale;
3781
8e79b099d354 dc_val should be signed
mru
parents: 3776
diff changeset
2136 int16_t *dc_val;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2137 static const uint16_t dcpred[32] = {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2138 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2139 114, 102, 93, 85, 79, 73, 68, 64,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2140 60, 57, 54, 51, 49, 47, 45, 43,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2141 41, 39, 38, 37, 35, 34, 33
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2142 };
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2143
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2144 /* find prediction - wmv3_dc_scale always used here in fact */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2145 if (n < 4) scale = s->y_dc_scale;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2146 else scale = s->c_dc_scale;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2147
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2148 wrap = s->block_wrap[n];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2149 dc_val= s->dc_val[0] + s->block_index[n];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2150
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2151 /* B A
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2152 * C X
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2153 */
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2154 c = dc_val[ - 1];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2155 b = dc_val[ - 1 - wrap];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2156 a = dc_val[ - wrap];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2157
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2158 if (pq < 9 || !overlap)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2159 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2160 /* Set outer values */
3449
ec6096b1ab04 Use s->first_slice_line in checks instead of s->mb_y
kostya
parents: 3430
diff changeset
2161 if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2162 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2163 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2164 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2165 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2166 /* Set outer values */
3449
ec6096b1ab04 Use s->first_slice_line in checks instead of s->mb_y
kostya
parents: 3430
diff changeset
2167 if (s->first_slice_line && (n!=2 && n!=3)) b=a=0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2168 if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2169 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2170
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2171 if (abs(a - b) <= abs(b - c)) {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2172 pred = c;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2173 *dir_ptr = 1;//left
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2174 } else {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2175 pred = a;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2176 *dir_ptr = 0;//top
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2177 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2178
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2179 /* update predictor */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2180 *dc_val_ptr = &dc_val[0];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2181 return pred;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2182 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2183
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2184
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2185 /** Get predicted DC value
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2186 * prediction dir: left=0, top=1
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2187 * @param s MpegEncContext
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2188 * @param overlap flag indicating that overlap filtering is used
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2189 * @param pq integer part of picture quantizer
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2190 * @param[in] n block index in the current MB
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2191 * @param a_avail flag indicating top block availability
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2192 * @param c_avail flag indicating left block availability
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2193 * @param dc_val_ptr Pointer to DC predictor
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2194 * @param dir_ptr Prediction direction for use in AC prediction
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2195 */
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2196 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2197 int a_avail, int c_avail,
3781
8e79b099d354 dc_val should be signed
mru
parents: 3776
diff changeset
2198 int16_t **dc_val_ptr, int *dir_ptr)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2199 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2200 int a, b, c, wrap, pred, scale;
3781
8e79b099d354 dc_val should be signed
mru
parents: 3776
diff changeset
2201 int16_t *dc_val;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2202 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3429
fb2a69de8ded Enable coefficient scaling
kostya
parents: 3428
diff changeset
2203 int q1, q2 = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2204
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2205 /* find prediction - wmv3_dc_scale always used here in fact */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2206 if (n < 4) scale = s->y_dc_scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2207 else scale = s->c_dc_scale;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2208
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2209 wrap = s->block_wrap[n];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2210 dc_val= s->dc_val[0] + s->block_index[n];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2211
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2212 /* B A
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2213 * C X
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2214 */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2215 c = dc_val[ - 1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2216 b = dc_val[ - 1 - wrap];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2217 a = dc_val[ - wrap];
3508
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2218 /* scale predictors if needed */
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2219 q1 = s->current_picture.qscale_table[mb_pos];
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2220 if(c_avail && (n!= 1 && n!=3)) {
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2221 q2 = s->current_picture.qscale_table[mb_pos - 1];
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2222 if(q2 && q2 != q1)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2223 c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
3508
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2224 }
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2225 if(a_avail && (n!= 2 && n!=3)) {
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2226 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2227 if(q2 && q2 != q1)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2228 a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
3508
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2229 }
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2230 if(a_avail && c_avail && (n!=3)) {
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2231 int off = mb_pos;
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2232 if(n != 1) off--;
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2233 if(n != 2) off -= s->mb_stride;
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2234 q2 = s->current_picture.qscale_table[off];
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2235 if(q2 && q2 != q1)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2236 b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
3508
3d6e4ef3170d 1000l: scale DC predictors instead of predicted value.
kostya
parents: 3507
diff changeset
2237 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2238
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2239 if(a_avail && c_avail) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2240 if(abs(a - b) <= abs(b - c)) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2241 pred = c;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2242 *dir_ptr = 1;//left
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2243 } else {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2244 pred = a;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2245 *dir_ptr = 0;//top
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2246 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2247 } else if(a_avail) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2248 pred = a;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2249 *dir_ptr = 0;//top
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2250 } else if(c_avail) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2251 pred = c;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2252 *dir_ptr = 1;//left
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2253 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2254 pred = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2255 *dir_ptr = 1;//left
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2256 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2257
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2258 /* update predictor */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2259 *dc_val_ptr = &dc_val[0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2260 return pred;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2261 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2262
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2263 /** @} */ // Block group
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2264
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2265 /**
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2266 * @defgroup vc1_std_mb VC1 Macroblock-level functions in Simple/Main Profiles
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2267 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2268 * @{
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2269 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2270
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2271 static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2272 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2273 int xy, wrap, pred, a, b, c;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2274
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2275 xy = s->block_index[n];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2276 wrap = s->b8_stride;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2277
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2278 /* B C
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2279 * A X
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2280 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2281 a = s->coded_block[xy - 1 ];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2282 b = s->coded_block[xy - 1 - wrap];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2283 c = s->coded_block[xy - wrap];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2284
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2285 if (b == c) {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2286 pred = a;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2287 } else {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2288 pred = c;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2289 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2290
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2291 /* store value */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2292 *coded_block_ptr = &s->coded_block[xy];
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2293
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2294 return pred;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2295 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2296
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2297 /**
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2298 * Decode one AC coefficient
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2299 * @param v The VC1 context
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2300 * @param last Last coefficient
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2301 * @param skip How much zero coefficients to skip
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2302 * @param value Decoded AC coefficient value
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2303 * @param codingset set of VLC to decode data
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2304 * @see 8.1.3.4
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2305 */
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2306 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2307 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2308 GetBitContext *gb = &v->s.gb;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2309 int index, escape, run = 0, level = 0, lst = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2310
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2311 index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2312 if (index != vc1_ac_sizes[codingset] - 1) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2313 run = vc1_index_decode_table[codingset][index][0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2314 level = vc1_index_decode_table[codingset][index][1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2315 lst = index >= vc1_last_decode_table[codingset];
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2316 if(get_bits1(gb))
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2317 level = -level;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2318 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2319 escape = decode210(gb);
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2320 if (escape != 2) {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2321 index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2322 run = vc1_index_decode_table[codingset][index][0];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2323 level = vc1_index_decode_table[codingset][index][1];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2324 lst = index >= vc1_last_decode_table[codingset];
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2325 if(escape == 0) {
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2326 if(lst)
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2327 level += vc1_last_delta_level_table[codingset][run];
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2328 else
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2329 level += vc1_delta_level_table[codingset][run];
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2330 } else {
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2331 if(lst)
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2332 run += vc1_last_delta_run_table[codingset][level] + 1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2333 else
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2334 run += vc1_delta_run_table[codingset][level] + 1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2335 }
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2336 if(get_bits1(gb))
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2337 level = -level;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2338 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2339 int sign;
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2340 lst = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2341 if(v->s.esc3_level_length == 0) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2342 if(v->pq < 8 || v->dquantfrm) { // table 59
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2343 v->s.esc3_level_length = get_bits(gb, 3);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2344 if(!v->s.esc3_level_length)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2345 v->s.esc3_level_length = get_bits(gb, 2) + 8;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2346 } else { //table 60
5511
7617e066481e use get_unary from bitstream.h
alex
parents: 5299
diff changeset
2347 v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2348 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2349 v->s.esc3_run_length = 3 + get_bits(gb, 2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2350 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2351 run = get_bits(gb, v->s.esc3_run_length);
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2352 sign = get_bits1(gb);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2353 level = get_bits(gb, v->s.esc3_level_length);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2354 if(sign)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2355 level = -level;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2356 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2357 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2358
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2359 *last = lst;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2360 *skip = run;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2361 *value = level;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2362 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2363
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2364 /** Decode intra block in intra frames - should be faster than decode_intra_block
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2365 * @param v VC1Context
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2366 * @param block block to decode
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2367 * @param[in] n subblock index
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2368 * @param coded are AC coeffs present or not
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2369 * @param codingset set of VLC to decode data
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2370 */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2371 static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2372 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2373 GetBitContext *gb = &v->s.gb;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2374 MpegEncContext *s = &v->s;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2375 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2376 int run_diff, i;
3781
8e79b099d354 dc_val should be signed
mru
parents: 3776
diff changeset
2377 int16_t *dc_val;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2378 int16_t *ac_val, *ac_val2;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2379 int dcdiff;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2380
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2381 /* Get DC differential */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2382 if (n < 4) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2383 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2384 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2385 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2386 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2387 if (dcdiff < 0){
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2388 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2389 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2390 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2391 if (dcdiff)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2392 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2393 if (dcdiff == 119 /* ESC index value */)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2394 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2395 /* TODO: Optimize */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2396 if (v->pq == 1) dcdiff = get_bits(gb, 10);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2397 else if (v->pq == 2) dcdiff = get_bits(gb, 9);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2398 else dcdiff = get_bits(gb, 8);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2399 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2400 else
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2401 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2402 if (v->pq == 1)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2403 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2404 else if (v->pq == 2)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2405 dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2406 }
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2407 if (get_bits1(gb))
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2408 dcdiff = -dcdiff;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2409 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2410
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2411 /* Prediction */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2412 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2413 *dc_val = dcdiff;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2414
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2415 /* Store the quantized DC coeff, used for prediction */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2416 if (n < 4) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2417 block[0] = dcdiff * s->y_dc_scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2418 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2419 block[0] = dcdiff * s->c_dc_scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2420 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2421 /* Skip ? */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2422 run_diff = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2423 i = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2424 if (!coded) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2425 goto not_coded;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2426 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2427
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2428 //AC Decoding
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2429 i = 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2430
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2431 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2432 int last = 0, skip, value;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2433 const int8_t *zz_table;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2434 int scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2435 int k;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2436
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2437 scale = v->pq * 2 + v->halfpq;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2438
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2439 if(v->s.ac_pred) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2440 if(!dc_pred_dir)
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
2441 zz_table = wmv1_scantable[2];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2442 else
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
2443 zz_table = wmv1_scantable[3];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2444 } else
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
2445 zz_table = wmv1_scantable[1];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2446
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2447 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2448 ac_val2 = ac_val;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2449 if(dc_pred_dir) //left
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2450 ac_val -= 16;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2451 else //top
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2452 ac_val -= 16 * s->block_wrap[n];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2453
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2454 while (!last) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2455 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2456 i += skip;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2457 if(i > 63)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2458 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2459 block[zz_table[i++]] = value;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2460 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2461
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2462 /* apply AC prediction if needed */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2463 if(s->ac_pred) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2464 if(dc_pred_dir) { //left
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2465 for(k = 1; k < 8; k++)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2466 block[k << 3] += ac_val[k];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2467 } else { //top
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2468 for(k = 1; k < 8; k++)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2469 block[k] += ac_val[k + 8];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2470 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2471 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2472 /* save AC coeffs for further prediction */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2473 for(k = 1; k < 8; k++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2474 ac_val2[k] = block[k << 3];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2475 ac_val2[k + 8] = block[k];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2476 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2477
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2478 /* scale AC coeffs */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2479 for(k = 1; k < 64; k++)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2480 if(block[k]) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2481 block[k] *= scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2482 if(!v->pquantizer)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2483 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2484 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2485
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2486 if(s->ac_pred) i = 63;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2487 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2488
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2489 not_coded:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2490 if(!coded) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2491 int k, scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2492 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2493 ac_val2 = ac_val;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2494
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2495 scale = v->pq * 2 + v->halfpq;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2496 memset(ac_val2, 0, 16 * 2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2497 if(dc_pred_dir) {//left
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2498 ac_val -= 16;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2499 if(s->ac_pred)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2500 memcpy(ac_val2, ac_val, 8 * 2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2501 } else {//top
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2502 ac_val -= 16 * s->block_wrap[n];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2503 if(s->ac_pred)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2504 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2505 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2506
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2507 /* apply AC prediction if needed */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2508 if(s->ac_pred) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2509 if(dc_pred_dir) { //left
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2510 for(k = 1; k < 8; k++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2511 block[k << 3] = ac_val[k] * scale;
3509
da6095607f26 Don't do non-uniform quantization on zero coeffs.
kostya
parents: 3508
diff changeset
2512 if(!v->pquantizer && block[k << 3])
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2513 block[k << 3] += (block[k << 3] < 0) ? -v->pq : v->pq;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2514 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2515 } else { //top
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2516 for(k = 1; k < 8; k++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2517 block[k] = ac_val[k + 8] * scale;
3509
da6095607f26 Don't do non-uniform quantization on zero coeffs.
kostya
parents: 3508
diff changeset
2518 if(!v->pquantizer && block[k])
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2519 block[k] += (block[k] < 0) ? -v->pq : v->pq;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2520 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2521 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2522 i = 63;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2523 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2524 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2525 s->block_last_index[n] = i;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2526
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2527 return 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2528 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2529
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2530 /** Decode intra block in intra frames - should be faster than decode_intra_block
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2531 * @param v VC1Context
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2532 * @param block block to decode
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2533 * @param[in] n subblock number
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2534 * @param coded are AC coeffs present or not
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2535 * @param codingset set of VLC to decode data
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2536 * @param mquant quantizer value for this macroblock
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2537 */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2538 static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset, int mquant)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2539 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2540 GetBitContext *gb = &v->s.gb;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2541 MpegEncContext *s = &v->s;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2542 int dc_pred_dir = 0; /* Direction of the DC prediction used */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2543 int run_diff, i;
3781
8e79b099d354 dc_val should be signed
mru
parents: 3776
diff changeset
2544 int16_t *dc_val;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2545 int16_t *ac_val, *ac_val2;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2546 int dcdiff;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2547 int a_avail = v->a_avail, c_avail = v->c_avail;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2548 int use_pred = s->ac_pred;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2549 int scale;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2550 int q1, q2 = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2551 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2552
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2553 /* Get DC differential */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2554 if (n < 4) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2555 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2556 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2557 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2558 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2559 if (dcdiff < 0){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2560 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2561 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2562 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2563 if (dcdiff)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2564 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2565 if (dcdiff == 119 /* ESC index value */)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2566 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2567 /* TODO: Optimize */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2568 if (mquant == 1) dcdiff = get_bits(gb, 10);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2569 else if (mquant == 2) dcdiff = get_bits(gb, 9);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2570 else dcdiff = get_bits(gb, 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2571 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2572 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2573 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2574 if (mquant == 1)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2575 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2576 else if (mquant == 2)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2577 dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2578 }
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2579 if (get_bits1(gb))
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2580 dcdiff = -dcdiff;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2581 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2582
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2583 /* Prediction */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2584 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2585 *dc_val = dcdiff;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2586
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2587 /* Store the quantized DC coeff, used for prediction */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2588 if (n < 4) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2589 block[0] = dcdiff * s->y_dc_scale;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2590 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2591 block[0] = dcdiff * s->c_dc_scale;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2592 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2593 /* Skip ? */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2594 run_diff = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2595 i = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2596
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2597 //AC Decoding
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2598 i = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2599
5194
d09eaf79979c this prediction direction adjustment is wrong
kostya
parents: 5128
diff changeset
2600 /* check if AC is needed at all */
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2601 if(!a_avail && !c_avail) use_pred = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2602 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2603 ac_val2 = ac_val;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2604
5683
dbc41b5a10e7 HALFPQ should be used only for when PQUANT is selected
kostya
parents: 5682
diff changeset
2605 scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2606
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2607 if(dc_pred_dir) //left
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2608 ac_val -= 16;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2609 else //top
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2610 ac_val -= 16 * s->block_wrap[n];
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2611
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2612 q1 = s->current_picture.qscale_table[mb_pos];
4456
33f181383a21 Check for out-of-bounds access
kostya
parents: 4433
diff changeset
2613 if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1];
33f181383a21 Check for out-of-bounds access
kostya
parents: 4433
diff changeset
2614 if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
4724
ea97803884e1 1000l to myself - get correct quantization for blocks 1 and 2
kostya
parents: 4683
diff changeset
2615 if(dc_pred_dir && n==1) q2 = q1;
ea97803884e1 1000l to myself - get correct quantization for blocks 1 and 2
kostya
parents: 4683
diff changeset
2616 if(!dc_pred_dir && n==2) q2 = q1;
ea97803884e1 1000l to myself - get correct quantization for blocks 1 and 2
kostya
parents: 4683
diff changeset
2617 if(n==3) q2 = q1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2618
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2619 if(coded) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2620 int last = 0, skip, value;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2621 const int8_t *zz_table;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2622 int k;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2623
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2624 if(v->s.ac_pred) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2625 if(!dc_pred_dir)
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
2626 zz_table = wmv1_scantable[2];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2627 else
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
2628 zz_table = wmv1_scantable[3];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2629 } else
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
2630 zz_table = wmv1_scantable[1];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2631
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2632 while (!last) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2633 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2634 i += skip;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2635 if(i > 63)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2636 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2637 block[zz_table[i++]] = value;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2638 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2639
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2640 /* apply AC prediction if needed */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2641 if(use_pred) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2642 /* scale predictors if needed*/
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2643 if(q2 && q1!=q2) {
4236
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2644 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2645 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2646
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2647 if(dc_pred_dir) { //left
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2648 for(k = 1; k < 8; k++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2649 block[k << 3] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2650 } else { //top
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2651 for(k = 1; k < 8; k++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2652 block[k] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2653 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2654 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2655 if(dc_pred_dir) { //left
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2656 for(k = 1; k < 8; k++)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2657 block[k << 3] += ac_val[k];
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2658 } else { //top
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2659 for(k = 1; k < 8; k++)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2660 block[k] += ac_val[k + 8];
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2661 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2662 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2663 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2664 /* save AC coeffs for further prediction */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2665 for(k = 1; k < 8; k++) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2666 ac_val2[k] = block[k << 3];
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2667 ac_val2[k + 8] = block[k];
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2668 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2669
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2670 /* scale AC coeffs */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2671 for(k = 1; k < 64; k++)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2672 if(block[k]) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2673 block[k] *= scale;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2674 if(!v->pquantizer)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2675 block[k] += (block[k] < 0) ? -mquant : mquant;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2676 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2677
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2678 if(use_pred) i = 63;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2679 } else { // no AC coeffs
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2680 int k;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2681
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2682 memset(ac_val2, 0, 16 * 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2683 if(dc_pred_dir) {//left
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2684 if(use_pred) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2685 memcpy(ac_val2, ac_val, 8 * 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2686 if(q2 && q1!=q2) {
4236
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2687 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2688 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2689 for(k = 1; k < 8; k++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2690 ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2691 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2692 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2693 } else {//top
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2694 if(use_pred) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2695 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2696 if(q2 && q1!=q2) {
4236
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2697 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2698 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2699 for(k = 1; k < 8; k++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2700 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2701 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2702 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2703 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2704
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2705 /* apply AC prediction if needed */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2706 if(use_pred) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2707 if(dc_pred_dir) { //left
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2708 for(k = 1; k < 8; k++) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2709 block[k << 3] = ac_val2[k] * scale;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2710 if(!v->pquantizer && block[k << 3])
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2711 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2712 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2713 } else { //top
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2714 for(k = 1; k < 8; k++) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2715 block[k] = ac_val2[k + 8] * scale;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2716 if(!v->pquantizer && block[k])
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2717 block[k] += (block[k] < 0) ? -mquant : mquant;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2718 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2719 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2720 i = 63;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2721 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2722 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2723 s->block_last_index[n] = i;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2724
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2725 return 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2726 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
2727
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2728 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2729 * @param v VC1Context
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2730 * @param block block to decode
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
2731 * @param[in] n subblock index
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2732 * @param coded are AC coeffs present or not
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2733 * @param mquant block quantizer
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2734 * @param codingset set of VLC to decode data
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2735 */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2736 static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2737 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2738 GetBitContext *gb = &v->s.gb;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2739 MpegEncContext *s = &v->s;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2740 int dc_pred_dir = 0; /* Direction of the DC prediction used */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2741 int run_diff, i;
3781
8e79b099d354 dc_val should be signed
mru
parents: 3776
diff changeset
2742 int16_t *dc_val;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2743 int16_t *ac_val, *ac_val2;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2744 int dcdiff;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2745 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3364
59c10b66fbbc Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
kostya
parents: 3363
diff changeset
2746 int a_avail = v->a_avail, c_avail = v->c_avail;
3399
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2747 int use_pred = s->ac_pred;
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2748 int scale;
3429
fb2a69de8ded Enable coefficient scaling
kostya
parents: 3428
diff changeset
2749 int q1, q2 = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2750
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2751 /* XXX: Guard against dumb values of mquant */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2752 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant );
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2753
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2754 /* Set DC scale - y and c use the same */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2755 s->y_dc_scale = s->y_dc_scale_table[mquant];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2756 s->c_dc_scale = s->c_dc_scale_table[mquant];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2757
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2758 /* Get DC differential */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2759 if (n < 4) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2760 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2761 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2762 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2763 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2764 if (dcdiff < 0){
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2765 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2766 return -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2767 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2768 if (dcdiff)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2769 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2770 if (dcdiff == 119 /* ESC index value */)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2771 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2772 /* TODO: Optimize */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2773 if (mquant == 1) dcdiff = get_bits(gb, 10);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2774 else if (mquant == 2) dcdiff = get_bits(gb, 9);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2775 else dcdiff = get_bits(gb, 8);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2776 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2777 else
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2778 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2779 if (mquant == 1)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2780 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2781 else if (mquant == 2)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2782 dcdiff = (dcdiff<<1) + get_bits1(gb) - 1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2783 }
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
2784 if (get_bits1(gb))
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2785 dcdiff = -dcdiff;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2786 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2787
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2788 /* Prediction */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2789 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2790 *dc_val = dcdiff;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2791
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2792 /* Store the quantized DC coeff, used for prediction */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2793
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2794 if (n < 4) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2795 block[0] = dcdiff * s->y_dc_scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2796 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2797 block[0] = dcdiff * s->c_dc_scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2798 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2799 /* Skip ? */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2800 run_diff = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2801 i = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2802
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2803 //AC Decoding
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2804 i = 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2805
3399
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2806 /* check if AC is needed at all and adjust direction if needed */
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2807 if(!a_avail) dc_pred_dir = 1;
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2808 if(!c_avail) dc_pred_dir = 0;
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2809 if(!a_avail && !c_avail) use_pred = 0;
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2810 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2811 ac_val2 = ac_val;
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2812
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
2813 scale = mquant * 2 + v->halfpq;
3399
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2814
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2815 if(dc_pred_dir) //left
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2816 ac_val -= 16;
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2817 else //top
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2818 ac_val -= 16 * s->block_wrap[n];
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2819
3429
fb2a69de8ded Enable coefficient scaling
kostya
parents: 3428
diff changeset
2820 q1 = s->current_picture.qscale_table[mb_pos];
4303
7e907f7d6a21 Check mb_pos is big enough before trying to access data left or above.
reimar
parents: 4283
diff changeset
2821 if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1];
7e907f7d6a21 Check mb_pos is big enough before trying to access data left or above.
reimar
parents: 4283
diff changeset
2822 if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
4724
ea97803884e1 1000l to myself - get correct quantization for blocks 1 and 2
kostya
parents: 4683
diff changeset
2823 if(dc_pred_dir && n==1) q2 = q1;
ea97803884e1 1000l to myself - get correct quantization for blocks 1 and 2
kostya
parents: 4683
diff changeset
2824 if(!dc_pred_dir && n==2) q2 = q1;
ea97803884e1 1000l to myself - get correct quantization for blocks 1 and 2
kostya
parents: 4683
diff changeset
2825 if(n==3) q2 = q1;
3429
fb2a69de8ded Enable coefficient scaling
kostya
parents: 3428
diff changeset
2826
3399
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2827 if(coded) {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2828 int last = 0, skip, value;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2829 const int8_t *zz_table;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2830 int k;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2831
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
2832 zz_table = wmv1_scantable[0];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2833
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2834 while (!last) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2835 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2836 i += skip;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2837 if(i > 63)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2838 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2839 block[zz_table[i++]] = value;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2840 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2841
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2842 /* apply AC prediction if needed */
3378
d7dda9fd99c8 Adjust AC prediction if (some) predictors are not available.
kostya
parents: 3377
diff changeset
2843 if(use_pred) {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2844 /* scale predictors if needed*/
3429
fb2a69de8ded Enable coefficient scaling
kostya
parents: 3428
diff changeset
2845 if(q2 && q1!=q2) {
4236
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2846 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2847 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2848
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2849 if(dc_pred_dir) { //left
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2850 for(k = 1; k < 8; k++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2851 block[k << 3] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2852 } else { //top
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2853 for(k = 1; k < 8; k++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2854 block[k] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2855 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2856 } else {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2857 if(dc_pred_dir) { //left
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2858 for(k = 1; k < 8; k++)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2859 block[k << 3] += ac_val[k];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2860 } else { //top
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2861 for(k = 1; k < 8; k++)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2862 block[k] += ac_val[k + 8];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2863 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2864 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2865 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2866 /* save AC coeffs for further prediction */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2867 for(k = 1; k < 8; k++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2868 ac_val2[k] = block[k << 3];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2869 ac_val2[k + 8] = block[k];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2870 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2871
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2872 /* scale AC coeffs */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2873 for(k = 1; k < 64; k++)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2874 if(block[k]) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2875 block[k] *= scale;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2876 if(!v->pquantizer)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2877 block[k] += (block[k] < 0) ? -mquant : mquant;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2878 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2879
3378
d7dda9fd99c8 Adjust AC prediction if (some) predictors are not available.
kostya
parents: 3377
diff changeset
2880 if(use_pred) i = 63;
3399
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2881 } else { // no AC coeffs
3c6f5d05560d vc1_decode_intra_block() simplifications and corrections
kostya
parents: 3396
diff changeset
2882 int k;
3378
d7dda9fd99c8 Adjust AC prediction if (some) predictors are not available.
kostya
parents: 3377
diff changeset
2883
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2884 memset(ac_val2, 0, 16 * 2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2885 if(dc_pred_dir) {//left
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2886 if(use_pred) {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2887 memcpy(ac_val2, ac_val, 8 * 2);
3429
fb2a69de8ded Enable coefficient scaling
kostya
parents: 3428
diff changeset
2888 if(q2 && q1!=q2) {
4236
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2889 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2890 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2891 for(k = 1; k < 8; k++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2892 ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2893 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2894 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2895 } else {//top
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2896 if(use_pred) {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2897 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
3429
fb2a69de8ded Enable coefficient scaling
kostya
parents: 3428
diff changeset
2898 if(q2 && q1!=q2) {
4236
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2899 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
aee20d5bd41f Use halfpq in coefficient scaling
kostya
parents: 4209
diff changeset
2900 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2901 for(k = 1; k < 8; k++)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2902 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2903 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2904 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2905 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2906
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2907 /* apply AC prediction if needed */
3378
d7dda9fd99c8 Adjust AC prediction if (some) predictors are not available.
kostya
parents: 3377
diff changeset
2908 if(use_pred) {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2909 if(dc_pred_dir) { //left
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2910 for(k = 1; k < 8; k++) {
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2911 block[k << 3] = ac_val2[k] * scale;
3509
da6095607f26 Don't do non-uniform quantization on zero coeffs.
kostya
parents: 3508
diff changeset
2912 if(!v->pquantizer && block[k << 3])
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2913 block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2914 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2915 } else { //top
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2916 for(k = 1; k < 8; k++) {
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
2917 block[k] = ac_val2[k + 8] * scale;
3509
da6095607f26 Don't do non-uniform quantization on zero coeffs.
kostya
parents: 3508
diff changeset
2918 if(!v->pquantizer && block[k])
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2919 block[k] += (block[k] < 0) ? -mquant : mquant;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2920 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2921 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2922 i = 63;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2923 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
2924 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2925 s->block_last_index[n] = i;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2926
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2927 return 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2928 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2929
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2930 /** Decode P block
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2931 */
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5964
diff changeset
2932 static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block,
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
2933 uint8_t *dst, int linesize, int skip_block, int apply_filter, int cbp_top, int cbp_left)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2934 {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2935 MpegEncContext *s = &v->s;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2936 GetBitContext *gb = &s->gb;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2937 int i, j;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2938 int subblkpat = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2939 int scale, off, idx, last, skip, value;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2940 int ttblk = ttmb & 7;
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
2941 int pat = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2942
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2943 if(ttmb == -1) {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2944 ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2945 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2946 if(ttblk == TT_4X4) {
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
2947 subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2948 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2949 if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2950 subblkpat = decode012(gb);
3364
59c10b66fbbc Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
kostya
parents: 3363
diff changeset
2951 if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2952 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2953 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2954 }
4948
74caff45a271 Use correct dequantizer value
kostya
parents: 4929
diff changeset
2955 scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2956
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2957 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2958 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
3377
dc4813852345 0xFFFF l of cola. Now P-frames are decoded almost without distortions.
kostya
parents: 3376
diff changeset
2959 subblkpat = 2 - (ttblk == TT_8X4_TOP);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2960 ttblk = TT_8X4;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2961 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2962 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
3377
dc4813852345 0xFFFF l of cola. Now P-frames are decoded almost without distortions.
kostya
parents: 3376
diff changeset
2963 subblkpat = 2 - (ttblk == TT_4X8_LEFT);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2964 ttblk = TT_4X8;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2965 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2966 switch(ttblk) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2967 case TT_8X8:
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
2968 pat = 0xF;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2969 i = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2970 last = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2971 while (!last) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2972 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2973 i += skip;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2974 if(i > 63)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2975 break;
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 7040
diff changeset
2976 idx = wmv1_scantable[0][i++];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2977 block[idx] = value * scale;
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
2978 if(!v->pquantizer)
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
2979 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2980 }
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5964
diff changeset
2981 if(!skip_block){
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5964
diff changeset
2982 s->dsp.vc1_inv_trans_8x8(block);
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5964
diff changeset
2983 s->dsp.add_pixels_clamped(block, dst, linesize);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
2984 if(apply_filter && cbp_top & 0xC)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
2985 s->dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
2986 if(apply_filter && cbp_left & 0xA)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
2987 s->dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5964
diff changeset
2988 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2989 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2990 case TT_4X4:
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
2991 pat = ~subblkpat & 0xF;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2992 for(j = 0; j < 4; j++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2993 last = subblkpat & (1 << (3 - j));
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2994 i = 0;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
2995 off = (j & 1) * 4 + (j & 2) * 16;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2996 while (!last) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2997 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2998 i += skip;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
2999 if(i > 15)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3000 break;
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
3001 idx = ff_vc1_simple_progressive_4x4_zz[i++];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3002 block[idx + off] = value * scale;
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
3003 if(!v->pquantizer)
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
3004 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3005 }
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3006 if(!(subblkpat & (1 << (3 - j))) && !skip_block){
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5964
diff changeset
3007 s->dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3008 if(apply_filter && (j&2 ? pat & (1<<(j-2)) : (cbp_top & (1 << (j + 2)))))
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3009 s->dsp.vc1_v_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3010 if(apply_filter && (j&1 ? pat & (1<<(j-1)) : (cbp_left & (1 << (j + 1)))))
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3011 s->dsp.vc1_h_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3012 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3013 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3014 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3015 case TT_8X4:
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3016 pat = ~((subblkpat & 2)*6 + (subblkpat & 1)*3) & 0xF;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3017 for(j = 0; j < 2; j++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3018 last = subblkpat & (1 << (1 - j));
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3019 i = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3020 off = j * 32;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3021 while (!last) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3022 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3023 i += skip;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3024 if(i > 31)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3025 break;
6145
ddf5d7fae101 Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents: 6099
diff changeset
3026 idx = v->zz_8x4[i++]+off;
ddf5d7fae101 Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents: 6099
diff changeset
3027 block[idx] = value * scale;
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
3028 if(!v->pquantizer)
6145
ddf5d7fae101 Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents: 6099
diff changeset
3029 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3030 }
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3031 if(!(subblkpat & (1 << (1 - j))) && !skip_block){
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5964
diff changeset
3032 s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3033 if(apply_filter && j ? pat & 0x3 : (cbp_top & 0xC))
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3034 s->dsp.vc1_v_loop_filter8(dst + j*4*linesize, linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3035 if(apply_filter && cbp_left & (2 << j))
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3036 s->dsp.vc1_h_loop_filter4(dst + j*4*linesize, linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3037 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3038 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3039 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3040 case TT_4X8:
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3041 pat = ~(subblkpat*5) & 0xF;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3042 for(j = 0; j < 2; j++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3043 last = subblkpat & (1 << (1 - j));
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3044 i = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3045 off = j * 4;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3046 while (!last) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3047 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3048 i += skip;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3049 if(i > 31)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3050 break;
6145
ddf5d7fae101 Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents: 6099
diff changeset
3051 idx = v->zz_4x8[i++]+off;
ddf5d7fae101 Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents: 6099
diff changeset
3052 block[idx] = value * scale;
3475
4e06affe9974 Correct inverse quantization for P-frames
kostya
parents: 3474
diff changeset
3053 if(!v->pquantizer)
6145
ddf5d7fae101 Select scan tables for 8x4 and 4x8 blocks only once.
kostya
parents: 6099
diff changeset
3054 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3055 }
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3056 if(!(subblkpat & (1 << (1 - j))) && !skip_block){
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5964
diff changeset
3057 s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3058 if(apply_filter && cbp_top & (2 << j))
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3059 s->dsp.vc1_v_loop_filter4(dst + j*4, linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3060 if(apply_filter && j ? pat & 0x5 : (cbp_left & 0xA))
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3061 s->dsp.vc1_h_loop_filter8(dst + j*4, linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3062 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3063 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3064 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3065 }
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3066 return pat;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3067 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3068
8685
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
3069 /** @} */ // Macroblock group
ed386fa1399e Fix Doxygen comments for VC-1 decoder.
kostya
parents: 8645
diff changeset
3070
8645
ead59531f24a avoid duplication of size_table and offset_table
stefang
parents: 8640
diff changeset
3071 static const int size_table [6] = { 0, 2, 3, 4, 5, 8 };
ead59531f24a avoid duplication of size_table and offset_table
stefang
parents: 8640
diff changeset
3072 static const int offset_table[6] = { 0, 1, 3, 7, 15, 31 };
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3073
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3074 /** Decode one P-frame MB (in Simple/Main profile)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3075 */
3476
33a177588139 Don't pass block[6][64] parameter to decode_p_mb as we always use s->block
kostya
parents: 3475
diff changeset
3076 static int vc1_decode_p_mb(VC1Context *v)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3077 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3078 MpegEncContext *s = &v->s;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3079 GetBitContext *gb = &s->gb;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3080 int i, j;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3081 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3082 int cbp; /* cbp decoding stuff */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3083 int mqdiff, mquant; /* MB quantization */
3405
58c4fd135462 Correctly choose global transform mode, MV mode and fix bitplane decoding
kostya
parents: 3404
diff changeset
3084 int ttmb = v->ttfrm; /* MB Transform type */
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3085
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3086 int mb_has_coeffs = 1; /* last_flag */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3087 int dmv_x, dmv_y; /* Differential MV components */
6903
0f63fc62ea8b consistency cosmetics: indices --> indexes
diego
parents: 6712
diff changeset
3088 int index, index1; /* LUT indexes */
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3089 int val, sign; /* temp values */
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3090 int first_block = 1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3091 int dst_idx, off;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3092 int skipped, fourmv;
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3093 int block_cbp = 0, pat;
7846
a7162bb60138 Make it possible to disable loop filter in VC-1.
kostya
parents: 7429
diff changeset
3094 int apply_loop_filter;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3095
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3096 mquant = v->pq; /* Loosy initialization */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3097
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3098 if (v->mv_type_is_raw)
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3099 fourmv = get_bits1(gb);
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3100 else
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3101 fourmv = v->mv_type_mb_plane[mb_pos];
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3102 if (v->skip_is_raw)
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3103 skipped = get_bits1(gb);
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3104 else
3375
a1c2e1603be9 Use MpegEncContext->mbskip_table instead of custom bitplane.
kostya
parents: 3371
diff changeset
3105 skipped = v->s.mbskip_table[mb_pos];
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3106
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3107 s->dsp.clear_blocks(s->block[0]);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3108
7846
a7162bb60138 Make it possible to disable loop filter in VC-1.
kostya
parents: 7429
diff changeset
3109 apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3110 if (!fourmv) /* 1MV mode */
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3111 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3112 if (!skipped)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3113 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3114 GET_MVDATA(dmv_x, dmv_y);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3115
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3116 if (s->mb_intra) {
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3117 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3118 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3119 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3120 s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3121 vc1_pred_mv(s, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3122
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3123 /* FIXME Set DC val for inter block ? */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3124 if (s->mb_intra && !mb_has_coeffs)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3125 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3126 GET_MQUANT();
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
3127 s->ac_pred = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3128 cbp = 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3129 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3130 else if (mb_has_coeffs)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3131 {
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
3132 if (s->mb_intra) s->ac_pred = get_bits1(gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3133 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3134 GET_MQUANT();
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3135 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3136 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3137 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3138 mquant = v->pq;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3139 cbp = 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3140 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3141 s->current_picture.qscale_table[mb_pos] = mquant;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3142
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3143 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
3144 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3145 VC1_TTMB_VLC_BITS, 2);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3146 if(!s->mb_intra) vc1_mc_1mv(v, 0);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3147 dst_idx = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3148 for (i=0; i<6; i++)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3149 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3150 s->dc_val[0][s->block_index[i]] = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3151 dst_idx += i >> 2;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3152 val = ((cbp >> (5 - i)) & 1);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3153 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3154 v->mb_type[0][s->block_index[i]] = s->mb_intra;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3155 if(s->mb_intra) {
3364
59c10b66fbbc Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
kostya
parents: 3363
diff changeset
3156 /* check if prediction blocks A and C are available */
59c10b66fbbc Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
kostya
parents: 3363
diff changeset
3157 v->a_avail = v->c_avail = 0;
3449
ec6096b1ab04 Use s->first_slice_line in checks instead of s->mb_y
kostya
parents: 3430
diff changeset
3158 if(i == 2 || i == 3 || !s->first_slice_line)
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3159 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3160 if(i == 1 || i == 3 || s->mb_x)
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3161 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3364
59c10b66fbbc Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
kostya
parents: 3363
diff changeset
3162
3476
33a177588139 Don't pass block[6][64] parameter to decode_p_mb as we always use s->block
kostya
parents: 3475
diff changeset
3163 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
3164 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3527
3187e7ffe52d Use functions from DSPContext in vc1.c
kostya
parents: 3523
diff changeset
3165 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
3166 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
5921
afcd3b752f95 Use put_signed_pixels_clamped where appropriate
kostya
parents: 5905
diff changeset
3167 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3168 if(v->pq >= 9 && v->overlap) {
4209
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3169 if(v->c_avail)
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3170 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3171 if(v->a_avail)
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3172 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3173 }
7846
a7162bb60138 Make it possible to disable loop filter in VC-1.
kostya
parents: 7429
diff changeset
3174 if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3175 int left_cbp, top_cbp;
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3176 if(i & 4){
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3177 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3178 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3179 }else{
8582
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3180 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3181 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3182 }
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3183 if(left_cbp & 0xC)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3184 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3185 if(top_cbp & 0xA)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3186 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3187 }
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3188 block_cbp |= 0xF << (i << 2);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3189 } else if(val) {
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3190 int left_cbp = 0, top_cbp = 0, filter = 0;
7846
a7162bb60138 Make it possible to disable loop filter in VC-1.
kostya
parents: 7429
diff changeset
3191 if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3192 filter = 1;
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3193 if(i & 4){
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3194 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3195 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3196 }else{
8582
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3197 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3198 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3199 }
8582
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3200 if(left_cbp & 0xC)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3201 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
8582
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3202 if(top_cbp & 0xA)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3203 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3204 }
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3205 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3206 block_cbp |= pat << (i << 2);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3207 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3208 first_block = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3209 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3210 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3211 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3212 else //Skipped
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3213 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3214 s->mb_intra = 0;
3507
44e0a262d500 Set DC = 0 for skipped MB as it interferes DC prediction
kostya
parents: 3506
diff changeset
3215 for(i = 0; i < 6; i++) {
44e0a262d500 Set DC = 0 for skipped MB as it interferes DC prediction
kostya
parents: 3506
diff changeset
3216 v->mb_type[0][s->block_index[i]] = 0;
44e0a262d500 Set DC = 0 for skipped MB as it interferes DC prediction
kostya
parents: 3506
diff changeset
3217 s->dc_val[0][s->block_index[i]] = 0;
44e0a262d500 Set DC = 0 for skipped MB as it interferes DC prediction
kostya
parents: 3506
diff changeset
3218 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3219 s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3220 s->current_picture.qscale_table[mb_pos] = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3221 vc1_pred_mv(s, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3222 vc1_mc_1mv(v, 0);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3223 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3224 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3225 } //1MV mode
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3226 else //4MV mode
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3227 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3228 if (!skipped /* unskipped MB */)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3229 {
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3230 int intra_count = 0, coded_inter = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3231 int is_intra[6], is_coded[6];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3232 /* Get CBPCY */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3233 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3234 for (i=0; i<6; i++)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3235 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3236 val = ((cbp >> (5 - i)) & 1);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3237 s->dc_val[0][s->block_index[i]] = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3238 s->mb_intra = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3239 if(i < 4) {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3240 dmv_x = dmv_y = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3241 s->mb_intra = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3242 mb_has_coeffs = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3243 if(val) {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3244 GET_MVDATA(dmv_x, dmv_y);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3245 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3246 vc1_pred_mv(s, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3247 if(!s->mb_intra) vc1_mc_4mv_luma(v, i);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3248 intra_count += s->mb_intra;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3249 is_intra[i] = s->mb_intra;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3250 is_coded[i] = mb_has_coeffs;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3251 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3252 if(i&4){
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3253 is_intra[i] = (intra_count >= 3);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3254 is_coded[i] = val;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3255 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3256 if(i == 4) vc1_mc_4mv_chroma(v);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3257 v->mb_type[0][s->block_index[i]] = is_intra[i];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3258 if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i];
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3259 }
3453
e3f5377bddb2 Check if 4-MV MB should not be decoded.
kostya
parents: 3452
diff changeset
3260 // if there are no coded blocks then don't do anything more
3514
db3335b2b8f1 Some fixes for decode_p_mb()
kostya
parents: 3513
diff changeset
3261 if(!intra_count && !coded_inter) return 0;
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3262 dst_idx = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3263 GET_MQUANT();
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3264 s->current_picture.qscale_table[mb_pos] = mquant;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3265 /* test if block is intra and has pred */
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3266 {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3267 int intrapred = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3268 for(i=0; i<6; i++)
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3269 if(is_intra[i]) {
3449
ec6096b1ab04 Use s->first_slice_line in checks instead of s->mb_y
kostya
parents: 3430
diff changeset
3270 if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
ec6096b1ab04 Use s->first_slice_line in checks instead of s->mb_y
kostya
parents: 3430
diff changeset
3271 || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) {
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3272 intrapred = 1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3273 break;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3274 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3275 }
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
3276 if(intrapred)s->ac_pred = get_bits1(gb);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3277 else s->ac_pred = 0;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3278 }
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3279 if (!v->ttmbf && coded_inter)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
3280 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3281 for (i=0; i<6; i++)
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3282 {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3283 dst_idx += i >> 2;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3284 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3285 s->mb_intra = is_intra[i];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3286 if (is_intra[i]) {
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3287 /* check if prediction blocks A and C are available */
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3288 v->a_avail = v->c_avail = 0;
3449
ec6096b1ab04 Use s->first_slice_line in checks instead of s->mb_y
kostya
parents: 3430
diff changeset
3289 if(i == 2 || i == 3 || !s->first_slice_line)
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3290 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3291 if(i == 1 || i == 3 || s->mb_x)
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3292 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3293
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3294 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
3295 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3527
3187e7ffe52d Use functions from DSPContext in vc1.c
kostya
parents: 3523
diff changeset
3296 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
3297 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
5921
afcd3b752f95 Use put_signed_pixels_clamped where appropriate
kostya
parents: 5905
diff changeset
3298 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3299 if(v->pq >= 9 && v->overlap) {
4209
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3300 if(v->c_avail)
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3301 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3302 if(v->a_avail)
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3303 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3304 }
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3305 if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3306 int left_cbp, top_cbp;
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3307 if(i & 4){
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3308 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3309 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3310 }else{
8582
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3311 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3312 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3313 }
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3314 if(left_cbp & 0xC)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3315 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3316 if(top_cbp & 0xA)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3317 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3318 }
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3319 block_cbp |= 0xF << (i << 2);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3320 } else if(is_coded[i]) {
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3321 int left_cbp = 0, top_cbp = 0, filter = 0;
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3322 if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3323 filter = 1;
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3324 if(i & 4){
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3325 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3326 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3327 }else{
8582
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3328 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3329 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3330 }
8582
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3331 if(left_cbp & 0xC)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3332 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
8582
2624a270ef12 421l: fix loop filter for P-frames in VC-1
kostya
parents: 8560
diff changeset
3333 if(top_cbp & 0xA)
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3334 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3335 }
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3336 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3337 block_cbp |= pat << (i << 2);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3338 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3339 first_block = 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3340 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3341 }
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3342 return 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3343 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3344 else //Skipped MB
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3345 {
3400
84de54d536bd 4-MV mode final fixes (now it works for non-exotic modes)
kostya
parents: 3399
diff changeset
3346 s->mb_intra = 0;
3514
db3335b2b8f1 Some fixes for decode_p_mb()
kostya
parents: 3513
diff changeset
3347 s->current_picture.qscale_table[mb_pos] = 0;
3507
44e0a262d500 Set DC = 0 for skipped MB as it interferes DC prediction
kostya
parents: 3506
diff changeset
3348 for (i=0; i<6; i++) {
44e0a262d500 Set DC = 0 for skipped MB as it interferes DC prediction
kostya
parents: 3506
diff changeset
3349 v->mb_type[0][s->block_index[i]] = 0;
44e0a262d500 Set DC = 0 for skipped MB as it interferes DC prediction
kostya
parents: 3506
diff changeset
3350 s->dc_val[0][s->block_index[i]] = 0;
44e0a262d500 Set DC = 0 for skipped MB as it interferes DC prediction
kostya
parents: 3506
diff changeset
3351 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3352 for (i=0; i<4; i++)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3353 {
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3354 vc1_pred_mv(s, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0]);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3355 vc1_mc_4mv_luma(v, i);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3356 }
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3357 vc1_mc_4mv_chroma(v);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
3358 s->current_picture.qscale_table[mb_pos] = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3359 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3360 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3361 }
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3362 v->cbp[s->mb_x] = block_cbp;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3363
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3364 /* Should never happen */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3365 return -1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3366 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3367
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3368 /** Decode one B-frame MB (in Main profile)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3369 */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3370 static void vc1_decode_b_mb(VC1Context *v)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3371 {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3372 MpegEncContext *s = &v->s;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3373 GetBitContext *gb = &s->gb;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3374 int i, j;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3375 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
3376 int cbp = 0; /* cbp decoding stuff */
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3377 int mqdiff, mquant; /* MB quantization */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3378 int ttmb = v->ttfrm; /* MB Transform type */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3379 int mb_has_coeffs = 0; /* last_flag */
6903
0f63fc62ea8b consistency cosmetics: indices --> indexes
diego
parents: 6712
diff changeset
3380 int index, index1; /* LUT indexes */
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3381 int val, sign; /* temp values */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3382 int first_block = 1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3383 int dst_idx, off;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3384 int skipped, direct;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3385 int dmv_x[2], dmv_y[2];
3690
35aae593db08 [Cosmetics] Remove some done TODOs/FIXMEs from comments
kostya
parents: 3689
diff changeset
3386 int bmvtype = BMV_TYPE_BACKWARD;
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3387
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3388 mquant = v->pq; /* Loosy initialization */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3389 s->mb_intra = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3390
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3391 if (v->dmb_is_raw)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3392 direct = get_bits1(gb);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3393 else
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3394 direct = v->direct_mb_plane[mb_pos];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3395 if (v->skip_is_raw)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3396 skipped = get_bits1(gb);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3397 else
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3398 skipped = v->s.mbskip_table[mb_pos];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3399
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3400 s->dsp.clear_blocks(s->block[0]);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3401 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3402 for(i = 0; i < 6; i++) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3403 v->mb_type[0][s->block_index[i]] = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3404 s->dc_val[0][s->block_index[i]] = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3405 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3406 s->current_picture.qscale_table[mb_pos] = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3407
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3408 if (!direct) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3409 if (!skipped) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3410 GET_MVDATA(dmv_x[0], dmv_y[0]);
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
3411 dmv_x[1] = dmv_x[0];
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
3412 dmv_y[1] = dmv_y[0];
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3413 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3414 if(skipped || !s->mb_intra) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3415 bmvtype = decode012(gb);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3416 switch(bmvtype) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3417 case 0:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3418 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3419 break;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3420 case 1:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3421 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3422 break;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3423 case 2:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3424 bmvtype = BMV_TYPE_INTERPOLATED;
3743
fc613a610303 Reorder MV order in B-frames so no swapping in vc1_b_mc() is needed
kostya
parents: 3711
diff changeset
3425 dmv_x[0] = dmv_y[0] = 0;
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3426 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3427 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3428 }
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3429 for(i = 0; i < 6; i++)
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3430 v->mb_type[0][s->block_index[i]] = s->mb_intra;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3431
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3432 if (skipped) {
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3433 if(direct) bmvtype = BMV_TYPE_INTERPOLATED;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3434 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3435 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3436 return;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3437 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3438 if (direct) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3439 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3440 GET_MQUANT();
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
3441 s->mb_intra = 0;
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
3442 mb_has_coeffs = 0;
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3443 s->current_picture.qscale_table[mb_pos] = mquant;
3553
a542b0325239 Correct MC for B-frames and some improvements (not 100% complete though)
kostya
parents: 3552
diff changeset
3444 if(!v->ttmbf)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
3445 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3446 dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3447 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3448 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3449 } else {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3450 if(!mb_has_coeffs && !s->mb_intra) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3451 /* no coded blocks - effectively skipped */
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3452 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3453 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3454 return;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3455 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3456 if(s->mb_intra && !mb_has_coeffs) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3457 GET_MQUANT();
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3458 s->current_picture.qscale_table[mb_pos] = mquant;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3459 s->ac_pred = get_bits1(gb);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3460 cbp = 0;
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3461 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3462 } else {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3463 if(bmvtype == BMV_TYPE_INTERPOLATED) {
3743
fc613a610303 Reorder MV order in B-frames so no swapping in vc1_b_mc() is needed
kostya
parents: 3711
diff changeset
3464 GET_MVDATA(dmv_x[0], dmv_y[0]);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3465 if(!mb_has_coeffs) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3466 /* interpolated skipped block */
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3467 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3468 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3469 return;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3470 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3471 }
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3472 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3473 if(!s->mb_intra) {
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3474 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
3689
6d9e8253da2a Proper support for B/BI frames
kostya
parents: 3672
diff changeset
3475 }
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3476 if(s->mb_intra)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3477 s->ac_pred = get_bits1(gb);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3478 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3479 GET_MQUANT();
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3480 s->current_picture.qscale_table[mb_pos] = mquant;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3481 if(!v->ttmbf && !s->mb_intra && mb_has_coeffs)
4949
845386be542c Add ff_ prefix to (externally) visible variables
kostya
parents: 4948
diff changeset
3482 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3483 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3484 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3485 dst_idx = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3486 for (i=0; i<6; i++)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3487 {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3488 s->dc_val[0][s->block_index[i]] = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3489 dst_idx += i >> 2;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3490 val = ((cbp >> (5 - i)) & 1);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3491 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3492 v->mb_type[0][s->block_index[i]] = s->mb_intra;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3493 if(s->mb_intra) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3494 /* check if prediction blocks A and C are available */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3495 v->a_avail = v->c_avail = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3496 if(i == 2 || i == 3 || !s->first_slice_line)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3497 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3498 if(i == 1 || i == 3 || s->mb_x)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3499 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3500
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3501 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
3502 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3527
3187e7ffe52d Use functions from DSPContext in vc1.c
kostya
parents: 3523
diff changeset
3503 s->dsp.vc1_inv_trans_8x8(s->block[i]);
3522
5de1edac254e Support range reduced frames
kostya
parents: 3521
diff changeset
3504 if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
5921
afcd3b752f95 Use put_signed_pixels_clamped where appropriate
kostya
parents: 5905
diff changeset
3505 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3506 } else if(val) {
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3507 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), 0, 0, 0);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3508 if(!v->ttmbf && ttmb < 8) ttmb = -1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3509 first_block = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3510 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3511 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3512 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3513
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3514 /** Decode blocks of I-frame
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3515 */
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3516 static void vc1_decode_i_blocks(VC1Context *v)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3517 {
3450
906c58dcb6ea Use overlap filter instead of loop filter.
kostya
parents: 3449
diff changeset
3518 int k, j;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3519 MpegEncContext *s = &v->s;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3520 int cbp, val;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3521 uint8_t *coded_val;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3522 int mb_pos;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3523
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3524 /* select codingmode used for VLC tables selection */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3525 switch(v->y_ac_table_index){
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3526 case 0:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3527 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3528 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3529 case 1:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3530 v->codingset = CS_HIGH_MOT_INTRA;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3531 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3532 case 2:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3533 v->codingset = CS_MID_RATE_INTRA;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3534 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3535 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3536
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3537 switch(v->c_ac_table_index){
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3538 case 0:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3539 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3540 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3541 case 1:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3542 v->codingset2 = CS_HIGH_MOT_INTER;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3543 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3544 case 2:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3545 v->codingset2 = CS_MID_RATE_INTER;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3546 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3547 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3548
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3549 /* Set DC scale - y and c use the same */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3550 s->y_dc_scale = s->y_dc_scale_table[v->pq];
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3551 s->c_dc_scale = s->c_dc_scale_table[v->pq];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3552
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3553 //do frame decode
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3554 s->mb_x = s->mb_y = 0;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3555 s->mb_intra = 1;
3449
ec6096b1ab04 Use s->first_slice_line in checks instead of s->mb_y
kostya
parents: 3430
diff changeset
3556 s->first_slice_line = 1;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3557 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3558 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3559 ff_init_block_index(s);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3560 ff_update_block_index(s);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3561 s->dsp.clear_blocks(s->block[0]);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3562 mb_pos = s->mb_x + s->mb_y * s->mb_width;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3563 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3564 s->current_picture.qscale_table[mb_pos] = v->pq;
3710
08280665be40 Set motion vectors used in B-frames to zero by default
kostya
parents: 3709
diff changeset
3565 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
08280665be40 Set motion vectors used in B-frames to zero by default
kostya
parents: 3709
diff changeset
3566 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3567
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3568 // do actual MB decoding and displaying
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3569 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
3570 v->s.ac_pred = get_bits1(&v->s.gb);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3571
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3572 for(k = 0; k < 6; k++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3573 val = ((cbp >> (5 - k)) & 1);
3364
59c10b66fbbc Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
kostya
parents: 3363
diff changeset
3574
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3575 if (k < 4) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3576 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3577 val = val ^ pred;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3578 *coded_val = val;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3579 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3580 cbp |= val << (5 - k);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3581
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3582 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3583
3527
3187e7ffe52d Use functions from DSPContext in vc1.c
kostya
parents: 3523
diff changeset
3584 s->dsp.vc1_inv_trans_8x8(s->block[k]);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3585 if(v->pq >= 9 && v->overlap) {
3450
906c58dcb6ea Use overlap filter instead of loop filter.
kostya
parents: 3449
diff changeset
3586 for(j = 0; j < 64; j++) s->block[k][j] += 128;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3587 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3588 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3589
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3590 vc1_put_block(v, s->block);
3690
35aae593db08 [Cosmetics] Remove some done TODOs/FIXMEs from comments
kostya
parents: 3689
diff changeset
3591 if(v->pq >= 9 && v->overlap) {
4209
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3592 if(s->mb_x) {
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3593 s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3594 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
4209
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3595 if(!(s->flags & CODEC_FLAG_GRAY)) {
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3596 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3597 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
4209
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3598 }
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3599 }
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3600 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3601 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3450
906c58dcb6ea Use overlap filter instead of loop filter.
kostya
parents: 3449
diff changeset
3602 if(!s->first_slice_line) {
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3603 s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3604 s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
3605 if(!(s->flags & CODEC_FLAG_GRAY)) {
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3606 s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3607 s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
3608 }
3364
59c10b66fbbc Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
kostya
parents: 3363
diff changeset
3609 }
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3610 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3611 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3364
59c10b66fbbc Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
kostya
parents: 3363
diff changeset
3612 }
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3613 if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3614
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3615 if(get_bits_count(&s->gb) > v->bits) {
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
3616 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3617 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3618 return;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3619 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3620 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3621 ff_draw_horiz_band(s, s->mb_y * 16, 16);
3449
ec6096b1ab04 Use s->first_slice_line in checks instead of s->mb_y
kostya
parents: 3430
diff changeset
3622 s->first_slice_line = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3623 }
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
3624 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3625 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3626
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3627 /** Decode blocks of I-frame for advanced profile
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3628 */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3629 static void vc1_decode_i_blocks_adv(VC1Context *v)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3630 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3631 int k, j;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3632 MpegEncContext *s = &v->s;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3633 int cbp, val;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3634 uint8_t *coded_val;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3635 int mb_pos;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3636 int mquant = v->pq;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3637 int mqdiff;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3638 int overlap;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3639 GetBitContext *gb = &s->gb;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3640
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3641 /* select codingmode used for VLC tables selection */
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3642 switch(v->y_ac_table_index){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3643 case 0:
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3644 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3645 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3646 case 1:
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3647 v->codingset = CS_HIGH_MOT_INTRA;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3648 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3649 case 2:
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3650 v->codingset = CS_MID_RATE_INTRA;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3651 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3652 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3653
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3654 switch(v->c_ac_table_index){
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3655 case 0:
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3656 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3657 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3658 case 1:
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3659 v->codingset2 = CS_HIGH_MOT_INTER;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3660 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3661 case 2:
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3662 v->codingset2 = CS_MID_RATE_INTER;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3663 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3664 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3665
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3666 //do frame decode
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3667 s->mb_x = s->mb_y = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3668 s->mb_intra = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3669 s->first_slice_line = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3670 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3671 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3672 ff_init_block_index(s);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3673 ff_update_block_index(s);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3674 s->dsp.clear_blocks(s->block[0]);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3675 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3676 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
3710
08280665be40 Set motion vectors used in B-frames to zero by default
kostya
parents: 3709
diff changeset
3677 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
08280665be40 Set motion vectors used in B-frames to zero by default
kostya
parents: 3709
diff changeset
3678 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3679
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3680 // do actual MB decoding and displaying
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3681 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3682 if(v->acpred_is_raw)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
3683 v->s.ac_pred = get_bits1(&v->s.gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3684 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3685 v->s.ac_pred = v->acpred_plane[mb_pos];
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3686
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3687 if(v->condover == CONDOVER_SELECT) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3688 if(v->overflg_is_raw)
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5511
diff changeset
3689 overlap = get_bits1(&v->s.gb);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3690 else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3691 overlap = v->over_flags_plane[mb_pos];
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3692 } else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3693 overlap = (v->condover == CONDOVER_ALL);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3694
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3695 GET_MQUANT();
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3696
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3697 s->current_picture.qscale_table[mb_pos] = mquant;
4237
327e9d4572cb 100l: Initialize dc_scale with current quantizer for adv I frames
kostya
parents: 4236
diff changeset
3698 /* Set DC scale - y and c use the same */
327e9d4572cb 100l: Initialize dc_scale with current quantizer for adv I frames
kostya
parents: 4236
diff changeset
3699 s->y_dc_scale = s->y_dc_scale_table[mquant];
327e9d4572cb 100l: Initialize dc_scale with current quantizer for adv I frames
kostya
parents: 4236
diff changeset
3700 s->c_dc_scale = s->c_dc_scale_table[mquant];
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3701
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3702 for(k = 0; k < 6; k++) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3703 val = ((cbp >> (5 - k)) & 1);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3704
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3705 if (k < 4) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3706 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3707 val = val ^ pred;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3708 *coded_val = val;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3709 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3710 cbp |= val << (5 - k);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3711
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3712 v->a_avail = !s->first_slice_line || (k==2 || k==3);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3713 v->c_avail = !!s->mb_x || (k==1 || k==3);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3714
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3715 vc1_decode_i_block_adv(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2, mquant);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3716
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3717 s->dsp.vc1_inv_trans_8x8(s->block[k]);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3718 for(j = 0; j < 64; j++) s->block[k][j] += 128;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3719 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3720
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3721 vc1_put_block(v, s->block);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3722 if(overlap) {
4209
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3723 if(s->mb_x) {
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3724 s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3725 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
4209
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3726 if(!(s->flags & CODEC_FLAG_GRAY)) {
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3727 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3728 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
4209
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3729 }
ec6d49d9c19d Overlap filtering was done in reverse order
kostya
parents: 4001
diff changeset
3730 }
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3731 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3732 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3733 if(!s->first_slice_line) {
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3734 s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3735 s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3736 if(!(s->flags & CODEC_FLAG_GRAY)) {
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3737 s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3738 s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3739 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3740 }
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3741 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4238
diff changeset
3742 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3743 }
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3744 if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3745
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3746 if(get_bits_count(&s->gb) > v->bits) {
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
3747 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3748 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3749 return;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3750 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3751 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3752 ff_draw_horiz_band(s, s->mb_y * 16, 16);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3753 s->first_slice_line = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3754 }
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
3755 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3756 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3757
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3758 static void vc1_decode_p_blocks(VC1Context *v)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3759 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3760 MpegEncContext *s = &v->s;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3761
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3762 /* select codingmode used for VLC tables selection */
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3763 switch(v->c_ac_table_index){
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3764 case 0:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3765 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3766 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3767 case 1:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3768 v->codingset = CS_HIGH_MOT_INTRA;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3769 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3770 case 2:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3771 v->codingset = CS_MID_RATE_INTRA;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3772 break;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3773 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3774
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3775 switch(v->c_ac_table_index){
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3776 case 0:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3777 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3778 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3779 case 1:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3780 v->codingset2 = CS_HIGH_MOT_INTER;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3781 break;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3782 case 2:
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3783 v->codingset2 = CS_MID_RATE_INTER;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3784 break;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3785 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3786
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3787 s->first_slice_line = 1;
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3788 memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3789 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3790 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3791 ff_init_block_index(s);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3792 ff_update_block_index(s);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3793 s->dsp.clear_blocks(s->block[0]);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3794
3476
33a177588139 Don't pass block[6][64] parameter to decode_p_mb as we always use s->block
kostya
parents: 3475
diff changeset
3795 vc1_decode_p_mb(v);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3796 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
3797 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3798 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3799 return;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3800 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3801 }
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
3802 memmove(v->cbp_base, v->cbp, sizeof(v->cbp_base[0])*s->mb_stride);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3803 ff_draw_horiz_band(s, s->mb_y * 16, 16);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3804 s->first_slice_line = 0;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3805 }
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
3806 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3807 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3808
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3809 static void vc1_decode_b_blocks(VC1Context *v)
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3810 {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3811 MpegEncContext *s = &v->s;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3812
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3813 /* select codingmode used for VLC tables selection */
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3814 switch(v->c_ac_table_index){
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3815 case 0:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3816 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3817 break;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3818 case 1:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3819 v->codingset = CS_HIGH_MOT_INTRA;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3820 break;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3821 case 2:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3822 v->codingset = CS_MID_RATE_INTRA;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3823 break;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3824 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3825
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3826 switch(v->c_ac_table_index){
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3827 case 0:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3828 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3829 break;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3830 case 1:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3831 v->codingset2 = CS_HIGH_MOT_INTER;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3832 break;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3833 case 2:
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3834 v->codingset2 = CS_MID_RATE_INTER;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3835 break;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3836 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3837
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3838 s->first_slice_line = 1;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3839 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3840 for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3841 ff_init_block_index(s);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3842 ff_update_block_index(s);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3843 s->dsp.clear_blocks(s->block[0]);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3844
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3845 vc1_decode_b_mb(v);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3846 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
3847 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3848 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3849 return;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3850 }
9450
e90d0068a03f VC1 loop filter uses the frame quantizer not the mb quantizer
conrad
parents: 9443
diff changeset
3851 if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3852 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3853 ff_draw_horiz_band(s, s->mb_y * 16, 16);
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3854 s->first_slice_line = 0;
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3855 }
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
3856 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3857 }
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
3858
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3859 static void vc1_decode_skip_blocks(VC1Context *v)
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3860 {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3861 MpegEncContext *s = &v->s;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3862
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3863 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3864 s->first_slice_line = 1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3865 for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3866 s->mb_x = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3867 ff_init_block_index(s);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3868 ff_update_block_index(s);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3869 memcpy(s->dest[0], s->last_picture.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3870 memcpy(s->dest[1], s->last_picture.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3871 memcpy(s->dest[2], s->last_picture.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3872 ff_draw_horiz_band(s, s->mb_y * 16, 16);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3873 s->first_slice_line = 0;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3874 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
3875 s->pict_type = FF_P_TYPE;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3876 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
3877
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3878 static void vc1_decode_blocks(VC1Context *v)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3879 {
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3880
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3881 v->s.esc3_level_length = 0;
5887
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
3882 if(v->x8_type){
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
3883 ff_intrax8_decode_picture(&v->x8, 2*v->pq+v->halfpq, v->pq*(!v->pquantizer) );
5894
ca2fcb451a7d add {} to make the else look a little more normal
michael
parents: 5893
diff changeset
3884 }else{
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3885
5893
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3886 switch(v->s.pict_type) {
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
3887 case FF_I_TYPE:
4433
8187c306ffcd Fix BI-frames decoding for Adv. profile
kostya
parents: 4414
diff changeset
3888 if(v->profile == PROFILE_ADVANCED)
8187c306ffcd Fix BI-frames decoding for Adv. profile
kostya
parents: 4414
diff changeset
3889 vc1_decode_i_blocks_adv(v);
8187c306ffcd Fix BI-frames decoding for Adv. profile
kostya
parents: 4414
diff changeset
3890 else
8187c306ffcd Fix BI-frames decoding for Adv. profile
kostya
parents: 4414
diff changeset
3891 vc1_decode_i_blocks(v);
5893
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3892 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
3893 case FF_P_TYPE:
5893
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3894 if(v->p_frame_skipped)
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3895 vc1_decode_skip_blocks(v);
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3896 else
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3897 vc1_decode_p_blocks(v);
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3898 break;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
3899 case FF_B_TYPE:
5893
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3900 if(v->bi_type){
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3901 if(v->profile == PROFILE_ADVANCED)
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3902 vc1_decode_i_blocks_adv(v);
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3903 else
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3904 vc1_decode_i_blocks(v);
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3905 }else
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3906 vc1_decode_b_blocks(v);
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3907 break;
3bdbcfb7e497 indention
michael
parents: 5892
diff changeset
3908 }
5894
ca2fcb451a7d add {} to make the else look a little more normal
michael
parents: 5893
diff changeset
3909 }
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
3910 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3911
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3912 /** Find VC-1 marker in buffer
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3913 * @return position where next marker starts or end of buffer if no marker found
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3914 */
6304
aurel
parents: 6290
diff changeset
3915 static av_always_inline const uint8_t* find_next_marker(const uint8_t *src, const uint8_t *end)
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3916 {
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3917 uint32_t mrk = 0xFFFFFFFF;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3918
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3919 if(end-src < 4) return end;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3920 while(src < end){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3921 mrk = (mrk << 8) | *src++;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3922 if(IS_MARKER(mrk))
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3923 return src-4;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3924 }
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3925 return end;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3926 }
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3927
6304
aurel
parents: 6290
diff changeset
3928 static av_always_inline int vc1_unescape_buffer(const uint8_t *src, int size, uint8_t *dst)
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3929 {
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3930 int dsize = 0, i;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3931
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3932 if(size < 4){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3933 for(dsize = 0; dsize < size; dsize++) *dst++ = *src++;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3934 return size;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3935 }
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3936 for(i = 0; i < size; i++, src++) {
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3937 if(src[0] == 3 && i >= 2 && !src[-1] && !src[-2] && i < size-1 && src[1] < 4) {
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3938 dst[dsize++] = src[1];
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3939 src++;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3940 i++;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3941 } else
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3942 dst[dsize++] = *src;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3943 }
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3944 return dsize;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
3945 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3946
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3947 /** Initialize a VC1/WMV3 decoder
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3948 * @todo TODO: Handle VC-1 IDUs (Transport level?)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3949 * @todo TODO: Decypher remaining bits in extra_data
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3950 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
3951 static av_cold int vc1_decode_init(AVCodecContext *avctx)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3952 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3953 VC1Context *v = avctx->priv_data;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3954 MpegEncContext *s = &v->s;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3955 GetBitContext gb;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3956
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3957 if (!avctx->extradata_size || !avctx->extradata) return -1;
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
3958 if (!(avctx->flags & CODEC_FLAG_GRAY))
9224
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
3959 avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
3521
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
3960 else
ae749c2da968 Support grayscale decoding.
kostya
parents: 3520
diff changeset
3961 avctx->pix_fmt = PIX_FMT_GRAY8;
9224
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
3962 avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3963 v->s.avctx = avctx;
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3964 avctx->flags |= CODEC_FLAG_EMU_EDGE;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
3965 v->s.flags |= CODEC_FLAG_EMU_EDGE;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3966
5887
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
3967 if(avctx->idct_algo==FF_IDCT_AUTO){
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
3968 avctx->idct_algo=FF_IDCT_WMV2;
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
3969 }
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
3970
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3971 if(ff_h263_decode_init(avctx) < 0)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3972 return -1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3973 if (vc1_init_common(v) < 0) return -1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3974
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3975 avctx->coded_width = avctx->width;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3976 avctx->coded_height = avctx->height;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3977 if (avctx->codec_id == CODEC_ID_WMV3)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3978 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3979 int count = 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3980
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3981 // looks like WMV3 has a sequence header stored in the extradata
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3982 // advanced sequence header may be before the first frame
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3983 // the last byte of the extradata is a version number, 1 for the
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3984 // samples we can decode
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3985
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3986 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3987
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3988 if (decode_sequence_header(avctx, &gb) < 0)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3989 return -1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3990
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3991 count = avctx->extradata_size*8 - get_bits_count(&gb);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3992 if (count>0)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3993 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3994 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3995 count, get_bits(&gb, count));
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3996 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3997 else if (count < 0)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3998 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
3999 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4000 }
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4001 } else { // VC1/WVC1
6304
aurel
parents: 6290
diff changeset
4002 const uint8_t *start = avctx->extradata;
aurel
parents: 6290
diff changeset
4003 uint8_t *end = avctx->extradata + avctx->extradata_size;
aurel
parents: 6290
diff changeset
4004 const uint8_t *next;
aurel
parents: 6290
diff changeset
4005 int size, buf2_size;
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4006 uint8_t *buf2 = NULL;
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6304
diff changeset
4007 int seq_initialized = 0, ep_initialized = 0;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4008
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4009 if(avctx->extradata_size < 16) {
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4010 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4011 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4012 }
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4013
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4014 buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4015 if(start[0]) start++; // in WVC1 extradata first byte is its size
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4016 next = start;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4017 for(; next < end; start = next){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4018 next = find_next_marker(start + 4, end);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4019 size = next - start - 4;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4020 if(size <= 0) continue;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4021 buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4022 init_get_bits(&gb, buf2, buf2_size * 8);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4023 switch(AV_RB32(start)){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4024 case VC1_CODE_SEQHDR:
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4025 if(decode_sequence_header(avctx, &gb) < 0){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4026 av_free(buf2);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4027 return -1;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4028 }
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6304
diff changeset
4029 seq_initialized = 1;
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4030 break;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4031 case VC1_CODE_ENTRYPOINT:
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4032 if(decode_entry_point(avctx, &gb) < 0){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4033 av_free(buf2);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4034 return -1;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4035 }
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6304
diff changeset
4036 ep_initialized = 1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4037 break;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4038 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4039 }
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4040 av_free(buf2);
6350
8e63d869a904 typo fix: inited --> initialized
diego
parents: 6304
diff changeset
4041 if(!seq_initialized || !ep_initialized){
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4042 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4043 return -1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4044 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4045 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4046 avctx->has_b_frames= !!(avctx->max_b_frames);
3707
e7f4366d9731 2989l: Set avctx->has_b_frames value in header and don't change it
kostya
parents: 3698
diff changeset
4047 s->low_delay = !avctx->has_b_frames;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4048
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4049 s->mb_width = (avctx->coded_width+15)>>4;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4050 s->mb_height = (avctx->coded_height+15)>>4;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4051
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4052 /* Allocate mb bitplanes */
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
4053 v->mv_type_mb_plane = av_malloc(s->mb_stride * s->mb_height);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
4054 v->direct_mb_plane = av_malloc(s->mb_stride * s->mb_height);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4055 v->acpred_plane = av_malloc(s->mb_stride * s->mb_height);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4056 v->over_flags_plane = av_malloc(s->mb_stride * s->mb_height);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4057
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
4058 v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
4059 v->cbp = v->cbp_base + s->mb_stride;
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
4060
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
4061 /* allocate block type info in that way so it could be used with s->block_index[] */
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
4062 v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
4063 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
4064 v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
4065 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
4066
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4067 /* Init coded blocks info */
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4068 if (v->profile == PROFILE_ADVANCED)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4069 {
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
4070 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
4071 // return -1;
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
4072 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
4073 // return -1;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4074 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4075
5887
83ac4620c6ed intrax8 decoder patch by "someone"
michael
parents: 5849
diff changeset
4076 ff_intrax8_common_init(&v->x8,s);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4077 return 0;
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4078 }
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4079
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4080
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4081 /** Decode a VC1/WMV3 frame
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4082 * @todo TODO: Handle VC-1 IDUs (Transport level?)
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4083 */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4084 static int vc1_decode_frame(AVCodecContext *avctx,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4085 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9327
diff changeset
4086 AVPacket *avpkt)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4087 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9327
diff changeset
4088 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9327
diff changeset
4089 int buf_size = avpkt->size;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4090 VC1Context *v = avctx->priv_data;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4091 MpegEncContext *s = &v->s;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4092 AVFrame *pict = data;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4093 uint8_t *buf2 = NULL;
9025
b7c69cee2e92 Rename buf_vdpau to buf_start
kostya
parents: 9011
diff changeset
4094 const uint8_t *buf_start = buf;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4095
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4096 /* no supplementary picture */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4097 if (buf_size == 0) {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4098 /* special case for last picture */
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4099 if (s->low_delay==0 && s->next_picture_ptr) {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4100 *pict= *(AVFrame*)s->next_picture_ptr;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4101 s->next_picture_ptr= NULL;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4102
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4103 *data_size = sizeof(AVFrame);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4104 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4105
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4106 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4107 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4108
5127
4dbe6578f811 misc spelling fixes
diego
parents: 4966
diff changeset
4109 /* We need to set current_picture_ptr before reading the header,
5128
kostya
parents: 5127
diff changeset
4110 * otherwise we cannot store anything in there. */
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4111 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4112 int i= ff_find_unused_picture(s, 0);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4113 s->current_picture_ptr= &s->picture[i];
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4114 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4115
8631
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4116 if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU){
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4117 if (v->profile < PROFILE_ADVANCED)
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4118 avctx->pix_fmt = PIX_FMT_VDPAU_WMV3;
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4119 else
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4120 avctx->pix_fmt = PIX_FMT_VDPAU_VC1;
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4121 }
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4122
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4123 //for advanced profile we may need to parse and unescape data
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4124 if (avctx->codec_id == CODEC_ID_VC1) {
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4125 int buf_size2 = 0;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4126 buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4127
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4128 if(IS_MARKER(AV_RB32(buf))){ /* frame starts with marker and needs to be parsed */
6290
b7045a85cd7d some const
michael
parents: 6176
diff changeset
4129 const uint8_t *start, *end, *next;
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4130 int size;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4131
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4132 next = buf;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4133 for(start = buf, end = buf + buf_size; next < end; start = next){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4134 next = find_next_marker(start + 4, end);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4135 size = next - start - 4;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4136 if(size <= 0) continue;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4137 switch(AV_RB32(start)){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4138 case VC1_CODE_FRAME:
9224
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4139 if (avctx->hwaccel ||
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4140 s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
9025
b7c69cee2e92 Rename buf_vdpau to buf_start
kostya
parents: 9011
diff changeset
4141 buf_start = start;
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4142 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4143 break;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4144 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4145 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4146 init_get_bits(&s->gb, buf2, buf_size2*8);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4147 decode_entry_point(avctx, &s->gb);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4148 break;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4149 case VC1_CODE_SLICE:
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4150 av_log(avctx, AV_LOG_ERROR, "Sliced decoding is not implemented (yet)\n");
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4151 av_free(buf2);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4152 return -1;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4153 }
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4154 }
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4155 }else if(v->interlace && ((buf[0] & 0xC0) == 0xC0)){ /* WVC1 interlaced stores both fields divided by marker */
6304
aurel
parents: 6290
diff changeset
4156 const uint8_t *divider;
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4157
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4158 divider = find_next_marker(buf, buf + buf_size);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4159 if((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD){
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4160 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
7300
7e806e21c193 Fix a mem leak in vc1_decode_frame().
benoit
parents: 7136
diff changeset
4161 av_free(buf2);
4462
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4162 return -1;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4163 }
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4164
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4165 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4166 // TODO
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4167 av_free(buf2);return -1;
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4168 }else{
d47a98f52e25 General approach to parsing chunks in VC-1 AP
kostya
parents: 4456
diff changeset
4169 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4170 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4171 init_get_bits(&s->gb, buf2, buf_size2*8);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4172 } else
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4173 init_get_bits(&s->gb, buf, buf_size*8);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4174 // do parse frame header
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4175 if(v->profile < PROFILE_ADVANCED) {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4176 if(vc1_parse_frame_header(v, &s->gb) == -1) {
3694
8765ee4eaa45 Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents: 3693
diff changeset
4177 av_free(buf2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4178 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4179 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4180 } else {
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4181 if(vc1_parse_frame_header_adv(v, &s->gb) == -1) {
3694
8765ee4eaa45 Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents: 3693
diff changeset
4182 av_free(buf2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4183 return -1;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4184 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4185 }
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4186
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
4187 if(s->pict_type != FF_I_TYPE && !v->res_rtm_flag){
3694
8765ee4eaa45 Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents: 3693
diff changeset
4188 av_free(buf2);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4189 return -1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4190 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4191
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4192 // for hurry_up==5
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4193 s->current_picture.pict_type= s->pict_type;
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
4194 s->current_picture.key_frame= s->pict_type == FF_I_TYPE;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4195
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4196 /* skip B-frames if we don't have reference frames */
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
4197 if(s->last_picture_ptr==NULL && (s->pict_type==FF_B_TYPE || s->dropable)){
3694
8765ee4eaa45 Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents: 3693
diff changeset
4198 av_free(buf2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4199 return -1;//buf_size;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4200 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4201 /* skip b frames if we are in a hurry */
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
4202 if(avctx->hurry_up && s->pict_type==FF_B_TYPE) return -1;//buf_size;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
4203 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==FF_B_TYPE)
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
4204 || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=FF_I_TYPE)
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4205 || avctx->skip_frame >= AVDISCARD_ALL) {
3694
8765ee4eaa45 Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents: 3693
diff changeset
4206 av_free(buf2);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4207 return buf_size;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4208 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4209 /* skip everything if we are in a hurry>=5 */
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4210 if(avctx->hurry_up>=5) {
3694
8765ee4eaa45 Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents: 3693
diff changeset
4211 av_free(buf2);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4212 return -1;//buf_size;
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4213 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4214
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4215 if(s->next_p_frame_damaged){
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
4216 if(s->pict_type==FF_B_TYPE)
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4217 return buf_size;
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4218 else
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4219 s->next_p_frame_damaged=0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4220 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4221
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4222 if(MPV_frame_start(s, avctx) < 0) {
3694
8765ee4eaa45 Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents: 3693
diff changeset
4223 av_free(buf2);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4224 return -1;
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4225 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4226
5684
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
4227 s->me.qpel_put= s->dsp.put_qpel_pixels_tab;
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
4228 s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab;
1eb243819e08 Enable error resilience in WMV3/VC-1 decoder
kostya
parents: 5683
diff changeset
4229
8631
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4230 if ((CONFIG_VC1_VDPAU_DECODER || CONFIG_WMV3_VDPAU_DECODER)
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4231 &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
9025
b7c69cee2e92 Rename buf_vdpau to buf_start
kostya
parents: 9011
diff changeset
4232 ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start);
9224
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4233 else if (avctx->hwaccel) {
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4234 if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0)
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4235 return -1;
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4236 if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4237 return -1;
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4238 if (avctx->hwaccel->end_frame(avctx) < 0)
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4239 return -1;
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4240 } else {
8632
6fa5b0727ddd Cosmetics: Fix indentation after last commit.
cehoyos
parents: 8631
diff changeset
4241 ff_er_frame_start(s);
6fa5b0727ddd Cosmetics: Fix indentation after last commit.
cehoyos
parents: 8631
diff changeset
4242
6fa5b0727ddd Cosmetics: Fix indentation after last commit.
cehoyos
parents: 8631
diff changeset
4243 v->bits = buf_size * 8;
6fa5b0727ddd Cosmetics: Fix indentation after last commit.
cehoyos
parents: 8631
diff changeset
4244 vc1_decode_blocks(v);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4245 //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4246 // if(get_bits_count(&s->gb) > buf_size * 8)
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4247 // return -1;
8632
6fa5b0727ddd Cosmetics: Fix indentation after last commit.
cehoyos
parents: 8631
diff changeset
4248 ff_er_frame_end(s);
8631
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4249 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4250
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4251 MPV_frame_end(s);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4252
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4253 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4254 assert(s->current_picture.pict_type == s->pict_type);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6350
diff changeset
4255 if (s->pict_type == FF_B_TYPE || s->low_delay) {
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4256 *pict= *(AVFrame*)s->current_picture_ptr;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4257 } else if (s->last_picture_ptr != NULL) {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4258 *pict= *(AVFrame*)s->last_picture_ptr;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4259 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4260
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4261 if(s->last_picture_ptr || s->low_delay){
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4262 *data_size = sizeof(AVFrame);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4263 ff_print_debug_info(s, pict);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4264 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4265
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4266 /* Return the Picture timestamp as the frame number */
5964
34f551bd0509 Fix alignment broke by my last patch
vitor
parents: 5963
diff changeset
4267 /* we subtract 1 because it is added on utils.c */
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4268 avctx->frame_number = s->picture_number - 1;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4269
3694
8765ee4eaa45 Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents: 3693
diff changeset
4270 av_free(buf2);
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4271 return buf_size;
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4272 }
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4273
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4274
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4275 /** Close a VC1/WMV3 decoder
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4276 * @warning Initial try at using MpegEncContext stuff
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4277 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
4278 static av_cold int vc1_decode_end(AVCodecContext *avctx)
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4279 {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4280 VC1Context *v = avctx->priv_data;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4281
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4282 av_freep(&v->hrd_rate);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4283 av_freep(&v->hrd_buffer);
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4284 MPV_common_end(&v->s);
3367
8c7b8ffc2485 Some optimization and fixes - mostly reworked MC and bitplanes.
kostya
parents: 3366
diff changeset
4285 av_freep(&v->mv_type_mb_plane);
3515
20938be7b67b Some B-frames support (parsing and decoding only, no motion compesation is done)
kostya
parents: 3514
diff changeset
4286 av_freep(&v->direct_mb_plane);
3672
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4287 av_freep(&v->acpred_plane);
9d4583fe8fca VC-1 Advanced Profile support (progressive only, tested on WVC1 samples)
kostya
parents: 3664
diff changeset
4288 av_freep(&v->over_flags_plane);
3396
3f43459705a5 4-MV decoding support
kostya
parents: 3378
diff changeset
4289 av_freep(&v->mb_type_base);
7355
5719e2c85aa3 In-loop deblocking filter for VC-1 decoder
kostya
parents: 7300
diff changeset
4290 av_freep(&v->cbp_base);
6176
1d735690e172 Correctly clean up IntraX8Context upon codec close.
andoma
parents: 6150
diff changeset
4291 ff_intrax8_common_end(&v->x8);
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4292 return 0;
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4293 }
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4294
3360
2c4ddf5b9217 VC-1 decoder with I-frames support and partial P-frames decoding
kostya
parents: 3359
diff changeset
4295
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4296 AVCodec vc1_decoder = {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4297 "vc1",
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4298 CODEC_TYPE_VIDEO,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4299 CODEC_ID_VC1,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4300 sizeof(VC1Context),
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4301 vc1_decode_init,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4302 NULL,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4303 vc1_decode_end,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4304 vc1_decode_frame,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4305 CODEC_CAP_DELAY,
6712
5b3acf9fd50a Add long names to AVCodec declarations.
diego
parents: 6517
diff changeset
4306 NULL,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6903
diff changeset
4307 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
9224
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4308 .pix_fmts = ff_hwaccel_pixfmt_list_420
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4309 };
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4310
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4311 AVCodec wmv3_decoder = {
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4312 "wmv3",
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4313 CODEC_TYPE_VIDEO,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4314 CODEC_ID_WMV3,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4315 sizeof(VC1Context),
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4316 vc1_decode_init,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4317 NULL,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4318 vc1_decode_end,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4319 vc1_decode_frame,
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4320 CODEC_CAP_DELAY,
6712
5b3acf9fd50a Add long names to AVCodec declarations.
diego
parents: 6517
diff changeset
4321 NULL,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6903
diff changeset
4322 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
9224
aed92dbae82e Add support for HW accelerated VC-1 decoding through the new
gb
parents: 9047
diff changeset
4323 .pix_fmts = ff_hwaccel_pixfmt_list_420
3359
87187ebe2c28 Rename VC9 to VC1 as there is no such thing as VC9
kostya
parents:
diff changeset
4324 };
8631
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4325
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4326 #if CONFIG_WMV3_VDPAU_DECODER
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4327 AVCodec wmv3_vdpau_decoder = {
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4328 "wmv3_vdpau",
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4329 CODEC_TYPE_VIDEO,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4330 CODEC_ID_WMV3,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4331 sizeof(VC1Context),
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4332 vc1_decode_init,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4333 NULL,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4334 vc1_decode_end,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4335 vc1_decode_frame,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4336 CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4337 NULL,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4338 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
9047
91f9fe7bedd9 Apply correct pix_fmts to WMV3_VDPAU and VC1_VDPAU.
cehoyos
parents: 9042
diff changeset
4339 .pix_fmts = (enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE}
8631
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4340 };
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4341 #endif
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4342
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4343 #if CONFIG_VC1_VDPAU_DECODER
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4344 AVCodec vc1_vdpau_decoder = {
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4345 "vc1_vdpau",
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4346 CODEC_TYPE_VIDEO,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4347 CODEC_ID_VC1,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4348 sizeof(VC1Context),
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4349 vc1_decode_init,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4350 NULL,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4351 vc1_decode_end,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4352 vc1_decode_frame,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4353 CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4354 NULL,
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4355 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
9047
91f9fe7bedd9 Apply correct pix_fmts to WMV3_VDPAU and VC1_VDPAU.
cehoyos
parents: 9042
diff changeset
4356 .pix_fmts = (enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE}
8631
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4357 };
2d7269e13a8d Add VDPAU hardware accelerated decoding for WMV3 and VC1 which can
cehoyos
parents: 8627
diff changeset
4358 #endif