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

📄 mfc_decode.cpp

📁 6410BSP3
💻 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 + -