omxilvideocomps/omxil3gpmuxer/src/c3gpmuxer.h
author hgs
Fri, 08 Oct 2010 22:09:17 +0100
changeset 0 5d29cba61097
permissions -rw-r--r--
2010wk38_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     1
/*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     3
* All rights reserved.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     8
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    11
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    12
* Contributors:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    13
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    14
* Description:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    15
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    16
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    17
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    18
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    19
/**
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    20
@file
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    21
@internalComponent
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    22
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    23
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    24
#ifndef C3GPMUXER_H
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    25
#define C3GPMUXER_H
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    26
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    27
#include <e32base.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    28
#include <e32std.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    29
#include <f32file.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    30
#include <e32msgqueue.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    31
#include <openmax/il/khronos/v1_x/OMX_Core.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    32
#include <c3gplibrary.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    33
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    34
#include "comxil3gpmuxer.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    35
#include "endwaitao.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    36
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    37
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    38
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    39
class MOmxILCallbackNotificationIf;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    40
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    41
NONSHARABLE_CLASS(C3GPMuxer) : public CActive
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    42
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    43
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    44
	friend class C3GPMuxerWriterThreadObserver;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    45
public:	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    46
	static C3GPMuxer* NewL(MOmxILCallbackNotificationIf& aCallbacks);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    47
	~C3GPMuxer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    48
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    49
	void ProcessThisBufferL(OMX_BUFFERHEADERTYPE* aBufferHeader, TUint32 aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    50
	void FlushBuffers(TUint32 aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    51
	TBool RemoveBuffer(OMX_BUFFERHEADERTYPE* aBufferHeader);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    52
	void SetFilename(const HBufC* aFilename);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    53
	void SetAudioVideoProperties(OMX_U32& aFrameWidth, OMX_U32& aFrameHeight, 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    54
									OMX_U32& aFramerate, OMX_U32& aBitRate, OMX_U32& aAudioFramerate);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    55
	void StartL(TBool aAudioPortEnabled, TBool aVideoPortEnabled);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    56
	void Pause();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    57
	TBool IsMuxerInvalid() const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    58
	void HandleError(TInt aError);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    59
	OMX_ERRORTYPE SymbianErrorToOmx(TInt aError);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    60
protected:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    61
	void RunL();	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    62
	void RunAudioVideoL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    63
	void RunAudioL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    64
	void RunVideoL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    65
	void DoCancel();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    66
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    67
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    68
	C3GPMuxer(MOmxILCallbackNotificationIf& aCallbacks);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    69
	void ConstructL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    70
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    71
	void OpenComposerL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    72
	void WriteVideoBufferL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    73
	void WriteAudioBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    74
	void DoFlushBuffers(TUint32 aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    75
	void ReturnBuffer(OMX_BUFFERHEADERTYPE* aBuffer, TUint32 aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    76
	static TInt ThreadEntryPoint(TAny* aPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    77
	void RunThreadL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    78
	TBool RemoveFromQueue(RMsgQueue<OMX_BUFFERHEADERTYPE*>& aQueue, OMX_BUFFERHEADERTYPE* aBufferHeader);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    79
	void CalculateVideoTimeScale(OMX_U32& aFramerate);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    80
	TInt CalculateNextFrameDuration();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    81
	TInt CalculateNextFrameDurationPartial(TBool aFrameWritten);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    82
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    83
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    84
	MOmxILCallbackNotificationIf& iCallbacks;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    85
	C3GPCompose* iComposer;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    86
	const HBufC* iFilename;  // Not owned by this class
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    87
	TSize iVideoSize;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    88
	TInt iVideoTimeScale;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    89
	TInt iDefaultVideoFrameDuration;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    90
	TUint iBitRate;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    91
	TBool iAudioPortEnabled;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    92
	TBool iVideoPortEnabled;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    93
	RMsgQueue<OMX_BUFFERHEADERTYPE*> iAudioQueue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    94
	RMsgQueue<OMX_BUFFERHEADERTYPE*> iVideoQueue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    95
	OMX_BUFFERHEADERTYPE* iAudioBuffer;	 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    96
	OMX_BUFFERHEADERTYPE* iCurrentVideoBuffer;	 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    97
	TBool iComposerOpened;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    98
	TUint iAudioFrameDuration;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    99
	RThread iThread;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   100
	RMutex iQueMutex;	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   101
	TBool iThreadRunning;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   102
	CEndWaitAO* iEndWaitAO;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   103
	RMsgQueue<OMX_BUFFERHEADERTYPE*> iRemoveQueue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   104
	TBool iPaused;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   105
	TBool iMuxerInvalid;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   106
	RBuf8 iPartialFrame;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   107
	OMX_BUFFERHEADERTYPE* iNextVideoBuffer;	 
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   108
	TInt64 iVideoDuration;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   109
	TUint iRemoveQueueLength;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   110
	TBool iRemoveQueueNeedsReallocation;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   111
	TBool iRequestOutstanding;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   112
	};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   113
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   114
#endif //C3GPMUXER_H