content/media/StreamBuffer.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
     4  * You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "StreamBuffer.h"
     7 #include "prlog.h"
     8 #include <algorithm>
    10 namespace mozilla {
    12 #ifdef PR_LOGGING
    13 extern PRLogModuleInfo* gMediaStreamGraphLog;
    14 #define STREAM_LOG(type, msg) PR_LOG(gMediaStreamGraphLog, type, msg)
    15 #else
    16 #define STREAM_LOG(type, msg)
    17 #endif
    19 #ifdef DEBUG
    20 void
    21 StreamBuffer::DumpTrackInfo() const
    22 {
    23   STREAM_LOG(PR_LOG_ALWAYS, ("DumpTracks: mTracksKnownTime %lld", mTracksKnownTime));
    24   for (uint32_t i = 0; i < mTracks.Length(); ++i) {
    25     Track* track = mTracks[i];
    26     if (track->IsEnded()) {
    27       STREAM_LOG(PR_LOG_ALWAYS, ("Track[%d] %d: ended", i, track->GetID()));
    28     } else {
    29       STREAM_LOG(PR_LOG_ALWAYS, ("Track[%d] %d: %lld", i, track->GetID(),
    30                                  track->GetEndTimeRoundDown()));
    31     }
    32   }
    33 }
    34 #endif
    36 StreamTime
    37 StreamBuffer::GetEnd() const
    38 {
    39   StreamTime t = mTracksKnownTime;
    40   for (uint32_t i = 0; i < mTracks.Length(); ++i) {
    41     Track* track = mTracks[i];
    42     if (!track->IsEnded()) {
    43       t = std::min(t, track->GetEndTimeRoundDown());
    44     }
    45   }
    46   return t;
    47 }
    49 StreamTime
    50 StreamBuffer::GetAllTracksEnd() const
    51 {
    52   if (mTracksKnownTime < STREAM_TIME_MAX) {
    53     // A track might be added.
    54     return STREAM_TIME_MAX;
    55   }
    56   StreamTime t = 0;
    57   for (uint32_t i = 0; i < mTracks.Length(); ++i) {
    58     Track* track = mTracks[i];
    59     if (!track->IsEnded()) {
    60       return STREAM_TIME_MAX;
    61     }
    62     t = std::max(t, track->GetEndTimeRoundDown());
    63   }
    64   return t;
    65 }
    67 StreamBuffer::Track*
    68 StreamBuffer::FindTrack(TrackID aID)
    69 {
    70   if (aID == TRACK_NONE)
    71     return nullptr;
    72   for (uint32_t i = 0; i < mTracks.Length(); ++i) {
    73     Track* track = mTracks[i];
    74     if (track->GetID() == aID) {
    75       return track;
    76     }
    77   }
    78   return nullptr;
    79 }
    81 void
    82 StreamBuffer::ForgetUpTo(StreamTime aTime)
    83 {
    84   // Round to nearest 50ms so we don't spend too much time pruning segments.
    85   const MediaTime roundTo = MillisecondsToMediaTime(50);
    86   StreamTime forget = (aTime/roundTo)*roundTo;
    87   if (forget <= mForgottenTime) {
    88     return;
    89   }
    90   mForgottenTime = forget;
    92   for (uint32_t i = 0; i < mTracks.Length(); ++i) {
    93     Track* track = mTracks[i];
    94     if (track->IsEnded() && track->GetEndTimeRoundDown() <= forget) {
    95       mTracks.RemoveElementAt(i);
    96       --i;
    97       continue;
    98     }
    99     TrackTicks forgetTo = std::min(track->GetEnd() - 1, track->TimeToTicksRoundDown(forget));
   100     track->ForgetUpTo(forgetTo);
   101   }
   102 }
   104 }

mercurial