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

Commit 70888c00 authored by Andreas Huber's avatar Andreas Huber Committed by Android Git Automerger
Browse files

am b6c2e2b4: DO NOT MERGE: More robust parsing of NPT time ranges in RTSP.

* commit 'b6c2e2b4':
  DO NOT MERGE: More robust parsing of NPT time ranges in RTSP.
parents 13212f83 b6c2e2b4
Loading
Loading
Loading
Loading
+36 −16
Original line number Diff line number Diff line
@@ -254,26 +254,12 @@ bool ASessionDescription::getDurationUs(int64_t *durationUs) const {
        return false;
    }

    if (value == "npt=now-" || value == "npt=0-") {
        return false;
    }

    if (strncmp(value.c_str(), "npt=", 4)) {
        return false;
    }

    const char *s = value.c_str() + 4;
    char *end;
    double from = strtod(s, &end);

    if (end == s || *end != '-') {
        return false;
    }

    s = end + 1;
    double to = strtod(s, &end);

    if (end == s || *end != '\0' || to < from) {
    float from, to;
    if (!parseNTPRange(value.c_str() + 4, &from, &to)) {
        return false;
    }

@@ -307,5 +293,39 @@ void ASessionDescription::ParseFormatDesc(
    }
}

// static
bool ASessionDescription::parseNTPRange(
        const char *s, float *npt1, float *npt2) {
    if (s[0] == '-') {
        return false;  // no start time available.
    }

    if (!strncmp("now", s, 3)) {
        return false;  // no absolute start time available
    }

    char *end;
    *npt1 = strtof(s, &end);

    if (end == s || *end != '-') {
        // Failed to parse float or trailing "dash".
        return false;
    }

    s = end + 1;  // skip the dash.

    if (!strncmp("now", s, 3)) {
        return false;  // no absolute end time available
    }

    *npt2 = strtof(s, &end);

    if (end == s || *end != '\0') {
        return false;
    }

    return *npt2 > *npt1;
}

}  // namespace android
+8 −0
Original line number Diff line number Diff line
@@ -55,6 +55,14 @@ struct ASessionDescription : public RefBase {

    bool findAttribute(size_t index, const char *key, AString *value) const;

    // parses strings of the form
    //   npt      := npt-time "-" npt-time? | "-" npt-time
    //   npt-time := "now" | [0-9]+("." [0-9]*)?
    //
    // Returns true iff both "npt1" and "npt2" times were available,
    // i.e. we have a fixed duration, otherwise this is live streaming.
    static bool parseNTPRange(const char *s, float *npt1, float *npt2);

protected:
    virtual ~ASessionDescription();

+2 −4
Original line number Diff line number Diff line
@@ -938,13 +938,11 @@ struct MyHandler : public AHandler {

        AString val;
        CHECK(GetAttribute(range.c_str(), "npt", &val));
        float npt1, npt2;

        if (val == "now-" || val == "0-") {
        float npt1, npt2;
        if (!ASessionDescription::parseNTPRange(val.c_str(), &npt1, &npt2)) {
            // This is a live stream and therefore not seekable.
            return;
        } else {
            CHECK_EQ(sscanf(val.c_str(), "%f-%f", &npt1, &npt2), 2);
        }

        i = response->mHeaders.indexOfKey("rtp-info");