37 omx_clocksrc_component_PrivateType* omx_clocksrc_component_Private;
43 openmaxStandComp->
pComponentPrivate = calloc(1,
sizeof(omx_clocksrc_component_PrivateType));
50 omx_clocksrc_component_Private->ports = NULL;
61 if (omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts && !omx_clocksrc_component_Private->ports) {
63 if (!omx_clocksrc_component_Private->ports) {
66 for (i=0; i < omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts; i++) {
68 if (!omx_clocksrc_component_Private->ports[i]) {
80 omx_clocksrc_component_Private->sClockState.nStartTime = 0;
81 omx_clocksrc_component_Private->sClockState.nOffset = 0;
82 omx_clocksrc_component_Private->sClockState.nWaitMask = 0xFF;
85 omx_clocksrc_component_Private->sMinStartTime.nTimestamp = 0;
86 omx_clocksrc_component_Private->sMinStartTime.nPortIndex = 0;
89 omx_clocksrc_component_Private->sConfigScale.xScale = 1<<16;
95 if(!omx_clocksrc_component_Private->clockEventSem) {
96 omx_clocksrc_component_Private->clockEventSem = calloc(1,
sizeof(
tsem_t));
97 tsem_init(omx_clocksrc_component_Private->clockEventSem, 0);
100 if(!omx_clocksrc_component_Private->clockEventCompleteSem) {
101 omx_clocksrc_component_Private->clockEventCompleteSem = calloc(1,
sizeof(
tsem_t));
102 tsem_init(omx_clocksrc_component_Private->clockEventCompleteSem, 0);
122 omx_clocksrc_component_PrivateType* omx_clocksrc_component_Private = openmaxStandComp->
pComponentPrivate;
128 if(omx_clocksrc_component_Private->clockEventSem) {
129 tsem_deinit(omx_clocksrc_component_Private->clockEventSem);
130 free(omx_clocksrc_component_Private->clockEventSem);
131 omx_clocksrc_component_Private->clockEventSem=NULL;
133 if(omx_clocksrc_component_Private->clockEventCompleteSem) {
134 tsem_deinit(omx_clocksrc_component_Private->clockEventCompleteSem);
135 free(omx_clocksrc_component_Private->clockEventCompleteSem);
136 omx_clocksrc_component_Private->clockEventCompleteSem=NULL;
140 if (omx_clocksrc_component_Private->ports) {
141 for (i=0; i < omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts; i++) {
142 if(omx_clocksrc_component_Private->ports[i])
143 omx_clocksrc_component_Private->ports[i]->PortDestructor(omx_clocksrc_component_Private->ports[i]);
145 free(omx_clocksrc_component_Private->ports);
146 omx_clocksrc_component_Private->ports=NULL;
263 omx_clocksrc_component_PrivateType* omx_clocksrc_component_Private = (omx_clocksrc_component_PrivateType*)omxComponent->
pComponentPrivate;
274 nMask = 0x1 << nParam;
276 omx_clocksrc_component_Private->sClockState.nWaitMask &= (~nMask);
278 (
int)omx_clocksrc_component_Private->sClockState.nWaitMask,(
int)(~nMask));
288 nMask = 0x1 << nParam;
290 omx_clocksrc_component_Private->sClockState.nWaitMask &= nMask;
292 (
int)omx_clocksrc_component_Private->sClockState.nWaitMask,(
int)nMask);
298 tsem_up(omx_clocksrc_component_Private->clockEventSem);
302 tsem_up(omx_clocksrc_component_Private->clockEventSem);
306 tsem_up(omx_clocksrc_component_Private->clockEventSem);
364 OMX_PTR pComponentConfigStructure) {
367 omx_clocksrc_component_PrivateType* omx_clocksrc_component_Private = (omx_clocksrc_component_PrivateType*)omxComponent->
pComponentPrivate;
379 OMX_TICKS walltime, mediatime, mediaTimediff, wallTimediff;
381 unsigned int sleeptime;
388 switch (clockstate->
eState) {
397 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
401 pPort->
sMediaTime.
xScale = omx_clocksrc_component_Private->sConfigScale.xScale;
404 tsem_up(omx_clocksrc_component_Private->clockEventSem);
406 tsem_down(omx_clocksrc_component_Private->clockEventCompleteSem);
422 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
426 pPort->
sMediaTime.
xScale = omx_clocksrc_component_Private->sConfigScale.xScale;
429 tsem_up(omx_clocksrc_component_Private->clockEventSem);
431 tsem_down(omx_clocksrc_component_Private->clockEventCompleteSem);
441 if(portIndex > omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts) {
453 if(omx_clocksrc_component_Private->sClockState.nWaitMask) {
455 nMask = ~(0x1 << portIndex);
456 omx_clocksrc_component_Private->sClockState.nWaitMask = omx_clocksrc_component_Private->sClockState.nWaitMask & nMask;
462 if(!omx_clocksrc_component_Private->sClockState.nWaitMask &&
465 omx_clocksrc_component_Private->sClockState.nStartTime = omx_clocksrc_component_Private->sMinStartTime.nTimestamp;
466 omx_clocksrc_component_Private->MediaTimeBase = omx_clocksrc_component_Private->sMinStartTime.nTimestamp;
467 gettimeofday(&tv,&zv);
469 omx_clocksrc_component_Private->WallTimeBase = walltime;
470 DEBUG(
DEB_LEV_SIMPLE_SEQ,
"Mediatimebase=%llx walltimebase=%llx \n",omx_clocksrc_component_Private->MediaTimeBase,omx_clocksrc_component_Private->WallTimeBase);
473 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
477 pPort->
sMediaTime.
xScale = omx_clocksrc_component_Private->sConfigScale.xScale;
480 tsem_up(omx_clocksrc_component_Private->clockEventSem);
482 DEBUG(
DEB_LEV_SIMPLE_SEQ,
"Waiting for Clock Running Event for all ports in case OMX_IndexConfigTimeClientStartTime\n");
483 tsem_down(omx_clocksrc_component_Private->clockEventCompleteSem);
495 if(portIndex > omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts) {
500 gettimeofday(&tv,&zv);
502 omx_clocksrc_component_Private->WallTimeBase = walltime;
503 omx_clocksrc_component_Private->MediaTimeBase = sRefTimeStamp->
nTimestamp;
509 if(portIndex > omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts) {
514 gettimeofday(&tv,&zv);
516 omx_clocksrc_component_Private->WallTimeBase = walltime;
517 omx_clocksrc_component_Private->MediaTimeBase = sRefTimeStamp->
nTimestamp;
522 Scale = omx_clocksrc_component_Private->sConfigScale.xScale >> 16;
523 gettimeofday(&tv,&zv);
525 mediatime = omx_clocksrc_component_Private->MediaTimeBase + Scale*(walltime - omx_clocksrc_component_Private->WallTimeBase);
526 omx_clocksrc_component_Private->WallTimeBase = walltime;
527 omx_clocksrc_component_Private->MediaTimeBase = mediatime;
534 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
538 pPort->
sMediaTime.
xScale = omx_clocksrc_component_Private->sConfigScale.xScale;
543 tsem_up(omx_clocksrc_component_Private->clockEventSem);
545 tsem_down(omx_clocksrc_component_Private->clockEventCompleteSem);
549 Scale = omx_clocksrc_component_Private->sConfigScale.xScale >> 16;
558 gettimeofday(&tv,&zv);
560 mediatime = omx_clocksrc_component_Private->MediaTimeBase + Scale*(walltime - omx_clocksrc_component_Private->WallTimeBase);
564 (
int)portIndex,mediaTimediff,mediatime,sMediaTimeRequest->
nMediaTimestamp,sMediaTimeRequest->
nOffset,(
int)Scale);
565 if((mediaTimediff<0 && Scale>0) || (mediaTimediff>0 && Scale<0)) {
567 (
int)portIndex,omx_clocksrc_component_Private->MediaTimeBase,omx_clocksrc_component_Private->WallTimeBase,
573 wallTimediff = mediaTimediff/Scale;
575 if(wallTimediff>thresh) {
576 sleeptime = (
unsigned int) (wallTimediff-thresh);
578 wallTimediff = thresh;
579 gettimeofday(&tv,&zv);
581 mediatime = omx_clocksrc_component_Private->MediaTimeBase + Scale*(walltime - omx_clocksrc_component_Private->WallTimeBase);
590 omx_clocksrc_component_Private->MediaTimeBase,omx_clocksrc_component_Private->WallTimeBase, mediatime,sMediaTimeRequest->
nMediaTimestamp,walltime);
594 tsem_up(omx_clocksrc_component_Private->clockEventSem);
596 tsem_down(omx_clocksrc_component_Private->clockEventCompleteSem);
599 __func__,(
int)omx_clocksrc_component_Private->sClockState.eState,(
int)Scale,__LINE__);
631 omx_clocksrc_component_PrivateType* omx_clocksrc_component_Private = (omx_clocksrc_component_PrivateType*)omx_base_component_Private;
639 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
643 pOutputBuffer[i] = NULL;
645 outBufExchanged[i] = 0;
655 pthread_mutex_lock(&omx_clocksrc_component_Private->flush_mutex);
656 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
659 while(bPortsBeingFlushed) {
660 pthread_mutex_unlock(&omx_clocksrc_component_Private->flush_mutex);
661 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
664 outBufExchanged[i]--;
665 pOutputBuffer[1]=NULL;
671 tsem_up(omx_clocksrc_component_Private->flush_all_condition);
672 tsem_down(omx_clocksrc_component_Private->flush_condition);
673 pthread_mutex_lock(&omx_clocksrc_component_Private->flush_mutex);
676 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
680 pthread_mutex_unlock(&omx_clocksrc_component_Private->flush_mutex);
684 tsem_down(omx_clocksrc_component_Private->clockEventSem);
685 DEBUG(
DEB_LEV_SIMPLE_SEQ,
"In %s clock event occured semval=%d \n",__func__,omx_clocksrc_component_Private->clockEventSem->semval);
689 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
692 if(pOutputSem[i]->semval>0 && isOutputBufferNeeded[i]==
OMX_TRUE ) {
694 if(pOutputQueue[i]->nelem>0){
695 outBufExchanged[i]++;
697 pOutputBuffer[i] =
dequeue(pOutputQueue[i]);
698 if(pOutputBuffer[i] == NULL){
707 if(pOutputBuffer[i]->nFilledLen!=0) {
709 __func__,(
int)pOutputBuffer[i]->nFilledLen,__LINE__);
711 outBufExchanged[i]--;
712 pOutputBuffer[i]=NULL;
730 for(i=0;i<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;i++) {
735 if((isOutputBufferNeeded[i]==
OMX_TRUE && pOutputSem[i]->semval==0) &&
740 tsem_down(omx_clocksrc_component_Private->bMgmtSem);
750 if(pOutputSem[i]->semval>0 && isOutputBufferNeeded[i]==
OMX_TRUE ) {
752 if(pOutputQueue[i]->nelem>0){
753 outBufExchanged[i]++;
755 pOutputBuffer[i] =
dequeue(pOutputQueue[i]);
756 if(pOutputBuffer[i] == NULL){
765 pthread_mutex_lock(&omx_clocksrc_component_Private->flush_mutex);
767 for(j=0;j<omx_clocksrc_component_Private->sPortTypesParam[
OMX_PortDomainOther].nPorts;j++) {
770 pthread_mutex_unlock(&omx_clocksrc_component_Private->flush_mutex);
771 if(bPortsBeingFlushed) {
772 DEBUG(
DEB_LEV_ERR,
"In %s Ports are being flushed - breaking (line %d)\n",__func__,__LINE__);
778 if (omx_clocksrc_component_Private->BufferMgmtCallback) {
779 (*(omx_clocksrc_component_Private->BufferMgmtCallback))(openmaxStandComp, pOutputBuffer[i]);
786 if(pOutputBuffer[i]->nFilledLen!=0) {
788 outBufExchanged[i]--;
789 pOutputBuffer[i]=NULL;
797 tsem_up(omx_clocksrc_component_Private->clockEventCompleteSem);
808 omx_clocksrc_component_PrivateType* omx_clocksrc_component_Private;
815 pthread_mutex_lock(&omx_clocksrc_component_Private->flush_mutex);
818 if(omx_clocksrc_component_Private->bMgmtSem->semval==0) {
819 tsem_up(omx_clocksrc_component_Private->bMgmtSem);
821 tsem_up(omx_clocksrc_component_Private->clockEventSem);
822 tsem_up(omx_clocksrc_component_Private->clockEventCompleteSem);
826 tsem_signal(omx_clocksrc_component_Private->bStateSem);
830 pthread_mutex_unlock(&omx_clocksrc_component_Private->flush_mutex);
831 tsem_down(omx_clocksrc_component_Private->flush_all_condition);
833 tsem_reset(omx_clocksrc_component_Private->bMgmtSem);
834 tsem_reset(omx_clocksrc_component_Private->clockEventSem);
864 omx_clocksrc_component_Private->callbackData,
877 pthread_mutex_lock(&omx_clocksrc_component_Private->flush_mutex);
879 pthread_mutex_unlock(&omx_clocksrc_component_Private->flush_mutex);
881 tsem_up(omx_clocksrc_component_Private->flush_condition);
886 DEBUG(
DEB_LEV_PARAMS,
"In %s TFlag=%x Qelem=%d BSem=%d bMgmtsem=%d component=%s\n", __func__,
890 (
int)omx_clocksrc_component_Private->bMgmtSem->semval,
891 omx_clocksrc_component_Private->name);