Skip to content

Commit 5fe5611

Browse files
authored
Don't clear the buffer. (#3719)
1 parent 1a76be0 commit 5fe5611

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

src/core/operators/muxer.ml

+13-12
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class muxer tracks =
101101
track_frames := (source, f) :: !track_frames;
102102
f
103103

104-
method private feed_track ~tmp ~filled ~start ~stop
104+
method private feed_track ~tmp ~generator_length ~start ~stop
105105
{ source_field; target_field; processor } =
106106
let c = Content.sub (Frame.get tmp source_field) start (stop - start) in
107107
match source_field with
@@ -111,31 +111,34 @@ class muxer tracks =
111111
(Content.Metadata.get_data c)
112112
| f when f = Frame.Fields.track_marks ->
113113
if Frame.is_partial tmp then
114-
Generator.add_track_mark ~pos:(stop - filled) self#buffer
114+
Generator.add_track_mark
115+
~pos:(generator_length + stop - start)
116+
self#buffer
115117
| _ -> Generator.put self#buffer target_field (processor c)
116118

117-
method private feed_fields ~filled { fields; source } =
119+
method private feed_fields ~generator_length { fields; source } =
118120
let tmp = self#track_frame source in
119121
let start = Frame.position tmp in
120122
if Frame.is_partial tmp && source#is_ready ~frame:tmp () then (
121123
source#get tmp;
122124
let stop = Frame.position tmp in
123-
List.iter (self#feed_track ~tmp ~filled ~start ~stop) fields)
125+
List.iter (self#feed_track ~tmp ~generator_length ~start ~stop) fields)
124126

125127
(* In the current streaming model, we might still need to force
126128
a source#get to get the next break/metadata at the beginning of
127129
a track.
128130
129131
TODO: get rid of this! *)
130132
method private feed ~force buf =
131-
let filled = Frame.position buf in
133+
let position = Frame.position buf in
134+
let generator_length = Generator.length self#buffer in
132135
if
133136
self#sources_ready
134137
&& (force
135138
|| Generator.remaining self#buffer = -1
136-
&& filled + Generator.length self#buffer < Lazy.force Frame.size)
139+
&& position + generator_length < Lazy.force Frame.size)
137140
then (
138-
List.iter (self#feed_fields ~filled) tracks;
141+
List.iter (self#feed_fields ~generator_length) tracks;
139142
self#feed ~force:false buf)
140143

141144
(* There are two situations here:
@@ -157,13 +160,11 @@ class muxer tracks =
157160
while streaming, we end all tracks when this source drops
158161
off. *)
159162
method get_frame buf =
160-
self#feed ~force:true buf;
163+
let rem = Lazy.force Frame.size - Frame.position buf in
164+
if Generator.length self#buffer < rem then self#feed ~force:true buf;
161165
Generator.fill self#buffer buf
162166

163-
initializer
164-
self#on_after_output (fun () ->
165-
clear_track_frames ();
166-
Generator.clear self#buffer)
167+
initializer self#on_after_output (fun () -> clear_track_frames ())
167168
end
168169

169170
let muxer_operator p =

0 commit comments

Comments
 (0)