186 lines
6.4 KiB
C++
186 lines
6.4 KiB
C++
/*
|
|
* 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__ */
|