Reducing Latency

master
F5OEO 2016-09-12 16:12:39 +00:00
rodzic db1f79f409
commit c8d940e961
4 zmienionych plików z 46 dodań i 14 usunięć

2
pes.c
Wyświetl plik

@ -2474,7 +2474,7 @@ extern int calc_mpeg1_pes_offset(byte *data, int data_len)
* *
* - `packet` is the PES packet datastructure * - `packet` is the PES packet datastructure
*/ */
static inline void setup_PES_as_ES(PES_packet_data_p packet) extern void setup_PES_as_ES(PES_packet_data_p packet)
{ {
byte stream_id; byte stream_id;
int offset; int offset;

Wyświetl plik

@ -32,6 +32,9 @@
#include "pes_defns.h" #include "pes_defns.h"
#include "es_defns.h" #include "es_defns.h"
extern void setup_PES_as_ES(PES_packet_data_p packet);
/* /*
* Free a PES packet datastructure * Free a PES packet datastructure
* *

53
ts2es.c
Wyświetl plik

@ -88,7 +88,8 @@ static int extract_av_via_pes(char *input_name,
return 1; return 1;
} }
err = open_PES_reader(input_name,!quiet,!quiet,&reader); //err = open_PES_reader(input_name,!quiet,!quiet,&reader);
err= open_PES_reader_for_TS(input_name,0,!quiet,!quiet,&reader);
if (err) if (err)
{ {
fprint_err("### Error opening file %s\n",input_name); fprint_err("### Error opening file %s\n",input_name);
@ -97,9 +98,11 @@ static int extract_av_via_pes(char *input_name,
} }
set_PES_reader_video_only(reader,TRUE); set_PES_reader_video_only(reader,TRUE);
// Wrap our PES stream up as an ES stream // Wrap our PES stream up as an ES stream
err = build_elementary_stream_PES(reader,&es); /* err = build_elementary_stream_PES(reader,&es);
if (err) if (err)
{ {
print_err("### Error trying to build ES reader from PES reader\n"); print_err("### Error trying to build ES reader from PES reader\n");
@ -107,11 +110,17 @@ static int extract_av_via_pes(char *input_name,
(void) fclose(output); (void) fclose(output);
return 1; return 1;
} }
*/
for (;;) for (;;)
{ {
ES_unit_p unit; PES_packet_data_p packet;
err = find_and_build_next_ES_unit(es,&unit); err= read_next_PES_packet(reader);
//ES_unit_p unit;
//err = find_and_build_next_ES_unit(&reader);
print_err("*");
if (err == EOF) if (err == EOF)
break; break;
else if (err) else if (err)
@ -119,11 +128,26 @@ static int extract_av_via_pes(char *input_name,
print_err("### Error reading next ES unit\n"); print_err("### Error reading next ES unit\n");
(void) fclose(output); (void) fclose(output);
(void) close_PES_reader(&reader); (void) close_PES_reader(&reader);
close_elementary_stream(&es);
return 1; return 1;
} }
err = write_ES_unit(output,unit); packet = reader->packet;
if (err) if(packet->has_PTS==1)
{
int GotPts;
uint64_t pts;
find_PTS_in_PES(packet->data,
packet->data_len,
&GotPts,
&pts);
printf("PTS = %llu\n",pts);
}
setup_PES_as_ES(packet);
int written = fwrite(packet->es_data,packet->es_data_len,1,output);
//err = write_ES_unit(output,unit);
/*if (err)
{ {
print_err("### Error writing ES unit out to file\n"); print_err("### Error writing ES unit out to file\n");
free_ES_unit(&unit); free_ES_unit(&unit);
@ -131,10 +155,10 @@ static int extract_av_via_pes(char *input_name,
(void) close_PES_reader(&reader); (void) close_PES_reader(&reader);
close_elementary_stream(&es); close_elementary_stream(&es);
return 1; return 1;
} }*/
free_ES_unit(&unit); //free_ES_unit(&unit);
} }
(void) fclose(output); // naughtily ignore the return code (void) fclose(output); // naughtily ignore the return code
(void) close_PES_reader(&reader); // naughtily ignore the return code (void) close_PES_reader(&reader); // naughtily ignore the return code
close_elementary_stream(&es); close_elementary_stream(&es);
@ -234,6 +258,7 @@ static int extract_pid_packets(TS_reader_p tsreader,
} }
data = &payload[offset]; data = &payload[offset];
data_len = payload_len-offset; data_len = payload_len-offset;
if (verbose) print_data(TRUE,"data",data,data_len,1000); if (verbose) print_data(TRUE,"data",data,data_len,1000);
} }
else else
@ -251,6 +276,7 @@ static int extract_pid_packets(TS_reader_p tsreader,
if (got_pes_packet_len) if (got_pes_packet_len)
{ {
// Try not to write more data than the PES packet declares // Try not to write more data than the PES packet declares
if (data_len > pes_packet_len) if (data_len > pes_packet_len)
{ {
@ -265,7 +291,10 @@ static int extract_pid_packets(TS_reader_p tsreader,
if (data_len > 0) if (data_len > 0)
{ {
// Windows doesn't seem to like writing 0 bytes, so be careful... // Windows doesn't seem to like writing 0 bytes, so be careful...
//printf("ES=%d\n",data_len);
written = fwrite(data,data_len,1,output); written = fwrite(data,data_len,1,output);
fflush(output);
if (written != 1) if (written != 1)
{ {
fprint_err("### Error writing TS packet - units written = %d\n", fprint_err("### Error writing TS packet - units written = %d\n",
@ -603,11 +632,11 @@ int main(int argc, char **argv)
print_err("### ts2es: -stdout is not supported with -pes\n"); print_err("### ts2es: -stdout is not supported with -pes\n");
return 1; return 1;
} }
if (use_pes && use_stdin) /*if (use_pes && use_stdin)
{ {
print_err("### ts2es: -stdin is not supported with -pes\n"); print_err("### ts2es: -stdin is not supported with -pes\n");
return 1; return 1;
} }*/
if (use_pes) if (use_pes)
{ {
err = extract_av_via_pes(input_name,output_name,(extract==EXTRACT_VIDEO), err = extract_av_via_pes(input_name,output_name,(extract==EXTRACT_VIDEO),

Wyświetl plik

@ -93,7 +93,7 @@ typedef struct _ts_pcr_buffer *TS_pcr_buffer_p;
// ------------------------------------------------------------ // ------------------------------------------------------------
// The number of TS packets to read ahead // The number of TS packets to read ahead
#define TS_READ_AHEAD_COUNT 1024 // aim for multiple of block boundary -- used to be 50 #define TS_READ_AHEAD_COUNT 7 // aim for multiple of block boundary -- used to be 50
// Thus the number of bytes to read ahead // Thus the number of bytes to read ahead
#define TS_READ_AHEAD_BYTES TS_READ_AHEAD_COUNT*TS_PACKET_SIZE #define TS_READ_AHEAD_BYTES TS_READ_AHEAD_COUNT*TS_PACKET_SIZE