tsrc/consoleplayer/thumbnail/src/thumbnailtester.cpp
changeset 33 e1b6d78dfe6a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/consoleplayer/thumbnail/src/thumbnailtester.cpp	Fri Sep 03 19:37:02 2010 -0500
@@ -0,0 +1,488 @@
+/*
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "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:
+ *
+ * Description:
+ * Source file for the main class of the Thumbnail Tester test app.
+ * 
+ */
+
+#include "thumbnailtester.h"
+#include "yuv2rgb24.h"
+
+#include <e32base.h>
+#include <e32debug.h>
+#include <f32file.h>
+
+const TInt KFontSize = 15;
+
+// Thumbnail tester implementation
+
+void CThumbnailTester::ExecuteL()
+    {
+    CThumbnailTester* self = new(ELeave) CThumbnailTester;
+    CleanupStack::PushL( self );
+    self->InitL();
+    self->Main();
+    CleanupStack::PopAndDestroy( self );    
+    }
+    
+CThumbnailTester::CThumbnailTester() : 
+    CTestAppBase( KFontSize )
+    {    
+    }
+    
+CThumbnailTester::~CThumbnailTester()
+    {
+    Cancel();
+    
+    if( iGc && iFullScreenWindow )
+	      {
+        iGc->Activate(*iFullScreenWindow);
+        
+        iFullScreenWindow->Invalidate();
+        iFullScreenWindow->BeginRedraw();
+        
+        iGc->Reset();
+        
+        iGc->UseFont(iFont);                
+        iGc->SetBrushColor(KRgbDarkBlue);
+        
+        iGc->Clear();
+
+        if( iFinalResult == KErrNone )
+            {
+            // KRgbWhite seems to be having problems (0xffffff) in some emulators,
+            // but 0xfefefe is working, so use that instead of white.        
+            iGc->SetPenColor(0xfefefe);                 
+            }
+        else
+            {
+            iGc->SetPenColor(KRgbRed);
+            }
+    
+        iBuffer.Format( _L("THUMBNAILTESTER EXIT, result = %i"), iFinalResult );
+        iGc->DrawText( iBuffer, TPoint(5, 20) );
+       
+        iFullScreenWindow->EndRedraw();
+        
+        iGc->Deactivate();
+        
+        iFullScreenWindow->SetVisible( ETrue );
+        
+        WaitForAnyKey();
+        }    
+    
+    }
+    
+void CThumbnailTester::InitL()
+    {
+    BaseConstructL( NULL, 0 );  // this app doesn't use the option pages concept
+    
+    iFullScreenWindow = new(ELeave) RWindow( iWs );
+    User::LeaveIfError( iFullScreenWindow->Construct( *iWindowGroup, KNullWsHandle ) );
+    iFullScreenWindow->SetExtent( TPoint(0,0), iDisplaySize );
+    iFullScreenWindow->SetNonTransparent();
+    iFullScreenWindow->SetBackgroundColor(KRgbBlack);
+    iFullScreenWindow->SetVisible(false);
+    iFullScreenWindow->Activate();
+        
+    iGc->Activate(*iFullScreenWindow);
+
+    iFullScreenWindow->BeginRedraw();
+    
+    iGc->Reset();    
+    iGc->UseFont(iFont);                
+    iGc->SetBrushStyle(CWindowGc::ESolidBrush);
+    iGc->SetBrushColor(KRgbBlack);    
+    iGc->Clear();
+    
+    iFullScreenWindow->EndRedraw();
+    
+    iGc->Deactivate();    
+    }
+
+void CThumbnailTester::Main()
+    {    
+    TRAPD( err, MainL() ); 
+    
+    RDebug::Printf( "THUMBNAILTESTER Completed, err=%i", err );    
+    }
+
+void CThumbnailTester::MainL()        
+    {
+    TFileName filename;
+    
+    SelectFileWithHistoryL( TPoint(0,0), iDisplaySize, filename, KHistoryFilename, KMaxHistoryEntries );
+    
+    GenerateThumbnailL( filename );
+    }
+  
+void CThumbnailTester::GenerateThumbnailL( TDes& aFileName )
+    {
+    SelectIntegerL( TPoint(0,0), iDisplaySize, _L("Select starting position(seconds):"), 0, 9999, iStartPositionInMs );
+    
+    // Convert from seconds to ms.
+    iStartPositionInMs *= 1000;
+        
+    _LIT( KFull,   "Full speed" );
+    _LIT( KMedium, "100 millisecond delay" );
+    _LIT( KSlow,   "1 second delay" );
+
+    RPointerArray<TDesC> speed;
+    speed.Append( &KFull );
+    speed.Append( &KMedium );
+    speed.Append( &KSlow );
+    
+    TInt index = SelectFromListL( TPoint(0,0), iDisplaySize, _L("Select speed:"), speed );
+    
+    speed.Reset();
+    
+    switch( index )
+        {
+        case 0:
+            iDelayBetweenFrames = 0;
+            break;
+        case 1:
+            iDelayBetweenFrames = 100000;  // 1/10 second
+            break;
+        case 2:
+            iDelayBetweenFrames = 1000000;  // 1 second
+            break;
+        }
+
+    RFile file;    
+    User::LeaveIfError( file.Open( iFs, aFileName, EFileShareReadersOnly | EFileStream | EFileRead ) );
+    
+    iThumbnailUtility = CHXThumbnailUtility::NewL(*this);
+
+    bool done = false;
+
+    iStopThumbnailGeneration = false;
+    
+    StartMonitoringWindowEvents();
+    
+    TInt originalStartPositionInMs = iStartPositionInMs;
+    
+    while( !done )
+        {
+        iThumbnailUtility->OpenFileL( file, iStartPositionInMs );
+
+        // OpenFileL will block until all bitmaps have been passed to PacketReady.
+        
+        // This isn't necessarily exact, but advance the start position by the time represented
+        // by the number of renderered frames.
+        iStartPositionInMs = originalStartPositionInMs + (iTotalFramesRendered * 1000) / iFrameRateInSec;
+                
+        done = ((iFramesRendered < 5) || iStopThumbnailGeneration);
+        
+        iFramesRendered = 0;
+        }
+    
+    Cancel();
+ 
+    WaitForAnyKey();
+    
+    delete iThumbnailUtility;
+    iThumbnailUtility = NULL;
+    
+    file.Close();    
+    }
+           
+bool CThumbnailTester::ConsumeKeyEvent( TInt /*aKeyCode*/ )
+    {
+    // Stop thumbnail generation when a key is pressed.
+    iStopThumbnailGeneration = true;
+    iThumbnailUtility->CancelThumb();
+    return true;
+    }
+
+void CThumbnailTester::ExecuteOperation( TInt aOperation, const TDesC& aOperationText )
+    {    
+    }
+
+void CThumbnailTester::MetaDataReady(TInt aError)
+    {
+    RDebug::Printf( "THUMBNAILTESTER MetadataReady(%i)", aError );
+    
+    // Get basic meta data.
+    
+    TUint lCount = 0;
+    TUint i=0;
+    
+    iThumbnailUtility->GetMetaDataCount(lCount);
+
+    RDebug::Printf( "THUMBNAILTESTER metadata count=%i", lCount );
+    
+    for (i=0; i<lCount; i++)
+        {
+        HBufC *pDes = NULL;           
+        HXMetaDataKeys::EHXMetaDataId id;        
+        iThumbnailUtility->GetMetaDataAt(i, id, pDes);
+
+        const char* key = "";
+        
+        for( TInt j = 0; j < sizeof(HXMetaDataKeyTab)/sizeof(HXMetaDataKeys); j++ )
+            {
+            if( id == HXMetaDataKeyTab[j].m_id )
+                {
+                key = HXMetaDataKeyTab[j].m_pHXKey;
+                }
+            }
+        
+        for( TInt j = 0; j < sizeof(HXStreamMetaDataKeyTab)/sizeof(HXMetaDataKeys); j++ )
+            {
+            if( id == HXStreamMetaDataKeyTab[j].m_id )
+                {
+                key = HXStreamMetaDataKeyTab[j].m_pHXKey;
+                }
+            }
+        
+        RDebug::Printf( "THUMBNAILTESTER metadata[%i] id=%i key=%s", i, id, key );        
+        
+        TInt current = 0;
+        TBuf8<400> outputLine;
+        while( current < pDes->Length() )
+            {
+            char c = pDes->Des()[current];                
+            char c2 = c;
+            if( c2 < ' ' || c2 > '~' )
+                {
+                c2 = ' ';
+                }
+            
+            outputLine.AppendFormat(_L8("%02x/%c "), c, c2 ); 
+            
+            current++;
+            
+            if( (current % 20 == 0) || current == pDes->Length()  )
+                {
+                outputLine.Append( '\0' );
+                RDebug::Printf( (char*)outputLine.Ptr() );
+                outputLine.SetLength(0);
+                }            
+            }        
+        
+        if (id == HXMetaDataKeys::EHXFrameSize && pDes)
+            {
+            TPtr pFrameSizePtr = pDes->Des();
+            _LIT(KChar_x, "x");
+            TInt xLoc = pFrameSizePtr.Find(KChar_x);
+            if (xLoc != KErrNotFound)
+                {                           
+                TLex lexWidth(pFrameSizePtr.Mid(0, xLoc));
+                TLex lexHeight(pFrameSizePtr.Mid(xLoc+1));
+                lexWidth.Val(iWidth);  // Storing into local iWidth variable
+                lexHeight.Val(iHeight);  // Storing into local iHeight variable  
+                }
+            }
+        else if (id == HXMetaDataKeys::EHXDuration && pDes)
+            {
+            TLex lexDuration(pDes->Des());
+            lexDuration.Val(iDuration);
+            }        
+        else if (id == HXMetaDataKeys::EHXFramesPerSecond && pDes)
+            {
+            TLex lexFramesPerSecond(pDes->Des());           
+            lexFramesPerSecond.Val(iFrameRateInSec);            
+            }
+        else if (id == HXMetaDataKeys::EHXClipBitRate && pDes)
+            {
+            TLex lexBitRate(pDes->Des());           
+            lexBitRate.Val(iClipBitRate);            
+            }
+        else if (id == HXMetaDataKeys::EHXVideoBitRate && pDes)
+            {
+            TLex lexBitRate(pDes->Des());           
+            lexBitRate.Val(iVideoBitRate);            
+            }
+        else if (id == HXMetaDataKeys::EHXAudioBitRate && pDes)
+            {
+            TLex lexBitRate(pDes->Des());           
+            lexBitRate.Val(iAudioBitRate);            
+            }
+        
+        } // end for
+    
+    iTotalFrameCount = ( (iDuration+500)/1000 ) * iFrameRateInSec;
+    
+    RDebug::Printf( "THUMBNAILTESTER width=%i", iWidth );
+    RDebug::Printf( "THUMBNAILTESTER height=%i", iHeight );
+    RDebug::Printf( "THUMBNAILTESTER frame rate=%i", iFrameRateInSec );
+    RDebug::Printf( "THUMBNAILTESTER duration=%i", iDuration );
+    RDebug::Printf( "THUMBNAILTESTER frame count=%i", iTotalFrameCount );
+    RDebug::Printf( "THUMBNAILTESTER clip bit rate=%i", iClipBitRate );
+    RDebug::Printf( "THUMBNAILTESTER video bit rate=%i", iVideoBitRate );
+    RDebug::Printf( "THUMBNAILTESTER audio bit rate=%i", iAudioBitRate );
+    }
+
+void CThumbnailTester::PacketReady(TInt /*aError*/, void *pYuvBuffer, TUint32 /*aYuvBufferSize*/)
+    {
+    // TODO: HANDLE aError
+    
+    iFramesRendered++;
+    iTotalFramesRendered++;
+    
+    // Convert from YUV420 to RGB24.
+    
+    const TInt KBytesPerPixel = 3; // 24-bit rgb takes 3 bytes
+    
+    TUint32 rgbBufferSize = iWidth * iHeight * KBytesPerPixel;
+    TUint8 *pRgbBuffer =(TUint8*) User::AllocL(rgbBufferSize);
+        
+    CYuv2Rgb24* yuvConverter = NULL; 
+    TRAPD(err, yuvConverter = new(ELeave) CYuv2Rgb24);
+    
+    // TODO: CHECK ERROR
+
+    TRAP(err, yuvConverter->ConstructL(iWidth, iHeight, iWidth, iHeight))
+
+    // TODO: CHECK ERROR
+
+    TInt scanLineLength = iWidth * KBytesPerPixel;
+    
+    TUint8* yBuf = (TUint8*)pYuvBuffer;
+    TUint8* uBuf = yBuf + iWidth*iHeight;
+    TUint8* vBuf = uBuf + (iWidth*iHeight)/4;    
+    
+    yuvConverter->Convert(yBuf, uBuf, vBuf, iWidth, iHeight, pRgbBuffer, scanLineLength);
+    
+    delete yuvConverter;        
+
+    // Use RGB24 buffer to create CFbsBitmap.
+    
+    CFbsBitmap* pBitmap = NULL;
+    
+    TRAP(err, pBitmap = new (ELeave) CFbsBitmap);
+    if( err == KErrNone )
+        {
+        err = pBitmap->Create(TSize(iWidth, iHeight), EColor16M); 
+    
+        if( err == KErrNone )
+            {
+            // fill image from rgb buffer to input bitmap buffer 
+            TPtr8 linePtr(0,0); 
+            TInt lineLength = pBitmap->ScanLineLength(iWidth, EColor16M); 
+            for(int j=0, i=0; j<iHeight; j++, i+=lineLength)
+                {
+                linePtr.Set(pRgbBuffer+i, lineLength, lineLength);
+                pBitmap->SetScanLine((TDes8&)linePtr,j); 
+                }
+                
+            iGc->Activate(*iSelectionWindow);
+            
+            iSelectionWindow->Invalidate();
+            iSelectionWindow->BeginRedraw();
+            
+            iGc->Reset();
+            
+            iGc->UseFont(iFont);                
+            iGc->SetBrushColor(KRgbDarkBlue);
+            
+            iGc->Clear();
+            
+            // KRgbWhite seems to be having problems (0xffffff) in some emulators,
+            // but 0xfefefe is working, so use that instead of white.        
+            iGc->SetPenColor(0xfefefe);
+
+            TPoint topLeft( iDisplaySize.iWidth/2 - iWidth/2, 
+                            iDisplaySize.iHeight/2 - iHeight/2 ); 
+            iGc->BitBlt( topLeft, pBitmap );
+            
+            const TInt KColumn = 3;
+            const TInt KRowIncrement = KFontSize + 1;
+            TInt row = KRowIncrement;
+
+            iBuffer.Format( _L("Frame # %i"), iFramesRendered );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;
+
+            iBuffer.Format( _L("Total frames rendered: %i"), iTotalFramesRendered );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;
+
+            iBuffer.Format( _L("Start time(ms): %i"), iStartPositionInMs );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;
+
+            iBuffer.Format( _L("Display size: %ix%i"), iDisplaySize.iWidth, iDisplaySize.iHeight );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;
+            
+            iBuffer.Format( _L("Video size: %ix%i"), iWidth, iHeight );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;            
+            
+            iBuffer.Format( _L("Total frame count: %i"), iTotalFrameCount );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;            
+            
+            iBuffer.Format( _L("Duration: %i"), iDuration );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;            
+            
+            iBuffer.Format( _L("Frame rate: %i"), iFrameRateInSec );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;            
+            
+            iBuffer.Format( _L("Clip bit rate: %i"), iClipBitRate );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;            
+            
+            iBuffer.Format( _L("Video bit rate: %i"), iVideoBitRate );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;            
+            
+            iBuffer.Format( _L("Audio bit rate: %i"), iAudioBitRate );
+            iGc->DrawText( iBuffer, TPoint(KColumn, row) );
+            row += KRowIncrement;            
+
+            iGc->DrawText( _L("<Press key to stop then another to exit>"), TPoint(KColumn, iDisplaySize.iHeight-10) );
+            
+            iSelectionWindow->EndRedraw();
+            
+            iGc->Deactivate();
+            
+            iSelectionWindow->SetVisible( ETrue );            
+            }
+        
+        delete pBitmap;
+        }
+    
+    delete pRgbBuffer;    
+
+    User::After( iDelayBetweenFrames );    
+    }
+
+void CThumbnailTester::EndOfPackets()
+    {
+    RDebug::Printf( "THUMBNAILTESTER end of packets" );
+    }
+
+GLDEF_C TInt E32Main()
+    {
+    __UHEAP_MARK;
+    
+    CActiveScheduler* scheduler = new CActiveScheduler;
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    if( scheduler != NULL && cleanup != NULL )
+    {
+        CActiveScheduler::Install( scheduler );
+        TRAP_IGNORE( CThumbnailTester::ExecuteL() );
+    }
+    delete cleanup;
+    delete scheduler;
+    REComSession::FinalClose();
+    __UHEAP_MARKEND;
+    return 0;
+    }
+