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

Commit b0eb8bb7 authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Merge "More robust parsing of NPT time ranges in RTSP." into honeycomb

parents 47db84cc a2edd7d8
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");