#StackBounty: #c #raspivid popen() vs netcat

Bounty: 50

I’m writing a RPi based surveillance solution that, among other things, starts video feeds on demand.
In my very first attempt I wrote a pretty simple TCP server that listen for a connection collect the command from the client then if the command require a video feeds it forks the process and spawn a video streaming using this command line:

raspivid -n -ih -t 0 -rot 90 -w 640 -h 480 -fps 25 -b 2000000 -l -o - | nc -l -p 5000

Such command is spawned trough the following function:

void spawn_child(const char* script)
{
  child = true;
  setpgid(0, 0);
  openlog (process_name, LOG_PID | LOG_ODELAY, LOG_LOCAL0);
  syslog(LOG_INFO, "spawned: %s", script);        
  system(script);
  exit_cond = TERMINATE; 
}

where script parameter is set as the command line above…

Now I would like to have a little more control over the script running for this reason I tought to use popen() instead netcat.

This’s the new spawn_child function:

void spawn_child(const char* script)
{
  child = true;
  setpgid(0, 0);
  openlog (process_name, LOG_PID | LOG_ODELAY, LOG_LOCAL0);
  syslog(LOG_INFO, "spawned : %s", script);     
  
  syslog(LOG_INFO,"CREATING SOCKET");
  accept_socket = create_socket(video_port);
  
  video_socket = accept(accept_socket, 0, 0);
  
  syslog(LOG_INFO,"CLIENT CONNECTED");
  
  streamVideo = popen(script,"r");
      
  while(!feof(streamVideo) && !terminate)
  {
    int bytes;

    bytes = fread(video_buff, BUF_SIZE, 1, streamVideo);
        
    if(bytes > 0)
      write(video_socket,video_buff,bytes);
  }

  close(video_socket);
  pclose(streamVideo);
  
  exit_cond = TERMINATE; 
}

Of course in this case the script parameter become:

raspivid -n -ih -t 0 -rot 90 -w 640 -h 480 -fps 25 -b 2000000 -l -o -

I don’t think is the correct solution since both reading and writing calls should be managed with a different approach (threading?) but what I observe right now is a much slower output rate (of the streaming) compared with the netcat solution. Is this performance degradation due to my code structure, delays between read() and write() calls, or there’s something more I forgot?

What’s a better approach to fix this? Threading? read() and write() non blocking?


Get this bounty!!!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.