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

📄 ssbsiphybriddivxmain.cpp

📁 6410BSP1
💻 CPP
字号:
/*********************************************************************************
*                                                                               *
* Copyright (c) 2008 Samsung System LSI                                            *
* All rights reserved.                                                          *
*                                                                               *
* This software is test sample code for Hybrid Divx Decoder                        *
*                                                                                *
* Author : Jiyoung Shin                                                            *
* Last Changed : 2008.06.10                                                     *
*********************************************************************************/

#include <windows.h>
// Platform Dependent
#include <SVEDriverAPI.h>
#include "SsbSipVideoDivXdecore.h"
#include "SsbSipVideoDivXlibAVI.h"
#include "SsbSipVideoDivXmp4_vars.h"
#include "SsbSipRender.h"
#include "SsbSipParser.h"
#include "SsbSipMpeg4Decode.h"
#include "SsbSipMfcDecode.h"
#include "SsbSipDecoder.h"
#include "SsbSipHybridDivxInterface.h"
#include "SsbSipHybridDivxMain.h"


#define MAX_RESOLUTION_WIDTH    720
#define MAX_RESOLUTION_HEIGHT    576
#define MAX_STRM_SIZE             512000   // This is maximum value by MFC H/W. don't change to bigger value
#define TEST_LOOP_COUNT            1
#define MAX_FILENAME_LEN        256
#define CONFIG_FILE_NAME        "\\DivxFileList.txt"
//#define FILE_OUT

void SsbSipHybridDivxDecode(char *filename);
void SsbSipHybridDivxResourceRelease(void);

void SsbSipHybridDivxMain(void)
{

    int loop_cnt = TEST_LOOP_COUNT;
    char filename[MAX_FILENAME_LEN];
    FILE *fp = NULL;


    printf("\n#### Divx Test Start \n\n");
    
    while(loop_cnt--)
    {
        printf("-----------------------------------------------------------------\n");
        printf("\tLoop Count = %3d\n", TEST_LOOP_COUNT - loop_cnt);
        printf("-----------------------------------------------------------------\n");
        fp = fopen(CONFIG_FILE_NAME, "rb");
        if(!fp){
            printf("Can not open Divx File List (%s)\n", CONFIG_FILE_NAME);
            return;        
        }        
        
        do{
            memset(&filename, 0x00, MAX_FILENAME_LEN);
            fgets(filename, MAX_FILENAME_LEN - 1, fp);
            if('\0' != filename[0]){
                
                int len = strlen(filename);
                
                while(!isprint(filename[len-1]))
                {
                    len--;
                }
                filename[len] = '\0';
                SsbSipHybridDivxDecode(filename);
            }
        }while(!feof(fp));

        if(fp){
            fclose(fp);
            fp = NULL;
        }
    }
    printf("\n\n#### Divx Test Ends\n");    
    printf("\nEXITING......\n");
    exit(-1);
}



void SsbSipHybridDivxDecode(char *filename)
{

    DivxDecInParam        DivxInParam;
    DivxDecOutParam        DivxOutParam;
    DivxParserInParam    ParserInParam;
    DivxParserOutParam    ParserOutParam;
    unsigned int            frame_num;
    CHUNK                 *StreamChunk;
    int                     clock_value_BLOCK ;
    long int                 total_cycles_BLOCK =0;
    int                    err;
    unsigned int            i;
    unsigned int            buf_width, buf_height;
#ifdef PERF_RENDER
    int cyclecountstart,cyclecountend,cyclecount = 0;
#endif    
#ifdef FILE_OUT
    char                    *YUVBuf;
    FILE                    *fp;
    char                    outFilename[MAX_FILENAME_LEN];
    char *prevVirbuf = NULL;
#endif



    memset(&DivxInParam, 0x00, sizeof(DivxInParam));
    memset(&DivxOutParam, 0x00, sizeof(DivxOutParam));
    memset(&ParserInParam, 0x00, sizeof(ParserInParam));
    memset(&ParserOutParam, 0x00, sizeof(ParserOutParam));


    //////////////////////////////////////////////////////
    //// 1. Initialize Paser                                    //
    //////////////////////////////////////////////////////
    memcpy(ParserInParam.filename , filename, strlen(filename));
    ParserInParam.stream_size =MAX_STRM_SIZE;
    if(!SsbSipParserInit(&ParserInParam, &ParserOutParam)){
        SsbSipParserThreadClose();
        goto PRINT_PERF;
    }


    printf("filename : %s\n", filename);
    printf("Video dimension : %d x %d\n", ParserOutParam.width, ParserOutParam.height);
    printf("Video frame rate : %.3f fps\n", (ParserOutParam.dwScale ? (float)ParserOutParam.dwRate / ParserOutParam.dwScale : 0));

    if((ParserOutParam.width > MAX_RESOLUTION_WIDTH) || ( ParserOutParam.height > MAX_RESOLUTION_HEIGHT)){
        printf("Width and Height is too big....Maximum size is 720*480\n\n");
        SsbSipParserThreadClose();
        goto PRINT_PERF;
    }

    
#ifdef FILE_OUT
    sprintf(outFilename, "%s.yuv", filename);
    printf("output file name : %s\n", outFilename);
    fp = fopen(outFilename, "wb");
    if(fp == NULL){
        printf("fopen error : %s\n", outFilename);
        return;
    }
#endif

    //////////////////////////////////////////////////////
    //// 2. Initialize Divx Decoder                        //
    //////////////////////////////////////////////////////
    DivxInParam.width = ParserOutParam.width;
    DivxInParam.height = ParserOutParam.height;
    DivxInParam.codec_version = ParserOutParam.codec_version;
    DivxInParam.size = MAX_STRM_SIZE;
    DivxInParam.file_format = ParserOutParam.file_format;


    err = SsbSipHybridDivxDecInit(&DivxInParam, &DivxOutParam);
    if (err != DEC_OK)
    {
        printf("SsbSipHybridDivxDecInit failure: %d\n", err);
        SsbSipHybridDivxDecDeInit();
        goto PRINT_PERF;
    }

    buf_width = DivxOutParam.buf_width;
    buf_height = DivxOutParam.buf_height;
    printf("\nbuf_width:%d buf_height:%d\n",   buf_width, buf_height);
    


    //////////////////////////////////////////////////////
    //// 3. Create Parser & Display Thread                //
    //////////////////////////////////////////////////////
    SsbSipDisplayEventCreate();
    if(!SsbSipDisplayThreadCreate()){
        SsbSipHybridDivxDecDeInit();
        SsbSipDisplayThreadClose();
        goto PRINT_PERF;
    }
    if(!SsbSipParserThreadCreate()){
        SsbSipHybridDivxResourceRelease();
        goto PRINT_PERF;
    }

#ifdef PERF_RENDER
    cyclecountstart = GetTickCount();
#endif

    //////////////////////////////////////////////////////
    //// 4. Divx Decoding                                //
    //////////////////////////////////////////////////////
    frame_num = 0;
    while (1)
    {
        //get a frame from Parser
        StreamChunk = SsbSipParserFrameGet(frame_num);
        
        if(StreamChunk == NULL){
        //    printf("End of Stream\n");
            break;
        }

        frame_num ++;
        if(StreamChunk->length <= 0 ){
            printf("stream size is not greater than 0...skip stream\n");
            continue;
        }
        
        DivxInParam.strmbuf = (char *)StreamChunk->buffer;
        DivxInParam.size = StreamChunk->length;
        DivxInParam.frame_num = frame_num;

        //Sleep(15); // for normal play speed

        //start  Divx decoding
        err = SsbSipHybridDivxDecExe(&DivxInParam, &DivxOutParam);

        //search for first I frame
        if(err == FRSTKEYFRMCRPTED){
            continue;
        }

        if(err != DEC_OK){
            printf("err = %d\n", err);
            break;
        }

        //display YUV
        if (DivxOutParam.phyYUVBuff != NULL){        
            SsbSipDisplayParamSet(DivxOutParam.phyYUVBuff, DivxInParam.width, DivxInParam.height, buf_width, buf_height, DIVX_BUFF_PAD_SIZE, DIVX_BUFF_PAD_SIZE);
            SsbSipDisplayEventSet();
        }

#ifdef FILE_OUT
    
        if (DivxOutParam.virYUVBuff != NULL)
        {
            YUVBuf = DivxOutParam.virYUVBuff + buf_width*DIVX_BUFF_PAD_SIZE + DIVX_BUFF_PAD_SIZE;
            for(i = 0; i < DivxInParam.height; i++){
                fwrite(YUVBuf, 1, DivxInParam.width, fp);
                YUVBuf += buf_width;
            }

            YUVBuf = DivxOutParam.virYUVBuff + buf_width*buf_height + buf_width/2*DIVX_BUFF_PAD_SIZE/2 + DIVX_BUFF_PAD_SIZE/2;
            for(i = 0; i < DivxInParam.height/2; i++){
                fwrite(YUVBuf, 1, DivxInParam.width/2, fp);
                YUVBuf += buf_width/2;
            }

            YUVBuf = DivxOutParam.virYUVBuff + buf_width*buf_height +buf_width*buf_height/4+ buf_width/2*DIVX_BUFF_PAD_SIZE/2 + DIVX_BUFF_PAD_SIZE/2;
            for(i = 0; i < DivxInParam.height/2; i++){
                fwrite(YUVBuf, 1, DivxInParam.width/2, fp);
                YUVBuf += buf_width/2;
            }
        }
#endif    
    }

    // for the last frame display if stream include unpacked PB frame
    DivxInParam.strmbuf = NULL;
    DivxInParam.size = 0;

    err = SsbSipHybridDivxDecExe(&DivxInParam, &DivxOutParam);
    if(err != DEC_OK)
        printf("err = %d\n", err);
    
    if (DivxOutParam.phyYUVBuff != NULL){    
        SsbSipDisplayParamSet(DivxOutParam.phyYUVBuff, DivxInParam.width, DivxInParam.height, buf_width, buf_height, DIVX_BUFF_PAD_SIZE, DIVX_BUFF_PAD_SIZE);
        SsbSipDisplayEventSet();
    }
    
#ifdef FILE_OUT
    
        if (DivxOutParam.virYUVBuff != NULL)
        {
            YUVBuf = DivxOutParam.virYUVBuff + buf_width*DIVX_BUFF_PAD_SIZE + DIVX_BUFF_PAD_SIZE;
            for(i = 0; i < DivxInParam.height; i++){
                fwrite(YUVBuf, 1, DivxInParam.width, fp);
                YUVBuf += buf_width;
            }

            YUVBuf = DivxOutParam.virYUVBuff + buf_width*buf_height + buf_width/2*DIVX_BUFF_PAD_SIZE/2 + DIVX_BUFF_PAD_SIZE/2;
            for(i = 0; i < DivxInParam.height/2; i++){
                fwrite(YUVBuf, 1, DivxInParam.width/2, fp);
                YUVBuf += buf_width/2;
            }

            YUVBuf = DivxOutParam.virYUVBuff + buf_width*buf_height +buf_width*buf_height/4+ buf_width/2*DIVX_BUFF_PAD_SIZE/2 + DIVX_BUFF_PAD_SIZE/2;
            for(i = 0; i < DivxInParam.height/2; i++){
                fwrite(YUVBuf, 1, DivxInParam.width/2, fp);
                YUVBuf += buf_width/2;
            }
        }
#endif    

    //////////////////////////////////////////////////////
    //// 5. Release Divx Deocoder Resources                //
    //////////////////////////////////////////////////////
#ifdef FILE_OUT
    fclose(fp);
#endif
    SsbSipHybridDivxResourceRelease();

        
PRINT_PERF:
#ifdef PERF_RENDER
    cyclecountend = GetTickCount();
    cyclecount += cyclecountend - cyclecountstart;

    if(frame_num && cyclecount){
        printf("\nTime Taken in Milliseconds=%d",cyclecount);
        printf("\nTotal No of frames=%d",frame_num);
        printf("\n----------------------------------------------------------------------\nrendering FPS : %f(%d msec)\n\n", frame_num*1000.0/cyclecount, cyclecount/frame_num);
        printf("------------------------------------------------------------------------\n");
    }
#endif
    return;
}

void SsbSipHybridDivxResourceRelease(void)
{
    SsbSipHybridDivxDecDeInit();
    SsbSipDisplayThreadClose();
    SsbSipParserThreadClose();
}

⌨️ 快捷键说明

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