Пример #1
0
JDK_BOOL JDK_vo_loss_fill_buffer(JDK_UINT32 chn,JDK_UINT32 nStream, JDK_BOOL isIDR)
{
	return JDK_TRUE;

	if(JDK_IS_BNC_CAM(chn)){
		return JDK_TRUE;
	}

	if(s_buf_size <= 0){
		if(JDK_load_user_picture(JDK_DEF_LOSS_NET_H264)<=0){
			return JDK_FALSE;
		}
	}

	char meida_name[64];
	int key_frame_flag = 0;
	SDK_ENC_BUF_ATTR_t attr;
	memset(&attr, 0, sizeof(attr));
	
	sprintf(meida_name,"ch%d_%d.264", chn, nStream);
	int media_buf_id = MEDIABUF_lookup_byname(meida_name);

	attr.magic = SDK_ENC_BUF_DATA_MAGIC;
	attr.type = SDK_ENC_BUF_DATA_H264;
	
	struct timeval tv;
	gettimeofday(&tv, NULL);
	guint64 aPtsUs = (guint64)tv.tv_sec * 1000000ULL + (guint64)tv.tv_usec;
	attr.timestamp_us = aPtsUs;
	attr.time_us = (unsigned long long)((aPtsUs/1000000ULL) << 32) + (unsigned long long)(aPtsUs%1000000ULL);

	if (nStream == 0) {
		attr.h264.keyframe = isIDR;
		attr.h264.ref_counter = 0;
		attr.h264.fps = 25;
		attr.h264.width = 704;
		attr.h264.height = 480;
		key_frame_flag = isIDR;
	} else {
		attr.h264.keyframe = isIDR;
		attr.h264.ref_counter = 0;
		attr.h264.fps = 25;
		attr.h264.width = 0;
		attr.h264.height = 0;
		key_frame_flag = isIDR;
	}
	
	attr.data_sz = s_buf_size;
	MEDIABUF_in_request(media_buf_id, s_buf_size + sizeof(SDK_ENC_BUF_ATTR_t), key_frame_flag);
	MEDIABUF_in_append(media_buf_id, &attr, sizeof(SDK_ENC_BUF_ATTR_t));
	MEDIABUF_in_append(media_buf_id, s_buf, s_buf_size);
	MEDIABUF_in_commit(media_buf_id);

	return JDK_TRUE;
}
Пример #2
0
JDK_BOOL JDK_vo_fill_buffer_picture(JDK_UINT32 chn)
{
	int i,n;
	int stream_cnt = 2;
	char meida_name[64];
	int media_buf_id;
	const n_max_loop_times = 20;

	for(i=0;i<stream_cnt;i++){
		int loop_time = 0;
		sprintf(meida_name,"ch%d_%d.264", chn, i);
		media_buf_id = MEDIABUF_lookup_byname(meida_name);
//		while(loop_time < n_max_loop_times){
//			++loop_time;
//			usleep(100000);
//		}
		MEDIABUF_empty(media_buf_id);			
		JDK_vo_loss_multi_fill_buffer(chn,i, TRUE,1);
		JDK_vo_loss_multi_fill_buffer(chn,i, FALSE,3);
	}

	return  JDK_TRUE;
}
Пример #3
0
void *gb28181_rtp_loop(void *param)
{
#define AUDIO_FRAME_SIZE	320
#define BUF_SIZE	(1024*1024)
	SipRtpSession_t *srtp=NULL;
	Rtp_t *rtp = NULL;
	int *trigger = (int *)param;
	int i;
	int entries=0;
	uint8_t *buf=NULL;
	uint8_t *ptr;
	int out_success=false;
	unsigned int base_ts=0xffffffff,ts=0;
	unsigned int iRetSize=0;
	lpMEDIABUF_USER media_user=NULL;
	int media_id;
	int is_first_i_frame = 1, i_frame_cnt = 0;

	//
	FILE *f=file_new("test.720p.264");
	buf = (char *)malloc(BUF_SIZE);
	if(buf == NULL){
		printf("malloc for buffer size failed!\n");
		return NULL;
	}

	while(*trigger){
		entries = SIPRTP_session_entries();
		if(entries > 0){
			// init mediabuf
			if(media_user == NULL){
				media_id = MEDIABUF_lookup_byname("360p.264");
				if(media_id >= 0){
					media_user = MEDIABUF_attach(media_id);
					if(media_user == NULL){
						printf("media attach falied!\n");
						usleep(500*1000);
						continue;
					}
					//media_speed = MEDIABUF_in_speed(media_id);
					MEDIABUF_sync(media_user);
					is_first_i_frame = 1;
					i_frame_cnt = 0;
				}else{
					printf("lookup name failed falied!\n");
					usleep(500*1000);
					continue;
				}
			}
			/////////////////////////////
			ptr = buf;
			out_success = false;
			if(0 == MEDIABUF_out_lock(media_user)){
				const lpSDK_ENC_BUF_ATTR attr = NULL;
				size_t out_size = 0;
				
				if(0 == MEDIABUF_out(media_user, (void **)&attr, NULL, &out_size)){
					const void* const raw_ptr = (void*)(attr + 1);
					ssize_t const raw_size = attr->data_sz;
					
					MEDIABUF_out_unlock(media_user);
					if(is_first_i_frame && attr->h264.keyframe){
						if(++i_frame_cnt >= 2){
							is_first_i_frame = 0;
							base_ts = (uint32_t)(attr->timestamp_us/1000);
						}
					}
					if(i_frame_cnt < 2){
						//MEDIABUF_out_unlock(media_user);
						continue;
					}
					//if(base_ts == 0xffffffff) base_ts = (uint32_t)(attr->timestamp_us/1000);
					if(((uint32_t)(attr->timestamp_us/1000) - base_ts -ts) > 50){
						printf("ts dev:%d ts:%u->%u %u\n",(uint32_t)(attr->timestamp_us/1000) - base_ts -ts,ts,
							(uint32_t)(attr->timestamp_us/1000) - base_ts,base_ts);
					}
					ts = (uint32_t)(attr->timestamp_us/1000) - base_ts;
					if(kSDK_ENC_BUF_DATA_H264 == attr->type){
						if(MPEG_muxer_video(raw_ptr,raw_size,ts,
							MPEG_DEFAULT_VIDEO_STREAM,attr->h264.keyframe,ptr,BUF_SIZE,&iRetSize)==0)
						{
							entries = SIPRTP_session_entries();
							for(i=0;i<entries;i++){
								srtp = SIPRTP_session_get(i+1);
								if(srtp->data.flag == TRUE){
									//printf(">>>>>>index %d \n",i+1);
									rtp = (Rtp_t *)srtp->data.context;
									RTP_send_packet(rtp,ptr,iRetSize,ts,RTP_TYPE_PS);
									out_success = true;
								}
							}
							//file_write(f,ptr,iRetSize);
							/*
							Test264Frame2_t header;
							header.flag = 0x7d22628c;
							header.isidr = attr->h264.keyframe;
							header.size = raw_size;
							file_write(f,&header,sizeof(Test264Frame2_t));
							file_write(f,raw_ptr,raw_size);
							*/
							ptr+=iRetSize;
						}else{
							printf("muxer video failed!\n");
							break;
						}
					}/*
					else if(kSDK_ENC_BUF_DATA_G711A == attr->type){
						if(MPEG_muxer_audio(raw_ptr,raw_size,attr->timestamp_us/1000,
							MPEG_DEFAULT_AUDIO_STREAM,ptr,&iRetSize)==0)
						{
							entries = SIPRTP_session_entries();
							for(i=0;i<entries;i++){
								srtp = SIPRTP_session_get(i+1);
								if(srtp->data.flag == TRUE){
									rtp = (Rtp_t *)srtp->data.context;
									RTP_send_packet(rtp,ptr,iRetSize,attr->timestamp_us/1000,RTP_TYPE_PS);
								}
							}
							ptr += iRetSize;
						}else{
							printf("muxer audio failed!\n");
							break;
						}						
					}*/
					else {
						printf("GB28181 got type=%d impossible\n", attr->type);
					}
					//MEDIABUF_out_unlock(media_user);
				}else{
					MEDIABUF_out_unlock(media_user);
					//printf("out failed!\n");
					usleep(1000);
				}
			}
		}else{
			if(media_user){
				MEDIABUF_detach(media_user);
				media_user = NULL;
				base_ts = 0xffffffff;
			}
			usleep(10*1000);
		}
	}
	
	printf("rtp loop exit!!!!\n");
	if(media_user){
		MEDIABUF_detach(media_user);
		media_user = NULL;
	}
	free(buf);
	
	return NULL;	
}
Пример #4
0
Файл: rtspd.c Проект: LinLL/ipc
SPOOK_SESSION_LOOP_t RTSPD_loop(uint32_t* trigger, int sock, time_t* read_pts, const void* msg, ssize_t msg_sz)
{
	RtspdSession_t* session = NULL;

	int i;

	int ret = 0;
	
	int first_request = 0;

	int rtsp_req_complete = 0;
	int rtsp_req_handle_ret = 0;

	int rtcp_req_handle_ret = 0;

	unsigned char* ptr = NULL;
	int len = 0;
	unsigned char buf[2048];

	SOCKET_RW_CTX rw_ctx;
//	H264_FILE_BUFFER* hfb = NULL;

	struct timeval timeout;
	fd_set read_set;
	fd_set write_set;
	int select_ret;

	int rtcp_head_len = 0;
	int rtcp_body_len = 0;
	char file_name[64];

	void* payload_ptr = NULL;
	ssize_t payload_sz = 0;

	int nalu_size;
	int mediabuf_ch = 0;
	MediaBufUser_t* user = NULL;

	session = rtspd_create_session(trigger, sock, msg, msg_sz);

	mediabuf_ch = MEDIABUF_lookup_byname(session->server_trace);

	RTSPD_TRACE("connecting to mediabuf %d", mediabuf_ch);

	if(mediabuf_ch < 0){
		return SPOOK_LOOP_FAILURE;
	}

	user = MEDIABUF_user_attach(mediabuf_ch);
	if(!user){
		return SPOOK_LOOP_FAILURE;
	}
	
	
	//rtcp init
	RTCP_init(session);
	while(*session->trigger)
	{
		timeout.tv_sec = 0;
		timeout.tv_usec = 50*1000;
		FD_ZERO(&read_set);
		FD_SET(session->sock, &read_set);
		if(session->server_udp_sock1 > 0)
		{
//			RTSPD_TRACE("server_udp_sock1=%d", session->server_udp_sock1);
			FD_SET(session->server_udp_sock1, &read_set);
		}
		if(first_request != 0)
		{
#define MAX(a, b) ((a) > (b) ? (a) : (b))
			select_ret = select(MAX(session->sock, session->server_udp_sock1)+ 1, &read_set, NULL, NULL, &timeout);
		}
		else
		{
			select_ret = 1;
		}

		if (select_ret < 0)
		{
			*session->trigger = 0;
//			printf("read select error stop\n");
			break;
		}
		else if(select_ret == 0)
		{
//			printf("read select timeout...\n");
		}
		else
		{
			if(first_request == 0 || FD_ISSET(session->sock, &read_set))
			{
				//´¦ÀíÉÏ´«
				if(first_request == 0)
				{
					ptr = (unsigned char*)msg;
					len = msg_sz;
					first_request = 1;
				}
				else
				{
					SOCKETRW_rwinit(&rw_ctx, session->sock, buf, sizeof(buf), RTSPD_READ_TIMEOUT);
					SOCKETRW_read(&rw_ctx);
					if(rw_ctx.result != SOCKET_RW_RESULT_SUCCESS)
					{
						*session->trigger = 0;
						break;
					}

					ptr = buf;
					len = rw_ctx.actual_len;
				}

				for(i = 0; i < len; i++)
				{

					//rtcp over tcp
					if(ptr[i] == '$') //rtcp start
					{
						session->request_sz = 0;
						session->request_buf[session->request_sz] = ptr[i];
						session->request_sz++;
						rtcp_head_len = 3;
						continue;
					}

					if(rtcp_head_len > 0) //rtcp head
					{
						session->request_buf[session->request_sz] = ptr[i];
						session->request_sz++;
						rtcp_head_len--;

						if(rtcp_head_len == 0)
						{
							rtcp_body_len = *((unsigned char*)(session->request_buf+3)) | (*((unsigned char*)(session->request_buf+2)) << 8);
						}
						continue;
					}

					if(rtcp_body_len > 0) //rtcp body
					{
						session->request_buf[session->request_sz] = ptr[i];
						session->request_sz++;
						rtcp_body_len--;
						if(rtcp_body_len == 0)
						{
							RTSPD_TRACE("found tcp rtcp len=%d p[0]=%02x p[1]=%02x p[2]=%02x p[3]=%02x",
									rtcp_body_len, session->request_buf[0], session->request_buf[1], session->request_buf[2], session->request_buf[3]);
							rtcp_req_handle_ret = RTCP_handle(session);
							if(rtcp_req_handle_ret != 0)
							{
								*session->trigger = 0;
								break;
							}
							if(session->response_sz > 0)
							{
								SOCKETRW_rwinit(&rw_ctx, session->sock, session->response_buf, session->response_sz, RTSPD_WRITE_TIMEOUT);
								SOCKETRW_writen(&rw_ctx);
								if(rw_ctx.result != SOCKET_RW_RESULT_SUCCESS)
								{
									*session->trigger = 0;
									break;
								}
							}

							session->response_sz = 0;
							session->request_sz = 0;
						}
						continue;
					}


					//rtsp
					session->request_buf[session->request_sz] = ptr[i];
					session->request_sz++;

					rtsp_req_complete = is_rtsp_req_complete(session->request_buf, session->request_sz);
					if(rtsp_req_complete == 1)
					{
						session->request_buf[session->request_sz] = 0;
						rtsp_req_handle_ret = RTSP_handle(session);
						if(rtsp_req_handle_ret != 0)
						{
							*session->trigger = 0;
							break;

						}
						if(session->response_sz > 0)
						{
							SOCKETRW_rwinit(&rw_ctx, session->sock, session->response_buf, session->response_sz, RTSPD_WRITE_TIMEOUT);
							SOCKETRW_writen(&rw_ctx);
							if(rw_ctx.result != SOCKET_RW_RESULT_SUCCESS)
							{
								*session->trigger = 0;
								break;
							}
						}
						session->response_sz = 0;
						session->request_sz = 0;
					}
				}
			}

			if(FD_ISSET(session->server_udp_sock1, &read_set))
			{
				session->request_sz = recvfrom(session->server_udp_sock1, session->request_buf, sizeof(session->request_buf), 0, NULL, NULL);
				if(session->request_sz > 0)
				{
					RTSPD_TRACE("found udp rtcp len=%d p[0]=%02x p[1]=%02x p[2]=%02x p[3]=%02x",
							rtcp_body_len, session->request_buf[0], session->request_buf[1], session->request_buf[2], session->request_buf[3]);
					rtcp_req_handle_ret = RTCP_handle(session);
					if(rtcp_req_handle_ret != 0)
					{
						*session->trigger = 0;
						break;
					}
					if(session->response_sz > 0)
					{
						//todo udp send backup
					}

					session->response_sz = 0;
					session->request_sz = 0;
				}
			}
		}

		if(session->playing == RTSPD_PLAYING)
		{
			RTCP_schedule(session);
			if(session->response_sz > 0)
			{
				SOCKETRW_rwinit(&rw_ctx, session->sock, session->response_buf, session->response_sz, RTSPD_WRITE_TIMEOUT);
				SOCKETRW_writen(&rw_ctx);
				if(rw_ctx.result != SOCKET_RW_RESULT_SUCCESS)
				{
					*session->trigger = 0;
					break;
				}
				session->response_sz = 0;
			}
						
			if(0 == MEDIABUF_out_lock(user)){
				ret = MEDIABUF_out(user, &payload_ptr, NULL, &payload_sz);
				if(0 == ret){
					RTP_packet_nalu(session, payload_ptr + sizeof(SDK_AVENC_BUF_ATTR_t), payload_sz - sizeof(SDK_AVENC_BUF_ATTR_t));
					if(session->transport == RTP_OVER_TCP)
					{
						timeout.tv_sec = 0;
						timeout.tv_usec = 10*1000;
						FD_ZERO(&write_set);
						FD_SET(session->sock, &write_set);
						select_ret = select(session->sock + 1, NULL, &write_set, NULL, &timeout);
						if (select_ret < 0)
						{
							*session->trigger = 0;
							printf("write select error stop\n");
						}
						else if(select_ret == 0)
						{
							printf("write select timeout...\n");
						}
						else
						{
							for(i = 0; i < session->rtp_entries; ++i)
							{
								SOCKETRW_rwinit(&rw_ctx, session->sock, session->rtp_entry[i].ptr, session->rtp_entry[i].len, RTSPD_WRITE_TIMEOUT);
								SOCKETRW_writen(&rw_ctx);
								if(rw_ctx.result != SOCKET_RW_RESULT_SUCCESS)
								{
									*session->trigger = 0;
									break;
								}
							}
						}
					}
					else if(session->transport == RTP_UDP)
					{
						RTSPD_ASSERT(session->server_udp_sock0 != 0);
						RTSPD_ASSERT(session->server_udp_sock1 != 0);

						for(i = 0; i < session->rtp_entries; i++)
						{
							udp_send2(session, session->rtp_entry[i].ptr, session->rtp_entry[i].len,
									session->client_ip, session->client_udp_port0);
						}
					}
				}
				MEDIABUF_out_unlock(user); // unlock the buf
				if(!ret){
					usleep(MEDIABUF_in_speed(user->pool_ch));
				}
			}
		}
	}

	MEDIABUF_user_detach(user);
	user = NULL;

	close(session->sock);
	if(session->transport == RTP_UDP)
	{
		close(session->server_udp_sock0);
		close(session->server_udp_sock1);
	}
	rtspd_free_session(session);

	return SPOOK_LOOP_SUCCESS;
}