1 /* ***** BEGIN LICENSE BLOCK *****
2 *
3 * $Id: mvdata_byteio.h,v 1.5 2008/09/10 12:28:46 asuraparaju Exp $ $Name: Dirac_1_0_2 $
4 *
5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 *
7 * The contents of this file are subject to the Mozilla Public License
8 * Version 1.1 (the "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 * http://www.mozilla.org/MPL/
11 *
12 * Software distributed under the License is distributed on an "AS IS" basis,
13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
14 * the specific language governing rights and limitations under the License.
15 *
16 * The Original Code is BBC Research and Development code.
17 *
18 * The Initial Developer of the Original Code is the British Broadcasting
19 * Corporation.
20 * Portions created by the Initial Developer are Copyright (C) 2004.
21 * All Rights Reserved.
22 *
23 * Contributor(s): Anuradha Suraparaju (Original Author)
24 *                 Andrew Kennedy
25 *
26 * Alternatively, the contents of this file may be used under the terms of
27 * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
28 * Public License Version 2.1 (the "LGPL"), in which case the provisions of
29 * the GPL or the LGPL are applicable instead of those above. If you wish to
30 * allow use of your version of this file only under the terms of the either
31 * the GPL or LGPL and not to allow others to use your version of this file
32 * under the MPL, indicate your decision by deleting the provisions above
33 * and replace them with the notice and other provisions required by the GPL
34 * or LGPL. If you do not delete the provisions above, a recipient may use
35 * your version of this file under the terms of any one of the MPL, the GPL
36 * or the LGPL.
37 * ***** END LICENSE BLOCK ***** */
38 
39 /**
40 * Definition of class MvDataByteIO
41 */
42 #ifndef MV_DATA_BYTEIO_H
43 #define MV_DATA_BYTEIO_H
44 
45 
46 // DIRAC INCLUDES
47 #include <libdirac_common/common.h>              // EncParams
48 
49 //LOCAL INCLUDES
50 #include <libdirac_byteio/byteio.h>              // Parent class
51 #include <libdirac_byteio/mvdataelement_byteio.h>// Member byteio class
52 
53 
54 namespace dirac
55 {
56     /**
57     * Represents compressed sequence-parameter data used in an AccessUnit
58     */
59     class MvDataByteIO : public ByteIO
60     {
61     public:
62 
63         /**
64         * Constructor
65         *@param pparams         Picture Params
66         *@param picpredparams   Picture prediction parameters
67         */
68         MvDataByteIO(PictureParams& pparams,
69                         PicturePredParams& picpredparams);
70 
71         /**
72         * Constructor
73         *@param byte_io         Input/Output Byte stream
74         *@param pparams         Picture Params
75         *@param picpredparams   Picture prediction parameters
76         */
77         MvDataByteIO(ByteIO &byte_io, PictureParams& pparams,
78                         PicturePredParams& picpredparams);
79 
80         /**
81         * Destructor
82         */
83         virtual ~MvDataByteIO();
84 
85         /**
86         * Gathers byte stats on the motion vector data
87         *@param dirac_byte_stats Stat container
88         */
89         void CollateByteStats(DiracByteStats& dirac_byte_stats);
90 
91         /**
92         * Outputs motion vector data Dirac byte-format
93         */
94         void Output();
95 
96         /**
97         * Inputs motion vector information
98         */
99         void Input();
100 
101 
102         /**
103         * Get string containing coded bytes
104         */
105         virtual const std::string GetBytes();
106 
107         /**
108         * Return pointer to the superblock splitting modes ByteIO stream
109         */
SplitModeData()110         MvDataElementByteIO*  SplitModeData() { return &m_splitmode_data; };
111 
112         /**
113         * Return pointer to the superblock splitting modes ByteIO stream
114         */
PredModeData()115         MvDataElementByteIO*  PredModeData() { return &m_predmode_data; };
116 
117         /**
118         * Return pointer to the block MVs reference 1 ByteIO stream
119         */
MV1HorizData()120         MvDataElementByteIO*  MV1HorizData() { return &m_mv1hblock_data; };
121 
122         /**
123         * Return pointer to the block MVs reference 1 ByteIO stream
124         */
MV1VertData()125         MvDataElementByteIO*  MV1VertData() { return &m_mv1vblock_data; };
126 
127         /**
128         * Return pointer to the block MV reference 2 ByteIO stream
129         */
MV2HorizData()130         MvDataElementByteIO*  MV2HorizData() { return &m_mv2hblock_data; };
131 
132         /**
133         * Return pointer to the block MV reference 2 ByteIO stream
134         */
MV2VertData()135         MvDataElementByteIO*  MV2VertData() { return &m_mv2vblock_data; };
136 
137         /**
138         * Return pointer to the block Y DC values ByteIO stream
139         */
YDCData()140         MvDataElementByteIO*  YDCData() { return &m_ydcblock_data; };
141 
142         /**
143         * Return pointer to the block U DC values ByteIO stream
144         */
UDCData()145         MvDataElementByteIO*  UDCData() { return &m_udcblock_data; };
146 
147         /**
148         * Return pointer to the block V DC values ByteIO stream
149         */
VDCData()150         MvDataElementByteIO*  VDCData() { return &m_vdcblock_data; };
151 
152         /**
153         * Return the size
154         */
155         int GetSize() const;
156 
157     protected:
158 
159 
160     private:
161         /**
162         * Inputs block parameters
163         */
164         void InputBlockParams();
165 
166         /**
167         * Inputs Motion vector precision data
168         */
169         void InputMVPrecision();
170 
171         /**
172         * Inputs global motion parameters
173         */
174         void InputGlobalMotionParams();
175 
176         /**
177         * Inputs picture prediction mode
178         */
179         void InputFramePredictionMode();
180 
181         /**
182         * Inputs Picture Weights
183         */
184         void InputPictureWeights();
185 
186         /**
187         * Outputs block parameters
188         */
189         void OutputBlockParams();
190 
191         /**
192         * Outputs Motion vector precision data
193         */
194         void OutputMVPrecision();
195 
196         /**
197         * Outputs global motion parameters
198         */
199         void OutputGlobalMotionParams();
200 
201         /**
202         * Outputs picture prediction mode
203         */
204         void OutputFramePredictionMode();
205 
206         /**
207         * Outputs Picture Weights
208         */
209         void OutputPictureWeights();
210 
211         /**
212         * Sequence paramters for intput/output
213         */
214         PictureParams&   m_pparams;
215 
216         /**
217         * Codec params - EncParams for Output and DecParams for input
218         */
219         PicturePredParams& m_picpredparams;
220 
221         /**
222         * block data containing split modes
223         */
224         MvDataElementByteIO m_splitmode_data;
225 
226         /**
227         * block data containing prediction modes
228         */
229         MvDataElementByteIO m_predmode_data;
230 
231         /**
232         * block data containing horizontal MV components for reference 1
233         */
234         MvDataElementByteIO m_mv1hblock_data;
235 
236         /**
237         * block data containing vertical MV components for reference 1
238         */
239         MvDataElementByteIO m_mv1vblock_data;
240 
241         /**
242         * block data containing horizontal MV components for reference 2
243         */
244         MvDataElementByteIO m_mv2hblock_data;
245 
246         /**
247         * block data containing vertical MV components for reference 2
248         */
249         MvDataElementByteIO m_mv2vblock_data;
250 
251         /**
252         * block data containing Y DC data
253         */
254         MvDataElementByteIO m_ydcblock_data;
255 
256         /**
257         * block data containing U DC data
258         */
259         MvDataElementByteIO m_udcblock_data;
260 
261         /**
262         * block data containing V DC data
263         */
264         MvDataElementByteIO m_vdcblock_data;
265     };
266 
267 } // namespace dirac
268 
269 #endif
270