void isisbeamDriver::pollerThread() { static const char* functionName = "isisbeamPoller"; static char buffer[LEN_BUFFER+1]; SOCKET sd = setup_udp_socket(ND_BROADCAST_PORT1, 0); int n,v; char* tmp; struct tm* pstm; time_t timer; double beamts1, beamts2, beamepb1, mtempts1, htempts1, beamsynch, freqsynch, totalts1, freqts2, totalts2, demethanets2, methanets2, hydrogents2, dmodrunts2, dmodrunlimts2, beamdmodts2, muonkick, dmodannlowts2; char *onts1, *offts1, *onts2, *offts2, *e1, *e2, *e3, *e4, *e5, *e6, *e7, *e8, *e9, *w1, *w2, *w3, *w4, *w5, *w6, *w7, *w8, *w9, *n1, *n2, *n3, *n4, *n5, *n6, *n7, *n8, *n9, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9, *em1, *em2, *em3, *em4, *em5, *em6, *em7, *em8, *em9, *wm1, *wm2, *wm3, *wm4, *wm5, *wm6, *wm7, *wm8, *wm9; static char time_buffer[128]; int c1, c2, c3, c4, c5, c6, c7, c8, c9; while(true) { n = receive_data_udp(sd, buffer, LEN_BUFFER); if (n > 0) { buffer[n] = '\0'; buffer[LEN_BUFFER] = '\0'; tmp = xml_parse(buffer, "ISISBEAM"); if (tmp == NULL) { tmp = xml_parse(buffer, "ISISBEAM2"); if (tmp == NULL) { continue; // ignore anything other than ISISBEAM and ISISBEAM2 packets for moment } free(tmp); tmp = xml_parse(buffer, "TIME"); if (tmp == NULL) { continue; } timer = atol(tmp); pstm = localtime(&timer); free(tmp); strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%dT%H:%M:%S+0100", pstm); tmp = xml_parse(buffer, "DMOD_RUNTIME"); dmodrunts2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "DMOD_RUNTIME_LIM"); dmodrunlimts2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "DMOD_UABEAM"); beamdmodts2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "DMOD_ANNLOW1"); dmodannlowts2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "VATE"); sscanf(tmp, "%lu %lu %lu %lu %lu %lu %lu %lu %lu", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9); e1 = ts2_vat_status(c1); e2 = ts2_vat_status(c2); e3 = ts2_vat_status(c3); e4 = ts2_vat_status(c4); e5 = ts2_vat_status(c5); e6 = ts2_vat_status(c6); e7 = ts2_vat_status(c7); e8 = ts2_vat_status(c8); e9 = ts2_vat_status(c9); free(tmp); tmp = xml_parse(buffer, "VATW"); sscanf(tmp, "%lu %lu %lu %lu %lu %lu %lu %lu %lu", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9); w1 = ts2_vat_status(c1); w2 = ts2_vat_status(c2); w3 = ts2_vat_status(c3); w4 = ts2_vat_status(c4); w5 = ts2_vat_status(c5); w6 = ts2_vat_status(c6); w7 = ts2_vat_status(c7); w8 = ts2_vat_status(c8); w9 = ts2_vat_status(c9); free(tmp); lock(); setDoubleParam(P_DmodRunTS2, dmodrunts2); setDoubleParam(P_DmodRunLimTS2, dmodrunlimts2); setDoubleParam(P_BeamDmodTS2, beamdmodts2); setDoubleParam(P_DmodAnnLowTS2, dmodannlowts2); setStringParam(m_blparams["VAT_E1"], e1); setStringParam(m_blparams["VAT_E2"], e2); setStringParam(m_blparams["VAT_E3"], e3); setStringParam(m_blparams["VAT_E4"], e4); setStringParam(m_blparams["VAT_E5"], e5); setStringParam(m_blparams["VAT_E6"], e6); setStringParam(m_blparams["VAT_E7"], e7); setStringParam(m_blparams["VAT_E8"], e8); setStringParam(m_blparams["VAT_E9"], e9); setStringParam(m_blparams["VAT_W1"], w1); setStringParam(m_blparams["VAT_W2"], w2); setStringParam(m_blparams["VAT_W3"], w3); setStringParam(m_blparams["VAT_W4"], w4); setStringParam(m_blparams["VAT_W5"], w5); setStringParam(m_blparams["VAT_W6"], w6); setStringParam(m_blparams["VAT_W7"], w7); setStringParam(m_blparams["VAT_W8"], w8); setStringParam(m_blparams["VAT_W9"], w9); setStringParam(P_UpdateTime, time_buffer); setIntegerParam(P_UpdateTimeT, timer); setStringParam(P_InstTS1, "ALF,ARGUS,CHRONUS,CRISP,EMMA,EMU,ENGINX,EVS,GEM,HIFI,HRPD,INES,IRIS,LOQ,MAPS,MARI,MERLIN,MUSR,OSIRIS,PEARL,POLARIS," "PRISMA,ROTAX,SANDALS,SURF,SXD,TOSCA,VESUVIO"); setStringParam(P_InstTS2, "CHIPIR,IMAT,INTER,LARMOR,LET,NIMROD,OFFSPEC,POLREF,SANS2D,WISH,ZOOM"); setIntegerParam(P_OsirisCryomag, 0); callParamCallbacks(); unlock(); } else { free(tmp); tmp = xml_parse(buffer, "TIME"); if (tmp == NULL) { continue; } timer = atol(tmp); pstm = localtime(&timer); free(tmp); strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%dT%H:%M:%S+0100", pstm); tmp = xml_parse(buffer, "BEAMT"); beamts1 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "BEAMT2"); beamts2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "BEAME1"); beamepb1 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "MTEMP"); mtempts1 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "HTEMP"); htempts1 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "BEAMS"); beamsynch = atof(tmp); free(tmp); tmp = xml_parse(buffer, "REPR"); freqsynch = atof(tmp); free(tmp); tmp = xml_parse(buffer, "TS1_TOTAL"); totalts1 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "REPR2"); freqts2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "TS2_TOTAL"); totalts2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "T2MTEMP1"); demethanets2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "T2MTEMP2"); methanets2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "T2HTEMP1"); hydrogents2 = atof(tmp); free(tmp); tmp = xml_parse(buffer, "MUONKICKER"); muonkick = atof(tmp); free(tmp); onts1 = xml_parse(buffer, "TS1ON"); offts1 = xml_parse(buffer, "TS1OFF"); onts2 = xml_parse(buffer, "TS2ON"); offts2 = xml_parse(buffer, "TS2OFF"); tmp = xml_parse(buffer, "SHUTE"); sscanf(tmp, "%lu %lu %lu %lu %lu %lu %lu %lu %lu", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9); e1 = ts2_shutter_status(c1); e2 = ts2_shutter_status(c2); e3 = ts2_shutter_status(c3); e4 = ts2_shutter_status(c4); e5 = ts2_shutter_status(c5); e6 = ts2_shutter_status(c6); e7 = ts2_shutter_status(c7); e8 = ts2_shutter_status(c8); e9 = ts2_shutter_status(c9); em1 = ts2_shutter_mode(c1); em2 = ts2_shutter_mode(c2); em3 = ts2_shutter_mode(c3); em4 = ts2_shutter_mode(c4); em5 = ts2_shutter_mode(c5); em6 = ts2_shutter_mode(c6); em7 = ts2_shutter_mode(c7); em8 = ts2_shutter_mode(c8); em9 = ts2_shutter_mode(c9); free(tmp); tmp = xml_parse(buffer, "SHUTW"); sscanf(tmp, "%lu %lu %lu %lu %lu %lu %lu %lu %lu", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9); w1 = ts2_shutter_status(c1); w2 = ts2_shutter_status(c2); w3 = ts2_shutter_status(c3); w4 = ts2_shutter_status(c4); w5 = ts2_shutter_status(c5); w6 = ts2_shutter_status(c6); w7 = ts2_shutter_status(c7); w8 = ts2_shutter_status(c8); w9 = ts2_shutter_status(c9); wm1 = ts2_shutter_mode(c1); wm2 = ts2_shutter_mode(c2); wm3 = ts2_shutter_mode(c3); wm4 = ts2_shutter_mode(c4); wm5 = ts2_shutter_mode(c5); wm6 = ts2_shutter_mode(c6); wm7 = ts2_shutter_mode(c7); wm8 = ts2_shutter_mode(c8); wm9 = ts2_shutter_mode(c9); free(tmp); tmp = xml_parse(buffer, "SHUTN"); v = atoi((const char *)tmp); n1 = ts1_shutter_status(v, 1); n2 = ts1_shutter_status(v, 2); n3 = ts1_shutter_status(v, 3); n4 = ts1_shutter_status(v, 4); n5 = ts1_shutter_status(v, 5); n6 = ts1_shutter_status(v, 6); n7 = ts1_shutter_status(v, 7); n8 = ts1_shutter_status(v, 8); n9 = ts1_shutter_status(v, 9); free(tmp); tmp = xml_parse(buffer, "SHUTS"); v = atoi((const char *)tmp); s1 = ts1_shutter_status(v, 1); s2 = ts1_shutter_status(v, 2); s3 = ts1_shutter_status(v, 3); s4 = ts1_shutter_status(v, 4); s5 = ts1_shutter_status(v, 5); s6 = ts1_shutter_status(v, 6); s7 = ts1_shutter_status(v, 7); s8 = ts1_shutter_status(v, 8); s9 = ts1_shutter_status(v, 9); free(tmp); lock(); epicsTimeFromTime_t(&m_timestamp, timer); setDoubleParam(P_BeamTS1, beamts1); setDoubleParam(P_BeamTS2, beamts2); setDoubleParam(P_BeamEPB1, beamepb1); setDoubleParam(P_MethaneTS1, mtempts1); setDoubleParam(P_HydrogenTS1, htempts1); setDoubleParam(P_BeamSynch, beamsynch); setDoubleParam(P_FreqSynch, freqsynch); setDoubleParam(P_TotalTS1, totalts1); setDoubleParam(P_FreqTS2, freqts2); setDoubleParam(P_TotalTS2, totalts2); setDoubleParam(P_DeMethaneTS2, demethanets2); setDoubleParam(P_MethaneTS2, methanets2); setDoubleParam(P_HydrogenTS2, hydrogents2); setDoubleParam(P_MuonKick, muonkick); setStringParam(P_OnTS1, onts1); setStringParam(P_OffTS1, offts1); setStringParam(P_OnTS2, onts2); setStringParam(P_OffTS2, offts2); free(onts1); free(offts1); free(onts2); free(offts2); setStringParam(m_blparams["SHUT_N1"], n1); setStringParam(m_blparams["SHUT_N2"], n2); setStringParam(m_blparams["SHUT_N3"], n3); setStringParam(m_blparams["SHUT_N4"], n4); setStringParam(m_blparams["SHUT_N5"], n5); setStringParam(m_blparams["SHUT_N6"], n6); setStringParam(m_blparams["SHUT_N7"], n7); setStringParam(m_blparams["SHUT_N8"], n8); setStringParam(m_blparams["SHUT_N9"], n9); setStringParam(m_blparams["SHUT_S1"], s1); setStringParam(m_blparams["SHUT_S2"], s2); setStringParam(m_blparams["SHUT_S3"], s3); setStringParam(m_blparams["SHUT_S4"], s4); setStringParam(m_blparams["SHUT_S5"], s5); setStringParam(m_blparams["SHUT_S6"], s6); setStringParam(m_blparams["SHUT_S7"], s7); setStringParam(m_blparams["SHUT_S8"], s8); setStringParam(m_blparams["SHUT_S9"], s9); setStringParam(m_blparams["SHUT_E1"], e1); setStringParam(m_blparams["SHUT_E2"], e2); setStringParam(m_blparams["SHUT_E3"], e3); setStringParam(m_blparams["SHUT_E4"], e4); setStringParam(m_blparams["SHUT_E5"], e5); setStringParam(m_blparams["SHUT_E6"], e6); setStringParam(m_blparams["SHUT_E7"], e7); setStringParam(m_blparams["SHUT_E8"], e8); setStringParam(m_blparams["SHUT_E9"], e9); setStringParam(m_blparams["SHUT_W1"], w1); setStringParam(m_blparams["SHUT_W2"], w2); setStringParam(m_blparams["SHUT_W3"], w3); setStringParam(m_blparams["SHUT_W4"], w4); setStringParam(m_blparams["SHUT_W5"], w5); setStringParam(m_blparams["SHUT_W6"], w6); setStringParam(m_blparams["SHUT_W7"], w7); setStringParam(m_blparams["SHUT_W8"], w8); setStringParam(m_blparams["SHUT_W9"], w9); setStringParam(m_blparams["SMODE_E1"], em1); setStringParam(m_blparams["SMODE_E2"], em2); setStringParam(m_blparams["SMODE_E3"], em3); setStringParam(m_blparams["SMODE_E4"], em4); setStringParam(m_blparams["SMODE_E5"], em5); setStringParam(m_blparams["SMODE_E6"], em6); setStringParam(m_blparams["SMODE_E7"], em7); setStringParam(m_blparams["SMODE_E8"], em8); setStringParam(m_blparams["SMODE_E9"], em9); setStringParam(m_blparams["SMODE_W1"], wm1); setStringParam(m_blparams["SMODE_W2"], wm2); setStringParam(m_blparams["SMODE_W3"], wm3); setStringParam(m_blparams["SMODE_W4"], wm4); setStringParam(m_blparams["SMODE_W5"], wm5); setStringParam(m_blparams["SMODE_W6"], wm6); setStringParam(m_blparams["SMODE_W7"], wm7); setStringParam(m_blparams["SMODE_W8"], wm8); setStringParam(m_blparams["SMODE_W9"], wm9); setStringParam(P_UpdateTime, time_buffer); setIntegerParam(P_UpdateTimeT, timer); callParamCallbacks(); unlock(); } } else { epicsThreadSleep(3.0); } } }
int main(int argc, char* argv[]) { int fifo_fp = -1; int udp_sock = -1; int tcp_sock = -1; int tcp_client_sock = -1; int max_sock = -1; struct sockaddr_in my_addr; struct sockaddr_in peer_addr; struct sockaddr_in receiver_addr; int addr_len; char resp_msg_buf[512]; char data_msg_buf[1024]; int len; fd_set fd_r; int gst_in_fp = -1; int gst_out_fp = -1; pid_t gst_pid = -1; int just_connect = 0; char *gst_sink; int no_data_count = 0; if (argc != 2 || strlen(argv[1]) <= 0) { perror("Missing sink setting"); return -1; } gst_sink = argv[1]; printf("Using sink: %s\n", gst_sink); #if USE_FIFO unlink(FIFO_PATH); if (mkfifo(FIFO_PATH, 0666) < 0) { perror("Error when creating fifo"); return 0; } #endif #ifdef CLIENT_MODE if ((tcp_client_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Error when creating tcp socket"); return 0; } memset((char *)&peer_addr, 0, sizeof(peer_addr)); peer_addr.sin_family = AF_INET; peer_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); peer_addr.sin_port = htons(LOCAL_SERVER_PORT); if (connect(tcp_client_sock, (const struct sockaddr *)&peer_addr, sizeof(peer_addr)) < 0) { perror("Error when connecting to remote"); return 0; } if (send(tcp_client_sock, "mirror\n", 7, 0) < 0) { perror("Error when sending mirror command"); return 0; } just_connect = 1; #else udp_sock = setup_udp_socket(); if ((tcp_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Error when creating tcp socket"); return 0; } memset((char *)&my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_addr.s_addr = htonl(INADDR_ANY); my_addr.sin_port = htons(DISCOVER_PORT); if (bind(tcp_sock, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0) { perror("Error when binding tcp socket"); return 0; } if (listen(tcp_sock, 3) < 0) { perror("Error when listening tcp socket"); return 0; } #endif for (;;) { int timeout = 0; struct timeval tv; // set connect timeout tv.tv_sec = 3; tv.tv_usec = 0; FD_ZERO(&fd_r); FD_SET(udp_sock, &fd_r); FD_SET(tcp_sock, &fd_r); if (tcp_sock > udp_sock) { max_sock = tcp_sock; } else { max_sock = udp_sock; } if (tcp_client_sock > 0) { FD_SET(tcp_client_sock, &fd_r); if (tcp_client_sock > max_sock) { max_sock = tcp_client_sock; } } switch (select(max_sock + 1, &fd_r, NULL, NULL, &tv)) { case -1: printf("error occur, %s\n", strerror(errno)); break; case 0: timeout = 1; default: { if (FD_ISSET(udp_sock, &fd_r)) { size_t aux[128 / sizeof(size_t)]; char broadcast_msg_buf[128]; struct iovec io; struct msghdr msg; struct cmsghdr *cmsg; io.iov_base = broadcast_msg_buf; io.iov_len = sizeof(broadcast_msg_buf); memset(&msg, 0, sizeof(msg)); msg.msg_iov = &io; msg.msg_iovlen = 1; msg.msg_control = aux; msg.msg_controllen = sizeof(aux); msg.msg_flags = 0; msg.msg_name = &peer_addr; msg.msg_namelen = sizeof(peer_addr); len = recvmsg(udp_sock, &msg, 0); if (len < 0) { printf("Error when receiving data from discover socket, errno: %s\n", strerror(errno)); close(udp_sock); udp_sock = setup_udp_socket(); break; } printf("Receive broadcast msg: %s from: %s:%d\n", broadcast_msg_buf, inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port)); if (!strncmp(broadcast_msg_buf, DISCOVER_MSG, 5)) { printf("Receive discover msg: %s, from: %s\n", broadcast_msg_buf, inet_ntoa(peer_addr.sin_addr)); for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) { if (cmsg->cmsg_level == IPPROTO_IP) { struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg); printf("Response discover msg with local ip: %s\n", inet_ntoa(i->ipi_spec_dst)); memset(resp_msg_buf, 0, sizeof(resp_msg_buf)); snprintf(resp_msg_buf, sizeof(resp_msg_buf), DISCOVER_MSG_TEMPLATE, DISCOVER_PORT, inet_ntoa(i->ipi_spec_dst), inet_ntoa(i->ipi_spec_dst)); if (sendto(udp_sock, resp_msg_buf, strlen(resp_msg_buf), 0, (struct sockaddr *)&peer_addr, sizeof(peer_addr)) < 0) { printf("Error when send discover response to peer\n"); } } } } } else if (FD_ISSET(tcp_sock, &fd_r)) { if (tcp_client_sock < 0) { addr_len = sizeof(peer_addr); tcp_client_sock = accept(tcp_sock, (struct sockaddr *)&peer_addr, &addr_len); if (tcp_client_sock < 0) { printf("Error when accepting client\n"); } else { just_connect = 1; printf("Accept peer addr: %s:%d\n", inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port)); if (!strncmp(gst_sink, "ffplay", 6)) { #if USE_FIFO const char *command[] = {"ffplay", "-framerate", "50", "-infbuf", "-framedrop", "-analyzeduration", "1", FIFO_PATH, NULL}; #else const char *command[] = {"ffplay", "-framerate", "50", "-infbuf", "-framedrop", "-analyzeduration", "1", "-", NULL}; #endif gst_pid = popen2(command, &gst_in_fp, &gst_out_fp); } else { #if USE_FIFO char location_buf[32] = {0}; strcat(location_buf, "location="); strcat(location_buf, FIFO_PATH); #ifdef VPUDEC const char *command[] = {"gst-launch-0.10", "filesrc", location_buf, "!", "video\/x-h264,width=800,height=480,framerate=30\/1", "!", "vpudec", "framedrop=true", "frame-plus=1", "low-latency=true", "!", gst_sink, NULL}; #else const char *command[] = {"gst-launch-1.0", "filesrc", location_buf, "!", "h264parse", "!", "decodebin", "!", gst_sink, NULL}; #endif #else #ifdef VPUDEC const char *command[] = {"gst-launch-0.10", "fdsrc", "!", "video\/x-h264,width=800,height=480,framerate=30\/1", "!", "vpudec", "framedrop=true", "frame-plus=1", "low-latency=true", "!", gst_sink, NULL}; #else const char *command[] = {"gst-launch-1.0", "fdsrc", "!", "h264parse", "!", "decodebin", "!", gst_sink, NULL}; //const char *command[] = {"gst-launch-1.0", "fdsrc", "!", "video\/x-h264,width=800,height=480,framerate=0\/1,stream-format=avc", "!", "avdec_h264", "!", gst_sink, NULL}; #endif #endif gst_pid = popen2(command, &gst_in_fp, &gst_out_fp); } printf("gst pid: %d\n", gst_pid); #if USE_FIFO fifo_fp = open(FIFO_PATH, O_WRONLY); printf("fifo_fp: %d\n", fifo_fp); #endif } } else { printf("Could not accept client, another connection still exist\n"); } } else if (tcp_client_sock > 0 && FD_ISSET(tcp_client_sock, &fd_r)) { memset(data_msg_buf, 0, sizeof(data_msg_buf)); len = read(tcp_client_sock, data_msg_buf, sizeof(data_msg_buf)); //printf("Receive data len: %d\n", len); if (len < 0 || no_data_count > 2) { printf("Failed to receive from tcp client socket, close the socket\n"); close(tcp_client_sock); tcp_client_sock = -1; if (gst_pid > 0) { kill(gst_pid, SIGKILL); waitpid(gst_pid, NULL, 0); gst_pid = -1; gst_in_fp = -1; gst_out_fp = -1; } if (fifo_fp > 0) { close(fifo_fp); fifo_fp = -1; } #ifdef CLIENT_MODE return 0; #endif } else { if (len > 0) { no_data_count = 0; } else { no_data_count++; } if (just_connect && strstr(data_msg_buf, "\r\n")) { int width = 800; int height = 480; printf("Receive control data(%u): %s\n", len, data_msg_buf); char *control_end = strstr(data_msg_buf, "\r\n\r\n"); int bdata_len = 0; if (control_end + 4 - data_msg_buf > 0) { bdata_len = len - (control_end + 4 - data_msg_buf); control_end = control_end + 4; } char *info = strtok(data_msg_buf, "\r\n"); while (info) { //printf("info: %s\n", info); if (strstr(info, "X-WIDTH:")) { width = atoi(strstr(info, " ")); printf("width: %d\n", width); } if (strstr(info, "X-HEIGHT:")) { height = atoi(strstr(info, " ")); printf("height: %d\n", height); } info = strtok(NULL, "\r\n"); } if (!strncmp(gst_sink, "ffplay", 6)) { #if USE_FIFO const char *command[] = {"ffplay", "-framerate", "50", "-infbuf", "-framedrop", "-analyzeduration", "1", FIFO_PATH, NULL}; #else const char *command[] = {"ffplay", "-framerate", "50", "-infbuf", "-framedrop", "-analyzeduration", "1", "-", NULL}; #endif gst_pid = popen2(command, &gst_in_fp, &gst_out_fp); } else { #if USE_FIFO char location_buf[32] = {0}; strcat(location_buf, "location="); strcat(location_buf, FIFO_PATH); #ifdef VPUDEC char mime_buf[70] = {0}; snprintf(mime_buf, 70, "video\/x-h264,width=%d,height=%d,framerate=30\/1", width, height); //snprintf(mime_buf, 70, "video\/x-h264,width=%d,height=%d,framerate=30\/1,stream-format=avc", width, height); printf("Using cap: %s\n", mime_buf); const char *command[] = {"gst-launch-0.10", "filesrc", location_buf, "!", mime_buf, "!", "vpudec", "framedrop=true", "frame-plus=1", "low-latency=true", "!", gst_sink, NULL}; #else const char *command[] = {"gst-launch-1.0", "filesrc", location_buf, "!", "h264parse", "!", "decodebin", "!", gst_sink, NULL}; #endif #else #ifdef VPUDEC char mime_buf[70] = {0}; snprintf(mime_buf, 70, "video\/x-h264,width=%d,height=%d,framerate=30\/1", width, height); //snprintf(mime_buf, 70, "video\/x-h264,width=%d,height=%d,framerate=30\/1,stream-format=avc", width, height); printf("Using cap: %s\n", mime_buf); const char *command[] = {"gst-launch-0.10", "fdsrc", "do-timestamp=true", "!", mime_buf, "!", "vpudec", "framedrop=false", "frame-plus=1", "low-latency=true", "!", gst_sink, NULL}; #else const char *command[] = {"gst-launch-1.0", "fdsrc", "!", "h264parse", "!", "decodebin", "!", gst_sink, NULL}; #endif #endif gst_pid = popen2(command, &gst_in_fp, &gst_out_fp); } printf("gst pid: %d\n", gst_pid); printf("gst in fp: %d\n", gst_in_fp); #if USE_FIFO fifo_fp = open(FIFO_PATH, O_WRONLY); printf("fifo_fp: %d\n", fifo_fp); #endif just_connect = 0; if (bdata_len > 0) { #if USE_FIFO if (fifo_fp > 0) { len = write(fifo_fp, control_end, bdata_len); printf("Write non control data len: %d\n", len); } #else if (gst_in_fp > 0) { len = write(gst_in_fp, control_end, bdata_len); printf("Write non control data len: %d\n", len); } #endif } } else { #if USE_FIFO if (fifo_fp > 0) {