📄 cellh264encode.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(¶m);
#if HAS_ENC
t_enc = H264enc_open(¶m);
#endif
#if HAS_DEC
t_dec = H264dec_open(¶m);
#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 + -