omxilvideocomps/omxilclock/src/clocksupervisor.h
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
#ifndef CLOCKSUPERVISOR_H_
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    20
#define CLOCKSUPERVISOR_H_
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    21
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    22
#include <e32base.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    23
#include <openmax/il/khronos/v1_x/OMX_Other.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    24
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    25
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    26
 @file
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    27
 @internalComponent
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    28
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    29
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    30
// forward declaration as supervisor calls back to processing function
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    31
class COmxILClockProcessingFunction;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    32
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    33
///////////////////////////////////////////////////////////////////////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    34
// List of structures declared in this file:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    35
// 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    36
// TMediaRequest
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    37
// TEntryPoint
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    38
// TIndexToFunctionMapping
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    39
// CClockSupervisor
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    40
// 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    41
///////////////////////////////////////////////////////////////////////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    42
// Storage of Clock requests.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    43
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    44
// The Media Update storage holds a number of request updates to send to 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    45
// clients.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    46
// The updates are entered in a queue based on the delta of the 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    47
// 'expected MediaTime minus Offset' giving an absolute time (the delta). 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    48
// This difference is then calculated by the queue implementation on insertion
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    49
// of the element.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    50
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    51
// When the clock changes state it notifies the clients by sending them a state 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    52
// change notification broadcast.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    53
// The important thing to note here is that there is no seperate queue for 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    54
// outgoing notifications.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    55
// As soon as a request timer expires that request is forwarded. 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    56
// Broadcast requests are raised and placed first on the queue so are sent 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    57
// as and when they occur.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    58
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    59
// When the scale is a change of direction (i.e. playing in the backwards 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    60
// direction), the queue is cleared and the delta's absolute value is taken.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    61
// 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    62
// The delta is a TInt which matches the Ticks datatype returned by the system.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    63
// 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    64
// We do not expect the phone to be in operation beyond the maximum duration 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    65
// held by the 64-bit Wall clock. Behaviour beyond this is undefined.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    66
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    67
// The reason for choosing a list over an array is mainly access efficiency.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    68
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    69
// 1) The insertions must be in order so as to be pulled off quickly.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    70
//    Updates are pulled off from the front of the queue, so you would have 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    71
//    to adjust the whole array each time.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    72
// 2) Updates arrive at different times and can expect to be fulfilled prior 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    73
//    to earlier updates, again the list would need to be adjusted after the 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    74
//    point of insertion.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    75
// 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    76
// Clients are attached via ports and the notifications are sent to them via 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    77
// these ports
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    78
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    79
///////////////////////////////////////////////////////////////////////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    80
// Clock functionality is invoked both externally & internally.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    81
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    82
// Based on the OMX IL 1.1.1 standard, we route these incoming external 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    83
// requests to their relevant behaviour.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    84
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    85
// This Clock component is intended to be created per use case.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    86
// That is for every use case that requires synchronisation.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    87
// This could result in several clocks being created, each with an audio and/or
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    88
// video as an input, and each with a high-priority clock thread.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    89
// At most it is considered that there should only be a few of these components
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    90
// in existance at any one time, as mobile devices should not really require it.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    91
// However, saying this, it should be factored into the design. 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    92
// At this stage it is envisioned that any clock component should reduce its 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    93
// timer events to once at just after the 32-bit wraparound when its 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    94
// application is not in focus. 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    95
// This is due to the time being reported to us in a 32-bit value, whilst our 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    96
// Wall clock is 64-bits. 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    97
// To avoid any wraparound and losing time by not regulary updating the upper 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    98
// word of our wall clock, we need to somehow check the system clock at this 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    99
// inteval. This is not a problem during normal operation but can be when the 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   100
// application is Paused or goes out of focus.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   101
//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   102
// NOTE: Assumes OMX_SKIP64BIT is not set when building OMX CORE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   103
///////////////////////////////////////////////////////////////////////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   104
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   105
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   106
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   107
 * 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   108
 *
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   109
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   110
class TMediaRequest
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   111
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   112
public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   113
	TInt64 iMediaTime;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   114
	TInt64 iOffset;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   115
	TInt64 iTriggerWallTime;		// == iWallTimeAtMediaTime - iOffset
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   116
	TInt iPortIndex;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   117
	TAny* iClientPrivate;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   118
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   119
	inline void Deque();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   120
	inline void AddBefore(TMediaRequest*);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   121
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   122
public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   123
	TMediaRequest *iPrev;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   124
	TMediaRequest *iNext;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   125
	};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   126
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
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   131
class TMediaTimeContext
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   132
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   133
public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   134
	TMediaTimeContext(): iScaleQ16 (1 << 16), iInverseScaleQ16 (1 << 16)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   135
		{/*do nothing*/};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   136
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   137
	void SetScaleQ16(TInt32 aScaleQ16, TInt64 aWallTimeNow);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   138
public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   139
	TInt64 iWallTimeBase;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   140
	TInt64 iMediaTimeBase;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   141
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   142
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   143
	 * Scale ranges map to modes of playback.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   144
	 * A Q16 value relative to a 1X forward advancement of the media clock.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   145
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   146
	TInt32 iScaleQ16;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   147
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   148
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   149
	 * The reciprocal of iScaleQ16 (i.e. 1 / iScaleQ16), but adjusted for the
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   150
	 * Q16 format.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   151
	 * 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   152
	 * It therefore has the value 2^32 / iScaleQ16.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   153
	 * 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   154
	 * If iScaleQ16 == 0, this field takes the value KMaxTInt (2^31 - 1)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   155
	 * 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   156
	 * If magnitude of iInverseScaleQ16 would be too large for a signed 32-bit
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   157
	 * value, the value is clipped to KMaxTInt or KMinTInt (-2^31 or
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   158
	 * (2^31 - 1)). This can only happen if iScaleQ16 == +/- 1.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   159
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   160
	TInt32 iInverseScaleQ16;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   161
	};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   162
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   163
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   164
 * 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   165
 *
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   166
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   167
class TRequestDeltaQue
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   168
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   169
public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   170
	TRequestDeltaQue();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   171
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   172
	void Add(TMediaRequest* aElement, TInt64 aDelta);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   173
	TMediaRequest* RemoveFirst();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   174
	TBool FirstDelta(TInt64& aDelta) const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   175
	void RecalculateAndReorder(TMediaTimeContext& aMTC);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   176
	TBool IsEmpty() const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   177
	TUint Count() const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   178
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   179
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   180
	TBool InsertBeforeFoundPosition(TInt64 aDelta, TMediaRequest*& aItem) const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   181
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   182
#ifdef _DEBUG
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   183
	void DbgCheck() const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   184
#endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   185
#ifdef _OMXIL_COMMON_DEBUG_TRACING_ON
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   186
	void DbgPrint() const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   187
#endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   188
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   189
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   190
	TMediaRequest* iHead;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   191
	TInt iCount;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   192
	};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   193
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   194
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   195
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   196
 * 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   197
 *
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   198
 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   199
class CClockSupervisor : public CBase
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   200
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   201
public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   202
#ifdef STABILITY_TEST_WRAPPER
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   203
	friend class CStabilityTestWrapper;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   204
	friend class CStabilityTestNegativeWrapper;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   205
#endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   206
friend class CClockThreadNotifier;	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   207
public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   208
	static CClockSupervisor* NewL(COmxILClockProcessingFunction& aCallbacks);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   209
	~CClockSupervisor();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   210
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   211
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   212
	 * Defines how a request arrived at the clock component
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   213
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   214
	enum TEntryPoint
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   215
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   216
		EGetConfig,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   217
		ESetConfig
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   218
		};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   219
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   220
	// Producer function
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   221
	// Invoked via clients of this component, i.e. GetConfig() and SetConfig()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   222
	OMX_ERRORTYPE ProduceRequest(OMX_INDEXTYPE aIndex, TEntryPoint aEntryPoint,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   223
								 TAny* aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   224
								 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   225
	const OMX_TIME_CONFIG_CLOCKSTATETYPE GetMediaClockState() const
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   226
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   227
		return iMediaClockState;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   228
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   229
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   230
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   231
	CClockSupervisor(COmxILClockProcessingFunction& aProcessingFunction);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   232
	void ConstructL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   233
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   234
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   235
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   236
	// This section describes the Clock thread related functions
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   237
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   238
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   239
	// The timing thread's entry point
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   240
	static TInt ThreadEntryPoint(TAny* aPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   241
	void RunTimingThreadL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   242
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   243
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   244
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   245
	// This section describes the request handler functions
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   246
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   247
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   248
	// From the Audio/Video feeds
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   249
	OMX_ERRORTYPE HandleUpdateAudioReference(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   250
	OMX_ERRORTYPE HandleUpdateVideoReference(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   251
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   252
	// From the OMX component
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   253
	OMX_ERRORTYPE HandleSetPortClientStartTime(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   254
	OMX_ERRORTYPE HandleSubmitMediaTimeRequest(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   255
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   256
	// From the IL client
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   257
	OMX_ERRORTYPE HandleGetSetTimeScale(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   258
	OMX_ERRORTYPE HandleGetSetSeekMode(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   259
	OMX_ERRORTYPE HandleGetSetClockState(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   260
	OMX_ERRORTYPE HandleGetSetActiveRefClock(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   261
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   262
	// Called from either IL client or IL components
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   263
	OMX_ERRORTYPE HandleQueryCurrentWallTime(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   264
	OMX_ERRORTYPE HandleQueryCurrentMediaTime(TEntryPoint aEntry, OMX_PTR aPassedStructPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   265
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   266
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   267
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   268
	// This section describes the Clock components internal house-keeping 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   269
	// routines
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   270
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   271
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   272
	// Perform actions related to placing the clock into the Stopped state
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   273
	void DoTransitionToStoppedState();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   274
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   275
	// Perform actions related to placing the clock into the Running state
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   276
	void DoTransitionToRunningState();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   277
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   278
	// Perform actions related to placing the clock into the Waiting state
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   279
	void DoTransitionToWaitingState(OMX_U32 nWaitMask);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   280
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   281
	// Update the tick counter, generating higher 32 bits
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   282
	void UpdateWallTicks();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   283
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   284
	// Consumer function
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   285
	// Invoked at initialisation and runs in event loop.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   286
	TInt ConsumeRequests();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   287
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   288
	// The timer loop to enable us to wake up on heart beat or requests
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   289
	void TimerLoop();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   290
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   291
	// obtains the most appropriate start time based on scale (direction)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   292
	void CalculateStartTime();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   293
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   294
	// reports whether all clients have reported their start times
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   295
	TBool AllStartTimesReported();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   296
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   297
	TInt64 WallTime();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   298
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   299
	void UpdateMediaTime(TInt64 aMediaTime);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   300
	void BroadcastUpdate(const OMX_TIME_MEDIATIMETYPE& aUpdate);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   301
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   302
	// reports error when clock thread panics
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   303
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   304
	void ReportClockThreadPanic();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   305
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   306
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   307
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   308
	// This section describes the clock's miscellaneous structures
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   309
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   310
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   311
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   312
	 * State of the clock component's media clock:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   313
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   314
	OMX_TIME_CONFIG_CLOCKSTATETYPE iMediaClockState;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   315
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   316
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   317
	 * Choice of the clock component's reference clock:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   318
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   319
	OMX_TIME_REFCLOCKTYPE iActiveRefClock;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   320
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   321
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   322
	 * Array of clients' start times:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   323
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   324
	RArray<TInt64> iStartTimes;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   325
	TUint iStartTimesSet;			/* bit mask representing which elements of
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   326
	                                   the start time array are valid */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   327
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   328
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   329
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   330
	// This section describes the Clock component's routing structures
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   331
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   332
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   333
	/*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   334
	 * typedef for function to handle incoming requests
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   335
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   336
	typedef OMX_ERRORTYPE (CClockSupervisor::*FunctionPtr)(TEntryPoint, OMX_PTR);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   337
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   338
	/*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   339
	 * Function jump table. Note that this is declared in class scope so that the table
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   340
	 * definition has access to private methods.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   341
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   342
	static const FunctionPtr iJumpTable[];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   343
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   344
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   345
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   346
	// This section describes the Clock component's Timer Control
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   347
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   348
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   349
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   350
	 * Holds the current Wall Clock. The duration of a 'tick' is platform specific.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   351
	 * This needs to be 4-byte aligned to allow for atomic access.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   352
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   353
	OMX_TICKS iWallTicks;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   354
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   355
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   356
	 * Encapsulates the relationship between wall time and media time.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   357
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   358
	TMediaTimeContext iMtc;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   359
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   360
	// conversion factors from wall 'ticks' to microseconds
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   361
	TInt iMicroConvNum;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   362
	TInt iMicroConvDen;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   363
	TInt iMicroConvShift;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   364
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   365
	// maximum time between calls to WallTime() - avoids 32-bit counter overflow
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   366
	TInt iHeartbeatTimerInterval;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   367
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   368
	// on some platforms User::FastCounter() counts backwards
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   369
	TBool iSystemClockReversed;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   370
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   371
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   372
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   373
	// This section describes the Clock component's thread and other resources
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   374
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   375
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   376
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   377
	 * This Clock component object needs to run in a high priority thread as it 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   378
	 * represents the OMX component timings
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   379
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   380
	RThread iThread;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   381
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   382
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   383
	 * Thread access control Mutex, 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   384
	 * used to control updating of the components requests by mutiple threads
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   385
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   386
	RMutex iQueMutex;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   387
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   388
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   389
	 * Event timer to wake up this object to complete fulfillment of a request
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   390
	 * This handle belongs to the High-Pri thread
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   391
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   392
	RTimer iTimer;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   393
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   394
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   395
	 * Flags to control timing thread exit/destroy.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   396
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   397
	TBool iThreadStarted;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   398
	TBool iThreadRunning;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   399
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   400
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   401
	 * Complete this status on the timing thread to interrupt the timer sleep.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   402
	 * Timer itself can't be cancelled since timer handle is local to timing
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   403
	 * thread.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   404
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   405
	TRequestStatus iCancelStatus;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   406
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   407
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   408
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   409
	// This section describes the Clock component's request management 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   410
	// infrastructure
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   411
	//////////////
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   412
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   413
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   414
	 * Pending Media Time Requests
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   415
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   416
	TRequestDeltaQue iPendingRequestQue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   417
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   418
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   419
	 * The free queue header.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   420
	 * Items ared remove from here and placed on the pending queue.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   421
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   422
	TRequestDeltaQue iFreeRequestQue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   423
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   424
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   425
	 * memory block where request list nodes are allocated
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   426
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   427
	TMediaRequest* iRequestBlock;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   428
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   429
	/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   430
	 * Max number of request list nodes allocated
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   431
	 */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   432
	const TUint iMaxRequests;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   433
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   434
	COmxILClockProcessingFunction& iProcessingFunction;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   435
	}; // class CClockSupervisor
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   436
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   437
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   438
#endif // CLOCKSUPERVISOR_H_