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__ */