@@ -59,6 +59,60 @@ ebml_reader_init(EbmlReader* r, FILE* fp, struct ringbuffer* rb, uint64_t file_s
5959 }
6060}
6161
62+ static void
63+ mkv_prefill_ringbuffer (EbmlReader * r )
64+ {
65+ if (!r || !r -> rb || !r -> fp )
66+ {
67+ return ;
68+ }
69+
70+ size_t target = r -> rb -> max ;
71+ if (r -> file_size > 0 )
72+ {
73+ off_t pos = ftello (r -> fp );
74+ if (pos >= 0 && (uint64_t )pos <= r -> file_size )
75+ {
76+ uint64_t remaining = r -> file_size - (uint64_t )pos ;
77+ if (remaining < target )
78+ {
79+ target = (size_t )remaining ;
80+ }
81+ }
82+ }
83+ if (target < r -> rb -> min )
84+ {
85+ target = r -> rb -> min ;
86+ }
87+
88+ size_t cur = hrmp_ringbuffer_size (r -> rb );
89+ if (target > cur )
90+ {
91+ (void )hrmp_ringbuffer_ensure_write (r -> rb , target - cur );
92+ }
93+
94+ while (hrmp_ringbuffer_size (r -> rb ) < hrmp_ringbuffer_capacity (r -> rb ))
95+ {
96+ void * wp = NULL ;
97+ size_t span = hrmp_ringbuffer_get_write_span (r -> rb , & wp );
98+ if (span == 0 )
99+ {
100+ break ;
101+ }
102+
103+ size_t got = fread (wp , 1 , span , r -> fp );
104+ if (got == 0 )
105+ {
106+ break ;
107+ }
108+
109+ if (hrmp_ringbuffer_produce (r -> rb , got ))
110+ {
111+ break ;
112+ }
113+ }
114+ }
115+
62116static uint64_t
63117ebml_tell (EbmlReader * r )
64118{
@@ -113,6 +167,7 @@ ebml_read(EbmlReader* r, void* dst, size_t size)
113167 }
114168 else
115169 {
170+ mkv_prefill_ringbuffer (r );
116171 uint8_t * out = (uint8_t * )dst ;
117172 while (n < size )
118173 {
@@ -124,6 +179,7 @@ ebml_read(EbmlReader* r, void* dst, size_t size)
124179 memcpy (out + n , rp , take );
125180 hrmp_ringbuffer_consume (r -> rb , take );
126181 n += take ;
182+ mkv_prefill_ringbuffer (r );
127183 continue ;
128184 }
129185
0 commit comments