[vlc-commits] HLS: Do not assume Content-Length is set
vlc | branch: master | Rafaël Carré fun...@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 */ ___ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits
[vlc-commits] HLS: Do not assume Content-Length is set
vlc/vlc-2.2 | branch: master | Rafaël Carré fun...@videolan.org | 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 fkue...@videolan.org 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 vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits