Skip to content

Commit 6b704d6

Browse files
[#101] Improve ringbuffer handling
1 parent 1af46b1 commit 6b704d6

6 files changed

Lines changed: 187 additions & 59 deletions

File tree

doc/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ if (DOCS)
118118
${DOXYGEN_VERSION} STREQUAL "1.13.0" OR
119119
${DOXYGEN_VERSION} STREQUAL "1.13.1" OR
120120
${DOXYGEN_VERSION} STREQUAL "1.13.2" OR
121-
${DOXYGEN_VERSION} STREQUAL "1.14.0")
121+
${DOXYGEN_VERSION} STREQUAL "1.14.0" OR
122+
${DOXYGEN_VERSION} STREQUAL "1.15.0" OR
123+
${DOXYGEN_VERSION} STREQUAL "1.16.0" OR
124+
${DOXYGEN_VERSION} STREQUAL "1.16.1")
122125
add_custom_command(
123126
TARGET api
124127
COMMAND ${DOXYGEN_EXECUTABLE} -q ${DOXYFILE_OUT}

src/include/ringbuffer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ extern "C" {
2828
#define HRMP_RINGBUFFER_MIN_BYTES (4u * 1024u * 1024u)
2929
#define HRMP_RINGBUFFER_MAX_BYTES (256u * 1024u * 1024u)
3030

31+
/** @struct ringbuffer
32+
* Ringbuffer storage.
33+
*/
3134
struct ringbuffer
3235
{
3336
uint8_t *buf; /**< The buffer */

src/libhrmp/files.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,7 @@ get_metadata_dsf(char* filename, struct file_metadata** file_metadata)
10631063

10641064
hrmp_read_le_u32(f); /* DATA */
10651065
data_size = hrmp_read_le_u64(f); /* data_size */
1066+
long data_offset = ftell(f);
10661067

10671068
if (srate % 16)
10681069
{
@@ -1087,7 +1088,33 @@ get_metadata_dsf(char* filename, struct file_metadata** file_metadata)
10871088
fm->total_samples = samples;
10881089
fm->duration = (double)((double)samples / srate);
10891090
fm->block_size = block_size;
1090-
fm->data_size = data_size;
1091+
uint64_t max_bytes = data_size;
1092+
if (fm->file_size > 0 && data_offset > 0 && (uint64_t)data_offset < fm->file_size)
1093+
{
1094+
uint64_t avail = fm->file_size - (uint64_t)data_offset;
1095+
if (metadata_chunk != 0 && metadata_chunk > (uint64_t)data_offset && metadata_chunk <= fm->file_size)
1096+
{
1097+
avail = metadata_chunk - (uint64_t)data_offset;
1098+
}
1099+
if (avail < max_bytes)
1100+
{
1101+
max_bytes = avail;
1102+
}
1103+
}
1104+
1105+
if (samples > 0 && channel_number > 0)
1106+
{
1107+
uint64_t expected_bytes = (samples * (uint64_t)channel_number + 7u) / 8u;
1108+
fm->data_size = expected_bytes;
1109+
if (max_bytes < fm->data_size)
1110+
{
1111+
fm->data_size = max_bytes;
1112+
}
1113+
}
1114+
else
1115+
{
1116+
fm->data_size = max_bytes;
1117+
}
10911118

10921119
if (metadata_chunk != 0)
10931120
{

src/libhrmp/mkv.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
62116
static uint64_t
63117
ebml_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

Comments
 (0)