📄 fileinfodialog.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "stdafx.h"
#include <io.h>
#include <fcntl.h>
#include "eMule.h"
#include "FileInfoDialog.h"
#include "OtherFunctions.h"
#include "PartFile.h"
#include "Preferences.h"
// id3lib
#include <id3/tag.h>
#include <id3/misc_support.h>
// DirectShow MediaDet
#include <strmif.h>
#define _DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID DECLSPEC_SELECTANY name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
_DEFINE_GUID(MEDIATYPE_Video, 0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
_DEFINE_GUID(MEDIATYPE_Audio, 0x73647561, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
_DEFINE_GUID(FORMAT_VideoInfo,0x05589f80, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a);
_DEFINE_GUID(FORMAT_WaveFormatEx,0x05589f81, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a);
#include <qedit.h>
typedef struct tagVIDEOINFOHEADER {
RECT rcSource; // The bit we really want to use
RECT rcTarget; // Where the video should go
DWORD dwBitRate; // Approximate bit data rate
DWORD dwBitErrorRate; // Bit error rate for this stream
REFERENCE_TIME AvgTimePerFrame; // Average time per frame (100ns units)
BITMAPINFOHEADER bmiHeader;
} VIDEOINFOHEADER;
// MediaInfoDLL
/** @brief Kinds of Stream */
typedef enum _stream_t
{
Stream_General,
Stream_Video,
Stream_Audio,
Stream_Text,
Stream_Chapters,
Stream_Image,
Stream_Max
} stream_t_C;
/** @brief Kinds of Info */
typedef enum _info_t
{
Info_Name,
Info_Text,
Info_Measure,
Info_Options,
Info_Name_Text,
Info_Measure_Text,
Info_Info,
Info_HowTo,
Info_Max
} info_t_C;
// Those defines are for 'mmreg.h' which is included by 'vfw.h'
#define NOMMIDS // Multimedia IDs are not defined
//#define NONEWWAVE // No new waveform types are defined except WAVEFORMATEX
#define NONEWRIFF // No new RIFF forms are defined
#define NOJPEGDIB // No JPEG DIB definitions
#define NONEWIC // No new Image Compressor types are defined
#define NOBITMAP // No extended bitmap info header definition
// Those defines are for 'vfw.h'
//#define NOCOMPMAN
//#define NODRAWDIB
#define NOVIDEO
//#define NOAVIFMT
//#define NOMMREG
//#define NOAVIFILE
#define NOMCIWND
#define NOAVICAP
#define NOMSACM
#include <vfw.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////
// CStringStream
class CStringStream
{
public:
CStringStream(){}
CStringStream& operator<<(LPCTSTR psz);
CStringStream& operator<<(char* psz);
CStringStream& operator<<(UINT uVal);
CStringStream& operator<<(int iVal);
CStringStream& operator<<(double fVal);
CString str;
};
CStringStream& CStringStream::operator<<(LPCTSTR psz)
{
str += psz;
return *this;
}
CStringStream& CStringStream::operator<<(char* psz)
{
str += psz;
return *this;
}
CStringStream& CStringStream::operator<<(UINT uVal)
{
CString strVal;
strVal.Format(_T("%u"), uVal);
str += strVal;
return *this;
}
CStringStream& CStringStream::operator<<(int iVal)
{
CString strVal;
strVal.Format(_T("%d"), iVal);
str += strVal;
return *this;
}
CStringStream& CStringStream::operator<<(double fVal)
{
CString strVal;
strVal.Format(_T("%.3f"), fVal);
str += strVal;
return *this;
}
/////////////////////////////////////////////////////////////////////////////
// SMediaInfo
struct SMediaInfo
{
SMediaInfo()
{
(void)strFileFormat;
(void)strMimeType;
ulFileSize = 0;
iVideoStreams = 0;
(void)strVideoFormat;
memset(&video, 0, sizeof video);
fVideoLengthSec = 0.0;
fVideoFrameRate = 0.0;
fVideoAspectRatio = 0.0;
iAudioStreams = 0;
(void)strAudioFormat;
memset(&audio, 0, sizeof audio);
fAudioLengthSec = 0.0;
}
CString strFileFormat;
CString strMimeType;
ULONG ulFileSize;
int iVideoStreams;
CString strVideoFormat;
VIDEOINFOHEADER video;
double fVideoLengthSec;
double fVideoFrameRate;
double fVideoAspectRatio;
int iAudioStreams;
CString strAudioFormat;
WAVEFORMAT audio;
double fAudioLengthSec;
CStringStream strInfo;
};
/////////////////////////////////////////////////////////////////////////////
// CGetMediaInfoThread
#define WM_MEDIA_INFO_RESULT (WM_USER+0x100+1)
class CGetMediaInfoThread : public CWinThread
{
DECLARE_DYNCREATE(CGetMediaInfoThread)
protected:
CGetMediaInfoThread()
{
m_hWndOwner = NULL;
m_paFiles = NULL;
}
public:
virtual BOOL InitInstance();
virtual int Run();
void SetValues(HWND hWnd, const CSimpleArray<const CKnownFile*>* paFiles)
{
m_hWndOwner = hWnd;
m_paFiles = paFiles;
}
private:
HWND m_hWndOwner;
const CSimpleArray<const CKnownFile*>* m_paFiles;
};
/////////////////////////////////////////////////////////////////////////////
// CMediaInfoDLL
class CMediaInfoDLL
{
public:
CMediaInfoDLL()
{
m_bInitialized = FALSE;
m_hLib = NULL;
}
~CMediaInfoDLL()
{
if (m_hLib)
FreeLibrary(m_hLib);
}
BOOL Initialize()
{
if (!m_bInitialized)
{
m_bInitialized = TRUE;
m_hLib = LoadLibrary(_T("MEDIAINFO.DLL"));
if (m_hLib != NULL)
{
(FARPROC &)fpMediaInfo_Info_Version = GetProcAddress(m_hLib, "MediaInfo_Info_Version");
if (fpMediaInfo_Info_Version)
{
char* pszVersion = (*fpMediaInfo_Info_Version)();
if (pszVersion && strcmp(pszVersion, "MediaInfoLib - v0.4.0.1 - http://mediainfo.sourceforge.net") == 0)
{
(FARPROC &)fpMediaInfo_Open = GetProcAddress(m_hLib, "MediaInfo_Open");
(FARPROC &)fpMediaInfo_Close = GetProcAddress(m_hLib, "MediaInfo_Close");
(FARPROC &)fpMediaInfo_Get = GetProcAddress(m_hLib, "MediaInfo_Get");
if (fpMediaInfo_Open && fpMediaInfo_Close && fpMediaInfo_Get)
return TRUE;
}
}
FreeLibrary(m_hLib);
m_hLib = NULL;
}
}
return m_hLib != NULL;
}
char* (__stdcall *fpMediaInfo_Info_Version)();
void* (__stdcall *fpMediaInfo_Open)(char* File);
void (__stdcall *fpMediaInfo_Close)(void* Handle);
char* (__stdcall *fpMediaInfo_Get)(void* Handle, stream_t_C StreamKind, int StreamNumber, char* Parameter, info_t_C KindOfInfo, info_t_C KindOfSearch);
protected:
BOOL m_bInitialized;
HINSTANCE m_hLib;
};
CMediaInfoDLL theMediaInfoDLL;
bool GetMediaInfo(HWND hWndOwner, const CKnownFile* pFile, SMediaInfo* mi, bool bSingleFile);
/////////////////////////////////////////////////////////////////////////////
// CFileInfoDialog dialog
IMPLEMENT_DYNAMIC(CFileInfoDialog, CResizablePage)
BEGIN_MESSAGE_MAP(CFileInfoDialog, CResizablePage)
ON_MESSAGE(WM_MEDIA_INFO_RESULT, OnMediaInfoResult)
END_MESSAGE_MAP()
CFileInfoDialog::CFileInfoDialog()
: CResizablePage(CFileInfoDialog::IDD, 0)
{
m_strCaption = GetResString(IDS_FILEINFO);
m_psp.pszTitle = m_strCaption;
m_psp.dwFlags |= PSP_USETITLE;
// memset(&m_cfDef, 0, sizeof m_cfDef);
// memset(&m_cfBold, 0, sizeof m_cfBold);
// memset(&m_cfRed, 0, sizeof m_cfRed);
}
CFileInfoDialog::~CFileInfoDialog()
{
}
CString GetWaveFormatTagName(UINT uWavFmtTag, CString& rstrComment)
{
const static struct _tagWavFmtTag
{
unsigned int uFmtTag;
const char *pszDefine;
const char *pszComment;
} WavFmtTag[] =
{
{ 0x0000, "Unknown", "" },
{ 0x0001, "PCM", "" },
{ 0x0002, "ADPCM", "" },
{ 0x0003, "IEEE_FLOAT", "" },
{ 0x0004, "VSELP", "Compaq Computer Corp." },
{ 0x0005, "IBM_CVSD", "IBM Corporation" },
{ 0x0006, "ALAW", "" },
{ 0x0007, "MULAW", "" },
{ 0x0008, "DTS", "" },
{ 0x0009, "DRM", "" },
{ 0x0010, "OKI_ADPCM", "OKI" },
{ 0x0011, "DVI_ADPCM", "Intel Corporation" },
{ 0x0012, "MEDIASPACE_ADPCM", "Videologic" },
{ 0x0013, "SIERRA_ADPCM", "Sierra Semiconductor Corp" },
{ 0x0014, "G723_ADPCM", "Antex Electronics Corporation" },
{ 0x0015, "DIGISTD", "DSP Solutions, Inc." },
{ 0x0016, "DIGIFIX", "DSP Solutions, Inc." },
{ 0x0017, "DIALOGIC_OKI_ADPCM", "Dialogic Corporation" },
{ 0x0018, "MEDIAVISION_ADPCM", "Media Vision, Inc." },
{ 0x0019, "CU_CODEC", "Hewlett-Packard Company" },
{ 0x0020, "YAMAHA_ADPCM", "Yamaha Corporation of America" },
{ 0x0021, "SONARC", "Speech Compression" },
{ 0x0022, "DSPGROUP_TRUESPEECH", "DSP Group, Inc" },
{ 0x0023, "ECHOSC1", "Echo Speech Corporation" },
{ 0x0024, "AUDIOFILE_AF36", "Virtual Music, Inc." },
{ 0x0025, "APTX", "Audio Processing Technology" },
{ 0x0026, "AUDIOFILE_AF10", "Virtual Music, Inc." },
{ 0x0027, "PROSODY_1612", "Aculab plc" },
{ 0x0028, "LRC", "Merging Technologies S.A." },
{ 0x0030, "DOLBY_AC2", "Dolby Laboratories" },
{ 0x0031, "GSM610", "" },
{ 0x0032, "MSNAUDIO", "" },
{ 0x0033, "ANTEX_ADPCME", "Antex Electronics Corporation" },
{ 0x0034, "CONTROL_RES_VQLPC", "Control Resources Limited" },
{ 0x0035, "DIGIREAL", "DSP Solutions, Inc." },
{ 0x0036, "DIGIADPCM", "DSP Solutions, Inc." },
{ 0x0037, "CONTROL_RES_CR10", "Control Resources Limited" },
{ 0x0038, "NMS_VBXADPCM", "Natural MicroSystems" },
{ 0x0039, "CS_IMAADPCM", "Crystal Semiconductor IMA ADPCM" },
{ 0x003A, "ECHOSC3", "Echo Speech Corporation" },
{ 0x003B, "ROCKWELL_ADPCM", "Rockwell International" },
{ 0x003C, "ROCKWELL_DIGITALK", "Rockwell International" },
{ 0x003D, "XEBEC", "Xebec Multimedia Solutions Limited" },
{ 0x0040, "G721_ADPCM", "Antex Electronics Corporation" },
{ 0x0041, "G728_CELP", "Antex Electronics Corporation" },
{ 0x0042, "MSG723", "" },
{ 0x0050, "MPEG-1, Layer 1", "" },
{ 0x0051, "MPEG-1, Layer 2", "" },
{ 0x0052, "RT24", "InSoft, Inc." },
{ 0x0053, "PAC", "InSoft, Inc." },
{ 0x0055, "MPEG-1, Layer 3", "" },
{ 0x0059, "LUCENT_G723", "Lucent Technologies" },
{ 0x0060, "CIRRUS", "Cirrus Logic" },
{ 0x0061, "ESPCM", "ESS Technology" },
{ 0x0062, "VOXWARE", "Voxware Inc" },
{ 0x0063, "CANOPUS_ATRAC", "Canopus, co., Ltd." },
{ 0x0064, "G726_ADPCM", "APICOM" },
{ 0x0065, "G722_ADPCM", "APICOM" },
{ 0x0067, "DSAT_DISPLAY", "" },
{ 0x0069, "VOXWARE_BYTE_ALIGNED", "Voxware Inc" },
{ 0x0070, "VOXWARE_AC8", "Voxware Inc" },
{ 0x0071, "VOXWARE_AC10", "Voxware Inc" },
{ 0x0072, "VOXWARE_AC16", "Voxware Inc" },
{ 0x0073, "VOXWARE_AC20", "Voxware Inc" },
{ 0x0074, "VOXWARE_RT24", "Voxware Inc" },
{ 0x0075, "VOXWARE_RT29", "Voxware Inc" },
{ 0x0076, "VOXWARE_RT29HW", "Voxware Inc" },
{ 0x0077, "VOXWARE_VR12", "Voxware Inc" },
{ 0x0078, "VOXWARE_VR18", "Voxware Inc" },
{ 0x0079, "VOXWARE_TQ40", "Voxware Inc" },
{ 0x0080, "SOFTSOUND", "Softsound, Ltd." },
{ 0x0081, "VOXWARE_TQ60", "Voxware Inc" },
{ 0x0082, "MSRT24", "" },
{ 0x0083, "G729A", "AT&T Labs, Inc." },
{ 0x0084, "MVI_MVI2", "Motion Pixels" },
{ 0x0085, "DF_G726", "DataFusion Systems (Pty) (Ltd)" },
{ 0x0086, "DF_GSM610", "DataFusion Systems (Pty) (Ltd)" },
{ 0x0088, "ISIAUDIO", "Iterated Systems, Inc." },
{ 0x0089, "ONLIVE", "OnLive! Technologies, Inc." },
{ 0x0091, "SBC24", "Siemens Business Communications Sys" },
{ 0x0092, "DOLBY_AC3_SPDIF", "Sonic Foundry" },
{ 0x0093, "MEDIASONIC_G723", "MediaSonic" },
{ 0x0094, "PROSODY_8KBPS", "Aculab plc" },
{ 0x0097, "ZYXEL_ADPCM", "ZyXEL Communications, Inc." },
{ 0x0098, "PHILIPS_LPCBB", "Philips Speech Processing" },
{ 0x0099, "PACKED", "Studer Professional Audio AG" },
{ 0x00A0, "MALDEN_PHONYTALK", "Malden Electronics Ltd." },
{ 0x0100, "RHETOREX_ADPCM", "Rhetorex Inc." },
{ 0x0101, "IRAT", "BeCubed Software Inc." },
{ 0x0111, "VIVO_G723", "Vivo Software" },
{ 0x0112, "VIVO_SIREN", "Vivo Software" },
{ 0x0123, "DIGITAL_G723", "Digital Equipment Corporation" },
{ 0x0125, "SANYO_LD_ADPCM", "Sanyo Electric Co., Ltd." },
{ 0x0130, "SIPROLAB_ACEPLNET", "Sipro Lab Telecom Inc." },
{ 0x0131, "SIPROLAB_ACELP4800", "Sipro Lab Telecom Inc." },
{ 0x0132, "SIPROLAB_ACELP8V3", "Sipro Lab Telecom Inc." },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -