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/*********************************************************************************/
19/*  File: cvei.h                                                                */
20/*  Purpose:                                                                    */
21/*  Date:                                                                       */
22/*  Revision History:                                                           */
23/** @introduction   Common Video Encoder Interface (CVEI) is intended to be used by
24    application developers who want to create a multimedia application with video
25    encoding feature. CVEI is designed such that new video encoder algorithms or
26    modules can be plugged in seamlessly without user interaction. In other words,
27    any changes to the CVEI library are transparent to the users. Users can still
28    use the same set of APIs for new encoding tools.
29
30    @requirement    CVEI will take an input frame in one of several format supported
31    by PV and encode it to an MPEG4 bitstream. It will also return a reconstructed
32    image in YUV 4:2:0 format. Currently the input format supported are YUV 4:2:0,
33    RGB24 and UYVY 4:2:2.
34
35    CVEI is designed such that it is simple to use. It should hides implementation
36    dependency  from the users. In this version, we decided that the operation will
37    be synchronous, i.e., the encoding will be a blocked call. Asynchronous operation
38    will be in the level above CVEI, i.e., in Author Engine Video Module which will
39    take care of capturing device as well.
40
41    @brief  The following classes are used to interface with codecs. Their names
42    are CPVxxxVideoEncoder where xxx is codec specific such as MPEG4, H263, H26L,
43    etc. All of them are subclasses of CPVCommonVideoEncoder.
44*/
45/*********************************************************************************/
46
47#ifndef __CVEI_H
48#define __CVEI_H
49
50#include "oscl_scheduler_ao.h"
51#include "oscl_base.h"
52#include "mp4enc_api.h" /* for MP4HintTrack */
53
54#define MAX_LAYER 2
55
56/** General returned values. */
57enum TCVEI_RETVAL
58{
59    ECVEI_SUCCESS,
60    ECVEI_FAIL,
61    ECVEI_FLUSH,
62    ECVEI_MORE_OUTPUT
63} ;
64
65/** Returned events with the callback function. */
66enum TCVEI_EVENT
67{
68    /** Called when a packet or a frame of output bitstream is ready. */
69    ECVEI_BUFFER_READY,
70
71    /** Called when the last packet of a frame of output bitstream is ready. */
72    ECVEI_FRAME_DONE,
73
74    /** Called when no buffers is available for output bitstream. A buffer can be added thru AddBuffer API. */
75    ECVEI_NO_BUFFERS,
76
77    /** Called when there is an error with the encoding operation. */
78    ECVEI_ERROR
79};
80
81/** Contains supported input format */
82enum TPVVideoFormat
83{
84    ECVEI_RGB24,
85    ECVEI_RGB12,
86    ECVEI_YUV420,
87    ECVEI_UYVY,
88    ECVEI_YUV420SEMIPLANAR
89};
90
91/** Type of contents for optimal encoding mode. */
92enum TPVContentType
93{
94    /** Content is to be streamed in real-time. */
95    ECVEI_STREAMING,
96
97    /** Content is to be downloaded and playbacked later.*/
98    ECVEI_DOWNLOAD,
99
100    /** Content is to be 3gpp baseline compliant. */
101    ECVEI_H263
102};
103
104/** Rate control type. */
105enum TMP4RateControlType
106{
107    /** Constant quality, variable bit rate, fixed quantization level. */
108    ECONSTANT_Q,
109
110    /** Short-term constant bit rate control. */
111    ECBR_1,
112
113    /** Long-term constant bit rate control. */
114    EVBR_1
115};
116
117/** Targeted profile and level to encode. */
118enum TPVM4VProfileLevel
119{
120    /* Non-scalable profile */
121    ECVEI_SIMPLE_LEVEL0 = 0,
122    ECVEI_SIMPLE_LEVEL1,
123    ECVEI_SIMPLE_LEVEL2,
124    ECVEI_SIMPLE_LEVEL3,
125    ECVEI_CORE_LEVEL1,
126    ECVEI_CORE_LEVEL2,
127
128    /* Scalable profile */
129    ECVEI_SIMPLE_SCALABLE_LEVEL0 = 6,
130    ECVEI_SIMPLE_SCALABLE_LEVEL1,
131    ECVEI_SIMPLE_SCALABLE_LEVEL2,
132
133    ECVEI_CORE_SCALABLE_LEVEL1 = 10,
134    ECVEI_CORE_SCALABLE_LEVEL2,
135    ECVEI_CORE_SCALABLE_LEVEL3
136};
137
138/** This structure contains encoder settings. */
139struct TPVVideoEncodeParam
140{
141    /** Specifies an  ID that will be used to specify this encoder while returning
142    the bitstream in asynchronous mode. */
143    uint32              iEncodeID;
144
145    /** Specifies whether base only (iNumLayer = 1) or base + enhancement layer
146    (iNumLayer =2 ) is to be used. */
147    int32               iNumLayer;
148
149    /** Specifies the width in pixels of the encoded frames. IFrameWidth[0] is for
150    base layer and iFrameWidth[1] is for enhanced layer. */
151    int                 iFrameWidth[MAX_LAYER];
152
153    /** Specifies the height in pixels of the encoded frames. IFrameHeight[0] is for
154    base layer and iFrameHeight[1] is for enhanced layer. */
155    int                 iFrameHeight[MAX_LAYER];
156
157    /** Specifies the cumulative bit rate in bit per second. IBitRate[0] is for base
158    layer and iBitRate[1] is for base+enhanced layer.*/
159    int                 iBitRate[MAX_LAYER];
160
161    /** Specifies the cumulative frame rate in frame per second. IFrameRate[0] is for
162    base layer and iFrameRate[1] is for base+enhanced layer. */
163    float               iFrameRate[MAX_LAYER];
164
165    /** Specifies the picture quality factor on the scale of 1 to 10. It trades off
166    the picture quality with the frame rate. Higher frame quality means lower frame rate.
167    Lower frame quality for higher frame rate.*/
168    int32               iFrameQuality;
169
170    /** Enable the use of iFrameQuality to determine the frame rate. If it is false,
171    the encoder will try to meet the specified frame rate regardless of the frame quality.*/
172    bool                iEnableFrameQuality;
173
174    /** Specifies the maximum number of P-frames between 2 INTRA frames. An INTRA mode is
175    forced to a frame once this interval is reached. When there is only one I-frame is present
176    at the beginning of the clip, iIFrameInterval should be set to -1. */
177    int32               iIFrameInterval;
178
179    /** According to iIFrameInterval setting, the minimum number of intra MB per frame is
180    optimally calculated for error resiliency. However, when iIFrameInterval is set to -1,
181    iNumIntraMBRefresh must be specified to guarantee the minimum number of intra
182    macroblocks per frame.*/
183    uint32              iNumIntraMBRefresh;
184
185    /** Specifies the VBV buffer size which determines the end-to-end delay between the
186    encoder and the decoder.  The size is in unit of seconds. For download application,
187    the buffer size can be larger than the streaming application. For 2-way application,
188    this buffer shall be kept minimal. For a special case, in VBR mode, iBufferDelay will
189    be set to -1 to allow buffer underflow. */
190    float               iBufferDelay;
191
192    /** Specifies the type of the access whether it is streaming, CVEI_STREAMING
193    (data partitioning mode) or download, CVEI_DOWNLOAD (combined mode).*/
194    TPVContentType      iContentType;
195
196    /** Specifies the rate control algorithm among one of the following constant Q,
197    CBR and VBR.  The structure TMP4RateControlType is defined below.*/
198    TMP4RateControlType iRateControlType;
199
200    /** Specifies high quality but also high complexity mode for rate control. */
201    bool                iRDOptimal;
202
203    /** Specifies the initial quantization parameter for the first I-frame. If constant Q
204    rate control is used, this QP will be used for all the I-frames. This number must be
205    set between 1 and 31, otherwise, Initialize() will fail. */
206    int                 iIquant[2];
207
208    /** Specifies the initial quantization parameter for the first P-frame. If constant Q
209    rate control is used, this QP will be used for all the P-frames. This number must be
210    set between 1 and 31, otherwise, Initialize() will fail. */
211    int                 iPquant[2];
212
213    /** Specifies the initial quantization parameter for the first B-frame. If constant Q
214    rate control is used, this QP will be used for all the B-frames. This number must be
215    set between 1 and 31, otherwise, Initialize() will fail. */
216    int                 iBquant[2];
217
218    /** Specifies the search range in pixel unit for motion vector. The range of the
219    motion vector will be of dimension [-iSearchRange.5, +iSearchRange.0]. */
220    int32               iSearchRange;
221
222    /** Specifies the use of 8x8 motion vectors. */
223    bool                iMV8x8;
224
225    /** Specifies the use of half-pel motion vectors. */
226    bool                iMVHalfPel;
227
228    /** Specifies automatic scene detection where I-frame will be used the the first frame
229    in a new scene. */
230    bool                iSceneDetection;
231
232    /** Specifies the packet size in bytes which represents the number of bytes between two resync markers.
233    For ECVEI_DOWNLOAD and ECVEI_H263, if iPacketSize is set to 0, there will be no resync markers in the bitstream.
234    For ECVEI_STREAMING is parameter must be set to a value greater than 0.*/
235    uint32              iPacketSize;
236
237    /** Specifies whether the current frame skipping decision is allowed after encoding
238    the current frame. If there is no memory of what has been coded for the current frame,
239    iNoCurrentSkip has to be on. */
240    bool                iNoCurrentSkip;
241
242    /** Specifies that no frame skipping is allowed. Frame skipping is a tool used to
243    control the average number of bits spent to meet the target bit rate. */
244    bool                iNoFrameSkip;
245
246    /** Specifies the duration of the clip in millisecond.*/
247    int32               iClipDuration;
248
249    /** Specifies the profile and level used to encode the bitstream. When present,
250    other settings will be checked against the range allowable by this target profile
251    and level. Fail may be returned from the Initialize call. */
252    TPVM4VProfileLevel  iProfileLevel;
253
254    /** Specifies FSI Buffer input */
255    uint8*              iFSIBuff;
256
257    /** Specifies FSI Buffer Length */
258    int             iFSIBuffLength;
259
260
261};
262
263
264/** Structure for input format information */
265struct TPVVideoInputFormat
266{
267    /** Contains the width in pixels of the input frame. */
268    int32           iFrameWidth;
269
270    /** Contains the height in pixels of the input frame. */
271    int32           iFrameHeight;
272
273    /** Contains the input frame rate in the unit of frame per second. */
274    float           iFrameRate;
275
276    /** Contains Frame Orientation. Used for RGB input. 1 means Bottom_UP RGB, 0 means Top_Down RGB, -1 for video formats other than RGB*/
277    int             iFrameOrientation;
278
279    /** Contains the format of the input video, e.g., YUV 4:2:0, UYVY, RGB24, etc. */
280    TPVVideoFormat  iVideoFormat;
281};
282
283
284/** Contains the input data information */
285struct TPVVideoInputData
286{
287    /** Pointer to an input frame buffer in input source format.*/
288    uint8       *iSource;
289
290    /** The corresponding time stamp of the input frame. */
291    uint32      iTimeStamp;
292};
293
294/** Contains the output data information */
295struct TPVVideoOutputData
296{
297    /** Pointer to the reconstructed frame buffer in YUV 4:2:0 domain. */
298    uint8           *iFrame;
299
300    /** The number of layer encoded, 0 for base, 1 for enhanced. */
301    int32           iLayerNumber;
302
303    /** Pointer to the encoded bitstream buffer. */
304    uint8           *iBitStream;
305
306    /** The size in bytes of iBStream. */
307    int32           iBitStreamSize;
308
309    /** The time stamp of the encoded frame according to the bitstream. */
310    uint32          iVideoTimeStamp;
311
312    /** The time stamp of the encoded frame as given before the encoding. */
313    uint32          iExternalTimeStamp;
314
315    /** The hint track information. */
316    MP4HintTrack    iHintTrack;
317};
318
319/** An observer class for callbacks to report the status of the CVEI */
320class MPVCVEIObserver
321{
322    public:
323        /** The callback funtion with aEvent being one of TCVEIEvent enumeration. */
324        virtual void HandlePVCVEIEvent
325        (uint32 aId, uint32 aEvent, uint32 aParam1 = 0) = 0;
326        virtual ~MPVCVEIObserver() {}
327};
328
329/** This class is the base class for codec specific interface class.
330The users must maintain an instance of the codec specific class throughout
331the encoding session.
332*/
333class CommonVideoEncoder : public OsclTimerObject
334{
335    public:
336        /** Constructor for CVEI class. */
337        CommonVideoEncoder() : OsclTimerObject(OsclActiveObject::EPriorityNominal, "PVEncoder") {};
338
339        /** Initialization function to set the input video format and the
340        encoding parameters. This function returns CVEI_ERROR if there is
341        any errors. Otherwise, the function returns CVEI_SUCCESS.*/
342        virtual  TCVEI_RETVAL Initialize(TPVVideoInputFormat *aVidInFormat, TPVVideoEncodeParam *aEncParam) = 0;
343
344        /** Set the observer for asynchronous encoding mode. */
345        virtual  TCVEI_RETVAL SetObserver(MPVCVEIObserver *aObserver) = 0;
346
347        /** Add a buffer to the queue of output buffers for output bitstream in
348        asynchronous encoding mode. */
349        virtual  TCVEI_RETVAL AddBuffer(TPVVideoOutputData *aVidOut) = 0;
350
351        /** This function sends in an input video data structure containing a source
352        frame and the associated timestamp. The encoded bitstream will be returned by
353        observer callback.
354        The above 3 APIs only replace EncodeFrame() API. Other APIs such as initialization
355        and update parameters remain the same. */
356        virtual  TCVEI_RETVAL Encode(TPVVideoInputData *aVidIn) = 0;
357
358        /** This function returns the maximum VBV buffer size such that the
359            application can allocate a buffer that guarantees to fit one frame.*/
360        virtual  int32 GetBufferSize() = 0;
361
362        /** This function returns the VOL header part (starting from the VOS header)
363        of the encoded bitstream. This function must be called after Initialize.
364        The output is written to the memory (volHeader) allocated by the users.*/
365        virtual  TCVEI_RETVAL GetVolHeader(uint8 *volHeader, int32 *size, int32 layer) = 0;
366
367        /** This function sends in an input video data structure containing a source
368        frame and the associated timestamp. It returns an output video data structure
369        containing coded bit stream, reconstructed frame in YUV 4:2:0 (can be changed
370        to source format) and the timestamp associated with the coded frame.
371        The input timestamp may not correspond to the output timestamp. User can send
372        an input structure in without getting any encoded data back or getting an encoded
373        frame in the past. This function returns ECVEI_ERROR if there is any errors.
374        Otherwise, the function returns ECVEI_SUCCESS.
375        In case of Overrun Buffer usage, it is possible that return value is ECVEI_MORE_OUTPUT
376        which indicates that frame cannot fit in the current buffer*/
377        virtual  TCVEI_RETVAL EncodeFrame(TPVVideoInputData  *aVidIn, TPVVideoOutputData *aVidOut, int *aRemainingBytes
378#ifdef PVAUTHOR_PROFILING
379                                          , void *aParam1 = 0
380#endif
381                                         ) = 0;
382
383        /** Before the termination of the encoding process, the users have to query
384        whether there are any encoded frame pending inside the CVEI. The returned value
385        will indicate whether there are more frames to be flushed (ECVEI_FLUSH).
386        FlushOutput has to be called until there are no more frames, i.e., it returns
387        ECVEI_SUCCESS. This function may be called during the encoding operation if
388        there is no input frame and the application does not want to waste the time
389        waiting for input frame. It can call this function to flush encoded frame
390        out of the memory. */
391        virtual  TCVEI_RETVAL FlushOutput(TPVVideoOutputData *aVidOut) = 0;
392
393        /** This function cleanup the CVEI allocated resources. */
394        virtual  TCVEI_RETVAL Terminate() = 0;
395
396        /**This function dynamically changes the target bit rate of the encoder
397        while encoding. aBitRate[n] is the new accumulate target bit rate of layer n.
398        Successful update is returned with ECVEI_SUCCESS.*/
399        virtual  TCVEI_RETVAL UpdateBitRate(int32 aNumLayer, int32 *aBitRate) = 0;
400
401        /** This function dynamically changes the target frame rate of the encoder
402        while encoding. aFrameRate[n] is the new accumulate target frame rate of
403        layer n. Successful update is returned with ECVEI_SUCCESS. */
404        virtual  TCVEI_RETVAL UpdateFrameRate(int32 aNumLayer, float *aFrameRate) = 0;
405
406        /** This function dynamically changes the I-Vop update interval while
407        encoding to a new value, aIFrameInterval. */
408        virtual  TCVEI_RETVAL UpdateIFrameInterval(int32 aIFrameInterval) = 0;
409
410        /** This function forces an I-Vop mode to the next frame to be encoded. */
411        virtual  TCVEI_RETVAL IFrameRequest() = 0;
412
413        /** This function returns the input width of a specific layer
414        (not necessarily multiple of 16). */
415        virtual  int32 GetEncodeWidth(int32 aLayer) = 0;
416
417        /** This function returns the input height of a specific layer
418        (not necessarily multiple of 16). */
419        virtual  int32 GetEncodeHeight(int32 aLayer) = 0;
420
421        /** This function returns the target encoded frame rate of a specific layer. */
422        virtual  float GetEncodeFrameRate(int32 aLayer) = 0;
423    protected:
424        virtual void Run(void) = 0;
425        virtual void DoCancel(void) = 0;
426        /* internal enum */
427        enum TCVEIState
428        {
429            EIdle,
430            EEncode
431        };
432
433        TCVEIState  iState;
434        uint32      iId;
435};
436
437#endif
438