mmlibs/mmfw/Recogniser/src/mpeg2parser.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 "parsers.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
static const TUint8 KISOEndCode = 0xB9;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
static const TUint8 KPackStartCode = 0xBA;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
static const TUint8 KVideoElementaryStream = 0xE0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
#define KMPEG1PackHeaderLen		8
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
#define KMPEG2PackHeaderLen		10
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
#define KMPEG1PackHeaderID		0x21	// 0010xxx1. See Doc Link 2.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
#define KMPEG2PackHeaderID		0x44	// 01xxx1xx. See Doc Link 2.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
#define KStartCodeMask			0xffffff00
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
#define KStartCodeIntro			0x00000100
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
#define KMPEG2StartCode1Bit	KBit1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
#define KMPEG2StartCode2Bit	KBit2
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
#define KMPEG2VideoBit		KBit3
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
#define KMPEG2MPEG1Bit		KBit4
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
// Mapping flags to a confidence level.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
// A: extension match
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
// B: start-code1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
// C: start-code2
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
// C B A -> Confidence
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
// -------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
// 0 0 0 -> ENotRecognised
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
// 0 0 1 -> EPossible
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
// 0 1 0 -> EPossible
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
// 0 1 1 -> EProbable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
// 1 0 0 -> ENotRecognised
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
// 1 0 1 -> ENotRecognised
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
// 1 1 0 -> EProbable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
// 1 1 1 -> ECertain
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
static const TInt KMPEG2FlagsToConfidence[] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
	KConfPossible,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
	KConfPossible,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
	KConfProbable,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
	KConfNotRecognised,
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
#define KMPEG2ConfidenceMask	0x07	// 00000111
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
#define KMPEG2MimeMask	 		0x18	// 00011000
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
#define KMPEG2MimeShift			0x03	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
static const TInt KMPEG2ExtOnlyIndex = 1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
// The 'ED' bits of the flags member are used as an index into
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
// this table of possible MIME-types.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
// E: MPEG1 instead of MPEG2
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
// D: Video content present
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
// E D -> Mime
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
// -----------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
// 0 0 -> audio/mpeg2
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
// 0 1 -> video/mpeg2
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
// 1 0 -> audio/mpeg1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
// 1 1 -> video/mpeg1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
static const TText8* const KMPEG2Mimes[] = 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
	KMimeMPEG2_A,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
	KMimeMPEG2_V,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
	KMimeMPEG1_A,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
	KMimeMPEG1_V
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
// A list of known MPEG2 file extensions.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
// MPEG1 file extensions are also listed.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
typedef struct
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
	const TText* iExt;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
	const TText8* iMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
TMPEG2Types;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
static const TMPEG2Types KMPEG2Types[] = 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
		{ KExtMPEG_1, KMimeMPEG2_V },
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
		{ KExtMPEG_2, KMimeMPEG2_V },
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
		{ KExtMPEG_3, KMimeMPEG2_V },
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
		{ KExtMPEG_4, KMimeMPEG2_V },
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
		{ KExtMPEG_5, KMimeMPEG2_V },
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
		{ KExtMPEG_6, KMimeMPEG2_V },
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
		{ KExtMPEG_7, KMimeMPEG1_V },
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
		{ KExtMPEG_8, KMimeMPEG2_A }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
#define KMPEG2ExtCount sizeof(KMPEG2Types) / sizeof(TMPEG2Types)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
	
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
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
TMPEG2Parser::TMPEG2Parser(CReader& aReader, TFlags& aFlags)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
 :	iReader(aReader),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
 	iFlags(aFlags)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
// Match the file's extension to known MPEG2 file extensions.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
const TText8* TMPEG2Parser::MatchExtension(const TDesC& aExt)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
	if (aExt.Length() > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
		for (TInt i = 0; i < KMPEG2ExtCount; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
			if (aExt.MatchF(TPtrC(KMPEG2Types[i].iExt)) != KErrNotFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
				iFlags.SetExtensionFlag();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
				return KMPEG2Types[i].iMime;
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
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
	return NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
void TMPEG2Parser::DoRecognise(const TDesC& aExt, CReader& aReader, TMatch& aMatch)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
	TFlags flags;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
	TMPEG2Parser parser(aReader, flags);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
	const TText8* extMime = parser.MatchExtension(aExt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
	TRAP_IGNORE(parser.ParseL());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
	TInt confIndex = flags.GetBitField(KMPEG2ConfidenceMask);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
	aMatch.iConfidence = KMPEG2FlagsToConfidence[confIndex];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
	if (aMatch.iConfidence != KConfNotRecognised)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
		if (confIndex == KMPEG2ExtOnlyIndex)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
			// The content is corrupt, but the extension was recognised.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
			aMatch.iMime = extMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
			TInt mimeIndex = flags.GetBitField(KMPEG2MimeMask, KMPEG2MimeShift);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
			aMatch.iMime = KMPEG2Mimes[mimeIndex];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
// Attempts to parse an MPEG2 file by looking for start-codes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
void TMPEG2Parser::ParseL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
	TBool finished;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
	// Assume there's video content if we only have a buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
	if (iReader.Type() == CReader::EBuffer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
		iFlags.SetBit(KMPEG2VideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
	do
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
		finished = NextStartCodeL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
	while (!finished);
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
// Skips over the current start-code box.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
void TMPEG2Parser::SkipL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
	TUint16 size;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
	iReader.Read16L(size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
	iReader.SeekL((TInt)size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
	}
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
** Expects an MPEG2 Pack Header at the current location.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
** The Pack Header is used to determine between MPEG1 and MPEG2.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
void TMPEG2Parser::ReadPackHeaderL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
	TUint8 byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
	TBuf8<KMPEG2PackHeaderLen> header;	// Size is of whichever is larger.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
	iReader.ReadByteL(byte);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
	if ((byte & KMPEG1PackHeaderID) == KMPEG1PackHeaderID)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
		iFlags.SetBit(KMPEG2MPEG1Bit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
		header.SetLength(KMPEG1PackHeaderLen - 1);	// We've already read a byte.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
		iReader.ReadBytesL(header);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
	else if ((byte & KMPEG2PackHeaderID) == KMPEG2PackHeaderID)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
		header.SetLength(KMPEG2PackHeaderLen - 1);	// We've already read a byte.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
		iReader.ReadBytesL(header);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
		// The lowest 3 bits of the last byte say how much stuffing is present.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
		TInt stuffing = header[8] & 0x07; // 00000111
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
		if (stuffing)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
			iReader.SeekL(stuffing);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
		User::Leave(KErrCorrupt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
		
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
// Start codes are bit patterns that do not occur in the video stream.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
// The start-code sequence is expected to be at the current CReader position.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
TBool TMPEG2Parser::NextStartCodeL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
	TUint32 data;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
	iReader.Read32L(data);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
	// Start codes must begin with 0x000001ss, where 'ss' is the start code.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
	if ((data & KStartCodeMask) != KStartCodeIntro)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
		User::Leave(KErrCorrupt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
	if (!iFlags.GetBitField(KMPEG2StartCode1Bit))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
		iFlags.SetBit(KMPEG2StartCode1Bit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
		if (!iFlags.GetBitField(KMPEG2StartCode2Bit))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
			iFlags.SetBit(KMPEG2StartCode2Bit);
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
	// Try to identify the start code.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
	switch (LOW_BYTE(data))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
		case KPackStartCode:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
			ReadPackHeaderL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
		case KVideoElementaryStream:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
			iFlags.SetBit(KMPEG2VideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
			return ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
		case KISOEndCode:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
			// This code should occur at the end of the file and
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
			// it cannot be skipped over.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
			return ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
		default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
			SkipL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
	return EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299