Streaming engines best practice in C

126 views Asked by At

LANG: C / ENV: Linux

I am developing a streaming engine, for now I am able to start, stop and pause the stream, but seeking is the operation that's giving me a lot of headache, I already asked a question here before and fixed some issues inside the code from the answers.

Using lseek() function, I am passing the open streaming file descriptor as first argument, plus I am using UDP for transmitting, something like the following code:

transport_fd = open(tsfile, O_RDONLY);
int offset = 1024;
off_t offsetIndicator;
if ((offsetIndicator=lseek(transport_fd, offset, SEEK_CUR))<0) printf("Error seeking\n");

Whenever I try to seek while streaming, the streaming stops and the pictures hangs.

Is there anything I should pay attention to?, i.e: like attempting to sleep() or nanosleep() after seeking into the file in order for the changes to take effect.

I couldn't find examples, papers or realted articles for best practices in such engines.

EDIT:

After testing, it seems like the file continued to stream but receiving devices on the network didn't catch the stream connection anymore, and calculating the time it took to finish after subtract seeking time, the stream seems to be finished normally.

CODE SNIPPET:

while (!completed) 
{
    while (/* Comparing conditions */ && !completed)
    { 
        if (seekLck == 1) // seekLck is a semaphore to test seek signal from father process initiated by 0
        {
            int offset = 1024;
            off_t offsetIndicator;
            if ((offsetIndicator=lseek(transport_fd, offset, SEEK_CUR))<0) 
                printf("Error seeking\n");
            nanosleep(&nano_sleep_packet, 0); //Try to sleep to see if it is still hanging, didn't work 
            seekLck = 0;
        }   
        len = read(transport_fd, send_buf, packet_size);
        if(len < 0) {
            fprintf(stderr, "File read error \n");
            completed = 1;
        } 
        else if (len == 0)
        {
            fprintf(stderr, "Sent done\n");
            completed = 1;
        }
        else
        {
            sent = sendto(sockfdstr, send_buf, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
            if(sent <= 0)
            {
                perror("send(): error ");
                completed = 1;
            }
        }
    }
    nanosleep(&nano_sleep_packet, 0);
}
close(transport_fd);
close(sockfdstr);
free(send_buf);
printf("cleaning up\n");
return 0;
}
1

There are 1 answers

0
Ash On BEST ANSWER

The main question was "Why isn't the file being streamed (Played) even when lseek() is working fine?"...

Actually nothing was wrong from the server side, but even though, the clients weren't able to continue streaming after losing the frame count (streaming ffmpeg frames, clients are getting the stream from a video scrambler).

What worked for me in this situation is getting the socket parameter and killing (in a clean way) the process that needs to be seeked in while holding the stream position, after that start a totally new stream from the seek position with the same socket parameter so it replaces the old one.

I hope this will help someone out there especially that there's no much documentation about those stuff.