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

📄 mp4_enc.c

📁 基于SAA7113的MPEG-4程序
💻 C
字号:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>

#include "senddata.h"
#include "basetype.h"
#include "lib/libmp4enc.h"
#include "yuv2yuv.h"

#define IMG_X_SIZE		352
#define IMG_Y_SIZE		288
#define RAW_IMG_SIZE            IMG_X_SIZE*IMG_Y_SIZE*3/2   /* YUV4:2:0 */

#define STREAM_BUF_SIZE         100*1024   /* I think it's large enough */

/* Global variables */
unsigned char rawdata[RAW_IMG_SIZE];
unsigned char mp4data[RAW_IMG_SIZE];

int fd_csi2c;
extern int server_sockfd;
float enctime,dectime;
float frame_buf[10] = {0};
int   bitrate_buf[10] = {0};
float frame = 0;
int   bitrate = 0;

void *pEncInst = NULL;
mp4_encoder_para enc_para;

static double msecond()
{

	struct timeval tv;

	gettimeofday(&tv, 0);
	return (tv.tv_sec * 1.0e3 + tv.tv_usec * 1.0e-3);

}

/************************************************************************/
int main(int argc, char **argv)
{
	int save_file;
	FILE *fd_mp4 = NULL;
	char *filename;
	unsigned long coded_bytes;
	int stop = 0,ret,i;
	
	if(argc == 1)
		save_file = 0;
	else
		save_file = 1;

	if(save_file)
	{
		filename = argv[1];
		if ((fd_mp4 = fopen(filename, "wb")) < 0)
		{
			printf("File open error !\n");
			exit(-1);
		}
	}
	else
		/* Initialize socket */
		initsock("192.168.1.126",PORT_SOCKET_CLIENT,PORT_SOCKET_SERVER);
	
	/* Open csi device */
	if ((fd_csi2c = open("/dev/saa7113_prp", O_RDWR)) < 0)
	{
		printf("Device csi2c open error !\n");
		exit(-1);
	}
	
	//fd_mp4 = fopen("test1", "wb");
	
	/* initialize encoder */
	pEncInst = wkads_mp4_encoder_init(MP4API_ENC_SCHEME_CIF_15FPS_384KB_PLAIN);
	if(pEncInst == 0)
	{	
		printf("Encoder can't be initialized!\n");
		return -1;
	}
		
	/* configure encoder */
	enc_para.i_frame_interval = 100;
	enc_para.bitrate = 384;	enc_para.rc = 1;	enc_para.fps = 15;	enc_para.frm_skip = 1;	enc_para.rvlc = 0;	enc_para.dp = 0; 	enc_para.qp = 0;	enc_para.vp_size = 0;	enc_para.cir = 20;	enc_para.mode = 0;	enc_para.prp = 1;	enc_para.mv4 = 1;	enc_para.ac_pre = 1;	

	ret = wkads_mp4_encoder_config(pEncInst,&enc_para);
		
	/* Start mp4 encoder */
	coded_bytes = wkads_mp4_encode_start_stream(pEncInst,mp4data);
			
	if(save_file){
		//fwrite(&coded_bytes,1,4,fd_mp4);
		fwrite(mp4data,1,coded_bytes,fd_mp4);
	}
	else
		senddata(mp4data,coded_bytes);

	/* The real action starts */
	while(1)
	{
		/* Read raw YUV4:2:0 data from csi device */
	    	if ((ret = read(fd_csi2c, rawdata, RAW_IMG_SIZE)) < 0)
	    	{
		    	//printf("No available image!\n");
			continue;
	    	}
		
		//fwrite(rawdata,1,RAW_IMG_SIZE,fd_mp4);
		//return 0;
		
		/* YUV422 -> YUV420 */
		//yuv4222yuv420(IMG_X_SIZE,IMG_Y_SIZE/2,rawdata,mp4data);
		
		/* Encoded one frame  */
		coded_bytes = wkads_mp4_encode(pEncInst,rawdata,mp4data);

		
		/* Write out the encoded stream */
		if(save_file){
		//	fwrite(&coded_bytes,1,4,fd_mp4);
			fwrite(mp4data,1,coded_bytes,fd_mp4);
		}
		else
			senddata(mp4data,coded_bytes);

	    
		/* Encoder info statistic  */
	   // 	for(i=9;i>0;i--){
	//	    bitrate_buf[i] = bitrate_buf[i-1];
	  //  	}
	    //	bitrate_buf[0] = coded_bytes;
	    //	bitrate = 0;
	    //	for(i=0;i<10;i++){
	//	    bitrate += bitrate_buf[i];
	  //  	}
	    //	bitrate *= (15*8);
	    //	bitrate /= 10000;
	    //
	    //	printf("\nbitrate = %dkb/s\n",bitrate);
	    	printf("One frame is encoded\n");
	    	
	        /* Sorry, it take too much memory space. So kill it  */	
		if(save_file){
		    stop++;
		    if(stop == 200)
			break;
		}
	}

	/* First flush the stream then destroy it */
	coded_bytes = wkads_mp4_encoder_destroy(pEncInst,mp4data);
	
	if(save_file){
		//fwrite(&coded_bytes,1,4,fd_mp4);
		fwrite(mp4data,1,coded_bytes,fd_mp4);
	}
	else
		senddata(mp4data,coded_bytes);


	return 0;
}


			

⌨️ 快捷键说明

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