PNC_CallbackData *PNC_Init_SceneGenerator(GF_RTPChannel *p_chan, GF_RTPHeader *p_hdr, char *default_scene, u32 socketType, u16 socketPort, int debug) { GF_Err e; PNC_CallbackData *data = gf_malloc(sizeof(PNC_CallbackData)); int *i; data->chan = p_chan; data->hdr = p_hdr; data->debug = debug; memset( (void*) (data->buffer), '\0', RECV_BUFFER_SIZE_FOR_COMMANDS); data->bufferPosition = 0; /* Loading the initial scene as the encoding context */ data->codec = gf_seng_init((void*)data, default_scene); if (!data->codec) { fprintf(stderr, "Cannot create BIFS Engine from %s\n", default_scene); gf_free(data); return NULL; } data->server_socket = NULL; data->socket = NULL; if (socketType == GF_SOCK_TYPE_TCP) { data->server_socket = gf_sk_new(socketType); e = gf_sk_bind(data->server_socket, NULL, (u16) socketPort, NULL, 0, 0); if (e) fprintf(stderr, "Failed to bind : %s\n", gf_error_to_string(e)); e |= gf_sk_listen(data->server_socket, 1); if (e) fprintf(stderr, "Failed to listen : %s\n", gf_error_to_string(e)); e |= gf_sk_set_block_mode(data->server_socket, 0); if (e) fprintf(stderr, "Failed to set block mode : %s\n", gf_error_to_string(e)); e |= gf_sk_server_mode(data->server_socket, 0); if (e) fprintf(stderr, "Failed to set server mode : %s\n", gf_error_to_string(e)); } else { data->socket = gf_sk_new(socketType); e = gf_sk_bind(data->socket, NULL, (u16) socketPort, NULL, 0, 0); } /* char buffIp[1024]; u16 port = 0; u32 socket_type = 0; e |= gf_sk_get_local_ip(data->socket, buffIp); e |= gf_sk_get_local_info(data->socket, &port, &socket_type); dprintf(DEBUG_RTP_serv_generator, "RTS_serv_generator %s:%d %s\n", buffIp, port, socket_type==GF_SOCK_TYPE_UDP?"UDP":"TCP", e==GF_OK?"OK":"ERROR"); */ if (e) { fprintf(stderr, "Cannot bind socket to port %d (%s)\n", socketPort, gf_error_to_string(e)); if (data->socket) gf_sk_del(data->socket); if (data->server_socket) gf_sk_del(data->server_socket); gf_free(data); return NULL; } data->extension = gf_malloc(sizeof(PNC_CallbackExt)); ((PNC_CallbackExt * )data->extension)->i = 0; ((PNC_CallbackExt * )data->extension)->lastTS = 0; i = &((PNC_CallbackExt*)data->extension)->i; return data; }
u32 tcp_server(void *par) { TCP_Input *input = par; u32 *timer = input->RAPtimer; char buffer[MAX_BUF]; unsigned char temp[MAX_BUF]; FILE *fp; u32 byte_read; int ret; GF_Config *gf_config_file; GF_Socket *TCP_socket; GF_Socket *conn_socket; GF_Err e; int debug = input->debug; input->status = 1; TCP_socket = gf_sk_new(GF_SOCK_TYPE_TCP); e = gf_sk_bind(TCP_socket, NULL, input->port, NULL, 0, 0); e = gf_sk_listen(TCP_socket, 1); e = gf_sk_set_block_mode(TCP_socket, 1); e = gf_sk_server_mode(TCP_socket, 0); while(input->status == 1) { memset(buffer, 0, sizeof(buffer)); e = gf_sk_accept(TCP_socket, &conn_socket); if (e == GF_OK) { memset(buffer, 0, sizeof(buffer)); e = gf_sk_receive(conn_socket, buffer, MAX_BUF, 0, &byte_read); } switch (e) { case GF_IP_NETWORK_EMPTY: gf_sleep(33); continue; case GF_OK: break; default: fprintf(stderr, "Error with TCP socket : %s\n", gf_error_to_string(e)); exit(1); break; } if((*(input->config_flag)) == 0) { u32 num_retry; fp = fopen("temp.cfg", "w+"); if (!fp) { fprintf(stderr, "Error opening temp file for the configuration\n"); exit(1); } ret = fwrite(buffer, 1, byte_read, fp); fclose(fp); /* parsing config info */ gf_config_file = gf_cfg_new(".", "temp.cfg"); if (!gf_config_file) { fprintf(stderr, "Error opening the config file %s\n", gf_error_to_string(e)); exit(-1); } parse_config(gf_config_file, input->config, debug); /* Acknowledging the configuration */ gf_sk_send(conn_socket, "OK\n", 3); memset(temp, 0, sizeof(temp)); fp = fopen(input->config->scene_init_file, "w+"); if (!fp) { fprintf(stderr, "Error opening temp file for reception of the initial scene\n"); exit(1); } num_retry=10; while (1) { GF_Err e = gf_sk_receive(conn_socket, temp, sizeof(temp), 0, &byte_read); if (e == GF_OK) { fwrite(temp, 1, byte_read, fp); } else if (e==GF_IP_NETWORK_EMPTY) { num_retry--; if (!num_retry) break; gf_sleep(1); } else { fprintf(stderr, "Error receiving initial scene: %s\n", gf_error_to_string(e)); break; } } fclose(fp); *(input->config_flag) = 1; } /* we only wait now for the config updates */ if ( (*(input->config_flag)) == 1) { ret = sscanf(buffer, "DelaiMax=%d\n", timer); fprintf(stdout, "RAP timer changed, now : %d\n", *timer); } gf_sk_del(conn_socket); } input->status = 2; return GF_OK; }