vlc/vlc-2.2 | branch: master | Rafaël Carré <[email protected]> | Fri Nov 14 11:51:16 2014 +0100| [dd69fa840d580baee41c4c7e96f8c1d37c3c256e] | committer: Felix Paul Kühne
HLS: Do not assume Content-Length is set Fixes #8078 (cherry picked from commit b48ee570b0e060d64dec95d460ca919d60d06138) Signed-off-by: Felix Paul Kühne <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=dd69fa840d580baee41c4c7e96f8c1d37c3c256e --- 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 */ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
