📄 fileinfodialog.cpp
字号:
{ 0x0133, "SIPROLAB_G729", "Sipro Lab Telecom Inc." },
{ 0x0134, "SIPROLAB_G729A", "Sipro Lab Telecom Inc." },
{ 0x0135, "SIPROLAB_KELVIN", "Sipro Lab Telecom Inc." },
{ 0x0140, "G726ADPCM", "Dictaphone Corporation" },
{ 0x0150, "QUALCOMM_PUREVOICE", "Qualcomm, Inc." },
{ 0x0151, "QUALCOMM_HALFRATE", "Qualcomm, Inc." },
{ 0x0155, "TUBGSM", "Ring Zero Systems, Inc." },
{ 0x0160, "MSAUDIO1", "" },
{ 0x0161, "DIVXAUDIO", "DivX ;-) Audio" },
{ 0x0170, "UNISYS_NAP_ADPCM", "Unisys Corp." },
{ 0x0171, "UNISYS_NAP_ULAW", "Unisys Corp." },
{ 0x0172, "UNISYS_NAP_ALAW", "Unisys Corp." },
{ 0x0173, "UNISYS_NAP_16K", "Unisys Corp." },
{ 0x0200, "CREATIVE_ADPCM", "Creative Labs, Inc" },
{ 0x0202, "CREATIVE_FASTSPEECH8", "Creative Labs, Inc" },
{ 0x0203, "CREATIVE_FASTSPEECH10", "Creative Labs, Inc" },
{ 0x0210, "UHER_ADPCM", "UHER informatic GmbH" },
{ 0x0220, "QUARTERDECK", "Quarterdeck Corporation" },
{ 0x0230, "ILINK_VC", "I-link Worldwide" },
{ 0x0240, "RAW_SPORT", "Aureal Semiconductor" },
{ 0x0241, "ESST_AC3", "ESS Technology, Inc." },
{ 0x0250, "IPI_HSX", "Interactive Products, Inc." },
{ 0x0251, "IPI_RPELP", "Interactive Products, Inc." },
{ 0x0260, "CS2", "Consistent Software" },
{ 0x0270, "SONY_SCX", "Sony Corp." },
{ 0x0300, "FM_TOWNS_SND", "Fujitsu Corp." },
{ 0x0400, "BTV_DIGITAL", "Brooktree Corporation" },
{ 0x0401, "IMC", "Intel Music Coder for MSACM" },
{ 0x0450, "QDESIGN_MUSIC", "QDesign Corporation" },
{ 0x0680, "VME_VMPCM", "AT&T Labs, Inc." },
{ 0x0681, "TPC", "AT&T Labs, Inc." },
{ 0x1000, "OLIGSM", "Ing C. Olivetti & C., S.p.A." },
{ 0x1001, "OLIADPCM", "Ing C. Olivetti & C., S.p.A." },
{ 0x1002, "OLICELP", "Ing C. Olivetti & C., S.p.A." },
{ 0x1003, "OLISBC", "Ing C. Olivetti & C., S.p.A." },
{ 0x1004, "OLIOPR", "Ing C. Olivetti & C., S.p.A." },
{ 0x1100, "LH_CODEC", "Lernout & Hauspie" },
{ 0x1400, "NORRIS", "Norris Communications, Inc." },
{ 0x1500, "SOUNDSPACE_MUSICOMPRESS", "AT&T Labs, Inc." },
{ 0x2000, "DVM (AC3-Digital)", "FAST Multimedia AG" }
};
USES_CONVERSION;
for (int i = 0; i < ARRSIZE(WavFmtTag); i++)
{
if (WavFmtTag[i].uFmtTag == uWavFmtTag){
rstrComment = WavFmtTag[i].pszComment;
return A2CT(WavFmtTag[i].pszDefine);
}
}
CString strCompression;
strCompression.Format(_T("0x%04x (unknown)"), uWavFmtTag);
return strCompression;
}
CString GetWaveFormatTagName(UINT wFormatTag)
{
CString strComment;
CString strFormat = GetWaveFormatTagName(wFormatTag, strComment);
if (!strComment.IsEmpty())
strFormat += _T(" (") + strComment + _T(")");
return strFormat;
}
BOOL IsEqualFOURCC(FOURCC fccA, FOURCC fccB)
{
for (int i = 0; i < 4; i++)
{
if (tolower((unsigned char)fccA) != tolower((unsigned char)fccB))
return FALSE;
fccA >>= 8;
fccB >>= 8;
}
return TRUE;
}
CString GetVideoFormatName(DWORD biCompression)
{
CString strFormat;
if (biCompression == BI_RGB)
strFormat = _T("RGB");
else if (biCompression == BI_RLE8)
strFormat = _T("RLE8");
else if (biCompression == BI_RLE4)
strFormat = _T("RLE4");
else if (biCompression == BI_BITFIELDS)
strFormat = _T("Bitfields");
else if (IsEqualFOURCC(biCompression, MAKEFOURCC('D', 'I', 'V', '3')))
strFormat = _T("DIV3 (DivX ;-) MPEG-4 v3)");
else if (IsEqualFOURCC(biCompression, MAKEFOURCC('D', 'I', 'V', '4')))
strFormat = _T("DIV4 (DivX ;-) MPEG-4 v4)");
else if (IsEqualFOURCC(biCompression, MAKEFOURCC('D', 'I', 'V', 'X')))
strFormat = _T("DIVX (DivX)");
else if (IsEqualFOURCC(biCompression, MAKEFOURCC('D', 'X', '5', '0')))
strFormat = _T("DX50 (DivX 5)");
else if (IsEqualFOURCC(biCompression, MAKEFOURCC('M', 'P', '4', '3')))
strFormat = _T("MP43 (MS MPEG-4 v3)");
else if (IsEqualFOURCC(biCompression, MAKEFOURCC('M', 'P', '4', '2')))
strFormat = _T("MP42 (MS MPEG-4 v2)");
else
{
char szFourcc[5];
*(LPDWORD)szFourcc = biCompression;
szFourcc[4] = '\0';
strFormat = szFourcc;
strFormat.MakeUpper();
}
return strFormat;
}
BOOL CFileInfoDialog::OnInitDialog()
{
CWaitCursor curWait; // we may get quite busy here..
#ifdef _UNICODE
ReplaceRichEditCtrl(GetDlgItem(IDC_FULL_FILE_INFO), this, GetDlgItem(IDC_FD_XI1)->GetFont());
#endif
CResizablePage::OnInitDialog();
InitWindowStyles(this);
AddAnchor(IDC_FULL_FILE_INFO, TOP_LEFT, BOTTOM_RIGHT);
m_fi.SendMessage(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(3, 3));
m_fi.SetAutoURLDetect();
m_fi.SetEventMask(m_fi.GetEventMask() | ENM_LINK);
PARAFORMAT pf = {0};
pf.cbSize = sizeof pf;
if (m_fi.GetParaFormat(pf)){
pf.dwMask |= PFM_TABSTOPS;
pf.cTabCount = 1;
pf.rgxTabs[0] = 3000;
m_fi.SetParaFormat(pf);
}
// m_cfDef.cbSize = sizeof m_cfDef;
// if (m_fi.GetSelectionCharFormat(m_cfDef)){
// m_cfBold = m_cfDef;
// m_cfBold.dwMask |= CFM_BOLD;
// m_cfBold.dwEffects |= CFE_BOLD;
//
// m_cfRed = m_cfDef;
// m_cfRed.dwMask |= CFM_COLOR;
// m_cfRed.dwEffects &= ~CFE_AUTOCOLOR;
// m_cfRed.crTextColor = RGB(255, 0, 0);
// }
CResizablePage::UpdateData(FALSE);
Localize();
CString strWait = GetResString(IDS_FSTAT_WAITING);
SetDlgItemText(IDC_FORMAT, strWait);
SetDlgItemText(IDC_FILESIZE, strWait);
SetDlgItemText(IDC_LENGTH, strWait);
SetDlgItemText(IDC_VCODEC, strWait);
SetDlgItemText(IDC_VBITRATE, strWait);
SetDlgItemText(IDC_VWIDTH, strWait);
SetDlgItemText(IDC_VHEIGHT, strWait);
SetDlgItemText(IDC_VASPECT, strWait);
SetDlgItemText(IDC_VFPS, strWait);
SetDlgItemText(IDC_ACODEC, strWait);
SetDlgItemText(IDC_ACHANNEL, strWait);
SetDlgItemText(IDC_ASAMPLERATE, strWait);
SetDlgItemText(IDC_ABITRATE, strWait);
SetDlgItemText(IDC_FULL_FILE_INFO, strWait);
CGetMediaInfoThread* pThread = (CGetMediaInfoThread*)AfxBeginThread(RUNTIME_CLASS(CGetMediaInfoThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (pThread)
{
pThread->SetValues(m_hWnd, m_paFiles);
pThread->ResumeThread();
}
return TRUE;
}
IMPLEMENT_DYNCREATE(CGetMediaInfoThread, CWinThread)
BOOL CGetMediaInfoThread::InitInstance()
{
DbgSetThreadName("GetMediaInfo");
InitThreadLocale();
return TRUE;
}
int CGetMediaInfoThread::Run()
{
CoInitialize(NULL);
CArray<SMediaInfo, SMediaInfo>* paMediaInfo = new CArray<SMediaInfo, SMediaInfo>;
try
{
for (int i = 0; i < m_paFiles->GetSize(); i++)
{
SMediaInfo mi;
if (IsWindow(m_hWndOwner) && GetMediaInfo(m_hWndOwner, (*m_paFiles)[i], &mi, m_paFiles->GetSize() == 1))
paMediaInfo->Add(mi);
else
{
delete paMediaInfo;
paMediaInfo = NULL;
break;
}
}
}
catch(...)
{
ASSERT(0);
}
if (!IsWindow(m_hWndOwner) || !PostMessage(m_hWndOwner, WM_MEDIA_INFO_RESULT, 0, (LPARAM)paMediaInfo))
delete paMediaInfo;
CoUninitialize();
return 0;
}
CString GetKnownAspectRatioDisplayString(float fAspectRatio)
{
CString strAspectRatio;
if (fAspectRatio >= 1.00F && fAspectRatio < 1.50F) strAspectRatio = _T("4/3");
else if (fAspectRatio >= 1.50F && fAspectRatio < 2.00F) strAspectRatio = _T("16/9");
else if (fAspectRatio >= 2.00F && fAspectRatio < 2.22F) strAspectRatio = _T("2.2");
else if (fAspectRatio >= 2.22F && fAspectRatio < 2.30F) strAspectRatio = _T("2.25");
else if (fAspectRatio >= 2.30F && fAspectRatio < 2.50F) strAspectRatio = _T("2.35");
return strAspectRatio;
}
LRESULT CFileInfoDialog::OnMediaInfoResult(WPARAM, LPARAM lParam)
{
SetDlgItemText(IDC_FORMAT, _T("-"));
SetDlgItemText(IDC_FILESIZE, _T("-"));
SetDlgItemText(IDC_LENGTH, _T("-"));
SetDlgItemText(IDC_VCODEC, _T("-"));
SetDlgItemText(IDC_VBITRATE, _T("-"));
SetDlgItemText(IDC_VWIDTH, _T("-"));
SetDlgItemText(IDC_VHEIGHT, _T("-"));
SetDlgItemText(IDC_VASPECT, _T("-"));
SetDlgItemText(IDC_VFPS, _T("-"));
SetDlgItemText(IDC_ACODEC, _T("-"));
SetDlgItemText(IDC_ACHANNEL, _T("-"));
SetDlgItemText(IDC_ASAMPLERATE, _T("-"));
SetDlgItemText(IDC_ABITRATE, _T("-"));
SetDlgItemText(IDC_FULL_FILE_INFO, _T(""));
CArray<SMediaInfo, SMediaInfo>* paMediaInfo = (CArray<SMediaInfo, SMediaInfo>*)lParam;
if (paMediaInfo == NULL)
return 0;
if (paMediaInfo->GetSize() != m_paFiles->GetSize())
{
SetDlgItemText(IDC_FORMAT, _T(""));
SetDlgItemText(IDC_FILESIZE, _T(""));
SetDlgItemText(IDC_LENGTH, _T(""));
SetDlgItemText(IDC_VCODEC, _T(""));
SetDlgItemText(IDC_VBITRATE, _T(""));
SetDlgItemText(IDC_VWIDTH, _T(""));
SetDlgItemText(IDC_VHEIGHT, _T(""));
SetDlgItemText(IDC_VASPECT, _T(""));
SetDlgItemText(IDC_VFPS, _T(""));
SetDlgItemText(IDC_ACODEC, _T(""));
SetDlgItemText(IDC_ACHANNEL, _T(""));
SetDlgItemText(IDC_ASAMPLERATE, _T(""));
SetDlgItemText(IDC_ABITRATE, _T(""));
SetDlgItemText(IDC_FULL_FILE_INFO, _T(""));
delete paMediaInfo;
return 0;
}
uint64 uTotalFileSize = 0;
SMediaInfo ami;
bool bDiffVideoCompression = false;
bool bDiffVideoWidth = false;
bool bDiffVideoHeight = false;
bool bDiffVideoFrameRate = false;
bool bDiffVideoBitRate = false;
bool bDiffVideoAspectRatio = false;
bool bDiffAudioCompression = false;
bool bDiffAudioChannels = false;
bool bDiffAudioSamplesPerSec = false;
bool bDiffAudioAvgBytesPerSec = false;
for (int i = 0; i < paMediaInfo->GetSize(); i++)
{
const SMediaInfo& mi = paMediaInfo->GetAt(i);
uTotalFileSize += mi.ulFileSize;
if (i == 0)
{
ami = mi;
}
else
{
if (ami.strFileFormat != mi.strFileFormat)
ami.strFileFormat.Empty();
if (ami.strMimeType != mi.strMimeType)
ami.strMimeType.Empty();
ami.fVideoLengthSec += mi.fVideoLengthSec;
if (ami.iVideoStreams == 0 && mi.iVideoStreams > 0 || ami.iVideoStreams > 0 && mi.iVideoStreams == 0)
{
if (ami.iVideoStreams == 0)
ami.iVideoStreams = mi.iVideoStreams;
bDiffVideoCompression = true;
bDiffVideoWidth = true;
bDiffVideoHeight = true;
bDiffVideoFrameRate = true;
bDiffVideoBitRate = true;
bDiffVideoAspectRatio = true;
}
else
{
if (ami.strVideoFormat != mi.strVideoFormat)
bDiffVideoCompression = true;
if (ami.video.bmiHeader.biWidth != mi.video.bmiHeader.biWidth)
bDiffVideoWidth = true;
if (ami.video.bmiHeader.biHeight != mi.video.bmiHeader.biHeight)
bDiffVideoHeight = true;
if (ami.fVideoFrameRate != mi.fVideoFrameRate)
bDiffVideoFrameRate = true;
if (ami.video.dwBitRate != mi.video.dwBitRate)
bDiffVideoBitRate = true;
if (ami.fVideoAspectRatio != mi.fVideoAspectRatio)
bDiffVideoAspectRatio = true;
}
ami.fAudioLengthSec += mi.fAudioLengthSec;
if (ami.iAudioStreams == 0 && mi.iAudioStreams > 0 || ami.iAudioStreams > 0 && mi.iAudioStreams == 0)
{
if (ami.iAudioStreams == 0)
ami.iAudioStreams = mi.iAudioStreams;
bDiffAudioCompression = true;
bDiffAudioChannels = true;
bDiffAudioSamplesPerSec = true;
bDiffAudioAvgBytesPerSec = true;
}
else
{
if (ami.strAudioFormat != mi.strAudioFormat)
bDiffAudioCompression = true;
if (ami.audio.nChannels != mi.audio.nChannels)
bDiffAudioChannels = true;
if (ami.audio.nSamplesPerSec != mi.audio.nSamplesPerSec)
bDiffAudioSamplesPerSec = true;
if (ami.audio.nAvgBytesPerSec != mi.audio.nAvgBytesPerSec)
bDiffAudioAvgBytesPerSec = true;
}
if (!ami.strInfo.str.IsEmpty())
ami.strInfo << "\n";
ami.strInfo << mi.strInfo.str;
}
}
CString buffer;
buffer = ami.strFileFormat;
/*if (!ami.strMimeType.IsEmpty())
{
if (!buffer.IsEmpty())
buffer += _T("; ");
buffer.AppendFormat(_T("MIME type=%s"), ami.strMimeType);
}*/
SetDlgItemText(IDC_FORMAT, buffer);
if (uTotalFileSize)
SetDlgItemText(IDC_FILESIZE, CastItoXBytes(uTotalFileSize, false, false));
if (ami.fVideoLengthSec)
SetDlgItemText(IDC_LENGTH, CastSecondsToHM(ami.fVideoLengthSec));
else if (ami.fAudioLengthSec)
SetDlgItemText(IDC_LENGTH, CastSecondsToHM(ami.fAudioLengthSec));
if (ami.iVideoStreams)
{
if (!bDiffVideoCompression && !ami.strVideoFormat.IsEmpty())
SetDlgItemText(IDC_VCODEC, ami.strVideoFormat);
else
SetDlgItemText(IDC_VCODEC, _T(""));
if (!bDiffVideoBitRate && ami.video.dwBitRate)
{
buffer.Format(_T("%u kBit/s"), (ami.video.dwBitRate + 500) / 1000);
SetDlgItemText(IDC_VBITRATE, buffer);
}
else
SetDlgItemText(IDC_VBITRATE, _T(""));
if (!bDiffVideoWidth && ami.video.bmiHeader.biWidth)
SetDlgItemInt(IDC_VWIDTH, abs(ami.video.bmiHeader.biWidth), FALSE);
else
SetDlgItemText(IDC_VWIDTH, _T(""));
if (!bDiffVideoHeight && ami.video.bmiHeader.biHeight)
SetDlgItemInt(IDC_VHEIGHT, abs(ami.video.bmiHeader.biHeight), FALSE);
else
SetDlgItemText(IDC_VHEIGHT, _T(""));
if (!bDiffVideoAspectRatio && ami.fVideoAspectRatio)
{
buffer.Format(_T("%.3f"), ami.fVideoAspectRatio);
CString strAR = GetKnownAspectRatioDisplayString(ami.fVideoAspectRatio);
if (!strAR.IsEmpty())
buffer.AppendFormat(_T(" (%s)"), strAR);
SetDlgItemText(IDC_VASPECT, buffer);
}
else
SetDlgItemText(IDC_VASPECT, _T(""));
if (!bDiffVideoFrameRate && ami.fVideoFrameRate)
{
buffer.Format(_T("%.2f"), ami.fVideoFrameRate);
SetDlgItemText(IDC_VFPS, buffer);
}
else
SetDlgItemText(IDC_VFPS, _T(""));
}
if (ami.iAudioStreams)
{
if (!bDiffAudioCompression && !ami.strAudioFormat.IsEmpty())
SetDlgItemText(IDC_ACODEC, ami.strAudioFormat);
else
SetDlgItemText(IDC_ACODEC, _T(""));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -