omxilvideocomps/omxil3gpdemuxer/src/c3gpdemuxer.h
author hgs
Fri, 08 Oct 2010 22:09:17 +0100
changeset 0 5d29cba61097
permissions -rw-r--r--
2010wk38_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     1
/*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies).
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     3
* All rights reserved.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     8
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    11
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    12
* Contributors:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    13
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    14
* Description:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    15
*
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    16
*/
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    17
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    18
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    19
/**
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 C3GPDEMUXER_H
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    25
#define C3GPDEMUXER_H
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    26
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    27
#include <f32file.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    28
#include <e32msgqueue.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    29
#include <c3gplibrary.h>
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    30
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    31
#include "comxil3gpdemuxer.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    32
#include "tvideoformat.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    33
#include "taudioformat.h"
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    34
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    35
class MOmxILCallbackNotificationIf;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    36
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    37
NONSHARABLE_CLASS(C3GPDemuxer) : public CActive
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    38
								,public M3GPParseCallback
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    39
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    40
	{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    41
public:	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    42
	static C3GPDemuxer* NewL(MOmxILCallbackNotificationIf& aCallbacks);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    43
	~C3GPDemuxer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    44
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    45
	OMX_ERRORTYPE AcquireResources(const TDesC& aFilename);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    46
	void ReleaseResources();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    47
	void Start();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    48
	OMX_ERRORTYPE Stop();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    49
	void Pause();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    50
	TBool Invalid() const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    51
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    52
	void ProcessThisBufferL(OMX_BUFFERHEADERTYPE* aBufferHeader, TUint32 aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    53
	void FlushBuffers(TUint32 aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    54
	TBool RemoveBuffer(OMX_BUFFERHEADERTYPE* aBufferHeader, OMX_DIRTYPE aDirection);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    55
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    56
	TBool GetVideoFormat(TSize& aFrameSize, TVideoFormat& aFormat) const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    57
	TBool GetAudioFormat(TAudioFormat& aFormat) const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    58
	OMX_ERRORTYPE GetVideoTimestamp(OMX_TICKS& aOmxTicks);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    59
	OMX_ERRORTYPE Seek(const OMX_TICKS& aOmxTicks, OMX_TIME_SEEKMODETYPE aSeekModeType);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    60
	OMX_ERRORTYPE DetectStreams();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    61
	OMX_ERRORTYPE GetMetadataL(OMX_CONFIG_METADATAITEMTYPE* aMetadata);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    62
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    63
protected:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    64
	void RunL();
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
	typedef RPointerArray<OMX_BUFFERHEADERTYPE> RQueuedBuffers;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    69
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    70
	class CPort : public CBase
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    71
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    72
	public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    73
		static CPort* NewL(TInt aBufferCount);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    74
		~CPort();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    75
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    76
	private:	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    77
		CPort();	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    78
		void ConstructL(TInt aBufferCount);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    79
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    80
	public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    81
		// Queue of buffers waiting to be processed. Buffers are not owned.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    82
		RQueuedBuffers iBuffers;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    83
		TBool iEOS;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    84
		};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    85
		
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    86
	class TBufferMessage
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    87
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    88
	public:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    89
		OMX_BUFFERHEADERTYPE* iBufferHeader;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    90
		TUint32 iPortIndex;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    91
		};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    92
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    93
	enum TState
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    94
		{
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    95
		EStateWaitingToStart,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    96
		EStateWaitingForBuffer,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    97
		EStateFillingBuffer,
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    98
		EStateWaitingToSubmit
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
    99
		};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   100
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   101
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   102
	C3GPDemuxer(MOmxILCallbackNotificationIf& aCallbacks);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   103
	void ConstructL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   104
	void DoFlushBuffers(TUint32 aPortIndex);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   105
	TBool ProcessBuffers();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   106
	void DoProcessBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   107
	void ProcessTimeBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   108
	void FillAudioBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   109
	void FillVideoBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   110
	void FileReadComplete(TInt aNextFrameError, TUint32 aTimeStamp, TBool& aFirstFrame, TBool aKeyFrame);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   111
	void SubmitBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   112
	void CreateBufferQueueL();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   113
	void DeleteBufferQueue();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   114
	void HandleIfError(TInt aError);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   115
	OMX_ERRORTYPE SymbianOSErrorToOmx(TInt aError) const;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   116
	void ReceiveQueuedBuffers();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   117
	void StartWaitingForBuffer();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   118
	void CompleteSelf();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   119
	TInt NextPort();
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   120
	TUint32 Pack32(const TUint8* aPtr);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   121
	TInt SetPosition(TUint aTimePosition, TBool aKeyFrame);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   122
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   123
	//M3GPParseCallback functions
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   124
	void AudioFramesAvailable(TInt aError, TUint aReturnedFrames, TUint aTimeStampInMs, TUint aTimeStampInTimescale);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   125
	void VideoFrameAvailable(TInt aError, TBool aKeyFrame, TUint aTimeStampInMs, TUint aTimeStampInTimescale);
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   126
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   127
private:
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   128
	MOmxILCallbackNotificationIf& iCallbacks;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   129
	TUint32 iCurrentPort;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   130
	OMX_BUFFERHEADERTYPE* iCurrentBuffer;  // Not owned
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   131
	CPort* iPort[COmxIL3GPDemuxer::EPortIndexMax];
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   132
	C3GPParse* i3GPParser;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   133
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   134
	TBool iVideoPropertiesRead;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   135
	T3GPVideoType iVideoType;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   136
	TVideoFormat iOmxVideoFormat;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   137
	TUint32 iVideoWidth;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   138
	TUint32 iVideoHeight;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   139
	
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   140
	TBool iAudioPropertiesRead;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   141
	T3GPAudioType iAudioType;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   142
	TAudioFormat iOmxAudioFormat;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   143
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   144
	TBool iInvalid;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   145
	TBool iPaused;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   146
	TState iState;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   147
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   148
	TBool iVideoHeadersSent;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   149
	TBool iAudioHeadersSent;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   150
	TBool iFirstVideoFrame;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   151
	TBool iFirstAudioFrame;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   152
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   153
	RMsgQueue<TBufferMessage> iBufferQueue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   154
	TBool iBufferQueueCreated;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   155
	TBool iWaitingOnBufferQueue;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   156
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   157
	TPtr8 iAsyncBuf;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   158
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   159
	TBool iParserOpened;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   160
	TUint iStartTimePosition;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   161
	TBool iStartKeyFrame;
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   162
	TUint iSeekPosition; // The requested seek time in ms.
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   163
	};
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   164
5d29cba61097 2010wk38_02
hgs
parents:
diff changeset
   165
#endif //C3GPDEMUXER_H