⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfc_demo.cpp

📁 SAMSUNG S3C6410 CPU BSP for winmobile6
💻 CPP
字号:
#include <windows.h>
#include "resource.h"


#define APPNAME				TEXT("S3C6410 MFC DECODE DEMO")
#define APPTITLE			TEXT("S3C6410 MFC DECODE DEMO")


extern BOOL mfc_render_init(HWND hWnd);
extern void mfc_render_final();


static HBITMAP  hBmpBkg=NULL;			// HBITMAP object for image on the main window
static HBITMAP  hBmpExitButton=NULL;	// HBITMAP object for exit button


#include "mfc_decode.h"
#include "mfc_render.h"


#define NUM_VECTORS_MAX			6
#define MEDIA_FILES_FOLDER		TEXT("\\My Documents")


LPCTSTR pszFileNames0[]   = {L"\\My Documents\\shrek_640_480_768bit.m4v"};
CODEC_MODE codec_modes0[] = {CODEC_MPEG4};

LPCTSTR pszFileNames1[]   = {L"\\My Documents\\shrek3_320_240.m4v"};
CODEC_MODE codec_modes1[] = {CODEC_MPEG4};

LPCTSTR pszFileNames2[]   = {L"\\My Documents\\ultraviolet-640x480.264"};
CODEC_MODE codec_modes2[] = {CODEC_H264};

LPCTSTR pszFileNames3[]   = {L"\\My Documents\\harryp_320x240.264"};
CODEC_MODE codec_modes3[] = {CODEC_H264};

LPCTSTR pszFileNames4[]   = {L"\\My Documents\\veggie_tales_pirates_720x576.264"};
CODEC_MODE codec_modes4[] = {CODEC_H264};

LPCTSTR pszFileNames5[]   = {L"\\My Documents\\veggie_tales_pirates_320x240.264"};
CODEC_MODE codec_modes5[] = {CODEC_H264};


LPCTSTR *array_pszFileNames[NUM_VECTORS_MAX] = {
	pszFileNames0,
	pszFileNames1,
	pszFileNames2,
	pszFileNames3,
	pszFileNames4,
	pszFileNames5,
};

CODEC_MODE *array_codec_modes[NUM_VECTORS_MAX] = {
	codec_modes0,
	codec_modes1,
	codec_modes2,
	codec_modes3,
	codec_modes4,
	codec_modes5
};

/*
static void release_media_files_array()
{
	int              num_vectors;

	for (num_vectors=0; num_vectors < NUM_VECTORS_MAX; num_vectors++) {
		if (array_pszFileNames[num_vectors] == NULL)
			break;
	}
}
*/

static int find_media_files_fill_array(LPCTSTR folder_name)
{
	int              num_vectors;
	int              not_media_file;

	HANDLE           hFindFile;
	WIN32_FIND_DATA  find_data;

	TCHAR            filepath[128];
	TCHAR            file_ext[4];

	CODEC_MODE       codec_mode;

	wsprintf(filepath, L"%s\\*.*", folder_name);

	hFindFile = FindFirstFile(filepath, &find_data);
	if (hFindFile == INVALID_HANDLE_VALUE)
		return 0;

#define FILE_EXT_M4V	L".m4v"
#define FILE_EXT_H263	L".263"
#define FILE_EXT_H264	L".264"
#define FILE_EXT_RCV	L".rcv"

	for (num_vectors=0; num_vectors < NUM_VECTORS_MAX; ) {
		if (find_data.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
			not_media_file = 0;

			if (wcslen(find_data.cFileName) > 4)
				wcsncpy(file_ext, find_data.cFileName + (wcslen(find_data.cFileName) - 4), 4);
			else
				file_ext[0] = 0;

			// Identify the codec type according to the filename extention
			if(_wcsnicmp(file_ext, FILE_EXT_M4V, 4) == 0)
				codec_mode = CODEC_MPEG4;
			else if(_wcsnicmp(file_ext, FILE_EXT_H263, 4) == 0)
				codec_mode = CODEC_H263;
			else if(_wcsnicmp(file_ext, FILE_EXT_H264, 4) == 0)
				codec_mode = CODEC_H264;
			else if(_wcsnicmp(file_ext, FILE_EXT_RCV, 4) == 0)
				codec_mode = CODEC_VC1;
			else
				not_media_file = 1;
#if 0
			// Identify the codec type according to the filename extention
			if(wcsstr(find_data.cFileName, FILE_EXT_M4V) != NULL)
				codec_mode = CODEC_MPEG4;
			else if(wcsstr(find_data.cFileName, FILE_EXT_H263) != NULL)
				codec_mode = CODEC_H263;
			else if(wcsstr(find_data.cFileName, FILE_EXT_H264) != NULL)
				codec_mode = CODEC_H264;
			else if(wcsstr(find_data.cFileName, FILE_EXT_RCV) != NULL)
				codec_mode = CODEC_VC1;
			else
				not_media_file = 1;
#endif

			if (not_media_file == 0) {
				wsprintf(filepath, L"%s\\%s", folder_name, find_data.cFileName);

				array_pszFileNames[num_vectors][0] = _wcsdup(filepath);
				array_codec_modes[num_vectors][0]  = codec_mode;

				num_vectors++;
			}
		}

		if (FindNextFile(hFindFile, &find_data) == FALSE)
			break;
	}

	FindClose(hFindFile);

	return num_vectors;
}



typedef struct
{
	HWND  hWnd;
	BOOL  fForceExit;

	int   demofile_idx;
} MFCDEC_DEMO_THREAD_PARAM;



static DWORD WINAPI mfc_demo_thread(LPVOID pPARAM)
{
	MFCDEC_DEMO_THREAD_PARAM    *p_mfc_demo_param;
	int  idx;

	if (pPARAM == NULL) {
		return 0x0FFFF;
	}

	p_mfc_demo_param = (MFCDEC_DEMO_THREAD_PARAM *) pPARAM;
	idx = p_mfc_demo_param->demofile_idx;

	RETAILMSG(1, (L"\n[MFC_DEMO] Playing \'%s\' file", array_pszFileNames[idx][0]));

#define NUM_PIP_VIDEOS		1
	mfcdec_demo(p_mfc_demo_param->hWnd,
	            array_pszFileNames[idx],
	            array_codec_modes[idx],
	            NUM_PIP_VIDEOS,
	            &(p_mfc_demo_param->fForceExit));

	return 0;
}


static void mfc_demo_thread_control(HWND hWnd, int demofile_idx)
{
	static MFCDEC_DEMO_THREAD_PARAM    mfc_demo_param;
	static HANDLE  hThread = NULL;

	DWORD  exit_code=0;


	if (hThread != NULL) {

		// Check if the thread exited already.
		GetExitCodeThread(hThread, &exit_code);
		if (exit_code == STILL_ACTIVE) {	// Thread is running -> Terminate thread.
			mfc_demo_param.fForceExit = TRUE;
			WaitForSingleObject(hThread, 2000);
			hThread = NULL;
			return;
		}
	}

	if ((demofile_idx >= 0) && (demofile_idx < NUM_VECTORS_MAX)) {
		// Start demo thread
		mfc_demo_param.hWnd          = hWnd;
		mfc_demo_param.fForceExit    = FALSE;
		mfc_demo_param.demofile_idx  = demofile_idx;

		hThread = CreateThread(NULL, 0,
		                       mfc_demo_thread,
		                       &mfc_demo_param,
		                       0,
		                       NULL);
	}
}



#define DRAW_TEXT_X_POS		100
#define DRAW_TEXT_Y_POS		150
#define DRAW_TEXT_X_LENG	280
#define DRAW_TEXT_Y_LENG	30

// return value = -1  : not selected
static int GetDemofileIndex(DWORD xPos, DWORD yPos)
{
	DWORD i;


	if ((xPos >= DRAW_TEXT_X_POS) && (xPos <= (DRAW_TEXT_X_POS + DRAW_TEXT_X_LENG))) {

		if (yPos < DRAW_TEXT_Y_POS)
			return -1;

		for (i=1; i<=NUM_VECTORS_MAX; i++) {
			if (  yPos < (DRAW_TEXT_Y_POS + (DRAW_TEXT_Y_LENG * i))  )
				return (i-1);
		}
	}

	return -1;
}


//-----------------------------------------------------------------------------
// Name: WindowProc()
// Desc: The Main Window Procedure
//-----------------------------------------------------------------------------
long FAR PASCAL
WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC         hdc;
	DWORD       xPos, yPos;
	RECT        draw_rect;
	POINT       pt;

	int         i;
	int         demofile_idx;

	static int         num_vectors = 0;
	static HDC         hdc_mem_bkg, hdc_mem_exit_btn;
	static BITMAP      bm_bkg, bm_exit_btn;

	TCHAR       msg_filename_to_play[128];

	switch (message)
	{
		case WM_CREATE:
			// Rendering Init
			mfc_render_init(hWnd);
			// Check the number of media files in specific folder
			// and fill the filename list array.
			num_vectors = find_media_files_fill_array(MEDIA_FILES_FOLDER);


			hdc_mem_bkg = CreateCompatibleDC(NULL);
			GetObject(hBmpBkg, sizeof(BITMAP), &bm_bkg);
			SelectObject(hdc_mem_bkg, (HGDIOBJ)hBmpBkg);

			hdc_mem_exit_btn = CreateCompatibleDC(NULL);
			GetObject(hBmpExitButton, sizeof(BITMAP), &bm_exit_btn);
			SelectObject(hdc_mem_exit_btn, (HGDIOBJ)hBmpExitButton);
			break;

		case WM_DESTROY:
			// Clean up and close the app
//			SelectObject(hdc_mem, (HGDIOBJ)hBitmapOld);
			DeleteDC(hdc_mem_bkg);
			if (hBmpBkg)
				DeleteObject(hBmpBkg);
			DeleteDC(hdc_mem_exit_btn);
			if (hBmpExitButton)
				DeleteObject(hBmpExitButton);
			mfc_render_final();
			PostQuitMessage(0);
			return 0L;

		case WM_LBUTTONDOWN:
			xPos = LOWORD(lParam); 
			yPos = HIWORD(lParam);
			pt.x = xPos; pt.y = yPos;

			// exit 滚瓢阑 穿福搁 WM_DESTROY 皋矫瘤甫 朝妨辑 辆丰矫挪促.
			draw_rect.left    = 30+bm_bkg.bmWidth;
			draw_rect.top     = 25;
			draw_rect.right   = draw_rect.left + bm_exit_btn.bmWidth;
			draw_rect.bottom  = draw_rect.top  + bm_exit_btn.bmHeight;
			if (PtInRect(&draw_rect, pt) == TRUE) {
				SendMessage(hWnd, WM_DESTROY, 0, 0);
				break;
			}

			demofile_idx = GetDemofileIndex(xPos, yPos);
			mfc_demo_thread_control(hWnd, demofile_idx);
			break;

		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);

			// Background bitmap image
			BitBlt(hdc, 20, 20, bm_bkg.bmWidth, bm_bkg.bmHeight, hdc_mem_bkg, 0, 0, SRCCOPY);
			BitBlt(hdc, 30+bm_bkg.bmWidth, 25, bm_exit_btn.bmWidth, bm_exit_btn.bmHeight, hdc_mem_exit_btn, 0, 0, SRCCOPY);

			// Rectangle for the "DrawText" function below.
			draw_rect.left    = DRAW_TEXT_X_POS;
			draw_rect.top     = DRAW_TEXT_Y_POS - 60;
			draw_rect.right   = draw_rect.left + DRAW_TEXT_X_LENG;
			draw_rect.bottom  = draw_rect.top  + DRAW_TEXT_Y_LENG;


			wsprintf(msg_filename_to_play, L"Press the file name to play.\n(In %s folder)", MEDIA_FILES_FOLDER);
			FillRect(hdc, &draw_rect, (HBRUSH) GetStockObject(WHITE_BRUSH));
			DrawText(hdc, msg_filename_to_play, -1, &draw_rect, DT_CENTER);

			// Move the rectangle for the media filenames list
			draw_rect.left    = DRAW_TEXT_X_POS;
			draw_rect.top     = DRAW_TEXT_Y_POS;
			draw_rect.right   = draw_rect.left + DRAW_TEXT_X_LENG;
			draw_rect.bottom  = draw_rect.top  + DRAW_TEXT_Y_LENG;
			for (i=0; i<num_vectors; i++) {
				if (GetFileAttributes(*(array_pszFileNames[i])) != 0xFFFFFFFF)
					DrawText(hdc, *(array_pszFileNames[i]), -1, &draw_rect, DT_LEFT);
				draw_rect.top     += DRAW_TEXT_Y_LENG;
				draw_rect.bottom  += DRAW_TEXT_Y_LENG;
			}

			EndPaint(hWnd, &ps);
			break;
	}

	return DefWindowProc(hWnd, message, wParam, lParam);
}

//-----------------------------------------------------------------------------
// Name: InitApp()
// Desc: Do work required for every instance of the application:
//          Create the window, initialize data
//-----------------------------------------------------------------------------
static HWND
InitApp(HINSTANCE hInstance, int nCmdShow)
{
	HWND                        hWnd;
	WNDCLASS                    wc;


	// Set up and register window class
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WindowProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON));
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = APPNAME;
	RegisterClass(&wc);

	// Create a window
	hWnd = CreateWindow(APPNAME,
	                    APPTITLE,
	                    WS_POPUP|WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME,
	                    0,
	                    0,
	                    GetSystemMetrics(SM_CXSCREEN),
	                    GetSystemMetrics(SM_CYSCREEN),
	                    NULL,
	                    NULL,
	                    hInstance,
	                    NULL);
	if (!hWnd)
		return NULL;
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	SetFocus(hWnd);

	return hWnd;
}


//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Initialization, message loop
//-----------------------------------------------------------------------------
int WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPWSTR lpCmdLine,
            int nCmdShow)
{
	HWND     hWnd;
	MSG      msg;


	// Load the bitmap image which will be on the main window.
	hBmpBkg = (HBITMAP) LoadImage(hInstance,
	                              MAKEINTRESOURCE(IDB_BMP_SAMSUNG_DEMO),
	                              IMAGE_BITMAP,
	                              0, 0,
	                              0);
/*
	hBmpExitButton  = (HBITMAP) LoadImage(hInstance,
	                              MAKEINTRESOURCE(IDB_BMP_EXIT_BUTTON),
	                              IMAGE_BITMAP,
	                              0, 0,
	                              0);
*/
	hBmpExitButton = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BMP_EXIT_BUTTON));


	hWnd = InitApp(hInstance, nCmdShow);
	if (hWnd == NULL)
		return FALSE;

	while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -