Mercurial > libavcodec.hg
annotate vc9.c @ 2650:d321fbf0b2ce libavcodec
reverse 1 hunk from 1.96->1.97, fixes decoding of (MR1_BT_A.h264 and MR1_MW_A.264)
author | michael |
---|---|
date | Sat, 07 May 2005 11:07:47 +0000 |
parents | ef44d24680d1 |
children | 5619d89d243a |
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 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
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 | |
238 int frmrtq_postproc; ///< 3bits, | |
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; | |
324 //@} | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
325 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
326 } VC9Context; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
327 |
2482 | 328 /** |
329 * Get unary code of limited length | |
330 * @fixme FIXME Slow and ugly | |
331 * @param gb GetBitContext | |
332 * @param[in] stop The bitstop value (unary code of 1's or 0's) | |
333 * @param[in] len Maximum length | |
334 * @return Unary length/index | |
335 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
336 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
|
337 { |
2462 | 338 #if 1 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
339 int i = 0, tmp = !stop; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
340 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
341 while (i != len && tmp != stop) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
342 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
343 tmp = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
344 i++; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
345 } |
2483 | 346 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
|
347 return i; |
2462 | 348 #else |
349 unsigned int buf; | |
350 int log; | |
351 | |
352 OPEN_READER(re, gb); | |
353 UPDATE_CACHE(re, gb); | |
354 buf=GET_CACHE(re, gb); //Still not sure | |
355 if (stop) buf = ~buf; | |
356 | |
357 log= av_log2(-buf); //FIXME: -? | |
358 if (log < limit){ | |
359 LAST_SKIP_BITS(re, gb, log+1); | |
360 CLOSE_READER(re, gb); | |
361 return log; | |
362 } | |
363 | |
364 LAST_SKIP_BITS(re, gb, limit); | |
365 CLOSE_READER(re, gb); | |
366 return limit; | |
367 #endif | |
368 } | |
369 | |
2482 | 370 /** |
371 * Init VC-9 specific tables and VC9Context members | |
372 * @param v The VC9Context to initialize | |
373 * @return Status | |
374 */ | |
2474 | 375 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
|
376 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
377 static int done = 0; |
2483 | 378 int i = 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
379 |
2462 | 380 /* Set the bit planes */ |
381 v->mv_type_mb_plane = (struct BitPlane) { NULL, 0, 0, 0 }; | |
382 v->direct_mb_plane = (struct BitPlane) { NULL, 0, 0, 0 }; | |
383 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
|
384 #if HAS_ADVANCED_PROFILE |
2462 | 385 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
|
386 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
|
387 #endif |
2462 | 388 |
389 /* VLC tables */ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
390 #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
|
391 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
|
392 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
|
393 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
|
394 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
|
395 } |
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][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
|
398 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
|
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 #endif |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
402 if(!done) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
403 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
404 done = 1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
405 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
|
406 vc9_bfraction_bits, 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
407 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
|
408 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
|
409 vc9_norm2_bits, 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
410 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
|
411 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
|
412 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
|
413 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
|
414 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
|
415 vc9_imode_bits, 1, 1, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
416 vc9_imode_codes, 1, 1, 1); |
2462 | 417 for (i=0; i<3; i++) |
418 { | |
419 INIT_VLC(&vc9_ttmb_vlc[i], VC9_TTMB_VLC_BITS, 16, | |
420 vc9_ttmb_bits[i], 1, 1, | |
421 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
|
422 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
|
423 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
|
424 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
|
425 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
|
426 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
|
427 vc9_subblkpat_codes[i], 1, 1, 1); |
2462 | 428 } |
429 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
|
430 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
431 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
|
432 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
|
433 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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 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
|
439 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
|
440 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
441 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
442 |
2462 | 443 /* Other defaults */ |
444 v->pq = -1; | |
445 v->mvrange = 0; /* 7.1.1.18, p80 */ | |
446 | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
447 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
448 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
449 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
450 #if HAS_ADVANCED_PROFILE |
2482 | 451 /** |
452 * Decode sequence header's Hypothetic Reference Decoder data | |
453 * @see 6.2.1, p32 | |
454 * @param v The VC9Context to initialize | |
455 * @param gb A GetBitContext initialized from AVCodecContext extra_data | |
456 * @return Status | |
457 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
458 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
|
459 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
460 int i, num; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
461 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
462 num = get_bits(gb, 5); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
463 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
464 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
|
465 { |
2458
915094e3da5d
dont use several 100 mb memory for a tiny 120 element table
michael
parents:
2453
diff
changeset
|
466 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
|
467 } |
2462 | 468 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
|
469 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
|
470 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
471 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
|
472 { |
2458
915094e3da5d
dont use several 100 mb memory for a tiny 120 element table
michael
parents:
2453
diff
changeset
|
473 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
|
474 } |
2462 | 475 if (!v->hrd_buffer) v->hrd_buffer = 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
|
476 if (!v->hrd_buffer) return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
477 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
478 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
|
479 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
480 //exponent in base-2 for rate |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
481 v->bit_rate_exponent = get_bits(gb, 4); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
482 //exponent in base-2 for buffer_size |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
483 v->buffer_size_exponent = get_bits(gb, 4); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
484 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
485 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
|
486 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
487 //mantissae, ordered (if not, use a function ? |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
488 v->hrd_rate[i] = get_bits(gb, 16); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
489 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
|
490 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
491 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
|
492 "%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
|
493 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
494 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
495 v->hrd_buffer[i] = get_bits(gb, 16); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
496 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
|
497 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
498 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
|
499 "%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
|
500 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
501 } |
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 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
504 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
505 |
2482 | 506 /** |
507 * Decode sequence header for Advanced Profile | |
508 * @see Table 2, p18 | |
509 * @see 6.1.7, pp21-27 | |
510 * @param v The VC9Context to initialize | |
511 * @param gb A GetBitContext initialized from AVCodecContext extra_data | |
512 * @return Status | |
513 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
514 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
|
515 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
516 VC9Context *v = avctx->priv_data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
517 int nr, dr, aspect_ratio; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
518 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
519 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
|
520 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
|
521 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
|
522 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
523 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
|
524 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
|
525 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
|
526 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
|
527 if (v->reserved) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
528 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
529 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
|
530 v->reserved); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
531 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
532 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
533 if (v->extended_mv) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
534 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
|
535 |
2462 | 536 /* 6.1.7, p21 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
537 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
|
538 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
539 avctx->coded_width = get_bits(gb, 12); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
540 avctx->coded_height = get_bits(gb, 12); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
541 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
|
542 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
543 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
|
544 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
|
545 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
546 |
2462 | 547 /* 6.1.7.4, p22 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
548 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
|
549 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
550 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
|
551 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
|
552 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
553 avctx->sample_aspect_ratio.num = get_bits(gb, 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
554 avctx->sample_aspect_ratio.den = get_bits(gb, 8); |
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 else if (aspect_ratio == 0x0E) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
557 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
558 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
|
559 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
560 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
561 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
562 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
|
563 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
564 } |
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 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
567 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
568 avctx->coded_width = avctx->width; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
569 avctx->coded_height = avctx->height; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
570 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
571 |
2462 | 572 /* 6.1.8, p23 */ |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
573 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
|
574 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
575 if ( get_bits(gb, 1) /* framerateind */) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
576 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
577 nr = get_bits(gb, 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
578 dr = get_bits(gb, 4); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
579 if (nr<1) |
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_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
|
582 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
583 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
584 if (nr>5) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
585 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
586 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
|
587 "Reserved FRAMERATENR %i not handled\n", nr); |
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 if (dr<1) |
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 av_log(avctx, AV_LOG_ERROR, "0 is forbidden for FRAMERATEDR\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
592 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
593 if (dr>2) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
594 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
595 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
|
596 "Reserved FRAMERATEDR %i not handled\n", dr); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
597 } |
2637 | 598 avctx->time_base.num = fps_nr[dr]; |
599 avctx->time_base.den = fps_nr[nr]; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
600 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
601 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
602 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
603 nr = get_bits(gb, 16); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
604 // 0.03125->2048Hz / 0.03125Hz |
2637 | 605 avctx->time_base.den = 1000000; |
606 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
|
607 } |
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 |
2462 | 610 /* 6.1.9, p25 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
611 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
|
612 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
613 //Chromacity coordinates of color primaries |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
614 //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
|
615 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
|
616 if (v->color_prim<1) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
617 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
618 av_log(avctx, AV_LOG_ERROR, "0 for COLOR_PRIM is reserved\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
619 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
620 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
621 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
|
622 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
623 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
|
624 v->color_prim); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
625 return -1; |
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 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
628 //Opto-electronic transfer characteristics |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
629 v->transfer_char = get_bits(gb, 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
630 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
|
631 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
632 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
|
633 v->color_prim); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
634 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
635 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
636 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
637 //Matrix coefficient for primariev->YCbCr |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
638 v->matrix_coef = get_bits(gb, 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
639 if (v->matrix_coef < 1) return -1; //forbidden |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
640 if ((v->matrix_coef>3 && v->matrix_coef<6) || v->matrix_coef>7) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
641 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
642 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
|
643 v->color_prim); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
644 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
645 } |
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 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
648 //Hypothetical reference decoder indicator flag |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
649 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
|
650 if (v->hrd_param_flag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
651 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
652 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
|
653 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
654 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
655 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
|
656 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
657 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
658 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
659 |
2482 | 660 /** |
661 * Decode Simple/Main Profiles sequence header | |
662 * @see Figure 7-8, p16-17 | |
663 * @param avctx Codec context | |
664 * @param gb GetBit context initialized from Codec context extra_data | |
665 * @return Status | |
666 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
667 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
|
668 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
669 VC9Context *v = avctx->priv_data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
670 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
671 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
|
672 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
|
673 if (v->profile == 2) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
674 av_log(avctx, AV_LOG_ERROR, "Profile 2 is reserved\n"); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
675 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
676 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
677 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
|
678 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
679 v->level = get_bits(gb, 3); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
680 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
|
681 if (v->chromaformat != 1) |
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 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
|
684 "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
|
685 return -1; |
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 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
688 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
689 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
690 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
691 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
|
692 if (v->res_sm) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
693 { |
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_ERROR, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
695 "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
|
696 return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
697 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
698 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
699 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
700 // (fps-2)/4 (->30) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
701 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
|
702 // (bitrate-32kbps)/64kbps |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
703 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
|
704 v->s.loop_filter = get_bits(gb, 1); //common |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
705 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
706 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
707 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
|
708 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
709 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
710 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
|
711 if (v->res_x8) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
712 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
713 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
|
714 "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
|
715 //return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
716 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
717 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
|
718 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
|
719 if (!v->res_fasttx) |
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 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
|
722 "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
|
723 //return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
724 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
725 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
726 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
727 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
|
728 if (!v->profile && !v->fastuvmc) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
729 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
730 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
|
731 "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
|
732 return -1; |
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 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
|
735 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
|
736 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
737 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
|
738 "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
|
739 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
740 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
741 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
|
742 v->vstransform = get_bits(gb, 1); //common |
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 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
745 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
|
746 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
747 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
748 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
|
749 if (v->res_transtab) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
750 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
751 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
|
752 "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
|
753 return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
754 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
755 } |
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 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
|
758 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
759 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
760 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
|
761 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
762 { |
2474 | 763 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
|
764 v->rangered = get_bits(gb, 1); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
765 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
766 |
2474 | 767 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
|
768 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
|
769 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
770 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
771 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
|
772 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
773 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
774 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
|
775 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
|
776 if (!v->res_rtm_flag) |
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 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
|
779 "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
|
780 //return -1; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
781 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
782 #if TRACE |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
783 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
|
784 "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
|
785 "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
|
786 "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
|
787 "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
|
788 v->profile, v->frmrtq_postproc, v->bitrtq_postproc, |
2482 | 789 v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv, |
2474 | 790 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
|
791 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
|
792 ); |
2462 | 793 return 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
794 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
795 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
796 #if HAS_ADVANCED_PROFILE |
2462 | 797 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
|
798 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
799 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
800 |
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 #if HAS_ADVANCED_PROFILE |
2482 | 803 /** Entry point decoding (Advanced Profile) |
804 * @param avctx Codec context | |
805 * @param gb GetBit context initialized from avctx->extra_data | |
806 * @return Status | |
807 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
808 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
|
809 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
810 VC9Context *v = avctx->priv_data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
811 int range_mapy_flag, range_mapuv_flag, i; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
812 if (v->profile != PROFILE_ADVANCED) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
813 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
814 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
|
815 "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
|
816 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
|
817 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
818 if (v->hrd_param_flag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
819 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
820 //Update buffer fullness |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
821 av_log(avctx, AV_LOG_DEBUG, "Buffer fullness update\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
822 for (i=0; i<v->hrd_num_leaky_buckets; i++) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
823 skip_bits(gb, 8); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
824 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
825 if ((range_mapy_flag = get_bits(gb, 1))) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
826 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
827 //RANGE_MAPY |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
828 av_log(avctx, AV_LOG_DEBUG, "RANGE_MAPY\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
829 skip_bits(gb, 3); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
830 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
831 if ((range_mapuv_flag = get_bits(gb, 1))) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
832 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
833 //RANGE_MAPUV |
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_DEBUG, "RANGE_MAPUV\n"); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
835 skip_bits(gb, 3); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
836 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
837 if (v->panscanflag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
838 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
839 //NUMPANSCANWIN |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
840 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
|
841 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
|
842 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
843 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
844 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
845 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
846 |
2482 | 847 /***********************************************************************/ |
848 /** | |
849 * @defgroup bitplane VC9 Bitplane decoding | |
850 * @see 8.7, p56 | |
851 * @{ | |
852 */ | |
853 | |
854 /** @addtogroup bitplane | |
855 * Imode types | |
856 * @{ | |
857 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
858 #define IMODE_RAW 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
859 #define IMODE_NORM2 1 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
860 #define IMODE_DIFF2 2 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
861 #define IMODE_NORM6 3 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
862 #define IMODE_DIFF6 4 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
863 #define IMODE_ROWSKIP 5 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
864 #define IMODE_COLSKIP 6 |
2482 | 865 /** @} */ //imode defines |
866 | |
867 /** Allocate the buffer from a bitplane, given its dimensions | |
868 * @param bp Bitplane which buffer is to allocate | |
869 * @param[in] width Width of the buffer | |
870 * @param[in] height Height of the buffer | |
871 * @return Status | |
872 * @todo TODO: Take into account stride | |
873 * @todo TODO: Allow use of external buffers ? | |
874 */ | |
2462 | 875 int alloc_bitplane(BitPlane *bp, int width, int height) |
876 { | |
877 if (!bp || bp->width<0 || bp->height<0) return -1; | |
878 bp->data = (uint8_t*)av_malloc(width*height); | |
879 if (!bp->data) return -1; | |
2482 | 880 bp->width = bp->stride = width; |
2462 | 881 bp->height = height; |
882 return 0; | |
883 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
884 |
2482 | 885 /** Free the bitplane's buffer |
886 * @param bp Bitplane which buffer is to free | |
887 */ | |
2474 | 888 void free_bitplane(BitPlane *bp) |
889 { | |
890 bp->width = bp->stride = bp->height = 0; | |
891 if (bp->data) av_freep(&bp->data); | |
892 } | |
893 | |
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
|
894 /** Decode rows by checking if they are skipped |
2482 | 895 * @param plane Buffer to store decoded bits |
896 * @param[in] width Width of this buffer | |
897 * @param[in] height Height of this buffer | |
898 * @param[in] stride of this buffer | |
899 */ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
900 static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ |
2459 | 901 int x, y; |
902 | |
903 for (y=0; y<height; y++){ | |
2474 | 904 if (!get_bits(gb, 1)) //rowskip |
2459 | 905 memset(plane, 0, width); |
906 else | |
907 for (x=0; x<width; x++) | |
2474 | 908 plane[x] = get_bits(gb, 1); |
2459 | 909 plane += stride; |
910 } | |
911 } | |
912 | |
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
|
913 /** Decode columns by checking if they are skipped |
2482 | 914 * @param plane Buffer to store decoded bits |
915 * @param[in] width Width of this buffer | |
916 * @param[in] height Height of this buffer | |
917 * @param[in] stride of this buffer | |
918 * @fixme FIXME: Optimize | |
919 */ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
920 static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){ |
2459 | 921 int x, y; |
922 | |
923 for (x=0; x<width; x++){ | |
2474 | 924 if (!get_bits(gb, 1)) //colskip |
2459 | 925 for (y=0; y<height; y++) |
926 plane[y*stride] = 0; | |
927 else | |
928 for (y=0; y<height; y++) | |
2474 | 929 plane[y*stride] = get_bits(gb, 1); |
2459 | 930 plane ++; |
931 } | |
932 } | |
933 | |
2482 | 934 /** Decode a bitplane's bits |
935 * @param bp Bitplane where to store the decode bits | |
936 * @param v VC9 context for bit reading and logging | |
937 * @return Status | |
938 * @fixme FIXME: Optimize | |
939 * @todo TODO: Decide if a struct is needed | |
940 */ | |
2462 | 941 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
|
942 { |
2474 | 943 GetBitContext *gb = &v->s.gb; |
944 | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
945 int imode, x, y, code, use_vertical_tile, tile_w, tile_h, offset; |
2462 | 946 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
|
947 |
2474 | 948 invert = get_bits(gb, 1); |
949 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
|
950 |
2462 | 951 bp->is_raw = 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
952 switch (imode) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
953 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
954 case IMODE_RAW: |
2462 | 955 //Data is actually read in the MB layer (same for all tests == "raw") |
956 bp->is_raw = 1; //invert ignored | |
957 return invert; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
958 case IMODE_DIFF2: |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
959 case IMODE_NORM2: |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
960 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
|
961 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
962 *(++planep) = get_bits(gb, 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
963 offset = x = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
964 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
965 else offset = x = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
966 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
967 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
|
968 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
969 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
|
970 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
971 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
|
972 *(++planep) = code&1; //lsb => left |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
973 *(++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
|
974 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
975 planep += bp->stride-bp->width; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
976 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
|
977 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
978 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
|
979 *planep = code&1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
980 planep += bp->stride-bp->width; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
981 *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
|
982 offset = x = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
983 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
984 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
985 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
986 offset = x = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
987 planep += bp->stride-bp->width; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
988 } |
2459 | 989 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
990 break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
991 case IMODE_DIFF6: |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
992 case IMODE_NORM6: |
2462 | 993 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
|
994 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
|
995 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
|
996 |
2462 | 997 for(y= bp->height%tile_h; y< bp->height; y+=tile_h){ |
998 for(x= bp->width%tile_w; x< bp->width; x+=tile_w){ | |
2474 | 999 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
|
1000 if(code<0){ |
2482 | 1001 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
|
1002 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
|
1003 } |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1004 //FIXME following is a pure guess and probably wrong |
2462 | 1005 //FIXME A bitplane (0 | !0), so could the shifts be avoided ? |
1006 planep[x + 0*bp->stride]= (code>>0)&1; | |
1007 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
|
1008 //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
|
1009 if(use_vertical_tile){ |
2462 | 1010 planep[x + 0 + 1*bp->stride]= (code>>2)&1; |
1011 planep[x + 1 + 1*bp->stride]= (code>>3)&1; | |
1012 planep[x + 0 + 2*bp->stride]= (code>>4)&1; | |
1013 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
|
1014 }else{ |
2462 | 1015 planep[x + 2 + 0*bp->stride]= (code>>2)&1; |
1016 planep[x + 0 + 1*bp->stride]= (code>>3)&1; | |
1017 planep[x + 1 + 1*bp->stride]= (code>>4)&1; | |
1018 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
|
1019 } |
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1020 } |
2459 | 1021 } |
2460
42077bb89a53
norm-6 / diff-6 support (untested, parts of it just guessed as the spec is unclear)
michael
parents:
2459
diff
changeset
|
1022 |
2462 | 1023 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
|
1024 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
|
1025 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
|
1026 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1027 break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1028 case IMODE_ROWSKIP: |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1029 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
|
1030 break; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1031 case IMODE_COLSKIP: |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1032 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
|
1033 break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1034 default: break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1035 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1036 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1037 /* Applying diff operator */ |
2459 | 1038 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
|
1039 { |
2462 | 1040 planep = bp->data; |
2459 | 1041 planep[0] ^= invert; |
2462 | 1042 for (x=1; x<bp->width; x++) |
2459 | 1043 planep[x] ^= planep[x-1]; |
2462 | 1044 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
|
1045 { |
2462 | 1046 planep += bp->stride; |
1047 planep[0] ^= planep[-bp->stride]; | |
1048 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
|
1049 { |
2462 | 1050 if (planep[x-1] != planep[x-bp->stride]) planep[x] ^= invert; |
1051 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
|
1052 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1053 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1054 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1055 else if (invert) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1056 { |
2462 | 1057 planep = bp->data; |
1058 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
|
1059 } |
2462 | 1060 return (imode<<1) + invert; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1061 } |
2482 | 1062 /** @} */ //Bitplane group |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1063 |
2482 | 1064 /***********************************************************************/ |
1065 /** VOP Dquant decoding | |
1066 * @param v VC9 Context | |
1067 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1068 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
|
1069 { |
2474 | 1070 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
|
1071 int pqdiff; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1072 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1073 //variable size |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1074 if (v->dquant == 2) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1075 { |
2474 | 1076 pqdiff = get_bits(gb, 3); |
1077 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
|
1078 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
|
1079 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1080 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1081 { |
2474 | 1082 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
|
1083 if ( v->dquantfrm ) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1084 { |
2474 | 1085 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
|
1086 switch (v->dqprofile) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1087 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1088 case DQPROFILE_SINGLE_EDGE: |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1089 case DQPROFILE_DOUBLE_EDGES: |
2474 | 1090 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
|
1091 break; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1092 case DQPROFILE_ALL_MBS: |
2474 | 1093 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
|
1094 default: break; //Forbidden ? |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1095 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1096 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
|
1097 { |
2474 | 1098 pqdiff = get_bits(gb, 3); |
1099 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
|
1100 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
|
1101 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1102 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1103 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1104 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1105 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1106 |
2482 | 1107 /***********************************************************************/ |
1108 /** | |
1109 * @defgroup all_frame_hdr All VC9 profiles frame header | |
1110 * @brief Part of the frame header decoding from all profiles | |
1111 * @warning Only pro/epilog differs between Simple/Main and Advanced => check caller | |
1112 * @{ | |
1113 */ | |
1114 /** B and BI frame header decoding, primary part | |
1115 * @see Tables 11+12, p62-65 | |
1116 * @param v VC9 context | |
1117 * @return Status | |
1118 * @warning Also handles BI frames | |
1119 */ | |
2474 | 1120 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
|
1121 { |
2474 | 1122 GetBitContext *gb = &v->s.gb; |
2483 | 1123 int pqindex; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1124 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1125 /* 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
|
1126 if (v->profile == PROFILE_SIMPLE) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1127 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1128 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
|
1129 return FRAME_SKIPPED; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1130 } |
2474 | 1131 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
|
1132 VC9_BFRACTION_VLC_BITS, 2)]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1133 if (v->bfraction < -1) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1134 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1135 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
|
1136 return FRAME_SKIPPED; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1137 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1138 else if (!v->bfraction) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1139 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1140 /* 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
|
1141 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
|
1142 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
|
1143 } |
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 /* Read the quantization stuff */ |
2474 | 1146 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
|
1147 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
|
1148 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
|
1149 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1150 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1151 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
|
1152 } |
2474 | 1153 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
|
1154 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
2474 | 1155 v->pquantizer = get_bits(gb, 1); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1156 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1157 if (v->profile == PROFILE_ADVANCED) |
2483 | 1158 { |
1159 if (v->postprocflag) v->postproc = get_bits(gb, 2); | |
1160 if (v->extended_mv == 1 && v->s.pict_type != BI_TYPE) | |
1161 v->mvrange = get_prefix(gb, 0, 3); | |
1162 } | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1163 #endif |
2483 | 1164 else |
1165 { | |
1166 if (v->extended_mv == 1) | |
1167 v->mvrange = get_prefix(gb, 0, 3); | |
1168 } | |
1169 /* Read the MV mode */ | |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1170 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
|
1171 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1172 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
|
1173 if (v->pq < 13) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1174 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1175 if (!v->mv_mode) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1176 { |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1177 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
|
1178 if (v->mv_mode) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1179 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
|
1180 "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
|
1181 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1182 } |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1183 else |
2445
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 if (!v->mv_mode) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1186 { |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1187 if (get_bits(gb, 1)) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1188 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
|
1189 "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
|
1190 } |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1191 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
|
1192 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1193 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1194 |
2474 | 1195 return 0; |
1196 } | |
1197 | |
2482 | 1198 /** B and BI frame header decoding, secondary part |
1199 * @see Tables 11+12, p62-65 | |
1200 * @param v VC9 context | |
1201 * @return Status | |
1202 * @warning Also handles BI frames | |
1203 * @warning To call once all MB arrays are allocated | |
2483 | 1204 * @todo Support Advanced Profile headers |
2482 | 1205 */ |
2474 | 1206 static int decode_b_picture_secondary_header(VC9Context *v) |
1207 { | |
1208 GetBitContext *gb = &v->s.gb; | |
1209 int status; | |
1210 | |
2483 | 1211 status = bitplane_decoding(&v->skip_mb_plane, v); |
2474 | 1212 if (status < 0) return -1; |
1213 #if TRACE | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1214 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
|
1215 { |
2462 | 1216 status = bitplane_decoding(&v->mv_type_mb_plane, v); |
1217 if (status < 0) | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1218 return -1; |
2462 | 1219 #if TRACE |
2474 | 1220 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " |
2462 | 1221 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1222 #endif | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1223 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1224 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1225 //bitplane |
2462 | 1226 status = bitplane_decoding(&v->direct_mb_plane, v); |
1227 if (status < 0) return -1; | |
1228 #if TRACE | |
2474 | 1229 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct plane encoding: " |
2462 | 1230 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1231 #endif | |
1232 | |
2474 | 1233 av_log(v->s.avctx, AV_LOG_DEBUG, "Skip MB plane encoding: " |
2462 | 1234 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1235 #endif | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1236 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1237 /* 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
|
1238 v->s.mv_table_index = get_bits(gb, 2); //but using vc9_ tables |
2474 | 1239 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
|
1240 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1241 if (v->dquant) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1242 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1243 vop_dquant_decoding(v); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1244 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1245 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1246 if (v->vstransform) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1247 { |
2474 | 1248 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
|
1249 if (v->ttmbf) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1250 { |
2474 | 1251 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
|
1252 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
|
1253 (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
|
1254 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1255 } |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1256 /* 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
|
1257 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1258 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1259 |
2482 | 1260 /** I frame header decoding, primary part |
1261 * @see Tables 5+7, p53-54 and 55-57 | |
1262 * @param v VC9 context | |
1263 * @return Status | |
2483 | 1264 * @todo Support Advanced Profile headers |
2482 | 1265 */ |
2483 | 1266 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
|
1267 { |
2474 | 1268 GetBitContext *gb = &v->s.gb; |
2483 | 1269 int pqindex; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1270 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1271 /* 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
|
1272 //BF = Buffer Fullness |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1273 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
|
1274 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1275 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
|
1276 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1277 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1278 /* Quantizer stuff */ |
2474 | 1279 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
|
1280 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
|
1281 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
|
1282 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1283 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1284 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
|
1285 } |
2474 | 1286 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
|
1287 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
2474 | 1288 v->pquantizer = get_bits(gb, 1); |
1289 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
|
1290 v->pq, v->halfpq); |
2483 | 1291 return 0; |
1292 } | |
1293 | |
1294 /** I frame header decoding, secondary part | |
1295 * @param v VC9 context | |
1296 * @return Status | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1297 * @warning Not called in A/S/C profiles, it seems |
2483 | 1298 * @todo Support Advanced Profile headers |
1299 */ | |
1300 static int decode_i_picture_secondary_header(VC9Context *v) | |
1301 { | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1302 #if HAS_ADVANCED_PROFILE |
2483 | 1303 int status; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1304 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
|
1305 { |
2483 | 1306 v->s.ac_pred = get_bits(&v->s.gb, 1); |
1307 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
|
1308 /* 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
|
1309 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
|
1310 { |
2483 | 1311 v->condover = get_bits(&v->s.gb, 1); |
2462 | 1312 if (v->condover) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1313 { |
2483 | 1314 v->condover = 2+get_bits(&v->s.gb, 1); |
2462 | 1315 if (v->condover == 3) |
1316 { | |
1317 status = bitplane_decoding(&v->over_flags_plane, v); | |
1318 if (status < 0) return -1; | |
2483 | 1319 # if TRACE |
2474 | 1320 av_log(v->s.avctx, AV_LOG_DEBUG, "Overflags plane encoding: " |
2462 | 1321 "Imode: %i, Invert: %i\n", status>>1, status&1); |
2483 | 1322 # endif |
2462 | 1323 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1324 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1325 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1326 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1327 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1328 |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1329 /* Epilog (AC/DC syntax) should be done in caller */ |
2483 | 1330 return 0; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1331 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1332 |
2482 | 1333 /** P frame header decoding, primary part |
1334 * @see Tables 5+7, p53-54 and 55-57 | |
1335 * @param v VC9 context | |
2483 | 1336 * @todo Support Advanced Profile headers |
2482 | 1337 * @return Status |
1338 */ | |
2474 | 1339 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
|
1340 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1341 /* INTERFRM, FRMCNT, RANGEREDFRM read in caller */ |
2474 | 1342 GetBitContext *gb = &v->s.gb; |
2483 | 1343 int lowquant, pqindex; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1344 |
2474 | 1345 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
|
1346 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
|
1347 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
|
1348 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1349 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1350 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
|
1351 } |
2474 | 1352 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
|
1353 if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) |
2474 | 1354 v->pquantizer = get_bits(gb, 1); |
1355 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
|
1356 v->pq, v->halfpq); |
2474 | 1357 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
|
1358 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1359 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
|
1360 { |
2474 | 1361 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
|
1362 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1363 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1364 #endif |
2474 | 1365 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
|
1366 lowquant = (v->pquantizer>12) ? 0 : 1; |
2474 | 1367 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
|
1368 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
|
1369 { |
2474 | 1370 v->mv_mode2 = mv_pmode_table[lowquant][get_prefix(gb, 1, 3)]; |
1371 v->lumscale = get_bits(gb, 6); | |
1372 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
|
1373 } |
2474 | 1374 return 0; |
1375 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1376 |
2482 | 1377 /** P frame header decoding, secondary part |
1378 * @see Tables 5+7, p53-54 and 55-57 | |
1379 * @param v VC9 context | |
1380 * @warning To call once all MB arrays are allocated | |
1381 * @return Status | |
1382 */ | |
2474 | 1383 static int decode_p_picture_secondary_header(VC9Context *v) |
1384 { | |
1385 GetBitContext *gb = &v->s.gb; | |
1386 int status = 0; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1387 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
|
1388 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
|
1389 || 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
|
1390 { |
2462 | 1391 status = bitplane_decoding(&v->mv_type_mb_plane, v); |
1392 if (status < 0) return -1; | |
1393 #if TRACE | |
2474 | 1394 av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " |
2462 | 1395 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1396 #endif | |
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 |
2462 | 1399 status = bitplane_decoding(&v->skip_mb_plane, v); |
1400 if (status < 0) return -1; | |
1401 #if TRACE | |
2474 | 1402 av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " |
2462 | 1403 "Imode: %i, Invert: %i\n", status>>1, status&1); |
1404 #endif | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1405 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1406 /* 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
|
1407 v->s.mv_table_index =get_bits(gb, 2); //but using vc9_ tables |
2474 | 1408 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
|
1409 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1410 if (v->dquant) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1411 { |
2474 | 1412 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
|
1413 vop_dquant_decoding(v); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1414 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1415 |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1416 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
|
1417 if (v->vstransform) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1418 { |
2474 | 1419 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
|
1420 if (v->ttmbf) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1421 { |
2474 | 1422 v->ttfrm = get_bits(gb, 2); |
1423 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
|
1424 (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
|
1425 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1426 } |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1427 /* 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
|
1428 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1429 } |
2482 | 1430 /** @} */ //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
|
1431 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1432 |
2482 | 1433 /***********************************************************************/ |
1434 /** | |
1435 * @defgroup std_frame_hdr VC9 Simple/Main Profiles header decoding | |
1436 * @brief Part of the frame header decoding belonging to Simple/Main Profiles | |
1437 * @warning Only pro/epilog differs between Simple/Main and Advanced => | |
1438 * check caller | |
1439 * @{ | |
1440 */ | |
1441 | |
1442 /** Frame header decoding, first part, in Simple and Main profiles | |
1443 * @see Tables 5+7, p53-54 and 55-57 | |
1444 * @param v VC9 context | |
2483 | 1445 * @todo FIXME: RANGEREDFRM element not read if BI frame from Table6, P54 |
1446 * However, 7.1.1.8 says "all frame types, for main profiles" | |
2482 | 1447 * @return Status |
1448 */ | |
2474 | 1449 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
|
1450 { |
2474 | 1451 GetBitContext *gb = &v->s.gb; |
1452 int status = 0; | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1453 |
2474 | 1454 if (v->finterpflag) v->interpfrm = get_bits(gb, 1); |
1455 skip_bits(gb, 2); //framecnt unused | |
1456 if (v->rangered) v->rangeredfrm = get_bits(gb, 1); | |
1457 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
|
1458 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
|
1459 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1460 if (!v->s.pict_type) |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1461 { |
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1462 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
|
1463 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
|
1464 } |
2474 | 1465 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
|
1466 } |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1467 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
|
1468 |
2474 | 1469 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
|
1470 { |
2483 | 1471 case I_TYPE: status = decode_i_picture_primary_header(v); break; |
2474 | 1472 case P_TYPE: status = decode_p_picture_primary_header(v); break; |
2483 | 1473 case BI_TYPE: //Same as B |
2474 | 1474 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
|
1475 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1476 |
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
|
1477 if (status == FRAME_SKIPPED) |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1478 { |
2475
db05cb59c6fc
- add another way to decode norm6 VLC; modify VLC_NORM6_METH0D define in
michael
parents:
2474
diff
changeset
|
1479 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
|
1480 return status; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1481 } |
2474 | 1482 return 0; |
1483 } | |
1484 | |
2482 | 1485 /** Frame header decoding, secondary part |
1486 * @param v VC9 context | |
1487 * @warning To call once all MB arrays are allocated | |
1488 * @return Status | |
1489 */ | |
2474 | 1490 static int standard_decode_picture_secondary_header(VC9Context *v) |
1491 { | |
1492 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
|
1493 int status = 0; |
2474 | 1494 |
1495 switch (v->s.pict_type) | |
1496 { | |
1497 case P_TYPE: status = decode_p_picture_secondary_header(v); break; | |
1498 case B_TYPE: status = decode_b_picture_secondary_header(v); break; | |
2483 | 1499 case BI_TYPE: |
1500 case I_TYPE: break; //Nothing needed as it's done in the epilog | |
2474 | 1501 } |
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
|
1502 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
|
1503 |
2462 | 1504 /* AC Syntax */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1505 v->c_ac_table_index = decode012(gb); |
2474 | 1506 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
|
1507 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1508 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
|
1509 } |
2462 | 1510 /* DC Syntax */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1511 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
|
1512 |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1513 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1514 } |
2482 | 1515 /** @} */ //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
|
1516 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1517 #if HAS_ADVANCED_PROFILE |
2482 | 1518 /***********************************************************************/ |
1519 /** | |
1520 * @defgroup adv_frame_hdr VC9 Advanced Profile header decoding | |
1521 * @brief Part of the frame header decoding belonging to Advanced Profiles | |
1522 * @warning Only pro/epilog differs between Simple/Main and Advanced => | |
1523 * check caller | |
1524 * @{ | |
1525 */ | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1526 /** Frame header decoding, primary part |
2482 | 1527 * @param v VC9 context |
1528 * @return Status | |
1529 */ | |
2474 | 1530 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
|
1531 { |
2474 | 1532 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
|
1533 static const int type_table[4] = { P_TYPE, B_TYPE, I_TYPE, BI_TYPE }; |
2483 | 1534 int type; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1535 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1536 if (v->interlace) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1537 { |
2474 | 1538 v->fcm = get_bits(gb, 1); |
1539 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
|
1540 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1541 |
2474 | 1542 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
|
1543 if (type > 4 || type < 0) return FRAME_SKIPPED; |
2474 | 1544 v->s.pict_type = type_table[type]; |
1545 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
|
1546 |
2474 | 1547 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
|
1548 if (v->broadcast) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1549 { |
2474 | 1550 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
|
1551 else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1552 { |
2474 | 1553 v->tff = get_bits(gb, 1); |
1554 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
|
1555 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1556 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1557 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1558 if (v->panscanflag) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1559 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1560 #if 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1561 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
|
1562 { |
2474 | 1563 v->topleftx[i] = get_bits(gb, 16); |
1564 v->toplefty[i] = get_bits(gb, 16); | |
1565 v->bottomrightx[i] = get_bits(gb, 16); | |
1566 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
|
1567 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1568 #else |
2474 | 1569 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
|
1570 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1571 } |
2474 | 1572 v->s.no_rounding = !get_bits(gb, 1); |
1573 v->uvsamp = get_bits(gb, 1); | |
1574 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
|
1575 |
2474 | 1576 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
|
1577 { |
2483 | 1578 case I_TYPE: if (decode_i_picture_primary_header(v) < 0) return -1; |
2474 | 1579 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
|
1580 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
|
1581 case B_TYPE: if (decode_b_picture_primary_header(v) < 0) return FRAME_SKIPPED; |
2483 | 1582 default: return -1; |
2474 | 1583 } |
1584 } | |
1585 | |
2482 | 1586 /** Frame header decoding, secondary part |
1587 * @param v VC9 context | |
1588 * @return Status | |
1589 */ | |
2474 | 1590 static int advanced_decode_picture_secondary_header(VC9Context *v) |
1591 { | |
1592 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
|
1593 int status = 0; |
2474 | 1594 |
1595 switch(v->s.pict_type) | |
1596 { | |
2483 | 1597 case P_TYPE: status = decode_p_picture_secondary_header(v); break; |
1598 case B_TYPE: status = decode_b_picture_secondary_header(v); break; | |
1599 case BI_TYPE: | |
1600 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
|
1601 } |
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
|
1602 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
|
1603 |
2462 | 1604 /* AC Syntax */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1605 v->c_ac_table_index = decode012(gb); |
2474 | 1606 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
|
1607 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1608 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
|
1609 } |
2462 | 1610 /* DC Syntax */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1611 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
|
1612 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1613 return 0; |
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 #endif |
2482 | 1616 /** @} */ //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
|
1617 |
2482 | 1618 /***********************************************************************/ |
1619 /** | |
1620 * @defgroup block VC9 Block-level functions | |
1621 * @see 7.1.4, p91 and 8.1.1.7, p(1)04 | |
1622 * @todo TODO: Integrate to MpegEncContext facilities | |
1623 * @{ | |
1624 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1625 |
2482 | 1626 /** |
1627 * @def GET_MQUANT | |
1628 * @brief Get macroblock-level quantizer scale | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1629 * @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
|
1630 * @fixme XXX: Don't know how to initialize mquant otherwise in last case |
2482 | 1631 */ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1632 #define GET_MQUANT() \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1633 if (v->dquantfrm) \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1634 { \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1635 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
|
1636 { \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1637 if (v->dqbilevel) \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1638 { \ |
2474 | 1639 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
|
1640 } \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1641 else \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1642 { \ |
2474 | 1643 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
|
1644 if (mqdiff != 7) mquant = v->pq + mqdiff; \ |
2474 | 1645 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
|
1646 } \ |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1647 } \ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1648 else mquant = v->pq; \ |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1649 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1650 |
2482 | 1651 /** |
1652 * @def GET_MVDATA(_dmv_x, _dmv_y) | |
1653 * @brief Get MV differentials | |
1654 * @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
|
1655 * @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
|
1656 * @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
|
1657 * @todo TODO: Use MpegEncContext arrays to store them |
2482 | 1658 */ |
2462 | 1659 #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
|
1660 index = 1 + get_vlc2(gb, vc9_mv_diff_vlc[s->mv_table_index].table,\ |
2462 | 1661 VC9_MV_DIFF_VLC_BITS, 2); \ |
1662 if (index > 36) \ | |
1663 { \ | |
1664 mb_has_coeffs = 1; \ | |
1665 index -= 37; \ | |
1666 } \ | |
1667 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
|
1668 s->mb_intra = 0; \ |
2462 | 1669 if (!index) { _dmv_x = _dmv_y = 0; } \ |
1670 else if (index == 35) \ | |
1671 { \ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1672 _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
|
1673 _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
|
1674 s->mb_intra = 1; \ |
2462 | 1675 } \ |
1676 else \ | |
1677 { \ | |
1678 index1 = index%6; \ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1679 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
|
1680 else val = 0; \ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1681 val = get_bits(gb, size_table[index1] - val); \ |
2462 | 1682 sign = 0 - (val&1); \ |
1683 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ | |
1684 \ | |
1685 index1 = index/6; \ | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1686 if (s->mspel && index1 == 5) val = 1; \ |
2462 | 1687 else val = 0; \ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1688 val = get_bits(gb, size_table[index1] - val); \ |
2462 | 1689 sign = 0 - (val&1); \ |
1690 _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
|
1691 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
1692 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1693 /** Get predicted DC value |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1694 * prediction dir: left=0, top=1 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1695 * @param s MpegEncContext |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1696 * @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
|
1697 * @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
|
1698 * @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
|
1699 * @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
|
1700 * @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
|
1701 */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1702 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
|
1703 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
|
1704 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1705 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
|
1706 int16_t *dc_val; |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1707 static const uint16_t dcpred[31] = { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1708 1024, 512, 341, 256, 205, 171, 146, 128, |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1709 114, 102, 93, 85, 79, 73, 68, 64, |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1710 60, 57, 54, 51, 49, 47, 45, 43, |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1711 41, 39, 38, 37, 35, 34, 33 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1712 }; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1713 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1714 /* 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
|
1715 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
|
1716 else scale = s->c_dc_scale; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1717 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1718 wrap = s->block_wrap[n]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1719 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
|
1720 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1721 /* B C |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1722 * A X |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1723 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1724 a = dc_val[ - 1]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1725 b = dc_val[ - 1 - wrap]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1726 c = dc_val[ - wrap]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1727 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1728 /* XXX: Rule B is used only for I and BI frames in S/M/C profile |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1729 * with overlap filtering off |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1730 */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1731 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
|
1732 1 /* XXX: overlap filtering off */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1733 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1734 /* Set outer values */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1735 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
|
1736 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
|
1737 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1738 else |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1739 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1740 /* Set outer values */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1741 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
|
1742 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
|
1743 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1744 /* 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
|
1745 if (0) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1746 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1747 /* update predictor */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1748 *dc_val_ptr = &dc_val[0]; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1749 dir_ptr = 0; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1750 return a; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1751 } |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1752 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1753 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1754 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
|
1755 pred = c; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1756 *dir_ptr = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1757 } else { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1758 pred = a; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1759 *dir_ptr = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1760 } |
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 /* update predictor */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1763 *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
|
1764 return pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1765 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1766 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1767 /** 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
|
1768 * @param v The VC9 context |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1769 * @param block 8x8 DCT block |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1770 * @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
|
1771 * @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
|
1772 * @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
|
1773 * @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
|
1774 * @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
|
1775 * @todo TODO: Process the blocks |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1776 * @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
|
1777 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1778 int vc9_decode_block(VC9Context *v, DCTELEM block[64], int n, int coded, int mquant) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1779 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1780 GetBitContext *gb = &v->s.gb; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1781 MpegEncContext *s = &v->s; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1782 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
|
1783 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
|
1784 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
|
1785 int run_diff, i; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1786 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1787 /* XXX: Guard against dumb values of mquant */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1788 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
|
1789 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1790 /* 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
|
1791 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
|
1792 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
|
1793 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1794 if (s->mb_intra) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1795 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1796 int dcdiff; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1797 uint16_t *dc_val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1798 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1799 /* Get DC differential */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1800 if (n < 4) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1801 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
|
1802 } else { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1803 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
|
1804 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1805 if (dcdiff < 0){ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1806 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
|
1807 return -1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1808 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1809 if (dcdiff) |
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 (dcdiff == 119 /* ESC index value */) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1812 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1813 /* TODO: Optimize */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1814 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
|
1815 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
|
1816 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
|
1817 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1818 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1819 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1820 if (mquant == 1) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1821 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
|
1822 else if (mquant == 2) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1823 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
|
1824 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1825 if (get_bits(gb, 1)) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1826 dcdiff = -dcdiff; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1827 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1828 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1829 /* Prediction */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1830 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
|
1831 *dc_val = dcdiff; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1832 /* Store the quantized DC coeff, used for prediction */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1833 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1834 if (n < 4) { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1835 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
|
1836 } else { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1837 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
|
1838 } |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1839 if (block[0] < 0) { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1840 #if TRACE |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1841 //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
|
1842 #endif |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1843 //return -1; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1844 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1845 /* Skip ? */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1846 run_diff = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1847 i = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1848 if (!coded) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1849 goto not_coded; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1850 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1851 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1852 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1853 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1854 mquant = v->pq; |
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 TTBLK */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1857 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
|
1858 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
|
1859 else /* Per frame */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1860 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
|
1861 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1862 /* Get SUBBLKPAT */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1863 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
|
1864 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
|
1865 VC9_SUBBLKPAT_VLC_BITS, 2); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1866 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
|
1867 subblkpat = decode012(gb); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1868 } |
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 AC Decoding |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1871 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
|
1872 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1873 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1874 not_coded: |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1875 if (s->mb_intra) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1876 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
|
1877 if (s->ac_pred) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1878 i = 63; /* XXX: not optimal */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1879 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1880 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1881 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
|
1882 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
|
1883 return 0; |
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 /** @} */ //End for group block |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1887 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1888 /***********************************************************************/ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1889 /** |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1890 * @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
|
1891 * @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
|
1892 * @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
|
1893 * @{ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1894 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1895 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1896 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
|
1897 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1898 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
|
1899 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1900 xy = s->block_index[n]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1901 wrap = s->b8_stride; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1902 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1903 /* B C |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1904 * A X |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1905 */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1906 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
|
1907 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
|
1908 c = s->coded_block[xy - wrap]; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1909 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1910 if (b == c) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1911 pred = a; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1912 } else { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1913 pred = c; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1914 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1915 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1916 /* store value */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1917 *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
|
1918 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1919 return pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1920 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1921 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1922 /** 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
|
1923 * @todo TODO: Extend to AP |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1924 */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1925 int vc9_decode_i_mb(VC9Context *v, DCTELEM block[6][64]) |
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 int i, cbp, val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1928 uint8_t *coded_val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1929 uint32_t * const mb_type_ptr= &v->s.current_picture.mb_type[ v->s.mb_x + v->s.mb_y*v->s.mb_stride ]; |
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 v->s.mb_intra = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1932 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
|
1933 if (cbp < 0) return -1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1934 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
|
1935 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1936 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
|
1937 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1938 val = ((cbp >> (5 - i)) & 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1939 if (i < 4) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1940 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
|
1941 val = val ^ pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1942 *coded_val = val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1943 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1944 cbp |= val << (5 - i); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1945 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
|
1946 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1947 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
|
1948 "\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
|
1949 return -1; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1950 } |
2497
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 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1953 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1954 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1955 /** 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
|
1956 * @todo TODO: Extend to AP |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1957 * @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
|
1958 */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1959 int vc9_decode_p_mb(VC9Context *v, DCTELEM block[6][64]) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1960 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1961 MpegEncContext *s = &v->s; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1962 GetBitContext *gb = &s->gb; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1963 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
|
1964 int cbp; /* cbp decoding stuff */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1965 int hybrid_pred; /* Prediction types */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1966 int mv_mode_bit = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1967 int mqdiff, mquant; /* MB quantization */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1968 int ttmb; /* MB Transform type */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1969 int status; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1970 uint8_t *coded_val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1971 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1972 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
|
1973 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
|
1974 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
|
1975 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
|
1976 int index, index1; /* LUT indices */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1977 int val, sign; /* temp values */ |
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 mquant = v->pq; /* Loosy initialization */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1980 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1981 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
|
1982 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
|
1983 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
|
1984 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
|
1985 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
|
1986 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1987 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
|
1988 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1989 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
|
1990 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1991 /* 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
|
1992 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
|
1993 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
|
1994 hybrid_pred = get_bits(gb, 1); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
1995 /* 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
|
1996 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
|
1997 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1998 GET_MQUANT(); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
1999 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
|
2000 /* XXX: how to handle cbp ? */ |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2001 cbp = 0; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2002 for (i=0; i<6; i++) |
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 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
|
2005 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
|
2006 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2007 return 0; |
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 else if (mb_has_coeffs) |
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 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
|
2012 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
|
2013 GET_MQUANT(); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2014 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2015 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2016 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2017 mquant = v->pq; |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2018 /* XXX: how to handle cbp ? */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2019 /* 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
|
2020 cbp = 0; |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2021 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2022 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2023 if (!v->ttmbf) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2024 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
|
2025 VC9_TTMB_VLC_BITS, 12); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2026 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2027 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
|
2028 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2029 val = ((cbp >> (5 - i)) & 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2030 if (i < 4) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2031 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
|
2032 val = val ^ pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2033 *coded_val = val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2034 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2035 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
|
2036 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2037 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2038 else //Skipped |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2039 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2040 /* 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
|
2041 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
|
2042 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
|
2043 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
|
2044 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2045 /* TODO: blah */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2046 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2047 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2048 } //1MV mode |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2049 else //4MV mode |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2050 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2051 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
|
2052 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2053 /* Get CBPCY */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2054 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
|
2055 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
|
2056 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2057 val = ((cbp >> (5 - i)) & 1); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2058 if (i < 4) { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2059 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
|
2060 val = val ^ pred; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2061 *coded_val = val; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2062 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2063 if (i<4 && val) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2064 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2065 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
|
2066 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2067 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
|
2068 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
|
2069 GET_MQUANT(); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2070 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2071 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
|
2072 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
|
2073 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
|
2074 if (!v->ttmbf) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2075 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
|
2076 VC9_TTMB_VLC_BITS, 12); |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2077 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
|
2078 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2079 return status; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2080 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2081 else //Skipped MB |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2082 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2083 /* 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
|
2084 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
|
2085 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2086 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
|
2087 hybrid_pred = get_bits(gb, 1); |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2088 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
|
2089 } |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2090 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
|
2091 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
|
2092 /* TODO: blah */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2093 return 0; |
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 } |
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 /* Should never happen */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2098 return -1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2099 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2100 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2101 /** 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
|
2102 * @todo TODO: Extend to AP |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2103 * @warning XXX: Used for decoding BI MBs |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2104 * @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
|
2105 */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2106 int vc9_decode_b_mb(VC9Context *v, DCTELEM block[6][64]) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2107 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2108 MpegEncContext *s = &v->s; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2109 GetBitContext *gb = &v->s.gb; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2110 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
|
2111 int b_mv_type = BMV_TYPE_BACKWARD; |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2112 int mquant, mqdiff; /* MB quant stuff */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2113 int ttmb; /* MacroBlock transform type */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2114 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2115 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
|
2116 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
|
2117 int mb_has_coeffs = 1; /* last_flag */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2118 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
|
2119 int index, index1; /* LUT indices */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2120 int val, sign; /* MVDATA temp values */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2121 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2122 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
|
2123 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2124 if (v->direct_mb_plane.is_raw) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2125 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
|
2126 if (v->skip_mb_plane.is_raw) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2127 v->skip_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
|
2128 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2129 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
|
2130 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2131 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
|
2132 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2133 b_mv_type = decode012(gb); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2134 if (v->bfraction > 420 /*1/2*/ && |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2135 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
|
2136 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2137 else |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2138 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2139 GET_MVDATA(dmv1_x, dmv1_y); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2140 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
|
2141 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2142 b_mv_type = decode012(gb); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2143 if (v->bfraction > 420 /*1/2*/ && |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2144 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
|
2145 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2146 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2147 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2148 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
|
2149 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2150 if (mb_has_coeffs /* BMV1 == "last" */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2151 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2152 GET_MQUANT(); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2153 if (s->mb_intra /* intra mb */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2154 s->ac_pred = get_bits(gb, 1); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2155 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2156 else |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2157 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2158 /* if bmv1 tells MVs are interpolated */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2159 if (b_mv_type == BMV_TYPE_INTERPOLATED) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2160 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2161 GET_MVDATA(dmv2_x, dmv2_y); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2162 mquant = v->pq; //FIXME: initialization not necessary ? |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2163 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2164 /* GET_MVDATA has reset some stuff */ |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2165 if (mb_has_coeffs /* b_mv2 == "last" */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2166 { |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2167 if (s->mb_intra /* intra_mb */) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2168 s->ac_pred = get_bits(gb, 1); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2169 GET_MQUANT(); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2170 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2171 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2172 } |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2173 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2174 //End1 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2175 if (v->ttmbf) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2176 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
|
2177 VC9_TTMB_VLC_BITS, 12); |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2178 |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2179 //End2 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2180 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
|
2181 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2182 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
|
2183 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2184 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2185 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2186 |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2187 /** 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
|
2188 * @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
|
2189 (branch prediction should help there though) |
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2190 */ |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2191 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
|
2192 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2193 MpegEncContext *s = &v->s; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2194 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2195 /* 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
|
2196 if (v->pq < 5) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2197 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2198 v->tt_index = 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2199 v->ttblk4x4 = 3; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2200 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2201 else if (v->pq < 13) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2202 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2203 v->tt_index = 1; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2204 v->ttblk4x4 = 3; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2205 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2206 else |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2207 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2208 v->tt_index = 2; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2209 v->ttblk4x4 = 2; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2210 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2211 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2212 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
|
2213 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2214 /* Select proper long MV range */ |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2215 switch (v->mvrange) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2216 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2217 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
|
2218 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
|
2219 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
|
2220 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
|
2221 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2222 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2223 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
|
2224 v->k_x -= s->mspel; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2225 v->k_y -= s->mspel; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2226 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2227 |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2228 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
|
2229 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2230 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
|
2231 { |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2232 //FIXME Get proper MB DCTELEM |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2233 //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
|
2234 switch (s->pict_type) |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2235 { |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2236 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
|
2237 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
|
2238 case BI_TYPE: |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2239 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
|
2240 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2241 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2242 //Add a check for overconsumption ? |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2243 } |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2244 return 0; |
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2245 } |
2482 | 2246 /** @} */ //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
|
2247 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2248 #if HAS_ADVANCED_PROFILE |
2482 | 2249 /***********************************************************************/ |
2250 /** | |
2251 * @defgroup adv_mb VC9 Macroblock-level functions in Advanced Profile | |
2252 * @todo TODO: Integrate to MpegEncContext facilities | |
2253 * @todo TODO: Code P, B and BI | |
2254 * @{ | |
2255 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2256 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
|
2257 { |
2474 | 2258 MpegEncContext *s = &v->s; |
2259 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
|
2260 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
|
2261 |
2474 | 2262 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
|
2263 { |
2474 | 2264 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
|
2265 { |
2474 | 2266 if (v->ac_pred_plane.is_raw) |
2267 s->ac_pred = get_bits(gb, 1); | |
2268 else | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2269 s->ac_pred = v->ac_pred_plane.data[mb_offset]; |
2462 | 2270 if (v->condover == 3 && v->over_flags_plane.is_raw) |
2474 | 2271 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
|
2272 GET_MQUANT(); |
2462 | 2273 |
2274 /* TODO: lots */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2275 } |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2276 mb_offset++; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2277 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2278 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2279 } |
2482 | 2280 /** @} */ //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
|
2281 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2282 |
2482 | 2283 /** Initialize a VC9/WMV3 decoder |
2284 * @todo TODO: Handle VC-9 IDUs (Transport level?) | |
2285 * @todo TODO: Decypher remaining bits in extra_data | |
2286 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2287 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
|
2288 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2289 VC9Context *v = avctx->priv_data; |
2474 | 2290 MpegEncContext *s = &v->s; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2291 GetBitContext gb; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2292 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2293 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
|
2294 avctx->pix_fmt = PIX_FMT_YUV420P; |
2474 | 2295 v->s.avctx = avctx; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2296 |
2474 | 2297 if(ff_h263_decode_init(avctx) < 0) |
2298 return -1; | |
2299 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
|
2300 |
2462 | 2301 avctx->coded_width = avctx->width; |
2302 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
|
2303 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
|
2304 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2305 int count = 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2306 |
2474 | 2307 // looks like WMV3 has a sequence header stored in the extradata |
2308 // advanced sequence header may be before the first frame | |
2309 // the last byte of the extradata is a version number, 1 for the | |
2310 // samples we can decode | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2311 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2312 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8); |
2474 | 2313 |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2314 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
|
2315 return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2316 |
2474 | 2317 count = avctx->extradata_size*8 - get_bits_count(&gb); |
2318 if (count>0) | |
2319 { | |
2320 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n", | |
2321 count, get_bits(&gb, count)); | |
2322 } | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2323 else if (count < 0) |
2474 | 2324 { |
2325 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count); | |
2326 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2327 } |
2474 | 2328 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
|
2329 |
2474 | 2330 s->mb_width = (avctx->coded_width+15)>>4; |
2331 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
|
2332 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2333 /* Allocate mb bitplanes */ |
2474 | 2334 if (alloc_bitplane(&v->mv_type_mb_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2335 return -1; |
2474 | 2336 if (alloc_bitplane(&v->mv_type_mb_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2337 return -1; |
2474 | 2338 if (alloc_bitplane(&v->skip_mb_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2339 return -1; |
2474 | 2340 if (alloc_bitplane(&v->direct_mb_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2341 return -1; |
2342 | |
2343 /* For predictors */ | |
2474 | 2344 v->previous_line_cbpcy = (uint8_t *)av_malloc(s->mb_stride*4); |
2462 | 2345 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
|
2346 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2347 #if HAS_ADVANCED_PROFILE |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2348 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
|
2349 { |
2474 | 2350 if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2351 return -1; |
2474 | 2352 if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0) |
2462 | 2353 return -1; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2354 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2355 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2356 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2357 return 0; |
2474 | 2358 } |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2359 |
2482 | 2360 /** Decode a VC9/WMV3 frame |
2361 * @todo TODO: Handle VC-9 IDUs (Transport level?) | |
2362 * @warning Initial try at using MpegEncContext stuff | |
2363 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2364 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
|
2365 void *data, int *data_size, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2366 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
|
2367 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2368 VC9Context *v = avctx->priv_data; |
2474 | 2369 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
|
2370 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
|
2371 AVFrame *pict = data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2372 uint8_t *tmp_buf; |
2474 | 2373 v->s.avctx = avctx; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2374 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2375 //buf_size = 0 -> last frame |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2376 if (!buf_size) return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2377 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2378 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
|
2379 avctx->height); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2380 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
|
2381 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
|
2382 avctx->width, avctx->height); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2383 |
2474 | 2384 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
|
2385 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2386 #if 0 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2387 // search for IDU's |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2388 // FIXME |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2389 uint32_t scp = 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2390 int scs = 0, i = 0; |
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 while (i < buf_size) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2393 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2394 for (; i < buf_size && scp != 0x000001; i++) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2395 scp = ((scp<<8)|buf[i])&0xffffff; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2396 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2397 if (scp != 0x000001) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2398 break; // eof ? |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2399 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2400 scs = buf[i++]; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2401 |
2474 | 2402 init_get_bits(gb, buf+i, (buf_size-i)*8); |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2403 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2404 switch(scs) |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2405 { |
2462 | 2406 case 0x0A: //Sequence End Code |
2407 return 0; | |
2408 case 0x0B: //Slice Start Code | |
2409 av_log(avctx, AV_LOG_ERROR, "Slice coding not supported\n"); | |
2410 return -1; | |
2411 case 0x0C: //Field start code | |
2412 av_log(avctx, AV_LOG_ERROR, "Interlaced coding not supported\n"); | |
2413 return -1; | |
2414 case 0x0D: //Frame start code | |
2415 break; | |
2416 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
|
2417 if (v->profile < PROFILE_ADVANCED) |
2462 | 2418 av_log(avctx, AV_LOG_ERROR, |
2419 "Found an entry point in profile %i\n", v->profile); | |
2474 | 2420 advanced_entry_point_process(avctx, gb); |
2462 | 2421 break; |
2422 case 0x0F: //Sequence header Start Code | |
2474 | 2423 decode_sequence_header(avctx, gb); |
2462 | 2424 break; |
2425 default: | |
2426 av_log(avctx, AV_LOG_ERROR, | |
2427 "Unsupported IDU suffix %lX\n", scs); | |
2428 } | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2429 |
2474 | 2430 i += get_bits_count(gb)*8; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2431 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2432 #else |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2433 av_abort(); |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2434 #endif |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2435 } |
2474 | 2436 else |
2437 init_get_bits(&v->s.gb, buf, buf_size*8); | |
2438 | |
2439 s->flags= avctx->flags; | |
2440 s->flags2= avctx->flags2; | |
2441 | |
2442 /* no supplementary picture */ | |
2443 if (buf_size == 0) { | |
2444 /* special case for last picture */ | |
2445 if (s->low_delay==0 && s->next_picture_ptr) { | |
2446 *pict= *(AVFrame*)s->next_picture_ptr; | |
2447 s->next_picture_ptr= NULL; | |
2448 | |
2449 *data_size = sizeof(AVFrame); | |
2450 } | |
2451 | |
2452 return 0; | |
2453 } | |
2454 | |
2455 //No IDU - we mimic ff_h263_decode_frame | |
2456 s->bitstream_buffer_size=0; | |
2457 | |
2458 if (!s->context_initialized) { | |
2459 if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix | |
2460 return -1; | |
2461 } | |
2462 | |
2463 //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there | |
2464 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){ | |
2465 s->current_picture_ptr= &s->picture[ff_find_unused_picture(s, 0)]; | |
2466 } | |
2467 #if HAS_ADVANCED_PROFILE | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2468 if (v->profile == PROFILE_ADVANCED) |
2474 | 2469 ret= advanced_decode_picture_primary_header(v); |
2470 else | |
2471 #endif | |
2472 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
|
2473 if (ret == FRAME_SKIPPED) return buf_size; |
2474 | 2474 /* skip if the header was thrashed */ |
2475 if (ret < 0){ | |
2476 av_log(s->avctx, AV_LOG_ERROR, "header damaged\n"); | |
2477 return -1; | |
2478 } | |
2479 | |
2480 //No bug workaround yet, no DCT conformance | |
2481 | |
2482 //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
|
2483 if (v->profile < PROFILE_ADVANCED && v->multires){ |
2474 | 2484 //Parse context stuff in here, don't know how appliable it is |
2485 } | |
2486 //Not sure about context initialization | |
2487 | |
2488 // for hurry_up==5 | |
2489 s->current_picture.pict_type= s->pict_type; | |
2490 s->current_picture.key_frame= s->pict_type == I_TYPE; | |
2491 | |
2492 /* skip b frames if we dont have reference frames */ | |
2493 if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)) | |
2494 return buf_size; //FIXME simulating all buffer consumed | |
2495 /* skip b frames if we are in a hurry */ | |
2496 if(avctx->hurry_up && s->pict_type==B_TYPE) | |
2497 return buf_size; //FIXME simulating all buffer consumed | |
2498 /* skip everything if we are in a hurry>=5 */ | |
2499 if(avctx->hurry_up>=5) | |
2500 return buf_size; //FIXME simulating all buffer consumed | |
2501 | |
2502 if(s->next_p_frame_damaged){ | |
2503 if(s->pict_type==B_TYPE) | |
2504 return buf_size; //FIXME simulating all buffer consumed | |
2505 else | |
2506 s->next_p_frame_damaged=0; | |
2507 } | |
2508 | |
2509 if(MPV_frame_start(s, avctx) < 0) | |
2510 return -1; | |
2511 | |
2512 ff_er_frame_start(s); | |
2513 | |
2514 //wmv9 may or may not have skip bits | |
2515 #if HAS_ADVANCED_PROFILE | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2516 if (v->profile == PROFILE_ADVANCED) |
2474 | 2517 ret= advanced_decode_picture_secondary_header(v); |
2518 else | |
2519 #endif | |
2520 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
|
2521 if (ret<0) return FRAME_SKIPPED; //FIXME Non fatal for now |
2474 | 2522 |
2523 //We consider the image coded in only one slice | |
2524 #if HAS_ADVANCED_PROFILE | |
2497
69adfbbdcdeb
- samples from mplayer ftp in the "adv" profile seem to have profile=2,
michael
parents:
2483
diff
changeset
|
2525 if (v->profile == PROFILE_ADVANCED) |
2474 | 2526 { |
2527 switch(s->pict_type) | |
2528 { | |
2529 case I_TYPE: ret = advanced_decode_i_mbs(v); break; | |
2530 case P_TYPE: ret = decode_p_mbs(v); break; | |
2531 case B_TYPE: | |
2532 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
|
2533 default: ret = FRAME_SKIPPED; |
2474 | 2534 } |
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
|
2535 if (ret == FRAME_SKIPPED) return buf_size; //We ignore for now failures |
2474 | 2536 } |
2537 else | |
2538 #endif | |
2539 { | |
2518
2c794e3903a2
- renaming the AC coding set variable names to more meaningful ones
michael
parents:
2497
diff
changeset
|
2540 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
|
2541 if (ret == FRAME_SKIPPED) return buf_size; |
2474 | 2542 } |
2543 | |
2544 ff_er_frame_end(s); | |
2545 | |
2546 MPV_frame_end(s); | |
2547 | |
2548 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type); | |
2549 assert(s->current_picture.pict_type == s->pict_type); | |
2550 if(s->pict_type==B_TYPE || s->low_delay){ | |
2551 *pict= *(AVFrame*)&s->current_picture; | |
2552 ff_print_debug_info(s, pict); | |
2553 } else { | |
2554 *pict= *(AVFrame*)&s->last_picture; | |
2555 if(pict) | |
2556 ff_print_debug_info(s, pict); | |
2557 } | |
2558 | |
2559 /* Return the Picture timestamp as the frame number */ | |
2560 /* we substract 1 because it is added on utils.c */ | |
2561 avctx->frame_number = s->picture_number - 1; | |
2562 | |
2563 /* dont output the last pic after seeking */ | |
2564 if(s->last_picture_ptr || s->low_delay) | |
2565 *data_size = sizeof(AVFrame); | |
2566 | |
2462 | 2567 av_log(avctx, AV_LOG_DEBUG, "Consumed %i/%i bits\n", |
2474 | 2568 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
|
2569 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2570 /* Fake consumption of all data */ |
2462 | 2571 *data_size = len; |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2572 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
|
2573 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2574 |
2482 | 2575 /** Close a VC9/WMV3 decoder |
2576 * @warning Initial try at using MpegEncContext stuff | |
2577 */ | |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2578 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
|
2579 { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2580 VC9Context *v = avctx->priv_data; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2581 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2582 #if HAS_ADVANCED_PROFILE |
2458
915094e3da5d
dont use several 100 mb memory for a tiny 120 element table
michael
parents:
2453
diff
changeset
|
2583 av_freep(&v->hrd_rate); |
915094e3da5d
dont use several 100 mb memory for a tiny 120 element table
michael
parents:
2453
diff
changeset
|
2584 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
|
2585 #endif |
2474 | 2586 MPV_common_end(&v->s); |
2587 free_bitplane(&v->mv_type_mb_plane); | |
2588 free_bitplane(&v->skip_mb_plane); | |
2589 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
|
2590 return 0; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2591 } |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2592 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2593 AVCodec vc9_decoder = { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2594 "vc9", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2595 CODEC_TYPE_VIDEO, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2596 CODEC_ID_VC9, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2597 sizeof(VC9Context), |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2598 vc9_decode_init, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2599 NULL, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2600 vc9_decode_end, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2601 vc9_decode_frame, |
2453 | 2602 CODEC_CAP_DELAY, |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2603 NULL |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2604 }; |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2605 |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2606 AVCodec wmv3_decoder = { |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2607 "wmv3", |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2608 CODEC_TYPE_VIDEO, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2609 CODEC_ID_WMV3, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2610 sizeof(VC9Context), |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2611 vc9_decode_init, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2612 NULL, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2613 vc9_decode_end, |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2614 vc9_decode_frame, |
2453 | 2615 CODEC_CAP_DELAY, |
2445
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2616 NULL |
96da66323faa
preliminary vc9 bitstream decoder, committing to make syncing and team-work on it easier
alex
parents:
diff
changeset
|
2617 }; |