home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2004 March / PCWELT_3_2004.ISO / pcwsoft / flaskmpeg_078_39_src.z.exe / flaskmpeg / ProgressDlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-10-28  |  12.9 KB  |  368 lines

  1. /* 
  2.  *  ProgressDlg.cpp
  3.  *
  4.  *    Copyright (C) Alberto Vigata - January 2000
  5.  *
  6.  *  This file is part of FlasKMPEG, a free MPEG to MPEG/AVI converter
  7.  *    
  8.  *  FlasKMPEG is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2, or (at your option)
  11.  *  any later version.
  12.  *   
  13.  *  FlasKMPEG is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *   
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with GNU Make; see the file COPYING.  If not, write to
  20.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  21.  *
  22.  */
  23.  
  24. #include <windows.h>
  25. #include <string>
  26. #include "ProgressDlg.h"
  27. #include "RunState.h"
  28. #include "flaskmpeg.h"
  29. #include ".\Misc\StatsStrings.h"
  30. #include "resource.h"
  31. #include "auxiliary.h"
  32. #include ".\Demux\demux.h"
  33. #include ".\ProgressGraph.h"
  34.  
  35. extern TRunState rs;
  36. extern TConfig   o; 
  37. extern HWND hMainWnd;
  38. extern void EnableAllMenu();
  39. extern void ShowPlayer(TProfile *);
  40.  
  41. char                *chars="-\\|/-\\|/";
  42.  
  43. using namespace std;
  44.  
  45. void SetPriority(CProgressTracking *pProgress, int prio){
  46.   switch (prio){
  47.         case IDLE_PRIO:
  48.       pProgress->SetProgressPriority( THREAD_PRIORITY_IDLE);
  49.       SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_IDLE );
  50.       break;
  51.     case NORMAL_PRIO:
  52.       pProgress->SetProgressPriority( THREAD_PRIORITY_NORMAL);
  53.       SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_NORMAL );
  54.       break;
  55.     case HIGH_PRIO:
  56.       pProgress->SetProgressPriority(THREAD_PRIORITY_HIGHEST);
  57.       SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST );
  58.       break;
  59.     case HIGHEST_PRIO:
  60.       pProgress->SetProgressPriority( THREAD_PRIORITY_TIME_CRITICAL);
  61.       SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL );
  62.       break;
  63.   }
  64. }
  65.  
  66. void InitStrings(HWND hDlg)
  67. {
  68.   TStatsStrings stats;
  69.   char szTemp[1024];
  70.  
  71.   RenderStatsStrings(&stats);        
  72.  
  73.   // Use the a pointer to the base of the decoders to retrieve statistics
  74.   CDemux *demux;
  75.   // if we have video use it for statistics
  76.   if( rs.video )
  77.     demux = rs.video;
  78.   else
  79.     demux = rs.audio;
  80.  
  81.   //Process information
  82.   //input
  83.   DlgSetText(hDlg, IDC_IVIDEOFORMAT, stats.InMedia.video_format);
  84.   DlgSetText(hDlg, IDC_IVIDEORES,    stats.InMedia.video_size);
  85.   DlgSetText(hDlg, IDC_IFRAMERATE,   stats.InMedia.video_frame_rate);
  86.   DlgSetText(hDlg, IDC_IVIDEOSTRUCT, stats.InMedia.video_structure);
  87.   
  88.   sprintf( szTemp, "%s", demux->GetFileName() );        
  89.   DlgSetText(hDlg, IDC_IFILE, szTemp);        
  90.  
  91.   DlgSetText(hDlg, IDC_IAUDIOFORMAT, stats.InMedia.audio_format);
  92.   DlgSetText(hDlg, IDC_IAUDIOFREQ,   stats.InMedia.audio_sample_freq);
  93.   DlgSetText(hDlg, IDC_IAUDIOBITRATE,stats.InMedia.audio_bit_rate);
  94.   DlgSetText(hDlg, IDC_IAUDIOMODE,   stats.InMedia.audio_channels);
  95.   
  96.  
  97.   // OUTPUT
  98.   DlgSetText(hDlg, IDC_OVIDEOFORMAT, stats.OutMedia.video_format);
  99.   DlgSetText(hDlg, IDC_OVIDEORES,    stats.OutMedia.video_size);
  100.   DlgSetText(hDlg, IDC_OFRAMERATE,   stats.OutMedia.video_frame_rate);
  101.   //DlgSetText(hDlg, IDC_OVIDEOSTRUCT, stats.OutMedia.video_structure);
  102.           
  103.   DlgSetText(hDlg, IDC_OFILE, rs.conf.outputFile);        
  104.   
  105.   DlgSetText(hDlg, IDC_OAUDIOFORMAT, stats.OutMedia.audio_format);
  106.   DlgSetText(hDlg, IDC_OAUDIOFREQ,   stats.OutMedia.audio_sample_freq);
  107.   DlgSetText(hDlg, IDC_OAUDIOBITRATE,stats.OutMedia.audio_bit_rate);
  108.   DlgSetText(hDlg, IDC_OAUDIOMODE,   stats.OutMedia.audio_channels);
  109.  
  110. }
  111.  
  112. // Mesage handler for about box.
  113. LRESULT CALLBACK ProgressDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  114. {
  115.   double porciento;
  116.   long nFrameDelay;
  117.   char szTemp[MAX_PATH];
  118.   static UINT                progressTimer;
  119.   static char temp_filename[MAX_PATH];
  120.   static CProgressTracking *pProgress;
  121.   static int i,j,k,w,h;
  122.   static DWORD remaining_time,present_time,elapsed_time,start_time;
  123.   static __int64  startPos=0;
  124.   RECT rc;        
  125.   static TStatsStrings stats;      //This is a big one
  126.   static unsigned start_mpeg_time;
  127.   static nDetailsHeight, nCompactHeight, nDlgWidth;
  128.   static CProgressGraph *pGraph;
  129.   static int nReportIdx = 0;
  130.   
  131.   switch (message)
  132.   {
  133.         case WM_SYSCOMMAND:
  134.     /*            if(wParam==SC_MINIMIZE)
  135.                 SendMessage(hMainWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
  136.         if(wParam==SC_RESTORE)
  137.       SendMessage(hMainWnd, WM_SYSCOMMAND, SC_RESTORE, 0);*/
  138.       break;
  139.     case WM_TIMER:
  140.  
  141.       if(!pProgress->IsPaused())
  142.       {   
  143.         // Use the a pointer to the base of the decoders to retrieve statistics
  144.         CDemux *demux;
  145.         // if we have video use it for statistics
  146.         if( rs.video )
  147.           demux = rs.video;
  148.         else
  149.           demux = rs.audio;
  150.         
  151.         sprintf( szTemp, "%s", demux->GetFileName() );
  152.         DlgSetText(hDlg, IDC_IFILE, szTemp);
  153.         DlgSetText(hDlg, IDC_OFILE, pProgress->GetOutputFileName() );    
  154.         
  155.         if(!rs.conf.compileWhole)    // Frames specified
  156.         {
  157.           porciento= ((double)pProgress->GetPresentFrame()/(double)rs.conf.framesToCompile)*100.0;
  158.           SendDlgItemMessage( hDlg, IDC_PROGRESS1, PBM_SETPOS, (ui32)porciento , 0);
  159.           if( pProgress->GetPresentFrame() <2 && i<200){
  160.             i++;
  161.             strcpy( szTemp, "Starting Up ..");
  162.             for(j=1; j<=i; j++){
  163.               strcat(szTemp, "..");
  164.             }
  165.             SetDlgItemText( hDlg, IDC_FRAMENO, szTemp);
  166.           }
  167.           else{
  168.             sprintf(szTemp, "Processing frame %d of %d ", pProgress->GetPresentFrame(), rs.conf.framesToCompile);
  169.             SetDlgItemText( hDlg, IDC_FRAMENO, szTemp);
  170.           }
  171.         }
  172.         else    //Compile whole file
  173.         {
  174.           porciento= ((double)(i64)pProgress->GetProcessed() /(double)(i64)(pProgress->GetSize()))*100.0;
  175.           SendDlgItemMessage( hDlg, IDC_PROGRESS1, PBM_SETPOS, (ui32)porciento , 0);            
  176.           if( pProgress->GetPresentFrame() <2 && i<1000)
  177.           {
  178.             i++;
  179.             strcpy( szTemp, "Starting Up .");
  180.             for(j=1; j<=i; j++){
  181.               strcat(szTemp, ".");
  182.             }
  183.             SetDlgItemText( hDlg, IDC_FRAMENO, szTemp);
  184.           }
  185.           else{
  186.             // set startpos to the position where we actually start reading,
  187.             // which might be a lot higher than 0
  188.             if (startPos == 0) { // first time we get here
  189.               startPos = demux->GetStreamPos();
  190.               start_mpeg_time = rs.video->time;
  191.             }
  192.             char tempstr[32];
  193.             MillisecondsToTime(tempstr, rs.video->time - start_mpeg_time);
  194.             sprintf(szTemp, "Processing frame %d (%s)", pProgress->GetPresentFrame(), tempstr);
  195.             SetDlgItemText( hDlg, IDC_FRAMENO, szTemp);
  196.           }
  197.           
  198.         }
  199.         
  200.         sprintf(szTemp, "Processing job %d of %d", pProgress->GetJobInProcess()+1, pProgress->GetJobCount());
  201.         DlgSetText( hDlg, IDC_JOBTEXT, szTemp );
  202.  
  203.         sprintf(szTemp, "%.03lf %%", porciento);
  204.         SetDlgItemText( hDlg, IDC_PERCENT, szTemp);
  205.         // Pilla tiempo actual
  206.         if(pProgress->GetPresentFrame() == 0)
  207.           start_time=GetTickCount();
  208.         present_time=GetTickCount();
  209.         //Duracion simulacion
  210.         MillisecondsToTime( szTemp, elapsed_time=present_time-start_time);
  211.         strcat(szTemp, " (");
  212.         LocalTimePlusMilliseconds(szTemp + strlen(szTemp), 0, false);
  213.         strcat(szTemp, ")");
  214.         SetDlgItemText( hDlg, IDC_ELAPSED, szTemp);
  215.         // FPS
  216.         if(elapsed_time){
  217.           sprintf(szTemp, "%.2lf", 1000.0*((double)pProgress->GetPresentFrame())/((double)elapsed_time) );
  218.           DlgSetText( hDlg, IDC_FPS, szTemp);
  219.         }
  220.         //Tiempo restante
  221.         remaining_time= (DWORD)((100.0-porciento)/porciento*(double)elapsed_time);
  222.         MillisecondsToTime( szTemp, remaining_time);
  223.         strcat(szTemp, " (");
  224.         LocalTimePlusMilliseconds(szTemp + strlen(szTemp), remaining_time, false);
  225.         strcat(szTemp, ")");
  226.         SetDlgItemText( hDlg, IDC_REMAINING, szTemp);
  227.         sprintf( szTemp, "FlasK Encoding %d%% %c ", (int)porciento, chars[k++%8]);
  228.         SetWindowText((HWND)hMainWnd, szTemp);
  229.  
  230.     }
  231.     bool bIsDual, bIsFirst;
  232.     pProgress->DualPassInfo( bIsDual, bIsFirst );
  233.     if(bIsDual)
  234.       DlgSetText( hDlg, IDC_DUALPASSTEXT, bIsFirst ? "Dual Pass:  First Pass" : "Dual Pass: Second Pass" );
  235.  
  236.     if(pProgress->Terminated())
  237.       SendMessage( hDlg, WM_COMMAND, MAKEWPARAM(IDOK,0), 0);
  238.  
  239.     break;
  240.     case WM_INITDIALOG:
  241.       // Get the progress tracking object
  242.       pProgress = (CProgressTracking *)lParam;
  243.  
  244.       // Graph init
  245.       pGraph = new CProgressGraph;
  246.  
  247.       RECT rcClient;
  248.  
  249.       // Calculate frame delay time
  250.       nFrameDelay = 
  251.       (long)(100000.0 * (double)rs.prof.timeBase.sampleSize 
  252.                       / (double)rs.prof.timeBase.scale);
  253.  
  254.       GetClientRect(GetDlgItem(hDlg, IDC_GRAPH), &rcClient);
  255.       pGraph->Initialize( GetDlgItem(hDlg, IDC_GRAPH), 
  256.                           rcClient.right - rcClient.left,
  257.                           rcClient.bottom - rcClient.top,
  258.                           nFrameDelay);
  259.       
  260.       //Set combo box to normal and set
  261.       SendDlgItemMessage(hDlg, IDC_PRIO, CB_ADDSTRING, 0, (LPARAM) "Idle");
  262.       SendDlgItemMessage(hDlg, IDC_PRIO, CB_ADDSTRING, 0, (LPARAM) "Normal");
  263.       SendDlgItemMessage(hDlg, IDC_PRIO, CB_ADDSTRING, 0, (LPARAM) "High");
  264.       SendDlgItemMessage(hDlg, IDC_PRIO, CB_ADDSTRING, 0, (LPARAM) "Highest");
  265.       SendDlgItemMessage(hDlg, IDC_PRIO, CB_SETCURSEL, 1, 0);
  266.       SetPriority( pProgress, NORMAL_PRIO );
  267.       
  268.       if(rs.conf.displayVideo)
  269.         SendDlgItemMessage( hDlg, IDC_DISPLAYOUTPUT, BM_SETCHECK, BST_CHECKED ,0);
  270.       else
  271.         SendDlgItemMessage( hDlg, IDC_DISPLAYOUTPUT, BM_SETCHECK, BST_UNCHECKED ,0);
  272.       
  273.       i=0;
  274.       
  275.       start_time=GetTickCount();
  276.       start_mpeg_time = 0;
  277.       startPos = rs.video->GetStreamPos();
  278.       strcpy(temp_filename, rs.conf.outputFile);
  279. //      add_file_ext(temp_filename);
  280.       progressTimer= SetTimer(hDlg,       // handle of window for timer messages
  281.                               1,          // timer identifier
  282.                               500,        // time-out value
  283.                               NULL   // address of timer procedure
  284.                               );
  285.       InitStrings(hDlg);
  286.  
  287.       GetWindowRect(hDlg, &rc);
  288.       w = rc.right - rc.left;
  289.       h = rc.bottom - rc.top;
  290.       nDetailsHeight = h;
  291.       //if(rs.plugs.outPlugs[rs.selected_out_plug].fileType != ODMLtype )
  292.       //  nDetailsHeight = (int)(h*0.80);
  293.  
  294.       nCompactHeight = h *0.30;
  295.       nDlgWidth = w;
  296.  
  297.       WindowResize( hDlg, w, nDetailsHeight);
  298.       return TRUE;
  299.     case WM_STREAMINFO:
  300.       pGraph->StreamInfo( (ui64)wParam|(((ui64)lParam)<<32 ));
  301.       break;
  302.     case WM_NEWFRAMEINFO:
  303.       pGraph->NewFrame( wParam, lParam>0 );
  304.       if( nReportIdx++%6 == 0 && IsWindowVisible(hDlg) ) pGraph->Draw();
  305.       break;
  306.     case WM_COMMAND:
  307.       
  308.       if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  309.       {
  310.         // Cancel
  311.         if(!pProgress->Terminated())
  312.           pProgress->Cancel();
  313.  
  314.         // Process the rest
  315.         SetWindowText((HWND)hMainWnd, "FlasKMPEG");
  316.         KillTimer( hDlg, 1);
  317.         EnableAllMenu();
  318.         EndDialog(hDlg, LOWORD(wParam));
  319.         ShowPlayer(rs.profiler->GetSelected());
  320.         //And turndown computer if suitable
  321.         if(rs.conf.shutdown && (rs.conf.presentFrame >= 1000))
  322.           ExitWindowsEx( EWX_SHUTDOWN, 0); 
  323.         return TRUE;
  324.  
  325.       } 
  326.       switch(LOWORD(wParam))
  327.       {
  328.       case IDC_PRIO:
  329.         if(HIWORD(wParam)==CBN_SELCHANGE)
  330.           SetPriority( pProgress, SendDlgItemMessage(hDlg, IDC_PRIO, CB_GETCURSEL, 0,0) );
  331.         break;
  332.       case IDC_PAUSE:
  333.         if(pProgress->IsPaused())
  334.         {
  335.           pProgress->Resume();
  336.           DlgSetText(hDlg, IDC_PAUSE, "&Pause");
  337.         }
  338.         else{
  339.           pProgress->Pause();
  340.           DlgSetText(hDlg, IDC_PAUSE, "&Resume");
  341.         }
  342.         break;
  343.       case IDC_DISPLAYOUTPUT:
  344.         if(rs.conf.displayVideo)
  345.           rs.conf.displayVideo=false;
  346.         else
  347.           rs.conf.displayVideo=true;
  348.         break;
  349.       case IDC_DETAILS:
  350.         if(strcmp(DlgGetText(hDlg, IDC_DETAILS, szTemp), "&Details <<")==0)
  351.         {
  352.           WindowResize(hDlg, nDlgWidth, nCompactHeight);
  353.           DlgSetText(hDlg, IDC_DETAILS, "&Details >>");
  354.         }
  355.         else
  356.         {
  357.           WindowResize(hDlg, nDlgWidth, nDetailsHeight);
  358.           DlgSetText(hDlg, IDC_DETAILS, "&Details <<");          
  359.         }
  360.         break;
  361.       }
  362.       
  363.       break;
  364.       
  365.   }
  366.   return FALSE;
  367. }
  368.