Ejemplo n.º 1
0
int main (int argc, char *argv[]) {

    int sockfd;
    int len;
    int sent;
    int transport_fd;
    struct sockaddr_in addr;
    unsigned long int packet_size;
    char* tsfile;
    unsigned char* send_buf;
    unsigned int bitrate;
    unsigned long long int packet_time;
    unsigned long long int real_time;
    struct timeval time_start;
    struct timeval time_stop;
    struct timespec nano_sleep_packet;

    memset(&addr, 0, sizeof(addr));
    memset(&time_start, 0, sizeof(time_start));
    memset(&time_stop, 0, sizeof(time_stop));
    memset(&nano_sleep_packet, 0, sizeof(nano_sleep_packet));

    if(argc < 5 ) {
        fprintf(stderr, "Usage: %s file.ts ipaddr port bitrate [ts_packet_per_ip_packet]\n", argv[0]);
        fprintf(stderr, "ts_packet_per_ip_packet default is 7\n");
        fprintf(stderr, "bit rate refers to transport stream bit rate\n");
        fprintf(stderr, "zero bitrate is 100.000.000 bps\n");
        return 0;
    } else {
        tsfile = argv[1];
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr(argv[2]);
        addr.sin_port = htons(atoi(argv[3]));
        bitrate = atoi(argv[4]);
        if (bitrate <= 0) {
            bitrate = 100000000;
        }
        if (argc >= 6) {
            packet_size = strtoul(argv[5], 0, 0) * TS_PACKET_SIZE;
        } else {
            packet_size = 7 * TS_PACKET_SIZE;
        }
    }

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0) {
        perror("socket(): error ");
        return 0;
    }

    transport_fd = open(tsfile, O_RDONLY);
    if(transport_fd < 0) {
        fprintf(stderr, "can't open file %s\n", tsfile);
        close(sockfd);
        return 0;
    }

    int completed = 0;
    send_buf = malloc(packet_size);
    packet_time = 0;
    real_time = 0;

    gettimeofday(&time_start, 0);
    while (!completed) {

        gettimeofday(&time_stop, 0);
        real_time = usecDiff(&time_stop, &time_start);
        if (real_time * bitrate > packet_time * 1000000) { /* theorical bits against sent bits */
            len = read(transport_fd, send_buf, packet_size);
            if(len < 0) {
                fprintf(stderr, "ts file read error \n");
                completed = 1;
            } else if (len == 0) {
                fprintf(stderr, "ts sent done\n");
                completed = 1;
            } else {
                sent = sendto(sockfd, send_buf, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
                if(sent <= 0) {
                    perror("send(): error ");
                    completed = 1;
                } else {
                    packet_time += packet_size * 8;
                }
            }
        } else {
            nanosleep(&nano_sleep_packet, 0);
        }
    }

    close(transport_fd);
    close(sockfd);
    free(send_buf);
    return 0;
}
Ejemplo n.º 2
0
int main (int argc, char *argv[]) {
    
    int sockfd;
    int len;
    int sent;
    int ret;
    int is_multicast;
    int transport_fd;
    unsigned char option_ttl;
    char start_addr[4];
    struct sockaddr_in addr;
    unsigned long int packet_size;   
    char* tsfile;
    unsigned char* send_buf;
    unsigned int bitrate;
    unsigned long long int packet_time;
    unsigned long long int real_time;    
    struct timespec time_start;
    struct timespec time_stop;
    struct timespec nano_sleep_packet;
    
    memset(&addr, 0, sizeof(addr));
    memset(&time_start, 0, sizeof(time_start));
    memset(&time_stop, 0, sizeof(time_stop));
    memset(&nano_sleep_packet, 0, sizeof(nano_sleep_packet));

    if(argc < 5 ) {
	fprintf(stderr, "Usage: %s file.ts ipaddr port bitrate [ts_packet_per_ip_packet] [udp_packet_ttl]\n", argv[0]);
	fprintf(stderr, "ts_packet_per_ip_packet default is 7\n");
	fprintf(stderr, "bit rate refers to transport stream bit rate\n");
	fprintf(stderr, "zero bitrate is 100.000.000 bps\n");
	return 0;
    } else {
	tsfile = argv[1];
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr(argv[2]);
	addr.sin_port = htons(atoi(argv[3]));
	bitrate = atoi(argv[4]);
	if (bitrate <= 0) {
	    bitrate = 100000000;
	}
	if (argc >= 6) {
	    packet_size = strtoul(argv[5], 0, 0) * TS_PACKET_SIZE;
	} else {
	    packet_size = 7 * TS_PACKET_SIZE;
	}
    }

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0) {
	perror("socket(): error ");
	return 0;
    } 
    
    if (argc >= 7)  {
	option_ttl = atoi(argv[6]);
	is_multicast = 0;
	memcpy(start_addr, argv[2], 3);
	start_addr[3] = 0;
	is_multicast = atoi(start_addr);
	is_multicast = (is_multicast >= 224) || (is_multicast <= 239);
	if (is_multicast) {
	    ret = setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &option_ttl, sizeof(option_ttl));
	} else {
	    ret = setsockopt(sockfd, IPPROTO_IP, IP_TTL, &option_ttl, sizeof(option_ttl));
	}
	
	if(ret < 0) {
	    perror("ttl configuration fail");
	}
	
    }
    
    transport_fd = open(tsfile, O_RDONLY);
    if(transport_fd < 0) {
	fprintf(stderr, "can't open file %s\n", tsfile);
	close(sockfd);
	return 0;
    } 
    
    int completed = 0;
    send_buf = malloc(packet_size);
    packet_time = 0;
    real_time = 0;
    
    nano_sleep_packet.tv_nsec = 665778; /* 1 packet at 100mbps*/
 
    
    int64_t  sleep_time = 0;
    clock_gettime(CLOCK_MONOTONIC, &time_start);
    
    while (!completed) {
    
	    clock_gettime(CLOCK_MONOTONIC, &time_start);
	    
	    //while (real_time * bitrate > packet_time * 1000000 && !completed)
	   
	    
	    int left_len = 5 * bitrate/1000/8/188*188;
	    while(left_len >0)
	    { 
		    len = read(transport_fd, send_buf, packet_size);
		    left_len -=len;
		    if(len < 0) {
		        fprintf(stderr, "ts file read error \n");
		        completed = 1;
		    } else if (len == 0) {
		        fprintf(stderr, "ts sent done\n");
	    	    completed = 1;
		    } else {
		        sent = sendto(sockfd, send_buf, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
		        if(sent <= 0) {
			        perror("send(): error ");
			        completed = 1;
		        } else {
			        packet_time += packet_size * 8;			        
		        }
		    }
		  
	    }
	    clock_gettime(CLOCK_MONOTONIC, &time_stop);
	    real_time = usecDiff(&time_stop, &time_start);
	    printf("real_time:%d\n",real_time);
	    
	    //sleep_time = 5*1000-real_time;
	    sleep_time =5*1000; 
	    if (sleep_time <=0)
	        sleep_time =0;
	    printf("sleep_time:%u\n",sleep_time);
	    usleep(sleep_time);
	    //nanosleep(&nano_sleep_packet, 0);
    }

    close(transport_fd);
    close(sockfd);
    free(send_buf);
    return 0;    
}