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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }