/*===================================================
VideoEnc - MPEG-1/MPEG-2 运动图像压缩编码器
Microsoft Win32 图形界面版本2.0
作者:马子扬
版权所有 2003 - 2005
=====================================================*/
//屏蔽 Windows 内部数据类型的不兼容警告
#pragma warning(disable:4024)
#pragma warning(disable:4047)
#include <windows.h>
#include <commdlg.h>
#include <commctrl.h>
#include <vfw.h>
#include <htmlhelp.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "mpegalloc.h"
#ifdef UNICODE
# define _UNICODE //tchar.h中以_UNICODE是否定义为标志
#else
# undef _UNICODE
#endif
#include <tchar.h>
#include "resource.h"
//添加的工具栏定义
#define IDC_TOOLBAR 1200
#include "VideoEnc.h"
#include "testCPU.h" //导入CPU指令集支持性检测函数
#include "tabshow.h" //导入属性页控件的显示与隐藏函数
#include "showpv.h" //导入预览函数
#include "seqenc.h"
#include "saveppm.h" //导入PPM文件输出函数库
#include "savetga.h" //导入TGA文件输出函数库
#include "cpu_a.h"
#include "m2venc.h"
#include "getframe.h"
#include "vemsgbox.h"
/*用户数据最大的字符数*/
#define MAX_USER_DATA 1024
/*框架(Profile)定义*/
#define SP 5 /*简单*/
#define MP 4 /*主*/
#define SNR 3 /*SNR分级*/
#define SPAT 2 /*空域*/
#define HP 1 /*高*/
/*级别(Level)定义*/
#define LL 10 /*低*/
#define ML 8 /*主*/
#define H14 6 /*高1440*/
#define HL 4 /*高*/
#define Y_MIN -256
#define Y_MAX 255
#define U_MIN -256
#define U_MAX 255
#define V_MIN -256
#define V_MAX 255
/*导入变量*/
extern double frame_rate_value_table []; //帧速率索引表
extern unsigned char intra_quantiser_matrix_normal []; //MPEG标准帧内块量化系数矩阵
extern unsigned char nonintra_quantiser_matrix_normal[]; //MPEG标准非帧内块量化系数矩阵
//预览用的位图及其信息
extern LPBITMAPINFOHEADER lpbitmpPV; //预览用的位图
extern unsigned char *pBitsPV ; //预览用的位图像素位指针
extern int src_width,src_height ; //AVI源图的大小
extern int src_frame_rate ; //AVI源图的帧速率
extern int repeat_times ; //重复取样次数
extern int nframe_stopped ; //压缩停止的帧号
//用于MMX指令的Y、U、V色彩校正中的偏移量
extern int MMX_Y_DELTA[2],MMX_Cb_DELTA[2],MMX_Cr_DELTA[2];
/*全局变量*/
HWND hwndPV; //预览画框的句柄
HWND hwndMain; //主窗口句柄
HINSTANCE hInstance; //实例句柄
HANDLE hThreadCompress; //压缩线程句柄
HANDLE hEventCCompress; //压缩线程事件对象,置位表示继续压缩
//否则表示等待
M2VENC_PARAM m2vep; //MPEG-2视频编码参数结构体定义
int Use_MMX_Read=1, //是否用SIMD-MMX指令读AVI图?0:否 1:是
CPU_Algorithm, //Algorithm For Special CPU
Is_Compress_Started, //压缩线程是否已经运行?0:否 1:是
Is_Set_Open, //设置选项卡是否打开?0:否 1:是
Current_Page, //当前已经激活的选项卡序号
Continue_Compress, //是否继续压缩?0:否 1:是
Compress_Ended, //压缩线程是否结束?0:否 1:是
use_default_fir, //是否使用推荐FIR滤波器?0:否 1:是
smooth_zoom_dib, //是否平滑缩放位图?0:否 1:是
smooth_dst, //是否缩放后柔化图象?0:否 1:是
smooth_src, //是否缩放前柔化源图象?0:否 1:是
auto_smooth_src, //是否自动确定smooth_src的值?0:否 1:是
now_f, //tick of track bar
Compress_Thread_ID, //压缩线程的ID
VE_Mode, //当前编码模式(seqenc.h)
VE_BMPSEQ_Mode, //BMPSeq的当前选择类型(BMP/PPM/TGA...)
Is_Preview, //是否预览?0:否 1:是
src_nFrames, //源AVI文件共有多少帧
Is_SrcFileOpen, //AVI源文件是否已经打开?0:否 1:是
YDelta,CbDelta,CrDelta, //Y、U、V色彩校正中的偏移量
No_warning, //忽略对参数设置的一般警告信息?0:否 1:是
f_sumx=4, //水平滤波器系数的和
f_sumy=4; //垂直滤波器系数的和
BOOL ShowPV_I; //是否只显示关键帧?0:否1:是
short f_x[5]={0,1,2,1,0}, //水平滤波器系数
f_y[5]={0,1,2,1,0}; //垂直滤波器系数
char * output_seq_filename; //输出(如:BMP视频序列)文件名
TCHAR * strNewAVIFileName; //输出新的AVI文件的文件名
/*私有变量*/
static HMENU hMenuMain; //主菜单句柄
static HWND hToolBar; //工具栏窗口句柄
static TCHAR strAppName[]=TEXT("MPEG-2 视频编码器");
static TCHAR strAVIFileName [MAX_PATH]; //AVI源文件名(可能为宽字符)
static char szAVIFileName [MAX_PATH]; //AVI源文件名(Not UNICODE)
static TCHAR strDSTFileName [MAX_PATH]; //MPEG视频文件名(可能为宽字符)
static char szDSTFileName [MAX_PATH]; //MPEG视频文件名(Not UNICODE)
static TCHAR strQMCFileName [MAX_PATH]; //量化矩阵改变文件名(可能为宽字符)
static char szQMCFileName [MAX_PATH]; //量化矩阵改变文件名(Not UNICODE)
static TCHAR strQMTFileName [MAX_PATH]; //量化矩阵文件名(可能为宽字符)
static char szQMTFileName [MAX_PATH]; //量化矩阵文件名(Not UNICODE)
static TCHAR strQMFileName [MAX_PATH]; //单个量化矩阵文件名(可能为宽字符)
static char szQMFileName [MAX_PATH]; //单个量化矩阵文件名(Not UNICODE)
static TCHAR strPSFileName [MAX_PATH]; //全景扫描偏移点文件文件名(可能为宽字符)
static char szPSFileName [MAX_PATH]; //全景扫描偏移点文件文件名(Not UNICODE)
static TCHAR strFilterFileName[MAX_PATH]; //扩展滤镜库文件名(可能为宽字符)
static TCHAR strTParamFileName[MAX_PATH]; //编码参数模板文件文件名(可能为宽字符)
static char szTParamFileName [MAX_PATH]; //编码参数模板文件文件名(Not UNICODE)
static TCHAR strCurPath [MAX_PATH]; //本程序的执行文件夹
static TCHAR strSoundFileName [MAX_PATH]= //编码正常结束后播放的声音文件名
TEXT("notify.wav");
static int can_select, //是否可以选择压缩区域?0:否 1:是
compress_end_Frame, //到哪一帧结束压缩,最大src_nFrames-1
compress_begin_Frame; //从哪一帧开始压缩,从0开始计算
static int hwndMainHeight, //主窗口的高度(以像素为单位)
hwndMainWidth; //主窗口的宽度(以像素为单位)
//属性页
static HANDLE hwndTab; //属性页句柄
static TC_ITEM tcih; //页项结构
static HINSTANCE hFilterInst; //滤镜库句柄
static DWORD dwWhichTabChosen; //哪一个页项被选中了
static TCHAR pszGeneralParamPage[]=TEXT("一般参数");
static TCHAR pszQuantMatPage []=TEXT("量化矩阵");
static TCHAR pszPanScanPage []=TEXT("全景扫描");
static TCHAR pszParamExtPage []=TEXT("扩展参数");
static TCHAR pszPrevProcess []=TEXT("预处理");
static TCHAR pszCPUandAlgorithm []=TEXT("CPU和算法");
//MPEG-2/MPEG-1/MPEG1 D当前选择
static int nMPEG1Choose;
//量化矩阵
static unsigned char pQuantMat[4][64]; //四个量化矩阵
static int whatQuantMat; //当前正在设置的量化矩阵
static int whatQMCboChoose[4]; //量化矩阵窗口Combo box的选择值
static int useDefQuantMat[4]; //是否使用推荐量化矩阵?0:否 1:是
//CG/动画片Intra量化矩阵
static unsigned char CG_IntraQuantMat[64]=
{
8, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32
};
//推荐non-Intra量化矩阵
static unsigned char Def_nonIntraQuantMat[64]=
{
16, 17, 18, 19, 20, 21, 22, 23,
17, 18, 19, 20, 21, 22, 23, 24,
18, 19, 20, 21, 22, 23, 24, 25,
19, 20, 21, 22, 23, 24, 26, 27,
20, 21, 22, 23, 25, 26, 27, 28,
21, 22, 23, 24, 26, 27, 28, 30,
22, 23, 24, 26, 27, 28, 30, 31,
23, 24, 25, 27, 28, 30, 31, 33
};
//被�