Initial libmix commit

Change-Id: I7a0b9afdc83a3274189cef0788c7296a871a3d98
Signed-off-by: Guilhem IMBERTON <guilhem.imberton@intel.com>
diff --git a/videoencoder/VideoEncoderBase.h b/videoencoder/VideoEncoderBase.h
new file mode 100644
index 0000000..bf1eecf
--- /dev/null
+++ b/videoencoder/VideoEncoderBase.h
@@ -0,0 +1,186 @@
+/*
+* Copyright (c) 2009-2011 Intel Corporation.  All rights reserved.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef __VIDEO_ENCODER_BASE_H__
+#define __VIDEO_ENCODER_BASE_H__
+
+#include <va/va.h>
+#include <va/va_tpi.h>
+#include "VideoEncoderDef.h"
+#include "VideoEncoderInterface.h"
+#include "IntelMetadataBuffer.h"
+#include <utils/List.h>
+#include <utils/threads.h>
+#include "VideoEncoderUtils.h"
+
+struct SurfaceMap {
+    VASurfaceID surface;
+    VASurfaceID surface_backup;
+    IntelMetadataBufferType type;
+    int32_t value;
+    ValueInfo vinfo;
+    bool added;
+};
+
+struct EncodeTask {
+    VASurfaceID enc_surface;
+    VASurfaceID ref_surface;
+    VASurfaceID rec_surface;
+    VABufferID coded_buffer;
+
+    FrameType type;
+    int flag;
+    int64_t timestamp;  //corresponding input frame timestamp
+    void *priv;  //input buffer data
+
+    bool completed;   //if encode task is done complet by HW
+};
+
+class VideoEncoderBase : IVideoEncoder {
+
+public:
+    VideoEncoderBase();
+    virtual ~VideoEncoderBase();
+
+    virtual Encode_Status start(void);
+    virtual void flush(void);
+    virtual Encode_Status stop(void);
+    virtual Encode_Status encode(VideoEncRawBuffer *inBuffer, uint32_t timeout);
+
+    /*
+    * getOutput can be called several time for a frame (such as first time  codec data, and second time others)
+    * encoder will provide encoded data according to the format (whole frame, codec_data, sigle NAL etc)
+    * If the buffer passed to encoded is not big enough, this API call will return ENCODE_BUFFER_TOO_SMALL
+    * and caller should provide a big enough buffer and call again
+    */
+    virtual Encode_Status getOutput(VideoEncOutputBuffer *outBuffer, uint32_t timeout);
+
+    virtual Encode_Status getParameters(VideoParamConfigSet *videoEncParams);
+    virtual Encode_Status setParameters(VideoParamConfigSet *videoEncParams);
+    virtual Encode_Status setConfig(VideoParamConfigSet *videoEncConfig);
+    virtual Encode_Status getConfig(VideoParamConfigSet *videoEncConfig);
+    virtual Encode_Status getMaxOutSize(uint32_t *maxSize);
+
+protected:
+    virtual Encode_Status sendEncodeCommand(EncodeTask* task) = 0;
+    virtual Encode_Status derivedSetParams(VideoParamConfigSet *videoEncParams) = 0;
+    virtual Encode_Status derivedGetParams(VideoParamConfigSet *videoEncParams) = 0;
+    virtual Encode_Status derivedGetConfig(VideoParamConfigSet *videoEncConfig) = 0;
+    virtual Encode_Status derivedSetConfig(VideoParamConfigSet *videoEncConfig) = 0;
+    virtual Encode_Status getExtFormatOutput(VideoEncOutputBuffer *outBuffer) = 0;
+    virtual Encode_Status updateFrameInfo(EncodeTask* task) ;
+
+    Encode_Status renderDynamicFrameRate();
+    Encode_Status renderDynamicBitrate(EncodeTask* task);
+    Encode_Status renderHrd();
+    Encode_Status queryProfileLevelConfig(VADisplay dpy, VAProfile profile);
+
+private:
+    void setDefaultParams(void);
+    Encode_Status setUpstreamBuffer(VideoParamsUpstreamBuffer *upStreamBuffer);
+    Encode_Status getNewUsrptrFromSurface(uint32_t width, uint32_t height, uint32_t format,
+            uint32_t expectedSize, uint32_t *outsize, uint32_t *stride, uint8_t **usrptr);
+    VASurfaceMap* findSurfaceMapByValue(intptr_t value);
+    Encode_Status manageSrcSurface(VideoEncRawBuffer *inBuffer, VASurfaceID *sid);
+    void PrepareFrameInfo(EncodeTask* task);
+
+    Encode_Status prepareForOutput(VideoEncOutputBuffer *outBuffer, bool *useLocalBuffer);
+    Encode_Status cleanupForOutput();
+    Encode_Status outputAllData(VideoEncOutputBuffer *outBuffer);
+    Encode_Status queryAutoReferenceConfig(VAProfile profile);
+    Encode_Status querySupportedSurfaceMemTypes();
+    Encode_Status copySurfaces(VASurfaceID srcId, VASurfaceID destId);
+    VASurfaceID CreateSurfaceFromExternalBuf(int32_t value, ValueInfo& vinfo);
+
+protected:
+
+    bool mInitialized;
+    bool mStarted;
+    VADisplay mVADisplay;
+    VAContextID mVAContext;
+    VAConfigID mVAConfig;
+    VAEntrypoint mVAEntrypoint;
+
+
+    VideoParamsCommon mComParams;
+    VideoParamsHRD mHrdParam;
+    VideoParamsStoreMetaDataInBuffers mStoreMetaDataInBuffers;
+
+    bool mNewHeader;
+
+    bool mRenderMaxSliceSize; //Max Slice Size
+    bool mRenderQP;
+    bool mRenderAIR;
+    bool mRenderCIR;
+    bool mRenderFrameRate;
+    bool mRenderBitRate;
+    bool mRenderHrd;
+    bool mRenderMaxFrameSize;
+    bool mRenderMultiTemporal;
+    bool mForceKFrame;
+
+    VABufferID mSeqParamBuf;
+    VABufferID mRcParamBuf;
+    VABufferID mFrameRateParamBuf;
+    VABufferID mPicParamBuf;
+    VABufferID mSliceParamBuf;
+    VASurfaceID* mAutoRefSurfaces;
+
+    android::List <VASurfaceMap *> mSrcSurfaceMapList;  //all mapped surface info list from input buffer
+    android::List <EncodeTask *> mEncodeTaskList;  //all encode tasks list
+    android::List <VABufferID> mVACodedBufferList;  //all available codedbuffer list
+
+    VASurfaceID mRefSurface;        //reference surface, only used in base
+    VASurfaceID mRecSurface;        //reconstructed surface, only used in base
+    uint32_t mFrameNum;
+    uint32_t mCodedBufSize;
+    bool mAutoReference;
+    uint32_t mAutoReferenceSurfaceNum;
+    uint32_t mEncPackedHeaders;
+    uint32_t mEncMaxRefFrames;
+
+    bool mSliceSizeOverflow;
+
+    //Current Outputting task
+    EncodeTask *mCurOutputTask;
+
+    //Current outputting CodedBuffer status
+    VABufferID mOutCodedBuffer;
+    bool mCodedBufferMapped;
+    uint8_t *mOutCodedBufferPtr;
+    VACodedBufferSegment *mCurSegment;
+    uint32_t mOffsetInSeg;
+    uint32_t mTotalSize;
+    uint32_t mTotalSizeCopied;
+    android::Mutex               mCodedBuffer_Lock, mEncodeTask_Lock;
+    android::Condition           mCodedBuffer_Cond, mEncodeTask_Cond;
+
+    bool mFrameSkipped;
+
+    //supported surface memory types
+    int mSupportedSurfaceMemType;
+
+    //VASurface mapping extra action
+    int mVASurfaceMappingAction;
+
+    // For Temporal Layer Bitrate FrameRate settings
+    VideoConfigTemperalLayerBitrateFramerate mTemporalLayerBitrateFramerate[3];
+
+#ifdef INTEL_VIDEO_XPROC_SHARING
+    uint32_t mSessionFlag;
+#endif
+};
+#endif /* __VIDEO_ENCODER_BASE_H__ */