@@ -101,7 +101,7 @@ class muxer tracks =
101
101
track_frames := (source, f) :: ! track_frames;
102
102
f
103
103
104
- method private feed_track ~tmp ~filled ~start ~stop
104
+ method private feed_track ~tmp ~generator_length ~start ~stop
105
105
{ source_field; target_field; processor } =
106
106
let c = Content. sub (Frame. get tmp source_field) start (stop - start) in
107
107
match source_field with
@@ -111,31 +111,34 @@ class muxer tracks =
111
111
(Content.Metadata. get_data c)
112
112
| f when f = Frame.Fields. track_marks ->
113
113
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
115
117
| _ -> Generator. put self#buffer target_field (processor c)
116
118
117
- method private feed_fields ~filled { fields; source } =
119
+ method private feed_fields ~generator_length { fields; source } =
118
120
let tmp = self#track_frame source in
119
121
let start = Frame. position tmp in
120
122
if Frame. is_partial tmp && source#is_ready ~frame: tmp () then (
121
123
source#get tmp;
122
124
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)
124
126
125
127
(* In the current streaming model, we might still need to force
126
128
a source#get to get the next break/metadata at the beginning of
127
129
a track.
128
130
129
131
TODO: get rid of this! *)
130
132
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
132
135
if
133
136
self#sources_ready
134
137
&& (force
135
138
|| Generator. remaining self#buffer = - 1
136
- && filled + Generator. length self#buffer < Lazy. force Frame. size)
139
+ && position + generator_length < Lazy. force Frame. size)
137
140
then (
138
- List. iter (self#feed_fields ~filled ) tracks;
141
+ List. iter (self#feed_fields ~generator_length ) tracks;
139
142
self#feed ~force: false buf)
140
143
141
144
(* There are two situations here:
@@ -157,13 +160,11 @@ class muxer tracks =
157
160
while streaming, we end all tracks when this source drops
158
161
off. *)
159
162
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;
161
165
Generator. fill self#buffer buf
162
166
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 () )
167
168
end
168
169
169
170
let muxer_operator p =
0 commit comments