示例#1
0
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;
}
示例#2
0
void inline amf_read_str(const uint8_t *b, AVal *a)
{
    AMF_DecodeString((const char *)b, a);
}