libmix: code cleanup along with new API to support one Queue buffer management
BZ: 24552
code cleanup along with new API to support one Queue buffer management (from Andy)
Change-Id: I1424915b52da05e38a72f2c04adc88cdc988f14d
Reviewed-on: http://android.intel.com:8080/36031
Reviewed-by: Chen, Weian <weian.chen@intel.com>
Reviewed-by: Qiu, Junhai <junhai.qiu@intel.com>
Reviewed-by: Ding, Haitao <haitao.ding@intel.com>
Tested-by: Ding, Haitao <haitao.ding@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
diff --git a/videodecoder/VideoDecoderBase.cpp b/videodecoder/VideoDecoderBase.cpp
index 341a092..bb7dce4 100644
--- a/videodecoder/VideoDecoderBase.cpp
+++ b/videodecoder/VideoDecoderBase.cpp
@@ -73,12 +73,12 @@
mNextOutputPOC(MINIMUM_POC),
mParserType(type),
mParserHandle(NULL),
- initialized(false),
- mSignalBufferSize(0){
+ mInitialized(false),
+ mSignalBufferSize(0) {
memset(&mVideoFormatInfo, 0, sizeof(VideoFormatInfo));
memset(&mConfigBuffer, 0, sizeof(mConfigBuffer));
- for(int i =0 ; i < MAX_GRAPHIC_NUM ; i++) {
+ for (int i =0; i < MAX_GRAPHIC_NUM; i++) {
mSignalBufferPre[i] = NULL;
}
pthread_mutex_init(&mLock, NULL);
@@ -199,8 +199,8 @@
if (mOutputHead == NULL) {
mOutputTail = NULL;
}
- if(useGraphicBuffer ) {
- vaSyncSurface(mVADisplay,outputByPos->renderBuffer.surface);
+ if (useGraphicBuffer ) {
+ vaSyncSurface(mVADisplay, outputByPos->renderBuffer.surface);
}
return &(outputByPos->renderBuffer);
}
@@ -246,8 +246,8 @@
mOutputTail = NULL;
}
}
- if(useGraphicBuffer ) {
- vaSyncSurface(mVADisplay,output->renderBuffer.surface);
+ if (useGraphicBuffer ) {
+ vaSyncSurface(mVADisplay, output->renderBuffer.surface);
}
//VTRACE("Output POC %d for display (pts = %.2f)", output->pictureOrder, output->renderBuffer.timeStamp/1E6);
return &(output->renderBuffer);
@@ -439,6 +439,30 @@
}
#endif
+bool VideoDecoderBase::checkBufferAvail(void) {
+ if (!mInitialized) {
+ if ((mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER) == 0) {
+ return true;
+ }
+ for (int i = 0; i < MAX_GRAPHIC_NUM; i++) {
+ if (mSignalBufferPre[i] != NULL) {
+ return true;
+ }
+ }
+ return false;
+ }
+ // check whether there is buffer available for decoding
+ // TODO: check frame being referenced for frame skipping
+ VideoSurfaceBuffer *buffer = NULL;
+ for (int32_t i = 0; i < mNumSurfaces; i++) {
+ buffer = mSurfaceBuffers + i;
+ if (buffer->asReferernce == false && buffer->renderBuffer.renderDone == true) {
+ return true;
+ }
+ }
+ return false;
+}
+
Decode_Status VideoDecoderBase::acquireSurfaceBuffer(void) {
if (mVAStarted == false) {
return DECODE_FAIL;
@@ -500,7 +524,7 @@
mAcquiredBuffer->renderBuffer.timeStamp = INVALID_PTS;
mAcquiredBuffer->renderBuffer.display = mVADisplay;
mAcquiredBuffer->renderBuffer.flag = 0;
- mAcquiredBuffer->renderBuffer.renderDone = true;
+ mAcquiredBuffer->renderBuffer.renderDone = false;
mAcquiredBuffer->asReferernce = false;
return DECODE_SUCCESS;
@@ -632,7 +656,7 @@
return DECODE_SUCCESS;
}
- if(mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER){
+ if (mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER){
numSurface = mConfigBuffer.surfaceNumber;
}
// TODO: validate profile
@@ -642,7 +666,7 @@
if (mConfigBuffer.flag & HAS_MINIMUM_SURFACE_NUMBER) {
if (numSurface < mConfigBuffer.surfaceNumber) {
- LOGW("surface to allocated %d is less than minimum number required %d",
+ WTRACE("surface to allocated %d is less than minimum number required %d",
numSurface, mConfigBuffer.surfaceNumber);
numSurface = mConfigBuffer.surfaceNumber;
}
@@ -692,9 +716,9 @@
int32_t format = VA_RT_FORMAT_YUV420;
if (mConfigBuffer.flag & WANT_SURFACE_PROTECTION) {
format |= VA_RT_FORMAT_PROTECTED;
- LOGW("Surface is protected.");
+ WTRACE("Surface is protected.");
}
- if(mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER) {
+ if (mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER) {
mVASurfaceAttrib = new VASurfaceAttrib;
if (mVASurfaceAttrib == NULL) {
return DECODE_MEMORY_FAIL;
@@ -708,19 +732,19 @@
return DECODE_MEMORY_FAIL;
}
mVAExternalMemoryBuffers->count = mNumSurfaces;
- mVAExternalMemoryBuffers->luma_stride= mConfigBuffer.graphicBufferStride;
+ mVAExternalMemoryBuffers->luma_stride = mConfigBuffer.graphicBufferStride;
mVAExternalMemoryBuffers->pixel_format = mConfigBuffer.graphicBufferColorFormat;
mVAExternalMemoryBuffers->native_window = mConfigBuffer.nativeWindow;
mVAExternalMemoryBuffers->width = mVideoFormatInfo.width;
mVAExternalMemoryBuffers->height = mVideoFormatInfo.height;
mVAExternalMemoryBuffers->type = VAExternalMemoryAndroidGrallocBuffer;
- for(int i=0; i < mNumSurfaces; i++) {
+ for (int i = 0; i < mNumSurfaces; i++) {
mVAExternalMemoryBuffers->buffers[i] = (unsigned int )mConfigBuffer.graphicBufferHandler[i];
}
mVASurfaceAttrib->flags = VA_SURFACE_ATTRIB_SETTABLE;
mVASurfaceAttrib->type = VASurfaceAttribNativeHandle;
- mVASurfaceAttrib->value.type =VAGenericValueTypePointer;
- mVASurfaceAttrib->value.value.p_val= (void *)mVAExternalMemoryBuffers;
+ mVASurfaceAttrib->value.type = VAGenericValueTypePointer;
+ mVASurfaceAttrib->value.value.p_val = (void *)mVAExternalMemoryBuffers;
vaStatus = vaCreateSurfaces(
mVADisplay,
mVideoFormatInfo.width,
@@ -797,16 +821,16 @@
}
- if(mVAExternalMemoryBuffers) {
- if(mVAExternalMemoryBuffers->buffers) {
+ if (mVAExternalMemoryBuffers) {
+ if (mVAExternalMemoryBuffers->buffers) {
free(mVAExternalMemoryBuffers->buffers);
- mVAExternalMemoryBuffers->buffers= NULL;
+ mVAExternalMemoryBuffers->buffers = NULL;
}
delete mVAExternalMemoryBuffers;
- mVAExternalMemoryBuffers = NULL;
+ mVAExternalMemoryBuffers = NULL;
}
- if(mVASurfaceAttrib) {
+ if (mVASurfaceAttrib) {
delete mVASurfaceAttrib;
mVASurfaceAttrib = NULL;
}
@@ -845,6 +869,7 @@
}
mVAStarted = false;
+ mInitialized = false;
return DECODE_SUCCESS;
}
@@ -1022,9 +1047,9 @@
void VideoDecoderBase::initSurfaceBuffer(bool reset) {
bool useGraphicBuffer = mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER;
- if(useGraphicBuffer && reset){
+ if (useGraphicBuffer && reset) {
pthread_mutex_lock(&mLock);
- }
+ }
for (int32_t i = 0; i < mNumSurfaces; i++) {
mSurfaceBuffers[i].renderBuffer.display = mVADisplay;
mSurfaceBuffers[i].renderBuffer.surface = VA_INVALID_SURFACE; // set in acquireSurfaceBuffer
@@ -1040,13 +1065,13 @@
mSurfaceBuffers[i].mappedData = NULL;
}
if (useGraphicBuffer){
- if(reset){
+ if (reset) {
mSurfaceBuffers[i].renderBuffer.graphicBufferHandle = mConfigBuffer.graphicBufferHandler[i];
mSurfaceBuffers[i].renderBuffer.renderDone = false; //default false
- for(int j =0; j < mSignalBufferSize; j++){
- if(mSignalBufferPre[j] != NULL && mSignalBufferPre[j] == mSurfaceBuffers[i].renderBuffer.graphicBufferHandle){
+ for (int j = 0; j < mSignalBufferSize; j++) {
+ if(mSignalBufferPre[j] != NULL && mSignalBufferPre[j] == mSurfaceBuffers[i].renderBuffer.graphicBufferHandle) {
mSurfaceBuffers[i].renderBuffer.renderDone = true;
- VTRACE("initSurfaceBuffer set renderDone = true index=%d",i);
+ VTRACE("initSurfaceBuffer set renderDone = true index = %d", i);
mSignalBufferPre[j] = NULL;
break;
}
@@ -1057,40 +1082,38 @@
}
} else {
- mSurfaceBuffers[i].renderBuffer.graphicBufferHandle= NULL;
+ mSurfaceBuffers[i].renderBuffer.graphicBufferHandle = NULL;
mSurfaceBuffers[i].renderBuffer.renderDone = true;
}
mSurfaceBuffers[i].renderBuffer.acquirePos = i;
}
- if(useGraphicBuffer && reset){
- initialized = true;
+ if (useGraphicBuffer && reset) {
+ mInitialized = true;
mSignalBufferSize = 0;
pthread_mutex_unlock(&mLock);
}
}
-Decode_Status VideoDecoderBase::SignalRenderDoneFlag(void * graphichandler) {
-
+Decode_Status VideoDecoderBase::signalRenderDone(void * graphichandler) {
if (graphichandler == NULL) {
return DECODE_SUCCESS;
}
pthread_mutex_lock(&mLock);
int i = 0;
- if(!initialized){
- mSignalBufferPre[mSignalBufferSize++] = graphichandler;
- VTRACE("SignalRenderDoneFlag initialized = false graphichandler = %p, mSignalBufferSize=%d",graphichandler,mSignalBufferSize);
- if(mSignalBufferSize > MAX_GRAPHIC_NUM)
- return DECODE_INVALID_DATA;
- }
- else{
+ if (!mInitialized) {
+ mSignalBufferPre[mSignalBufferSize++] = graphichandler;
+ VTRACE("SignalRenderDoneFlag mInitialized = false graphichandler = %p, mSignalBufferSize = %d", graphichandler, mSignalBufferSize);
+ if (mSignalBufferSize > MAX_GRAPHIC_NUM)
+ return DECODE_INVALID_DATA;
+ } else {
if (!(mConfigBuffer.flag & USE_NATIVE_GRAPHIC_BUFFER)) {
return DECODE_SUCCESS;
}
for (i = 0; i < mNumSurfaces; i++) {
- if (mSurfaceBuffers[i].renderBuffer.graphicBufferHandle== graphichandler) {
- mSurfaceBuffers[i].renderBuffer.renderDone = true;
- VTRACE("SignalRenderDoneFlag initialized = true index =%d",i);
+ if (mSurfaceBuffers[i].renderBuffer.graphicBufferHandle == graphichandler) {
+ mSurfaceBuffers[i].renderBuffer.renderDone = true;
+ VTRACE("SignalRenderDoneFlag mInitialized = true index = %d", i);
break;
}
}
@@ -1101,31 +1124,4 @@
}
-Decode_Status VideoDecoderBase::GetNativeBufferStatus(void * graphichandler, bool* used) {
- bool inuse = false;
- if(!initialized) {
- *used == false;
- return DECODE_NOT_STARTED;
- }
- for (int32_t i = 0; i < mNumSurfaces; i++) {
- if (mSurfaceBuffers[i].renderBuffer.graphicBufferHandle == graphichandler) {
- if (mSurfaceBuffers[i].asReferernce == true ||mSurfaceBuffers + i == mAcquiredBuffer ) {
- inuse = true;
- }
- break;
- }
- }
- VideoSurfaceBuffer *p = mOutputHead;
-
- while (p!=NULL) {
- if(p ->renderBuffer.graphicBufferHandle == graphichandler) {
- inuse = true;
- break;
- }
- p = p->next;
- }
-
- *used = inuse;
- return DECODE_SUCCESS;
-}
diff --git a/videodecoder/VideoDecoderBase.h b/videodecoder/VideoDecoderBase.h
index 8cf4579..5e09a14 100644
--- a/videodecoder/VideoDecoderBase.h
+++ b/videodecoder/VideoDecoderBase.h
@@ -50,9 +50,9 @@
//virtual Decode_Status decode(VideoDecodeBuffer *buffer);
virtual void flush(void);
virtual const VideoRenderBuffer* getOutput(bool draining = false);
- virtual Decode_Status SignalRenderDoneFlag(void * graphichandler);
- virtual Decode_Status GetNativeBufferStatus(void * graphichandler, bool* used);
+ virtual Decode_Status signalRenderDone(void * graphichandler);
virtual const VideoFormatInfo* getFormatInfo(void);
+ virtual bool checkBufferAvail();
protected:
// each acquireSurfaceBuffer must be followed by a corresponding outputSurfaceBuffer or releaseSurfaceBuffer.
@@ -81,7 +81,7 @@
Decode_Status getRawDataFromSurface(void);
void initSurfaceBuffer(bool reset);
- bool initialized;
+ bool mInitialized;
pthread_mutex_t mLock;
diff --git a/videodecoder/VideoDecoderInterface.h b/videodecoder/VideoDecoderInterface.h
index 6b54deb..e3cf728 100644
--- a/videodecoder/VideoDecoderInterface.h
+++ b/videodecoder/VideoDecoderInterface.h
@@ -37,8 +37,8 @@
virtual Decode_Status decode(VideoDecodeBuffer *buffer) = 0;
virtual const VideoRenderBuffer* getOutput(bool draining = false) = 0;
virtual const VideoFormatInfo* getFormatInfo(void) = 0;
- virtual Decode_Status SignalRenderDoneFlag(void * graphichandler) = 0;
- virtual Decode_Status GetNativeBufferStatus(void * graphichandler, bool* used) = 0;
+ virtual Decode_Status signalRenderDone(void * graphichandler) = 0;
+ virtual bool checkBufferAvail() = 0;
};