diff options
Diffstat (limited to 'media/libstagefright/httplive/M3UParser.cpp')
-rw-r--r-- | media/libstagefright/httplive/M3UParser.cpp | 73 |
1 files changed, 69 insertions, 4 deletions
diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp index 9df9f59..a50970e 100644 --- a/media/libstagefright/httplive/M3UParser.cpp +++ b/media/libstagefright/httplive/M3UParser.cpp @@ -101,7 +101,7 @@ static bool MakeURL(const char *baseURL, const char *url, AString *out) { // "url" is already an absolute URL, ignore base URL. out->setTo(url); - LOGV("base:'%s', url:'%s' => '%s'", baseURL, url, out->c_str()); + ALOGV("base:'%s', url:'%s' => '%s'", baseURL, url, out->c_str()); return true; } @@ -140,7 +140,7 @@ static bool MakeURL(const char *baseURL, const char *url, AString *out) { } } - LOGV("base:'%s', url:'%s' => '%s'", baseURL, url, out->c_str()); + ALOGV("base:'%s', url:'%s' => '%s'", baseURL, url, out->c_str()); return true; } @@ -152,6 +152,7 @@ status_t M3UParser::parse(const void *_data, size_t size) { const char *data = (const char *)_data; size_t offset = 0; + uint64_t segmentRangeOffset = 0; while (offset < size) { size_t offsetLF = offset; while (offsetLF < size && data[offsetLF] != '\n') { @@ -218,6 +219,24 @@ status_t M3UParser::parse(const void *_data, size_t size) { } mIsVariantPlaylist = true; err = parseStreamInf(line, &itemMeta); + } else if (line.startsWith("#EXT-X-BYTERANGE")) { + if (mIsVariantPlaylist) { + return ERROR_MALFORMED; + } + + uint64_t length, offset; + err = parseByteRange(line, segmentRangeOffset, &length, &offset); + + if (err == OK) { + if (itemMeta == NULL) { + itemMeta = new AMessage; + } + + itemMeta->setInt64("range-offset", offset); + itemMeta->setInt64("range-length", length); + + segmentRangeOffset = offset + length; + } } if (err != OK) { @@ -332,7 +351,7 @@ status_t M3UParser::parseStreamInf( AString val(attr, equalPos + 1, attr.size() - equalPos - 1); val.trim(); - LOGV("key=%s value=%s", key.c_str(), val.c_str()); + ALOGV("key=%s value=%s", key.c_str(), val.c_str()); if (!strcasecmp("bandwidth", key.c_str())) { const char *s = val.c_str(); @@ -410,7 +429,7 @@ status_t M3UParser::parseCipherInfo( AString val(attr, equalPos + 1, attr.size() - equalPos - 1); val.trim(); - LOGV("key=%s value=%s", key.c_str(), val.c_str()); + ALOGV("key=%s value=%s", key.c_str(), val.c_str()); key.tolower(); @@ -447,6 +466,52 @@ status_t M3UParser::parseCipherInfo( } // static +status_t M3UParser::parseByteRange( + const AString &line, uint64_t curOffset, + uint64_t *length, uint64_t *offset) { + ssize_t colonPos = line.find(":"); + + if (colonPos < 0) { + return ERROR_MALFORMED; + } + + ssize_t atPos = line.find("@", colonPos + 1); + + AString lenStr; + if (atPos < 0) { + lenStr = AString(line, colonPos + 1, line.size() - colonPos - 1); + } else { + lenStr = AString(line, colonPos + 1, atPos - colonPos - 1); + } + + lenStr.trim(); + + const char *s = lenStr.c_str(); + char *end; + *length = strtoull(s, &end, 10); + + if (s == end || *end != '\0') { + return ERROR_MALFORMED; + } + + if (atPos >= 0) { + AString offStr = AString(line, atPos + 1, line.size() - atPos - 1); + offStr.trim(); + + const char *s = offStr.c_str(); + *offset = strtoull(s, &end, 10); + + if (s == end || *end != '\0') { + return ERROR_MALFORMED; + } + } else { + *offset = curOffset; + } + + return OK; +} + +// static status_t M3UParser::ParseInt32(const char *s, int32_t *x) { char *end; long lval = strtol(s, &end, 10); |