Skip to content

Commit

Permalink
Enable reading srts from a pipe
Browse files Browse the repository at this point in the history
  • Loading branch information
Matthew Szatmary committed Apr 13, 2017
1 parent 463c37a commit c2d0ee2
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 32 deletions.
116 changes: 84 additions & 32 deletions examples/flv+srt.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,38 +21,86 @@
/* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN */
/* THE SOFTWARE. */
/**********************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "srt.h"
#include "flv.h"
#include "avc.h"
// #include "sei.h"

#define MAX_SRT_SIZE (10*1024*1024)
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAX_SRT_SIZE (1*1024*1024)

// TODO replace this with utf8_load_text_file
srt_t* srt_from_file (const char* path)
// retunes number of bytes read
// negative number on error
// retursn 0 on 'not ready' and 'eof'
// eof set to 1 on end, otherwise zero
size_t fd_read (int fd, uint8_t* data, size_t size, int* eof)
{
srt_t* head = 0;
fd_set rfds;
struct timeval tv;
int retval;

(*eof) = 0;
FD_ZERO (&rfds);
FD_SET (fd, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 1;
retval = select (fd+1, &rfds, NULL, NULL, &tv);

if (0 > retval) {
return retval;
}

// not ready
if (! (retval && FD_ISSET (fd, &rfds))) {
return 0;
}

size_t srt_size = 0;
utf8_char_t* srt_data = utf8_load_text_file (path, &srt_size);
retval = read (fd,data,size);

if (srt_size&&srt_data) {
head = srt_parse (srt_data,srt_size);
free (srt_data);
if (0 == retval) {
(*eof) = 1;
}

return head;
return retval;
}

size_t g_srt_size = 0;
utf8_char_t g_srt_data[MAX_SRT_SIZE];
srt_t* srt_from_fd (int fd)
{
char c;
int eof;

for (;;) {
int ret = fd_read (fd,&c,1,&eof);

if (eof || (1 == ret && 0 == c)) {
srt_t* srt = srt_parse (&g_srt_data[0],g_srt_size);
g_srt_size = 0;
return srt;
}

if (1 == ret) {
g_srt_data[g_srt_size] = c;
g_srt_size += 1;
} else {
return 0;
}
}
}

int main (int argc, char** argv)
{
flvtag_t tag;
double timestamp, clear_timestamp = 0;
srt_t* old_srt, *nxt_srt = 0;
double timestamp, offset, clear_timestamp = 0;
int has_audio, has_video;
FILE* flv = flv_open_read (argv[1]);
int fd = open (argv[2],O_RDWR);
FILE* out = flv_open_write (argv[3]);

flvtag_init (&tag);
Expand All @@ -62,27 +110,31 @@ int main (int argc, char** argv)
return EXIT_FAILURE;
}

srt_t* head = srt_from_file (argv[2]);
srt_t* srt = head;

if (! head) {
fprintf (stderr,"%s is not an srt file\n", argv[2]);
return EXIT_FAILURE;
}

flv_write_header (out,has_audio,has_video);

fprintf (stderr, "Reading flv from %s\n", argv[1]);
fprintf (stderr, "Reading captons from %s\n", argv[2]);
fprintf (stderr, "Writing flv to %s\n", argv[3]);

while (flv_read_tag (flv,&tag)) {
// TODO handle B frames better

if (flvtag_avcpackettype_nalu == flvtag_avcpackettype (&tag)) {
timestamp = flvtag_pts_seconds (&tag);
srt_t* new_srt = srt_from_fd (fd);
timestamp = flvtag_pts_seconds (&tag);

if (srt && srt->timestamp <= timestamp) {
fprintf (stderr,"T: %0.02f (%0.02fs):\n%s\n", srt->timestamp, srt->duration, srt_data (srt));
clear_timestamp = srt->timestamp + srt->duration;
flvtag_addcaption_text (&tag, srt_data (srt));
srt = srt->next;
if (new_srt) {
fprintf (stderr,"Loaded new SRT at time %f\n",timestamp);
srt_free (old_srt);
old_srt = new_srt;
nxt_srt = new_srt;
offset = timestamp;
}

if (flvtag_avcpackettype_nalu == flvtag_avcpackettype (&tag)) {
if (nxt_srt && (offset+nxt_srt->timestamp) <= timestamp) {
fprintf (stderr,"T: %0.02f (%0.02fs):\n%s\n", (offset+nxt_srt->timestamp), nxt_srt->duration, srt_data (nxt_srt));
clear_timestamp = (offset+nxt_srt->timestamp) + nxt_srt->duration;
flvtag_addcaption_text (&tag, srt_data (nxt_srt));
nxt_srt = nxt_srt->next;
} else if (0 <= clear_timestamp && clear_timestamp <= timestamp) {
fprintf (stderr, "T: %0.02f: [CAPTIONS CLEARED]\n", timestamp);
flvtag_addcaption_text (&tag, NULL);
Expand All @@ -93,7 +145,7 @@ int main (int argc, char** argv)
flv_write_tag (out,&tag);
}

srt_free (head);
srt_free (old_srt);
flvtag_free (&tag);
flv_close (flv);
flv_close (out);
Expand Down
4 changes: 4 additions & 0 deletions src/srt.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,10 @@ srt_t* srt_parse (const utf8_char_t* data, size_t size)
size_t line_length = 0, trimmed_length = 0;
int hh1, hh2, mm1, mm2, ss1, ss2, ms1, ms2;

if (!data||!size) {
return 0;
}

for (;;) {
line_length = 0;

Expand Down

0 comments on commit c2d0ee2

Please sign in to comment.