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

📄 ssbsipmpeg4encode.c

📁 6410BSP3
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <windows.h>

#include "MfcDriver.h"
#include "MfcDrvParams.h"

#include "SsbSipMpeg4Encode.h"
#include "SsbSipLogMsg.h"


#define _MFCLIB_MPEG4_ENC_MAGIC_NUMBER        0x92242001

typedef struct
{
    DWORD   magic;
    HANDLE  hOpen;

    unsigned int  width, height;
    unsigned int  framerate, bitrate;
    unsigned int  gop_num;

    unsigned int intraqp;
    unsigned int qpmax;
    float gamma;

    int     enc_strm_size;
    int        strmType;

    int     fInit;
} _MFCLIB_MPEG4_ENC;




void *SsbSipMPEG4EncodeInit(int          strmType,
                            unsigned int uiWidth,     unsigned int uiHeight,
                            unsigned int uiFramerate, unsigned int uiBitrate_kbps,
                            unsigned int uiGOPNum, unsigned int uiIntraQP, unsigned int uiQPMax, float uiGamma)
{
    _MFCLIB_MPEG4_ENC  *pCTX;
    HANDLE              hOpen;

    int                    cmd;


    switch(strmType) {
    case SSBSIPMFCENC_MPEG4:
        cmd = IOCTL_MFC_MPEG4_ENC_INIT;
        break;
    case SSBSIPMFCENC_H263:
        cmd = IOCTL_MFC_H263_ENC_INIT;
        break;
    default:
        LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeInit", "stream type is not defined\n");
        return NULL;
    }

    //////////////////////////////
    /////     CreateFile     /////
    //////////////////////////////
    hOpen = CreateFile(L"MFC1:",
                       GENERIC_READ|GENERIC_WRITE,
                       0,
                       NULL,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL,
                       NULL);
    if (hOpen == INVALID_HANDLE_VALUE) {
        LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeInit", "MFC Open failure.\n");
        return NULL;
    }

    pCTX = (_MFCLIB_MPEG4_ENC *) malloc(sizeof(_MFCLIB_MPEG4_ENC));
    if (pCTX == NULL) {
        LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeInit", "malloc failed.\n");
        CloseHandle(hOpen);
        return NULL;
    }
    memset(pCTX, 0, sizeof(_MFCLIB_MPEG4_ENC));

    pCTX->magic    = _MFCLIB_MPEG4_ENC_MAGIC_NUMBER;
    pCTX->hOpen    = hOpen;
    pCTX->fInit    = 0;
    pCTX->strmType = strmType;

    pCTX->width     = uiWidth;
    pCTX->height    = uiHeight;
    pCTX->framerate = uiFramerate;
    pCTX->bitrate   = uiBitrate_kbps;
    pCTX->gop_num   = uiGOPNum;

    pCTX->intraqp = uiIntraQP;
    pCTX->qpmax = uiQPMax;
    pCTX->gamma = uiGamma;

    pCTX->enc_strm_size = 0;


    return (void *) pCTX;
}


int SsbSipMPEG4EncodeExe(void *openHandle)
{
    _MFCLIB_MPEG4_ENC  *pCTX;


    BOOL                r;
    int                    cmd;
    MFC_ARGS            mfc_args;


    ////////////////////////////////
    //  Input Parameter Checking  //
    ////////////////////////////////
    if (openHandle == NULL) {
        LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeExe", "openHandle is NULL\n");
        return SSBSIP_MPEG4_ENC_RET_ERR_INVALID_HANDLE;
    }

    pCTX  = (_MFCLIB_MPEG4_ENC *) openHandle;

    switch(pCTX->strmType) {
    case SSBSIPMFCENC_MPEG4:
        cmd = IOCTL_MFC_MPEG4_ENC_EXE;
        break;
    case SSBSIPMFCENC_H263:
        cmd = IOCTL_MFC_H263_ENC_EXE;
        break;
    default:
        LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeExe", "stream type is not defined\n");
        return -1;
    }


    if (!pCTX->fInit) {
        ////////////////////////////////////////////////
        /////          (DeviceIoControl)           /////
        /////       IOCTL_MFC_H264_DEC_INIT        /////
        ////////////////////////////////////////////////
        mfc_args.enc_init.in_width        = pCTX->width;
        mfc_args.enc_init.in_height        = pCTX->height;
        mfc_args.enc_init.in_bitrate    = pCTX->bitrate;
        mfc_args.enc_init.in_gopNum        = pCTX->gop_num;
        mfc_args.enc_init.in_frameRateRes    = pCTX->framerate;
        mfc_args.enc_init.in_frameRateDiv    = 0;

        mfc_args.enc_init.in_intraqp = pCTX->intraqp;
        mfc_args.enc_init.in_qpmax = pCTX->qpmax;
        mfc_args.enc_init.in_gamma = pCTX->gamma;

        switch(pCTX->strmType) {
        case SSBSIPMFCENC_MPEG4:
            cmd = IOCTL_MFC_MPEG4_ENC_INIT;
            break;
        case SSBSIPMFCENC_H263:
            cmd = IOCTL_MFC_H263_ENC_INIT;
            break;
        }

        r = DeviceIoControl(pCTX->hOpen, cmd,
                            &mfc_args, sizeof(MFC_ENC_INIT_ARG),
                            NULL, 0,
                            NULL,
                            NULL);
        if ((r < 0) || (mfc_args.enc_init.ret_code < 0)) {
            LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeExe", "IOCTL_MFC_MPEG4_ENC_INIT failed.\n");
            return SSBSIP_MPEG4_ENC_RET_ERR_ENCODE_FAIL;
        }


        pCTX->fInit = 1;

        return SSBSIP_MPEG4_ENC_RET_OK;
    }


    /////////////////////////////////////////////////
    /////           (DeviceIoControl)           /////
    /////       IOCTL_MFC_MPEG4_DEC_EXE         /////
    /////////////////////////////////////////////////
    r = DeviceIoControl(pCTX->hOpen, IOCTL_MFC_MPEG4_ENC_EXE,
                        &mfc_args, sizeof(MFC_ENC_EXE_ARG),
                        NULL, 0,
                        NULL,
                        NULL);
    if ((r < 0) || (mfc_args.enc_exe.ret_code < 0)) {
        return SSBSIP_MPEG4_ENC_RET_ERR_ENCODE_FAIL;
    }

    // Encoded stream size is saved. (This value is returned in SsbSipH264EncodeGetOutBuf)
    pCTX->enc_strm_size = mfc_args.enc_exe.out_encoded_size;

    return SSBSIP_MPEG4_ENC_RET_OK;
}


int SsbSipMPEG4EncodeDeInit(void *openHandle)
{
    _MFCLIB_MPEG4_ENC  *pCTX;


    ////////////////////////////////
    //  Input Parameter Checking  //
    ////////////////////////////////
    if (openHandle == NULL) {
        LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeDeInit", "openHandle is NULL\n");
        return SSBSIP_MPEG4_ENC_RET_ERR_INVALID_HANDLE;
    }


    pCTX  = (_MFCLIB_MPEG4_ENC *) openHandle;


    CloseHandle(pCTX->hOpen);
    free(pCTX);

    return SSBSIP_MPEG4_ENC_RET_OK;
}


void *SsbSipMPEG4EncodeGetInBuf(void *openHandle, long size)
{
    _MFCLIB_MPEG4_ENC  *pCTX;

    BOOL                r;
    MFC_ARGS            mfc_args;


    ////////////////////////////////
    //  Input Parameter Checking  //
    ////////////////////////////////
    if (openHandle == NULL) {
        LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeGetInBuf", "openHandle is NULL\n");
        return NULL;
    }
    if ((size < 0) || (size > 0x100000)) {
        LOG_MSG(LOG_ERROR, "SsbSipMPEG4EncodeGetInBuf", "size is invalid. (size=%d)\n", size);
        return NULL;
    }


    pCTX  = (_MFCLIB_MPEG4_ENC *) openHandle;


⌨️ 快捷键说明

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