示例#1
0
int main(int argc, char **argv)
{
	int Flag = TRUE;

	//long ftell_position;//, expected_slice_type;
	//int ret;
	NALU_t *nalu;
	
	h264_decoder* dec_params;
	char *ptr;
	
	ptr =  (  char*)malloc(10 * sizeof(char)); 

    if ((dec_params =  (  h264_decoder*)h264_malloc(1 * sizeof(h264_decoder)))==NULL) 
 //	if ((dec_params =  (  h264_decoder*)h264_malloc(1 * 100))==NULL) 
	{
		Flag=FALSE;
	}

  	if ((dec_params->input =  (InputParameters *)h264_malloc(1 * sizeof(InputParameters)))==NULL) 
	{
		printf("main: input");
		exit(0);
	}
	if ((dec_params->img   =  (ImageParameters *)h264_malloc(1 * sizeof(ImageParameters)))==NULL) 
	{
		printf("main: img");
		exit(0);
	}

	////////// ADDED INITIALIZATIONS //////
	dec_params->active_sps       = NULL;
	dec_params->active_pps       = NULL;
 	dec_params->Co_located       = NULL;
	dec_params->dec_picture     = NULL;
	dec_params->global_init_done = 0;
	dec_params->dpb.init_done	 = 0;
	dec_params->img->DeblockCall = 0;
//	dec_params->img->structure   = 0;
	dec_params->MapUnitToSliceGroupMap = NULL;
	dec_params->MbToSliceGroupMap      = NULL;
	dec_params->img->errorConcealmentFlag = 0;			// ERROR CONCEALMENT FLAG SET TO ZERO , NO ERROR CONCEALMENT
	dec_params->img->no_output_of_prior_pics_flag = -1;

	///////////////////////////////////////
	Initializations(dec_params);
	
	Configure ( argc, argv,dec_params );
	
		
	init_old_slice(dec_params);
	
	switch (dec_params->input->FileFormat)
	{
	case 0:
		OpenBitstreamFile (dec_params->input->infile,dec_params);
		break;
	case 1:
		OpenRTPFile (dec_params->input->infile,dec_params);
		break;
	default:
		printf ("Unsupported file format %d, exit\n", dec_params->input->FileFormat);
	}
	
	// Allocate Slice data struct
	malloc_slice(dec_params->input,dec_params->img,dec_params);
	
	init(dec_params->img,dec_params);
	
	dec_params->dec_picture = NULL;
	
	dec_params->dpb.init_done = 0;
	//dec_params->g_nFrame = 0;
	
//	init_out_buffer(dec_params);
	
  //dec_params->img->idr_psnr_number=dec_params->input->ref_offset;
  //dec_params->img->psnr_number=0;
	
	dec_params->img->number=0;
	dec_params->img->type = I_SLICE;
	dec_params->img->dec_ref_pic_marking_buffer = NULL;
	
	// B pictures
	dec_params->Bframe_ctr=0;

	// time for total decoding session
	dec_params->tot_time = 0;

	dec_params->nalu = AllocNALU(MAX_CODED_FRAME_SIZE,dec_params);
	nalu = dec_params->nalu;

	dec_params->dp   = AllocPartition(1, dec_params,1024);
	dec_params->sps  = AllocSPS();
	dec_params->pps  = AllocPPS();


	{
		while ( decode_one_frame( dec_params ) != EOS );
	}	
	//report( dec_params->input, dec_params->img, dec_params->snr,dec_params,);
	report( dec_params->input, dec_params->img,dec_params);
	free_slice( dec_params->input,dec_params->img);

	FreeNALU(dec_params->nalu);
	FreePartition (dec_params->dp, 1);
	FreeSPS (dec_params->sps);
    if (dec_params->PicParSet[dec_params->pps->pic_parameter_set_id].Valid == TRUE && dec_params->PicParSet[dec_params->pps->pic_parameter_set_id].slice_group_id != NULL)
	{
		h264_free (dec_params->PicParSet[dec_params->pps->pic_parameter_set_id].slice_group_id);
		dec_params->PicParSet[dec_params->pps->pic_parameter_set_id].slice_group_id = NULL;
	}
	
	// IF FMO PRESENT
	if (dec_params->active_pps->num_slice_groups_minus1) 
	{
	FmoFinit(dec_params);
	}	

	FreePPS (dec_params->pps);
	
	
	free_global_buffers_baseline(dec_params);
	
	flush_dpb(dec_params);
	
#ifdef PAIR_FIELDS_IN_OUTPUT
	flush_pending_output(dec_params->p_out);
#endif
	
	CloseBitstreamFile(dec_params);
	
	//close(dec_params->p_out);
	fclose (dec_params->f_out);
	//  fclose(p_out2);

#if TRACE
	fclose(p_trace);
#endif
	
	//ercClose(dec_params->erc_errorVar,dec_params);
	ercClose(dec_params);
	
	free_dpb(dec_params);
//	uninit_out_buffer(dec_params);
	
	free_colocated(dec_params);
	if(dec_params->dec_picture != NULL)
	{
		free (dec_params->dec_picture);
		dec_params->dec_picture = NULL;
	}
	if(dec_params->input != NULL)
	{
		h264_free (dec_params->input);
		dec_params->input = NULL;
	}
	if(dec_params->img != NULL)
	{
		h264_free (dec_params->img);
		dec_params->img = NULL;
	}
	if(dec_params != NULL)
	{
		h264_free (dec_params);
		dec_params = NULL;
	}
	return 0;
}
/*!
 ***********************************************************************
 * \brief
 *    main function for TML decoder
 ***********************************************************************
 */
int main(int argc, char **argv)
{
    // allocate memory for the structures
  if ((input =  (struct inp_par *)calloc(1, sizeof(struct inp_par)))==NULL) no_mem_exit("main: input");
  if ((snr =  (struct snr_par *)calloc(1, sizeof(struct snr_par)))==NULL) no_mem_exit("main: snr");
  if ((img =  (struct img_par *)calloc(1, sizeof(struct img_par)))==NULL) no_mem_exit("main: img");

  // Read Configuration File
  if (argc != 2)
  {
    snprintf(errortext, ET_SIZE, "Usage: %s <config.dat> \n\t<config.dat> defines decoder parameters",argv[0]);
    error(errortext, 300);
  }

  init_conf(input, argv[1]);

  init_old_slice();
  
  switch (input->FileFormat)
  {
  case 0:
    OpenBitstreamFile (input->infile);
    break;
  case 1:
    OpenRTPFile (input->infile);
    break;
  default:
    printf ("Unsupported file format %d, exit\n", input->FileFormat);
  }

  // Allocate Slice data struct
  malloc_slice(input,img);

  init(img);

  dec_picture = NULL;

  dpb.init_done = 0;
  g_nFrame = 0;

//  init_dpb(input);
  init_out_buffer();

  img->idr_psnr_number=input->ref_offset;
  img->psnr_number=0;

  img->number=0;
  img->type = I_SLICE;
  img->dec_ref_pic_marking_buffer = NULL;

  // B pictures
  Bframe_ctr=0;

  // time for total decoding session
  tot_time = 0;
  while (decode_one_frame(img, input, snr) != EOS)
    ;

  report(input, img, snr);
  free_slice(input,img);
  FmoFinit();
  free_global_buffers();

  flush_dpb();

#ifdef PAIR_FIELDS_IN_OUTPUT
  flush_pending_output(p_out);
#endif

  CloseBitstreamFile();

  fclose(p_out);
//  fclose(p_out2);
  if (p_ref)
    fclose(p_ref);
#if TRACE
  fclose(p_trace);
#endif

  ercClose(erc_errorVar);

  free_dpb();
  uninit_out_buffer();

  free_collocated(Co_located);
  free (input);
  free (snr);
  free (img);
  
  //while( !kbhit() ); 
  return 0;
}
示例#3
0
文件: rtp.c 项目: wangyuanmingda/BYSJ
int main(int argc, char* argv[])  
{  
        //FILE *stream;  
        //stream=fopen("Test.264", "wb");  
  
    OpenBitstreamFile("test2.h264");//打开264文件,并将文件指针赋给bits,在此修改文件名实现打开别的264文件。  
    NALU_t *n;  
    char* nalu_payload;    
    char sendbuf[1500];  
      
    unsigned short seq_num =0;  
        //printf("seq_num=%d\n",seq_num);//added by  
    int bytes=0;  
    //InitWinsock(); //初始化套接字库  
    SOCKET    socket1;  
    struct sockaddr_in server;  
        int len =sizeof(server);  
    float framerate=25;  
    unsigned int timestamp_increase=0,ts_current=0;  
    timestamp_increase=(unsigned int)(90000.0 / framerate); //+0.5);  
  
    server.sin_family=AF_INET;  
    server.sin_port=htons(DEST_PORT);            
    server.sin_addr.s_addr=inet_addr(DEST_IP);   
    socket1=socket(AF_INET,SOCK_DGRAM,0);  
    connect(socket1, (const struct sockaddr *)&server, len) ;//申请UDP套接字  
    n = AllocNALU(8000000);//为结构体nalu_t及其成员buf分配空间。返回值为指向nalu_t存储空间的指针  
      
  
  
    while(!feof(bits))   
    {  
        GetAnnexbNALU(n);//每执行一次,文件的指针指向本次找到的NALU的末尾,下一个位置即为下个NALU的起始码0x000001  
        dump(n);//输出NALU长度和TYPE  
          
        memset(sendbuf,0,1500);//清空sendbuf;此时会将上次的时间戳清空,因此需要ts_current来保存上次的时间戳值  
    //rtp固定包头,为12字节,该句将sendbuf[0]的地址赋给rtp_hdr,以后对rtp_hdr的写入操作将直接写入sendbuf。  
        rtp_hdr =(RTP_FIXED_HEADER*)&sendbuf[0];   
        //设置RTP HEADER,  
        rtp_hdr->payload     = H264;  //负载类型号,  
        rtp_hdr->version     = 2;  //版本号,此版本固定为2  
        rtp_hdr->marker    = 0;   //标志位,由具体协议规定其值。  
        rtp_hdr->ssrc        = htonl(10);    //随机指定为10,并且在本RTP会话中全局唯一  
          
    //  当一个NALU小于1400字节的时候,采用一个单RTP包发送  
        if(n->len<=1400)  
        {     
            //设置rtp M 位;  
            rtp_hdr->marker=1;  
            rtp_hdr->seq_no     = htons(seq_num ++); //序列号,每发送一个RTP包增1  
            //设置NALU HEADER,并将这个HEADER填入sendbuf[12]  
            nalu_hdr =(NALU_HEADER*)&sendbuf[12]; //将sendbuf[12]的地址赋给nalu_hdr,之后对nalu_hdr的写入就将写入sendbuf中;  
            nalu_hdr->F=n->forbidden_bit;  
            nalu_hdr->NRI=n->nal_reference_idc>>5;//有效数据在n->nal_reference_idc的第6,7位,需要右移5位才能将其值赋给nalu_hdr->NRI。  
            nalu_hdr->TYPE=n->nal_unit_type;  
  
            nalu_payload=&sendbuf[13];//同理将sendbuf[13]赋给nalu_payload  
            memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。  
          
            ts_current=ts_current+timestamp_increase;  
            rtp_hdr->timestamp=htonl(ts_current);  
            bytes=n->len + 13 ;                      //获得sendbuf的长度,为nalu的长度(包含NALU头但除去起始前缀)加上rtp_header的固定长度12字节  
            send( socket1, sendbuf, bytes, 0 );//发送rtp包  
            //sleep(1);  
//fwrite(sendbuf,bytes, 1, stream);   
        }  
          
        else if(n->len>1400)  
示例#4
0
文件: rtp_rtsp.c 项目: AsamQi/mini
int rtp_send_file(int sockfd,struct sockaddr *addr)
{
        printf("into the rtp_send_file...\n");
        int rtp_number;
        //OpenBitstreamFile("./test.264");//打开264文件,并将文件指针赋给bits,在此修改文件名实现打开别的264文件。
        OpenBitstreamFile("./slamtv60.264");//打开264文件,并将文件指针赋给bits,在此修改文件名实现打开别的264文件。
        NALU_t *n;
        char* nalu_payload;
        char sendbuf[1500];

        unsigned short seq_num =0;
        int	bytes=0;

        float framerate=15;
        unsigned int timestamp_increse=0,ts_current=0;
        timestamp_increse=(unsigned int)(90000.0 / framerate); //+0.5);

        sleep(3);
        n = AllocNALU(80000000);//为结构体nalu_t及其成员buf分配空间。返回值为指向nalu_t存储空间的指针

        sleep(3);
        printf("before the GetAnnexbNALU\n");
        while(!feof(bits))
        {
                GetAnnexbNALU(n);//每执行一次,文件的指针指向本次找到的NALU的末尾,下一个位置即为下个NALU的起始码0x000001
                //dump(n);//输出NALU长度和TYPE

                memset(sendbuf,0,1500);//清空sendbuf;此时会将上次的时间戳清空,因此需要ts_current来保存上次的时间戳值
                //rtp固定包头,为12字节,该句将sendbuf[0]的地址赋给rtp_hdr,以后对rtp_hdr的写入操作将直接写入sendbuf。
                rtp_hdr =(RTP_FIXED_HEADER*)&sendbuf[0];
                //设置RTP HEADER,
                rtp_hdr->payload     = H264;  //负载类型号,
                rtp_hdr->version     = 2;  //版本号,此版本固定为2
                rtp_hdr->marker    = 0;   //标志位,由具体协议规定其值。
                rtp_hdr->ssrc        = htonl(10);    //随机指定为10,并且在本RTP会话中全局唯一

                //	当一个NALU小于1400字节的时候,采用一个单RTP包发送
                if(n->len<=1400)
                {
                        //设置rtp M 位;
                        rtp_hdr->marker=1;
                        rtp_hdr->seq_no     = htons(seq_num ++); //序列号,每发送一个RTP包增1
                        //设置NALU HEADER,并将这个HEADER填入sendbuf[12]
                        nalu_hdr =(NALU_HEADER*)&sendbuf[12]; //将sendbuf[12]的地址赋给nalu_hdr,之后对nalu_hdr的写入就将写入sendbuf中;
                        nalu_hdr->F=n->forbidden_bit;
                        nalu_hdr->NRI=n->nal_reference_idc>>5;//有效数据在n->nal_reference_idc的第6,7位,需要右移5位才能将其值赋给nalu_hdr->NRI。
                        nalu_hdr->TYPE=n->nal_unit_type;

                        nalu_payload=&sendbuf[13];//同理将sendbuf[13]赋给nalu_payload
                        memcpy(nalu_payload,n->buf+1,n->len-1);//去掉nalu头的nalu剩余内容写入sendbuf[13]开始的字符串。

                        ts_current=ts_current+timestamp_increse;
                        rtp_hdr->timestamp=htonl(ts_current);
                        bytes=n->len + 12 ;						//获得sendbuf的长度,为nalu的长度(包含NALU头但除去起始前缀)加上rtp_header的固定长度12字节
                        //	send( socket1, sendbuf, bytes, 0 );//发送rtp包
                        rtp_number = sendto(sockfd,sendbuf,bytes,0,addr,16);
                        if(-1==rtp_number)
                        {
                                perror("len < 1400 rtp sendto error");
                        }
                        else
                        {
                                printf("len < 1400 rtp_number = %d\n",rtp_number);
                        }
                        //	Sleep(100);

                }

                else if(n->len>1400)
示例#5
0
/*!
***********************************************************************
* \brief
*    main function for TML decoder
***********************************************************************
*/
int main2(int argc, char **argv)
{
    int i;

    // allocate memory for the structures
    if ((input =  (struct inp_par *)calloc(1, sizeof(struct inp_par)))==NULL) no_mem_exit("main: input");
    if ((snr   =  (struct snr_par *)calloc(1, sizeof(struct snr_par)))==NULL) no_mem_exit("main: snr");
    if ((img   =  (struct img_par *)calloc(1, sizeof(struct img_par)))==NULL) no_mem_exit("main: img");


    Configure (argc, argv);

    init_old_slice();

    switch (input->FileFormat)
    {
    case 0:
        OpenBitstreamFile (input->infile);
        break;
    case 1:
        OpenRTPFile (input->infile);
        break;
    default:
        printf ("Unsupported file format %d, exit\n", input->FileFormat);
    }

    // Allocate Slice data struct
    malloc_slice(input,img);

    init(img);

#ifdef ADAPTIVE_FILTER
    InitAdaptiveFilter();
#endif

#ifdef MV_COMPETITION
    init_MV_Competition();
#endif

    dec_picture = NULL;

    dpb.init_done = 0;
    g_nFrame = 0;

    init_out_buffer();

    img->idr_psnr_number=input->ref_offset;
    img->psnr_number=0;

    img->number=0;
    img->type = I_SLICE;
    img->dec_ref_pic_marking_buffer = NULL;

    // B pictures
    Bframe_ctr=snr->frame_ctr=0;

    // time for total decoding session
    tot_time = 0;

    // reference flag initialization
    for(i=0; i<17; i++)
    {
        ref_flag[i]=1;
    }

    while (decode_one_frame(img, input, snr) != EOS)
        ;

    report(input, img, snr);
    free_slice(input,img);
    FmoFinit();
    free_global_buffers();

    flush_dpb();

#ifdef PAIR_FIELDS_IN_OUTPUT
    flush_pending_output(p_out);
#endif

    CloseBitstreamFile();

    close(p_out);
    //  fclose(p_out2);
    if (p_ref!=-1)
        close(p_ref);
#if TRACE
    fclose(p_trace);
#endif

#ifdef MV_COMPETITION
    close_MV_Competition();
#endif

    ercClose(erc_errorVar);

    free_dpb();
    uninit_out_buffer();

    free_colocated(Co_located);
    free (input);
    free (snr);
    free (img);

    //while( !kbhit() );
    return 0;
}