mmlibs/mmfw/Recogniser/src/matparser.cpp
author hgs
Thu, 07 Oct 2010 22:34:12 +0100
changeset 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
#include "constants.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
#include "parsers.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
// Matroska 'XML' tags.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
static const TUint32 KEBML = 0x1A45DFA3;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
static const TUint32 KSegment = 0x18538067;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
static const TUint32 KTracks = 0x1654AE6B;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
static const TUint32 KTrackEntry = 0xAE;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
static const TUint32 KTrackType = 0x83;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
static const TUint32 KVoid = 0xEC;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
static const TUint32 KSeekHead = 0x114D9B74;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
static const TUint32 KSegmentInfo = 0x1549A966;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
static const TUint32 KCluster = 0x1F43B675;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
static const TUint32 KCues = 0x1C53BB6B;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
static const TUint32 KAttachments = 0x1941A469;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
static const TUint32 KChapters = 0x1043A770;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
static const TUint32 KTags = 0x1254C367;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
// Matroska Track Types.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
static const TUint8 KTrackTypeVideo = 0x01;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
#define KMatroskaConfidenceMask	0x07	// 00000111
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
#define KMatroskaEBMLBit		KBit1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
#define KMatroskaSegmentBit		KBit2
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
#define KMatroskaVideoBit		KBit3
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
// This truth table maps the following flags to confidence levels.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
// A: Extension match.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
// B: EBML tag found.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
// C: Segment tag found.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
// C B A -> Confidence
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
// --------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
// 0 0 0 -> NotRecognised
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
// 0 0 1 -> EPossible
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
// 0 1 0 -> EPossible
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
// 0 1 1 -> EProbable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
// 1 0 0 -> ENotRecognised (EBML should be present)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
// 1 0 1 -> ENotRecognised (EBML should be present)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
// 1 1 0 -> EProbable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
// 1 1 1 -> ECertain
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
static const TInt KMatroskaFlagsToConfidence[8] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
	KConfPossible,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
	KConfPossible,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
	KConfProbable,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
	KConfProbable,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
	KConfCertain
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
static const TInt KMatExtensionOnlyIndex = 1; // See truth table.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
typedef struct
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	const TText* iExt;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	const TText8* iMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
TMatroskaExt;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
// Known Matroska extensions and their corresponding MIME-types.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
static const TMatroskaExt KMatroskaExt[] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
		{KExtMAT_A, KMimeMAT_A },
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
		{KExtMAT_V, KMimeMAT_V }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
static const TInt KMatroskaExtCount = sizeof(KMatroskaExt) / sizeof(TMatroskaExt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
TMatroskaParser::TMatroskaParser(CReader& aReader, TFlags& aFlags)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
 :	iReader(aReader),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
 	iFlags(aFlags)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
const TText8* TMatroskaParser::MatchExtension(const TDesC& aExt)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
	for (TInt i = 0; i < KMatroskaExtCount; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
		if (aExt.MatchF(TPtrC(KMatroskaExt[i].iExt)) != KErrNotFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
			return KMatroskaExt[i].iMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
	return NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
// This function calls the parser and turns the results
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
// into a MIME-type.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
void TMatroskaParser::DoRecognise(const TDesC& aExt, CReader& aReader, TMatch& aMatch)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
	TFlags flags;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
	TMatroskaParser parser(aReader, flags);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
	// Try to match the extension.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
	const TText8* extMime = parser.MatchExtension(aExt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
	if (extMime != NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
		flags.SetExtensionFlag();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
	// Try to parse the content.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
	TRAP_IGNORE(parser.ParseL());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
	TInt confIndex = flags.GetBitField(KMatroskaConfidenceMask);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
	aMatch.iConfidence = KMatroskaFlagsToConfidence[confIndex];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
	if (aMatch.iConfidence != KConfNotRecognised)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
		// If any header data has been recognised trust that,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
		// otherwise go with the extension.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
		if (confIndex == KMatExtensionOnlyIndex)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
			aMatch.iMime = extMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
			aMatch.iMime = (flags.GetBitField(KMatroskaVideoBit) ? KMimeMAT_V : KMimeMAT_A);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
// This function does the parsing.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
void TMatroskaParser::ParseL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
	TUint64 id;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
	TInt64 size;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
	TBool haveElement = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
	// Assume there's video content if we only have buffer data.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
	if (iReader.Type() == CReader::EBuffer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
		iFlags.SetBit(KMatroskaVideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
	FOREVER
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
		if (!haveElement)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
			ReadElementL(id, size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
		switch (id)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
			case KEBML:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
				iFlags.SetBit(KMatroskaEBMLBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
			case KSegment:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
				haveElement = ReadSegmentL(id, size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
			default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
				// Skip it.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
				iReader.SeekL(size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
// This function returns ETrue if the aNextID and aNextSize parameters
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
// contain valid values, EFalse otherwise.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
TBool TMatroskaParser::ReadSegmentL(TUint64& aNextID, TInt64& aNextSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
	TUint64 id;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
	TInt64 size;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
	TBool videoContent = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
	aNextID = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
	aNextSize = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
	iFlags.SetBit(KMatroskaSegmentBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
	while (!videoContent)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
		ReadElementL(id, size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
		switch (id)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
			case KTracks:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
				videoContent = ReadTrackL(size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
			case KSeekHead:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
			case KSegmentInfo:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
			case KCluster:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
			case KCues:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
			case KAttachments: 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
			case KChapters:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
			case KTags:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
				iReader.SeekL(size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
			default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
				// Unrecognised element id. Pass it back to the caller
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
				aNextID = id;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
				aNextSize = size;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
				return ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
	// Tell the caller they must read the next element themselves.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
	return EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
// The Track. This lets us know if there's video content present.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
TBool TMatroskaParser::ReadTrackL(TInt64 aTrackSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
	TUint64 id;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
	TInt64 size;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
	TInt startPos = iReader.Position();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
	while (iReader.Position() - startPos < aTrackSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
		ReadElementL(id, size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
		switch (id)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
			case KTrackEntry:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
			case KTrackType:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
				TUint8 trackType;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
				iReader.ReadByteL(trackType);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
				if (trackType == KTrackTypeVideo)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
					// We found video content so we can stop parsing.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
					iFlags.SetBit(KMatroskaVideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
					return ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
			default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
				iReader.SeekL(size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
	return EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
void TMatroskaParser::ReadElementL(TUint64& aElementID, TInt64& aSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
	do
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
		aElementID = ReadDataL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
		aSize = ReadDataL(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
		// Void elements are used for padding and
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
		// can be ignored.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
		if (aElementID == KVoid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
			iReader.SeekL(aSize);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
	while (aElementID == KVoid);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   308
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   309
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   310
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   311
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   312
TUint64 TMatroskaParser::ReadDataL(TBool aTurnOffHighestSetBit)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   313
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   314
	TUint64 retval;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   315
	TUint8 byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   316
	TUint8 mask = 0x80; // [1000 0000]. It will be shifted right 1 in each 'i' iteration.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   317
	TUint8 size = 1;	// It will be incremented in each 'i' iteration.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   318
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   319
	iReader.ReadByteL(byte);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   320
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   321
	for (TInt i = 0; i < sizeof(TUint64); i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   322
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   323
		if (byte & mask)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   324
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   325
			retval = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   326
			if (aTurnOffHighestSetBit)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   327
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   328
				retval &= ~mask; // Turn off the highest set bit.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   329
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   330
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   331
			// Now read the real data.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   332
			// Start from 1 because we've already read a byte.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   333
			for (TInt j = 1; j < size; j++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   334
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   335
				iReader.ReadByteL(byte);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   336
				retval <<= 8;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   337
				retval |= byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   338
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   339
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   340
			return retval;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   341
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   342
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   343
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   344
			mask >>= 1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   345
			size++;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   346
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   347
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   348
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   349
	User::Leave(KErrCorrupt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   350
	return 0; // Keep the compiler happy.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   351
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   352