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

📄 cellh264encode.c

📁 DM642平台上的H.264源码(可实时运行)
💻 C
字号:
/*
 *  Copyright 2002 by Texas Instruments Incorporated.
 *  All rights reserved. Property of Texas Instruments Incorporated.
 *  Restricted rights to use, duplicate or disclose this code are
 *  granted through contract.
 *  
 */
/*
 *  ======== celldiff.c ========
 */                                          
    
                                          
#include <std.h>
#include <stdio.h> 
#include <csl_dat.h>
#include <algrf.h>
#include <icell.h>
#include <utl.h>

#include "cellH264encode.h"
#include "appResources.h"
#include "appThreads.h"
#include "h264t.h"
#include "appmain.h"

//extern int Bit_Rate;
IENC_Params IENC_PARAMS = {
    sizeof(IENC_Params),
};

//uint8_t nframe = 0;

static void runH264encode( IENC_Handle handle, Short **inData,
                       int *outData);/*, DIFF_Env * env*/
              
// v-table for this cell
ICELL_Fxns H264ENC_CELLFXNS = { 
    NULL,                  // cellClose
    NULL,                  // cellControl
    H264ENC_cellExecute,      // cellExecute
    NULL                   // cellOpen
};

/*
 *  ======== DIFF_cellExecute ========
 *
 */
Bool H264ENC_cellExecute( ICELL_Handle handle, Arg arg )
{   
    IENC_Handle encHandle = (IENC_Handle)handle->algHandle;
   
    // activate instance object
    ALGRF_activate( handle->algHandle );
#if HAS_ENC
    runH264encode(encHandle,
              (Short **) handle->inputIcc[0]->buffer,
              (int *)handle->outputIcc[0]->buffer);          
#endif
    // deactivate instance object
    ALGRF_deactivate( handle->algHandle );

    return(TRUE);
}    

/*
 *  ======== runDIFF ========
 *  Run DIFF algorithm.
 */
//x static int g_ii=0;
extern H264_param_t param;
extern H264_t *t_enc, *t_dec;
//extern int32_t len;
//extern int size;

//extern int is_count;
uint32_t g_num=0;

static void runH264encode(IENC_Handle handle, Short **inData, 
                      int *out)//, DIFF_Env *env
{   
    
    int32_t len;
	uint8_t *pout = (uint8_t*)out   ;
 
    char testL[256];
	FILE* F_test; 
	
    LIGHT = 0x01;  //亮灯1
//   	printf("H264_encode3 begin\n");


    g_num++;
#if 0
   	if((g_num%53)==10)
 	{
 		printf("write src begin\n");
    	sprintf(testL,"src%04d.yuv",g_num/53);
    	F_test=fopen(testL,"wb");
    	fwrite(inData[0],352*288,1,F_test);
    	fwrite(inData[2],176*144,1,F_test);
    	fwrite(inData[1],176*144,1,F_test);
    	fclose(F_test);
 		printf("write src end\n");
  	}
  	if(g_num>2000)
  	{
  		g_num =0;
  		exit(0);
  	}
#endif
    len = H264_encode3(t_enc, (uint32_t *)inData[0], 
    					(uint32_t *)inData[1], (uint32_t *)inData[2], 
    					pout+8, 0);
	    					
	len = len+4;
//	len = len+8+16; //wq
    memcpy(pout,&len,4);
//    printf("enc num is %d\n",g_num); //wq
    memcpy(pout+4,&g_num,4);
//    memcpy(pout+len-16,fill_data,16);
//    memcpy(pout+len,&g_num,4); //wq
//    printf(" enc num=%d\n",g_num); 
	if(len>=DATALEN-500)
	{
		len = 0;
		t_enc->frame_no = 0;
	}
   	LIGHT = 0x02;  //亮灯2

	
} 

Void H264_init()
{    
//    int32_t size;

    init_param(&param);

#if HAS_ENC 
    t_enc = H264enc_open(&param);
#endif
#if HAS_DEC    
    t_dec = H264dec_open(&param);
#endif
    /* YV12p */
//	size = param.height * param.width + (param.height * param.width >> 1);
    	   	
}

init_param(H264_param_t* param)
{

    int32_t b;
    memset(param, 0, sizeof(*param));
	b=4;                            //version; recommend for fast speed parameter
	param->width 	        = PROCF_WIDTH;      // width
	param->height           = PROCF_HEIGHT;      // height
	param->search_x         = 16;       // search x
	param->search_y	        = 16;       // search y
//	total_no	            = 300;      // total frame number
	param->iframe	        = 1;      // i intervals
	param->idrframe         = 1;      // idr intervals
	param->b_num	        = 0;        // b frame number between 2 p-frame(0, 1, 2)
//  param->b_num            = 1;        // hq
	param->ref_num	        = 1;        // Number of previous frames used for inter motion search(1 - 4)
//  param->ref_num	        = 3;        // hq
	param->enable_rc        = 0;        // enable rate control
	param->bitrate	        = 4000000;   //bps
	param->framerate        = 25;       //framerate(rc only)
	param->qp               = 20;      // init i,p qp, if NOT used fixed qp mode it is just the first i&p qp, 
                                        // 0 means auto select the first i&p qp(do not suggest)
	param->min_qp           = 1;        //min qp
	param->max_qp           = 51;       //max qp
#ifndef CHIP_DM642
	param->enable_stat      = 3;        //enable psnr
#else
	param->enable_stat      = 0;        //enable psnr
#endif

	param->disable_filter   = 0;        //disable_deblock_filter
	param->aspect_ratio     = 2;        //aspect_ratio, 2 means 720 * 576 4:3
	param->video_format     = 1;        //video_format, 1 means pal
	param->luma_coeff_cost  = 4;        //luma_coeff_cost, default 4, min qp please decrease this value(< 0 disable)

	b=1;                                
    param->flags |= (USE_INTRA16x16) * (!!b);//USE_INTRA16x16
	b=1;                                
    param->flags |= (USE_INTRA4x4) * (!!b); //USE_INTRA4x4
  	b=1;                                
    param->flags |= (USE_INTRAININTER) * (!!b);	//USE_INTRAININTER
	b=1;                                
    param->flags |= (USE_HALFPEL) * (!!b);	//USE_HALFPEL
	b=1;                                
    param->flags |= (USE_QUARTPEL) * (!!b);	//USE_QUARTPEL
	b=0;                                
    param->flags |= (USE_SUBBLOCK) * (!!b);	//USE_SUBBLOCK
	b=0;                                
    param->flags |= (USE_FULLSEARCH) * (!!b);	//USE_FULLSEARCH
	b=1;                                
    param->flags |= (USE_DIAMONDSEACH) * (!!b);	//USE_DIAMONDSEACH
	b=1;  //xjs must be 1               
    param->flags |= (USE_FORCEBLOCKSIZE) * (!!b);//USE_FORCEBLOCKSIZE
	b=1;                                
    param->flags |= (USE_FASTINTERPOLATE) * (!!b);//USE_FASTINTERPOLATE
	b=1;
    param->flags |= (USE_SAD) * (!!b);                //USE_SAD
	b=0;
    param->flags |= (USE_EXTRASUBPELSEARCH) * (!!b); //USE_EXTRASUBPELSEARCH
	b=0;
    param->flags |= (USE_SCENEDETECT) * (!!b);       //USE_SCENEDETECT
	b=1;  //have some problem                  
    param->block_size |= (SEARCH_16x16P) * (!!b);    //SEARCH_16x16P
	b=1;
    param->block_size |= (SEARCH_16x8P) * (!!b);    //SEARCH_16x8P
	b=1;
    param->block_size |= (SEARCH_8x16P) * (!!b);    //SEARCH_8x16P
	b=0;
	//b=1;
    param->block_size |= (SEARCH_8x8P) * (!!b);      //SEARCH_8x8P
	b=0;
	//b=1;                                    //hq       
    param->block_size |= (SEARCH_8x4P) * (!!b);      //SEARCH_8x4P
	b=0;
	//b=1;                                    //hq
    param->block_size |= (SEARCH_4x8P) * (!!b);      //SEARCH_4x8P
	b=0;
	//b=1;                                    //hq
    param->block_size |= (SEARCH_4x4P) * (!!b);      //SEARCH_4x4P
    param->rec_name = 0;
//	param->direct_flag = 1;
	
}


⌨️ 快捷键说明

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