Mercurial > libavcodec.hg
annotate vc9.c @ 3310:48fc664f7348 libavcodec
Now MPlayer should understand Smacker audio and video codecs.
author | kostya |
---|---|
date | Wed, 17 May 2006 03:03:53 +0000 |
parents | 333e016c2c8a |
children |
rev | line source |
---|---|
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1 /* |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2 * VC-9 and WMV3 decoder |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
3 * Copyright (c) 2005 Anonymous |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
4 * Copyright (c) 2005 Alex Beregszaszi |
2462 | 5 * Copyright (c) 2005 Michael Niedermayer |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
6 * |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
7 * This library is free software; you can redistribute it and/or |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
10 * version 2 of the License, or (at your option) any later version. |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
11 * |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
12 * This library is distributed in the hope that it will be useful, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
16 * |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
18 * License along with this library; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
20 * |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
21 */ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
22 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
23 /** |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
24 * @file vc9.c |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
25 * VC-9 and WMV3 decoder |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
26 * |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
27 * TODO: most AP stuff, optimize, most of MB layer, transform, filtering and motion compensation, etc |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
28 * TODO: use MPV_ !! |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
29 */ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
30 #include "common.h" |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
31 #include "dsputil.h" |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
32 #include "avcodec.h" |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
33 #include "mpegvideo.h" |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
34 #include "vc9data.h" |
2474 | 35 |
2476
38dbec9a148d
100000l (typos in the #define for selecting the NORM6 method -> wasnt compiled, after fixing typos new method doesnt even compile -> swicth back to old until its fixed)
michael
parents:
2475
diff
changeset
|
36 #undef NDEBUG |
38dbec9a148d
100000l (typos in the #define for selecting the NORM6 method -> wasnt compiled, after fixing typos new method doesnt even compile -> swicth back to old until its fixed)
michael
parents:
2475
diff
changeset
|
37 #include <assert.h> |
38dbec9a148d
100000l (typos in the #define for selecting the NORM6 method -> wasnt compiled, after fixing typos new method doesnt even compile -> swicth back to old until its fixed)
michael
parents:
2475
diff
changeset
|
38 |
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
39 extern const uint32_t ff_table0_dc_lum[120][2], ff_table1_dc_lum[120][2]; |
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
40 extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2]; |
2474 | 41 extern VLC ff_msmp4_dc_luma_vlc[2], ff_msmp4_dc_chroma_vlc[2]; |
42 #define MB_INTRA_VLC_BITS 9 | |
43 extern VLC ff_msmp4_mb_i_vlc; | |
44 #define DC_VLC_BITS 9 | |
45 static const uint16_t table_mb_intra[64][2]; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
46 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
47 /* Some inhibiting stuff */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
48 #define HAS_ADVANCED_PROFILE 0 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
49 #define TRACE 1 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
50 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
51 #if TRACE |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
52 # define INIT_VLC(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
53 codes, codes_wrap, codes_size, use_static) \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
54 if (init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
55 codes, codes_wrap, codes_size, use_static) < 0) \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
56 { \ |
2474 | 57 av_log(v->s.avctx, AV_LOG_ERROR, "Error for " # vlc " (%i)\n", i); \ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
58 return -1; \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
59 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
60 #else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
61 # define INIT_VLC(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
62 codes, codes_wrap, codes_size, use_static) \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
63 init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
64 codes, codes_wrap, codes_size, use_static) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
65 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
66 |
2482 | 67 /** Available Profiles */ |
68 //@{ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
69 #define PROFILE_SIMPLE 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
70 #define PROFILE_MAIN 1 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
71 #define PROFILE_COMPLEX 2 ///< TODO: WMV9 specific |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
72 #define PROFILE_ADVANCED 3 |
2482 | 73 //@} |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
74 |
2482 | 75 /** Sequence quantizer mode */ |
76 //@{ | |
2483 | 77 #define QUANT_FRAME_IMPLICIT 0 ///< Implicitly specified at frame level |
78 #define QUANT_FRAME_EXPLICIT 1 ///< Explicitly specified at frame level | |
79 #define QUANT_NON_UNIFORM 2 ///< Non-uniform quant used for all frames | |
80 #define QUANT_UNIFORM 3 ///< Uniform quant used for all frames | |
2482 | 81 //@} |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
82 |
2482 | 83 /** Where quant can be changed */ |
84 //@{ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
85 #define DQPROFILE_FOUR_EDGES 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
86 #define DQPROFILE_DOUBLE_EDGES 1 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
87 #define DQPROFILE_SINGLE_EDGE 2 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
88 #define DQPROFILE_ALL_MBS 3 |
2482 | 89 //@} |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
90 |
2482 | 91 /** @name Where quant can be changed |
92 */ | |
93 //@{ | |
94 #define DQPROFILE_FOUR_EDGES 0 | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
95 #define DQSINGLE_BEDGE_LEFT 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
96 #define DQSINGLE_BEDGE_TOP 1 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
97 #define DQSINGLE_BEDGE_RIGHT 2 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
98 #define DQSINGLE_BEDGE_BOTTOM 3 |
2482 | 99 //@} |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
100 |
2482 | 101 /** Which pair of edges is quantized with ALTPQUANT */ |
102 //@{ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
103 #define DQDOUBLE_BEDGE_TOPLEFT 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
104 #define DQDOUBLE_BEDGE_TOPRIGHT 1 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
105 #define DQDOUBLE_BEDGE_BOTTOMRIGHT 2 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
106 #define DQDOUBLE_BEDGE_BOTTOMLEFT 3 |
2482 | 107 //@} |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
108 |
2482 | 109 /** MV modes for P frames */ |
110 //@{ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
111 #define MV_PMODE_1MV_HPEL_BILIN 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
112 #define MV_PMODE_1MV 1 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
113 #define MV_PMODE_1MV_HPEL 2 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
114 #define MV_PMODE_MIXED_MV 3 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
115 #define MV_PMODE_INTENSITY_COMP 4 |
2482 | 116 //@} |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
117 |
2482 | 118 /** @name MV types for B frames */ |
119 //@{ | |
120 #define BMV_TYPE_BACKWARD 0 | |
2462 | 121 #define BMV_TYPE_BACKWARD 0 |
122 #define BMV_TYPE_FORWARD 1 | |
123 #define BMV_TYPE_INTERPOLATED 3 | |
2482 | 124 //@} |
2462 | 125 |
2482 | 126 /** MV P mode - the 5th element is only used for mode 1 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
127 static const uint8_t mv_pmode_table[2][5] = { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
128 { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV, MV_PMODE_INTENSITY_COMP }, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
129 { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_INTENSITY_COMP } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
130 }; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
131 |
2482 | 132 /** One more frame type */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
133 #define BI_TYPE 7 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
134 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
135 static const int fps_nr[5] = { 24, 25, 30, 50, 60 }, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
136 fps_dr[2] = { 1000, 1001 }; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
137 static const uint8_t pquant_table[3][32] = { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
138 { /* Implicit quantizer */ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
139 0, 1, 2, 3, 4, 5, 6, 7, 8, 6, 7, 8, 9, 10, 11, 12, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
140 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
141 }, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
142 { /* Explicit quantizer, pquantizer uniform */ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
143 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
144 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
145 }, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
146 { /* Explicit quantizer, pquantizer non-uniform */ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
147 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
148 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
149 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
150 }; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
151 |
2482 | 152 /** @name VC-9 VLC tables and defines |
153 * @todo TODO move this into the context | |
154 */ | |
155 //@{ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
156 #define VC9_BFRACTION_VLC_BITS 7 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
157 static VLC vc9_bfraction_vlc; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
158 #define VC9_IMODE_VLC_BITS 4 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
159 static VLC vc9_imode_vlc; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
160 #define VC9_NORM2_VLC_BITS 3 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
161 static VLC vc9_norm2_vlc; |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
162 #define VC9_NORM6_VLC_BITS 9 |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
163 static VLC vc9_norm6_vlc; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
164 /* Could be optimized, one table only needs 8 bits */ |
2462 | 165 #define VC9_TTMB_VLC_BITS 9 //12 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
166 static VLC vc9_ttmb_vlc[3]; |
2462 | 167 #define VC9_MV_DIFF_VLC_BITS 9 //15 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
168 static VLC vc9_mv_diff_vlc[4]; |
2462 | 169 #define VC9_CBPCY_P_VLC_BITS 9 //14 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
170 static VLC vc9_cbpcy_p_vlc[4]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
171 #define VC9_4MV_BLOCK_PATTERN_VLC_BITS 6 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
172 static VLC vc9_4mv_block_pattern_vlc[4]; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
173 #define VC9_TTBLK_VLC_BITS 5 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
174 static VLC vc9_ttblk_vlc[3]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
175 #define VC9_SUBBLKPAT_VLC_BITS 6 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
176 static VLC vc9_subblkpat_vlc[3]; |
2482 | 177 //@} |
2462 | 178 |
2482 | 179 /** Bitplane struct |
180 * We mainly need data and is_raw, so this struct could be avoided | |
181 * to save a level of indirection; feel free to modify | |
182 * @fixme For now, stride=width | |
183 * @warning Data are bits, either 1 or 0 | |
184 */ | |
2462 | 185 typedef struct BitPlane { |
2482 | 186 uint8_t *data; ///< Data buffer |
187 int width; ///< Width of the buffer | |
188 int stride; ///< Stride of the buffer | |
189 int height; ///< Plane height | |
190 uint8_t is_raw; ///< Bit values must be read at MB level | |
2462 | 191 } BitPlane; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
192 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
193 /** The VC9 Context |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
194 * @fixme Change size wherever another size is more efficient |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
195 * Many members are only used for Advanced Profile |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
196 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
197 typedef struct VC9Context{ |
2482 | 198 MpegEncContext s; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
199 |
2482 | 200 /** Simple/Main Profile sequence header */ |
201 //@{ | |
202 int res_sm; ///< reserved, 2b | |
203 int res_x8; ///< reserved | |
204 int multires; ///< frame-level RESPIC syntax element present | |
205 int res_fasttx; ///< reserved, always 1 | |
206 int res_transtab; ///< reserved, always 0 | |
207 int rangered; ///< RANGEREDFRM (range reduction) syntax element present | |
208 ///< at frame level | |
209 int res_rtm_flag; ///< reserved, set to 1 | |
210 int reserved; ///< reserved | |
211 //@} | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
212 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
213 #if HAS_ADVANCED_PROFILE |
2482 | 214 /** Advanced Profile */ |
215 //@{ | |
216 int level; ///< 3bits, for Advanced/Simple Profile, provided by TS layer | |
217 int chromaformat; ///< 2bits, 2=4:2:0, only defined | |
218 int postprocflag; ///< Per-frame processing suggestion flag present | |
219 int broadcast; ///< TFF/RFF present | |
220 int interlace; ///< Progressive/interlaced (RPTFTM syntax element) | |
221 int tfcntrflag; ///< TFCNTR present | |
222 int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present | |
223 int extended_dmv; ///< Additional extended dmv range at P/B frame-level | |
224 int color_prim; ///< 8bits, chroma coordinates of the color primaries | |
225 int transfer_char; ///< 8bits, Opto-electronic transfer characteristics | |
226 int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix | |
227 int hrd_param_flag; ///< Presence of Hypothetical Reference | |
228 ///< Decoder parameters | |
229 //@} | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
230 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
231 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
232 |
2482 | 233 /** Sequence header data for all Profiles |
234 * TODO: choose between ints, uint8_ts and monobit flags | |
235 */ | |
236 //@{ | |
237 int profile; ///< 2bits, Profile | |
2967 | 238 int frmrtq_postproc; ///< 3bits, |
2482 | 239 int bitrtq_postproc; ///< 5bits, quantized framerate-based postprocessing strength |
240 int fastuvmc; ///< Rounding of qpel vector to hpel ? (not in Simple) | |
241 int extended_mv; ///< Ext MV in P/B (not in Simple) | |
242 int dquant; ///< How qscale varies with MBs, 2bits (not in Simple) | |
243 int vstransform; ///< variable-size [48]x[48] transform type + info | |
244 int overlap; ///< overlapped transforms in use | |
245 int quantizer_mode; ///< 2bits, quantizer mode used for sequence, see QUANT_* | |
246 int finterpflag; ///< INTERPFRM present | |
247 //@} | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
248 |
2482 | 249 /** Frame decoding info for all profiles */ |
250 //@{ | |
251 uint8_t mv_mode; ///< MV coding monde | |
252 uint8_t mv_mode2; ///< Secondary MV coding mode (B frames) | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
253 int k_x; ///< Number of bits for MVs (depends on MV range) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
254 int k_y; ///< Number of bits for MVs (depends on MV range) |
2482 | 255 uint8_t pq, altpq; ///< Current/alternate frame quantizer scale |
256 /** pquant parameters */ | |
257 //@{ | |
258 uint8_t dquantfrm; | |
259 uint8_t dqprofile; | |
260 uint8_t dqsbedge; | |
261 uint8_t dqbilevel; | |
262 //@} | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
263 /** AC coding set indexes |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
264 * @see 8.1.1.10, p(1)10 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
265 */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
266 //@{ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
267 int c_ac_table_index; ///< Chroma index from ACFRM element |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
268 int y_ac_table_index; ///< Luma index from AC2FRM element |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
269 //@} |
2482 | 270 int ttfrm; ///< Transform type info present at frame level |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
271 uint8_t ttmbf; ///< Transform type flag |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
272 int ttmb; ///< Transform type |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
273 uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform |
2482 | 274 /** Luma compensation parameters */ |
275 //@{ | |
276 uint8_t lumscale; | |
277 uint8_t lumshift; | |
278 //@} | |
279 int16_t bfraction; ///< Relative position % anchors=> how to scale MVs | |
280 uint8_t halfpq; ///< Uniform quant over image and qp+.5 | |
281 uint8_t respic; ///< Frame-level flag for resized images | |
282 int buffer_fullness; ///< HRD info | |
283 /** Ranges: | |
284 * -# 0 -> [-64n 63.f] x [-32, 31.f] | |
285 * -# 1 -> [-128, 127.f] x [-64, 63.f] | |
286 * -# 2 -> [-512, 511.f] x [-128, 127.f] | |
287 * -# 3 -> [-1024, 1023.f] x [-256, 255.f] | |
288 */ | |
289 uint8_t mvrange; | |
2483 | 290 uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use |
2482 | 291 uint8_t *previous_line_cbpcy; ///< To use for predicted CBPCY |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
292 VLC *cbpcy_vlc; ///< CBPCY VLC table |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
293 int tt_index; ///< Index for Transform Type tables |
2482 | 294 BitPlane mv_type_mb_plane; ///< bitplane for mv_type == (4MV) |
295 BitPlane skip_mb_plane; ///< bitplane for skipped MBs | |
296 BitPlane direct_mb_plane; ///< bitplane for "direct" MBs | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
297 |
2482 | 298 /** Frame decoding info for S/M profiles only */ |
299 //@{ | |
300 uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128) | |
301 uint8_t interpfrm; | |
302 //@} | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
303 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
304 #if HAS_ADVANCED_PROFILE |
2482 | 305 /** Frame decoding info for Advanced profile */ |
306 //@{ | |
307 uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace | |
308 uint8_t numpanscanwin; | |
309 uint8_t tfcntr; | |
310 uint8_t rptfrm, tff, rff; | |
2483 | 311 uint16_t topleftx; |
312 uint16_t toplefty; | |
313 uint16_t bottomrightx; | |
314 uint16_t bottomrighty; | |
2482 | 315 uint8_t uvsamp; |
316 uint8_t postproc; | |
317 int hrd_num_leaky_buckets; | |
318 uint8_t bit_rate_exponent; | |
319 uint8_t buffer_size_exponent; | |
320 BitPlane ac_pred_plane; ///< AC prediction flags bitplane | |
321 BitPlane over_flags_plane; ///< Overflags bitplane | |
322 uint8_t condover; | |
323 uint16_t *hrd_rate, *hrd_buffer; | |
2688 | 324 uint8_t *hrd_fullness; |
325 uint8_t range_mapy_flag; | |
326 uint8_t range_mapuv_flag; | |
327 uint8_t range_mapy; | |
328 uint8_t range_mapuv; | |
2482 | 329 //@} |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
330 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
331 } VC9Context; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
332 |
2482 | 333 /** |
334 * Get unary code of limited length | |
335 * @fixme FIXME Slow and ugly | |
336 * @param gb GetBitContext | |
337 * @param[in] stop The bitstop value (unary code of 1's or 0's) | |
338 * @param[in] len Maximum length | |
339 * @return Unary length/index | |
340 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
341 static int get_prefix(GetBitContext *gb, int stop, int len) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
342 { |
2462 | 343 #if 1 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
344 int i = 0, tmp = !stop; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
345 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
346 while (i != len && tmp != stop) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
347 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
348 tmp = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
349 i++; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
350 } |
2483 | 351 if (i == len && tmp != stop) return len+1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
352 return i; |
2462 | 353 #else |
354 unsigned int buf; | |
355 int log; | |
356 | |
357 OPEN_READER(re, gb); | |
358 UPDATE_CACHE(re, gb); | |
359 buf=GET_CACHE(re, gb); //Still not sure | |
360 if (stop) buf = ~buf; | |
2685 | 361 |
2462 | 362 log= av_log2(-buf); //FIXME: -? |
363 if (log < limit){ | |
364 LAST_SKIP_BITS(re, gb, log+1); | |
365 CLOSE_READER(re, gb); | |
366 return log; | |
367 } | |
2685 | 368 |
2462 | 369 LAST_SKIP_BITS(re, gb, limit); |
370 CLOSE_READER(re, gb); | |
371 return limit; | |
372 #endif | |
373 } | |
374 | |
2482 | 375 /** |
376 * Init VC-9 specific tables and VC9Context members | |
377 * @param v The VC9Context to initialize | |
378 * @return Status | |
379 */ | |
2474 | 380 static int vc9_init_common(VC9Context *v) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
381 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
382 static int done = 0; |
2483 | 383 int i = 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
384 |
2462 | 385 /* Set the bit planes */ |
386 v->mv_type_mb_plane = (struct BitPlane) { NULL, 0, 0, 0 }; | |
387 v->direct_mb_plane = (struct BitPlane) { NULL, 0, 0, 0 }; | |
388 v->skip_mb_plane = (struct BitPlane) { NULL, 0, 0, 0 }; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
389 #if HAS_ADVANCED_PROFILE |
2462 | 390 v->ac_pred_plane = v->over_flags_plane = (struct BitPlane) { NULL, 0, 0, 0 }; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
391 v->hrd_rate = v->hrd_buffer = NULL; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
392 #endif |
2462 | 393 |
394 /* VLC tables */ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
395 #if 0 // spec -> actual tables converter |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
396 for(i=0; i<64; i++){ |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
397 int code= (vc9_norm6_spec[i][1] << vc9_norm6_spec[i][4]) + vc9_norm6_spec[i][3]; |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
398 av_log(NULL, AV_LOG_DEBUG, "0x%03X, ", code); |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
399 if(i%16==15) av_log(NULL, AV_LOG_DEBUG, "\n"); |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
400 } |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
401 for(i=0; i<64; i++){ |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
402 int code= vc9_norm6_spec[i][2] + vc9_norm6_spec[i][4]; |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
403 av_log(NULL, AV_LOG_DEBUG, "%2d, ", code); |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
404 if(i%16==15) av_log(NULL, AV_LOG_DEBUG, "\n"); |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
405 } |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
406 #endif |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
407 if(!done) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
408 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
409 done = 1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
410 INIT_VLC(&vc9_bfraction_vlc, VC9_BFRACTION_VLC_BITS, 23, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
411 vc9_bfraction_bits, 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
412 vc9_bfraction_codes, 1, 1, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
413 INIT_VLC(&vc9_norm2_vlc, VC9_NORM2_VLC_BITS, 4, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
414 vc9_norm2_bits, 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
415 vc9_norm2_codes, 1, 1, 1); |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
416 INIT_VLC(&vc9_norm6_vlc, VC9_NORM6_VLC_BITS, 64, |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
417 vc9_norm6_bits, 1, 1, |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
418 vc9_norm6_codes, 2, 2, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
419 INIT_VLC(&vc9_imode_vlc, VC9_IMODE_VLC_BITS, 7, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
420 vc9_imode_bits, 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
421 vc9_imode_codes, 1, 1, 1); |
2462 | 422 for (i=0; i<3; i++) |
423 { | |
424 INIT_VLC(&vc9_ttmb_vlc[i], VC9_TTMB_VLC_BITS, 16, | |
425 vc9_ttmb_bits[i], 1, 1, | |
426 vc9_ttmb_codes[i], 2, 2, 1); | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
427 INIT_VLC(&vc9_ttblk_vlc[i], VC9_TTBLK_VLC_BITS, 8, |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
428 vc9_ttblk_bits[i], 1, 1, |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
429 vc9_ttblk_codes[i], 1, 1, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
430 INIT_VLC(&vc9_subblkpat_vlc[i], VC9_SUBBLKPAT_VLC_BITS, 15, |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
431 vc9_subblkpat_bits[i], 1, 1, |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
432 vc9_subblkpat_codes[i], 1, 1, 1); |
2462 | 433 } |
434 for(i=0; i<4; i++) | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
435 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
436 INIT_VLC(&vc9_4mv_block_pattern_vlc[i], VC9_4MV_BLOCK_PATTERN_VLC_BITS, 16, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
437 vc9_4mv_block_pattern_bits[i], 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
438 vc9_4mv_block_pattern_codes[i], 1, 1, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
439 INIT_VLC(&vc9_cbpcy_p_vlc[i], VC9_CBPCY_P_VLC_BITS, 64, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
440 vc9_cbpcy_p_bits[i], 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
441 vc9_cbpcy_p_codes[i], 2, 2, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
442 INIT_VLC(&vc9_mv_diff_vlc[i], VC9_MV_DIFF_VLC_BITS, 73, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
443 vc9_mv_diff_bits[i], 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
444 vc9_mv_diff_codes[i], 2, 2, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
445 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
446 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
447 |
2462 | 448 /* Other defaults */ |
449 v->pq = -1; | |
450 v->mvrange = 0; /* 7.1.1.18, p80 */ | |
451 | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
452 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
453 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
454 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
455 #if HAS_ADVANCED_PROFILE |
2482 | 456 /** |
457 * Decode sequence header's Hypothetic Reference Decoder data | |
458 * @see 6.2.1, p32 | |
459 * @param v The VC9Context to initialize | |
460 * @param gb A GetBitContext initialized from AVCodecContext extra_data | |
461 * @return Status | |
462 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
463 static int decode_hrd(VC9Context *v, GetBitContext *gb) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
464 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
465 int i, num; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
466 |
2671 | 467 num = 1 + get_bits(gb, 5); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
468 |
2688 | 469 /*hrd rate*/ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
470 if (v->hrd_rate || num != v->hrd_num_leaky_buckets) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
471 { |
2458
915094e3da5d
dont use several 100 mb memory for a tiny 120 element table
michael
parents:
2453
diff
changeset
|
472 av_freep(&v->hrd_rate); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
473 } |
2462 | 474 if (!v->hrd_rate) v->hrd_rate = av_malloc(num*sizeof(uint16_t)); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
475 if (!v->hrd_rate) return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
476 |
2688 | 477 /*hrd buffer*/ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
478 if (v->hrd_buffer || num != v->hrd_num_leaky_buckets) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
479 { |
2458
915094e3da5d
dont use several 100 mb memory for a tiny 120 element table
michael
parents:
2453
diff
changeset
|
480 av_freep(&v->hrd_buffer); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
481 } |
2462 | 482 if (!v->hrd_buffer) v->hrd_buffer = av_malloc(num*sizeof(uint16_t)); |
2688 | 483 if (!v->hrd_buffer) |
484 { | |
485 av_freep(&v->hrd_rate); | |
486 return -1; | |
487 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
488 |
2688 | 489 /*hrd fullness*/ |
490 if (v->hrd_fullness || num != v->hrd_num_leaky_buckets) | |
491 { | |
492 av_freep(&v->hrd_buffer); | |
493 } | |
494 if (!v->hrd_fullness) v->hrd_fullness = av_malloc(num*sizeof(uint8_t)); | |
495 if (!v->hrd_fullness) | |
496 { | |
497 av_freep(&v->hrd_rate); | |
498 av_freep(&v->hrd_buffer); | |
499 return -1; | |
500 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
501 v->hrd_num_leaky_buckets = num; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
502 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
503 //exponent in base-2 for rate |
2671 | 504 v->bit_rate_exponent = 6 + get_bits(gb, 4); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
505 //exponent in base-2 for buffer_size |
2671 | 506 v->buffer_size_exponent = 4 + get_bits(gb, 4); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
507 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
508 for (i=0; i<num; i++) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
509 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
510 //mantissae, ordered (if not, use a function ? |
2671 | 511 v->hrd_rate[i] = 1 + get_bits(gb, 16); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
512 if (i && v->hrd_rate[i-1]>=v->hrd_rate[i]) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
513 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
514 av_log(v->s.avctx, AV_LOG_ERROR, "HDR Rates aren't strictly increasing:" |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
515 "%i vs %i\n", v->hrd_rate[i-1], v->hrd_rate[i]); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
516 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
517 } |
2671 | 518 v->hrd_buffer[i] = 1 + get_bits(gb, 16); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
519 if (i && v->hrd_buffer[i-1]<v->hrd_buffer[i]) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
520 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
521 av_log(v->s.avctx, AV_LOG_ERROR, "HDR Buffers aren't decreasing:" |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
522 "%i vs %i\n", v->hrd_buffer[i-1], v->hrd_buffer[i]); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
523 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
524 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
525 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
526 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
527 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
528 |
2482 | 529 /** |
530 * Decode sequence header for Advanced Profile | |
531 * @see Table 2, p18 | |
532 * @see 6.1.7, pp21-27 | |
533 * @param v The VC9Context to initialize | |
534 * @param gb A GetBitContext initialized from AVCodecContext extra_data | |
535 * @return Status | |
536 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
537 static int decode_advanced_sequence_header(AVCodecContext *avctx, GetBitContext *gb) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
538 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
539 VC9Context *v = avctx->priv_data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
540 int nr, dr, aspect_ratio; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
541 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
542 v->postprocflag = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
543 v->broadcast = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
544 v->interlace = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
545 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
546 v->tfcntrflag = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
547 v->finterpflag = get_bits(gb, 1); //common |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
548 v->panscanflag = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
549 v->reserved = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
550 if (v->reserved) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
551 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
552 av_log(avctx, AV_LOG_ERROR, "RESERVED should be 0 (is %i)\n", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
553 v->reserved); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
554 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
555 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
556 if (v->extended_mv) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
557 v->extended_dmv = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
558 |
2462 | 559 /* 6.1.7, p21 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
560 if (get_bits(gb, 1) /* pic_size_flag */) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
561 { |
2671 | 562 avctx->coded_width = get_bits(gb, 12) << 1; |
563 avctx->coded_height = get_bits(gb, 12) << 1; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
564 if ( get_bits(gb, 1) /* disp_size_flag */) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
565 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
566 avctx->width = get_bits(gb, 14); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
567 avctx->height = get_bits(gb, 14); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
568 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
569 |
2671 | 570 /* 6.1.7.4, p23 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
571 if ( get_bits(gb, 1) /* aspect_ratio_flag */) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
572 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
573 aspect_ratio = get_bits(gb, 4); //SAR |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
574 if (aspect_ratio == 0x0F) //FF_ASPECT_EXTENDED |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
575 { |
2671 | 576 avctx->sample_aspect_ratio.num = 1 + get_bits(gb, 8); |
577 avctx->sample_aspect_ratio.den = 1 + get_bits(gb, 8); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
578 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
579 else if (aspect_ratio == 0x0E) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
580 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
581 av_log(avctx, AV_LOG_DEBUG, "Reserved AR found\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
582 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
583 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
584 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
585 avctx->sample_aspect_ratio = vc9_pixel_aspect[aspect_ratio]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
586 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
587 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
588 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
589 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
590 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
591 avctx->coded_width = avctx->width; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
592 avctx->coded_height = avctx->height; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
593 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
594 |
2462 | 595 /* 6.1.8, p23 */ |
2671 | 596 if ( get_bits(gb, 1) /* framerateflag */) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
597 { |
2671 | 598 if ( !get_bits(gb, 1) /* framerateind */) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
599 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
600 nr = get_bits(gb, 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
601 dr = get_bits(gb, 4); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
602 if (nr<1) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
603 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
604 av_log(avctx, AV_LOG_ERROR, "0 is forbidden for FRAMERATENR\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
605 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
606 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
607 if (nr>5) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
608 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
609 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
610 "Reserved FRAMERATENR %i not handled\n", nr); |
2671 | 611 nr = 5; /* overflow protection */ |
2685 | 612 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
613 if (dr<1) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
614 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
615 av_log(avctx, AV_LOG_ERROR, "0 is forbidden for FRAMERATEDR\n"); |
2671 | 616 return -1; |
2685 | 617 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
618 if (dr>2) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
619 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
620 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
621 "Reserved FRAMERATEDR %i not handled\n", dr); |
2671 | 622 dr = 2; /* overflow protection */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
623 } |
2671 | 624 avctx->time_base.num = fps_nr[dr - 1]; |
625 avctx->time_base.den = fps_nr[nr - 1]; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
626 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
627 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
628 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
629 nr = get_bits(gb, 16); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
630 // 0.03125->2048Hz / 0.03125Hz |
2637 | 631 avctx->time_base.den = 1000000; |
632 avctx->time_base.num = 31250*(1+nr); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
633 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
634 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
635 |
2462 | 636 /* 6.1.9, p25 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
637 if ( get_bits(gb, 1) /* color_format_flag */) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
638 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
639 //Chromacity coordinates of color primaries |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
640 //like ITU-R BT.709-2, BT.470-2, ... |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
641 v->color_prim = get_bits(gb, 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
642 if (v->color_prim<1) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
643 { |
2671 | 644 av_log(avctx, AV_LOG_ERROR, "0 for COLOR_PRIM is forbidden\n"); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
645 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
646 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
647 if (v->color_prim == 3 || v->color_prim>6) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
648 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
649 av_log(avctx, AV_LOG_DEBUG, "Reserved COLOR_PRIM %i found\n", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
650 v->color_prim); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
651 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
652 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
653 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
654 //Opto-electronic transfer characteristics |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
655 v->transfer_char = get_bits(gb, 8); |
2671 | 656 if (v->transfer_char < 1) |
657 { | |
658 av_log(avctx, AV_LOG_ERROR, "0 for TRAMSFER_CHAR is forbidden\n"); | |
659 return -1; | |
660 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
661 if (v->transfer_char == 3 || v->transfer_char>8) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
662 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
663 av_log(avctx, AV_LOG_DEBUG, "Reserved TRANSFERT_CHAR %i found\n", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
664 v->color_prim); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
665 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
666 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
667 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
668 //Matrix coefficient for primariev->YCbCr |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
669 v->matrix_coef = get_bits(gb, 8); |
2671 | 670 if (v->matrix_coef < 1) |
671 { | |
672 av_log(avctx, AV_LOG_ERROR, "0 for MATRIX_COEF is forbidden\n"); | |
673 return -1; | |
674 } | |
675 if ((v->matrix_coef > 2 && v->matrix_coef < 6) || v->matrix_coef > 7) | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
676 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
677 av_log(avctx, AV_LOG_DEBUG, "Reserved MATRIX_COEF %i found\n", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
678 v->color_prim); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
679 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
680 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
681 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
682 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
683 //Hypothetical reference decoder indicator flag |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
684 v->hrd_param_flag = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
685 if (v->hrd_param_flag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
686 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
687 if (decode_hrd(v, gb) < 0) return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
688 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
689 |
2688 | 690 /*reset scaling ranges, 6.2.2 & 6.2.3, p33*/ |
691 v->range_mapy_flag = 0; | |
692 v->range_mapuv_flag = 0; | |
693 | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
694 av_log(avctx, AV_LOG_DEBUG, "Advanced profile not supported yet\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
695 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
696 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
697 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
698 |
2967 | 699 /** |
2482 | 700 * Decode Simple/Main Profiles sequence header |
701 * @see Figure 7-8, p16-17 | |
702 * @param avctx Codec context | |
703 * @param gb GetBit context initialized from Codec context extra_data | |
704 * @return Status | |
705 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
706 static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
707 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
708 VC9Context *v = avctx->priv_data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
709 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
710 av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32)); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
711 v->profile = get_bits(gb, 2); |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
712 if (v->profile == 2) |
2671 | 713 { |
714 av_log(avctx, AV_LOG_ERROR, "Profile value 2 is forbidden\n"); | |
715 return -1; | |
716 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
717 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
718 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
719 if (v->profile == PROFILE_ADVANCED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
720 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
721 v->level = get_bits(gb, 3); |
2671 | 722 if(v->level >= 5) |
723 { | |
724 av_log(avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level); | |
725 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
726 v->chromaformat = get_bits(gb, 2); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
727 if (v->chromaformat != 1) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
728 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
729 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
730 "Only 4:2:0 chroma format supported\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
731 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
732 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
733 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
734 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
735 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
736 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
737 v->res_sm = get_bits(gb, 2); //reserved |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
738 if (v->res_sm) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
739 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
740 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
741 "Reserved RES_SM=%i is forbidden\n", v->res_sm); |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
742 return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
743 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
744 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
745 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
746 // (fps-2)/4 (->30) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
747 v->frmrtq_postproc = get_bits(gb, 3); //common |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
748 // (bitrate-32kbps)/64kbps |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
749 v->bitrtq_postproc = get_bits(gb, 5); //common |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
750 v->s.loop_filter = get_bits(gb, 1); //common |
2671 | 751 if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) |
752 { | |
753 av_log(avctx, AV_LOG_ERROR, | |
754 "LOOPFILTER shell not be enabled in simple profile\n"); | |
755 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
756 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
757 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
758 if (v->profile < PROFILE_ADVANCED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
759 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
760 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
761 v->res_x8 = get_bits(gb, 1); //reserved |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
762 if (v->res_x8) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
763 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
764 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
765 "1 for reserved RES_X8 is forbidden\n"); |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
766 //return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
767 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
768 v->multires = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
769 v->res_fasttx = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
770 if (!v->res_fasttx) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
771 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
772 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
773 "0 for reserved RES_FASTTX is forbidden\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
774 //return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
775 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
776 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
777 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
778 v->fastuvmc = get_bits(gb, 1); //common |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
779 if (!v->profile && !v->fastuvmc) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
780 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
781 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
782 "FASTUVMC unavailable in Simple Profile\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
783 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
784 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
785 v->extended_mv = get_bits(gb, 1); //common |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
786 if (!v->profile && v->extended_mv) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
787 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
788 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
789 "Extended MVs unavailable in Simple Profile\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
790 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
791 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
792 v->dquant = get_bits(gb, 2); //common |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
793 v->vstransform = get_bits(gb, 1); //common |
2685 | 794 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
795 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
796 if (v->profile < PROFILE_ADVANCED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
797 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
798 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
799 v->res_transtab = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
800 if (v->res_transtab) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
801 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
802 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
803 "1 for reserved RES_TRANSTAB is forbidden\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
804 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
805 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
806 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
807 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
808 v->overlap = get_bits(gb, 1); //common |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
809 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
810 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
811 if (v->profile < PROFILE_ADVANCED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
812 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
813 { |
2474 | 814 v->s.resync_marker = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
815 v->rangered = get_bits(gb, 1); |
2671 | 816 if (v->rangered && v->profile == PROFILE_SIMPLE) |
817 { | |
818 av_log(avctx, AV_LOG_DEBUG, | |
2685 | 819 "RANGERED should be set to 0 in simple profile\n"); |
2671 | 820 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
821 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
822 |
2474 | 823 v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
824 v->quantizer_mode = get_bits(gb, 2); //common |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
825 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
826 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
827 if (v->profile < PROFILE_ADVANCED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
828 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
829 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
830 v->finterpflag = get_bits(gb, 1); //common |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
831 v->res_rtm_flag = get_bits(gb, 1); //reserved |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
832 if (!v->res_rtm_flag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
833 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
834 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
835 "0 for reserved RES_RTM_FLAG is forbidden\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
836 //return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
837 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
838 #if TRACE |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
839 av_log(avctx, AV_LOG_INFO, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
840 "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n" |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
841 "LoopFilter=%i, MultiRes=%i, FastUVMV=%i, Extended MV=%i\n" |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
842 "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n" |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
843 "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
844 v->profile, v->frmrtq_postproc, v->bitrtq_postproc, |
2482 | 845 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv, |
2474 | 846 v->rangered, v->vstransform, v->overlap, v->s.resync_marker, |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
847 v->dquant, v->quantizer_mode, avctx->max_b_frames |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
848 ); |
2462 | 849 return 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
850 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
851 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
852 #if HAS_ADVANCED_PROFILE |
2462 | 853 else return decode_advanced_sequence_header(avctx, gb); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
854 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
855 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
856 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
857 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
858 #if HAS_ADVANCED_PROFILE |
2482 | 859 /** Entry point decoding (Advanced Profile) |
860 * @param avctx Codec context | |
861 * @param gb GetBit context initialized from avctx->extra_data | |
862 * @return Status | |
863 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
864 static int advanced_entry_point_process(AVCodecContext *avctx, GetBitContext *gb) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
865 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
866 VC9Context *v = avctx->priv_data; |
2688 | 867 int i; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
868 if (v->profile != PROFILE_ADVANCED) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
869 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
870 av_log(avctx, AV_LOG_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
871 "Entry point are only defined in Advanced Profile!\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
872 return -1; //Only for advanced profile! |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
873 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
874 if (v->hrd_param_flag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
875 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
876 //Update buffer fullness |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
877 av_log(avctx, AV_LOG_DEBUG, "Buffer fullness update\n"); |
2688 | 878 assert(v->hrd_num_leaky_buckets > 0); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
879 for (i=0; i<v->hrd_num_leaky_buckets; i++) |
2688 | 880 v->hrd_fullness[i] = get_bits(gb, 8); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
881 } |
2688 | 882 if ((v->range_mapy_flag = get_bits(gb, 1))) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
883 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
884 //RANGE_MAPY |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
885 av_log(avctx, AV_LOG_DEBUG, "RANGE_MAPY\n"); |
2688 | 886 v->range_mapy = get_bits(gb, 3); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
887 } |
2688 | 888 if ((v->range_mapuv_flag = get_bits(gb, 1))) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
889 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
890 //RANGE_MAPUV |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
891 av_log(avctx, AV_LOG_DEBUG, "RANGE_MAPUV\n"); |
2688 | 892 v->range_mapuv = get_bits(gb, 3); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
893 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
894 if (v->panscanflag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
895 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
896 //NUMPANSCANWIN |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
897 v->numpanscanwin = get_bits(gb, 3); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
898 av_log(avctx, AV_LOG_DEBUG, "NUMPANSCANWIN: %u\n", v->numpanscanwin); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
899 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
900 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
901 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
902 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
903 |
2482 | 904 /***********************************************************************/ |
905 /** | |
906 * @defgroup bitplane VC9 Bitplane decoding | |
907 * @see 8.7, p56 | |
908 * @{ | |
909 */ | |
910 | |
911 /** @addtogroup bitplane | |
912 * Imode types | |
913 * @{ | |
914 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
915 #define IMODE_RAW 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
916 #define IMODE_NORM2 1 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
917 #define IMODE_DIFF2 2 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
918 #define IMODE_NORM6 3 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
919 #define IMODE_DIFF6 4 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
920 #define IMODE_ROWSKIP 5 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
921 #define IMODE_COLSKIP 6 |
2482 | 922 /** @} */ //imode defines |
923 | |
924 /** Allocate the buffer from a bitplane, given its dimensions | |
925 * @param bp Bitplane which buffer is to allocate | |
926 * @param[in] width Width of the buffer | |
927 * @param[in] height Height of the buffer | |
928 * @return Status | |
929 * @todo TODO: Take into account stride | |
930 * @todo TODO: Allow use of external buffers ? | |
931 */ | |
3075 | 932 static int alloc_bitplane(BitPlane *bp, int width, int height) |
2462 | 933 { |
934 if (!bp || bp->width<0 || bp->height<0) return -1; | |
935 bp->data = (uint8_t*)av_malloc(width*height); | |
936 if (!bp->data) return -1; | |
2967 | 937 bp->width = bp->stride = width; |
2462 | 938 bp->height = height; |
939 return 0; | |
940 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
941 |
2482 | 942 /** Free the bitplane's buffer |
943 * @param bp Bitplane which buffer is to free | |
944 */ | |
3075 | 945 static void free_bitplane(BitPlane *bp) |
2474 | 946 { |
947 bp->width = bp->stride = bp->height = 0; | |
948 if (bp->data) av_freep(&bp->data); | |
949 } | |
950 | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
951 /** Decode rows by checking if they are skipped |
2482 | 952 * @param plane Buffer to store decoded bits |
953 * @param[in] width Width of this buffer | |
954 * @param[in] height Height of this buffer | |
955 * @param[in] stride of this buffer | |
956 */ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
957 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ |
2459 | 958 int x, y; |
959 | |
960 for (y=0; y<height; y++){ | |
2474 | 961 if (!get_bits(gb, 1)) //rowskip |
2459 | 962 memset(plane, 0, width); |
963 else | |
2967 | 964 for (x=0; x<width; x++) |
2474 | 965 plane[x] = get_bits(gb, 1); |
2459 | 966 plane += stride; |
967 } | |
968 } | |
969 | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
970 /** Decode columns by checking if they are skipped |
2482 | 971 * @param plane Buffer to store decoded bits |
972 * @param[in] width Width of this buffer | |
973 * @param[in] height Height of this buffer | |
974 * @param[in] stride of this buffer | |
975 * @fixme FIXME: Optimize | |
976 */ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
977 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ |
2459 | 978 int x, y; |
979 | |
980 for (x=0; x<width; x++){ | |
2474 | 981 if (!get_bits(gb, 1)) //colskip |
2459 | 982 for (y=0; y<height; y++) |
983 plane[y*stride] = 0; | |
984 else | |
985 for (y=0; y<height; y++) | |
2474 | 986 plane[y*stride] = get_bits(gb, 1); |
2459 | 987 plane ++; |
988 } | |
989 } | |
990 | |
2482 | 991 /** Decode a bitplane's bits |
992 * @param bp Bitplane where to store the decode bits | |
993 * @param v VC9 context for bit reading and logging | |
994 * @return Status | |
995 * @fixme FIXME: Optimize | |
996 * @todo TODO: Decide if a struct is needed | |
997 */ | |
2462 | 998 static int bitplane_decoding(BitPlane *bp, VC9Context *v) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
999 { |
2474 | 1000 GetBitContext *gb = &v->s.gb; |
1001 | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1002 int imode, x, y, code, use_vertical_tile, tile_w, tile_h, offset; |
2462 | 1003 uint8_t invert, *planep = bp->data; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1004 |
2474 | 1005 invert = get_bits(gb, 1); |
1006 imode = get_vlc2(gb, vc9_imode_vlc.table, VC9_IMODE_VLC_BITS, 2); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1007 |
2462 | 1008 bp->is_raw = 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1009 switch (imode) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1010 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1011 case IMODE_RAW: |
2462 | 1012 //Data is actually read in the MB layer (same for all tests == "raw") |
1013 bp->is_raw = 1; //invert ignored | |
1014 return invert; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1015 case IMODE_DIFF2: |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1016 case IMODE_NORM2: |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1017 if ((bp->height*bp->width) & 1) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1018 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1019 *(++planep) = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1020 offset = x = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1021 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1022 else offset = x = 0; |
2685 | 1023 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1024 for (y=0; y<bp->height; y++) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1025 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1026 for(; x<bp->width; x+=2) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1027 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1028 code = get_vlc2(gb, vc9_norm2_vlc.table, VC9_NORM2_VLC_BITS, 2); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1029 *(++planep) = code&1; //lsb => left |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1030 *(++planep) = (code>>1)&1; //msb => right |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1031 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1032 planep += bp->stride-bp->width; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1033 if ((bp->width-offset)&1) //Odd number previously processed |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1034 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1035 code = get_vlc2(gb, vc9_norm2_vlc.table, VC9_NORM2_VLC_BITS, 2); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1036 *planep = code&1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1037 planep += bp->stride-bp->width; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1038 *planep = (code>>1)&1; //msb => right |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1039 offset = x = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1040 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1041 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1042 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1043 offset = x = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1044 planep += bp->stride-bp->width; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1045 } |
2459 | 1046 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1047 break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1048 case IMODE_DIFF6: |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1049 case IMODE_NORM6: |
2462 | 1050 use_vertical_tile= bp->height%3==0 && bp->width%3!=0; |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1051 tile_w= use_vertical_tile ? 2 : 3; |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1052 tile_h= use_vertical_tile ? 3 : 2; |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1053 |
2462 | 1054 for(y= bp->height%tile_h; y< bp->height; y+=tile_h){ |
1055 for(x= bp->width%tile_w; x< bp->width; x+=tile_w){ | |
2474 | 1056 code = get_vlc2(gb, vc9_norm6_vlc.table, VC9_NORM6_VLC_BITS, 2); |
2463
9baa47d8297b
check norm6 vlc validity as there are some bit sequences which dont corespond to any codeword, the other vlc tables all seem to be huffman tables though
michael
parents:
2462
diff
changeset
|
1057 if(code<0){ |
2482 | 1058 av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n"); |
2463
9baa47d8297b
check norm6 vlc validity as there are some bit sequences which dont corespond to any codeword, the other vlc tables all seem to be huffman tables though
michael
parents:
2462
diff
changeset
|
1059 return -1; |
9baa47d8297b
check norm6 vlc validity as there are some bit sequences which dont corespond to any codeword, the other vlc tables all seem to be huffman tables though
michael
parents:
2462
diff
changeset
|
1060 } |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1061 //FIXME following is a pure guess and probably wrong |
2462 | 1062 //FIXME A bitplane (0 | !0), so could the shifts be avoided ? |
1063 planep[x + 0*bp->stride]= (code>>0)&1; | |
1064 planep[x + 1 + 0*bp->stride]= (code>>1)&1; | |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1065 //FIXME Does branch prediction help here? |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1066 if(use_vertical_tile){ |
2462 | 1067 planep[x + 0 + 1*bp->stride]= (code>>2)&1; |
1068 planep[x + 1 + 1*bp->stride]= (code>>3)&1; | |
1069 planep[x + 0 + 2*bp->stride]= (code>>4)&1; | |
1070 planep[x + 1 + 2*bp->stride]= (code>>5)&1; | |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1071 }else{ |
2462 | 1072 planep[x + 2 + 0*bp->stride]= (code>>2)&1; |
1073 planep[x + 0 + 1*bp->stride]= (code>>3)&1; | |
1074 planep[x + 1 + 1*bp->stride]= (code>>4)&1; | |
1075 planep[x + 2 + 1*bp->stride]= (code>>5)&1; | |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1076 } |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1077 } |
2459 | 1078 } |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1079 |
2462 | 1080 x= bp->width % tile_w; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1081 decode_colskip(bp->data , x, bp->height , bp->stride, &v->s.gb); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1082 decode_rowskip(bp->data+x, bp->width - x, bp->height % tile_h, bp->stride, &v->s.gb); |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1083 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1084 break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1085 case IMODE_ROWSKIP: |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1086 decode_rowskip(bp->data, bp->width, bp->height, bp->stride, &v->s.gb); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1087 break; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1088 case IMODE_COLSKIP: |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1089 decode_colskip(bp->data, bp->width, bp->height, bp->stride, &v->s.gb); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1090 break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1091 default: break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1092 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1093 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1094 /* Applying diff operator */ |
2459 | 1095 if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1096 { |
2462 | 1097 planep = bp->data; |
2459 | 1098 planep[0] ^= invert; |
2462 | 1099 for (x=1; x<bp->width; x++) |
2459 | 1100 planep[x] ^= planep[x-1]; |
2462 | 1101 for (y=1; y<bp->height; y++) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1102 { |
2462 | 1103 planep += bp->stride; |
1104 planep[0] ^= planep[-bp->stride]; | |
1105 for (x=1; x<bp->width; x++) | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1106 { |
2462 | 1107 if (planep[x-1] != planep[x-bp->stride]) planep[x] ^= invert; |
1108 else planep[x] ^= planep[x-1]; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1109 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1110 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1111 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1112 else if (invert) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1113 { |
2462 | 1114 planep = bp->data; |
1115 for (x=0; x<bp->width*bp->height; x++) planep[x] = !planep[x]; //FIXME stride | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1116 } |
2462 | 1117 return (imode<<1) + invert; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1118 } |
2482 | 1119 /** @} */ //Bitplane group |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1120 |
2482 | 1121 /***********************************************************************/ |
1122 /** VOP Dquant decoding | |
1123 * @param v VC9 Context | |
1124 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1125 static int vop_dquant_decoding(VC9Context *v) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1126 { |
2474 | 1127 GetBitContext *gb = &v->s.gb; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1128 int pqdiff; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1129 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1130 //variable size |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1131 if (v->dquant == 2) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1132 { |
2474 | 1133 pqdiff = get_bits(gb, 3); |
1134 if (pqdiff == 7) v->altpq = get_bits(gb, 5); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1135 else v->altpq = v->pq + pqdiff + 1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1136 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1137 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1138 { |
2474 | 1139 v->dquantfrm = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1140 if ( v->dquantfrm ) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1141 { |
2474 | 1142 v->dqprofile = get_bits(gb, 2); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1143 switch (v->dqprofile) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1144 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1145 case DQPROFILE_SINGLE_EDGE: |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1146 case DQPROFILE_DOUBLE_EDGES: |
2474 | 1147 v->dqsbedge = get_bits(gb, 2); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1148 break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1149 case DQPROFILE_ALL_MBS: |
2474 | 1150 v->dqbilevel = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1151 default: break; //Forbidden ? |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1152 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1153 if (!v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1154 { |
2474 | 1155 pqdiff = get_bits(gb, 3); |
1156 if (pqdiff == 7) v->altpq = get_bits(gb, 5); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1157 else v->altpq = v->pq + pqdiff + 1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1158 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1159 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1160 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1161 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1162 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1163 |
2482 | 1164 /***********************************************************************/ |
2967 | 1165 /** |
2482 | 1166 * @defgroup all_frame_hdr All VC9 profiles frame header |
1167 * @brief Part of the frame header decoding from all profiles | |
1168 * @warning Only pro/epilog differs between Simple/Main and Advanced => check caller | |
1169 * @{ | |
1170 */ | |
1171 /** B and BI frame header decoding, primary part | |
1172 * @see Tables 11+12, p62-65 | |
1173 * @param v VC9 context | |
1174 * @return Status | |
1175 * @warning Also handles BI frames | |
1176 */ | |
2474 | 1177 static int decode_b_picture_primary_header(VC9Context *v) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1178 { |
2474 | 1179 GetBitContext *gb = &v->s.gb; |
2483 | 1180 int pqindex; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1181 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1182 /* Prolog common to all frametypes should be done in caller */ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1183 if (v->profile == PROFILE_SIMPLE) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1184 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1185 av_log(v->s.avctx, AV_LOG_ERROR, "Found a B frame while in Simple Profile!\n"); |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
1186 return FRAME_SKIPPED; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1187 } |
2474 | 1188 v->bfraction = vc9_bfraction_lut[get_vlc2(gb, vc9_bfraction_vlc.table, |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1189 VC9_BFRACTION_VLC_BITS, 2)]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1190 if (v->bfraction < -1) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1191 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1192 av_log(v->s.avctx, AV_LOG_ERROR, "Invalid BFRaction\n"); |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
1193 return FRAME_SKIPPED; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1194 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1195 else if (!v->bfraction) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1196 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1197 /* We actually have a BI frame */ |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1198 v->s.pict_type = BI_TYPE; |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1199 v->buffer_fullness = get_bits(gb, 7); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1200 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1201 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1202 /* Read the quantization stuff */ |
2474 | 1203 pqindex = get_bits(gb, 5); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1204 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1205 v->pq = pquant_table[0][pqindex]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1206 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1207 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1208 v->pq = pquant_table[v->quantizer_mode-1][pqindex]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1209 } |
2474 | 1210 if (pqindex < 9) v->halfpq = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1211 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
2474 | 1212 v->pquantizer = get_bits(gb, 1); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1213 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1214 if (v->profile == PROFILE_ADVANCED) |
2483 | 1215 { |
1216 if (v->postprocflag) v->postproc = get_bits(gb, 2); | |
1217 if (v->extended_mv == 1 && v->s.pict_type != BI_TYPE) | |
1218 v->mvrange = get_prefix(gb, 0, 3); | |
1219 } | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1220 #endif |
2483 | 1221 else |
1222 { | |
1223 if (v->extended_mv == 1) | |
1224 v->mvrange = get_prefix(gb, 0, 3); | |
1225 } | |
1226 /* Read the MV mode */ | |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1227 if (v->s.pict_type != BI_TYPE) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1228 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1229 v->mv_mode = get_bits(gb, 1); |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1230 if (v->pq < 13) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1231 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1232 if (!v->mv_mode) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1233 { |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1234 v->mv_mode = get_bits(gb, 2); |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1235 if (v->mv_mode) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1236 av_log(v->s.avctx, AV_LOG_ERROR, |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1237 "mv_mode for lowquant B frame was %i\n", v->mv_mode); |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1238 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1239 } |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1240 else |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1241 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1242 if (!v->mv_mode) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1243 { |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1244 if (get_bits(gb, 1)) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1245 av_log(v->s.avctx, AV_LOG_ERROR, |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1246 "mv_mode for highquant B frame was %i\n", v->mv_mode); |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1247 } |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1248 v->mv_mode = 1-v->mv_mode; //To match (pq < 13) mapping |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1249 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1250 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1251 |
2474 | 1252 return 0; |
1253 } | |
1254 | |
2482 | 1255 /** B and BI frame header decoding, secondary part |
1256 * @see Tables 11+12, p62-65 | |
1257 * @param v VC9 context | |
1258 * @return Status | |
1259 * @warning Also handles BI frames | |
1260 * @warning To call once all MB arrays are allocated | |
2483 | 1261 * @todo Support Advanced Profile headers |
2482 | 1262 */ |
2474 | 1263 static int decode_b_picture_secondary_header(VC9Context *v) |
1264 { | |
1265 GetBitContext *gb = &v->s.gb; | |
1266 int status; | |
1267 | |
2483 | 1268 status = bitplane_decoding(&v->skip_mb_plane, v); |
2474 | 1269 if (status < 0) return -1; |
1270 #if TRACE | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1271 if (v->mv_mode == MV_PMODE_MIXED_MV) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1272 { |
2462 | 1273 status = bitplane_decoding(&v->mv_type_mb_plane, v); |
1274 if (status < 0) | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1275 return -1; |
2462 | 1276 #if TRACE |
2474 | 1277 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " |
2462 | 1278 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1279 #endif | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1280 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1281 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1282 //bitplane |
2462 | 1283 status = bitplane_decoding(&v->direct_mb_plane, v); |
1284 if (status < 0) return -1; | |
1285 #if TRACE | |
2474 | 1286 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct plane encoding: " |
2462 | 1287 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1288 #endif | |
1289 | |
2474 | 1290 av_log(v->s.avctx, AV_LOG_DEBUG, "Skip MB plane encoding: " |
2462 | 1291 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1292 #endif | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1293 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1294 /* FIXME: what is actually chosen for B frames ? */ |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1295 v->s.mv_table_index = get_bits(gb, 2); //but using vc9_ tables |
2474 | 1296 v->cbpcy_vlc = &vc9_cbpcy_p_vlc[get_bits(gb, 2)]; |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1297 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1298 if (v->dquant) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1299 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1300 vop_dquant_decoding(v); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1301 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1302 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1303 if (v->vstransform) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1304 { |
2474 | 1305 v->ttmbf = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1306 if (v->ttmbf) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1307 { |
2474 | 1308 v->ttfrm = get_bits(gb, 2); |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1309 av_log(v->s.avctx, AV_LOG_INFO, "Transform used: %ix%i\n", |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1310 (v->ttfrm & 2) ? 4 : 8, (v->ttfrm & 1) ? 4 : 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1311 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1312 } |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1313 /* Epilog (AC/DC syntax) should be done in caller */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1314 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1315 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1316 |
2482 | 1317 /** I frame header decoding, primary part |
1318 * @see Tables 5+7, p53-54 and 55-57 | |
1319 * @param v VC9 context | |
1320 * @return Status | |
2483 | 1321 * @todo Support Advanced Profile headers |
2482 | 1322 */ |
2483 | 1323 static int decode_i_picture_primary_header(VC9Context *v) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1324 { |
2474 | 1325 GetBitContext *gb = &v->s.gb; |
2483 | 1326 int pqindex; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1327 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1328 /* Prolog common to all frametypes should be done in caller */ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1329 //BF = Buffer Fullness |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1330 if (v->profile < PROFILE_ADVANCED && get_bits(gb, 7)) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1331 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1332 av_log(v->s.avctx, AV_LOG_DEBUG, "I BufferFullness not 0\n"); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1333 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1334 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1335 /* Quantizer stuff */ |
2474 | 1336 pqindex = get_bits(gb, 5); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1337 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1338 v->pq = pquant_table[0][pqindex]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1339 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1340 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1341 v->pq = pquant_table[v->quantizer_mode-1][pqindex]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1342 } |
2474 | 1343 if (pqindex < 9) v->halfpq = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1344 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
2474 | 1345 v->pquantizer = get_bits(gb, 1); |
1346 av_log(v->s.avctx, AV_LOG_DEBUG, "I frame: QP=%i (+%i/2)\n", | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1347 v->pq, v->halfpq); |
2483 | 1348 return 0; |
1349 } | |
1350 | |
1351 /** I frame header decoding, secondary part | |
1352 * @param v VC9 context | |
1353 * @return Status | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1354 * @warning Not called in A/S/C profiles, it seems |
2483 | 1355 * @todo Support Advanced Profile headers |
1356 */ | |
1357 static int decode_i_picture_secondary_header(VC9Context *v) | |
1358 { | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1359 #if HAS_ADVANCED_PROFILE |
2483 | 1360 int status; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1361 if (v->profile == PROFILE_ADVANCED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1362 { |
2483 | 1363 v->s.ac_pred = get_bits(&v->s.gb, 1); |
1364 if (v->postprocflag) v->postproc = get_bits(&v->s.gb, 1); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1365 /* 7.1.1.34 + 8.5.2 */ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1366 if (v->overlap && v->pq<9) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1367 { |
2483 | 1368 v->condover = get_bits(&v->s.gb, 1); |
2462 | 1369 if (v->condover) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1370 { |
2483 | 1371 v->condover = 2+get_bits(&v->s.gb, 1); |
2462 | 1372 if (v->condover == 3) |
1373 { | |
1374 status = bitplane_decoding(&v->over_flags_plane, v); | |
1375 if (status < 0) return -1; | |
2483 | 1376 # if TRACE |
2474 | 1377 av_log(v->s.avctx, AV_LOG_DEBUG, "Overflags plane encoding: " |
2462 | 1378 "Imode: %i, Invert: %i\n", status>>1, status&1); |
2483 | 1379 # endif |
2462 | 1380 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1381 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1382 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1383 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1384 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1385 |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1386 /* Epilog (AC/DC syntax) should be done in caller */ |
2483 | 1387 return 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1388 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1389 |
2482 | 1390 /** P frame header decoding, primary part |
1391 * @see Tables 5+7, p53-54 and 55-57 | |
1392 * @param v VC9 context | |
2483 | 1393 * @todo Support Advanced Profile headers |
2482 | 1394 * @return Status |
1395 */ | |
2474 | 1396 static int decode_p_picture_primary_header(VC9Context *v) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1397 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1398 /* INTERFRM, FRMCNT, RANGEREDFRM read in caller */ |
2474 | 1399 GetBitContext *gb = &v->s.gb; |
2483 | 1400 int lowquant, pqindex; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1401 |
2474 | 1402 pqindex = get_bits(gb, 5); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1403 if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1404 v->pq = pquant_table[0][pqindex]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1405 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1406 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1407 v->pq = pquant_table[v->quantizer_mode-1][pqindex]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1408 } |
2474 | 1409 if (pqindex < 9) v->halfpq = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1410 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
2474 | 1411 v->pquantizer = get_bits(gb, 1); |
1412 av_log(v->s.avctx, AV_LOG_DEBUG, "P Frame: QP=%i (+%i/2)\n", | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1413 v->pq, v->halfpq); |
2474 | 1414 if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1415 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1416 if (v->profile == PROFILE_ADVANCED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1417 { |
2474 | 1418 if (v->postprocflag) v->postproc = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1419 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1420 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1421 #endif |
2474 | 1422 if (v->multires) v->respic = get_bits(gb, 2); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1423 lowquant = (v->pquantizer>12) ? 0 : 1; |
2474 | 1424 v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)]; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1425 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1426 { |
2474 | 1427 v->mv_mode2 = mv_pmode_table[lowquant][get_prefix(gb, 1, 3)]; |
1428 v->lumscale = get_bits(gb, 6); | |
1429 v->lumshift = get_bits(gb, 6); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1430 } |
2474 | 1431 return 0; |
1432 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1433 |
2482 | 1434 /** P frame header decoding, secondary part |
1435 * @see Tables 5+7, p53-54 and 55-57 | |
1436 * @param v VC9 context | |
1437 * @warning To call once all MB arrays are allocated | |
1438 * @return Status | |
1439 */ | |
2474 | 1440 static int decode_p_picture_secondary_header(VC9Context *v) |
1441 { | |
1442 GetBitContext *gb = &v->s.gb; | |
1443 int status = 0; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1444 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1445 v->mv_mode2 == MV_PMODE_MIXED_MV) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1446 || v->mv_mode == MV_PMODE_MIXED_MV) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1447 { |
2462 | 1448 status = bitplane_decoding(&v->mv_type_mb_plane, v); |
1449 if (status < 0) return -1; | |
1450 #if TRACE | |
2474 | 1451 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " |
2462 | 1452 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1453 #endif | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1454 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1455 |
2462 | 1456 status = bitplane_decoding(&v->skip_mb_plane, v); |
1457 if (status < 0) return -1; | |
1458 #if TRACE | |
2474 | 1459 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " |
2462 | 1460 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1461 #endif | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1462 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1463 /* Hopefully this is correct for P frames */ |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1464 v->s.mv_table_index =get_bits(gb, 2); //but using vc9_ tables |
2474 | 1465 v->cbpcy_vlc = &vc9_cbpcy_p_vlc[get_bits(gb, 2)]; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1466 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1467 if (v->dquant) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1468 { |
2474 | 1469 av_log(v->s.avctx, AV_LOG_INFO, "VOP DQuant info\n"); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1470 vop_dquant_decoding(v); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1471 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1472 |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1473 v->ttfrm = 0; //FIXME Is that so ? |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1474 if (v->vstransform) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1475 { |
2474 | 1476 v->ttmbf = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1477 if (v->ttmbf) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1478 { |
2474 | 1479 v->ttfrm = get_bits(gb, 2); |
1480 av_log(v->s.avctx, AV_LOG_INFO, "Transform used: %ix%i\n", | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1481 (v->ttfrm & 2) ? 4 : 8, (v->ttfrm & 1) ? 4 : 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1482 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1483 } |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1484 /* Epilog (AC/DC syntax) should be done in caller */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1485 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1486 } |
2482 | 1487 /** @} */ //End of group all_frm_hdr |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1488 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1489 |
2482 | 1490 /***********************************************************************/ |
2967 | 1491 /** |
2482 | 1492 * @defgroup std_frame_hdr VC9 Simple/Main Profiles header decoding |
1493 * @brief Part of the frame header decoding belonging to Simple/Main Profiles | |
1494 * @warning Only pro/epilog differs between Simple/Main and Advanced => | |
1495 * check caller | |
1496 * @{ | |
1497 */ | |
1498 | |
1499 /** Frame header decoding, first part, in Simple and Main profiles | |
1500 * @see Tables 5+7, p53-54 and 55-57 | |
1501 * @param v VC9 context | |
2483 | 1502 * @todo FIXME: RANGEREDFRM element not read if BI frame from Table6, P54 |
1503 * However, 7.1.1.8 says "all frame types, for main profiles" | |
2482 | 1504 * @return Status |
1505 */ | |
2474 | 1506 static int standard_decode_picture_primary_header(VC9Context *v) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1507 { |
2474 | 1508 GetBitContext *gb = &v->s.gb; |
1509 int status = 0; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1510 |
2474 | 1511 if (v->finterpflag) v->interpfrm = get_bits(gb, 1); |
1512 skip_bits(gb, 2); //framecnt unused | |
1513 if (v->rangered) v->rangeredfrm = get_bits(gb, 1); | |
1514 v->s.pict_type = get_bits(gb, 1); | |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1515 if (v->s.avctx->max_b_frames) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1516 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1517 if (!v->s.pict_type) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1518 { |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1519 if (get_bits(gb, 1)) v->s.pict_type = I_TYPE; |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1520 else v->s.pict_type = B_TYPE; |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1521 } |
2474 | 1522 else v->s.pict_type = P_TYPE; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1523 } |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1524 else v->s.pict_type++; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1525 |
2474 | 1526 switch (v->s.pict_type) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1527 { |
2483 | 1528 case I_TYPE: status = decode_i_picture_primary_header(v); break; |
2474 | 1529 case P_TYPE: status = decode_p_picture_primary_header(v); break; |
2483 | 1530 case BI_TYPE: //Same as B |
2474 | 1531 case B_TYPE: status = decode_b_picture_primary_header(v); break; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1532 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1533 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
1534 if (status == FRAME_SKIPPED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1535 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1536 av_log(v->s.avctx, AV_LOG_INFO, "Skipping frame...\n"); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1537 return status; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1538 } |
2474 | 1539 return 0; |
1540 } | |
1541 | |
2482 | 1542 /** Frame header decoding, secondary part |
1543 * @param v VC9 context | |
1544 * @warning To call once all MB arrays are allocated | |
1545 * @return Status | |
1546 */ | |
2474 | 1547 static int standard_decode_picture_secondary_header(VC9Context *v) |
1548 { | |
1549 GetBitContext *gb = &v->s.gb; | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1550 int status = 0; |
2474 | 1551 |
1552 switch (v->s.pict_type) | |
1553 { | |
1554 case P_TYPE: status = decode_p_picture_secondary_header(v); break; | |
1555 case B_TYPE: status = decode_b_picture_secondary_header(v); break; | |
2483 | 1556 case BI_TYPE: |
1557 case I_TYPE: break; //Nothing needed as it's done in the epilog | |
2474 | 1558 } |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
1559 if (status < 0) return FRAME_SKIPPED; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1560 |
2462 | 1561 /* AC Syntax */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1562 v->c_ac_table_index = decode012(gb); |
2474 | 1563 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1564 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1565 v->y_ac_table_index = decode012(gb); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1566 } |
2462 | 1567 /* DC Syntax */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1568 v->s.dc_table_index = decode012(gb); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1569 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1570 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1571 } |
2482 | 1572 /** @} */ //End for group std_frame_hdr |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1573 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1574 #if HAS_ADVANCED_PROFILE |
2482 | 1575 /***********************************************************************/ |
2967 | 1576 /** |
2482 | 1577 * @defgroup adv_frame_hdr VC9 Advanced Profile header decoding |
1578 * @brief Part of the frame header decoding belonging to Advanced Profiles | |
1579 * @warning Only pro/epilog differs between Simple/Main and Advanced => | |
1580 * check caller | |
1581 * @{ | |
1582 */ | |
2967 | 1583 /** Frame header decoding, primary part |
2482 | 1584 * @param v VC9 context |
1585 * @return Status | |
1586 */ | |
2474 | 1587 static int advanced_decode_picture_primary_header(VC9Context *v) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1588 { |
2474 | 1589 GetBitContext *gb = &v->s.gb; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1590 static const int type_table[4] = { P_TYPE, B_TYPE, I_TYPE, BI_TYPE }; |
2483 | 1591 int type; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1592 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1593 if (v->interlace) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1594 { |
2474 | 1595 v->fcm = get_bits(gb, 1); |
1596 if (v->fcm) v->fcm = 2+get_bits(gb, 1); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1597 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1598 |
2474 | 1599 type = get_prefix(gb, 0, 4); |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
1600 if (type > 4 || type < 0) return FRAME_SKIPPED; |
2474 | 1601 v->s.pict_type = type_table[type]; |
1602 av_log(v->s.avctx, AV_LOG_INFO, "AP Frame Type: %i\n", v->s.pict_type); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1603 |
2474 | 1604 if (v->tfcntrflag) v->tfcntr = get_bits(gb, 8); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1605 if (v->broadcast) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1606 { |
2474 | 1607 if (!v->interlace) v->rptfrm = get_bits(gb, 2); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1608 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1609 { |
2474 | 1610 v->tff = get_bits(gb, 1); |
1611 v->rff = get_bits(gb, 1); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1612 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1613 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1614 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1615 if (v->panscanflag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1616 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1617 #if 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1618 for (i=0; i<v->numpanscanwin; i++) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1619 { |
2474 | 1620 v->topleftx[i] = get_bits(gb, 16); |
1621 v->toplefty[i] = get_bits(gb, 16); | |
1622 v->bottomrightx[i] = get_bits(gb, 16); | |
1623 v->bottomrighty[i] = get_bits(gb, 16); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1624 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1625 #else |
2474 | 1626 skip_bits(gb, 16*4*v->numpanscanwin); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1627 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1628 } |
2474 | 1629 v->s.no_rounding = !get_bits(gb, 1); |
1630 v->uvsamp = get_bits(gb, 1); | |
1631 if (v->finterpflag == 1) v->interpfrm = get_bits(gb, 1); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1632 |
2474 | 1633 switch(v->s.pict_type) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1634 { |
2483 | 1635 case I_TYPE: if (decode_i_picture_primary_header(v) < 0) return -1; |
2474 | 1636 case P_TYPE: if (decode_p_picture_primary_header(v) < 0) return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1637 case BI_TYPE: |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
1638 case B_TYPE: if (decode_b_picture_primary_header(v) < 0) return FRAME_SKIPPED; |
2483 | 1639 default: return -1; |
2474 | 1640 } |
1641 } | |
1642 | |
2482 | 1643 /** Frame header decoding, secondary part |
1644 * @param v VC9 context | |
1645 * @return Status | |
1646 */ | |
2474 | 1647 static int advanced_decode_picture_secondary_header(VC9Context *v) |
1648 { | |
1649 GetBitContext *gb = &v->s.gb; | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1650 int status = 0; |
2474 | 1651 |
1652 switch(v->s.pict_type) | |
1653 { | |
2483 | 1654 case P_TYPE: status = decode_p_picture_secondary_header(v); break; |
1655 case B_TYPE: status = decode_b_picture_secondary_header(v); break; | |
1656 case BI_TYPE: | |
2967 | 1657 case I_TYPE: status = decode_i_picture_secondary_header(v); break; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1658 } |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
1659 if (status<0) return FRAME_SKIPPED; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1660 |
2462 | 1661 /* AC Syntax */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1662 v->c_ac_table_index = decode012(gb); |
2474 | 1663 if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1664 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1665 v->y_ac_table_index = decode012(gb); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1666 } |
2462 | 1667 /* DC Syntax */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1668 v->s.dc_table_index = decode012(gb); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1669 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1670 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1671 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1672 #endif |
2482 | 1673 /** @} */ //End for adv_frame_hdr |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1674 |
2482 | 1675 /***********************************************************************/ |
2967 | 1676 /** |
2482 | 1677 * @defgroup block VC9 Block-level functions |
1678 * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | |
1679 * @todo TODO: Integrate to MpegEncContext facilities | |
1680 * @{ | |
1681 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1682 |
2482 | 1683 /** |
1684 * @def GET_MQUANT | |
1685 * @brief Get macroblock-level quantizer scale | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1686 * @warning XXX: qdiff to the frame quant, not previous quant ? |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1687 * @fixme XXX: Don't know how to initialize mquant otherwise in last case |
2482 | 1688 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1689 #define GET_MQUANT() \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1690 if (v->dquantfrm) \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1691 { \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1692 if (v->dqprofile == DQPROFILE_ALL_MBS) \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1693 { \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1694 if (v->dqbilevel) \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1695 { \ |
2474 | 1696 mquant = (get_bits(gb, 1)) ? v->pq : v->altpq; \ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1697 } \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1698 else \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1699 { \ |
2474 | 1700 mqdiff = get_bits(gb, 3); \ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1701 if (mqdiff != 7) mquant = v->pq + mqdiff; \ |
2474 | 1702 else mquant = get_bits(gb, 5); \ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1703 } \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1704 } \ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1705 else mquant = v->pq; \ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1706 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1707 |
2482 | 1708 /** |
1709 * @def GET_MVDATA(_dmv_x, _dmv_y) | |
1710 * @brief Get MV differentials | |
1711 * @see MVDATA decoding from 8.3.5.2, p(1)20 | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1712 * @param _dmv_x Horizontal differential for decoded MV |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1713 * @param _dmv_y Vertical differential for decoded MV |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1714 * @todo TODO: Use MpegEncContext arrays to store them |
2482 | 1715 */ |
2462 | 1716 #define GET_MVDATA(_dmv_x, _dmv_y) \ |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1717 index = 1 + get_vlc2(gb, vc9_mv_diff_vlc[s->mv_table_index].table,\ |
2462 | 1718 VC9_MV_DIFF_VLC_BITS, 2); \ |
1719 if (index > 36) \ | |
1720 { \ | |
1721 mb_has_coeffs = 1; \ | |
1722 index -= 37; \ | |
1723 } \ | |
1724 else mb_has_coeffs = 0; \ | |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1725 s->mb_intra = 0; \ |
2462 | 1726 if (!index) { _dmv_x = _dmv_y = 0; } \ |
1727 else if (index == 35) \ | |
1728 { \ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1729 _dmv_x = get_bits(gb, v->k_x); \ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1730 _dmv_y = get_bits(gb, v->k_y); \ |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1731 s->mb_intra = 1; \ |
2462 | 1732 } \ |
1733 else \ | |
1734 { \ | |
1735 index1 = index%6; \ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1736 if (s->mspel && index1 == 5) val = 1; \ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1737 else val = 0; \ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1738 val = get_bits(gb, size_table[index1] - val); \ |
2462 | 1739 sign = 0 - (val&1); \ |
1740 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ | |
1741 \ | |
1742 index1 = index/6; \ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1743 if (s->mspel && index1 == 5) val = 1; \ |
2462 | 1744 else val = 0; \ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1745 val = get_bits(gb, size_table[index1] - val); \ |
2462 | 1746 sign = 0 - (val&1); \ |
1747 _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1748 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1749 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1750 /** Get predicted DC value |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1751 * prediction dir: left=0, top=1 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1752 * @param s MpegEncContext |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1753 * @param[in] n block index in the current MB |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1754 * @param dc_val_ptr Pointer to DC predictor |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1755 * @param dir_ptr Prediction direction for use in AC prediction |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1756 * @todo TODO: Actually do it the VC9 way |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1757 * @todo TODO: Handle properly edges |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1758 */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1759 static inline int vc9_pred_dc(MpegEncContext *s, int n, |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1760 uint16_t **dc_val_ptr, int *dir_ptr) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1761 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1762 int a, b, c, wrap, pred, scale; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1763 int16_t *dc_val; |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1764 static const uint16_t dcpred[31] = { |
2967 | 1765 1024, 512, 341, 256, 205, 171, 146, 128, |
1766 114, 102, 93, 85, 79, 73, 68, 64, | |
1767 60, 57, 54, 51, 49, 47, 45, 43, | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1768 41, 39, 38, 37, 35, 34, 33 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1769 }; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1770 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1771 /* find prediction - wmv3_dc_scale always used here in fact */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1772 if (n < 4) scale = s->y_dc_scale; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1773 else scale = s->c_dc_scale; |
2685 | 1774 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1775 wrap = s->block_wrap[n]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1776 dc_val= s->dc_val[0] + s->block_index[n]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1777 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1778 /* B C |
2967 | 1779 * A X |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1780 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1781 a = dc_val[ - 1]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1782 b = dc_val[ - 1 - wrap]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1783 c = dc_val[ - wrap]; |
2685 | 1784 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1785 /* XXX: Rule B is used only for I and BI frames in S/M/C profile |
2967 | 1786 * with overlap filtering off |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1787 */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1788 if ((s->pict_type == I_TYPE || s->pict_type == BI_TYPE) && |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1789 1 /* XXX: overlap filtering off */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1790 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1791 /* Set outer values */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1792 if (s->first_slice_line && n!=2) b=c=dcpred[scale]; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1793 if (s->mb_x == 0) b=a=dcpred[scale]; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1794 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1795 else |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1796 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1797 /* Set outer values */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1798 if (s->first_slice_line && n!=2) b=c=0; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1799 if (s->mb_x == 0) b=a=0; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1800 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1801 /* XXX: Rule A needs to know if blocks are inter or intra :/ */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1802 if (0) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1803 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1804 /* update predictor */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1805 *dc_val_ptr = &dc_val[0]; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1806 dir_ptr = 0; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1807 return a; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1808 } |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1809 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1810 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1811 if (abs(a - b) <= abs(b - c)) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1812 pred = c; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1813 *dir_ptr = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1814 } else { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1815 pred = a; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1816 *dir_ptr = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1817 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1818 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1819 /* update predictor */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1820 *dc_val_ptr = &dc_val[0]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1821 return pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1822 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1823 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1824 /** Decode one block, inter or intra |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1825 * @param v The VC9 context |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1826 * @param block 8x8 DCT block |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1827 * @param n Block index in the current MB (<4=>luma) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1828 * @param coded If the block is coded |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1829 * @param mquant Quantizer step for the current block |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1830 * @see Inter TT: Table 21, p73 + p91-85 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1831 * @see Intra TT: Table 20, p72 + p(1)05-(1)07 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1832 * @todo TODO: Process the blocks |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1833 * @todo TODO: Use M$ MPEG-4 cbp prediction |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1834 */ |
3075 | 1835 static int vc9_decode_block(VC9Context *v, DCTELEM block[64], int n, int coded, int mquant) |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1836 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1837 GetBitContext *gb = &v->s.gb; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1838 MpegEncContext *s = &v->s; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1839 int ttblk; /* Transform Type per Block */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1840 int subblkpat; /* Sub-block Transform Type Pattern */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1841 int dc_pred_dir; /* Direction of the DC prediction used */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1842 int run_diff, i; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1843 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1844 /* XXX: Guard against dumb values of mquant */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1845 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant ); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1846 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1847 /* Set DC scale - y and c use the same */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1848 s->y_dc_scale = s->y_dc_scale_table[mquant]; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1849 s->c_dc_scale = s->c_dc_scale_table[mquant]; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1850 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1851 if (s->mb_intra) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1852 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1853 int dcdiff; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1854 uint16_t *dc_val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1855 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1856 /* Get DC differential */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1857 if (n < 4) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1858 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1859 } else { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1860 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1861 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1862 if (dcdiff < 0){ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1863 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n"); |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1864 return -1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1865 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1866 if (dcdiff) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1867 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1868 if (dcdiff == 119 /* ESC index value */) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1869 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1870 /* TODO: Optimize */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1871 if (mquant == 1) dcdiff = get_bits(gb, 10); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1872 else if (mquant == 2) dcdiff = get_bits(gb, 9); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1873 else dcdiff = get_bits(gb, 8); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1874 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1875 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1876 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1877 if (mquant == 1) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1878 dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1879 else if (mquant == 2) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1880 dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1881 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1882 if (get_bits(gb, 1)) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1883 dcdiff = -dcdiff; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1884 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1885 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1886 /* Prediction */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1887 dcdiff += vc9_pred_dc(s, n, &dc_val, &dc_pred_dir); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1888 *dc_val = dcdiff; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1889 /* Store the quantized DC coeff, used for prediction */ |
2685 | 1890 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1891 if (n < 4) { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1892 block[0] = dcdiff * s->y_dc_scale; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1893 } else { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1894 block[0] = dcdiff * s->c_dc_scale; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1895 } |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1896 if (block[0] < 0) { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1897 #if TRACE |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1898 //av_log(s->avctx, AV_LOG_ERROR, "DC=%i<0\n", dcdiff); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1899 #endif |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1900 //return -1; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1901 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1902 /* Skip ? */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1903 run_diff = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1904 i = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1905 if (!coded) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1906 goto not_coded; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1907 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1908 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1909 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1910 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1911 mquant = v->pq; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1912 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1913 /* Get TTBLK */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1914 if (v->ttmb < 8) /* per block */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1915 ttblk = get_vlc2(gb, vc9_ttblk_vlc[v->tt_index].table, VC9_TTBLK_VLC_BITS, 2); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1916 else /* Per frame */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1917 ttblk = 0; //FIXME, depends on ttfrm |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1918 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1919 /* Get SUBBLKPAT */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1920 if (ttblk == v->ttblk4x4) /* 4x4 transform for that qp value */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1921 subblkpat = 1+get_vlc2(gb, vc9_subblkpat_vlc[v->tt_index].table, |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1922 VC9_SUBBLKPAT_VLC_BITS, 2); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1923 else /* All others: 8x8, 4x8, 8x4 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1924 subblkpat = decode012(gb); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1925 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1926 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1927 //TODO AC Decoding |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1928 i = 63; //XXX: nothing done yet |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1929 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1930 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1931 not_coded: |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1932 if (s->mb_intra) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1933 mpeg4_pred_ac(s, block, n, dc_pred_dir); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1934 if (s->ac_pred) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1935 i = 63; /* XXX: not optimal */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1936 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1937 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1938 if(i>0) i=63; //FIXME/XXX optimize |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1939 s->block_last_index[n] = i; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1940 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1941 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1942 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1943 /** @} */ //End for group block |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1944 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1945 /***********************************************************************/ |
2967 | 1946 /** |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1947 * @defgroup std_mb VC9 Macroblock-level functions in Simple/Main Profiles |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1948 * @see 7.1.4, p91 and 8.1.1.7, p(1)04 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1949 * @todo TODO: Integrate to MpegEncContext facilities |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1950 * @{ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1951 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1952 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1953 static inline int vc9_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1954 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1955 int xy, wrap, pred, a, b, c; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1956 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1957 xy = s->block_index[n]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1958 wrap = s->b8_stride; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1959 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1960 /* B C |
2967 | 1961 * A X |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1962 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1963 a = s->coded_block[xy - 1 ]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1964 b = s->coded_block[xy - 1 - wrap]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1965 c = s->coded_block[xy - wrap]; |
2685 | 1966 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1967 if (b == c) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1968 pred = a; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1969 } else { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1970 pred = c; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1971 } |
2685 | 1972 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1973 /* store value */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1974 *coded_block_ptr = &s->coded_block[xy]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1975 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1976 return pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1977 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1978 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1979 /** Decode one I-frame MB (in Simple/Main profile) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1980 * @todo TODO: Extend to AP |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1981 */ |
3075 | 1982 static int vc9_decode_i_mb(VC9Context *v, DCTELEM block[6][64]) |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1983 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1984 int i, cbp, val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1985 uint8_t *coded_val; |
2893 | 1986 // uint32_t * const mb_type_ptr= &v->s.current_picture.mb_type[ v->s.mb_x + v->s.mb_y*v->s.mb_stride ]; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1987 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1988 v->s.mb_intra = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1989 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1990 if (cbp < 0) return -1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1991 v->s.ac_pred = get_bits(&v->s.gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1992 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1993 for (i=0; i<6; i++) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1994 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1995 val = ((cbp >> (5 - i)) & 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1996 if (i < 4) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1997 int pred = vc9_coded_block_pred(&v->s, i, &coded_val); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1998 val = val ^ pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1999 *coded_val = val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2000 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2001 cbp |= val << (5 - i); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2002 if (vc9_decode_block(v, block[i], i, val, v->pq) < 0) //FIXME Should be mquant |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2003 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2004 av_log(v->s.avctx, AV_LOG_ERROR, |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2005 "\nerror while decoding block: %d x %d (%d)\n", v->s.mb_x, v->s.mb_y, i); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2006 return -1; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2007 } |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2008 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2009 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2010 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2011 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2012 /** Decode one P-frame MB (in Simple/Main profile) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2013 * @todo TODO: Extend to AP |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2014 * @fixme FIXME: DC value for inter blocks not set |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2015 */ |
3075 | 2016 static int vc9_decode_p_mb(VC9Context *v, DCTELEM block[6][64]) |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2017 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2018 MpegEncContext *s = &v->s; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2019 GetBitContext *gb = &s->gb; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2020 int i, mb_offset = s->mb_x + s->mb_y*s->mb_width; /* XXX: mb_stride */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2021 int cbp; /* cbp decoding stuff */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2022 int hybrid_pred; /* Prediction types */ |
2967 | 2023 int mv_mode_bit = 0; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2024 int mqdiff, mquant; /* MB quantization */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2025 int ttmb; /* MB Transform type */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2026 int status; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2027 uint8_t *coded_val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2028 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2029 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 }, |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2030 offset_table[6] = { 0, 1, 3, 7, 15, 31 }; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2031 int mb_has_coeffs = 1; /* last_flag */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2032 int dmv_x, dmv_y; /* Differential MV components */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2033 int index, index1; /* LUT indices */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2034 int val, sign; /* temp values */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2035 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2036 mquant = v->pq; /* Loosy initialization */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2037 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2038 if (v->mv_type_mb_plane.is_raw) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2039 v->mv_type_mb_plane.data[mb_offset] = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2040 if (v->skip_mb_plane.is_raw) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2041 v->skip_mb_plane.data[mb_offset] = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2042 if (!mv_mode_bit) /* 1MV mode */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2043 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2044 if (!v->skip_mb_plane.data[mb_offset]) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2045 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2046 GET_MVDATA(dmv_x, dmv_y); |
2685 | 2047 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2048 /* hybrid mv pred, 8.3.5.3.4 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2049 if (v->mv_mode == MV_PMODE_1MV || |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2050 v->mv_mode == MV_PMODE_MIXED_MV) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2051 hybrid_pred = get_bits(gb, 1); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2052 /* FIXME Set DC val for inter block ? */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2053 if (s->mb_intra && !mb_has_coeffs) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2054 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2055 GET_MQUANT(); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2056 s->ac_pred = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2057 /* XXX: how to handle cbp ? */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2058 cbp = 0; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2059 for (i=0; i<6; i++) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2060 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2061 s->coded_block[s->block_index[i]] = 0; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2062 vc9_decode_block(v, block[i], i, 0, mquant); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2063 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2064 return 0; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2065 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2066 else if (mb_has_coeffs) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2067 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2068 if (s->mb_intra) s->ac_pred = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2069 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC9_CBPCY_P_VLC_BITS, 2); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2070 GET_MQUANT(); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2071 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2072 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2073 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2074 mquant = v->pq; |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2075 /* XXX: how to handle cbp ? */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2076 /* XXX: how to set values for following predictions ? */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2077 cbp = 0; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2078 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2079 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2080 if (!v->ttmbf) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2081 ttmb = get_vlc2(gb, vc9_ttmb_vlc[v->tt_index].table, |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2082 VC9_TTMB_VLC_BITS, 12); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2083 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2084 for (i=0; i<6; i++) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2085 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2086 val = ((cbp >> (5 - i)) & 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2087 if (i < 4) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2088 int pred = vc9_coded_block_pred(&v->s, i, &coded_val); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2089 val = val ^ pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2090 *coded_val = val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2091 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2092 vc9_decode_block(v, block[i], i, val, mquant); //FIXME |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2093 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2094 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2095 else //Skipped |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2096 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2097 /* hybrid mv pred, 8.3.5.3.4 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2098 if (v->mv_mode == MV_PMODE_1MV || |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2099 v->mv_mode == MV_PMODE_MIXED_MV) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2100 hybrid_pred = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2101 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2102 /* TODO: blah */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2103 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2104 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2105 } //1MV mode |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2106 else //4MV mode |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2107 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2108 if (!v->skip_mb_plane.data[mb_offset] /* unskipped MB */) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2109 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2110 /* Get CBPCY */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2111 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC9_CBPCY_P_VLC_BITS, 2); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2112 for (i=0; i<6; i++) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2113 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2114 val = ((cbp >> (5 - i)) & 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2115 if (i < 4) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2116 int pred = vc9_coded_block_pred(&v->s, i, &coded_val); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2117 val = val ^ pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2118 *coded_val = val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2119 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2120 if (i<4 && val) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2121 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2122 GET_MVDATA(dmv_x, dmv_y); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2123 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2124 if (v->mv_mode == MV_PMODE_MIXED_MV /* Hybrid pred */) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2125 hybrid_pred = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2126 GET_MQUANT(); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2127 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2128 if (s->mb_intra /* One of the 4 blocks is intra */ && |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2129 index /* non-zero pred for that block */) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2130 s->ac_pred = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2131 if (!v->ttmbf) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2132 ttmb = get_vlc2(gb, vc9_ttmb_vlc[v->tt_index].table, |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2133 VC9_TTMB_VLC_BITS, 12); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2134 status = vc9_decode_block(v, block[i], i, val, mquant); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2135 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2136 return status; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2137 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2138 else //Skipped MB |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2139 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2140 /* XXX: Skipped => cbp=0 and mquant doesn't matter ? */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2141 for (i=0; i<4; i++) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2142 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2143 if (v->mv_mode == MV_PMODE_MIXED_MV /* Hybrid pred */) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2144 hybrid_pred = get_bits(gb, 1); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2145 vc9_decode_block(v, block[i], i, 0, v->pq); //FIXME |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2146 } |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2147 vc9_decode_block(v, block[4], 4, 0, v->pq); //FIXME |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2148 vc9_decode_block(v, block[5], 5, 0, v->pq); //FIXME |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2149 /* TODO: blah */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2150 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2151 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2152 } |
2685 | 2153 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2154 /* Should never happen */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2155 return -1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2156 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2157 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2158 /** Decode one B-frame MB (in Simple/Main profile) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2159 * @todo TODO: Extend to AP |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2160 * @warning XXX: Used for decoding BI MBs |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2161 * @fixme FIXME: DC value for inter blocks not set |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2162 */ |
3075 | 2163 static int vc9_decode_b_mb(VC9Context *v, DCTELEM block[6][64]) |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2164 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2165 MpegEncContext *s = &v->s; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2166 GetBitContext *gb = &v->s.gb; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2167 int mb_offset, i /* MB / B postion information */; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2168 int b_mv_type = BMV_TYPE_BACKWARD; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2169 int mquant, mqdiff; /* MB quant stuff */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2170 int ttmb; /* MacroBlock transform type */ |
2685 | 2171 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2172 static const int size_table[6] = { 0, 2, 3, 4, 5, 8 }, |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2173 offset_table[6] = { 0, 1, 3, 7, 15, 31 }; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2174 int mb_has_coeffs = 1; /* last_flag */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2175 int dmv1_x, dmv1_y, dmv2_x, dmv2_y; /* Differential MV components */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2176 int index, index1; /* LUT indices */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2177 int val, sign; /* MVDATA temp values */ |
2685 | 2178 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2179 mb_offset = s->mb_width*s->mb_y + s->mb_x; //FIXME: arrays aren't using stride |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2180 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2181 if (v->direct_mb_plane.is_raw) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2182 v->direct_mb_plane.data[mb_offset] = get_bits(gb, 1); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2183 if (v->skip_mb_plane.is_raw) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2184 v->skip_mb_plane.data[mb_offset] = get_bits(gb, 1); |
2685 | 2185 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2186 if (!v->direct_mb_plane.data[mb_offset]) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2187 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2188 if (v->skip_mb_plane.data[mb_offset]) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2189 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2190 b_mv_type = decode012(gb); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2191 if (v->bfraction > 420 /*1/2*/ && |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2192 b_mv_type < 3) b_mv_type = 1-b_mv_type; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2193 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2194 else |
2685 | 2195 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2196 GET_MVDATA(dmv1_x, dmv1_y); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2197 if (!s->mb_intra /* b_mv1 tells not intra */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2198 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2199 b_mv_type = decode012(gb); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2200 if (v->bfraction > 420 /*1/2*/ && |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2201 b_mv_type < 3) b_mv_type = 1-b_mv_type; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2202 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2203 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2204 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2205 if (!v->skip_mb_plane.data[mb_offset]) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2206 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2207 if (mb_has_coeffs /* BMV1 == "last" */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2208 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2209 GET_MQUANT(); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2210 if (s->mb_intra /* intra mb */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2211 s->ac_pred = get_bits(gb, 1); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2212 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2213 else |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2214 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2215 /* if bmv1 tells MVs are interpolated */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2216 if (b_mv_type == BMV_TYPE_INTERPOLATED) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2217 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2218 GET_MVDATA(dmv2_x, dmv2_y); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2219 mquant = v->pq; //FIXME: initialization not necessary ? |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2220 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2221 /* GET_MVDATA has reset some stuff */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2222 if (mb_has_coeffs /* b_mv2 == "last" */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2223 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2224 if (s->mb_intra /* intra_mb */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2225 s->ac_pred = get_bits(gb, 1); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2226 GET_MQUANT(); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2227 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2228 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2229 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2230 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2231 //End1 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2232 if (v->ttmbf) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2233 ttmb = get_vlc2(gb, vc9_ttmb_vlc[v->tt_index].table, |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2234 VC9_TTMB_VLC_BITS, 12); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2235 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2236 //End2 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2237 for (i=0; i<6; i++) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2238 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2239 vc9_decode_block(v, block[i], i, 0 /*cbp[i]*/, mquant); //FIXME |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2240 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2241 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2242 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2243 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2244 /** Decode all MBs for an I frame in Simple/Main profile |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2245 * @todo TODO: Move out of the loop the picture type case? |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2246 (branch prediction should help there though) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2247 */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2248 static int standard_decode_mbs(VC9Context *v) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2249 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2250 MpegEncContext *s = &v->s; |
2685 | 2251 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2252 /* Set transform type info depending on pq */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2253 if (v->pq < 5) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2254 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2255 v->tt_index = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2256 v->ttblk4x4 = 3; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2257 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2258 else if (v->pq < 13) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2259 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2260 v->tt_index = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2261 v->ttblk4x4 = 3; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2262 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2263 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2264 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2265 v->tt_index = 2; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2266 v->ttblk4x4 = 2; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2267 } |
2685 | 2268 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2269 if (s->pict_type != I_TYPE) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2270 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2271 /* Select proper long MV range */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2272 switch (v->mvrange) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2273 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2274 case 1: v->k_x = 10; v->k_y = 9; break; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2275 case 2: v->k_x = 12; v->k_y = 10; break; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2276 case 3: v->k_x = 13; v->k_y = 11; break; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2277 default: /*case 0 too */ v->k_x = 9; v->k_y = 8; break; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2278 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2279 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2280 s->mspel = v->mv_mode & 1; //MV_PMODE is HPEL |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2281 v->k_x -= s->mspel; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2282 v->k_y -= s->mspel; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2283 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2284 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2285 for (s->mb_y=0; s->mb_y<s->mb_height; s->mb_y++) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2286 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2287 for (s->mb_x=0; s->mb_x<s->mb_width; s->mb_x++) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2288 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2289 //FIXME Get proper MB DCTELEM |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2290 //TODO Move out of the loop |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2291 switch (s->pict_type) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2292 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2293 case I_TYPE: vc9_decode_i_mb(v, s->block); break; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2294 case P_TYPE: vc9_decode_p_mb(v, s->block); break; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2295 case BI_TYPE: |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2296 case B_TYPE: vc9_decode_b_mb(v, s->block); break; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2297 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2298 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2299 //Add a check for overconsumption ? |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2300 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2301 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2302 } |
2482 | 2303 /** @} */ //End for group std_mb |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2304 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2305 #if HAS_ADVANCED_PROFILE |
2482 | 2306 /***********************************************************************/ |
2967 | 2307 /** |
2482 | 2308 * @defgroup adv_mb VC9 Macroblock-level functions in Advanced Profile |
2309 * @todo TODO: Integrate to MpegEncContext facilities | |
2310 * @todo TODO: Code P, B and BI | |
2311 * @{ | |
2312 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2313 static int advanced_decode_i_mbs(VC9Context *v) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2314 { |
2474 | 2315 MpegEncContext *s = &v->s; |
2316 GetBitContext *gb = &v->s.gb; | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2317 int mqdiff, mquant, mb_offset = 0, over_flags_mb = 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2318 |
2474 | 2319 for (s->mb_y=0; s->mb_y<s->mb_height; s->mb_y++) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2320 { |
2474 | 2321 for (s->mb_x=0; s->mb_x<s->mb_width; s->mb_x++) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2322 { |
2474 | 2323 if (v->ac_pred_plane.is_raw) |
2324 s->ac_pred = get_bits(gb, 1); | |
2325 else | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2326 s->ac_pred = v->ac_pred_plane.data[mb_offset]; |
2462 | 2327 if (v->condover == 3 && v->over_flags_plane.is_raw) |
2474 | 2328 over_flags_mb = get_bits(gb, 1); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2329 GET_MQUANT(); |
2462 | 2330 |
2331 /* TODO: lots */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2332 } |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2333 mb_offset++; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2334 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2335 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2336 } |
2482 | 2337 /** @} */ //End for group adv_mb |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2338 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2339 |
2482 | 2340 /** Initialize a VC9/WMV3 decoder |
2341 * @todo TODO: Handle VC-9 IDUs (Transport level?) | |
2342 * @todo TODO: Decypher remaining bits in extra_data | |
2343 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2344 static int vc9_decode_init(AVCodecContext *avctx) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2345 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2346 VC9Context *v = avctx->priv_data; |
2474 | 2347 MpegEncContext *s = &v->s; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2348 GetBitContext gb; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2349 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2350 if (!avctx->extradata_size || !avctx->extradata) return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2351 avctx->pix_fmt = PIX_FMT_YUV420P; |
2474 | 2352 v->s.avctx = avctx; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2353 |
2474 | 2354 if(ff_h263_decode_init(avctx) < 0) |
2355 return -1; | |
2356 if (vc9_init_common(v) < 0) return -1; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2357 |
2780 | 2358 av_log(avctx, AV_LOG_INFO, "This decoder is not supposed to produce picture. Dont report this as a bug!\n"); |
2359 | |
2462 | 2360 avctx->coded_width = avctx->width; |
2361 avctx->coded_height = avctx->height; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2362 if (avctx->codec_id == CODEC_ID_WMV3) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2363 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2364 int count = 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2365 |
2474 | 2366 // looks like WMV3 has a sequence header stored in the extradata |
2367 // advanced sequence header may be before the first frame | |
2368 // the last byte of the extradata is a version number, 1 for the | |
2369 // samples we can decode | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2370 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2371 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8); |
2685 | 2372 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2373 if (decode_sequence_header(avctx, &gb) < 0) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2374 return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2375 |
2474 | 2376 count = avctx->extradata_size*8 - get_bits_count(&gb); |
2377 if (count>0) | |
2378 { | |
2379 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n", | |
2380 count, get_bits(&gb, count)); | |
2381 } | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2382 else if (count < 0) |
2474 | 2383 { |
2384 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count); | |
2385 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2386 } |
2474 | 2387 avctx->has_b_frames= !!(avctx->max_b_frames); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2388 |
2474 | 2389 s->mb_width = (avctx->coded_width+15)>>4; |
2390 s->mb_height = (avctx->coded_height+15)>>4; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2391 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2392 /* Allocate mb bitplanes */ |
2474 | 2393 if (alloc_bitplane(&v->mv_type_mb_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2394 return -1; |
2474 | 2395 if (alloc_bitplane(&v->mv_type_mb_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2396 return -1; |
2474 | 2397 if (alloc_bitplane(&v->skip_mb_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2398 return -1; |
2474 | 2399 if (alloc_bitplane(&v->direct_mb_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2400 return -1; |
2401 | |
2402 /* For predictors */ | |
2474 | 2403 v->previous_line_cbpcy = (uint8_t *)av_malloc(s->mb_stride*4); |
2462 | 2404 if (!v->previous_line_cbpcy) return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2405 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2406 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2407 if (v->profile == PROFILE_ADVANCED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2408 { |
2474 | 2409 if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2410 return -1; |
2474 | 2411 if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2412 return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2413 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2414 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2415 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2416 return 0; |
2474 | 2417 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2418 |
2482 | 2419 /** Decode a VC9/WMV3 frame |
2420 * @todo TODO: Handle VC-9 IDUs (Transport level?) | |
2421 * @warning Initial try at using MpegEncContext stuff | |
2422 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2423 static int vc9_decode_frame(AVCodecContext *avctx, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2424 void *data, int *data_size, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2425 uint8_t *buf, int buf_size) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2426 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2427 VC9Context *v = avctx->priv_data; |
2474 | 2428 MpegEncContext *s = &v->s; |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
2429 int ret = FRAME_SKIPPED, len; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2430 AVFrame *pict = data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2431 uint8_t *tmp_buf; |
2474 | 2432 v->s.avctx = avctx; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2433 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2434 //buf_size = 0 -> last frame |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2435 if (!buf_size) return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2436 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2437 len = avpicture_get_size(avctx->pix_fmt, avctx->width, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2438 avctx->height); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2439 tmp_buf = (uint8_t *)av_mallocz(len); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2440 avpicture_fill((AVPicture *)pict, tmp_buf, avctx->pix_fmt, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2441 avctx->width, avctx->height); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2442 |
2474 | 2443 if (avctx->codec_id == CODEC_ID_VC9) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2444 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2445 #if 0 |
2685 | 2446 // search for IDU's |
2447 // FIXME | |
2448 uint32_t scp = 0; | |
2449 int scs = 0, i = 0; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2450 |
2685 | 2451 while (i < buf_size) |
2452 { | |
2453 for (; i < buf_size && scp != 0x000001; i++) | |
2454 scp = ((scp<<8)|buf[i])&0xffffff; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2455 |
2685 | 2456 if (scp != 0x000001) |
2457 break; // eof ? | |
2458 | |
2967 | 2459 scs = buf[i++]; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2460 |
2685 | 2461 init_get_bits(gb, buf+i, (buf_size-i)*8); |
2462 | |
2463 switch(scs) | |
2464 { | |
2462 | 2465 case 0x0A: //Sequence End Code |
2466 return 0; | |
2467 case 0x0B: //Slice Start Code | |
2468 av_log(avctx, AV_LOG_ERROR, "Slice coding not supported\n"); | |
2469 return -1; | |
2470 case 0x0C: //Field start code | |
2471 av_log(avctx, AV_LOG_ERROR, "Interlaced coding not supported\n"); | |
2472 return -1; | |
2473 case 0x0D: //Frame start code | |
2474 break; | |
2475 case 0x0E: //Entry point Start Code | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2476 if (v->profile < PROFILE_ADVANCED) |
2462 | 2477 av_log(avctx, AV_LOG_ERROR, |
2478 "Found an entry point in profile %i\n", v->profile); | |
2474 | 2479 advanced_entry_point_process(avctx, gb); |
2462 | 2480 break; |
2481 case 0x0F: //Sequence header Start Code | |
2474 | 2482 decode_sequence_header(avctx, gb); |
2462 | 2483 break; |
2484 default: | |
2485 av_log(avctx, AV_LOG_ERROR, | |
2486 "Unsupported IDU suffix %lX\n", scs); | |
2487 } | |
2685 | 2488 |
2489 i += get_bits_count(gb)*8; | |
2490 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2491 #else |
2685 | 2492 av_abort(); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2493 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2494 } |
2474 | 2495 else |
2496 init_get_bits(&v->s.gb, buf, buf_size*8); | |
2497 | |
2498 s->flags= avctx->flags; | |
2499 s->flags2= avctx->flags2; | |
2500 | |
2501 /* no supplementary picture */ | |
2502 if (buf_size == 0) { | |
2503 /* special case for last picture */ | |
2504 if (s->low_delay==0 && s->next_picture_ptr) { | |
2505 *pict= *(AVFrame*)s->next_picture_ptr; | |
2506 s->next_picture_ptr= NULL; | |
2507 | |
2508 *data_size = sizeof(AVFrame); | |
2509 } | |
2510 | |
2511 return 0; | |
2512 } | |
2513 | |
2514 //No IDU - we mimic ff_h263_decode_frame | |
2515 s->bitstream_buffer_size=0; | |
2685 | 2516 |
2474 | 2517 if (!s->context_initialized) { |
2518 if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix | |
2519 return -1; | |
2520 } | |
2685 | 2521 |
2474 | 2522 //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there |
2523 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){ | |
2524 s->current_picture_ptr= &s->picture[ff_find_unused_picture(s, 0)]; | |
2525 } | |
2526 #if HAS_ADVANCED_PROFILE | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2527 if (v->profile == PROFILE_ADVANCED) |
2474 | 2528 ret= advanced_decode_picture_primary_header(v); |
2529 else | |
2530 #endif | |
2531 ret= standard_decode_picture_primary_header(v); | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
2532 if (ret == FRAME_SKIPPED) return buf_size; |
2474 | 2533 /* skip if the header was thrashed */ |
2534 if (ret < 0){ | |
2535 av_log(s->avctx, AV_LOG_ERROR, "header damaged\n"); | |
2536 return -1; | |
2537 } | |
2538 | |
2539 //No bug workaround yet, no DCT conformance | |
2540 | |
2541 //WMV9 does have resized images | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2542 if (v->profile < PROFILE_ADVANCED && v->multires){ |
2474 | 2543 //Parse context stuff in here, don't know how appliable it is |
2544 } | |
2545 //Not sure about context initialization | |
2546 | |
2547 // for hurry_up==5 | |
2548 s->current_picture.pict_type= s->pict_type; | |
2549 s->current_picture.key_frame= s->pict_type == I_TYPE; | |
2550 | |
2551 /* skip b frames if we dont have reference frames */ | |
2552 if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)) | |
2553 return buf_size; //FIXME simulating all buffer consumed | |
2554 /* skip b frames if we are in a hurry */ | |
2555 if(avctx->hurry_up && s->pict_type==B_TYPE) | |
2556 return buf_size; //FIXME simulating all buffer consumed | |
2557 /* skip everything if we are in a hurry>=5 */ | |
2558 if(avctx->hurry_up>=5) | |
2559 return buf_size; //FIXME simulating all buffer consumed | |
2685 | 2560 |
2474 | 2561 if(s->next_p_frame_damaged){ |
2562 if(s->pict_type==B_TYPE) | |
2563 return buf_size; //FIXME simulating all buffer consumed | |
2564 else | |
2565 s->next_p_frame_damaged=0; | |
2566 } | |
2567 | |
2568 if(MPV_frame_start(s, avctx) < 0) | |
2569 return -1; | |
2570 | |
2571 ff_er_frame_start(s); | |
2572 | |
2573 //wmv9 may or may not have skip bits | |
2574 #if HAS_ADVANCED_PROFILE | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2575 if (v->profile == PROFILE_ADVANCED) |
2474 | 2576 ret= advanced_decode_picture_secondary_header(v); |
2577 else | |
2578 #endif | |
2579 ret = standard_decode_picture_secondary_header(v); | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
2580 if (ret<0) return FRAME_SKIPPED; //FIXME Non fatal for now |
2474 | 2581 |
2582 //We consider the image coded in only one slice | |
2583 #if HAS_ADVANCED_PROFILE | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2584 if (v->profile == PROFILE_ADVANCED) |
2474 | 2585 { |
2586 switch(s->pict_type) | |
2587 { | |
2588 case I_TYPE: ret = advanced_decode_i_mbs(v); break; | |
2589 case P_TYPE: ret = decode_p_mbs(v); break; | |
2590 case B_TYPE: | |
2591 case BI_TYPE: ret = decode_b_mbs(v); break; | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
2592 default: ret = FRAME_SKIPPED; |
2474 | 2593 } |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
2594 if (ret == FRAME_SKIPPED) return buf_size; //We ignore for now failures |
2474 | 2595 } |
2596 else | |
2597 #endif | |
2598 { | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2599 ret = standard_decode_mbs(v); |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2518
diff
changeset
|
2600 if (ret == FRAME_SKIPPED) return buf_size; |
2474 | 2601 } |
2602 | |
2603 ff_er_frame_end(s); | |
2604 | |
2605 MPV_frame_end(s); | |
2606 | |
2607 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type); | |
2608 assert(s->current_picture.pict_type == s->pict_type); | |
3185 | 2609 |
2610 if (s->pict_type == B_TYPE || s->low_delay) { | |
2611 *pict= *(AVFrame*)s->current_picture_ptr; | |
2612 } else if (s->last_picture_ptr != NULL) { | |
2613 *pict= *(AVFrame*)s->last_picture_ptr; | |
2614 } | |
2615 | |
2616 if(s->last_picture_ptr || s->low_delay){ | |
2617 *data_size = sizeof(AVFrame); | |
2474 | 2618 ff_print_debug_info(s, pict); |
2619 } | |
2620 | |
2621 /* Return the Picture timestamp as the frame number */ | |
2622 /* we substract 1 because it is added on utils.c */ | |
2623 avctx->frame_number = s->picture_number - 1; | |
2624 | |
2462 | 2625 av_log(avctx, AV_LOG_DEBUG, "Consumed %i/%i bits\n", |
2474 | 2626 get_bits_count(&s->gb), buf_size*8); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2627 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2628 /* Fake consumption of all data */ |
2462 | 2629 *data_size = len; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2630 return buf_size; //Number of bytes consumed |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2631 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2632 |
2482 | 2633 /** Close a VC9/WMV3 decoder |
2634 * @warning Initial try at using MpegEncContext stuff | |
2635 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2636 static int vc9_decode_end(AVCodecContext *avctx) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2637 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2638 VC9Context *v = avctx->priv_data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2639 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2640 #if HAS_ADVANCED_PROFILE |
2458
915094e3da5d
dont use several 100 mb memory for a tiny 120 element table
michael
parents:
2453
diff
changeset
|
2641 av_freep(&v->hrd_rate); |
915094e3da5d
dont use several 100 mb memory for a tiny 120 element table
michael
parents:
2453
diff
changeset
|
2642 av_freep(&v->hrd_buffer); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2643 #endif |
2474 | 2644 MPV_common_end(&v->s); |
2645 free_bitplane(&v->mv_type_mb_plane); | |
2646 free_bitplane(&v->skip_mb_plane); | |
2647 free_bitplane(&v->direct_mb_plane); | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2648 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2649 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2650 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2651 AVCodec vc9_decoder = { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2652 "vc9", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2653 CODEC_TYPE_VIDEO, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2654 CODEC_ID_VC9, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2655 sizeof(VC9Context), |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2656 vc9_decode_init, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2657 NULL, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2658 vc9_decode_end, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2659 vc9_decode_frame, |
2453 | 2660 CODEC_CAP_DELAY, |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2661 NULL |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2662 }; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2663 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2664 AVCodec wmv3_decoder = { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2665 "wmv3", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2666 CODEC_TYPE_VIDEO, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2667 CODEC_ID_WMV3, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2668 sizeof(VC9Context), |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2669 vc9_decode_init, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2670 NULL, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2671 vc9_decode_end, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2672 vc9_decode_frame, |
2453 | 2673 CODEC_CAP_DELAY, |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2674 NULL |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2675 }; |