• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #ifndef CCZOOMROTATIONBASE_H_INCLUDED
19 #define CCZOOMROTATIONBASE_H_INCLUDED
20 
21 #ifndef OSCL_BASE_H_INCLUDED
22 #include "oscl_base.h"
23 #endif
24 
25 #ifndef OSCL_MEM_H_INCLUDED
26 #include "oscl_mem.h"
27 #endif
28 
29 
30 #ifndef COLORCONV_CONFIG_H_INCLUDED
31 #include "colorconv_config.h"
32 #endif
33 
34 /* add capability support */
35 #define  CCSUPPORT_ROTATION     0x1
36 #define  CCSUPPORT_SCALING      0x2
37 
38 /* rotation orientation, values for nRotation */
39 #define CCROTATE_NONE            0
40 #define CCROTATE_CNTRCLKWISE     1
41 #define CCROTATE_180             2
42 #define CCROTATE_CLKWISE         3
43 #define CCFLIP                   4
44 #define CCBOTTOM_UP              8
45 
46 /**
47 *   Description - This is the base class of color converter classes.
48 *   Each of the 3 libraries needs to include this class in the project.
49 *
50 *   ASSUMPTIONS:
51 *   1. zoom ratio must be no greater than 3
52 *   2. cannot do zoom in in one dimenstion and zoom out in another
53 *   3. caller should take care of the aspect ratio control
54 *   4. if there are margins, the caller should paint the background to the desired color
55 *   5. all the starting address MUST be multiple of 4, which is normally the case.
56 *   4. the dest pitch MUST be multiple of 4
57 *
58 */
59 // Definition of ColorConvertBase class
60 
61 class ColorConvertBase
62 {
63     public:
64 
65         //! Constructor
66         ColorConvertBase();
67 
68         //! Destructor
69         OSCL_IMPORT_REF virtual ~ColorConvertBase();
70 
71         /**
72         *   @brief  This function returns a value indicate the capability of the library at run-time.
73         *   @return It returns one of or a union of CCSUPPORT_ROTATION and CCSUPPORT_SCALING
74         */
75         virtual int16 GetCapability(void);
76 
77         /**
78         *   @brief The function initializes necessary lookup tables and verify the capability of the library before starting the operation.
79         *   @param Src_width specifies the width in pixel from the source to be color converted.
80         *   @param Src_height specifies the height in pixel from the source to be color converted.
81         *   @param Src_pitch is the actual memory width or stride of the source.
82         *   @param Dst_width specifies the width in pixel of the output.
83         *   @param Dst_height specifies the height in pixel of the output.
84         *   @param Dst_pitch is the stride size of the destination memory.
85         *   @param nRotation specifies whether rotation is to be applied. The value can be one of the followings
86         *   CCROTATE_NONE (0), CCROTATE_CNTRCLKWISE (1) or CCROTATE_CLKWISE (3).
87         *   When rotation is chosen, the Dst_width and Dst_height is still relative to the source coordinate,
88         *   i.e., to rotate a QCIF image, the output width will be 144 and height will be 176.
89         *   @return It returns 1 if success, 0 if fail, i.e., rotation or scaling not supported or
90         *   any of the above parameters is an odd number.
91         */
92 
93         virtual int32 Init(int32 Src_width, int32 Src_height, int32 Src_pitch, int32 Dst_width, int32 Dst_height, int32 Dst_pitch, int32 nRotation = 0);
94 
95         /**
96         *   @brief This function specifies the height of the Y plane which may be larger
97         *   than the height of the displayed region. For example, the output from PVM4Vdec
98         *   always has width and height to be multiple of 16 pixels but the actual size may be not.
99         *   In this case, users will set the src_width and src_height to the actual size,
100         *   but set the src_pitch and SetMemHeight to the allocated Y plane size.
101         *   For WMV, the Y plane output from WMV decoder has the exact dimension (no padding
102         *   for multiple of 16).
103         */
SetMemHeight(int32 a_mHeight)104         virtual void SetMemHeight(int32 a_mHeight)
105         {
106             _mSrc_mheight = a_mHeight;
107         };
108 
109         /**
110         *   @brief This function specifies whether the output will use the attribute specified
111         *   in the Init(.) function or perform regular color conversion without scaling or rotation.
112         *   @param nMode When set to 0, 1-to-1 color conversion only is done. When NMode is 1,
113         *   the output is be of the size and orientation specified in Init().
114         *   @return 0 if fails (capability not supported or not initialized), 1 if success.
115         */
116         virtual int32 SetMode(int32 nMode) = 0; //nMode : 0 Off, 1 On
117 
118         /**
119         *   @brief These functions convert the input buffer data into the output format
120         *   and write the converted data to the output buffer.
121         *   @param srcBuf is a pointer to the Y plane assuming that the U and V planes are contiguous to the Y plane.
122         *   @param destBuf is a pointer to an output buffer.
123         *   @return This function return 1 if success, 0 if fail.in the case of the destBuf
124         *   and/or srcBuf address are not word-aligned (multiple of 4).
125         */
126 
127         virtual int32 Convert(uint8 *srcBuf, uint8 *destBuf) = 0;
128 
129         /**
130         *   @brief This function returns the size of output buffer that users need
131         *   to allocate and pass it in as an input argument to Convert() function.
132         *   Depending on the input argument to SetMode(), the buffer size can change.
133         *   Furthermore, the color conversion library MAY REQUIRE BUFFER TO BE LARGER
134         *   THAN what users EXPECT for extra processing space.
135         *   @return An integer specifying the size of the output buffer.
136         */
137         virtual int32 GetOutputBufferSize(void) = 0;
138 
139         /**
140         *   @brief This function allows the destination pitch to be set at run-time,
141         *   e.g., switching between zoom & nonZoom mode.
142         *   @return 1.
143         */
SetDstPitch(int32 iDstPitch)144         int32 SetDstPitch(int32 iDstPitch)
145         {
146             _mDisp.dst_pitch = iDstPitch;
147             return 1;
148         };
149 
150 
151         /**
152         *   @brief This function specifies the range of the YCbCr input such that the
153         *   conversion to RGB is done accordingly (see ISO/IEC 14496-2:2004/FPDAM 3)..
154         *   @param range  a boolean, false or zero means the range of the Y is 16-235,
155         *   true or one means the full range of 0-255 is used. The default range is false.
156         */
157 
158         virtual int32  SetYuvFullRange(bool range) = 0;
159 
160     protected:
161 
162         /** Internal structure for display property. This structure contains all configuration related
163         *   parameters thus unifying the interface to variations of color convert functions
164         */
165         typedef struct
166         {
167             /** @brief Pitch of the input buffer (in pixel) */
168             int32 src_pitch;
169             /** @brief Pitch of the output buffer (in pixel) */
170             int32 dst_pitch;
171             /** @brief Width of the content of the input (in pixel) */
172             int32 src_width;
173             /** @brief Height of the content of the input (in pixel) */
174             int32 src_height;
175             /** @brief Width of the desired output (in pixel) */
176             int32 dst_width;
177             /** @brief Height of the desired output (in pixel) */
178             int32 dst_height;
179         } DisplayProperties ;
180         DisplayProperties _mDisp;
181 
182         uint32 _mSrc_width, _mSrc_height, _mSrc_mheight, _mSrc_pitch, _mDst_width, _mDst_height, _mDst_pitch, _mRotation;
183         uint8 *_mRowPix, *_mColPix;
184 
185         bool _mInitialized; // initialized yet?
186         bool _mIsZoom;  //Is zoomable?
187         int32 _mState;  //Zoom? Rotation? etc
188         bool _mIsFlip;
189         bool _mYuvRange;
190 
191     private:
192         /**
193         *   @brief This function calculates the number of repetitions for each input pixel to output
194         *   pixel such that the total output size is as specified. Users have to call this function
195         *   twice, one for horizontal scaling and one for vertical scaling.
196         *   @param  pLinePix is a pointer to an array of number of repetition (zero-order interpolation).
197         *   @param  iSrcLen is the input size.
198         *   @param  iDstLen is the output size.
199         */
200         void StretchLine(uint8 *pLinePix, int32 iSrcLen, int32 iDstLen);
201 
202 };
203 #endif // CCZOOMROTATIONBASE_H_INCLUDED
204 
205