--- a/videoeditorengine/h263decoder/src/VedVolReader.cpp Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,889 +0,0 @@
-/*
-* Copyright (c) 2010 Ixonos Plc.
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - Initial contribution
-*
-* Contributors:
-* Ixonos Plc
-*
-* Description:
-* MPEG-4 VOL header parsing.
-*
-*/
-
-
-// INCLUDE FILES
-#include "mpegcons.h"
-#include "VedVolReader.h"
-
-
-
-// MACROS
-#ifdef _DEBUG
-#include <e32svr.h>
-#define PRINT(x) RDebug::Print x;
-#else
-#define PRINT(x)
-#endif
-
-
-
-// CONSTANTS
-const TUint8 CVedVolReader::KMsbMask[] = {1, 3, 7, 15, 31, 63, 127, 255};
-const TUint8 CVedVolReader::KLsbMask[] = {255, 254, 252, 248, 240, 224, 192, 128, 0};
-
-const TInt CVedVolReader::KMaxUserDataLength = 512;
-
-
-
-// ================= MEMBER FUNCTIONS =======================
-
-// Two-phased constructor
-EXPORT_C CVedVolReader* CVedVolReader::NewL()
- {
- CVedVolReader* self = new (ELeave) CVedVolReader();
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self);
- return self;
- }
-
-
-// C++ default constructor
-CVedVolReader::CVedVolReader() : iBitstreamMode(EVedVideoBitstreamModeUnknown)
- {
- // Reset the header data to zeroes
- Mem::FillZ(&iHeader, sizeof(TVolHeader));
- }
-
-// Symbian OS default constructor can leave
-void CVedVolReader::ConstructL()
- {
- }
-
-// Destructor
-CVedVolReader::~CVedVolReader()
- {
- if (iHeader.iUserData != 0)
- {
- delete iHeader.iUserData;
- }
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::ParseVolHeaderL
-// Parses given Video Object Layer header
-// ---------------------------------------------------------
-//
-EXPORT_C TInt CVedVolReader::ParseVolHeaderL(TDesC8& aData)
- {
- TInt useDefaultVBVParams = 0;
- TInt numBits;
- TUint32 bits;
-
- // Reset the header data
- if (iHeader.iUserData != 0)
- {
- delete iHeader.iUserData;
- iHeader.iUserData = 0;
- }
- Mem::FillZ(&iHeader, sizeof(TVolHeader));
- iBitstreamMode = EVedVideoBitstreamModeUnknown;
- iHeaderSize = 0;
-
- // Check that we have something to parse
- if (aData.Length() == 0)
- {
- User::Leave(KErrNotFound);
- }
-
- TSeqHeaderBuffer buffer(aData, 0, 7); // Bit 7 is the first bit in a byte
-
- // if H.263 PSC is present
- bits = ReadSeqHeaderBits(buffer, 22, EFalse);
- if (bits == 32)
- {
- // This is H.263 so there are no VOL headers
- iBitstreamMode = EVedVideoBitstreamModeH263;
- return KErrNone;
- }
-
- // if Visual Object Sequence Start Code is present
- bits = ReadSeqHeaderBits(buffer, MP4_VOS_START_CODE_LENGTH, EFalse);
- if (bits == MP4_VOS_START_CODE)
- {
- // vos_start_code
- ReadSeqHeaderBits(buffer, MP4_VOS_START_CODE_LENGTH, ETrue);
-
- // profile_and_level_indication (8 bits)
- bits = ReadSeqHeaderBits(buffer, 8, ETrue);
- // 8: Simple Profile Level 0 (from ISO/IEC 14496-2:1999/FPDAM4 [N3670] October 2000)
- // 9: Simple Profile Level 0b
- // 1: Simple Profile Level 1
- // 2: Simple Profile Level 2
- // 3: Simple Profile Level 3
- // 4: Simple Profile Level 4a
- if (bits != 1 && bits != 2 && bits != 3 && bits != 4 && bits != 8 && bits != 9)
- {
- // Profile level id was not recognized so take a guess
- // This is changed later if resolution does not match
- bits = 9;
- }
-
- iHeader.iProfileLevelId = (TInt) bits;
-
- ReadUserDataL(buffer);
- }
-
- // if Visual Object Start Code is present
- bits = ReadSeqHeaderBits(buffer, MP4_VO_START_CODE_LENGTH, EFalse);
- if (bits == MP4_VO_START_CODE)
- {
- // visual_object_start_code
- ReadSeqHeaderBits(buffer, MP4_VO_START_CODE_LENGTH, ETrue);
-
- // is_visual_object_identifier (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- // visual_object_ver_id (4 bits)
- bits = ReadSeqHeaderBits(buffer, 4, ETrue);
- if (bits != 1 && bits != 2)
- {
- // this is not an MPEG-4 version 1 or 2 stream
- PRINT((_L("CVedVolReader: ERROR - This is not an MPEG-4 version 1 or 2 stream")))
- User::Leave(KErrNotSupported);
- }
-
- // visual_object_priority (3 bits)
- bits = ReadSeqHeaderBits(buffer, 3, ETrue);
- iHeader.iVoPriority = (TInt) bits;
- }
- else
- {
- iHeader.iVoPriority = 0;
- }
-
- // visual_object_type (4 bits)
- bits = ReadSeqHeaderBits(buffer, 4, ETrue);
- if (bits != 1)
- {
- // this is not a video object
- PRINT((_L("CVedVolReader: ERROR - This is not a video object")))
- User::Leave(KErrNotSupported);
- }
-
- // is_video_signal_type (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- /* Note: The following fields in the bitstream give information about the
- video signal type before encoding. These parameters don't influence the
- decoding algorithm, but the composition at the output of the video decoder.
- Until a way to utilize them is found, these fields are just dummyly read,
- but not interpreted.
- For interpretation see the MPEG-4 Visual standard page 66-70. */
-
- // video_format (3 bits)
- bits = ReadSeqHeaderBits(buffer, 3, ETrue);
- iHeader.iVideoFormat = (TInt) bits;
-
- // video_range (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- iHeader.iVideoRange = (TInt) bits;
-
- // colour_description (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- // colour_primaries (8 bits)
- bits = ReadSeqHeaderBits(buffer, 8, ETrue);
- iHeader.iColourPrimaries = (TInt) bits;
-
- // transfer_characteristics (8 bits)
- bits = ReadSeqHeaderBits(buffer, 8, ETrue);
- iHeader.iTransferCharacteristics = (TInt) bits;
-
- // matrix_coefficients (8 bits)
- bits = ReadSeqHeaderBits(buffer, 8, ETrue);
- iHeader.iMatrixCoefficients = (TInt) bits;
- }
- else
- {
- iHeader.iColourPrimaries = 1; // default: ITU-R BT.709
- iHeader.iTransferCharacteristics = 1; // default: ITU-R BT.709
- iHeader.iMatrixCoefficients = 1; // default: ITU-R BT.709
- }
- }
- else
- {
- // default values
- iHeader.iVideoFormat = 5; // Unspecified video format
- iHeader.iVideoRange = 0; // Y range 16-235 pixel values
- iHeader.iColourPrimaries = 1; // ITU-R BT.709
- iHeader.iTransferCharacteristics = 1; // ITU-R BT.709
- iHeader.iMatrixCoefficients = 1; // ITU-R BT.709
- }
-
- // check the next start code
- ReadSeqHeaderBits(buffer, 1, ETrue);
- if (buffer.iBitInOctet != 7)
- {
- numBits = buffer.iBitInOctet + 1;
-
- bits = ReadSeqHeaderBits(buffer, numBits, ETrue);
- if (bits != (TUint32) ((1 << numBits)-1))
- {
- // stuffing error in VO
- PRINT((_L("CVedVolReader: ERROR - Stuffing error")))
- User::Leave(KErrNotSupported);
- }
- }
-
- ReadUserDataL(buffer);
- }
-
- // if Video Object Start Code is present
- bits = ReadSeqHeaderBits(buffer, MP4_VID_START_CODE_LENGTH, EFalse);
- if (bits == MP4_VID_START_CODE)
- {
- // video_object_start_code
- ReadSeqHeaderBits(buffer, MP4_VID_START_CODE_LENGTH, ETrue);
-
- // video_object_id
- bits = ReadSeqHeaderBits(buffer, MP4_VID_ID_CODE_LENGTH, ETrue);
- iHeader.iVoId = (TInt) bits;
- }
-
- // Check if H.263 PSC follows the VO header, in which case this is MPEG-4 with short header
- bits = ReadSeqHeaderBits(buffer, 22, EFalse);
- if (bits == 32 || buffer.iData.Length() <= buffer.iGetIndex)
- {
- iBitstreamMode = EVedVideoBitstreamModeMPEG4ShortHeader;
-
- // Calculate the header size in bytes
- if (buffer.iBitInOctet == 7)
- {
- // The size is a multiple of 8 bits so the size is the number of bytes we've read so far
- iHeaderSize = buffer.iGetIndex;
- }
- else
- {
- // Round up to the next full byte
- iHeaderSize = buffer.iGetIndex + 1;
- }
-
- // We no longer support short header clips
- User::Leave(KErrNotSupported);
- }
-
- // vol_start_code
- bits = ReadSeqHeaderBits(buffer, MP4_VOL_START_CODE_LENGTH, ETrue);
- if(bits != MP4_VOL_START_CODE)
- {
- PRINT((_L("CVedVolReader: ERROR - Bitstream does not start with MP4_VOL_START_CODE")))
- User::Leave(KErrCorrupt);
- }
-
- // vol_id
- bits = ReadSeqHeaderBits(buffer, MP4_VOL_ID_CODE_LENGTH, ETrue);
- iHeader.iVolId = (TInt) bits;
-
- // random_accessible_vol (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- iHeader.iRandomAccessibleVol = (TUint8) bits;
-
- // video_object_type_indication (8 bits)
- bits = ReadSeqHeaderBits(buffer, 8, ETrue);
- if (bits != 1)
- {
- // this is not a simple video object stream
- PRINT((_L("CVedVolReader: ERROR - This is not a simple video object stream")))
- User::Leave(KErrNotSupported);
- }
-
- // is_object_layer_identifier (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- // visual_object_ver_id (4 bits)
- bits = ReadSeqHeaderBits(buffer, 4, ETrue);
- if (bits != 1 && bits != 2)
- {
- // this is not an MPEG-4 version 1 or 2 stream
- PRINT((_L("CVedVolReader: ERROR - This is not an MPEG-4 version 1 or 2 stream")))
- User::Leave(KErrNotSupported);
- }
-
- // video_object_layer_priority (3 bits)
- bits = ReadSeqHeaderBits(buffer, 3, ETrue);
- iHeader.iVoPriority = (TInt) bits;
- }
-
- // aspect_ratio_info: `0010`- 12:11 (625-type for 4:3 picture)
- bits = ReadSeqHeaderBits(buffer, 4, ETrue);
- iHeader.iPixelAspectRatio = (TInt) bits;
-
- // extended par
- if (bits == 15)
- {
- // par_width
- bits = ReadSeqHeaderBits(buffer, 8, ETrue);
- // par_height
- bits = ReadSeqHeaderBits(buffer, 8, ETrue);
- }
-
- // vol_control_parameters flag
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- // chroma_format (2 bits)
- bits = ReadSeqHeaderBits(buffer, 2, ETrue);
- if (bits != 1)
- {
- PRINT((_L("CVedVolReader: ERROR - Not supported chroma format")))
- User::Leave(KErrNotSupported);
- }
-
- // low_delay (1 bits)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
-
- // vbv_parameters (1 bits)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- // first_half_bitrate (15 bits)
- bits = ReadSeqHeaderBits(buffer, 15, ETrue);
- iHeader.iBitRate = (bits << 15);
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // latter_half_bitrate (15 bits)
- bits = ReadSeqHeaderBits(buffer, 15, ETrue);
- iHeader.iBitRate += bits;
- iHeader.iBitRate *= 400;
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // first_half_vbv_buffer_size (15 bits)
- bits = ReadSeqHeaderBits(buffer, 15, ETrue);
- iHeader.iVbvBufferSize = (bits << 3);
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // latter_half_vbv_buffer_size (3 bits)
- bits = ReadSeqHeaderBits(buffer, 3, ETrue);
- iHeader.iVbvBufferSize += bits;
- iHeader.iVbvBufferSize *= 16384;
-
- // first_half_vbv_occupancy (11 bits)
- bits = ReadSeqHeaderBits(buffer, 11, ETrue);
- iHeader.iVbvOccupancy = (bits << 15);
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // latter_half_vbv_occupancy (15 bits)
- bits = ReadSeqHeaderBits(buffer, 15, ETrue);
- iHeader.iVbvOccupancy += bits;
- iHeader.iVbvOccupancy *= 64;
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
- }
- else
- {
- useDefaultVBVParams = 1;
- }
- }
- else
- {
- useDefaultVBVParams = 1;
- }
-
- // vol_shape (2 bits)
- bits = ReadSeqHeaderBits(buffer, 2, ETrue);
- // rectangular_shape = '00'
- if (bits != 0)
- {
- PRINT((_L("CVedVolReader: ERROR - Not rectangular shape is not supported")))
- User::Leave(KErrNotSupported);
- }
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // time_increment_resolution
- bits = ReadSeqHeaderBits(buffer, 16, ETrue);
- iHeader.iTimeIncrementResolution = (TInt) bits;
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // fixed_vop_rate
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
-
- // fixed_vop_time_increment (1-15 bits)
- if (bits)
- {
- for (numBits = 1; ((iHeader.iTimeIncrementResolution-1) >> numBits) != 0; numBits++)
- {
- }
-
- bits = ReadSeqHeaderBits(buffer, numBits, ETrue);
- }
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // vol_width (13 bits)
- bits = ReadSeqHeaderBits(buffer, 13, ETrue);
- iHeader.iLumWidth = (TInt) bits;
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // vol_height (13 bits)
- bits = ReadSeqHeaderBits(buffer, 13, ETrue);
- iHeader.iLumHeight = (TInt) bits;
-
- // Accept only resolutions that are divisible by 16
- if ( ((iHeader.iLumWidth & 0x0000000f) != 0) ||
- ((iHeader.iLumHeight & 0x0000000f) != 0) )
- {
- PRINT((_L("CVedVolReader: ERROR - Unsupported resolution")))
- User::Leave(KErrNotSupported);
- }
-
- TInt macroBlocks = iHeader.iLumWidth * iHeader.iLumHeight / (16 * 16);
-
- // Check that we don't have too many macro blocks (ie resolution is not too big)
- if( macroBlocks > 1200 )
- {
- PRINT((_L("CVedVolReader: ERROR - Unsupported resolution")))
- User::Leave(KErrNotSupported);
- }
-
- // Check that profile level id matches with the number of macro blocks
- if( macroBlocks > 396 )
- {
- // Resolution is higher than CIF => level must be 4a
- if( iHeader.iProfileLevelId != 4 )
- {
- iHeader.iProfileLevelId = 4;
- useDefaultVBVParams = 1;
- }
- }
- else if( macroBlocks > 99 )
- {
- // Resolution is higher than QCIF => level must be atleast 2
- if( iHeader.iProfileLevelId < 2 || iHeader.iProfileLevelId > 4 )
- {
- iHeader.iProfileLevelId = 3; // QVGA/CIF @ 30fps
- useDefaultVBVParams = 1;
- }
- }
-
- // Set default VBV params if not set already
- if (useDefaultVBVParams)
- {
- switch (iHeader.iProfileLevelId)
- {
- case 1:
- iHeader.iVbvBufferSize = 10;
- iHeader.iBitRate = 64;
- break;
- case 2:
- iHeader.iVbvBufferSize = 20;
- iHeader.iBitRate = 128;
- break;
- case 4:
- iHeader.iVbvBufferSize = 80;
- iHeader.iBitRate = 4000;
- break;
- case 8:
- iHeader.iVbvBufferSize = 10;
- iHeader.iBitRate = 64;
- break;
- case 9:
- iHeader.iVbvBufferSize = 20;
- iHeader.iBitRate = 128;
- break;
- default:
- iHeader.iVbvBufferSize = 20;
- iHeader.iBitRate = 384;
- break;
- }
-
- iHeader.iVbvOccupancy = iHeader.iVbvBufferSize * 170;
-
- iHeader.iVbvOccupancy *= 64;
- iHeader.iVbvBufferSize *= 16384;
- iHeader.iBitRate *= 1024;
- }
-
- // marker_bit
- if (!ReadSeqHeaderBits(buffer, 1, ETrue))
- {
- User::Leave(KErrCorrupt);
- }
-
- // interlaced (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- PRINT((_L("CVedVolReader: ERROR - Interlaced VOP not supported")))
- User::Leave(KErrNotSupported);
- }
-
- // OBMC_disable
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (!bits)
- {
- PRINT((_L("CVedVolReader: ERROR - Overlapped motion compensation not supported")))
- User::Leave(KErrNotSupported);
- }
-
- // sprite_enable (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- PRINT((_L("CVedVolReader: ERROR - Sprites not supported")))
- User::Leave(KErrNotSupported);
- }
-
- // not_8_bit (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- PRINT((_L("CVedVolReader: ERROR - Not 8 bits/pixel not supported")))
- User::Leave(KErrNotSupported);
- }
-
- // quant_type (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- PRINT((_L("CVedVolReader: ERROR - H.263/MPEG-2 Quant Table switch not supported")))
- User::Leave(KErrNotSupported);
- }
-
- // complexity_estimation_disable (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (!bits)
- {
- PRINT((_L("CVedVolReader: ERROR - Complexity estimation header not supported")))
- User::Leave(KErrNotSupported);
- }
-
- // resync_marker_disable (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- iHeader.iErrorResDisable = (TUint8) bits;
-
- // data_partitioned (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- iHeader.iDataPartitioned = (TUint8) bits;
-
- if (iHeader.iDataPartitioned)
- {
- // reversible_vlc (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- iHeader.iReversibleVlc = (TUint8) bits;
- }
-
- // scalability (1 bit)
- bits = ReadSeqHeaderBits(buffer, 1, ETrue);
- if (bits)
- {
- PRINT((_L("CVedVolReader: ERROR - Scalability not supported")))
- User::Leave(KErrNotSupported);
- }
-
- // check the next start code
- ReadSeqHeaderBits(buffer, 1, ETrue);
- if (buffer.iBitInOctet != 7)
- {
- numBits = buffer.iBitInOctet + 1;
-
- bits = ReadSeqHeaderBits(buffer, numBits, ETrue);
-
- /* Removed temporarily
- if (bits != (TUint32) ((1 << numBits)-1))
- {
- // this is not a video object
- PRINT((_L("CVedVolReader: ERROR - Stuffing error")))
- User::Leave(KErrNotSupported);
- }*/
- }
-
- ReadUserDataL(buffer);
-
- // Calculate the header size in bytes
- if (buffer.iBitInOctet == 7)
- {
- // The size is a multiple of 8 bits so the size is the number of bytes we've read so far
- iHeaderSize = buffer.iGetIndex;
- }
- else
- {
- // Round up to the next full byte
- iHeaderSize = buffer.iGetIndex + 1;
- }
-
- // Determine the bitstream mode
- iBitstreamMode = CheckBitstreamMode(iHeader.iErrorResDisable, iHeader.iDataPartitioned, iHeader.iReversibleVlc);
-
- // If no error in bit buffer functions
- return KErrNone;
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::ReadSeqHeaderBits
-// Reads requested bits from given buffer
-// ---------------------------------------------------------
-//
-TUint32 CVedVolReader::ReadSeqHeaderBits(TSeqHeaderBuffer& aBuffer, TInt aNumBits, TBool aFlush)
- {
- TUint startIndex; // the index of the first byte to read
- TUint startMask; // the mask for the first byte
- TUint endIndex; // the index of the last byte to read
- TUint endMask; // the mask for the last byte
- TUint endShift; // the number of shifts after masking the last byte
- TUint endNumberOfBits; // the number of bits in the last byte
- TUint newBitIndex; // bitIndex after getting the bits
- TUint newGetIndex; // getIndex after getting the bits
-
- TUint32 returnValue = 0;
-
- startIndex = aBuffer.iGetIndex;
- startMask = KMsbMask[aBuffer.iBitInOctet];
-
- // Check that there are enough bits left
- if (startIndex * 8 + aNumBits > aBuffer.iData.Length() * 8)
- {
- return 0;
- }
-
- if (aBuffer.iBitInOctet + 1 >= aNumBits)
- {
- // The bits are within one byte.
- endShift = aBuffer.iBitInOctet - aNumBits + 1;
- endMask = KLsbMask[endShift];
- returnValue = (aBuffer.iData[startIndex] & startMask & endMask) >> endShift;
- if (endShift > 0)
- {
- newBitIndex = aBuffer.iBitInOctet - aNumBits;
- newGetIndex = aBuffer.iGetIndex;
- }
- else
- {
- newBitIndex = 7;
- newGetIndex = aBuffer.iGetIndex + 1;
- }
- }
- else
- {
- // The bits are in multiple bytes.
- aNumBits -= aBuffer.iBitInOctet + 1;
- endNumberOfBits = aNumBits & 7;
-
- newBitIndex = 7 - endNumberOfBits;
- newGetIndex = aBuffer.iGetIndex + (aNumBits >> 3) + 1;
-
- // Calculate the return value.
- endIndex = newGetIndex;
- endShift = 8 - (aNumBits & 7);
- endMask = KLsbMask[endShift];
-
- returnValue = aBuffer.iData[startIndex] & startMask;
- startIndex++;
-
- while (startIndex != endIndex)
- {
- returnValue <<= 8;
- returnValue += (TUint8) aBuffer.iData[startIndex];
- startIndex++;
- }
-
- if (endNumberOfBits != 0)
- {
- returnValue <<= endNumberOfBits;
- returnValue += (aBuffer.iData[startIndex] & endMask) >> endShift;
- }
- }
-
- if (aFlush)
- {
- // Update indexes.
- aBuffer.iGetIndex = newGetIndex;
- aBuffer.iBitInOctet = newBitIndex;
- }
-
- return returnValue;
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::ReadUserDataL
-// Reads user data from given buffer
-// ---------------------------------------------------------
-//
-void CVedVolReader::ReadUserDataL(TSeqHeaderBuffer& aBuffer)
- {
- TUint32 bits;
-
- // Check if User data is available
- bits = ReadSeqHeaderBits(aBuffer, 32, EFalse);
- if (bits == MP4_USER_DATA_START_CODE)
- {
- if (iHeader.iUserData == 0)
- {
- iHeader.iUserData = HBufC8::NewL(KMaxUserDataLength);
- }
-
- TInt i = iHeader.iUserData->Length();
- do
- {
- bits = ReadSeqHeaderBits(aBuffer, 8, ETrue);
- if (i++ < KMaxUserDataLength)
- {
- (iHeader.iUserData->Des()).Append(TChar(bits));
- }
- }
- while (aBuffer.iData.Length() > aBuffer.iGetIndex &&
- ReadSeqHeaderBits(aBuffer, 24, EFalse) != 0x1);
- }
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::CheckBitstreamMode
-// Checks what is the bit stream mode the video
-// ---------------------------------------------------------
-//
-TVedVideoBitstreamMode CVedVolReader::CheckBitstreamMode(TUint8 aErd, TUint8 aDp, TUint8 aRvlc)
- {
- TVedVideoBitstreamMode mode = EVedVideoBitstreamModeUnknown;
- int combination = ((!aErd) << 2) | (aDp << 1) | aRvlc;
-
- switch (combination)
- {
- case 0:
- mode = EVedVideoBitstreamModeMPEG4Regular;
- break;
- case 2:
- mode = EVedVideoBitstreamModeMPEG4DP;
- break;
- case 3:
- mode = EVedVideoBitstreamModeMPEG4DP_RVLC;
- break;
- case 4:
- mode = EVedVideoBitstreamModeMPEG4Resyn;
- break;
- case 6:
- mode = EVedVideoBitstreamModeMPEG4Resyn_DP;
- break;
- case 7:
- mode = EVedVideoBitstreamModeMPEG4Resyn_DP_RVLC;
- break;
- default:
- break;
- }
-
- return mode;
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::TimeIncrementResolution
-// Returns the time increment resolution that was read from the VOL header
-// ---------------------------------------------------------
-//
-EXPORT_C TInt CVedVolReader::TimeIncrementResolution() const
- {
- return iHeader.iTimeIncrementResolution;
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::Width
-// Returns the width of the video that was read from the VOL header
-// ---------------------------------------------------------
-//
-EXPORT_C TInt CVedVolReader::Width() const
- {
- return iHeader.iLumWidth;
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::Height
-// Returns the height of the video that was read from the VOL header
-// ---------------------------------------------------------
-//
-EXPORT_C TInt CVedVolReader::Height() const
- {
- return iHeader.iLumHeight;
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::ProfileLevelId
-// Returns the Level Id of the Simple Profile the Video Object conforms to
-// ---------------------------------------------------------
-//
-EXPORT_C TInt CVedVolReader::ProfileLevelId() const
- {
- return iHeader.iProfileLevelId;
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::BitstreamMode
-// Returns the bitstream mode of the video
-// ---------------------------------------------------------
-//
-EXPORT_C TVedVideoBitstreamMode CVedVolReader::BitstreamMode() const
- {
- return iBitstreamMode;
- }
-
-// ---------------------------------------------------------
-// CVedVolReader::HeaderSize
-// Returns the bitstream mode of the video
-// ---------------------------------------------------------
-//
-EXPORT_C TInt CVedVolReader::HeaderSize() const
- {
- return iHeaderSize;
- }
-