omxilvideocomps/omxilgraphicsink/src/omxilgraphicsinkprocessingfunction.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
 @file
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    20
 @internalComponent
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    21
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    22
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    23
#include "log.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    24
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    25
#include "omxilgraphicsinkprocessingfunction.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    26
#include "omxilgraphicsinktrace.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    27
#include "omxilgraphicsinkpanics.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    28
#include "omxilgraphicsinkvpb0port.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    29
#include <hal.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    30
#include <graphics/suerror.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    31
#include "omxilgraphicsinkextensionsindexes.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    32
#include <openmax/il/shai/OMX_Symbian_ComponentExt.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    33
#include <openmax/il/common/omxilcallbacknotificationif.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    34
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    35
// Constant numbers
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    36
#ifndef __WINSCW__
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    37
const TInt KRefGfxAlignment = RSurfaceManager::EPageAligned;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    38
#else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    39
const TInt KRefGfxAlignment = 2;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    40
#endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    41
static const TBool KRefGfxContiguous = ETrue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    42
static const TInt KSurfaceUpdateNumOfMessageSlots = 4;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    43
static const TUint32 KNullTickCount = 0xFFFFFFFF;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    44
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    45
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    46
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    47
Create a new processing function object.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    48
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    49
@param 	aCallbacks The callback manager interface for processing function.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    50
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    51
@return A pointer to the processing function object to be created.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    52
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    53
COmxILGraphicSinkProcessingFunction*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    54
COmxILGraphicSinkProcessingFunction::NewL(MOmxILCallbackNotificationIf& aCallbacks)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    55
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    56
	COmxILGraphicSinkProcessingFunction* self =
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    57
		new (ELeave)COmxILGraphicSinkProcessingFunction(aCallbacks);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    58
	CleanupStack::PushL(self);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    59
	self->ConstructL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    60
	CleanupStack::Pop(self);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    61
	return self;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    62
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    63
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    64
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    65
Second phase construction for the processing function. Loads the device driver for surface manager and initializes the surface attributes.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    66
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    67
void
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    68
COmxILGraphicSinkProcessingFunction::ConstructL()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    69
	{	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    70
    iTransitionToPauseWait = new(ELeave) CActiveSchedulerWait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    71
    User::LeaveIfError(iTransitionToPauseWaitSemaphore.CreateLocal(0));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    72
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    73
    //record the ID of the creator thread for later use
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    74
    iOwnerThreadId = RThread().Id();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    75
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    76
	iGraphicSurfaceAccess = CGraphicSurfaceAccess::NewL(*this);	        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    77
	iPFHelper = CPFHelper::NewL(*this, *iGraphicSurfaceAccess);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    78
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    79
	User::LeaveIfError(iBufferMutex.CreateLocal());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    80
	InitSurfaceAttributes();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    81
    iState = OMX_StateLoaded;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    82
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    83
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    84
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    85
Constructor of the class.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    86
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    87
@param 	aCallbacks The callback manager interface for processing function.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    88
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    89
COmxILGraphicSinkProcessingFunction::COmxILGraphicSinkProcessingFunction(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    90
		MOmxILCallbackNotificationIf& aCallbacks)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    91
	:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    92
	COmxILProcessingFunction(aCallbacks)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    93
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    94
	HAL::Get(HALData::EFastCounterFrequency,iFastCounterFrequency);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    95
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    96
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    97
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    98
Destructor of the class.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    99
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   100
COmxILGraphicSinkProcessingFunction::~COmxILGraphicSinkProcessingFunction()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   101
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   102
    delete iTransitionToPauseWait;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   103
    iTransitionToPauseWaitSemaphore.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   104
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   105
	// Check in case the driver has not been closed. That would happen in
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   106
	// an scenario where the component is deleted while being in
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   107
	// OMX_StateExecuting state.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   108
	if(iPFHelper &&
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   109
	   (iState == OMX_StateInvalid  ||
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   110
	    iState == OMX_StateExecuting ||
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   111
	    iState == OMX_StatePause))
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   112
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   113
		// Ignore error if the following call fails
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   114
		iPFHelper->StopSync();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   115
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   116
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   117
	delete iPFHelper;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   118
	delete iGraphicSurfaceAccess;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   119
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   120
	iSurfaceManager.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   121
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   122
	// Buffer headers are not owned by the processing function
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   123
	iBuffersToEmpty.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   124
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   125
	iBufferMutex.Close();
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
This method provides the state change information within the processing function so that appropriate action can be taken. 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   130
This state change information is provided by the FSM on behalf of the IL Client.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   131
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   132
@param 	aNewState The new state of FSM.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   133
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   134
@return  OMX_ErrorNone if successful
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   135
         OMX_ErrorInsufficientResources if fail to start GraphicSink frame acceptor
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   136
         OMX_ErrorIncorrectStateTransition if unsupported state
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   137
         Any other OpenMAX IL wide error code
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   138
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   139
OMX_ERRORTYPE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   140
COmxILGraphicSinkProcessingFunction::StateTransitionIndication(TStateIndex aNewState)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   141
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   142
	switch(aNewState)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   143
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   144
	case EStateExecuting:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   145
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   146
		return iPFHelper->ExecuteAsync();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   147
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   148
	case EStateInvalid:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   149
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   150
		return iPFHelper->StopAsync();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   151
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   152
	case EStatePause:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   153
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   154
		// must be done immediately
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   155
		OMX_ERRORTYPE omxErr = iPFHelper->Pause();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   156
		if(omxErr == OMX_ErrorNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   157
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   158
			WaitForTransitionToPauseToFinish();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   159
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   160
	    return omxErr;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   161
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   162
	case EStateIdle:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   163
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   164
		iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   165
		iBuffersToEmpty.Reset();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   166
		iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   167
		iState = OMX_StateIdle;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   168
		return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   169
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   170
	case EStateLoaded:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   171
	case EStateWaitForResources:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   172
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   173
		return iPFHelper->StopAsync();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   174
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   175
	case ESubStateLoadedToIdle:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   176
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   177
	    // Open a channel to the surface manager logical device driver. 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   178
	    TInt err = iSurfaceManager.Open();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   179
	    if ( err != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   180
	        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   181
	        return OMX_ErrorHardware;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   182
	        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   183
	    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   184
	    if (iPFHelper->OpenDevice() != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   185
	        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   186
            return OMX_ErrorInsufficientResources;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   187
	        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   188
	    /*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   189
	    if (iGraphicSinkPort->ValidateStride() != OMX_ErrorNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   190
	        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   191
            return OMX_ErrorUnsupportedSetting;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   192
	        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   193
	    return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   194
	    */
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   195
	    return iGraphicSinkPort->ValidateStride();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   196
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   197
	case ESubStateIdleToLoaded:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   198
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   199
		return iPFHelper->CloseDevice();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   200
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   201
	case ESubStateExecutingToIdle:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   202
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   203
		// must be done immediately
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   204
		return iPFHelper->StopAsync();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   205
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   206
	case ESubStatePauseToIdle:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   207
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   208
		// Ignore these transitions...
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   209
		return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   210
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   211
	default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   212
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   213
		return OMX_ErrorIncorrectStateTransition;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   214
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   215
		};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   216
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   217
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   218
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   219
Flushes all the buffers retained by the processing function and sends it to either IL Client or the Tunelled component, as the case may be.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   220
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   221
@param 	aPortIndex Port index used to flush buffers from a given port of the component.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   222
@param  aDirection This describes the direction of the port.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   223
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   224
@return OMX_ErrorNone if successful;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   225
		Any other OpenMAX IL wide error code;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   226
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   227
OMX_ERRORTYPE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   228
COmxILGraphicSinkProcessingFunction::BufferFlushingIndication(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   229
	TUint32 aPortIndex,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   230
	OMX_DIRTYPE aDirection)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   231
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   232
	iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   233
    if ((aPortIndex == OMX_ALL && aDirection == OMX_DirMax) ||
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   234
		(aPortIndex == 0 && aDirection == OMX_DirInput))
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   235
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   236
	    // Send BufferDone notifications for each buffer...
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   237
		if(iBufferOnScreen)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   238
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   239
			iCallbacks.BufferDoneNotification(iBufferOnScreen, 0, OMX_DirInput);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   240
			iBufferOnScreen = NULL;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   241
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   242
		const TUint bufferCount = iBuffersToEmpty.Count();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   243
		OMX_BUFFERHEADERTYPE* pBufferHeader = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   244
		for (TUint i=0; i<bufferCount; i++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   245
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   246
			pBufferHeader = iBuffersToEmpty[i];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   247
			pBufferHeader->nTickCount = KNullTickCount;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   248
			iCallbacks.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   249
				BufferDoneNotification(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   250
					pBufferHeader,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   251
					pBufferHeader->nInputPortIndex,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   252
					OMX_DirInput
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   253
					);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   254
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   255
		// Empty buffer lists...
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   256
		iBuffersToEmpty.Reset();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   257
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   258
		iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   259
		return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   260
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   261
	else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   262
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   263
		iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   264
		return OMX_ErrorBadParameter;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   265
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   266
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   267
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   268
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   269
Update the structure corresponding to the given index which belongs to the static parameters list.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   270
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   271
@param 	aParamIndex The index representing the desired structure to be updated.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   272
@param  aComponentParameterStructure A pointer to structure which has the desired settings that will be used to update the Processing function.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   273
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   274
@return OMX_ErrorNone if successful;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   275
		OMX_ErrorUnsupportedIndex if unsupported index;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   276
		OMX_ErrorUnsupportedSetting if pixel format is EUidPixelFormatUnknown;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   277
		Any other OpenMAX IL wide error code;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   278
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   279
OMX_ERRORTYPE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   280
COmxILGraphicSinkProcessingFunction::ParamIndication(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   281
	OMX_INDEXTYPE aParamIndex,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   282
	const TAny* apComponentParameterStructure)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   283
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   284
	DEBUG_PRINTF(_L8("COmxILGraphicSinkProcessingFunction::PortParamIndication"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   285
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   286
	switch(aParamIndex)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   287
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   288
		case OMX_IndexParamPortDefinition:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   289
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   290
			const OMX_PARAM_PORTDEFINITIONTYPE* portDefinition = static_cast<const OMX_PARAM_PORTDEFINITIONTYPE*>(apComponentParameterStructure);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   291
			
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   292
			//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   293
			// All the fields in SurfaceAttribute structure should be updated.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   294
			//
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   295
			iGraphicSurfaceSettings.iSurfaceAttributes.iSize.iWidth = portDefinition->format.video.nFrameWidth;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   296
			iGraphicSurfaceSettings.iSurfaceAttributes.iSize.iHeight = portDefinition->format.video.nFrameHeight;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   297
			
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   298
			// Need to convert OMX Color Format to TUidPixelFormat.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   299
			TUidPixelFormat pixelFormat = ConvertPixelFormat(portDefinition->format.video.eColorFormat);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   300
			if(pixelFormat == EUidPixelFormatUnknown)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   301
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   302
                return OMX_ErrorUnsupportedSetting;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   303
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   304
			else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   305
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   306
                iGraphicSurfaceSettings.iSurfaceAttributes.iPixelFormat = pixelFormat;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   307
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   308
			
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   309
			iGraphicSurfaceSettings.iSurfaceAttributes.iBuffers = portDefinition->nBufferCountActual;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   310
			iGraphicSurfaceSettings.iSurfaceAttributes.iStride = portDefinition->format.video.nStride;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   311
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   312
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   313
		case OMX_IndexParamVideoPortFormat:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   314
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   315
			const OMX_VIDEO_PARAM_PORTFORMATTYPE* videoPortFormat = static_cast<const OMX_VIDEO_PARAM_PORTFORMATTYPE*>(apComponentParameterStructure);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   316
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   317
			// only OMX_COLOR_FORMATTYPE eColorFormat to be used for SurfaceAttributes.iPixelFormat		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   318
			TUidPixelFormat pixelFormat = ConvertPixelFormat(videoPortFormat->eColorFormat);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   319
			if(pixelFormat == EUidPixelFormatUnknown)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   320
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   321
				return OMX_ErrorUnsupportedSetting;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   322
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   323
			else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   324
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   325
                iGraphicSurfaceSettings.iSurfaceAttributes.iPixelFormat = pixelFormat;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   326
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   327
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   328
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   329
		default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   330
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   331
			return OMX_ErrorUnsupportedIndex;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   332
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   333
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   334
	return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   335
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   336
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   337
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   338
Update the structure corresponding to the given index which belongs to the dynamic configuration list.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   339
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   340
@param 	aConfigIndex The index representing the desired structure to be updated.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   341
@param  aComponentConfigStructure A pointer to structure which has the desired settings that will be used to update the Processing function.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   342
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   343
@return OMX_ErrorNone if successful;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   344
		OMX_ErrorUnsupportedIndex if unsupported index;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   345
		OMX_ErrorUnsupportedSetting if SurfaceConfiguration returns error;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   346
		Any other OpenMAX IL wide error code;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   347
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   348
OMX_ERRORTYPE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   349
COmxILGraphicSinkProcessingFunction::ConfigIndication(OMX_INDEXTYPE aConfigIndex,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   350
													  const TAny* apComponentConfigStructure)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   351
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   352
	DEBUG_PRINTF(_L8("COmxILGraphicSinkProcessingFunction::ConfigIndication"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   353
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   354
	TInt err = KErrNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   355
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   356
	switch(aConfigIndex)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   357
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   358
	    case OMX_SymbianIndexConfigSharedChunkMetadata:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   359
            {           
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   360
            const OMX_SYMBIAN_CONFIG_SHAREDCHUNKMETADATATYPE*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   361
                pSharedChunkMetadata
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   362
                = static_cast<
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   363
                const OMX_SYMBIAN_CONFIG_SHAREDCHUNKMETADATATYPE*>(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   364
                    apComponentConfigStructure);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   365
 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   366
            iGraphicSurfaceAccess->iSharedChunkHandleId = pSharedChunkMetadata->nHandleId;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   367
            iGraphicSurfaceAccess->iSharedChunkThreadId = pSharedChunkMetadata->nOwnerThreadId;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   368
            
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   369
            iGraphicSurfaceAccess->iIsLocalChunk = EFalse;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   370
            break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   371
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   372
		case OMX_IndexConfigCommonScale:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   373
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   374
			const OMX_CONFIG_SCALEFACTORTYPE* scaleFactor = static_cast<const OMX_CONFIG_SCALEFACTORTYPE*>(apComponentConfigStructure);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   375
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   376
			err = iGraphicSurfaceSettings.iSurfaceConfig.SetExtent(TRect(TSize(scaleFactor->xWidth, scaleFactor->xHeight)));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   377
			if(err != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   378
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   379
				return OMX_ErrorUnsupportedSetting;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   380
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   381
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   382
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   383
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   384
		case OMX_IndexConfigCommonOutputSize:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   385
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   386
			const OMX_FRAMESIZETYPE* frameSize = static_cast<const OMX_FRAMESIZETYPE*>(apComponentConfigStructure);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   387
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   388
			err = iGraphicSurfaceSettings.iSurfaceConfig.SetExtent(TRect(TSize(frameSize->nWidth, frameSize->nHeight)));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   389
			if(err != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   390
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   391
				return OMX_ErrorUnsupportedSetting;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   392
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   393
			
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   394
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   395
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   396
		case OMX_IndexConfigCommonInputCrop:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   397
		case OMX_IndexConfigCommonOutputCrop:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   398
		case OMX_IndexConfigCommonExclusionRect:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   399
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   400
			const OMX_CONFIG_RECTTYPE* rec = static_cast<const OMX_CONFIG_RECTTYPE*>(apComponentConfigStructure);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   401
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   402
			err = iGraphicSurfaceSettings.iSurfaceConfig.SetExtent(TRect(TPoint(rec->nTop, rec->nLeft), TSize(rec->nWidth, rec->nHeight)));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   403
			if(err != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   404
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   405
				return OMX_ErrorUnsupportedSetting;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   406
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   407
						
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   408
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   409
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   410
		default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   411
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   412
			return OMX_ErrorUnsupportedIndex;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   413
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   414
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   415
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   416
	return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   417
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   418
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   419
void COmxILGraphicSinkProcessingFunction::SetSharedChunkBufConfig(TMMSharedChunkBufConfig aSharedChunkBufConfig)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   420
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   421
    iGraphicSurfaceAccess->iSharedChunkBufConfig = aSharedChunkBufConfig;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   422
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   423
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   424
void COmxILGraphicSinkProcessingFunction::GetSharedChunkMetadata(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   425
    OMX_U32& aHandleId,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   426
    OMX_U64& aThreadId) const
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   427
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   428
    aHandleId = iGraphicSurfaceAccess->iSharedChunkHandleId;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   429
    aThreadId = iGraphicSurfaceAccess->iSharedChunkThreadId;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   430
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   431
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   432
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   433
This method is invoked whenever the component is requested to emtpy/display the contents of the buffers passed as function arguments.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   434
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   435
@param 	apBufferHeader A pointer to buffer header.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   436
@param  aDirection provides the direction either input or output. This can be used as a further check whether buffers received are valid or not.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   437
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   438
@return OMX_ErrorNone if successful;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   439
		Any other OpenMAX IL wide error code;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   440
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   441
OMX_ERRORTYPE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   442
COmxILGraphicSinkProcessingFunction::BufferIndication(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   443
	OMX_BUFFERHEADERTYPE* apBufferHeader,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   444
	OMX_DIRTYPE aDirection)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   445
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   446
    if (aDirection != OMX_DirInput)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   447
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   448
        return OMX_ErrorBadParameter;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   449
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   450
    //The nTickCount is just internal here, stored temporarily. So it is count not time period.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   451
    apBufferHeader->nTickCount = User::FastCounter();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   452
    iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   453
    OMX_ERRORTYPE ret = OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   454
    if (iBuffersToEmpty.Append(apBufferHeader) != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   455
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   456
        apBufferHeader->nTickCount = KNullTickCount;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   457
        ret = OMX_ErrorInsufficientResources;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   458
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   459
    else if (iState != OMX_StateExecuting)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   460
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   461
        // If Component not in an executing state delay processing buffer
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   462
        ret = OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   463
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   464
    else if (iPFHelper->BufferIndication() != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   465
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   466
        apBufferHeader->nTickCount = KNullTickCount;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   467
        ret = OMX_ErrorInsufficientResources;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   468
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   469
    iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   470
    return ret;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   471
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   472
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   473
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   474
This method is used to check whether the required buffer is held by the processing function or not.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   475
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   476
@param 	apBufferHeader A pointer to buffer header being searched.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   477
@param  aDirection provides the direction either input or output. This can be used as a further check whether buffers received are valid or not.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   478
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   479
@return OMX_TRUE if find the buffer;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   480
		OMX_FALSE if fail to find the buffer;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   481
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   482
OMX_BOOL
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   483
COmxILGraphicSinkProcessingFunction::BufferRemovalIndication(
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   484
	OMX_BUFFERHEADERTYPE* apBufferHeader,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   485
	OMX_DIRTYPE /* aDirection */)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   486
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   487
    TBool headerDeletionResult = ETrue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   488
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   489
	TInt headerIndexInArray = KErrNotFound;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   490
	iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   491
	if (KErrNotFound !=
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   492
		(headerIndexInArray =
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   493
		 iBuffersToEmpty.Find(apBufferHeader)))
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   494
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   495
		iBuffersToEmpty.Remove(headerIndexInArray);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   496
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   497
	else if(iBufferOnScreen == apBufferHeader)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   498
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   499
		iBufferOnScreen = NULL;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   500
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   501
	else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   502
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   503
		headerDeletionResult = EFalse;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   504
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   505
	iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   506
    return (headerDeletionResult ? OMX_TRUE : OMX_FALSE);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   507
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   508
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   509
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   510
This method creates COmxILMMBuffer class object. Also creates surface and allocates the chunks based on the number of buffers, 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   511
maps the surface in the given process. It also allocates the resources like creating the message queue and other necessary C 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   512
class objects. This method gets called when the component acts as buffer supplier.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   513
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   514
@param 	aPortSpecificBuffer gives the starting address of the specific buffer.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   515
@param  aPortPrivate gives the private data which is COmxILMMBuffer pointer in this case.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   516
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   517
@leave  OMX_ErrorNone if successful;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   518
@leave  OMX_ErrorInsufficientResources if function returns KErrNoMemory;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   519
@leave  OMX_ErrorBadParameter if function returns errors except KErrNoMemory;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   520
@leave  Any other OpenMAX IL wide error code;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   521
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   522
void COmxILGraphicSinkProcessingFunction::CreateBufferL(OMX_U8*& aPortSpecificBuffer, OMX_PTR& aPortPrivate, OMX_U32 aBufferCountActual)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   523
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   524
	iGraphicSurfaceAccess->CreateBufferL(aPortSpecificBuffer, aPortPrivate, aBufferCountActual);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   525
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   526
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   527
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   528
Destroy MM buffer, close surface, and deallocate other resources like message queue and C class objects. This is called when component
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   529
acts as buffer supplier.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   530
@param  apPortPrivate gives the private data which is COmxILMMBuffer pointer in this case.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   531
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   532
void COmxILGraphicSinkProcessingFunction::DestroyBuffer(OMX_PTR /*apPortPrivate*/)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   533
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   534
    if( iGraphicSurfaceAccess )
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   535
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   536
        iGraphicSurfaceAccess->iBufferIdGenerator--;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   537
         // to reset surface id in case client requests different settings.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   538
         if(iGraphicSurfaceAccess->iBufferIdGenerator == 0)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   539
             {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   540
             iGraphicSurfaceAccess->ResetSurfaceId();        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   541
             iGraphicSurfaceAccess->CloseChunk();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   542
             }   
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   543
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   544
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   545
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   546
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   547
Creates the surface by utilizing the buffers passed via application private data. It then maps the surface in the given process. 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   548
It also allocates the resources like creating the message queue and other necessary C class objects. This method gets called when 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   549
the component acts as non buffer supplier.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   550
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   551
@param aSizeBytes The size of buffer.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   552
@param apBuffer gives the starting address of the specific buffer.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   553
@param aAppPrivate provides the private data which is COmxILMMBuffer pointer in this case and holds details of buffers already allocated.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   554
@param aBufferCountActual The actual number of buffers.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   555
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   556
@leave  OMX_ErrorNone if successful;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   557
@leave  OMX_ErrorInsufficientResources if aPortPrivate is null or functions return KErrNoMemory;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   558
@leave	OMX_ErrorBadParameter if functions return errors except KErrNoMemory;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   559
@leave	Any other OpenMAX IL wide error code;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   560
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   561
void COmxILGraphicSinkProcessingFunction::InitBufferL(OMX_U32 aSizeBytes, OMX_U8* apBuffer, OMX_U32 aBufferCountActual)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   562
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   563
	iGraphicSurfaceAccess->InitBufferL(aSizeBytes, apBuffer, aBufferCountActual);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   564
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   565
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   566
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   567
Deallocate resources like message queue and C class objects. This is called when component acts as non buffer supplier.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   568
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   569
void COmxILGraphicSinkProcessingFunction::DeInitBuffer()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   570
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   571
	// to reset surface id in case client requests different settings.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   572
	if(iGraphicSurfaceAccess)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   573
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   574
		iGraphicSurfaceAccess->ResetSurfaceId(); 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   575
		iGraphicSurfaceAccess->CloseChunk();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   576
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   577
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   578
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   579
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   580
Initialise surface attribute structure.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   581
*/	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   582
void COmxILGraphicSinkProcessingFunction::InitSurfaceAttributes()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   583
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   584
	RSurfaceManager::TSurfaceCreationAttributes* attr = &iGraphicSurfaceSettings.iSurfaceAttributes;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   585
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   586
	attr->iAlignment = KRefGfxAlignment;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   587
	attr->iContiguous = KRefGfxContiguous;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   588
	attr->iCacheAttrib = RSurfaceManager::ENotCached;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   589
	attr->iMappable = ETrue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   590
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   591
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   592
TUidPixelFormat COmxILGraphicSinkProcessingFunction::ConvertPixelFormat(OMX_COLOR_FORMATTYPE aColorFormat)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   593
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   594
	switch(aColorFormat)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   595
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   596
		// OMX "Planar" formats not currently supported by GraphicSink since data comes in more than one buffer.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   597
		// "PackedPlanar" formats can be added easily provided the GCE backend supports them.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   598
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   599
		case OMX_COLOR_Format16bitRGB565:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   600
			return EUidPixelFormatRGB_565;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   601
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   602
		case OMX_COLOR_Format32bitARGB8888:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   603
			return EUidPixelFormatARGB_8888;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   604
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   605
		case OMX_COLOR_FormatYCrYCb:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   606
			return EUidPixelFormatYUV_422Reversed;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   607
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   608
		case OMX_COLOR_FormatCbYCrY:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   609
			return EUidPixelFormatYUV_422Interleaved;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   610
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   611
		// Need to map color format to Symbian pixel format.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   612
		default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   613
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   614
			return EUidPixelFormatUnknown;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   615
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   616
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   617
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   618
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   619
void COmxILGraphicSinkProcessingFunction::WaitForTransitionToPauseToFinish()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   620
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   621
    if(RThread().Id() == iOwnerThreadId)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   622
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   623
        //if the owner thread is the same thread as the one created the active objects in this processing function
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   624
        //then we can wait by using CActiveSchedulerWait
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   625
        DEBUG_PRINTF(_L8("GraphicSinkProcessingFunction::WaitForTransitionToPauseToFinish - blocking transition to pause with active scheduler wait now"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   626
        iTransitionToPauseWait->Start();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   627
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   628
    else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   629
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   630
        //if this is a thread different from the creator thread then semaphore is needed to block this thread until the transition
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   631
        //to paused state completes
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   632
        DEBUG_PRINTF(_L8("GraphicSinkProcessingFunction::WaitForTransitionToPauseToFinish - blocking thread with semaphore now"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   633
        iTransitionToPauseWaitSemaphore.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   634
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   635
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   636
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   637
void COmxILGraphicSinkProcessingFunction::TransitionToPauseFinished()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   638
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   639
    if(iTransitionToPauseWait->IsStarted())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   640
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   641
        DEBUG_PRINTF(_L8("GraphicSinkProcessingFunction::TransitionToPauseFinished - unblocking transition to pause (active scheduler wait) now"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   642
        iTransitionToPauseWait->AsyncStop();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   643
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   644
    else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   645
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   646
        DEBUG_PRINTF(_L8("GraphicSinkProcessingFunction::TransitionToPauseFinished - unblocking transition to pause (semaphore) now"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   647
        iTransitionToPauseWaitSemaphore.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   648
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   649
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   650
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   651
COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess* COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::NewL(COmxILGraphicSinkProcessingFunction& aParent)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   652
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   653
	return new (ELeave) CGraphicSurfaceAccess(aParent);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   654
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   655
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   656
COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::CGraphicSurfaceAccess(COmxILGraphicSinkProcessingFunction& aParent)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   657
: CActive(EPriorityStandard),
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   658
  iIsLocalChunk(ETrue),
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   659
  iParent(aParent)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   660
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   661
	CActiveScheduler::Add(this);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   662
	iSurfaceId = TSurfaceId::CreateNullId();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   663
	iOffsetArray.Reset();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   664
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   665
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   666
void COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::CloseChunk()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   667
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   668
    if(iChunk.Handle())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   669
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   670
        iChunk.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   671
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   672
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   673
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   674
COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::~CGraphicSurfaceAccess()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   675
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   676
	Cancel();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   677
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   678
	CloseChunk();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   679
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   680
	if (!iSurfaceId.IsNull())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   681
	    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   682
	    iParent.SurfaceManager().CloseSurface(iSurfaceId);	// ignore the error
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   683
	    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   684
    #ifdef ILCOMPONENTCONFORMANCE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   685
	iArrayOffsets.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   686
    #endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   687
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   688
	iOffsetArray.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   689
	iSurfaceUpdateSession.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   690
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   691
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   692
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   693
void COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::RunL()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   694
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   695
	// The buffer is not on the list implies that they have already been flushed/spotted 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   696
	// via BufferFlushingIndication/BufferRemovalIndication
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   697
	iParent.iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   698
	TInt index = iParent.BuffersToEmpty().Find(iCurrentBuffer);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   699
	if (KErrNotFound != index)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   700
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   701
		switch(iStatus.Int())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   702
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   703
			case KErrNone: 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   704
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   705
				// Consumed all data completely and setting nFilledLen to zero.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   706
				iCurrentBuffer->nFilledLen = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   707
				break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   708
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   709
			case KErrCancel:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   710
			default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   711
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   712
				// Leave actual value of iCurrentBuffer->nFilledLen
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   713
				DEBUG_PRINTF2(_L8("COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::RunL() err = %d"), iStatus.Int());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   714
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   715
			};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   716
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   717
		if(iStatus.Int() != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   718
		    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   719
		    iCurrentBuffer->nTickCount = KNullTickCount;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   720
		    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   721
		else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   722
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   723
			TUint32 currentTickCount = User::FastCounter();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   724
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   725
			// On some hardware boards, tick count decrements as time increases so
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   726
			// need to check which way the counter is going
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   727
			if (currentTickCount >= iCurrentBuffer->nTickCount)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   728
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   729
				iCurrentBuffer->nTickCount = (currentTickCount - iCurrentBuffer->nTickCount) / iParent.GetFastCounterFrequency();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   730
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   731
			else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   732
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   733
				iCurrentBuffer->nTickCount = (iCurrentBuffer->nTickCount - currentTickCount) / iParent.GetFastCounterFrequency();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   734
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   735
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   736
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   737
        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   738
        if(iCurrentBuffer->nFlags & OMX_BUFFERFLAG_EOS)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   739
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   740
            iParent.GetCallbacks().EventNotification(OMX_EventBufferFlag, iCurrentBuffer->nInputPortIndex, iCurrentBuffer->nFlags, NULL);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   741
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   742
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   743
		iCurrentBuffer->nFilledLen = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   744
		iCurrentBuffer->nFlags = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   745
		iCurrentBuffer->nOffset = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   746
		iCurrentBuffer->nTimeStamp = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   747
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   748
		// now sending back to framework..
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   749
		if(iParent.iBufferOnScreen)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   750
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   751
			// Add error handling?
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   752
			iParent.GetCallbacks().BufferDoneNotification(iParent.iBufferOnScreen, iParent.iBufferOnScreen->nInputPortIndex,OMX_DirInput);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   753
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   754
		iParent.iBufferOnScreen = iCurrentBuffer;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   755
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   756
		iParent.BuffersToEmpty().Remove(index);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   757
		iCurrentBuffer = NULL;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   758
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   759
		// check if any more buffers to be consumed..
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   760
		if (ProcessNextBuffer() != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   761
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   762
			iParent.GetCallbacks().ErrorEventNotification(OMX_ErrorInsufficientResources);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   763
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   764
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   765
	iParent.iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   766
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   767
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   768
void COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::CreateBufferL(OMX_U8*& aPortSpecificBuffer, OMX_PTR& aPortPrivate, OMX_U32 aBufferCountActual)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   769
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   770
	if(iSurfaceId.IsNull())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   771
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   772
		// race condition on nBufferCountActual
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   773
		if(aBufferCountActual != iParent.GraphicSurfaceSettings().iSurfaceAttributes.iBuffers)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   774
		    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   775
		    iParent.GraphicSurfaceSettings().iSurfaceAttributes.iBuffers = aBufferCountActual;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   776
		    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   777
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   778
		User::LeaveIfError(iParent.SurfaceManager().CreateSurface(iParent.GraphicSurfaceSettings().iSurfaceAttributesBuf, iSurfaceId));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   779
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   780
		RChunk chunk;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   781
		CleanupClosePushL(chunk);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   782
		User::LeaveIfError(iParent.SurfaceManager().MapSurface(iSurfaceId, chunk));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   783
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   784
		//We need to change the chunk handle to be shared by the whole process.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   785
		RThread thread;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   786
		CleanupClosePushL(thread);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   787
        iChunk.SetHandle(chunk.Handle());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   788
        User::LeaveIfError(iChunk.Duplicate(thread));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   789
		CleanupStack::PopAndDestroy(2, &chunk);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   790
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   791
        // for SetConfig(OMX_SYMBIAN_CONFIG_SHARED_CHUNK_METADATA)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   792
        iSharedChunkHandleId = iChunk.Handle();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   793
        iSharedChunkThreadId = RThread().Id().Id();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   794
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   795
		switch(iParent.iGraphicSurfaceSettings.iSurfaceAttributes.iPixelFormat)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   796
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   797
		case EUidPixelFormatYUV_422Reversed:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   798
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   799
			// fill buffer 0 with black
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   800
			TUint32* data = reinterpret_cast<TUint32*>(iChunk.Base());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   801
			TInt numPixelPairs = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iStride * iParent.GraphicSurfaceSettings().iSurfaceAttributes.iSize.iHeight / 4;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   802
			for(TInt offset = 0; offset < numPixelPairs; offset++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   803
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   804
				data[offset] = 0x80108010;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   805
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   806
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   807
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   808
		case EUidPixelFormatYUV_422Interleaved:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   809
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   810
			// fill buffer 0 with black
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   811
			TUint32* data = reinterpret_cast<TUint32*>(iChunk.Base());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   812
			TInt numPixelPairs = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iStride * iParent.GraphicSurfaceSettings().iSurfaceAttributes.iSize.iHeight / 4;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   813
			for(TInt offset = 0; offset < numPixelPairs; offset++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   814
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   815
				data[offset] = 0x10801080;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   816
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   817
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   818
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   819
		case EUidPixelFormatRGB_565:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   820
		case EUidPixelFormatARGB_8888:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   821
			Mem::FillZ(iChunk.Base(), iParent.GraphicSurfaceSettings().iSurfaceAttributes.iStride * iParent.GraphicSurfaceSettings().iSurfaceAttributes.iSize.iHeight);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   822
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   823
		default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   824
#ifdef _DEBUG
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   825
		    // Panic in a debug build. It will make people think about how the error should be handled.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   826
		    Panic(EUndefinedPixelFormat);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   827
#endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   828
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   829
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   830
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   831
		// Now, GFX needs to make sure that TSurfaceConfiguration has valid surface id
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   832
		// so that IL Client can use RSurfaceManager::SetBackroundSurface()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   833
		User::LeaveIfError(iParent.GraphicSurfaceSettings().iSurfaceConfig.SetSurfaceId(iSurfaceId));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   834
		iParent.iCallbacks.EventNotification(OMX_EventPortSettingsChanged, OMX_NokiaIndexParamGraphicSurfaceConfig, 0, NULL);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   835
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   836
		chunk.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   837
        #ifdef ILCOMPONENTCONFORMANCE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   838
		iIsBufferSupplier = ETrue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   839
        #endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   840
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   841
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   842
	ASSERT(iChunk.Handle());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   843
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   844
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   845
	RSurfaceManager::TInfoBuf surfaceInfoBuf;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   846
	RSurfaceManager::TSurfaceInfoV01& surfaceInfo (surfaceInfoBuf());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   847
	User::LeaveIfError(iParent.SurfaceManager().SurfaceInfo(iSurfaceId, surfaceInfoBuf));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   848
    for (TInt i = 0 ; i < surfaceInfo.iBuffers ; i++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   849
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   850
        TInt offset = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   851
        User::LeaveIfError(iParent.SurfaceManager().GetBufferOffset(iSurfaceId, i, offset));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   852
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   853
        if(iBufferIdGenerator == 0)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   854
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   855
            iOffsetArray.AppendL(offset);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   856
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   857
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   858
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   859
    aPortSpecificBuffer = iChunk.Base() + iOffsetArray[iBufferIdGenerator];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   860
    aPortPrivate = NULL;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   861
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   862
	iBufferIdGenerator++;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   863
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   864
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   865
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   866
#ifndef ILCOMPONENTCONFORMANCE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   867
void COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::InitBufferL(OMX_U32 aSizeBytes, OMX_U8* apBuffer, OMX_U32 aBufferCountActual)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   868
{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   869
    // open chunk at the beginning
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   870
    if(iChunk.Handle() == NULL)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   871
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   872
        // only support chunk extension otherwise error
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   873
        if(iSharedChunkThreadId == NULL || iSharedChunkHandleId == NULL)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   874
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   875
            DEBUG_PRINTF(_L8("COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::InitBufferL handles not valie"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   876
            User::Leave(KErrBadHandle);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   877
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   878
        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   879
        // race condition on nBufferCountActual
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   880
        if(aBufferCountActual != iParent.GraphicSurfaceSettings().iSurfaceAttributes.iBuffers)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   881
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   882
            iParent.GraphicSurfaceSettings().iSurfaceAttributes.iBuffers = aBufferCountActual;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   883
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   884
        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   885
        DEBUG_PRINTF2(_L8("COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::InitBufferL iSharedChunkThreadId = %Lu"), iSharedChunkThreadId);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   886
        DEBUG_PRINTF2(_L8("COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::InitBufferL iSharedChunkHandleId = %Lu"), iSharedChunkHandleId);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   887
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   888
        RThread chunkOwnerThread;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   889
        User::LeaveIfError(chunkOwnerThread.Open(TThreadId(iSharedChunkThreadId)));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   890
        CleanupClosePushL(chunkOwnerThread);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   891
                
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   892
        iChunk.SetHandle(iSharedChunkHandleId);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   893
        User::LeaveIfError(iChunk.Duplicate(chunkOwnerThread));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   894
        CleanupStack::PopAndDestroy(&chunkOwnerThread);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   895
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   896
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   897
    // differ creating surface id with chunk at last call
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   898
    if(iSurfaceId.IsNull() && (((aBufferCountActual - 1) == iOffsetArray.Count())))
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   899
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   900
		// Buffer size must be > 0!
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   901
		if( aSizeBytes == 0 )
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   902
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   903
			User::Leave( KErrArgument );
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   904
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   905
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   906
        // Update surface attributes using the buffer size supplied by the client.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   907
		// The supplied buffer size is used to create the graphics surface and must
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   908
		// therefore be large enough to accommodate any meta-data too.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   909
        iParent.GraphicSurfaceSettings().iSurfaceAttributes.iOffsetBetweenBuffers = aSizeBytes;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   910
            
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   911
        TInt err = KErrGeneral;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   912
        // create surface id with chunk
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   913
        err = iParent.SurfaceManager().CreateSurface(iParent.GraphicSurfaceSettings().iSurfaceAttributesBuf, iSurfaceId, iChunk);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   914
        if(err != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   915
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   916
            DEBUG_PRINTF2(_L8("COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::InitBufferL createsurface err = %d"), err);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   917
            User::Leave(err);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   918
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   919
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   920
        // Now, GFX needs to make sure that TSurfaceConfiguration has valid surface id
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   921
        err = iParent.GraphicSurfaceSettings().iSurfaceConfig.SetSurfaceId(iSurfaceId);	   
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   922
        if(err != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   923
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   924
            DEBUG_PRINTF2(_L8("COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::InitBufferL SetSurfaceId err = %d"), err);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   925
            User::Leave(err);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   926
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   927
      
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   928
        RSurfaceManager::TInfoBuf surfaceInfoBuf;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   929
        RSurfaceManager::TSurfaceInfoV01& surfaceInfo (surfaceInfoBuf());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   930
        surfaceInfo.iSize = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iSize;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   931
        surfaceInfo.iBuffers = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iBuffers;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   932
        surfaceInfo.iPixelFormat = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iPixelFormat;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   933
        surfaceInfo.iStride = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iStride;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   934
        surfaceInfo.iContiguous = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iContiguous;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   935
        surfaceInfo.iCacheAttrib = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iCacheAttrib;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   936
        surfaceInfo.iMappable = iParent.GraphicSurfaceSettings().iSurfaceAttributes.iMappable;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   937
        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   938
        err = iParent.SurfaceManager().SurfaceInfo(iSurfaceId, surfaceInfoBuf);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   939
        if(err != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   940
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   941
            DEBUG_PRINTF2(_L8("COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::InitBufferL SurfaceInfo err = %d"), err);  
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   942
            User::Leave(err);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   943
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   944
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   945
        // everything is fine and now ready to rock and roll...
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   946
        iParent.iCallbacks.EventNotification(OMX_EventPortSettingsChanged, OMX_NokiaIndexParamGraphicSurfaceConfig, 0, NULL);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   947
        } 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   948
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   949
    // save offsets
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   950
    TInt offset = apBuffer - iChunk.Base();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   951
    iOffsetArray.AppendL(offset);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   952
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   953
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   954
#else 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   955
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   956
void COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::InitBufferL(OMX_U32 /*aSizeBytes*/, OMX_U8* /*apBuffer*/, OMX_U32 aBufferCountActual)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   957
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   958
    if(iSurfaceId.IsNull())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   959
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   960
        User::LeaveIfError(iParent.SurfaceManager().CreateSurface(iParent.GraphicSurfaceSettings().iSurfaceAttributesBuf, iSurfaceId));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   961
        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   962
        RChunk chunk;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   963
        User::LeaveIfError(iParent.SurfaceManager().MapSurface(iSurfaceId, chunk));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   964
        CleanupClosePushL(chunk);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   965
        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   966
        //We need to change the chunk handle to be shared by the whole process.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   967
        RThread thread;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   968
        CleanupClosePushL(thread);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   969
        iChunk.SetHandle(chunk.Handle());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   970
        User::LeaveIfError(iChunk.Duplicate(thread));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   971
        CleanupStack::PopAndDestroy(2, &chunk);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   972
            
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   973
        // Now, GFX needs to make sure that TSurfaceConfiguration has valid surface id
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   974
        // so that IL Client can use RSurfaceManager::SetBackroundSurface()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   975
        User::LeaveIfError(iParent.GraphicSurfaceSettings().iSurfaceConfig.SetSurfaceId(iSurfaceId));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   976
        iParent.iCallbacks.EventNotification(OMX_EventPortSettingsChanged, OMX_NokiaIndexParamGraphicSurfaceConfig, 0, NULL);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   977
        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   978
        iIsBufferSupplier = EFalse;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   979
        
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   980
        for(TInt i = 0 ; i < aBufferCountActual ; i++)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   981
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   982
            TInt offset = 0;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   983
            User::LeaveIfError(iParent.SurfaceManager().GetBufferOffset(iSurfaceId, i, offset));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   984
            iArrayOffsets.AppendL(offset);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   985
            }   
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   986
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   987
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   988
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   989
#endif //ILCOMPONENTCONFORMANCE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   990
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   991
TInt COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::ProcessNextBuffer()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   992
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   993
    __ASSERT_DEBUG(iParent.iBufferMutex.IsHeld(), User::Invariant());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   994
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   995
    TInt err = KErrNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   996
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   997
    if ((iParent.BuffersToEmpty().Count()>0) && !IsActive() && iParent.State() == OMX_StateExecuting)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   998
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   999
        iCurrentBuffer = iParent.BuffersToEmpty()[0];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1000
        TInt bufferId = KErrNotFound;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1001
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1002
        if (iCurrentBuffer->nFilledLen == 0)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1003
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1004
            // Nothing in the buffer so no need to display it. The buffer might have a flag
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1005
            // that needs processing though. Self complete to keep the state machine running.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1006
            iStatus = KRequestPending;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1007
            SetActive();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1008
            TRequestStatus* status = &iStatus;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1009
            User::RequestComplete(status, KErrNone);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1010
            return KErrNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1011
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1012
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1013
#ifdef ILCOMPONENTCONFORMANCE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1014
        if (iIsBufferSupplier)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1015
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1016
#endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1017
			TInt offset = iCurrentBuffer->pBuffer - iChunk.Base();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1018
			bufferId = iOffsetArray.Find(offset);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1019
#ifdef ILCOMPONENTCONFORMANCE
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1020
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1021
        else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1022
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1023
            // Copy data from IL Conformance Suite in to Chunk address at specific address.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1024
            TPtr8 ptr(iChunk.Base(),iCurrentBuffer->nFilledLen ,iCurrentBuffer->nAllocLen);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1025
            ptr.Copy(iCurrentBuffer->pBuffer + iCurrentBuffer->nOffset, iCurrentBuffer->nFilledLen);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1026
            // isn't nOffset likely going to be 0? better to map buffer pointer to buffer id directly
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1027
            bufferId = iArrayOffsets.Find(iCurrentBuffer->nOffset);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1028
            // nOffset is not ideal for identifying buffer area since it's likely each buffer header
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1029
            // will have a unique pBuffer and nOffset == 0. We could calculate buffer ID by finding
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1030
            // the buffer header on the buffer header array in the port, but this isn't how bufferID
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1031
            // is calculated in the rest of the code. (we could just store the buffer ID on the
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1032
            // pInputPortPrivate but we have a habit of trying to export GS specific info into COmxILMMBuffer)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1033
            __ASSERT_ALWAYS(bufferId == 0, User::Invariant());
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1034
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1035
#endif  
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1036
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1037
        if(KErrNotFound == bufferId)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1038
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1039
            // An error here means that the buffer will not be displayed and RunL() will not be
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1040
            // invoked. However the buffer might have a flag that needs processing. Self complete
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1041
            // to keep the state machine running.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1042
            iStatus = KRequestPending;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1043
            SetActive();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1044
            TRequestStatus* status = &iStatus;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1045
            User::RequestComplete(status, KErrNotFound);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1046
            return KErrNotFound;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1047
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1048
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1049
		// due to COmxMMILBuffer dependency. to be removed 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1050
        if (iIsLocalChunk)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1051
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1052
            // copy data into local chunk
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1053
            TPtr8 ptr(iCurrentBuffer->pBuffer,iCurrentBuffer->nFilledLen ,iCurrentBuffer->nAllocLen);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1054
            ptr.Copy(iChunk.Base() + offset, iCurrentBuffer->nFilledLen);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1055
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1056
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1057
        iSurfaceUpdateSession.NotifyWhenDisplayed(iStatus, iTimeStamp);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1058
        SetActive();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1059
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1060
        err = iSurfaceUpdateSession.SubmitUpdate(KAllScreens, iSurfaceId, bufferId);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1061
        if(err)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1062
            {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1063
            // An error here means that the buffer will not be displayed and RunL() will not be
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1064
            // invoked. However the buffer might have a flag that needs processing. Self complete
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1065
            // to keep the state machine running.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1066
            iStatus = KRequestPending;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1067
            SetActive();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1068
            TRequestStatus* status = &iStatus;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1069
            User::RequestComplete(status, err);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1070
            }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1071
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1072
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1073
    return err;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1074
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1075
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1076
void COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::DoCancel()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1077
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1078
    if (iSurfaceUpdateSession.Handle() != KNullHandle)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1079
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1080
        iSurfaceUpdateSession.CancelAllUpdateNotifications();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1081
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1082
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1083
	iCurrentBuffer = NULL;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1084
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1085
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1086
TInt COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::OpenDevice()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1087
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1088
    TInt err = iSurfaceUpdateSession.Connect(KSurfaceUpdateNumOfMessageSlots);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1089
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1090
    if (err == KErrNotFound || err != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1091
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1092
#ifdef __WINSCW__
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1093
        DEBUG_PRINTF(_L8("Make sure SYMBIAN_GRAPHICS_USE_GCE ON is specified in epoc.ini"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1094
#else
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1095
        DEBUG_PRINTF(_L8("Make sure SYMBIAN_GRAPHICS_USE_GCE is defined in ROM build"));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1096
#endif
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1097
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1098
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1099
    return err;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1100
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1101
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1102
void COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::CloseDevice()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1103
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1104
    iSurfaceUpdateSession.CancelAllUpdateNotifications();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1105
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1106
    if (!iSurfaceId.IsNull())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1107
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1108
        iParent.SurfaceManager().CloseSurface(iSurfaceId);  // ignore the error
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1109
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1110
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1111
    iSurfaceUpdateSession.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1112
    // RSurface::Open() happened in context of caller.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1113
    iParent.SurfaceManager().Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1114
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1115
    iOffsetArray.Reset();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1116
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1117
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1118
TInt COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::Execute()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1119
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1120
	iParent.SetState(OMX_StateExecuting);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1121
	iFirstFrameDisplayed = EFalse;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1122
	TInt r = ProcessNextBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1123
	return r;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1124
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1125
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1126
TInt COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::Pause()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1127
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1128
	iParent.SetState(OMX_StatePause);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1129
	iFirstFrameDisplayed = EFalse;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1130
	Cancel();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1131
	iParent.TransitionToPauseFinished();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1132
	return KErrNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1133
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1134
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1135
TInt COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::Stop()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1136
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1137
	if(iParent.State() == OMX_StateExecuting || iParent.State() == OMX_StatePause)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1138
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1139
		// Cancel and flush the device driver
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1140
		Cancel();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1141
		iParent.SetState(OMX_StateIdle);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1142
		iFirstFrameDisplayed = EFalse;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1143
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1144
	return KErrNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1145
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1146
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1147
void COmxILGraphicSinkProcessingFunction::CGraphicSurfaceAccess::ResetSurfaceId()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1148
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1149
	iSurfaceId = TSurfaceId::CreateNullId();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1150
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1151
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1152
COmxILGraphicSinkProcessingFunction::CPFHelper* COmxILGraphicSinkProcessingFunction::CPFHelper::NewL(COmxILGraphicSinkProcessingFunction& aParent, CGraphicSurfaceAccess& aGraphicSurfaceAccess)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1153
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1154
	CPFHelper* self = new (ELeave) CPFHelper(aParent, aGraphicSurfaceAccess);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1155
	CleanupStack::PushL(self);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1156
	self->ConstructL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1157
	CleanupStack::Pop(self);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1158
	return self;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1159
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1160
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1161
COmxILGraphicSinkProcessingFunction::CPFHelper::CPFHelper(COmxILGraphicSinkProcessingFunction& aParent, CGraphicSurfaceAccess& aSurfaceAccess)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1162
: CActive(EPriorityUserInput),
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1163
  iParent(aParent),
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1164
  iGraphicSurfaceAccess(aSurfaceAccess)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1165
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1166
	CActiveScheduler::Add(this);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1167
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1168
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1169
void COmxILGraphicSinkProcessingFunction::CPFHelper::ConstructL()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1170
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1171
	User::LeaveIfError(iMsgQueue.CreateLocal(KMaxMsgQueueEntries));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1172
	SetActive();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1173
	iMsgQueue.NotifyDataAvailable(iStatus);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1174
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1175
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1176
COmxILGraphicSinkProcessingFunction::CPFHelper::~CPFHelper()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1177
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1178
	Cancel(); 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1179
	iMsgQueue.Close();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1180
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1181
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1182
void COmxILGraphicSinkProcessingFunction::CPFHelper::RunL()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1183
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1184
	iParent.iBufferMutex.Wait();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1185
	if (ProcessQueue() != KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1186
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1187
		iParent.GetCallbacks().ErrorEventNotification(OMX_ErrorInsufficientResources);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1188
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1189
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1190
	// setup for next callbacks		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1191
	SetActive();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1192
	iMsgQueue.NotifyDataAvailable(iStatus);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1193
	iParent.iBufferMutex.Signal();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1194
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1195
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1196
void COmxILGraphicSinkProcessingFunction::CPFHelper::DoCancel()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1197
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1198
	if (iMsgQueue.Handle())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1199
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1200
		ProcessQueue();	// Ignore the error?
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1201
		iMsgQueue.CancelDataAvailable();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1202
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1203
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1204
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1205
TInt COmxILGraphicSinkProcessingFunction::CPFHelper::ProcessQueue()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1206
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1207
	TMessageType msg;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1208
	TInt err = iMsgQueue.Receive(msg);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1209
	while (err == KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1210
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1211
		switch (msg)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1212
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1213
			case EOpenDevice:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1214
			    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1215
			    err = iGraphicSurfaceAccess.OpenDevice();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1216
			    break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1217
			    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1218
			case ECloseDevice:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1219
                {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1220
                iGraphicSurfaceAccess.CloseDevice();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1221
                break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1222
                }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1223
			
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1224
			case EExecuteCommand:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1225
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1226
				err = iGraphicSurfaceAccess.Execute();	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1227
				break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1228
				}				
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1229
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1230
			case EStopCommand:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1231
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1232
				err = iGraphicSurfaceAccess.Stop();	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1233
				break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1234
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1235
				
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1236
			case EPauseCommand:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1237
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1238
				err = iGraphicSurfaceAccess.Pause();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1239
				break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1240
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1241
				
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1242
			case EBufferIndication:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1243
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1244
				// Add buffer to list waiting to process.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1245
				// While we could send zero length buffers straight back, this would cause a
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1246
				// problem if that buffer has a flag on it that needs processing. So we still
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1247
				// pass them on and the graphics surface access code will not display them.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1248
				if (iParent.State() == OMX_StateExecuting || iParent.State() == OMX_StatePause)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1249
					{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1250
					err = iGraphicSurfaceAccess.ProcessNextBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1251
					}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1252
				break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1253
				}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1254
			default:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1255
				{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1256
				DEBUG_PRINTF2(_L8("\nMsqQue >> %d"),msg);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1257
				break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1258
				}					
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1259
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1260
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1261
		if (err)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1262
			{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1263
			break;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1264
			}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1265
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1266
		err = iMsgQueue.Receive(msg);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1267
		}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1268
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1269
    if ( err  == KErrUnderflow)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1270
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1271
        err = KErrNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1272
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1273
    
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1274
	return err;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1275
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1276
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1277
OMX_ERRORTYPE COmxILGraphicSinkProcessingFunction::CPFHelper::OpenDevice()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1278
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1279
    TMessageType message;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1280
    message = EOpenDevice;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1281
    return ConvertError(iMsgQueue.Send(message));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1282
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1283
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1284
OMX_ERRORTYPE COmxILGraphicSinkProcessingFunction::CPFHelper::CloseDevice()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1285
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1286
    TMessageType message;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1287
    message = ECloseDevice;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1288
    return ConvertError(iMsgQueue.Send(message));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1289
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1290
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1291
OMX_ERRORTYPE COmxILGraphicSinkProcessingFunction::CPFHelper::ExecuteAsync()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1292
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1293
	TMessageType message;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1294
	message = EExecuteCommand;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1295
    return ConvertError(iMsgQueue.Send(message));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1296
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1297
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1298
OMX_ERRORTYPE COmxILGraphicSinkProcessingFunction::CPFHelper::StopAsync()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1299
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1300
	TMessageType message;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1301
	message = EStopCommand;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1302
    return ConvertError(iMsgQueue.Send(message));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1303
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1304
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1305
OMX_ERRORTYPE COmxILGraphicSinkProcessingFunction::CPFHelper::StopSync()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1306
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1307
	// Cancel to process the existing queue before handling this command
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1308
	if (IsActive())
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1309
	    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1310
	    Cancel();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1311
	    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1312
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1313
	TInt err = iGraphicSurfaceAccess.Stop();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1314
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1315
	// setup for next callbacks		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1316
	SetActive();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1317
	iMsgQueue.NotifyDataAvailable(iStatus);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1318
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1319
    return ConvertError(err);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1320
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1321
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1322
OMX_ERRORTYPE COmxILGraphicSinkProcessingFunction::CPFHelper::Pause()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1323
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1324
    TMessageType message;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1325
    message = EPauseCommand;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1326
    return ConvertError(iMsgQueue.Send(message));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1327
    }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1328
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1329
OMX_ERRORTYPE COmxILGraphicSinkProcessingFunction::CPFHelper::BufferIndication()
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1330
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1331
	TMessageType message;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1332
	message = EBufferIndication;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1333
    return ConvertError(iMsgQueue.Send(message));
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1334
	}
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1335
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1336
OMX_ERRORTYPE COmxILGraphicSinkProcessingFunction::CPFHelper::ConvertError(TInt aError)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1337
    {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1338
    if(aError == KErrNone)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1339
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1340
        return OMX_ErrorNone;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1341
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1342
    else if(aError == KErrOverflow)
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1343
        {
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1344
        return OMX_ErrorInsufficientResources; 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1345
        }
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1346
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1347
    // default
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1348
    return OMX_ErrorUndefined;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
  1349
    }