static bool claim_input (const void *ap_obj) { const tiz_srv_t *p_parent = ap_obj; struct webpdprc *p_obj = (struct webpdprc *) ap_obj; tiz_pd_set_t ports; void *p_krn = tiz_get_krn (p_parent->p_hdl_); TIZ_PD_ZERO (&ports); tiz_check_omx_err (tiz_krn_select (p_krn, 2, &ports)); /* We need one input buffers */ if (TIZ_PD_ISSET (0, &ports)) { tiz_check_omx_err (tiz_krn_claim_buffer (p_krn, 0, 0, &p_obj->pinhdr_)); TIZ_LOG_CNAME (TIZ_TRACE, TIZ_CNAME (p_parent->p_hdl_), TIZ_CBUF (p_parent->p_hdl_), "Claimed INPUT HEADER [%p]...", p_obj->pinhdr_); return true; } TIZ_LOG_CNAME (TIZ_TRACE, TIZ_CNAME (p_parent->p_hdl_), TIZ_CBUF (p_parent->p_hdl_), "COULD NOT CLAIM AN INPUT HEADER..."); return false; }
static OMX_ERRORTYPE webpd_proc_buffers_ready (const void *ap_obj) { struct webpdprc *p_obj = (struct webpdprc *) ap_obj; const tiz_srv_t *p_parent = ap_obj; void *p_krn = tiz_get_krn (p_parent->p_hdl_); TIZ_LOG_CNAME (TIZ_TRACE, TIZ_CNAME (p_parent->p_hdl_), TIZ_CBUF (p_parent->p_hdl_), "Buffers ready..."); while (1) { if (!p_obj->pinhdr_) { if (!claim_input (ap_obj) || !p_obj->pinhdr_) { break; } } if (!p_obj->pouthdr_) { if (!claim_output (ap_obj)) { break; } } tiz_check_omx_err (webpd_proc_transform_buffer (ap_obj)); if (p_obj->pinhdr_ && (0 == p_obj->pinhdr_->nFilledLen)) { p_obj->pinhdr_->nOffset = 0; tiz_krn_release_buffer (p_krn, 0, p_obj->pinhdr_); p_obj->pinhdr_ = NULL; } } if (p_obj->eos_ && p_obj->pouthdr_) { /* EOS has been received and all the input data has been consumed * already, so its time to propagate the EOS flag */ TIZ_LOG_CNAME (TIZ_TRACE, TIZ_CNAME (p_parent->p_hdl_), TIZ_CBUF (p_parent->p_hdl_), "p_obj->eos OUTPUT HEADER [%p]...", p_obj->pouthdr_); p_obj->pouthdr_->nFlags |= OMX_BUFFERFLAG_EOS; tiz_krn_release_buffer (p_krn, 1, p_obj->pouthdr_); p_obj->pouthdr_ = NULL; } return OMX_ErrorNone; }
static bool claim_output (const void *ap_obj) { const tiz_srv_t *p_parent = ap_obj; struct webpdprc *p_obj = (struct webpdprc *) ap_obj; tiz_pd_set_t ports; void *p_krn = tiz_get_krn (p_parent->p_hdl_); TIZ_PD_ZERO (&ports); tiz_check_omx_err (tiz_krn_select (p_krn, 2, &ports)); /* We need one output buffers */ if (TIZ_PD_ISSET (1, &ports)) { tiz_check_omx_err (tiz_krn_claim_buffer (p_krn, 1, 0, &p_obj->pouthdr_)); TIZ_LOG_CNAME (TIZ_TRACE, TIZ_CNAME (p_parent->p_hdl_), TIZ_CBUF (p_parent->p_hdl_), "Claimed OUTPUT HEADER [%p] BUFFER [%p] " "nFilledLen [%d]...", p_obj->pouthdr_, p_obj->pouthdr_->pBuffer, p_obj->pouthdr_->nFilledLen); return true; } return false; }
static OMX_ERRORTYPE pause_trans_complete (const void *ap_obj, OMX_PTR ap_servant, OMX_STATETYPE a_new_state) { TIZ_LOG_CNAME (TIZ_TRACE, TIZ_CNAME (tiz_srv_get_hdl (ap_servant)), TIZ_CBUF (tiz_srv_get_hdl (ap_servant)), "Trans complete to state [%s]...", tiz_fsm_state_to_str (a_new_state)); assert (OMX_StatePause == a_new_state || OMX_StateIdle == a_new_state || OMX_StateExecuting == a_new_state); return tiz_state_super_trans_complete (tizpause, ap_obj, ap_servant, a_new_state); }
static OMX_ERRORTYPE webpd_proc_prepare_to_transfer (void *ap_obj, OMX_U32 a_pid) { const tiz_srv_t *p_parent = ap_obj; assert (ap_obj); TIZ_LOG_CNAME (TIZ_TRACE, TIZ_CNAME (p_parent->p_hdl_), TIZ_CBUF (p_parent->p_hdl_), "Transfering buffers...pid [%d]", a_pid); return OMX_ErrorNone; }
static OMX_ERRORTYPE webpd_proc_allocate_resources (void *ap_obj, OMX_U32 a_pid) { struct webpdprc *p_obj = ap_obj; const tiz_srv_t *p_parent = ap_obj; assert (ap_obj); (void) p_parent; (void) p_obj; TIZ_LOG_CNAME (TIZ_TRACE, TIZ_CNAME (p_parent->p_hdl_), TIZ_CBUF (p_parent->p_hdl_), "Resource allocation complete..." "pid = [%d]", a_pid); return OMX_ErrorNone; }
static OMX_ERRORTYPE pause_state_set (const void *ap_obj, OMX_HANDLETYPE ap_hdl, OMX_COMMANDTYPE a_cmd, OMX_U32 a_param1, OMX_PTR ap_cmd_data) { const tiz_pause_t *p_obj = ap_obj; tiz_fsm_state_id_t new_state = EStateMax; OMX_ERRORTYPE rc = OMX_ErrorNone; assert (p_obj); assert (a_cmd == OMX_CommandStateSet); TIZ_LOG (TIZ_TRACE, "Requested transition to state [%s]...", tiz_fsm_state_to_str (a_param1)); /* Allowed transitions are OMX_StateIdle, and OMX_StateExecuting */ switch (a_param1) { case OMX_StateIdle: { new_state = ESubStatePauseToIdle; break; } case OMX_StateExecuting: { new_state = a_param1; break; } case OMX_StatePause: { return OMX_ErrorSameState; } default: { TIZ_LOG (TIZ_TRACE, "OMX_ErrorIncorrectStateTransition..."); return OMX_ErrorIncorrectStateTransition; } }; /* Move FSM to the transitional state */ if (ESubStatePauseToIdle == new_state) { if (OMX_ErrorNone != (rc = tiz_fsm_set_state (tiz_get_fsm (ap_hdl), new_state, EStateMax))) { return rc; } { if (!TIZ_KRN_MAY_INIT_EXE_TO_IDLE(tiz_get_krn (ap_hdl))) { TIZ_LOG_CNAME (TIZ_DEBUG, TIZ_CNAME (ap_hdl), TIZ_CBUF (ap_hdl), "wait until all the tunneled supplier neighbours have " "reported that they have stopped the buffer exchange..."); return rc; } } } return tiz_state_super_state_set (tizpause, ap_obj, ap_hdl, a_cmd, a_param1, ap_cmd_data); }