[nut]: r193 - in trunk: libnut/muxer.c libnut/nut.h nututils/nutmerge.c

Author: ods15 Date: Tue Nov 7 19:28:25 2006 New Revision: 193 Modified: trunk/libnut/muxer.c trunk/libnut/nut.h trunk/nututils/nutmerge.c Log: add realtime_stream option for muxer. Effect is allowed use of nut_write_info(), writing of each NUT packet individually, and writing the entire NUT headers only once, at init, in the first packet to write() function. No index writing. Cost - memcpy for ALL frame data in order too prepend to it the frame headers. Modified: trunk/libnut/muxer.c ============================================================================== --- trunk/libnut/muxer.c (original) +++ trunk/libnut/muxer.c Tue Nov 7 19:28:25 2006 @@ -12,7 +12,7 @@ } static void flush_buf(output_buffer_t * bc) { - assert(!bc->is_mem); + assert(bc->osc.write); bc->file_pos += bc->osc.write(bc->osc.priv, bc->buf_ptr - bc->buf, bc->buf); bc->buf_ptr = bc->buf; } @@ -457,6 +457,7 @@ } static void check_header_repetition(nut_context_t * nut) { + if (nut->mopts.realtime_stream) return; if (bctello(nut->o) >= (1 << 23)) { int i; // ### magic value for header repetition for (i = 24; bctello(nut->o) >= (1 << i); i++); @@ -501,9 +502,13 @@ if ((fd->flags & NUT_FLAG_KEY) && !sc->last_key) sc->last_key = fd->pts + 1; if (fd->flags & NUT_FLAG_EOR) sc->eor = fd->pts + 1; else sc->eor = 0; + + if (nut->mopts.realtime_stream) flush_buf(nut->o); } void nut_write_info(nut_context_t * nut, const nut_info_packet_t * info) { + if (!nut->mopts.realtime_stream) return; + nut->last_headers = bctello(nut->o); // to force syncpoint writing after the info header put_info(nut, info); } @@ -517,6 +522,7 @@ else nut = malloc(sizeof(nut_context_t)); nut->mopts = *mopts; + if (nut->mopts.realtime_stream) nut->mopts.write_index = 0; nut->alloc = &nut->mopts.alloc; @@ -531,6 +537,8 @@ nut->tmp_buffer2 = new_mem_buffer(nut->alloc); // for packet_headers nut->max_distance = mopts->max_distance; + if (nut->mopts.realtime_stream) nut->o->is_mem = 1; + if (nut->max_distance > 65536) nut->max_distance = 65536; { @@ -649,6 +657,8 @@ put_headers(nut); + if (nut->mopts.realtime_stream) flush_buf(nut->o); + return nut; } @@ -657,8 +667,10 @@ int total = 0; if (!nut) return; - while (nut->headers_written < 2) put_headers(nut); // force 3rd copy of main headers - put_headers(nut); + if (!nut->mopts.realtime_stream) { + while (nut->headers_written < 2) put_headers(nut); // force 3rd copy of main headers + put_headers(nut); + } if (nut->mopts.write_index) put_index(nut); for (i = 0; i < nut->stream_count; i++) { Modified: trunk/libnut/nut.h ============================================================================== --- trunk/libnut/nut.h (original) +++ trunk/libnut/nut.h Tue Nov 7 19:28:25 2006 @@ -75,6 +75,7 @@ nut_output_stream_t output; nut_alloc_t alloc; int write_index; + int realtime_stream; // implies no write_index int max_distance; frame_table_input_t * fti; } nut_muxer_opts_t; Modified: trunk/nututils/nutmerge.c ============================================================================== --- trunk/nututils/nutmerge.c (original) +++ trunk/nututils/nutmerge.c Tue Nov 7 19:28:25 2006 @@ -127,6 +127,7 @@ mopts.output = (nut_output_stream_t){ .priv = out, .write = NULL }; mopts.write_index = 1; + mopts.realtime_stream = 0; mopts.fti = ft_default; mopts.max_distance = 32768; mopts.alloc.malloc = NULL;
participants (1)
-
ods15