DistributionDlg.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // DistributionDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "XvidQuantsParser.h"
  5. #include "DistributionDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDistributionDlg dialog
  13. CDistributionDlg::CDistributionDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CDistributionDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CDistributionDlg)
  17. m_icount = 0;
  18. m_pcount = 0;
  19. m_pavg = 0.0f;
  20. m_iavg = 0.0f;
  21. m_imaxfs = 0;
  22. m_iminfs = 0;
  23. m_pmaxfs = 0;
  24. m_pminfs = 0;
  25. //}}AFX_DATA_INIT
  26. qarray = NULL;
  27. }
  28. void CDistributionDlg::DoDataExchange(CDataExchange* pDX)
  29. {
  30. CDialog::DoDataExchange(pDX);
  31. //{{AFX_DATA_MAP(CDistributionDlg)
  32. DDX_Control(pDX, IDC_LIST_PFRAMES, m_listp);
  33. DDX_Control(pDX, IDC_LIST_IFRAMES, m_listi);
  34. DDX_Text(pDX, IDC_EDIT_ICOUNT, m_icount);
  35. DDX_Text(pDX, IDC_EDIT_PCOUNT, m_pcount);
  36. DDX_Text(pDX, IDC_EDIT_PAVG, m_pavg);
  37. DDX_Text(pDX, IDC_EDIT_IAVG, m_iavg);
  38. DDX_Control(pDX, IDC_GRAPH_G, m_graphg);
  39. DDX_Control(pDX, IDC_GRAPH_I, m_graphi);
  40. DDX_Control(pDX, IDC_GRAPH_P, m_graphp);
  41. DDX_Text(pDX, IDC_EDIT_IMAXFS, m_imaxfs);
  42. DDX_Text(pDX, IDC_EDIT_IMINFS, m_iminfs);
  43. DDX_Text(pDX, IDC_EDIT_PMAXFS, m_pmaxfs);
  44. DDX_Text(pDX, IDC_EDIT_PMINFS, m_pminfs);
  45. //}}AFX_DATA_MAP
  46. }
  47. BEGIN_MESSAGE_MAP(CDistributionDlg, CDialog)
  48. //{{AFX_MSG_MAP(CDistributionDlg)
  49. ON_BN_CLICKED(IDC_BUTTON_DRAW, OnButtonDraw)
  50. //}}AFX_MSG_MAP
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CDistributionDlg message handlers
  54. void CDistributionDlg::Init(CXvid &xvid, CXvid::QUANTS *quants, int nframes)
  55. {
  56. nelem = nframes;
  57. qarray = quants;
  58. pavg = xvid.GetPAvgQuants();
  59. pmaxfs = xvid.GetPMaxFrameSize();
  60. pminfs = xvid.GetPMinFrameSize();
  61. iavg = xvid.GetIAvgQuants();
  62. imaxfs = xvid.GetIMaxFrameSize();
  63. iminfs = xvid.GetIMinFrameSize();
  64. }
  65. //-----------------------------------------------------------------------------------
  66. void CDistributionDlg::ParsePFrames(void)
  67. {
  68. char index[3], percent[6], fcount[8];
  69. pcount=0;
  70. //初始化
  71. for (int i=0; i<31; i++)
  72. {
  73. phisto[i] = 0;
  74. }
  75. //分析
  76. for (int j=0; j<nelem; j++)
  77. {
  78. if (!qarray[j].isIFrame)
  79. {
  80. phisto[qarray[j].qvalue-2] += 1;
  81. pcount++;
  82. }
  83. }
  84. //输出到P帧的list控件
  85. for (int k=0; k<31; k++)
  86. {
  87. sprintf(index,   "%dx",  k+2);
  88. sprintf(percent, "%.3f", (float)(phisto[k]*100)/(float)pcount);
  89. sprintf(fcount,  "%d",   phisto[k]);
  90. m_listp.InsertItem (k, index); //Quants 索引
  91. m_listp.SetItemText(k, 1, percent); //百分比
  92. m_listp.SetItemText(k, 2, fcount); //百分比
  93. }
  94. m_pcount = pcount;
  95. m_pavg = pavg;
  96. m_pmaxfs = pmaxfs;
  97. m_pminfs = pminfs;
  98. UpdateData(FALSE);
  99. }
  100. //-----------------------------------------------------------------------------------
  101. void CDistributionDlg::ParseIFrames(void)
  102. {
  103. char index[3], percent[6], fcount[8];
  104. icount=0;
  105. //初始化
  106. for (int i=0; i<31; i++)
  107. {
  108. ihisto[i] = 0;
  109. }
  110. //分析
  111. for (int j=0; j<nelem; j++)
  112. {
  113. if (qarray[j].isIFrame)
  114. {
  115. ihisto[qarray[j].qvalue-2] += 1;
  116. icount++;
  117. }
  118. }
  119. //输出到list控件中
  120. for (int k=0; k<31; k++)
  121. {
  122. sprintf(index,   "%dx",  k+2);
  123. sprintf(percent, "%.3f", (float)(ihisto[k]*100)/(float)icount);
  124. sprintf(fcount,  "%d",   ihisto[k]);
  125. m_listi.InsertItem (k, index); //Quants 索引
  126. m_listi.SetItemText(k, 1, percent); //百分比
  127. m_listi.SetItemText(k, 2, fcount); //百分比
  128. }
  129. m_icount = icount;
  130. m_iavg = iavg;
  131. m_imaxfs = imaxfs;
  132. m_iminfs = iminfs;
  133. UpdateData(FALSE);
  134. }
  135. //-----------------------------------------------------------------------------------
  136. BOOL CDistributionDlg::OnInitDialog() 
  137. {
  138. CDialog::OnInitDialog();
  139. //P-Frames listview
  140. m_listp.InsertColumn(0, "Quant",LVCFMT_CENTER, 45);
  141. m_listp.InsertColumn(1, "%", LVCFMT_CENTER, 70);
  142. m_listp.InsertColumn(2, "Count",LVCFMT_LEFT,   75);
  143. //I-Frames listview
  144. m_listi.InsertColumn(0, "Quant",LVCFMT_CENTER, 45);
  145. m_listi.InsertColumn(1, "%", LVCFMT_CENTER, 70);
  146. m_listi.InsertColumn(2, "Count",LVCFMT_LEFT,   75);
  147. ParsePFrames();
  148. ParseIFrames();
  149. ScaleHistograms();
  150. return TRUE;  // return TRUE unless you set the focus to a control
  151.               // EXCEPTION: OCX Property Pages should return FALSE
  152. }
  153. //-----------------------------------------------------------------------------------
  154. void CDistributionDlg::ScaleHistograms(void)
  155. {
  156. m_graphg.SetForeColor(RGB(200,0,0));
  157. m_graphg.SetLineWidth(3);
  158. m_graphg.SetScale(0, 0, 32, 110);
  159. m_graphp.SetForeColor(RGB(0,200,0));
  160. m_graphp.SetLineWidth(3);
  161. m_graphp.SetScale(0, 0, 32, 110);
  162. m_graphi.SetForeColor(RGB(0,0,200));
  163. m_graphi.SetLineWidth(3);
  164. m_graphi.SetScale(0, 0, 32, 110);
  165. }
  166. //-----------------------------------------------------------------------------------
  167. void CDistributionDlg::DrawHistograms(void)
  168. {
  169. int i;
  170. //Fill global histogram...
  171. for (i=0; i<31; i++)
  172. {
  173. ghisto[i] = phisto[i] + ihisto[i];
  174. }
  175. //global
  176. for (i=0; i<31; i++)
  177. {
  178. if (ghisto[i] > 0)
  179. m_graphg.DrawLine(i+1, 1, i+1, ((ghisto[i]*100)/(pcount+icount))+2);
  180. }
  181. //p-frames
  182. for (i=0; i<31; i++)
  183. {
  184. if (phisto[i] > 0)
  185. m_graphp.DrawLine(i+1, 1, i+1, ((phisto[i]*100)/pcount)+2);
  186. }
  187. //i-frames
  188. for (i=0; i<31; i++)
  189. {
  190. if (ihisto[i] > 0)
  191. m_graphi.DrawLine(i+1, 1, i+1, ((ihisto[i]*100)/icount)+2);
  192. }
  193. }
  194. //-----------------------------------------------------------------------------------
  195. void CDistributionDlg::OnButtonDraw() 
  196. {
  197. DrawHistograms();
  198. }