mem: get_free_output_buffer()
authorHackseung Lee <lhs@dignsys.com>
Thu, 16 Nov 2017 00:59:26 +0000 (09:59 +0900)
committerHackseung Lee <lhs@dignsys.com>
Thu, 16 Nov 2017 00:59:36 +0000 (09:59 +0900)
항상 첫 번째 버퍼만 리턴하던 오류 보완.

Change-Id: Idc98964bad05a6d679f9788f0e87002d9564bfd4
Signed-off-by: Hackseung Lee <lhs@dignsys.com>
hello_video2_normal.cpp
hello_video2_tizen.cpp

index 9bf4ff7c08f64adf9f9a27f9505de80db796aec9..2a571287d5c3ab1ebf3d240d93bb21b5d0911319 100644 (file)
@@ -176,19 +176,24 @@ OMX_ERRORTYPE eventHandler(OMX_HANDLETYPE hComp, OMX_PTR pAppD,
                                                                OMX_EVENTTYPE event, OMX_U32 data1,
                                                                OMX_U32 data2, OMX_PTR eventData)
 {
+       fprintf(stderr, "%s[%d]\n", __func__, __LINE__);
        switch(event) {
        case OMX_EventCmdComplete:
                switch (data1) {
                case OMX_CommandStateSet:
+                       fprintf(stderr, "%s[%d]:OMX_CommandStateSet\n", __func__, __LINE__);
                        OMXWakeUp((OMX_STATETYPE) data2);
                        break;
                case OMX_CommandFlush:
+                       fprintf(stderr, "%s[%d]:OMX_CommandFlush\n", __func__, __LINE__);
                        break;
                case OMX_CommandPortDisable:
+                       fprintf(stderr, "%s[%d]:OMX_CommandPortDisable\n", __func__, __LINE__);
                        if (data2 == 130) phello_video2->input_port_def.bEnabled = OMX_FALSE;
                        if (data2 == 131) phello_video2->output_port_def.bEnabled = OMX_FALSE;
                        break;
                case OMX_CommandPortEnable:
+                       fprintf(stderr, "%s[%d]:OMX_CommandPortEnable\n", __func__, __LINE__);
                        if (data2 == 130) phello_video2->input_port_def.bEnabled = OMX_TRUE;
                        if (data2 == 131) phello_video2->output_port_def.bEnabled = OMX_TRUE;
                        break;
@@ -206,16 +211,23 @@ OMX_ERRORTYPE eventHandler(OMX_HANDLETYPE hComp, OMX_PTR pAppD,
                OMXWakeupPortSettingsChanged();
                break;
        case OMX_EventBufferFlag:
+               fprintf(stderr, "%s[%d]OMX_EventBufferFlag\n", __func__, __LINE__);
+               break;
        case OMX_EventResourcesAcquired:
+               fprintf(stderr, "%s[%d]OMX_EventResourcesAcquired\n", __func__, __LINE__);
+               break;
        case OMX_EventDynamicResourcesAvailable:
+               fprintf(stderr, "%s[%d]OMX_EventDynamicResourcesAvailable\n", __func__, __LINE__);
+               break;
        case OMX_EventMark:
+               fprintf(stderr, "%s[%d]OMX_EventDynamicResourcesAvailable\n", __func__, __LINE__);
                break;
        default:
                break;
        }
 
        return OMX_ErrorNone;
-};
+}
 
 /******************************************************************************/
 
@@ -232,8 +244,8 @@ OMX_ERRORTYPE bufferEmptied(OMX_HANDLETYPE hComp, OMX_PTR pAppD,
 
 OMX_ERRORTYPE bufferFilled(OMX_HANDLETYPE hComp, OMX_PTR pAppD, OMX_BUFFERHEADERTYPE *buffer)
 {
-       phello_video2->output_buffer_usage |= *((unsigned int *)buffer->pAppPrivate);
-//     fprintf(stderr, "******** callback:bufferFilled, buffer->nFilledLen=%d\n", buffer->nFilledLen);
+       fprintf(stderr, "phello_video2->output_buffer_usage:0x%08x,pAppPrivate:0x%08x,nFilledLenL:%d\n", phello_video2->output_buffer_usage, *((unsigned int *)buffer->pAppPrivate), buffer->nFilledLen);
+       OMXWakeUpFilled();
 
        OMXWakeUpFilled();
 
@@ -801,7 +813,8 @@ OMX_ERRORTYPE hello_video2::set_port_parameters()
        output_port_def.nBufferCountActual = 16;
        ErrorCode = OMX_SetParameter(component, OMX_IndexParamPortDefinition, &output_port_def);
        if (ErrorCode != OMX_ErrorNone) {
-               fprintf(stderr, "%s[%d]%s\n", __func__, __LINE__, OMX_strerror(ErrorCode));
+               fprintf(stderr, "Err: %s[%d]%s\n", __func__, __LINE__, OMX_strerror(ErrorCode));
+               exit(0);
        }
 
        return ErrorCode;
@@ -838,24 +851,26 @@ OMX_ERRORTYPE hello_video2::prepare_output_buffers(unsigned int num)
 {
        ErrorCode = OMX_ErrorNone;
        unsigned int *pPrivateData;
+       OMX_U8 *buf;
 
+       buf = NULL;
        for (unsigned int i = 0; i < num; i++) {
                pPrivateData = &output_buffer_number[i];
                *pPrivateData = (1 << i);
                output_buffer_usage |= *pPrivateData;
+
 #if 0 // Use OMX_AllocateBuffer()
                ErrorCode = OMX_AllocateBuffer(component, &output_buffer_header[i], output_port_def.nPortIndex, pPrivateData, output_port_def.nBufferSize);
 #else // Use OMX_UseBuffer()
-               OMX_U8 *tmp;
-               tmp = (OMX_U8*)malloc(output_port_def.nBufferSize);
-               if (tmp == NULL) {
+               buf = (OMX_U8*)malloc(output_port_def.nBufferSize);
+               if (buf == NULL) {
                        fprintf(stderr, "Failed to alloc output buffer %u. %s\n", i, OMX_strerror(ErrorCode));
                        exit(0);
                }
-               ErrorCode = OMX_UseBuffer(component, &output_buffer_header[i], output_port_def.nPortIndex, pPrivateData, output_port_def.nBufferSize, tmp);
+               ErrorCode = OMX_UseBuffer(component, &output_buffer_header[i], output_port_def.nPortIndex, pPrivateData, output_port_def.nBufferSize, buf);
 #endif
                if (ErrorCode == OMX_ErrorNone) {
-                       fprintf(stderr, "Okay:prepare_output_buffers:Output buffer %u allocated,%d.\n", i + 1, output_port_def.nBufferSize);
+                       fprintf(stderr, "Okay:prepare_output_buffers: Port %d: Output buffer %d: allocated %d:buff %p:output_buffer_usage 0x%x\n", output_port_def.nPortIndex, i + 1, output_port_def.nBufferSize, buf, output_buffer_usage);
                }
                else {
                        fprintf(stderr, "Err:prepare_output_buffers:%d. %s\n", i, OMX_strerror(ErrorCode));                     
@@ -885,13 +900,24 @@ OMX_BUFFERHEADERTYPE * hello_video2::get_free_input_buffer()
 
 OMX_BUFFERHEADERTYPE * hello_video2::get_free_output_buffer()
 {
-       while (true) {
+       if (output_buffer_usage == 0) {
+               for (unsigned int i = 0; i < output_port_def.nBufferCountActual; i++) {
+                       output_buffer_usage |= 0x1 < i;
+               }               
+       }
+
+       while (true)
+       {
                for (unsigned int i = 0; i < output_port_def.nBufferCountActual; i++) {
                        if ((output_buffer_usage & *((unsigned int *)output_buffer_header[i]->pAppPrivate)) != 0) {
+                               output_buffer_usage &= ~(*((unsigned int *)output_buffer_header[i]->pAppPrivate));
+                               fprintf(stderr, "get_free_output_buffer:0x%08x\n", output_buffer_usage);
                                return output_buffer_header[i];
                        }
                }
+               fprintf(stderr, "OMXWaitForFilled wait..\n");
                OMXWaitForFilled();
+               fprintf(stderr, "OMXWaitForFilled done!.\n");
        }
 
        return NULL;
index 2a541c94e190cc3c819931f9ef05196e706c383c..e85be7a7a4d62b3135eed7f6ca984cacf39cf87b 100644 (file)
@@ -234,10 +234,10 @@ OMX_ERRORTYPE bufferEmptied(OMX_HANDLETYPE hComp, OMX_PTR pAppD,
 
 OMX_ERRORTYPE bufferFilled(OMX_HANDLETYPE hComp, OMX_PTR pAppD, OMX_BUFFERHEADERTYPE *buffer)
 {
-       phello_video2->output_buffer_usage |= *((unsigned int *)buffer->pAppPrivate);
-
+       fprintf(stderr, "phello_video2->output_buffer_usage:0x%08x,pAppPrivate:0x%08x,nFilledLenL:%d\n", phello_video2->output_buffer_usage, *((unsigned int *)buffer->pAppPrivate), buffer->nFilledLen);
        OMXWakeUpFilled();
-
+       
+       fprintf(stderr, "buffer filled done:%p\n", buffer->pBuffer);
        if (buffer->nFilledLen == 0) {
                phello_video2->fill_buffer();
 
@@ -725,6 +725,7 @@ OMX_ERRORTYPE hello_video2::fill_buffer()
        OMX_BUFFERHEADERTYPE *out_buffer;
 
        out_buffer = get_free_output_buffer();
+       fprintf(stderr, "OMX_FillThisBuffer:%p\n", out_buffer->pBuffer);
        OMX_FillThisBuffer(component, out_buffer);
 
        return OMX_ErrorNone;
@@ -811,7 +812,8 @@ OMX_ERRORTYPE hello_video2::set_port_parameters()
        output_port_def.nBufferCountActual = 16;
        ErrorCode = OMX_SetParameter(component, OMX_IndexParamPortDefinition, &output_port_def);
        if (ErrorCode != OMX_ErrorNone) {
-               fprintf(stderr, "%s[%d]%s\n", __func__, __LINE__, OMX_strerror(ErrorCode));
+               fprintf(stderr, "Err: %s[%d]%s\n", __func__, __LINE__, OMX_strerror(ErrorCode));
+               exit(0);
        }
 
        return ErrorCode;
@@ -849,7 +851,7 @@ OMX_ERRORTYPE hello_video2::prepare_output_buffers(unsigned int num)
        tbm_bo_handle handle_bo;
        ErrorCode = OMX_ErrorNone;
        tbm_bo tmp;
-       unsigned char *buf;
+       OMX_U8 *buf;
        unsigned int *pPrivateData;
 
        for (unsigned int i = 0; i < num; i++)
@@ -858,14 +860,22 @@ OMX_ERRORTYPE hello_video2::prepare_output_buffers(unsigned int num)
                *pPrivateData = (1 << i);
                output_buffer_usage |= *pPrivateData;
 
-               tmp = tbm_bo_alloc(_tbm_bufmgr, output_port_def.nBufferSize, TBM_BO_WC);
-               handle_bo = tbm_bo_get_handle(tmp, TBM_DEVICE_CPU);
-               buf = (unsigned char*)handle_bo.ptr;
+               if (1) {
+                       tmp = tbm_bo_alloc(_tbm_bufmgr, output_port_def.nBufferSize, TBM_BO_WC);
+                       handle_bo = tbm_bo_get_handle(tmp, TBM_DEVICE_CPU);
+                       buf = (OMX_U8*)handle_bo.ptr;
+               } else {
+                       buf = (OMX_U8*)malloc(output_port_def.nBufferSize);
+               }
+               
+#if 1 // Check if handle_bo.ptr is valid.
+               memset(handle_bo.ptr, 0x00, output_port_def.nBufferSize);
+#endif // Check
 
                ErrorCode = OMX_UseBuffer(component, &output_buffer_header[i], output_port_def.nPortIndex, pPrivateData, output_port_def.nBufferSize, buf);
 
                if (ErrorCode == OMX_ErrorNone) {
-                       fprintf(stderr, "Okay:prepare_output_buffers:Output buffer %u allocated,%d.\n", i + 1, output_port_def.nBufferSize);
+                       fprintf(stderr, "Okay:prepare_output_buffers: Port %d: Output buffer %d: allocated %d:buff %p:output_buffer_usage 0x%x\n", output_port_def.nPortIndex, i + 1, output_port_def.nBufferSize, buf, output_buffer_usage);
                }
                else {
                        fprintf(stderr, "Err:prepare_output_buffers:%d. %s\n", i, OMX_strerror(ErrorCode));                     
@@ -895,14 +905,24 @@ OMX_BUFFERHEADERTYPE * hello_video2::get_free_input_buffer()
 
 OMX_BUFFERHEADERTYPE * hello_video2::get_free_output_buffer()
 {
+       if (output_buffer_usage == 0) {
+               for (unsigned int i = 0; i < output_port_def.nBufferCountActual; i++) {
+                       output_buffer_usage |= 0x1 < i;
+               }               
+       }
+
        while (true)
        {
                for (unsigned int i = 0; i < output_port_def.nBufferCountActual; i++) {
                        if ((output_buffer_usage & *((unsigned int *)output_buffer_header[i]->pAppPrivate)) != 0) {
+                               output_buffer_usage &= ~(*((unsigned int *)output_buffer_header[i]->pAppPrivate));
+                               fprintf(stderr, "get_free_output_buffer:0x%08x\n", output_buffer_usage);
                                return output_buffer_header[i];
                        }
                }
+               fprintf(stderr, "OMXWaitForFilled wait..\n");
                OMXWaitForFilled();
+               fprintf(stderr, "OMXWaitForFilled done!.\n");
        }
 
        return NULL;