omxilvideocomps/omxilclock/src/comxilclockprocessingfunction.cpp
author hgs
Fri, 08 Oct 2010 22:09:17 +0100
changeset 0 5d29cba61097
permissions -rw-r--r--
2010wk38_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     1
/*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     3
* All rights reserved.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     8
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    11
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    12
* Contributors:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    13
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    14
* Description:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    15
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    16
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    17
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    18
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    19
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    20
@file
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    21
@internalComponent
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    22
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    23
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    24
#include <openmax/il/common/omxilutil.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    25
#include "comxilclockprocessingfunction.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    26
#include "comxilclockcomponent.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    27
#include "clocksupervisor.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    28
#include <openmax/il/common/omxilcallbacknotificationif.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    29
#include "clockpanics.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    30
#include "omxilclock.hrh"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    31
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    32
#include <openmax/il/common/omxilspecversion.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    33
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    34
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    35
OMX_ERRORTYPE SymbianErrorToOmx(TInt aError);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    36
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    37
COmxILClockProcessingFunction* COmxILClockProcessingFunction::NewL(MOmxILCallbackNotificationIf& aCallbacks,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    38
		                                                           COmxILClockComponent& aComponent)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    39
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    40
	COmxILClockProcessingFunction* self = new (ELeave) COmxILClockProcessingFunction(aCallbacks, aComponent);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    41
	CleanupStack::PushL(self);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    42
	self->ConstructL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    43
	CleanupStack::Pop(self);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    44
	return self;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    45
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    46
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    47
COmxILClockProcessingFunction::COmxILClockProcessingFunction(MOmxILCallbackNotificationIf& aCallbacks,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    48
		                                                     COmxILClockComponent& aComponent) :
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    49
 COmxILProcessingFunction(aCallbacks), iComponent(aComponent)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    50
 	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    51
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    52
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    53
void COmxILClockProcessingFunction::ConstructL()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    54
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    55
	iClock = CClockSupervisor::NewL(*this);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    56
	iThreadNotifier = CClockThreadNotifier::NewL(iClock);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    57
	iThreadNotifier->IssueRequest();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    58
	User::LeaveIfError(iBufferMutex.CreateLocal());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    59
	// create a buffer queue for each port and add it to the iBufferQueues array
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    60
	for(TInt portIndex = 0; portIndex < KNumPorts; portIndex++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    61
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    62
		CCirBuf<OMX_BUFFERHEADERTYPE*>* queue = new(ELeave) CCirBuf<OMX_BUFFERHEADERTYPE*>();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    63
		CleanupStack::PushL(queue);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    64
		iBufferQueues.AppendL(queue);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    65
		CleanupStack::Pop(queue);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    66
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    67
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    68
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    69
COmxILClockProcessingFunction::~COmxILClockProcessingFunction()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    70
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    71
	delete iClock;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    72
	delete iThreadNotifier;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    73
	iBufferMutex.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    74
	// empty iBufferQueues and delete any CCirBuf objects
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    75
	// the CCirBuf objects don't own any buffers they contain, so we don't delete those here
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    76
	iBufferQueues.ResetAndDestroy();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    77
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    78
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    79
OMX_ERRORTYPE COmxILClockProcessingFunction::StateTransitionIndication(TStateIndex aNewState)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    80
	{	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    81
	OMX_ERRORTYPE omxError = OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    82
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    83
	switch(aNewState)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    84
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    85
		case ESubStateLoadedToIdle:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    86
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    87
			// allocate space for the buffer queues now the buffer count on each port is known
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    88
			for(TInt portIndex = 0; portIndex < KNumPorts; portIndex++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    89
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    90
				TInt length = iComponent.PortBufferCount(portIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    91
				TRAPD(error, iBufferQueues[portIndex]->SetLengthL(length));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    92
				// error not actually a problem if queue was originally longer than we need
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    93
				if(error != KErrNone && iBufferQueues[portIndex]->Length() < length)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    94
					{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    95
					omxError = OMX_ErrorInsufficientResources;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    96
					break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    97
					}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    98
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    99
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   100
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   101
			
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   102
		case EStateExecuting:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   103
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   104
			iExecuting = ETrue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   105
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   106
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   107
			
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   108
		case EStateIdle:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   109
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   110
			iExecuting = EFalse;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   111
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   112
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   113
			
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   114
		case EStatePause:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   115
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   116
			// NOTE we do not change iExecuting
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   117
			// The value of iExecuting maintains the direction from which
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   118
			// Paused was entered (i.e. from Idle or Executing).
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   119
			// This is because we wan't to know whether buffers are available,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   120
			// regardless of whether we are paused or not.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   121
			// TODO TBD is there an implicit stopping of the clock (e.g. set scale to 0)?
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   122
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   123
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   124
		default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   125
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   126
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   127
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   128
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   129
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   130
	return omxError;		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   131
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   132
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   133
OMX_ERRORTYPE COmxILClockProcessingFunction::BufferFlushingIndication(TUint32 aPortIndex,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   134
                                                                      OMX_DIRTYPE /*aDirection*/)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   135
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   136
	__ASSERT_DEBUG(aPortIndex == OMX_ALL || aPortIndex < KNumPorts, Panic(EBufferFlushingInvalidPort));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   137
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   138
	if (aPortIndex == OMX_ALL || aPortIndex < KNumPorts)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   139
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   140
		iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   141
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   142
		if (aPortIndex == OMX_ALL)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   143
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   144
			for (TInt portIndex = 0; portIndex < KNumPorts; portIndex++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   145
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   146
				DoBufferFlushingIndication(portIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   147
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   148
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   149
		else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   150
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   151
			DoBufferFlushingIndication(aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   152
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   153
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   154
		iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   155
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   156
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   157
	return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   158
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   159
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   160
void COmxILClockProcessingFunction::DoBufferFlushingIndication(TUint32 aPortIndex)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   161
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   162
	CCirBuf<OMX_BUFFERHEADERTYPE*>& queue = *iBufferQueues[aPortIndex];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   163
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   164
	while(queue.Count() > 0)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   165
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   166
		OMX_BUFFERHEADERTYPE* buffer;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   167
		// ignore error, we just checked Count() > 0 and we have the mutex, so a buffer
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   168
		// should definitely be there
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   169
		queue.Remove(&buffer);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   170
		OMX_ERRORTYPE error = iCallbacks.BufferDoneNotification(buffer, aPortIndex, OMX_DirOutput);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   171
		// the callback manager should return OMX_ErrorNone
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   172
		// the callback manager ignores any error code from the callee component since it is the component's responsibility
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   173
		// to respond to errors generated internally
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   174
		__ASSERT_DEBUG(error == OMX_ErrorNone, Panic(ECallbackManagerBufferError));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   175
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   176
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   177
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   178
OMX_ERRORTYPE COmxILClockProcessingFunction::ParamIndication(OMX_INDEXTYPE /*aParamIndex*/,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   179
                                                                      const TAny* /*apComponentParameterStructure*/)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   180
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   181
	return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   182
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   183
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   184
OMX_ERRORTYPE COmxILClockProcessingFunction::ConfigIndication(OMX_INDEXTYPE /*aConfigIndex*/,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   185
                                                                       const TAny* /*apComponentConfigStructure*/)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   186
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   187
	return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   188
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   189
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   190
OMX_ERRORTYPE COmxILClockProcessingFunction::BufferIndication(OMX_BUFFERHEADERTYPE* apBufferHeader,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   191
                                                              OMX_DIRTYPE /*aDirection*/)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   192
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   193
	// add buffer to the appropriate port queue
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   194
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   195
	CCirBuf<OMX_BUFFERHEADERTYPE*>& queue = *iBufferQueues[apBufferHeader->nOutputPortIndex];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   196
	TOmxILUtil::ClearBufferContents(apBufferHeader);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   197
	apBufferHeader->nOffset = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   198
	iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   199
	TInt added = queue.Add(&apBufferHeader);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   200
	// don't expect 0 (not added) as total number of buffers is known
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   201
	__ASSERT_DEBUG(added, Panic(EBufferQueueOverflow));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   202
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   203
	iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   204
	return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   205
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   206
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   207
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   208
 * Finds and removes an item from a CCirBuf.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   209
 * NOTE items are NOT guaranteed to be in their original position!
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   210
 * The queue must be protected from concurrent access when calling this
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   211
 * function.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   212
 * 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   213
 * @param aQueue queue to modify
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   214
 * @param aRemoveItem item to remove
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   215
 * @return ETrue if item was found and removed from the queue, EFalse otherwise.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   216
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   217
template<class T>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   218
static TBool RemoveFromPool(CCirBuf<T>&aQueue, T aRemoveItem)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   219
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   220
	TInt numItems = aQueue.Count();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   221
	for(TInt index = 0; index < numItems; index++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   222
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   223
		T item;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   224
		TInt removed = aQueue.Remove(&item);	// ignore error since queue cannot be empty (numItems > 0)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   225
		__ASSERT_DEBUG(removed == 1, Panic(EBufferUnderflow));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   226
		if(item == aRemoveItem)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   227
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   228
			return ETrue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   229
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   230
		else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   231
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   232
			TInt added = aQueue.Add(&item);	// ignore error since always space for 1 item as one has just been removed
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   233
			__ASSERT_DEBUG(added == 1, Panic(EBufferQueueOverflow));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   234
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   235
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   236
	return EFalse;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   237
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   238
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   239
OMX_BOOL COmxILClockProcessingFunction::BufferRemovalIndication(OMX_BUFFERHEADERTYPE* apBufferHeader,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   240
		                                                        OMX_DIRTYPE /*aDirection*/)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   241
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   242
	CCirBuf<OMX_BUFFERHEADERTYPE*>& queue = *iBufferQueues[apBufferHeader->nOutputPortIndex];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   243
	iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   244
	// note queue may be reordered, but that's OK since these are empty buffers
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   245
	TBool removed = RemoveFromPool(queue, apBufferHeader);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   246
	iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   247
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   248
	return removed ? OMX_TRUE : OMX_FALSE;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   249
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   250
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   251
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   252
 * Returns a free buffer from the queue for the specified port.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   253
 * If no buffer is ready, this method returns NULL
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   254
 * This method does not block for a buffer to become available.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   255
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   256
OMX_BUFFERHEADERTYPE* COmxILClockProcessingFunction::AcquireBuffer(TInt aPortIndex)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   257
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   258
	CCirBuf<OMX_BUFFERHEADERTYPE*>& queue = *iBufferQueues[aPortIndex];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   259
	iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   260
	OMX_BUFFERHEADERTYPE* buffer;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   261
	TInt count = queue.Remove(&buffer);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   262
	iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   263
	if(count > 0)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   264
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   265
		return buffer;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   266
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   267
	else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   268
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   269
		return NULL;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   270
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   271
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   272
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   273
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   274
 * Sends a buffer out on a port.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   275
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   276
void COmxILClockProcessingFunction::SendBuffer(OMX_BUFFERHEADERTYPE* aBuffer)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   277
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   278
	OMX_ERRORTYPE error = iCallbacks.BufferDoneNotification(aBuffer, aBuffer->nOutputPortIndex, OMX_DirOutput);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   279
	// the callback manager should return OMX_ErrorNone
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   280
	// the callback manager ignores any error code from the callee component since it is the component's responsibility
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   281
	// to respond to errors generated internally
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   282
	__ASSERT_DEBUG(error == OMX_ErrorNone, Panic(ECallbackManagerBufferError));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   283
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   284
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   285
OMX_ERRORTYPE COmxILClockProcessingFunction::ProduceRequest(OMX_INDEXTYPE aIdx, CClockSupervisor::TEntryPoint aEntryPoint, TAny* pComponentConfigStructure)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   286
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   287
	return iClock->ProduceRequest(aIdx, aEntryPoint, pComponentConfigStructure);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   288
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   289
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   290
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   291
 * Returns true iff the specified port is currently enabled.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   292
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   293
TBool COmxILClockProcessingFunction::PortEnabled(TInt aPortIndex) const
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   294
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   295
	return iComponent.PortEnabled(aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   296
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   297
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   298
TBool COmxILClockProcessingFunction::IsExecuting() const
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   299
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   300
	return iExecuting;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   301
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   302
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   303
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   304
 * Called when CClockSupervisor encounters a fatal error and needs to transition the
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   305
 * component to OMX_StateInvalid.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   306
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   307
void COmxILClockProcessingFunction::InvalidateComponent()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   308
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   309
	OMX_ERRORTYPE error = iCallbacks.ErrorEventNotification(OMX_ErrorInvalidState);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   310
	// the callback manager should return OMX_ErrorNone
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   311
	// the callback manager ignores any error code from the client since it is the client's responsibility to respond
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   312
	// to errors generated internally
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   313
	__ASSERT_DEBUG(error == OMX_ErrorNone, Panic(ECallbackManagerEventError));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   314
	// TODO this sends the invalidated event up to the IL client, but does not alter
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   315
	// the internal state of the component to reflect being invalid. It seems you need
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   316
	// access to private, non-exported FsmTransition to do that?
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   317
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   318