Пример #1
0
/* ========================================================================== */
static void readMsg(TIMM_OSAL_PTR pBuffer, TIMM_OSAL_U32 nNumBytes)
{
	TIMM_OSAL_U32 actSizeRead = 0;
	static systemMessage_t* tmpMsg = NULL;

	if (!pBuffer){
		SCREXEC_DBG_PRINT("Invalid return buffer supplied!\n");
		return TIMM_OSAL_ERR_PARAMETER;
	}

	if(tmpMsg == NULL){
		if (TIMM_OSAL_ERR_NONE != TIMM_OSAL_ReadFromPipe(STAND1_Script_Execution_PipeO, &tmpMsg, sizeof(systemMessage_t*), &actSizeRead, TIMM_OSAL_SUSPEND)) {
			SCREXEC_DBG_PRINT("TIMM_OSAL_ReadFromPipe failed!\n");
			return TIMM_OSAL_ERR_UNKNOWN;
		}
	}

	if(actSizeRead != sizeof(systemMessage_t*)){
		STAND1_DBG_PRINT("Requested %d bytes but read %d bytes\n", nNumBytes, actSizeRead);
		return TIMM_OSAL_ERR_UNKNOWN;
	}

	if(tmpMsg == NULL){
		SCREXEC_DBG_PRINT("Non-existent message!\n");
		return TIMM_OSAL_ERR_UNKNOWN;
	}

	TIMM_OSAL_Memcpy(pBuffer, tmpMsg, sizeof(systemMessage_t));

	if(tmpMsg->nPayloadSize == 0){
		SCREXEC_DBG_PRINT("Successful message read!\nRead %08X", &tmpMsg);
		TIMM_OSAL_Free(tmpMsg);
		tmpMsg = NULL;
	}else {
		((systemMessage_t*)pBuffer)->pPayload = TIMM_OSAL_MallocExtn(tmpMsg->nPayloadSize, TIMM_OSAL_TRUE, 32, 0, NULL);
		TIMM_OSAL_Memcpy(((systemMessage_t*)pBuffer)->pPayload, tmpMsg->pPayload, tmpMsg->nPayloadSize);

		SCREXEC_DBG_PRINT("Successful message read!\nRead %08X", &tmpMsg);
		TIMM_OSAL_Free(tmpMsg->pPayload);
		TIMM_OSAL_Free(tmpMsg);
		tmpMsg = NULL;
	}

	return TIMM_OSAL_ERR_NONE;
}
TIMM_OSAL_ERRORTYPE CCommunicationChannelImplementation::MsgReceive(TIMM_OSAL_PTR* pCurMessage)
{
    TIMM_OSAL_ERRORTYPE error = TIMM_OSAL_ERR_NONE;
    systemMessage_t* message;
    TIMM_OSAL_U32 nMessageSize = 0;

    // Allocate space for message header
    message = (systemMessage_t*)TIMM_OSAL_MallocExtn(DEFAULT_MESSAGE_SIZE, TIMM_OSAL_TRUE, 32,
              TIMMOSAL_MEM_SEGMENT_EXT, NULL);
    //printf("internalMsgRecvThread: Allocate message\n");
    if (!message)
    {
        printf("Cant allocate %d bytes form message header\n", DEFAULT_MESSAGE_SIZE);
        return TIMM_OSAL_ERR_ALLOC;
    }

    *(systemMessage_t **)pCurMessage = message;
    message->pPayload = NULL;
    //TIMM_OSAL_ReadFromPipe doesn't support timeout
    // printf("internalMsgRecvThread: Read from Pipe!\n");
    error = TIMM_OSAL_ReadFromPipe(internalMsgPipe, message, DEFAULT_MESSAGE_SIZE, &nMessageSize,
                                   TIMM_OSAL_SUSPEND);//inifinite timeout
    if (TIMM_OSAL_ERR_NONE != error)
    {
        TIMM_OSAL_Free(message);
        message = NULL;
        printf("Can't read from message pipe\n");
        return error;
    } else if (nMessageSize < sizeof(systemMessage_t))
    {
        TIMM_OSAL_Free(message);
        message = NULL;
        printf("Read data is less than message header size\n");
        return TIMM_OSAL_ERR_MSG_SIZE_MISMATCH;
    }

    return TIMM_OSAL_ERR_NONE;
}
/*========================================================*/
void Camera_processfbd(void *threadsArg)
{
	OMX_BUFFERHEADERTYPE *pBuffHeader = NULL;
	OMX_ERRORTYPE err = OMX_ErrorNone;
	TIMM_OSAL_U32 uRequestedEvents, pRetrievedEvents;
	struct port_param *pPortParam;
	int buffer_index, buffer_to_q;
	unsigned int numRemainingIn = 0;
	int ii;
	unsigned int actualSize = 0;
	pthread_t thread_id;
	int policy;
	int rc = 0;
	struct sched_param param;

	thread_id = pthread_self();
	dprintf(0, "New Thread Created\n");
	rc = pthread_getschedparam(thread_id, &policy, &param);
	if (rc != 0)
		dprintf(0, "<Thread> 1 error %d\n", rc);
	printf("<Thread> %d %d\n", policy, param.sched_priority);
	param.sched_priority = 10;
	rc = pthread_setschedparam(thread_id, SCHED_RR /*policy */ , &param);

	if (rc != 0)
		dprintf(0, "<Thread> 2 error %d\n", rc);

	rc = pthread_getschedparam(thread_id, &policy, &param);
	if (rc != 0)
		dprintf(0, "<Thread> 3 error %d\n", rc);
	dprintf(0, "<Thread> %d %d %d %d\n", policy, param.sched_priority,
	    sched_get_priority_min(policy), sched_get_priority_max(policy));

	while (OMX_ErrorNone == err)
	{
		uRequestedEvents = EVENT_CAMERA_FBD;
		dprintf(3, " going to wait for event retreive in thread \n");
		err = TIMM_OSAL_EventRetrieve(myEventIn, uRequestedEvents,
		    TIMM_OSAL_EVENT_OR_CONSUME, &pRetrievedEvents,
		    TIMM_OSAL_SUSPEND);
		if (TIMM_OSAL_ERR_NONE != err)
		{
			dprintf(0, "error = %d pRetrievedEvents\n", err,
			    &pRetrievedEvents);
			TIMM_OSAL_Error("Error in Retrieving event!");
			err = OMX_ErrorUndefined;
		}

		/* Read the number of buffers available in pipe */
		TIMM_OSAL_GetPipeReadyMessageCount(pContext->FBD_pipe,
		    (void *)&numRemainingIn);
		while (numRemainingIn)
		{
			err = TIMM_OSAL_ReadFromPipe(pContext->FBD_pipe,
			    &pBuffHeader, sizeof(pBuffHeader), &actualSize,
			    TIMM_OSAL_SUSPEND);
			if (err != TIMM_OSAL_ERR_NONE)
			{
				printf("\n<Thread>Read from FBD_pipe\
				unsuccessful, going back to wait for event\n");
				break;
			}
			dprintf(2, "\n ReadFromPipe successfully returned\n");

			buffer_index = (int)pBuffHeader->pAppPrivate;
			dprintf(2, "\n buffer_index = %d\n", buffer_index);
			pPortParam =
			    &(pContext->sPortParam[pBuffHeader->
				nOutputPortIndex]);
			dprintf(3, "FillBufferDone for Port = %d\n",
			    (int)pBuffHeader->nOutputPortIndex);
			dprintf(2, "buffer index = %d remaing messages=%d\n",
			    (int)pBuffHeader->pAppPrivate, numRemainingIn);
			dprintf(2, "Filled Length is  = %d ",
			    (int)pBuffHeader->nFilledLen);

			if (pBuffHeader->nOutputPortIndex ==
			    OMX_CAMERA_PORT_VIDEO_OUT_PREVIEW)
			{
				dprintf(3, "Preview port frame Done number =\
					%d\n", (int)pPortParam->nCapFrame);
				pPortParam->nCapFrame++;
				dprintf(3, "\n Before SendbufferToDss() \n");
				buffer_to_q = SendbufferToDss(buffer_index,
				    vid1_fd);
				if (buffer_to_q != 0xFF)
				{
					omx_fillthisbuffer(buffer_to_q,
					    OMX_CAMERA_PORT_VIDEO_OUT_PREVIEW);
				}
			}

			dprintf(2, "\n FillBufferDone \n");
			TIMM_OSAL_GetPipeReadyMessageCount(pContext->FBD_pipe,
			    (void *)&numRemainingIn);
			dprintf(2, " buffer index = %d remaing messages=%d\n",
			    (int)pBuffHeader->pAppPrivate, numRemainingIn);
		}