Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1076eb1 authored by Martin Storsjo's avatar Martin Storsjo Committed by Lajos Molnar
Browse files

LiveSession: Use the actual, possibly redirected url as base in the M3U

This fixes playback of HLS streams where the M3U playlists use
relative paths and the main playlist is opened via a redirect.

Bug: 13174301
Change-Id: I787e1c050daddc566be4c8e3f84803d3f91eec46
parent 75d03185
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -623,7 +623,8 @@ status_t LiveSession::fetchFile(
        const char *url, sp<ABuffer> *out,
        int64_t range_offset, int64_t range_length,
        uint32_t block_size, /* download block size */
        sp<DataSource> *source /* to return and reuse source */) {
        sp<DataSource> *source, /* to return and reuse source */
        String8 *actualUrl) {
    off64_t size;
    sp<DataSource> temp_source;
    if (source == NULL) {
@@ -719,6 +720,12 @@ status_t LiveSession::fetchFile(
    }

    *out = buffer;
    if (actualUrl != NULL) {
        *actualUrl = (*source)->getUri();
        if (actualUrl->isEmpty()) {
            *actualUrl = url;
        }
    }

    return OK;
}
@@ -730,7 +737,8 @@ sp<M3UParser> LiveSession::fetchPlaylist(
    *unchanged = false;

    sp<ABuffer> buffer;
    status_t err = fetchFile(url, &buffer);
    String8 actualUrl;
    status_t err = fetchFile(url, &buffer, 0, -1, 0, NULL, &actualUrl);

    if (err != OK) {
        return NULL;
@@ -764,7 +772,7 @@ sp<M3UParser> LiveSession::fetchPlaylist(
#endif

    sp<M3UParser> playlist =
        new M3UParser(url, buffer->data(), buffer->size());
        new M3UParser(actualUrl.string(), buffer->data(), buffer->size());

    if (playlist->initCheck() != OK) {
        ALOGE("failed to parse .m3u8 playlist");
+2 −1
Original line number Diff line number Diff line
@@ -207,7 +207,8 @@ private:
            /* download block size */
            uint32_t block_size = 0,
            /* reuse DataSource if doing partial fetch */
            sp<DataSource> *source = NULL);
            sp<DataSource> *source = NULL,
            String8 *actualUrl = NULL);

    sp<M3UParser> fetchPlaylist(
            const char *url, uint8_t *curPlaylistHash, bool *unchanged);