Commit dd69fa84 authored by Rafaël Carré's avatar Rafaël Carré Committed by Felix Paul Kühne

HLS: Do not assume Content-Length is set

Fixes #8078

(cherry picked from commit b48ee570b0e060d64dec95d460ca919d60d06138)
Signed-off-by: default avatarFelix Paul Kühne <fkuehne@videolan.org>
parent 88e94aee
...@@ -1838,43 +1838,66 @@ static int hls_Download(stream_t *s, segment_t *segment) ...@@ -1838,43 +1838,66 @@ static int hls_Download(stream_t *s, segment_t *segment)
return VLC_EGENERIC; return VLC_EGENERIC;
segment->size = stream_Size(p_ts); segment->size = stream_Size(p_ts);
assert(segment->size > 0);
segment->data = block_Alloc(segment->size); if (segment->size == 0) {
if (segment->data == NULL) int chunk_size = 65536;
{ segment->data = block_Alloc(chunk_size);
if (!segment->data)
goto nomem;
do {
if (segment->data->i_buffer - segment->size < chunk_size) {
chunk_size *= 2;
block_t *p_block = block_Realloc(segment->data, 0, segment->data->i_buffer + chunk_size);
if (!p_block) {
block_Release(segment->data);
segment->data = NULL;
goto nomem;
}
segment->data = p_block;
}
ssize_t length = stream_Read(p_ts, segment->data->p_buffer + segment->size, chunk_size);
if (length <= 0) {
segment->data->i_buffer = segment->size;
break;
}
segment->size += length;
} while (vlc_object_alive(s));
stream_Delete(p_ts); stream_Delete(p_ts);
return VLC_ENOMEM; return VLC_SUCCESS;
} }
segment->data = block_Alloc(segment->size);
if (segment->data == NULL)
goto nomem;
assert(segment->data->i_buffer == segment->size); assert(segment->data->i_buffer == segment->size);
ssize_t length = 0, curlen = 0; ssize_t curlen = 0;
uint64_t size;
do do
{ {
/* NOTE: Beware the size reported for a segment by the HLS server may not /* NOTE: Beware the size reported for a segment by the HLS server may not
* be correct, when downloading the segment data. Therefore check the size * be correct, when downloading the segment data. Therefore check the size
* and enlarge the segment data block if necessary. * and enlarge the segment data block if necessary.
*/ */
size = stream_Size(p_ts); uint64_t size = stream_Size(p_ts);
if (size > segment->size) if (size > segment->size)
{ {
msg_Dbg(s, "size changed %"PRIu64, segment->size); msg_Dbg(s, "size changed %"PRIu64, segment->size);
block_t *p_block = block_Realloc(segment->data, 0, size); block_t *p_block = block_Realloc(segment->data, 0, size);
if (p_block == NULL) if (p_block == NULL)
{ {
stream_Delete(p_ts);
block_Release(segment->data); block_Release(segment->data);
segment->data = NULL; segment->data = NULL;
return VLC_ENOMEM; goto nomem;
} }
segment->data = p_block; segment->data = p_block;
segment->size = size; segment->size = size;
assert(segment->data->i_buffer == segment->size); assert(segment->data->i_buffer == segment->size);
p_block = NULL; p_block = NULL;
} }
length = stream_Read(p_ts, segment->data->p_buffer + curlen, segment->size - curlen); ssize_t length = stream_Read(p_ts, segment->data->p_buffer + curlen, segment->size - curlen);
if (length <= 0) if (length <= 0)
break; break;
curlen += length; curlen += length;
...@@ -1882,6 +1905,10 @@ static int hls_Download(stream_t *s, segment_t *segment) ...@@ -1882,6 +1905,10 @@ static int hls_Download(stream_t *s, segment_t *segment)
stream_Delete(p_ts); stream_Delete(p_ts);
return VLC_SUCCESS; return VLC_SUCCESS;
nomem:
stream_Delete(p_ts);
return VLC_ENOMEM;
} }
/* Read M3U8 file */ /* Read M3U8 file */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment