omxilvideocomps/omxilclock/src/comxilclockcomponent.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/omxilspecversion.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    25
#include <openmax/il/loader/omxilcomponentif.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    26
#include <openmax/il/loader/omxilsymbiancomponentif.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    27
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    28
#include "comxilclockcomponent.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    29
#include "comxilclockoutputport.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    30
#include "comxilclockprocessingfunction.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    31
#include "comxilclockconfigmanager.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    32
#include "clockpanics.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    33
#include "omxilclock.hrh"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    34
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    35
_LIT8(KSymbianOmxILClockNameDes, KCompNameSymbianOmxILClock);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    36
_LIT8(KSymbianOmxILClockRoleDes, KRoleSymbianOmxILClock);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    37
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    38
OMXIL_COMPONENT_ECOM_ENTRYPOINT(KUidSymbianOmxILClock);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    39
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    40
OMX_ERRORTYPE SymbianErrorToOmx(TInt aError);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    41
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    42
// Component Entry Point
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    43
OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE aComponent)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    44
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    45
	TInt err = COmxILClockComponent::CreateComponent(aComponent);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    46
	return SymbianErrorToOmx(err);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    47
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    48
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    49
TInt COmxILClockComponent::CreateComponent(OMX_HANDLETYPE hComponent)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    50
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    51
	COmxILClockComponent* self = new COmxILClockComponent();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    52
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    53
	if (!self)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    54
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    55
		return KErrNoMemory;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    56
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    57
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    58
	TRAPD(error, self->ConstructL(hComponent));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    59
	if(error != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    60
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    61
		delete self;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    62
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    63
	return error;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    64
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    65
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    66
COmxILClockComponent::COmxILClockComponent()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    67
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    68
	// nothing to do
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    69
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    70
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    71
void COmxILClockComponent::ConstructL(OMX_HANDLETYPE hComponent)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    72
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    73
    COmxILComponent::ConstructL(hComponent);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    74
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    75
	// use synchronous callback manager since BufferDoneNotifications must be serviced at precise times 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    76
    MOmxILCallbackNotificationIf* callbackNotificationIf=CreateCallbackManagerL(COmxILComponent::EOutofContext);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    77
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    78
    COmxILClockProcessingFunction* pProcessingFunction = COmxILClockProcessingFunction::NewL(*callbackNotificationIf, *this);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    79
    RegisterProcessingFunction(pProcessingFunction);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    80
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    81
    CreatePortManagerL(COmxILComponent::ENonBufferSharingPortManager,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    82
		TOmxILSpecVersion(),	        // OMX Version
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    83
		0,						// The number of audio ports in this component
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    84
		0,						// The starting audio port index
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    85
		0,						// The number of image ports in this component
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    86
		0,						// The starting image port index
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    87
		0,						// The number of video ports in this component
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    88
		0,						// The starting video port index
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    89
		KNumPorts,				// The number of other ports in this component
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    90
		0,						// The starting other port index
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    91
		OMX_FALSE				// Process the time port buffer as usual in port manager
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    92
		);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    93
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    94
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    95
	RPointerArray<TDesC8> roleList;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    96
	CleanupClosePushL(roleList);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    97
	roleList.AppendL(&KSymbianOmxILClockRoleDes);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    98
	COmxILClockConfigManager* configManager = COmxILClockConfigManager::NewL(KSymbianOmxILClockNameDes, 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    99
							TOmxILSpecVersion(), roleList, *(static_cast<COmxILClockProcessingFunction*>(pProcessingFunction)));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   100
	RegisterConfigurationManager(configManager);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   101
	CleanupStack::PopAndDestroy(&roleList);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   102
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   103
	for(TInt portIndex = 0; portIndex < KNumPorts; portIndex++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   104
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   105
		AddPortL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   106
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   107
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   108
	InitComponentL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   109
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   110
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   111
COmxILClockComponent::~COmxILClockComponent()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   112
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   113
	iPorts.Reset();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   114
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   115
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   116
void COmxILClockComponent::AddPortL()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   117
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   118
	TOmxILSpecVersion omxIlVersion;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   119
	TOmxILCommonPortData portData(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   120
			omxIlVersion, 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   121
			iPorts.Count(),										// port index
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   122
			OMX_DirOutput,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   123
			4,													// minimum number of buffers
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   124
			sizeof(OMX_TIME_MEDIATIMETYPE),						// minimum buffer size, in bytes
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   125
			OMX_PortDomainOther,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   126
			OMX_FALSE,											// do not need contigious buffers
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   127
			1,													// byte alignment
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   128
			// Clock being buffer supplier allows it to send notifications to clients without
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   129
			// waiting for clients to pass their buffers after a state transition
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   130
			OMX_BufferSupplyOutput,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   131
			COmxILPort::KBufferMarkPropagationPortNotNeeded		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   132
			);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   133
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   134
	RArray<OMX_OTHER_FORMATTYPE> supportedOtherFormats;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   135
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   136
	CleanupClosePushL(supportedOtherFormats);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   137
	supportedOtherFormats.AppendL(OMX_OTHER_FormatTime);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   138
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   139
	COmxILClockOutputPort* port = COmxILClockOutputPort::NewL(portData, supportedOtherFormats,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   140
															*(static_cast<COmxILClockProcessingFunction*>(GetProcessingFunction())));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   141
	CleanupStack::PopAndDestroy(&supportedOtherFormats);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   142
	CleanupStack::PushL(port);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   143
    User::LeaveIfError(AddPort(port, OMX_DirOutput));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   144
    CleanupStack::Pop(port);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   145
	iPorts.AppendL(port);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   146
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   147
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   148
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   149
 * Returns true iff the specified port is currently enabled.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   150
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   151
TBool COmxILClockComponent::PortEnabled(TInt aPortIndex) const
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   152
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   153
	return iPorts[aPortIndex]->IsEnabled();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   154
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   155
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   156
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   157
 * Returns the number of buffers as configured in the port definition.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   158
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   159
TInt COmxILClockComponent::PortBufferCount(TInt aPortIndex) const
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   160
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   161
	return iPorts[aPortIndex]->BufferCount();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   162
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   163
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   164
OMX_ERRORTYPE SymbianErrorToOmx(TInt aError)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   165
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   166
	switch(aError)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   167
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   168
	case KErrNone:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   169
		return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   170
	case KErrNoMemory:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   171
		return OMX_ErrorInsufficientResources;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   172
	case KErrArgument:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   173
		return OMX_ErrorUnsupportedSetting;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   174
	case KErrNotSupported:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   175
		return OMX_ErrorUnsupportedIndex;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   176
	case KErrNotReady:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   177
		return OMX_ErrorIncorrectStateOperation;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   178
	default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   179
#ifdef _DEBUG
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   180
		// Panic in a debug build. It will make people think about how the error should be handled.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   181
		Panic(EUndefinedErrorCode);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   182
#endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   183
		return OMX_ErrorUndefined;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   184
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   185
	}