int main(int argc, char* argv[]) { char c, *inFile; inFile = NULL; sc_frame_rect rect; #ifndef _WIN32 signal(SIGPIPE, sig_pipe_handler); #endif while ((c = getopt (argc, argv, "w:h:u:r:f:")) != -1) { switch (c) { case 'w': rect.width = (uint16_t) atoi(optarg); break; case 'h': rect.height = (uint16_t) atoi(optarg); break; case 'u': streamUri = optarg; break; case 'r': roomName = optarg; break; case 'f': inFile = optarg; break; } } int fd; if(inFile) { printf("Started streamer with width: %i, height: %i, URI: %s, roomName: %s, File: %s\n", rect.width, rect.height, streamUri, roomName, inFile); fd = open(inFile, O_RDONLY); } else { printf("Started streamer with width: %i, height: %i, URI: %s, roomName: %s \n", rect.width, rect.height, streamUri, roomName); fd = fileno(stdin); } // main processing loop while(TRUE) { sc_bytestream_packet packet = sc_bytestream_get_event(fd); sc_mouse_coords coords; sc_frame frame; if(streamer.rtmp_setup == 1 && (!RTMP_IsConnected(streamer.rtmp) || RTMP_IsTimedout(streamer.rtmp))) { #ifdef _WIN32 sc_streamer_die(); #else sc_streamer_reconnect(&streamer); #endif } RTMPPacket rp = { 0 }; if(streamer.rtmp_setup == 1 && streamer.so_name != NULL && streamer.have_inital_SO != 1 && RTMP_ReadPacket(streamer.rtmp, &rp)) { if (RTMPPacket_IsReady(&rp) && rp.m_packetType == RTMP_PACKET_TYPE_SHARED_OBJECT) { AVal SO_name; AMF_DecodeString(rp.m_body, &SO_name); streamer.so_version = AMF_DecodeInt32(rp.m_body+2+SO_name.av_len); streamer.have_inital_SO = 1; } } switch(packet.header.type) { case STARTVIDEO: capture_rect = rect; start_time_stamp = packet.header.timestamp; streamer = sc_streamer_init_video(streamUri, roomName, capture_rect, start_time_stamp); break; case STOPVIDEO: sc_streamer_stop_video(&streamer); sc_streamer_teardown_windows(); exit(1); break; case STARTCURSOR: start_time_stamp = packet.header.timestamp; streamer = sc_streamer_init_cursor(streamUri, roomName, start_time_stamp); break; case STOPCURSOR: sc_streamer_stop_cursor(&streamer); sc_streamer_teardown_windows(); exit(1); break; case MOUSE: coords = parse_mouse_coords(packet); streamer.so_version++; sc_streamer_send_mouse_data(&streamer, &coords, packet.header.timestamp); break; case VIDEO: frame = parse_frame(packet); if((RTMP_IsConnected(streamer.rtmp) && !RTMP_IsTimedout(streamer.rtmp))) sc_streamer_send_frame(&streamer, &frame, packet.header.timestamp); free(frame.framePtr); break; case NO_DATA: default: exit(0); break; // maybe a wait is in order } } return 0; }
void inline amf_read_str(const uint8_t *b, AVal *a) { AMF_DecodeString((const char *)b, a); }