- Main Page
- Namespaces
- Classes
- Files
- Directories

- File List
- File Members

# MediaTypesDlg.cpp

    00001 /*
    00002  *      Copyright (C) 2003-2005 Gabest
    00003  *      http://www.gabest.org
    00004  *
    00005  *  This Program is free software; you can redistribute it and/or modify
    00006  *  it under the terms of the GNU General Public License as published by
    00007  *  the Free Software Foundation; either version 2, or (at your option)
    00008  *  any later version.
    00009  *
    00010  *  This Program is distributed in the hope that it will be useful,
    00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    00013  *  GNU General Public License for more details.
    00014  *
    00015  *  You should have received a copy of the GNU General Public License
    00016  *  along with GNU Make; see the file COPYING.  If not, write to
    00017  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
    00018  *  http://www.gnu.org/copyleft/gpl.html
    00019  *
    00020  */
    00021
    00022 // MediaTypesDlg.cpp : implementation file
    00023 //
    00024
    00025 #include "stdafx.h"
    00026 #include "mplayerc.h"
    00027 #include "MediaTypesDlg.h"
    00028 #include "..\..\DSUtil\DSUtil.h"
    00029 #include "..\..\..\include\moreuuids.h"
    00030
    00031 #pragma pack(push, 1)
    00032 typedef struct
    00033 {
    00034         WAVEFORMATEX Format;
    00035         BYTE bBigEndian;
    00036         BYTE bsid;
    00037         BYTE lfeon;
    00038         BYTE copyrightb;
    00039         BYTE nAuxBitsCode;  //  Aux bits per frame
    00040 } DOLBYAC3WAVEFORMAT;
    00041 #pragma pack(pop)
    00042
    00043 // CMediaTypesDlg dialog
    00044
    00045 //IMPLEMENT_DYNAMIC(CMediaTypesDlg, CResizableDialog)
    00046 CMediaTypesDlg::CMediaTypesDlg(CGraphBuilder& gb, CWnd* pParent /*=NULL*/)
    00047         : CResizableDialog(CMediaTypesDlg::IDD, pParent)
    00048 {
    00049         CGraphBuilder::DeadEnd* pde;
    00050         for(int i = 0; pde = gb.GetDeadEnd(i); i++) m_DeadEnds.Add(pde);
    00051         m_subtype = GUID_NULL;
    00052         m_type = UNKNOWN;
    00053 }
    00054
    00055 CMediaTypesDlg::~CMediaTypesDlg()
    00056 {
    00057 }
    00058
    00059 void CMediaTypesDlg::DoDataExchange(CDataExchange* pDX)
    00060 {
    00061         CResizableDialog::DoDataExchange(pDX);
    00062         DDX_Control(pDX, IDC_COMBO1, m_pins);
    00063         DDX_Control(pDX, IDC_EDIT1, m_report);
    00064 }
    00065
    00066 void CMediaTypesDlg::AddLine(CString str)
    00067 {
    00068         str.Replace(_T("\n"), _T("\r\n"));
    00069         int len = m_report.GetWindowTextLength();
    00070         m_report.SetSel(len, len, TRUE);
    00071         m_report.ReplaceSel(str);
    00072 }
    00073
    00074 void CMediaTypesDlg::AddMediaType(AM_MEDIA_TYPE* pmt)
    00075 {
    00076         CString major = CStringFromGUID(pmt->majortype);
    00077         CString sub = CStringFromGUID(pmt->subtype);
    00078         CString format = CStringFromGUID(pmt->formattype);
    00079
    00080         m_subtype = pmt->subtype;
    00081         if(pmt->majortype == MEDIATYPE_Video) m_type = VIDEO;
    00082         else if(pmt->majortype == MEDIATYPE_Audio) m_type = AUDIO;
    00083         else m_type = UNKNOWN;
    00084
    00085         CString str;
    00086
    00087         AddLine(_T("AM_MEDIA_TYPE:\n"));
    00088         str.Format(_T("majortype: %s %s\n"), CString(GuidNames[pmt->majortype]), major);
    00089         AddLine(str);
    00090         str.Format(_T("subtype: %s %s\n"), CString(GuidNames[pmt->subtype]), sub);
    00091         AddLine(str);
    00092         str.Format(_T("formattype: %s %s\n"), CString(GuidNames[pmt->formattype]), format);
    00093         AddLine(str);
    00094         str.Format(_T("bFixedSizeSamples: %d\n"), pmt->bFixedSizeSamples);
    00095         AddLine(str);
    00096         str.Format(_T("bTemporalCompression: %d\n"), pmt->bTemporalCompression);
    00097         AddLine(str);
    00098         str.Format(_T("lSampleSize: %d\n"), pmt->lSampleSize);
    00099         AddLine(str);
    00100         str.Format(_T("cbFormat: %d\n"), pmt->cbFormat);
    00101         AddLine(str);
    00102
    00103         AddLine();
    00104
    00105         if(pmt->formattype == FORMAT_VideoInfo || pmt->formattype == FORMAT_VideoInfo2)
    00106         {
    00107                 VIDEOINFOHEADER& vih = *((VIDEOINFOHEADER*)pmt->pbFormat);
    00108                 BITMAPINFOHEADER* bih = &vih.bmiHeader;
    00109
    00110                 AddLine(_T("VIDEOINFOHEADER:\n"));
    00111                 str.Format(_T("rcSource: (%d,%d)-(%d,%d)\n"), vih.rcSource);
    00112                 AddLine(str);
    00113                 str.Format(_T("rcTarget: (%d,%d)-(%d,%d)\n"), vih.rcTarget);
    00114                 AddLine(str);
    00115                 str.Format(_T("dwBitRate: %d\n"), vih.dwBitRate);
    00116                 AddLine(str);
    00117                 str.Format(_T("dwBitErrorRate: %d\n"), vih.dwBitErrorRate);
    00118                 AddLine(str);
    00119                 str.Format(_T("AvgTimePerFrame: %I64d\n"), vih.AvgTimePerFrame);
    00120                 AddLine(str);
    00121
    00122                 if(pmt->formattype == FORMAT_VideoInfo2)
    00123                 {
    00124                         VIDEOINFOHEADER2& vih = *((VIDEOINFOHEADER2*)pmt->pbFormat);
    00125                         bih = &vih.bmiHeader;
    00126
    00127                         AddLine(_T("VIDEOINFOHEADER2:\n"));
    00128                         str.Format(_T("dwInterlaceFlags: 0x%08x\n"), vih.dwInterlaceFlags);
    00129                         AddLine(str);
    00130                         str.Format(_T("dwCopyProtectFlags: 0x%08x\n"), vih.dwCopyProtectFlags);
    00131                         AddLine(str);
    00132                         str.Format(_T("dwPictAspectRatioX: %d\n"), vih.dwPictAspectRatioX);
    00133                         AddLine(str);
    00134                         str.Format(_T("dwPictAspectRatioY: %d\n"), vih.dwPictAspectRatioY);
    00135                         AddLine(str);
    00136                         str.Format(_T("dwControlFlags: 0x%08x\n"), vih.dwControlFlags);
    00137                         AddLine(str);
    00138                         str.Format(_T("dwReserved2: 0x%08x\n"), vih.dwReserved2);
    00139                         AddLine(str);
    00140                 }
    00141
    00142                 AddLine();
    00143
    00144                 AddLine(_T("BITMAPINFOHEADER:\n"));
    00145                 str.Format(_T("biSize: %d\n"), bih->biSize);
    00146                 AddLine(str);
    00147                 str.Format(_T("biWidth: %d\n"), bih->biWidth);
    00148                 AddLine(str);
    00149                 str.Format(_T("biHeight: %d\n"), bih->biHeight);
    00150                 AddLine(str);
    00151                 str.Format(_T("biPlanes: %d\n"), bih->biPlanes);
    00152                 AddLine(str);
    00153                 str.Format(_T("biBitCount: %d\n"), bih->biBitCount);
    00154                 AddLine(str);
    00155                 if(bih->biCompression < 256) str.Format(_T("biCompression: %d\n"), bih->biCompression);
    00156                 else str.Format(_T("biCompression: %4.4hs\n"), &bih->biCompression);
    00157                 AddLine(str);
    00158                 str.Format(_T("biSizeImage: %d\n"), bih->biSizeImage);
    00159                 AddLine(str);
    00160                 str.Format(_T("biXPelsPerMeter: %d\n"), bih->biXPelsPerMeter);
    00161                 AddLine(str);
    00162                 str.Format(_T("biYPelsPerMeter: %d\n"), bih->biYPelsPerMeter);
    00163                 AddLine(str);
    00164                 str.Format(_T("biYPelsPerMeter: %d\n"), bih->biYPelsPerMeter);
    00165                 AddLine(str);
    00166                 str.Format(_T("biClrUsed: %d\n"), bih->biClrUsed);
    00167                 AddLine(str);
    00168                 str.Format(_T("biClrImportant: %d\n"), bih->biClrImportant);
    00169                 AddLine(str);
    00170     }
    00171         else if(pmt->formattype == FORMAT_WaveFormatEx)
    00172         {
    00173                 WAVEFORMATEX& wfe = *((WAVEFORMATEX*)pmt->pbFormat);
    00174
    00175                 AddLine(_T("WAVEFORMATEX:\n"));
    00176                 str.Format(_T("wFormatTag: 0x%04x\n"), wfe.wFormatTag);
    00177                 AddLine(str);
    00178                 str.Format(_T("nChannels: %d\n"), wfe.nChannels);
    00179                 AddLine(str);
    00180                 str.Format(_T("nSamplesPerSec: %d\n"), wfe.nSamplesPerSec);
    00181                 AddLine(str);
    00182                 str.Format(_T("nAvgBytesPerSec: %d\n"), wfe.nAvgBytesPerSec);
    00183                 AddLine(str);
    00184                 str.Format(_T("nBlockAlign: %d\n"), wfe.nBlockAlign);
    00185                 AddLine(str);
    00186                 str.Format(_T("wBitsPerSample: %d\n"), wfe.wBitsPerSample);
    00187                 AddLine(str);
    00188
    00189                 if(wfe.wFormatTag != WAVE_FORMAT_PCM && wfe.cbSize > 0)
    00190                 {
    00191                         str.Format(_T("cbSize: %d (extra bytes)\n"), wfe.cbSize);
    00192                         AddLine(str);
    00193
    00194                         if(wfe.wFormatTag == WAVE_FORMAT_EXTENSIBLE && wfe.cbSize == sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX))
    00195                         {
    00196                                 WAVEFORMATEXTENSIBLE& wfe = *((WAVEFORMATEXTENSIBLE*)pmt->pbFormat);
    00197
    00198                                 AddLine(_T("WAVEFORMATEXTENSIBLE:\n"));
    00199                                 if(wfe.Format.wBitsPerSample != 0) str.Format(_T("wValidBitsPerSample: %d\n"), wfe.Samples.wValidBitsPerSample);
    00200                                 else str.Format(_T("wSamplesPerBlock: %d\n"), wfe.Samples.wSamplesPerBlock);
    00201                                 AddLine(str);
    00202                                 str.Format(_T("dwChannelMask: 0x%08x\n"), wfe.dwChannelMask);
    00203                                 AddLine(str);
    00204                                 str.Format(_T("SubFormat: %s\n"), CStringFromGUID(wfe.SubFormat));
    00205                                 AddLine(str);
    00206                         }
    00207                         else if(wfe.wFormatTag == WAVE_FORMAT_DOLBY_AC3 && wfe.cbSize == sizeof(DOLBYAC3WAVEFORMAT)-sizeof(WAVEFORMATEX))
    00208                         {
    00209                                 DOLBYAC3WAVEFORMAT& wfe = *((DOLBYAC3WAVEFORMAT*)pmt->pbFormat);
    00210
    00211                                 AddLine(_T("DOLBYAC3WAVEFORMAT:\n"));
    00212                                 str.Format(_T("bBigEndian: %d\n"), wfe.bBigEndian);
    00213                                 AddLine(str);
    00214                                 str.Format(_T("bsid: %d\n"), wfe.bsid);
    00215                                 AddLine(str);
    00216                                 str.Format(_T("lfeon: %d\n"), wfe.lfeon);
    00217                                 AddLine(str);
    00218                                 str.Format(_T("copyrightb: %d\n"), wfe.copyrightb);
    00219                                 AddLine(str);
    00220                                 str.Format(_T("nAuxBitsCode: %d\n"), wfe.nAuxBitsCode);
    00221                                 AddLine(str);
    00222                         }
    00223                 }
    00224
    00225                 AddLine();
    00226         }
    00227 }
    00228
    00229 BEGIN_MESSAGE_MAP(CMediaTypesDlg, CResizableDialog)
    00230         ON_CBN_SELCHANGE(IDC_COMBO1, OnCbnSelchangeCombo1)
    00231         ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
    00232         ON_UPDATE_COMMAND_UI(IDC_BUTTON1, OnUpdateButton1)
    00233 END_MESSAGE_MAP()
    00234
    00235
    00236 // CMediaTypesDlg message handlers
    00237
    00238 BOOL CMediaTypesDlg::OnInitDialog()
    00239 {
    00240         CResizableDialog::OnInitDialog();
    00241
    00242         for(int i = 0; i < m_DeadEnds.GetCount(); i++)
    00243         {
    00244                 m_pins.SetItemData(
    00245                         m_pins.AddString(m_DeadEnds[i]->filter + _T("::") + m_DeadEnds[i]->pin),
    00246                         (DWORD_PTR)m_DeadEnds[i]);
    00247         }
    00248
    00249         m_pins.SetCurSel(0);
    00250         OnCbnSelchangeCombo1();
    00251
    00252         AddAnchor(IDC_STATIC1, TOP_LEFT, TOP_RIGHT);
    00253         AddAnchor(IDC_STATIC2, TOP_LEFT, TOP_RIGHT);
    00254         AddAnchor(IDC_COMBO1, TOP_LEFT, TOP_RIGHT);
    00255         AddAnchor(IDC_EDIT1, TOP_LEFT, BOTTOM_RIGHT);
    00256         AddAnchor(IDC_BUTTON1, BOTTOM_LEFT);
    00257         AddAnchor(IDOK, BOTTOM_RIGHT);
    00258
    00259         SetMinTrackSize(CSize(300, 200));
    00260
    00261         return TRUE;  // return TRUE unless you set the focus to a control
    00262         // EXCEPTION: OCX Property Pages should return FALSE
    00263 }
    00264
    00265 void CMediaTypesDlg::OnCbnSelchangeCombo1()
    00266 {
    00267         m_report.SetWindowText(_T(""));
    00268
    00269         int i = m_pins.GetCurSel();
    00270         if(i < 0) return;
    00271
    00272         POSITION pos;
    00273
    00274         CList<CString>& path = m_DeadEnds[i]->path;
    00275         pos = path.GetHeadPosition();
    00276         while(pos)
    00277         {
    00278                 AddLine(path.GetNext(pos) + _T("\n"));
    00279                 if(!pos) AddLine(_T("\n"));
    00280         }
    00281
    00282         pos = m_DeadEnds[i]->mts.GetHeadPosition();
    00283         for(int j = 0; pos; j++)
    00284         {
    00285                 CString str;
    00286                 str.Format(_T("Media Type %d:\n"), j);
    00287                 AddLine(str);
    00288                 AddLine(_T("--------------------------\n"));
    00289                 AddMediaType(&m_DeadEnds[i]->mts.GetNext(pos));
    00290                 AddLine();
    00291         }
    00292
    00293         m_report.SetSel(0, 0);
    00294 }
    00295
    00296 void CMediaTypesDlg::OnBnClickedButton1()
    00297 {
    00298         if(m_subtype.Data2 == 0x0000 && m_subtype.Data3 == 0x0010
    00299         && *(unsigned __int64*)m_subtype.Data4 == 0x719b3800aa000080i64)
    00300         {
    00301                 BYTE* p = (BYTE*)&m_subtype.Data1;
    00302                 for(int i = 0; i < 4; i++, p++)
    00303                         if(*p >= 'a' && *p <= 'z') *p -= 0x20;
    00304         }
    00305
    00306         CString str;
    00307         str.Format(_T("http://gabest.org/codec.php?type=%d&guid=%s"), m_type, CStringFromGUID(m_subtype));
    00308         ShellExecute(NULL, _T("open"), str, NULL, NULL, SW_SHOW);
    00309 }
    00310
    00311 void CMediaTypesDlg::OnUpdateButton1(CCmdUI* pCmdUI)
    00312 {
    00313         pCmdUI->Enable(m_subtype != GUID_NULL);
    00314 }