mmlibs/mmfw/Recogniser/src/mpeg4parser.cpp
author hgs
Tue, 02 Nov 2010 12:13:59 +0000
changeset 5 b220a9341636
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_01
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 "parsers.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
#include "constants.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
// Brands.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
// Some (most) brands have Release information - e.g. 3gp6, 3gp5 etc.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
// Therefore, to match the brand, we only look at the characters that don't
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
// represent Release information (in the above case, the 4th character).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
// The Release character is set to zero.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
static const TUint32 KMP4Brand = MAKE_INT32('m', 'p', '4', 0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
static const TUint32 K3GPBrand = MAKE_INT32('3', 'g', 'p', 0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
static const TUint32 K3G2Brand = MAKE_INT32('3', 'g', '2', 0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
static const TUint32 K3GSBrand = MAKE_INT32('3', 'g', 's', 0);	// Streaming servers.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
static const TUint32 K3GRBrand = MAKE_INT32('3', 'g', 'r', 0);	// Progresive download and MMS.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
static const TUint32 KQTBrand  = MAKE_INT32('q', 't', ' ', ' '); // for quicktime
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
// Box identifiers.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
static const TUint32 KFtyp = MAKE_INT32('f', 't', 'y', 'p');
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
static const TUint32 KMoov = MAKE_INT32('m', 'o', 'o', 'v');
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
static const TUint32 KTrak = MAKE_INT32('t', 'r', 'a', 'k');
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
static const TUint32 KTkhd = MAKE_INT32('t', 'k', 'h', 'd');
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
static const TUint32 KMdia = MAKE_INT32('m', 'd', 'i', 'a');
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
static const TUint32 KHdlr = MAKE_INT32('h', 'd', 'l', 'r');
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
static const TUint32 KVide = MAKE_INT32('v', 'i', 'd', 'e');
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
static const TUint32 KUuid = MAKE_INT32('u', 'u', 'i', 'd');
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
// This truth table maps the following flags to a confidence level.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
// A - trak box present
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
// B - moov box present
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
// A B -> Confidence
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
// =================
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
// 0 0 -> EPossible
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
// 0 1 -> EProbable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
// 1 0 -> EProbable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
// 1 1 -> ECertain
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
static const TInt KMPEG4FlagsToConfidence[] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
	KConfPossible,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
	KConfProbable,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
	KConfProbable,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
	KConfCertain,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
#define KMPEG4ConfidenceMask	0x03	// 00000011
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
#define KMPEG4BoxTitleLen		4
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
#define KMPEG4TRAKBit			KBit0	// 00000001
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
#define KMPEG4MOOVBit			KBit1	// 00000010
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
#define KMPEG4VideoBit			KBit2	// 00000100
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
static const TInt KMPEG4BoxIntroLen = 8;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
static const TInt KMPEG4Box64BitIntroLen = 16;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
// In order to find out the type of MPEG4 file it is
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
// we need to be able to map known extensions, expected
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
// ftyp expressions with MIME-types.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
typedef struct
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	const TText* iExt;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
	TUint32 iBrand;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
	const TText8* iAudioMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
	const TText8* iVideoMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
TMPEG4File;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
// A table of ftyp's, extensions and mime-types.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
// .mp4 - can contain either audio or video.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
// .m4a - should contain (unprotected) audio only.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
// .m4p - should contain protected audio only.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
// .3gp - can contain either audio or video.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
static const TMPEG4File KMPEG4Files[] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
		{KExtMP4,	KMP4Brand,	KMimeMP4_A,	KMimeMP4_V},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
		{KExt3GP,	K3GPBrand,	KMime3GP_A,	KMime3GP_V},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
		{KExtM4A,	KMP4Brand,	KMimeMP4_A,	NULL},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
		{KExt3G2,	K3G2Brand,	KMime3G2_A,	KMime3G2_V},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
		{KExt3GP,	K3GSBrand,	KMime3GP_A,	KMime3GP_V},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
		{KExt3GP,	K3GRBrand,	KMime3GP_A,	KMime3GP_V},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
		{KExt3GA,	K3GPBrand,	KMime3GA,	NULL},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
		{KExtMOV,   KQTBrand,   NULL, KMimeQuickV} // this entry is for .mov files
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
static const TInt KMPEG4FileTypeCount = sizeof(KMPEG4Files) / sizeof(TMPEG4File);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
TMPEG4Parser::TMPEG4Parser(CReader& aReader, TFlags& aFlags)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
 :	iBrandIndex(KErrNotFound),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
 	iIsFinished(EFalse),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
 	iReader(aReader),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
 	iFlags(aFlags),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
 	iVideoAssumed(EFalse)
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
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
// Compare a brand with the ones this recogniser knows about.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
TInt TMPEG4Parser::IsCompatibleBrand(TUint32 aBrand, TInt aStartPos)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
	for (TInt i = aStartPos; i < KMPEG4FileTypeCount; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
		TUint32 knownBrand = KMPEG4Files[i].iBrand;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
		if ((aBrand & knownBrand) == knownBrand)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
			return i;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
	return KErrNotFound;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
// Try to determine the mime-type from the extension, and
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
// if that isn't matched, from the FTYP field if present.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
// If none of these are matched, NULL is returned and the
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
// file isn't a valid MPEG4 file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
const TText8* TMPEG4Parser::MatchFileType(const TDesC& aExt)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
	TBool videoFound = iFlags.GetBitField(KMPEG4VideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
	TBool video = (videoFound || iVideoAssumed);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
	// Try to match the extension.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
	if (aExt.Length() > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
		for (TInt i = 0; i < KMPEG4FileTypeCount; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
			TPtrC ext(KMPEG4Files[i].iExt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
			if (aExt.MatchF(ext) != KErrNotFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
				// Extension match. If the extension is for an audio-only format
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
				// we must make sure there is no video content in the file. If
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
				// video content is present then ignore the extension match.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
				if (KMPEG4Files[i].iVideoMime == NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
					if (videoFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
						{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
						// Try to match another extension.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
						continue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
						}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
					
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
					return KMPEG4Files[i].iAudioMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
				return (video ? KMPEG4Files[i].iVideoMime : KMPEG4Files[i].iAudioMime);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
	// Unknown or no extension. Try to match the brand
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
	while (iBrandIndex != KErrNotFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
		if (KMPEG4Files[iBrandIndex].iVideoMime == NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
			if (videoFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
				// Try to match another brand.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
				TUint32 brand = KMPEG4Files[iBrandIndex].iBrand;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
				iBrandIndex = TMPEG4Parser::IsCompatibleBrand(brand, iBrandIndex + 1);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
				continue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
			return KMPEG4Files[iBrandIndex].iAudioMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
		return (video ? KMPEG4Files[iBrandIndex].iVideoMime : KMPEG4Files[iBrandIndex].iAudioMime);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
	// If there is no brand and an unknown extension look at the flags.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
	// (There are some files that have no ftyp).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
	// Only return a potential mime-type if all flag bits have been set.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
	if (iFlags.GetBitField(KMPEG4ConfidenceMask) == KMPEG4ConfidenceMask)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
		return (video ? KMimeMP4_V : KMimeMP4_A);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
	return NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
void TMPEG4Parser::DoRecognise(const TDesC& aFileExt, CReader& aReader, TMatch& aMatch)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
	TFlags flags;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
	TMPEG4Parser parser(aReader, flags);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
	TRAP_IGNORE(parser.ParseL());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
	// The extension determines the mime-type.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
	// The flags say if it's a valid MPEG4 file and if video is present.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
	const TText8* extMime = parser.MatchFileType(aFileExt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
	if (extMime != NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
		TInt confIndex = flags.GetBitField(KMPEG4ConfidenceMask);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
		aMatch.iConfidence = KMPEG4FlagsToConfidence[confIndex];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
		if (aMatch.iConfidence != KConfNotRecognised)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
			aMatch.iMime = extMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
void TMPEG4Parser::ParseL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
	// If we have only buffer data, we must assume the video
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
	// content (if any) has been missed. This is because an
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
	// audio-only file recognised as video should play in a
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
	// video application, but a video file recognised as audio
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
	// will not play in a audio application.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
	if (iReader.Type() == CReader::EBuffer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
		iVideoAssumed = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
	do
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
		{		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
		ReadBoxHeaderL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
		if (iTitle == KFtyp)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
			ReadFileTypeL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
		else if (iTitle == KMoov)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
			iFlags.SetBit(KMPEG4MOOVBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
			ReadMovieL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
			SkipCurrentBoxL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
	while (!iIsFinished);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
void TMPEG4Parser::SkipCurrentBoxL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
	// Intro: [size][title] = 8 bytes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
	if (iSize == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
		// The current box extends to the end of file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
		iIsFinished = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
		return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
	if(iSizeIn32bit)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
	    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
        iReader.SeekL(iSize - KMPEG4BoxIntroLen);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
	    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
	    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
        iReader.SeekL(iSize - KMPEG4Box64BitIntroLen);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
	    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
// Parses the 'moov' box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
// This box contains sub-boxes we're interested in.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
void TMPEG4Parser::ReadMovieL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
	// This box holds no information.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
	// It contains 'trak' boxes, which we want.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   308
	TInt64 dataInBox = iSize - KMPEG4BoxIntroLen;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   309
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   310
	while ((dataInBox > 0) && !iIsFinished)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   311
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   312
		ReadBoxHeaderL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   313
		dataInBox -= iSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   314
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   315
		if (iTitle == KTrak)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   316
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   317
			iFlags.SetBit(KMPEG4TRAKBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   318
			ReadTrackL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   319
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   320
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   321
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   322
			SkipCurrentBoxL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   323
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   324
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   325
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   326
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   327
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   328
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   329
// Parses the 'trak' box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   330
// This box contains sub-boxes we're interested in.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   331
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   332
void TMPEG4Parser::ReadTrackL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   333
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   334
	// This box holds no information.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   335
	// It contains 'tkhd' boxes, which we want.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   336
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   337
	TInt64 dataInBox = iSize - KMPEG4BoxIntroLen;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   338
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   339
	while ((dataInBox > 0) && !iIsFinished) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   340
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   341
		ReadBoxHeaderL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   342
		dataInBox -= iSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   343
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   344
		if (iTitle == KTkhd)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   345
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   346
			ReadTrackHeaderL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   347
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   348
		else if (iTitle == KMdia)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   349
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   350
			ReadMediaL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   351
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   352
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   353
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   354
			SkipCurrentBoxL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   355
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   356
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   357
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   358
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   359
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   360
// Parses a 'mdia' box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   361
// This box contains sub-boxes we're interested in.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   362
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   363
void TMPEG4Parser::ReadMediaL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   364
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   365
	TInt64 dataInBox = iSize - KMPEG4BoxIntroLen;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   366
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   367
	while ((dataInBox > 0) && !iIsFinished)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   368
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   369
		ReadBoxHeaderL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   370
		dataInBox -= iSize;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   371
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   372
		if (iTitle == KHdlr)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   373
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   374
			ReadHandlerL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   375
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   376
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   377
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   378
			SkipCurrentBoxL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   379
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   380
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   381
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   382
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   383
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   384
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   385
// Parses a 'hdlr' box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   386
// This is a stand-alone box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   387
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   388
void TMPEG4Parser::ReadHandlerL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   389
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   390
	// Intro: [size][title][versionFlags][predefined][handler_type] = 20 bytes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   391
	const TInt KMPEG4HandlerIntroLen = 20;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   392
	TUint32 versionFlags;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   393
	TUint32 predefined;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   394
	TUint32 handler;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   395
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   396
	iReader.Read32L(versionFlags);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   397
	iReader.Read32L(predefined);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   398
	if (predefined != 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   399
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   400
		User::Leave(KErrCorrupt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   401
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   402
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   403
	iReader.Read32L(handler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   404
	if (handler == KVide)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   405
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   406
		iFlags.SetBit(KMPEG4VideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   407
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   408
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   409
	iReader.SeekL(iSize - KMPEG4HandlerIntroLen);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   410
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   411
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   412
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   413
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   414
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   415
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   416
void TMPEG4Parser::ReadTrackHeaderL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   417
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   418
	const TUint8 KMPEG4TrackVersion0 = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   419
	const TUint8 KMPEG4TrackVersion1 = 1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   420
	const TInt KMPEG4Version0ToVolume = 32; // Distance to volume field from version=0 field.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   421
	const TInt KMPEG4Version1ToVolume = 44; // Distance to volume field from version=1 field.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   422
	const TInt KMPEG4VolumeToWidth = 38;	// Distance to width field from volume field.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   423
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   424
	TUint32 versionFlags;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   425
	TUint16 volume;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   426
	TUint32 width;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   427
	TUint32 height;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   428
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   429
	// This box contains information about a single track.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   430
	iReader.Read32L(versionFlags);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   431
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   432
	// The highest 8 bits contains the version.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   433
	switch (HIGH_BYTE32(versionFlags))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   434
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   435
		case KMPEG4TrackVersion0:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   436
			iReader.SeekL(KMPEG4Version0ToVolume);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   437
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   438
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   439
		case KMPEG4TrackVersion1:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   440
			iReader.SeekL(KMPEG4Version1ToVolume);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   441
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   442
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   443
		default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   444
			User::Leave(KErrCorrupt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   445
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   446
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   447
	// Volume can not be used to distinguish between audio and video anymore.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   448
	iReader.Read16L(volume);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   449
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   450
	// We want to seek ahead to read the 'width' and 'height' fields.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   451
	iReader.SeekL(KMPEG4VolumeToWidth);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   452
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   453
	iReader.Read32L(width);		// 16.16 fixed-point
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   454
	iReader.Read32L(height);	// 16.16 fixed-point
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   455
	if ((width != 0) && (height != 0))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   456
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   457
		iFlags.SetBit(KMPEG4VideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   458
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   459
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   460
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   461
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   462
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   463
// Parses the 'ftyp' box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   464
// Records the first recognised brand that helps to
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   465
// identify the mime-type.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   466
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   467
void TMPEG4Parser::ReadFileTypeL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   468
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   469
	// Intro = [size][title][majorBrand] = 12 bytes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   470
	const TInt KMPEG4FtypIntroLen = 12;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   471
	TUint32 brand;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   472
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   473
	// If the majorBrand isn't recognised we should also
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   474
	// search the compatible brand list.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   475
	TInt64 bytesRemaining = iSize - KMPEG4FtypIntroLen;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   476
	//here there should be bytes remaining. Otherwise we cant read.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   477
	if( bytesRemaining <0 )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   478
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   479
	    User::Leave(KErrCorrupt);    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   480
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   481
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   482
	iReader.Read32L(brand);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   483
	iBrandIndex = TMPEG4Parser::IsCompatibleBrand(brand);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   484
	if (iBrandIndex != KErrNotFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   485
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   486
		// The major brand was recognised.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   487
		// Skip to the end of the ftyp box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   488
		iReader.SeekL(bytesRemaining);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   489
		return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   490
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   491
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   492
	// The major brand wasn't recognised.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   493
	// Skip over the version info (32 bit) to the start of the
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   494
	// compatible brands list.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   495
	TInt skip = sizeof(TUint32);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   496
	iReader.SeekL(skip);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   497
	bytesRemaining -= skip;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   498
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   499
	while ((iBrandIndex == KErrNotFound) && (bytesRemaining > 0))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   500
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   501
		iReader.Read32L(brand);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   502
		bytesRemaining -= skip;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   503
		iBrandIndex = TMPEG4Parser::IsCompatibleBrand(brand);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   504
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   505
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   506
	iReader.SeekL(bytesRemaining);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   507
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   508
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   509
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   510
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   511
// Reads the first few bytes of a box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   512
// The exact amount read depends on the box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   513
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   514
void TMPEG4Parser::ReadBoxHeaderL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   515
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   516
	const TInt KMPEG4ExtendedTypeLen = 16;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   517
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   518
	TUint32 word1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   519
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   520
	iReader.Read32L(word1);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   521
	iReader.Read32L(iTitle);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   522
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   523
	switch (word1)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   524
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   525
		case 0:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   526
			// Box extends to the end of file.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   527
			iSize = MAKE_TINT64(0, 0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   528
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   529
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   530
		case 1:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   531
			// Size is specified in a 64-bit field.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   532
		    iSizeIn32bit = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   533
			iReader.Read64L(iSize);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   534
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   535
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   536
		default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   537
			// It's an actual 32-bit size.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   538
		    iSizeIn32bit = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   539
			iSize = MAKE_TINT64(0, word1);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   540
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   541
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   542
	if (iTitle == KUuid)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   543
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   544
		// Skip the extended type.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   545
		iReader.SeekL(KMPEG4ExtendedTypeLen);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   546
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   547
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   548
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   549