diff -r 4a629bc82c5e -r b67dd1fc57c5 mmserv/metadatautility/Src/MetaDataParserWMA.cpp --- a/mmserv/metadatautility/Src/MetaDataParserWMA.cpp Fri Apr 30 19:18:45 2010 -0500 +++ b/mmserv/metadatautility/Src/MetaDataParserWMA.cpp Fri May 14 18:19:45 2010 -0500 @@ -28,6 +28,23 @@ #include // CONSTANTS +/*** + * File Properties Objects: + * Object ID, GUID, 128 [bits] + * Object Size, QWORD, 64 + * File ID, GUID, 128 + * File Size, QWORD, 64 + * Creation Date, QWORD, 64 + * Data Packets Count, QWORD, 64 + * Play Duration, QWORD, 64 + * Send Duration, QWORD, 64 + * Preroll, QWORD, 64 + * Flags, DWORD, 32 + */ +const TInt KDurationOffset = 64; // duration offset from File Property object +const TInt KPrerollOffset = 80; // preRoll offset from File Property object +const TInt KFlagsOffset = 88; // flags offset from File Property object + // ASF Header Object GUIDs _LIT8 (KASFContentDescriptionObject, "75B22633668E11CFA6D900AA0062CE6C"); @@ -695,22 +712,37 @@ // void CMetaDataParserWMA::GetDurationL() { - TInt offset = iFilePropertiesOffset + 16; - TPtrC8 size8 = iHeaderData->Mid(offset, 8); - TInt size = ConvertToInt64(size8); - offset = iFilePropertiesOffset + 88; - TPtrC8 flags = iHeaderData->Mid(offset, 4); - TInt broadcastBit = (TInt) (flags[0] & 0x01); - if(broadcastBit == 1) - { - return; // duration not valid. - } - //offset = iFilePropertiesOffset + 48; - TPtrC8 duration8 = iHeaderData->Mid(offset - 24, 8); // 100 nanosec units - TReal sec = ((TReal)ConvertToInt64(duration8)) / 10000000; // seconds - TBuf16<10> des16; - des16.Num(sec, TRealFormat (9, 3)); +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParserWMA::GetDuration()")); +#endif + TInt offset = iFilePropertiesOffset + KFlagsOffset; + TPtrC8 flags = iHeaderData->Mid(offset, 4); + TInt broadcastBit = (TInt) (flags[0] & 0x01); + if(broadcastBit == 1) + { + return; // duration not valid. + } + + offset = iFilePropertiesOffset + KDurationOffset; + TPtrC8 duration8 = iHeaderData->Mid(offset, 8); // 100 nanosec units + TReal durationSec = ((TReal)ConvertToInt64(duration8)) / 10000000; // seconds + + offset = iFilePropertiesOffset + KPrerollOffset; + TPtrC8 preRoll8 = iHeaderData->Mid(offset, 8); // millisec units + TReal preRollSec = ((TReal)ConvertToInt64(preRoll8)) / 1000; // seconds + TReal sec = durationSec - preRollSec; // not include preroll + + TBuf16<10> des16; + TRealFormat format(9, 3); // width=9, decimal place=3 + // Use fixed format, and do not use Triads + format.iType = KRealFormatFixed | KDoNotUseTriads; + des16.Num(sec, format); // convert to string + iContainer->AppendL( EMetaDataDuration, des16 ); +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParserWMA::GetDuration(), duration=%f"), sec); +#endif + }