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; }
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)
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)
/*! *********************************************************************** * \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; }