[vlc-commits] HLS: Do not assume Content-Length is set
Rafaël Carré
git at videolan.org
Tue Nov 18 10:25:30 CET 2014
vlc | branch: master | Rafaël Carré <funman at videolan.org> | Fri Nov 14 11:51:16 2014 +0100| [b48ee570b0e060d64dec95d460ca919d60d06138] | committer: Rafaël Carré
HLS: Do not assume Content-Length is set
Fixes #8078
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b48ee570b0e060d64dec95d460ca919d60d06138
---
modules/stream_filter/httplive.c | 49 +++++++++++++++++++++++++++++---------
1 file changed, 38 insertions(+), 11 deletions(-)
diff --git a/modules/stream_filter/httplive.c b/modules/stream_filter/httplive.c
index 2a59527..d66ee28 100644
--- a/modules/stream_filter/httplive.c
+++ b/modules/stream_filter/httplive.c
@@ -1838,43 +1838,66 @@ static int hls_Download(stream_t *s, segment_t *segment)
return VLC_EGENERIC;
segment->size = stream_Size(p_ts);
- assert(segment->size > 0);
- segment->data = block_Alloc(segment->size);
- if (segment->data == NULL)
- {
+ if (segment->size == 0) {
+ 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);
- 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);
- ssize_t length = 0, curlen = 0;
- uint64_t size;
+ ssize_t curlen = 0;
do
{
/* 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
* and enlarge the segment data block if necessary.
*/
- size = stream_Size(p_ts);
+ uint64_t size = stream_Size(p_ts);
if (size > segment->size)
{
msg_Dbg(s, "size changed %"PRIu64, segment->size);
block_t *p_block = block_Realloc(segment->data, 0, size);
if (p_block == NULL)
{
- stream_Delete(p_ts);
block_Release(segment->data);
segment->data = NULL;
- return VLC_ENOMEM;
+ goto nomem;
}
segment->data = p_block;
segment->size = size;
assert(segment->data->i_buffer == segment->size);
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)
break;
curlen += length;
@@ -1882,6 +1905,10 @@ static int hls_Download(stream_t *s, segment_t *segment)
stream_Delete(p_ts);
return VLC_SUCCESS;
+
+nomem:
+ stream_Delete(p_ts);
+ return VLC_ENOMEM;
}
/* Read M3U8 file */
More information about the vlc-commits
mailing list