Beispiel #1
0
int main()
{
	tlog_init(TLOG_MODE_STDERR, TLOG_INFO, NULL);

	rcp_connect("10.25.25.220");

	start_message_manager();

	client_register(RCP_USER_LEVEL_LIVE, "", RCP_REGISTRATION_TYPE_NORMAL, RCP_ENCRYPTION_MODE_MD5);

	rcp_coder_list encoders, decoders;
	get_coder_list(RCP_CODER_ENCODER, RCP_MEDIA_TYPE_VIDEO, &encoders, 1);
	TL_DEBUG("***");
	for (int i=0; i<encoders.count; i++)
		TL_DEBUG("%x %x %x %x %x", encoders.coder[i].number, encoders.coder[i].caps, encoders.coder[i].current_cap, encoders.coder[i].param_caps, encoders.coder[i].current_param);
	TL_DEBUG("***");
	get_coder_list(RCP_CODER_DECODER, RCP_MEDIA_TYPE_VIDEO, &decoders, 1);
	TL_DEBUG("***");
	for (int i=0; i<decoders.count; i++)
		TL_DEBUG("%x %x %x %x %x", decoders.coder[i].number, decoders.coder[i].caps, decoders.coder[i].current_cap, decoders.coder[i].param_caps, decoders.coder[i].current_param);
	TL_DEBUG("***");

	rcp_session session;
	memset(&session, 0, sizeof(rcp_session));
	unsigned short udp_port = stream_connect_udp(&session);

	TL_DEBUG("udp port = %d", udp_port);

	rcp_media_descriptor desc = {
			RCP_MEP_UDP, 1, 1, 0, udp_port, 0, 1, RCP_VIDEO_CODING_MPEG4, RCP_VIDEO_RESOLUTION_4CIF
	};

	client_connect(&session, RCP_CONNECTION_METHOD_GET, RCP_MEDIA_TYPE_VIDEO, 0, &desc);

	pthread_create(&thread, NULL, keep_alive_thread, &session);

	rtp_merge_desc mdesc;
	rtp_init(RTP_PAYLOAD_TYPE_H263, 1, &mdesc);

	time_t end_time = time(NULL) + 10;
	while (time(NULL) < end_time)
	{
/*
		int num = recvfrom(con.stream_socket, buffer, 1500, 0, (struct sockaddr*)&si_remote, &slen);

		rtp_push_frame(buffer, num, &mdesc);
*/
		rtp_recv(session.stream_socket, &mdesc);

		if (rtp_pop_frame(&mdesc) == 0)
			fwrite(mdesc.data, mdesc.frame_lenght, 1, stdout);
	}

	pthread_cancel(thread);

	stop_message_manager();

	return 0;
}
Beispiel #2
0
static int rcp_send(rcp_packet* hdr)
{
	unsigned char buffer[RCP_MAX_PACKET_LEN];

	int len = hdr->payload_length + RCP_HEADER_LENGTH + TPKT_HEADER_LENGTH;

	write_TPKT_header(buffer, len);

	write_rcp_header(buffer+TPKT_HEADER_LENGTH, hdr);

	memcpy(buffer + RCP_HEADER_LENGTH + TPKT_HEADER_LENGTH, hdr->payload, hdr->payload_length);

	TL_DEBUG("sending %d bytes...", len);
	tlog_hex(TLOG_DEBUG, "data", buffer, len);
	int res = send(con.control_socket, buffer, len, 0);
	TL_DEBUG("%d sent", res);
	if (res == -1)
		TL_ERROR("unable to send packet: %d - %s", errno, strerror(errno));

	return res;
}
Beispiel #3
0
static void* event_handler(void* params)
{
	UNUSED(params);

	while (1)
	{
		int request_id = rcp_recv();
		if (request_id != -1)
		{
			TL_DEBUG("packet received: %d", resp[request_id].tag);
			sem_post(&resp_available[request_id]);
		}
	}

	return NULL;
}
Beispiel #4
0
int get_md5_random(unsigned char* md5)
{
	rcp_packet md5_req;

	init_rcp_header(&md5_req, 0, RCP_COMMAND_CONF_RCP_REG_MD5_RANDOM, RCP_COMMAND_MODE_READ, RCP_DATA_TYPE_P_STRING);

	rcp_packet* md5_resp = rcp_command(&md5_req);
	if (md5_resp == NULL)
		goto error;

	TL_DEBUG("payload len = %d", md5_resp->payload_length);
	memcpy(md5, md5_resp->payload, md5_resp->payload_length);

	return 0;

error:
	TL_ERROR("get_md5_random()");
	return -1;
}
Beispiel #5
0
static int rcp_recv()
{
	int res;
	int len;
	int received;

	unsigned char buffer[RCP_MAX_PACKET_LEN];

	res = recv(con.control_socket, buffer, TPKT_HEADER_LENGTH, 0);
	if (res == -1)
		goto error;

	len = ntohs(*(unsigned short*)(buffer+2));
	len -= TPKT_HEADER_LENGTH;

	received = 0;
	while (received < len)
	{
		res = recv(con.control_socket, buffer+received, len-received, 0);
		if (res == -1)
			goto error;
		TL_DEBUG("%d bytes received", res);
		received += res;
	}

	tlog_hex(TLOG_DEBUG, "received", buffer, received);

	int request_id = get_request_id(buffer);

	rcp_packet* hdr = &resp[request_id];

	read_rcp_header(buffer, hdr);

	memcpy(hdr->payload, buffer+RCP_HEADER_LENGTH, hdr->payload_length);

	return request_id;

error:
	TL_ERROR("rcp_recv: %d - %s\n", errno, strerror(errno));
	return -1;
}
Beispiel #6
0
int client_connect(rcp_session* session, int method, int media, int flags, rcp_media_descriptor* desc)
{
	rcp_packet con_req;

	init_rcp_header(&con_req, 0, RCP_COMMAND_CONF_CONNECT_PRIMITIVE, RCP_COMMAND_MODE_WRITE, RCP_DATA_TYPE_P_OCTET);

	int len = 0;
	char* mdesc = con_req.payload;

	unsigned short tmp16;
	mdesc[0] = method;
	mdesc[1] = media;
	mdesc[2] = 0;
	mdesc[3] = flags;
	mdesc[4] = mdesc[5] = mdesc[6] = mdesc[7] = 0;

	mdesc[8] = desc->encapsulation_protocol;
	mdesc[9] = desc->substitude_connection | (desc->relative_addressing << 1);
	tmp16 = htons(desc->mta_port);
	memcpy(mdesc+10, &tmp16, 2);
	memcpy(mdesc+12, &desc->mta_ip, 4);
	mdesc[16] = desc->coder;
	mdesc[17] = desc->line;
	tmp16 = htons(desc->coding);
	memcpy(mdesc+24, &tmp16, 2);
	tmp16 = htons(desc->resolution);
	memcpy(mdesc+26, &tmp16, 2);
	mdesc[28] = 0;
	mdesc[29] = 0;
	tmp16 = htons(1000);
	memcpy(mdesc+30, &tmp16, 2);

	mdesc += 32;
	len += 32;

	con_req.payload_length = len;

	rcp_packet* con_resp = rcp_command(&con_req);
	if (con_resp == NULL)
	{
		printf("con_resp == NULL\n");
		goto error;
	}

	TL_INFO("%s", connect_stat_str(con_resp->payload[2]));
	if (con_resp->payload[2] != 1)
	{
		printf("con_resp->payload[2] != 1\n");
		goto error;
	}

	session->session_id = con_resp->session_id;
	TL_DEBUG("session id = %d - %d", con_resp->session_id, session->session_id);
	tlog_hex(TLOG_DEBUG, "client connection resp", con_resp->payload, con_resp->payload_length);

	desc->coder = con_resp->payload[16];
	desc->line = con_resp->payload[17];
	desc->coding = ntohs(*(unsigned short*)&con_resp->payload[24]);
	desc->resolution = ntohs(*(unsigned short*)&con_resp->payload[26]);

	return 0;

error:
	TL_ERROR("client_connect()");
	return -1;
}
Beispiel #7
0
int main(int argc, char* argv[])
{
	tlog_init(TLOG_MODE_STDERR, TLOG_INFO, NULL);

    if (argc < 3)
    {
        TL_INFO("%s <ip> <output>", argv[0]);
        return 0;
    }

	rcp_connect(argv[1]);

	start_message_manager();

	client_register(RCP_USER_LEVEL_LIVE, "", RCP_REGISTRATION_TYPE_NORMAL, RCP_ENCRYPTION_MODE_MD5);

	rcp_coder_list encoders, decoders;
	get_coder_list(RCP_CODER_ENCODER, RCP_MEDIA_TYPE_VIDEO, &encoders, 1);
	TL_DEBUG("***");
	for (int i=0; i<encoders.count; i++)
		TL_DEBUG("%x %x %x %x %x", encoders.coder[i].number, encoders.coder[i].caps, encoders.coder[i].current_cap, encoders.coder[i].param_caps, encoders.coder[i].current_param);
	TL_DEBUG("***");
	get_coder_list(RCP_CODER_DECODER, RCP_MEDIA_TYPE_VIDEO, &decoders, 1);
	TL_DEBUG("***");
	for (int i=0; i<decoders.count; i++)
		TL_DEBUG("%x %x %x %x %x", decoders.coder[i].number, decoders.coder[i].caps, decoders.coder[i].current_cap, decoders.coder[i].param_caps, decoders.coder[i].current_param);
	TL_DEBUG("***");

	rcp_session session;
	memset(&session, 0, sizeof(rcp_session));
	unsigned short udp_port = stream_connect_udp(&session);

	TL_DEBUG("udp port = %d", udp_port);

	rcp_media_descriptor desc = {
			RCP_MEP_UDP, 1, 1, 0, udp_port, 1, 1, RCP_VIDEO_CODING_H264, RCP_VIDEO_RESOLUTION_4CIF
	};

	client_connect(&session, RCP_CONNECTION_METHOD_GET, RCP_MEDIA_TYPE_VIDEO, 0, &desc);

	pthread_create(&thread, NULL, keep_alive_thread, &session);

	rtp_merge_desc mdesc;
	rtp_init(RTP_PAYLOAD_TYPE_H264, 1, &mdesc);

	signal(SIGTERM, term_handler);

	FILE * out = fopen(argv[2], "wb");

	while (!end)
	{
/*
		int num = recvfrom(con.stream_socket, buffer, 1500, 0, (struct sockaddr*)&si_remote, &slen);

		rtp_push_frame(buffer, num, &mdesc);
*/
		if (rtp_recv(session.stream_socket, &mdesc) == 0)
        {
			if (rtp_pop_frame(&mdesc) == 0)
			{
				fwrite(mdesc.data, mdesc.frame_lenght, 1, out);
			}
        }
		//char cmd[100];
		//sprintf(cmd, "kill %d", res);
		//system(cmd);
		//return 0;
	}

	fclose(out);

	pthread_cancel(thread);

	client_disconnect(&session);

	client_unregister();

	stop_message_manager();

	return 0;
}
Beispiel #8
0
int main()
{
	tlog_init(TLOG_MODE_STDERR, TLOG_INFO, NULL);

	rcp_connect("10.25.25.223");

	start_event_handler();

	client_register(RCP_USER_LEVEL_LIVE, "", RCP_REGISTRATION_TYPE_NORMAL, RCP_ENCRYPTION_MODE_MD5);

	rcp_coder_list encoders, decoders;
	get_coder_list(RCP_CODER_ENCODER, RCP_MEDIA_TYPE_VIDEO, &encoders, 1);
	TL_DEBUG("***");
	for (int i=0; i<encoders.count; i++)
		TL_DEBUG("%x %x %x %x %x", encoders.coder[i].number, encoders.coder[i].caps, encoders.coder[i].current_cap, encoders.coder[i].param_caps, encoders.coder[i].current_param);
	TL_DEBUG("***");
	get_coder_list(RCP_CODER_DECODER, RCP_MEDIA_TYPE_VIDEO, &decoders, 1);
	TL_DEBUG("***");
	for (int i=0; i<decoders.count; i++)
		TL_DEBUG("%x %x %x %x %x", decoders.coder[i].number, decoders.coder[i].caps, decoders.coder[i].current_cap, decoders.coder[i].param_caps, decoders.coder[i].current_param);
	TL_DEBUG("***");

	rcp_session session;
	memset(&session, 0, sizeof(rcp_session));
	unsigned short tcp_port = stream_connect_tcp(&session);

	rcp_media_descriptor desc = {
			RCP_MEP_TCP, 1, 1, 0, tcp_port, 0, 1, RCP_VIDEO_CODING_H263P, RCP_VIDEO_RESOLUTION_4CIF
	};

	client_connect(&session, RCP_CONNECTION_METHOD_GET, RCP_MEDIA_TYPE_VIDEO, 0, &desc);

	initiate_tcp_stream(&session, &decoders.coder[0]);

	int res = fork();
	if (res == 0)
	{
		while (1)
		{
			sleep(2);
			int n = keep_alive(&session);
			//TL_DEBUG("active connections = %d", n);
			if (n < 0)
				break;
		}
	}


	rtp_merge_desc mdesc;
	rtp_init(RTP_PAYLOAD_TYPE_H263, 1, &mdesc);

	time_t end_time = time(NULL) + 10;
	while (time(NULL) < end_time)
	{
/*
		int num = recv(con.stream_socket, buffer, 1500, 0);

		rtp_push_frame(buffer, num, &mdesc);
*/
		char buff[2000];
		int size = recv(session.stream_socket, buff, 1000, 0);
		fwrite(buff, size, 1, stdout);
/*
		rtp_recv(session.stream_socket, &mdesc);

		if (rtp_pop_frame(&mdesc) == 0)
			fwrite(mdesc.data, mdesc.frame_lenght, 1, stdout);
*/
	}

	stop_event_handler();


	return 0;
}