summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/httplive/M3UParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/httplive/M3UParser.cpp')
-rw-r--r--media/libstagefright/httplive/M3UParser.cpp73
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);