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

📄 mfc_decode.cpp

📁 SAMSUNG S3C6410 CPU BSP for winmobile6
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// TestCode.cpp : Defines the entry point for the console application.
//
#include <windows.h>
#include <stdio.h>


#include "SsbSipMpeg4Decode.h"
#include "SsbSipMpeg4Encode.h"

#include "SsbSipH264Decode.h"
#include "SsbSipH264Encode.h"

#include "SsbSipVC1Decode.h"

#include "SsbSipMfcDecode.h"

#include "FrameExtractor.h"
#include "MPEG4Frames.h"
#include "H263Frames.h"
#include "H264Frames.h"
#include "VC1Frames.h"


static unsigned char delimiter_mpeg4[3] = {0x00, 0x00, 0x01};
static unsigned char delimiter_h263[3]  = {0x00, 0x00, 0x80};
static unsigned char delimiter_h264[4]  = {0x00, 0x00, 0x00, 0x01};


#define INPUT_BUFFER_SIZE		(1024 * 256)
#define NUM_PIPS				2



#include "FileRead.h"
#ifndef DATAREAD_TYPE
#error "DATAREAD_TYPE is not defined."
#endif
#if (DATAREAD_TYPE == DATA_FILE)
	#define FRAMEX_IN_TYPE_SEL	(FRAMEX_IN_TYPE_FILE)
#else
	#define FRAMEX_IN_TYPE_SEL	(FRAMEX_IN_TYPE_MEM)
#endif


static char msg[256];
static void LogMsg()
{
	FILE *fp;

	fp = fopen("\\NandFlash\\logmsg.txt", "at");
	if (fp == NULL)
		return;
	fprintf(fp, msg);
	fclose(fp);
}


#include "mfc_decode.h"
#if (DECODED_OUTPUT == DECODED_OUT_DISP)
#include "mfc_render.h"

// PROPERTY WINDOW : Video image size, fps information window
#define PROPERTY_WINDOW		0

#define PROPERTY_WINDOW_WIDTH	200
#define PROPERTY_WINDOW_HEIGHT	40

static unsigned short g_property_window[PROPERTY_WINDOW_WIDTH * PROPERTY_WINDOW_HEIGHT];

#include "number_img.h"

extern "C" unsigned char character_img[];
extern "C" unsigned char size_img[];

#endif


/// MFC API related function pointers
typedef void *(*FP_SsbSipDecodeInit)(void);
typedef int   (*FP_SsbSipDecodeExe)(void *, long);
typedef int   (*FP_SsbSipDecodeDeInit)(void *);
typedef void *(*FP_SsbSipDecodeDecodeGetInBuf)(void *, long);
typedef void *(*FP_SsbSipDecodeDecodeGetOutBuf)(void *, long *);
typedef int   (*FP_SsbSipDecodeGetConfig)(void *, unsigned int, void *);
typedef int   (*FP_SsbSipDecodeSetConfig)(void *, unsigned int, void *);

/// Frame Extractor API related function pointers
typedef int  (*FP_NextFrame)(FRAMEX_CTX *, void *, unsigned char [], int, unsigned int *);

typedef struct
{
	FP_SsbSipDecodeInit              fp_SsbSipDecodeInit;
	FP_SsbSipDecodeExe               fp_SsbSipDecodeExe;
	FP_SsbSipDecodeDeInit            fp_SsbSipDecodeDeInit;
	FP_SsbSipDecodeDecodeGetInBuf    fp_SsbSipDecodeDecodeGetInBuf;
	FP_SsbSipDecodeDecodeGetOutBuf   fp_SsbSipDecodeDecodeGetOutBuf;
	FP_SsbSipDecodeGetConfig         fp_SsbSipDecodeGetConfig;
	FP_SsbSipDecodeSetConfig         fp_SsbSipDecodeSetConfig;

	FP_NextFrame                     fp_NextFrame;
} FP_LIST;


static FP_LIST	fp_list[4] =
{
	// fp_list[0] : MPEG4 decode API functions
	{
		SsbSipMPEG4DecodeInit,
		SsbSipMPEG4DecodeExe,
		SsbSipMPEG4DecodeDeInit,
		SsbSipMPEG4DecodeGetInBuf,
		SsbSipMPEG4DecodeGetOutBuf,
		SsbSipMPEG4DecodeGetConfig,
		SsbSipMPEG4DecodeSetConfig,

		NextFrameMpeg4
	},
	// fp_list[1] : H.263 decode API functions
	{
		SsbSipMPEG4DecodeInit,
		SsbSipMPEG4DecodeExe,
		SsbSipMPEG4DecodeDeInit,
		SsbSipMPEG4DecodeGetInBuf,
		SsbSipMPEG4DecodeGetOutBuf,
		SsbSipMPEG4DecodeGetConfig,
		SsbSipMPEG4DecodeSetConfig,

		NULL
	},
	// fp_list[2] : H.264 decode API functions
	{
		SsbSipH264DecodeInit,
		SsbSipH264DecodeExe,
		SsbSipH264DecodeDeInit,
		SsbSipH264DecodeGetInBuf,
		SsbSipH264DecodeGetOutBuf,
		SsbSipH264DecodeGetConfig,
		SsbSipH264DecodeSetConfig,

		NextFrameH264
	},
	// fp_list[3] : VC-1 decode
	{
		SsbSipVC1DecodeInit,
		SsbSipVC1DecodeExe,
		SsbSipVC1DecodeDeInit,
		SsbSipVC1DecodeGetInBuf,
		SsbSipVC1DecodeGetOutBuf,
		SsbSipVC1DecodeGetConfig,
		SsbSipVC1DecodeSetConfig,

		NULL
	}
};


int mfcdec_demo(HWND hWnd, LPCTSTR pszFileName[], CODEC_MODE codec_mode[], int num_pips, int *force_exit)
{
	int      i=0;	// Loop counter
	int      pip;	// Loop counter

	void    *handle[NUM_PIPS];

	void    *fp[NUM_PIPS];
	int      nLoop;

	DWORD    t1, t2, t_diff;	// tick for performance measurement
	int      perf_disp_period = 100;
	wchar_t  str_performance[8];
	float    fps;

	unsigned char     *pStrmBuf[NUM_PIPS];
	int                nFrameLeng[NUM_PIPS];
	unsigned char     *pYUVBuf[NUM_PIPS];
	int                nYUVLeng[NUM_PIPS];

	FRAMEX_CTX        *pFrameExCtx[NUM_PIPS];

	unsigned char     *delimiter;
	int                delimiter_leng;

	FP_LIST           *pFP_LIST[NUM_PIPS];		// MFC API狼 function pointers
	SSBSIP_H264_STREAM_INFO stream_info[NUM_PIPS];



#if (DECODED_OUTPUT == DECODED_OUT_FILE)
	FILE    *fp_out;
#elif (DECODED_OUTPUT == DECODED_OUT_DISP)
	void    *hRender_property=NULL;
	void    *hRender[NUM_PIPS];
	int      render_wd=0, render_hi=0;

	SIZE_IMG_IDX   size_img_idx;
#endif


	if (num_pips > NUM_PIPS) {
		RETAILMSG(1,(L"num_pips must be less than or equal to %d.\n", NUM_PIPS));
		return -1;
	}


#if (DECODED_OUTPUT == DECODED_OUT_FILE)
	/////////////////////////
	// Opening Output File //
	/////////////////////////
	fp_out = fopen(OUT_FILE_NAME, "wb");
	if (fp_out == NULL) {
		RETAILMSG(1,(L"Cannot open the output file.\n"));
		return 0;
	}
#endif

RETAILMSG(1,(L"\t ------------- \n"));

	////////////////////////
	// Opening Input File //
	////////////////////////
	for (pip=0; pip < num_pips; pip++) {
		fp[pip] = SSB_FILE_OPEN(pszFileName[pip]);
		if (fp[pip] == NULL) {
			RETAILMSG(1,(L"File not found\n"));
			return 0;
		}

		switch (codec_mode[pip]) {
		case CODEC_MPEG4:
			delimiter      = delimiter_mpeg4;
			delimiter_leng = sizeof(delimiter_mpeg4);

			pFP_LIST[pip] = &(fp_list[0]);
			break;

		case CODEC_H263:
			delimiter      = NULL;
			delimiter_leng = 0;

			pFP_LIST[pip] = &(fp_list[1]);
			break;

		case CODEC_H264:
			delimiter      = delimiter_h264;
			delimiter_leng = sizeof(delimiter_h264);

			pFP_LIST[pip] = &(fp_list[2]);
			break;

		case CODEC_VC1:
			delimiter      = NULL;
			delimiter_leng = 0;

			pFP_LIST[pip] = &(fp_list[3]);
			break;

		default:
			RETAILMSG(1,(L"[mfcdec_init] Undefined codec mode"));
			return -1;
		}


		///////////////////////////////////
		// FrameExtractor Initialization //
		///////////////////////////////////
		pFrameExCtx[pip] = FrameExtractorInit(FRAMEX_IN_TYPE_SEL, delimiter, delimiter_leng, 1);
		FrameExtractorFirst(pFrameExCtx[pip], fp[pip]);

		//////////////////////////////////////

⌨️ 快捷键说明

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