[Helix-client-dev] Fixed audiohash generation bug [GMPMetaEditor]

Petar Basic <[email protected]> Wed, 10 Feb 2010 10:50:03 +0100
Newsgroups gmane.comp.multimedia.helix.devel
Message-ID <[email protected]>
Modified by: pbasic at real.com
Date: 2010/02/10
Project: GMP MetaEditor (meta3gp.exe)

Synopsis:
Fixed audiohash generation bug [GMPMetaEditor]

Details:
In extraction mode, metaeditor.dll was suppressing packet processing
without being aware of audiohash generation mode.  The logic which
decides whether to suppress packet processing has now been moved to
meta3gp.exe which has access to necessary information.

Testing:
Verified that different hash gets generated for media files with
different audio content.  Verified that same hash gets generated for
media files with same audio content but with different metadata.

Files Modified:
datatype/tools/dtdriver/apps/meta3gp/main.cpp
datatype/tools/metaeditor/editor.cpp

Platforms and Profiles Affected:
All

Image Size and Heap Use impact:
None

Platforms and Profiles Build Verified:
system id: win32-i386-vc7, sunos-5.10-sparc-studio11
profile: helix-client-all-defines

Platforms and Profiles Functionality Verified:
x86 Windows XP SP2
Sparc SunOS 5.10

Branch:
GMPMetaEditor

Copyright assignment:
I am a RealNetworks employee or contractor.

_______________________________________________
Helix-client-dev mailing list
[email protected]
http://lists.helixcommunity.org/mailman/listinfo/helix-client-dev
datatype_tools_dtdriver_apps_meta3gp.diff (application/octet-stream, 18.9 KB)
Index: main.cpp
===================================================================
RCS file: /cvsroot/datatype/tools/dtdriver/apps/meta3gp/main.cpp,v
retrieving revision 1.7.2.6
diff -d -H -w -U 30 -r1.7.2.6 main.cpp
--- main.cpp	20 Jan 2010 20:00:58 -0000	1.7.2.6
+++ main.cpp	10 Feb 2010 09:27:40 -0000
@@ -38,61 +38,61 @@
  *  Includes
  */
 #include <stdlib.h>
 #include <stdarg.h>
 
 #include "hlxclib/time.h"
 #include "hlxclib/stdio.h"
 #include "hlxclib/wchar.h"
 #include "hxtypes.h"
 #include "hlxosstr.h"
 #include "ffdriver.h"
 #include "cstrmsrt.h"
 #include "hxmemprb.h"
 #include "hxtick.h"
 #include "chxpckts.h"
 #include "pckunpck.h"
 #include "dllpath.h"
 #include "filespecutils.h"
 #include "metainfokeys.h"
 #include "uniconv.h"
 #include "proptools.h"
 #include "dllacces.h"
 #include "ihxmetaeditor.h"
 #include "HXXmlInputParser.h"
 #include "metautil.h"
 
 #include "meta3gp.ver"
 
 #ifdef HELIX_FEATURE_METAEDIT_AUDIO_HASH
 #include "mycrypt.h"
-#endif
+#endif //HELIX_FEATURE_METAEDIT_AUDIO_HASH
 
 
 /****************************************************************************
  *  Meta-data command line editor.
  *  Build-time configuration options.
  */
 
 // environment variable name
 #define PLUGIN_PATH_ENV_VAR_NAME "META3GP_PLUGIN_PATH"
 
 
 /****************************************************************************
  *  Component operational modes
  */
 HXBOOL g_bUseDefaultMetaEditorProcessor = FALSE;
 HXBOOL g_bUseDTDriverSynchronousMode = TRUE;
 
 
 /****************************************************************************
  *  DLLAccessPath Variable
  */
 ENABLE_DLLACCESS_PATHS(g_Meta3GPAccessPath);
 
 
 /****************************************************************************
  *  Defines
  */
 #define PROGRAM_VENDOR_STRING       "RealNetworks"
 #define PROGRAM_NAME_STRING         PROGRAM_VENDOR_STRING" meta-data editor"
 #define PROGRAM_COPYRIGHT_STRING    "Copyright (c) "PROGRAM_VENDOR_STRING" 2010"
@@ -669,61 +669,61 @@
     }
 
     static void ClearAPICFrameArray(CHXPtrArray& a)
     {
         for(INT32 i = 0; i < a.GetSize(); i++)
         {
             delete (ID3Tools::APICFrame*)a[i];
         }
         a.RemoveAll();
     }
 
     // meta-data input params
     HXBOOL ClearMetaData;
     HXBOOL ClearKeywords;
     HXBOOL ClearPictures;
     HXBOOL GenerateHash;
     UINT32 InjectedMetaFlavors;
     MetaInfo InjectedMetaInfo;
     CHXPtrArray AddedKeywords; //EncodedString pointers
     CHXPtrArray RemovedKeywords; //EncodedString pointers
     CHXPtrArray AddedPictures; //ID3Tools::APICFrame pointers
     CHXPtrArray RemovedPictures; //Integers
 
     // meta-data output storage
     MetaInfo ExtractedMetaInfo;
     MetaInfo OutboundMetaInfo;
 
 #ifdef HELIX_FEATURE_METAEDIT_AUDIO_HASH
     unsigned char SHAHash[32];
     hash_state HashState;
-#endif
+#endif //HELIX_FEATURE_METAEDIT_AUDIO_HASH
 };
 
 struct InputOption
 {
     InputOption(const CHXString& optionName,
                 const EncodedString& optionValueUTF8 = EncodedString(),
                 const EncodedString& xmlOptionValueUTF8 = EncodedString())
         : OptionName(optionName)
         , OptionValueUTF8(optionValueUTF8)
         , XmlOptionValueUTF8(xmlOptionValueUTF8)
     {
     }
 
     // XML value has precedence over command-line value
     const EncodedString& GetEffectiveOptionValueUTF8() const
     {
         return XmlOptionValueUTF8.IsEmpty() ? OptionValueUTF8 : XmlOptionValueUTF8;
     }
 
     // XML value has precedence over command-line value
     CHXString GetEffectiveOptionValueCCP() const
     {
         const EncodedString& val = GetEffectiveOptionValueUTF8();
         return CHXString((const char*)CCPFromUTF8(val.GetData()));
     }
 
     CHXString OptionName;
     EncodedString OptionValueUTF8;
     EncodedString XmlOptionValueUTF8;
 };
@@ -1675,86 +1675,86 @@
 
         // transfer final item set to the inject sink
         if(SUCCEEDED(res))
         {
             res = mi.CopyToValues(m_pContext, pInjectSink, FALSE, METAINFO_SET_ALL);
         }
 
         return res;
     }
     STDMETHOD(OnOutboundMetaData)(IHXValues* pValues)
     {
         // keep outbound
         m_vars.OutboundMetaInfo.Clear();
         return m_vars.OutboundMetaInfo.CopyFromValues(pValues, FALSE, METAINFO_SET_ALL);
     }
 
     STDMETHOD(OnPacket)(IHXPacket* pPacket)
     {
         HX_RESULT res = HXR_OK;
 
 #ifdef HELIX_FEATURE_METAEDIT_AUDIO_HASH
         if(m_vars.GenerateHash && pPacket)
         {
             IHXBuffer* pBuffer1;
             pBuffer1 = pPacket->GetBuffer();
             if(pBuffer1 &&  pBuffer1->GetSize()!=0 && pBuffer1->GetBuffer())
             {
                 sha256_process(&m_vars.HashState, (unsigned char*)pBuffer1->GetBuffer(), (unsigned long)pBuffer1->GetSize());
             }
         }
-#endif
+#endif //HELIX_FEATURE_METAEDIT_AUDIO_HASH
         return res;
     }
 
     STDMETHOD(OnStreamHeader)(IHXValues* pValues)
     {
 #ifdef HELIX_FEATURE_METAEDIT_AUDIO_HASH
         if(m_vars.GenerateHash)
         {
              sha256_init(&m_vars.HashState);
              m_bHashGenerated = FALSE;
         }
-#endif
+#endif //HELIX_FEATURE_METAEDIT_AUDIO_HASH
         return HXR_OK;
     }
 
     STDMETHOD(OnStreamDone)(UINT16 unStreamNumber)
     {
 #ifdef HELIX_FEATURE_METAEDIT_AUDIO_HASH
         if(m_vars.GenerateHash && !m_bHashGenerated)
         {
              sha256_done(&m_vars.HashState, m_vars.SHAHash);
              // make sure, that even if there is more than one call to OnStreamDone, we execute sha finalizer just one time 
              m_bHashGenerated = TRUE;
         }
-#endif
+#endif //HELIX_FEATURE_METAEDIT_AUDIO_HASH
         return HXR_OK;
     }
 
 private:
     LONG32 m_lRefCount;
     MetaProcessorVars& m_vars;
     IUnknown* m_pContext;
     HXBOOL m_bHashGenerated;
 };
 
 
 /****************************************************************************
 *  Main entry point
 */
 int main(int argc, char* argv[])
 {
     // initialize variables
     HX_RESULT retVal = HXR_OK;
     int progRetCode = RC_SUCCESS;
 
     UINT32 startTime = 0;
     CHXFileSpecifier exeFileSpec;
     HXBOOL bUsingLog = FALSE;
 
     DLLAccess* pDLLAccess = 0;
     FPHXMEDIAPLATFORMOPEN fpHXMediaPlatformOpen = 0;
     FPHXCREATEMEDIAPLATFORM fpHXCreateMediaPlatform = 0;
     FPHXMEDIAPLATFORMCLOSE fpHXMediaPlatformClose = 0;
 
     IHXMediaPlatform* pMediaPlatform = 0;
@@ -1777,61 +1777,65 @@
     CHXString strMetaStyleName;
 
     HXBOOL bDisplayHelp = FALSE;
     HXBOOL bOverwriteFile = FALSE;
     HXBOOL bPrintMetaData = FALSE;
     HXBOOL bExtractPicturesToFiles = FALSE;
     HXBOOL bUTF16Output = FALSE;
     HXBOOL bUTF8Input = FALSE;
     UINT32 ulMetaDataID3VersionOutput = METADATAID3VERSION_240;
 
     MetaProcessorVars metaProcessorVars;
 
     // construct option registry
     OptionRegistry optionReg;
 
     optionReg.Add(new OptionDesc(OPTION_STRING_LOGFILE, "<filename>", "redirect console output to log file", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_INPUTFILE, "<filename>", "input file", 1, "/albums/album/track/mediaFile/fileName"));
     optionReg.Add(new OptionDesc(OPTION_STRING_OUTPUTFILE, "<filename>", "output file", 1, "/albums/album/track/outputFileName"));
     optionReg.Add(new OptionDesc(OPTION_STRING_XMLINPUTFILE, "<filename>", "XML file with input parameters", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_XMLOUTPUTFILE, "<filename>", "metadata output XML file", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_OVERWRITEFILE, 0, "overwrite output file if it exists", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_CLEARMETADATA, 0, "clear all extracted metadata before injection", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_METASTYLE, "<3GPP | iTunes>", "flavor of injected metadata", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_UTF16OUTPUT, 0, "use UTF16 format to store strings in output file", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_UTF8INPUT, 0, "parse command line as UTF8 strings", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_ID3V240OUTPUT, 0, "inject ID3v2 version 2.4.0, default", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_ID3V230OUTPUT, 0, "inject ID3v2 version 2.3.0", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_ID3V2NOOUTPUT, 0, "skip injecting ID3v2 tag", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_PRINTMETADATA, 0, "print updated metadata", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_PICTURE_EXTRACT, "[filename prefix]", "save extracted pictures", -1));
+
+#ifdef HELIX_FEATURE_METAEDIT_AUDIO_HASH
     optionReg.Add(new OptionDesc(OPTION_STRING_GENERATEHASH, 0, "generate hash", 0));
+#endif //HELIX_FEATURE_METAEDIT_AUDIO_HASH
+
     optionReg.Add(new OptionDesc());
     optionReg.Add(new OptionDesc(OPTION_STRING_TITLE, "<string>", "update title", 1, "/albums/album/track/name"));
     optionReg.Add(new OptionDesc(OPTION_STRING_ARTIST, "<string>", "update 3GPP performer, iTunes artist", 1, "/albums/album/track/artist/name"));
     optionReg.Add(new OptionDesc(OPTION_STRING_ALBUM, "<string>", "update album", 1, "/albums/album/name"));
     optionReg.Add(new OptionDesc(OPTION_STRING_GENRE, "<string>", "update genre", 1, "/albums/album/track/style/name"));
     optionReg.Add(new OptionDesc(OPTION_STRING_COMPOSER, "<string>", "update 3GPP author, iTunes composer", 1, "/albums/album/track/artist/composer"));
     optionReg.Add(new OptionDesc(OPTION_STRING_COMMENT, "<string>", "update 3GPP description, iTunes comment", 1, "/albums/album/pline"));
     optionReg.Add(new OptionDesc(OPTION_STRING_COPYRIGHT, "<string>", "update copyright", 1, "/albums/album/cline"));
     optionReg.Add(new OptionDesc(OPTION_STRING_TRACKNUMBER, "<integer 0..255>", "update track number", 1, "/albums/album/track/sequence"));
     optionReg.Add(new OptionDesc(OPTION_STRING_YEAR, "<integer 0..65536>", "update 3GPP recording year, iTunes release date", 1, "/albums/album/OrigReleaseYear"));
     {
         // Add picture
         CHXPtrArray* pPictureAddXPaths = new CHXPtrArray;
         pPictureAddXPaths->Add(new CHXString("/albums/album/image/fileName"));
         pPictureAddXPaths->Add(new CHXString("/albums/album/image/fileName2"));
 
         optionReg.Add(new OptionDesc(OPTION_STRING_PICTURE_ADD, "<filename>", "add picture", 1, 0, pPictureAddXPaths));
     }
     optionReg.Add(new OptionDesc(OPTION_STRING_PICTURE_REMOVE, "<APIC picture type>", "remove picture", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_PICTURE_CLEAR, 0, "clear all extracted pictures", 0));
     optionReg.Add(new OptionDesc(OPTION_STRING_UITS_INSERT, "<filename>", "insert UITS signature from file", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_UITS_EXTRACT, "<filename>", "extract UITS signature into file", 1));
     optionReg.Add(new OptionDesc());
     optionReg.Add(new OptionDesc(OPTION_STRING_SOFTWARE, "<string>", "update iTunes generator tool", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_ENCODEDBY, "<string>", "update iTunes encoded by", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_GROUPING, "<string>", "update iTunes grouping", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_ALBUMARTIST, "<string>", "update iTunes album artist", 1, "/albums/album/artist/name"));
     optionReg.Add(new OptionDesc(OPTION_STRING_LYRICS, "<string>", "update iTunes lyrics", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_SUBTITLE, "<string>", "update iTunes track subtitle", 1));
     optionReg.Add(new OptionDesc(OPTION_STRING_BPM, "<integer>", "update iTunes beats per minute", 1));
@@ -2217,64 +2221,68 @@
 #endif //_WINDOWS
 
             else if(strOption == OPTION_STRING_DEFMETAPROC)
             {
                 g_bUseDefaultMetaEditorProcessor = TRUE;
             }
             else if(strOption == OPTION_STRING_LOGFILE)
             {
                 // do nothing, already processed
             }
             else if(strOption == OPTION_STRING_INPUTFILE)
             {
                 strInputFileName = option->GetEffectiveOptionValueCCP();
             }
             else if(strOption == OPTION_STRING_OUTPUTFILE)
             {
                 strOutputFileName = option->GetEffectiveOptionValueCCP();
             }
             else if(strOption == OPTION_STRING_OVERWRITEFILE)
             {
                 bOverwriteFile = TRUE;
             }
             else if(strOption == OPTION_STRING_CLEARMETADATA)
             {
                 metaProcessorVars.ClearMetaData = TRUE;
             }
             else if(strOption == OPTION_STRING_PRINTMETADATA)
             {
                 bPrintMetaData = TRUE;
             }
+
+#ifdef HELIX_FEATURE_METAEDIT_AUDIO_HASH
             else if(strOption == OPTION_STRING_GENERATEHASH)
             {
                 metaProcessorVars.GenerateHash = TRUE;
             }
+#endif //HELIX_FEATURE_METAEDIT_AUDIO_HASH
+
             else if(strOption == OPTION_STRING_XMLINPUTFILE)
             {
                 // do nothing, already processed
             }
             else if(strOption == OPTION_STRING_XMLOUTPUTFILE)
             {
                 strOutputXMLFileName = option->GetEffectiveOptionValueCCP();
             }
             else if(strOption == OPTION_STRING_METASTYLE)
             {
                 strMetaStyleName = option->GetEffectiveOptionValueCCP();
 
                 if(clpp == CLPP_IndependentOptions)
                 {
                     if(SUCCEEDED(retVal) && !strMetaStyleName.IsEmpty())
                     {
                         if(!strMetaStyleName.CompareNoCase("3gpp"))
                         {
                             metaProcessorVars.InjectedMetaFlavors |= METADATA_FLAVOR_3GPP;
                         }
                         else if(!strMetaStyleName.CompareNoCase("itunes"))
                         {
                             metaProcessorVars.InjectedMetaFlavors |= METADATA_FLAVOR_ITUNES;
                         }
                         else
                         {
                             retVal = HXR_PARSE_ERROR;
                             progRetCode = RC_ERROR_BAD_COMMAND_LINE;
                             ReportInvalidValueForOption(OPTION_STRING_METASTYLE, option->GetEffectiveOptionValueUTF8());
                         }
@@ -2619,60 +2627,69 @@
         // writing to input file is not allowed
         if(SUCCEEDED(retVal) && (strInputFileName == strOutputFileName))
         {
             printf("File [%s] cannot be used for both input and output.\n", (const char*)strOutputFileName);
             retVal = HXR_FAIL;
             progRetCode = RC_ERROR_SAME_INPUT_OUTPUT_MEDIA_FILE;
         }
         // output file must not exist or overwrite must be specified
         if(SUCCEEDED(retVal) && NeedOverwriteConfirmation((const char*)strOutputFileName, bOverwriteFile))
         {
             retVal = HXR_FAIL;
             progRetCode = RC_ERROR_OUTPUT_MEDIA_FILE_EXISTS;
         }
     }
 
     if(FAILED(retVal))
     {
         goto cleanup;
     }
 
     // initialize options
     retVal = CreateInstanceCCF_QI(CLSID_IHXValues, IID_IHXValues,
                                     (void**)&pOptions, pCommonClassFactory);
     if(SUCCEEDED(retVal))
     {
         retVal = pOptions->SetPropertyULONG32(SYNCHRONOUS_OPTION_NAME, g_bUseDTDriverSynchronousMode ? 1 : 0);
     }
 
     if(SUCCEEDED(retVal))
     {
+        // suppress packet processing in pure extraction mode
+        if(strOutputFileName.IsEmpty() && !metaProcessorVars.GenerateHash)
+        {
+            retVal = pOptions->SetPropertyULONG32(TIMER_OPTION_NAME, 0);
+        }
+    }
+
+    if(SUCCEEDED(retVal))
+    {
         retVal = pOptions->SetPropertyULONG32(BLASTFILE_OPTION_NAME, bOverwriteFile ? 1 : 0);
     }
 
     if(SUCCEEDED(retVal))
     {
         retVal = pOptions->SetPropertyULONG32(UTF16OUTPUT_OPTION_NAME, bUTF16Output ? 1 : 0);
     }
 
     if(SUCCEEDED(retVal))
     {
         // Notify writer about the version of ID3 tag it should output.
         retVal = pOptions->SetPropertyULONG32(METADATAID3VERSION_OPTION_NAME, ulMetaDataID3VersionOutput);
     }
 
     if(SUCCEEDED(retVal))
     {
         // Notify meta-editor about the flavor of meta-data it should process.
         retVal = pOptions->SetPropertyULONG32(METADATAFLAVOR_OPTION_NAME, metaProcessorVars.InjectedMetaFlavors);
     }
 
     if(SUCCEEDED(retVal))
     {
         // Legacy ID32_BLOB property must not get in the way of newly defined properties.
         // Tell file-writer to ignore it.
         retVal = pOptions->SetPropertyULONG32(METADATAIGNORE_OPTION_NAME, METADATAIGNORE_ID32BLOB);
     }
 
     if(SUCCEEDED(retVal))
     {
         if(g_bUseDefaultMetaEditorProcessor)
@@ -2784,61 +2801,61 @@
         {
             retVal = pEditor->Drive((const char*)strInputFileName, (const char*)strOutputFileName,
                                     (IHXMetaDataProcessor*)pProcessor,
                                     pOptions, (IHXMetaDataEditorResponse*)pResponse);
 
             if(SUCCEEDED(retVal) && !g_bUseDTDriverSynchronousMode)
             {
                 WaitAsyncDriveEnd();
                 retVal = pResponse->GetTerminationStatus();
             }
         }
     }
 
     if(FAILED(retVal))
     {
         printf("Failed to process input file [%s].\n", (const char*)strInputFileName);
         progRetCode = RC_ERROR_PROCESSING_MEDIA_FILE;
         goto cleanup;
     }
 
 #ifdef HELIX_FEATURE_METAEDIT_AUDIO_HASH
     if(metaProcessorVars.GenerateHash)
     {
         printf("--- Generated hash ---\n");
         for (int i=0; i<32; i++)
         {
             printf("%x", metaProcessorVars.SHAHash[i]);
         }
         printf("\n\n");
     }
-#endif
+#endif //HELIX_FEATURE_METAEDIT_AUDIO_HASH
 
     // auto dump meta-data if extracting only
     if(strOutputFileName.IsEmpty() && !metaProcessorVars.GenerateHash)
     {
         bPrintMetaData = TRUE;
     }
 
     if(SUCCEEDED(retVal) && bPrintMetaData)
     {
         // dump extracted
         printf("--- Extracted meta-data ---\n");
         metaProcessorVars.ExtractedMetaInfo.Dump();
         printf("\n");
 
         // dump injected
         if(!g_bUseDefaultMetaEditorProcessor && !strOutputFileName.IsEmpty())
         {
             printf("--- Injected meta-data ---\n");
             metaProcessorVars.OutboundMetaInfo.Dump();
             printf("\n");
         }
     }
 
     // extract UITS data to file
     HXBOOL bErrorSavingUITSData = FALSE;
     if(SUCCEEDED(retVal) && !strUITSDataOutputFileName.IsEmpty())
     {
         EncodedString sUITSData;
         if(SUCCEEDED(metaProcessorVars.ExtractedMetaInfo.GetStringItem(MetaInfo::StringMetaItem_UITSData, sUITSData))
             && !sUITSData.IsEmpty())
datatype_tools_metaeditor.diff (application/octet-stream, 2.5 KB)
Index: editor.cpp
===================================================================
RCS file: /cvsroot/datatype/tools/metaeditor/editor.cpp,v
retrieving revision 1.3
diff -d -H -w -U 30 -r1.3 editor.cpp
--- editor.cpp	1 Dec 2009 09:50:45 -0000	1.3
+++ editor.cpp	10 Feb 2010 09:23:28 -0000
@@ -315,66 +315,60 @@
         }
     }
 
     HX_RESULT retVal = HXR_OK;
 
     // make a private copy of options
     IHXValues* pPrivateOptions = 0;
     if(SUCCEEDED(retVal))
     {
         retVal = CreateInstanceCCF_QI(CLSID_IHXValues, IID_IHXValues,
                                      (void**)&pPrivateOptions, m_pContext);
         if(SUCCEEDED(retVal))
         {
             PropTools::CopyAllProperties(retVal, pPrivateOptions, pOptions);
         }
     }
     // modify options
     if(SUCCEEDED(retVal))
     {
         ULONG32 ulSynchronous = 0;
         pPrivateOptions->GetPropertyULONG32(SYNCHRONOUS_OPTION_NAME, ulSynchronous);
         m_bSynchronous = (ulSynchronous != 0) ? TRUE : FALSE;
 
         // suppress header output if not explicitly requested
         ULONG32 ulHeader = 0;
         pPrivateOptions->GetPropertyULONG32(HEADER_OPTION_NAME, ulHeader);
         if(!ulHeader)
         {
             retVal = pPrivateOptions->SetPropertyULONG32(HEADER_OPTION_NAME, 0);
         }
-
-        if(SUCCEEDED(retVal) && !bWritingFile)
-        {
-            // don't waste time reading packets in read mode
-            retVal = pPrivateOptions->SetPropertyULONG32(TIMER_OPTION_NAME, 0);
-        }
     }
 
     // create datatype driver
     HX_RELEASE(m_pDriver);
     if(SUCCEEDED(retVal))
     {
         retVal = CreateInstanceCCF_QI(CLSID_IHXDataTypeDriver, IID_IHXDataTypeDriver2,
                                          (void**)&m_pDriver, m_pContext);
     }
 
     // create meta-data source handler
     HX_RELEASE(m_pMetaDataSourceHandler);
     if(SUCCEEDED(retVal))
     {
         retVal = CreateInstanceCCF_QI(CLSID_IHXMetaDataSourceHandler, IID_IHXMetaDataSourceHandler,
                                     (void**)&m_pMetaDataSourceHandler, m_pContext);
     }
     if(SUCCEEDED(retVal))
     {
         retVal = m_pMetaDataSourceHandler->InitMetaDataSourceHandler(m_pContext);
     }
     if(SUCCEEDED(retVal))
     {
         retVal = m_pMetaDataSourceHandler->SetProcessor(pProcessor);
     }
 
     // obtain driver-response interface
     HX_RELEASE(m_pDriverResponse);
     if(SUCCEEDED(retVal))
     {