| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MEDIA_FILTERS_AUDIO_CLOCK_H_ | 5 #ifndef MEDIA_FILTERS_AUDIO_CLOCK_H_ |
| 6 #define MEDIA_FILTERS_AUDIO_CLOCK_H_ | 6 #define MEDIA_FILTERS_AUDIO_CLOCK_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <cmath> | |
| 11 #include <deque> | 10 #include <deque> |
| 12 | 11 |
| 13 #include "base/macros.h" | 12 #include "base/macros.h" |
| 14 #include "base/time/time.h" | 13 #include "base/time/time.h" |
| 15 #include "media/base/media_export.h" | 14 #include "media/base/media_export.h" |
| 16 | 15 |
| 17 namespace media { | 16 namespace media { |
| 18 | 17 |
| 19 // Models a queue of buffered audio in a playback pipeline for use with | 18 // Models a queue of buffered audio in a playback pipeline for use with |
| 20 // estimating the amount of delay in wall clock time. Takes changes in playback | 19 // estimating the amount of delay in wall clock time. Takes changes in playback |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 // +-----------------------+-----------------------+-----------------------+ | 82 // +-----------------------+-----------------------+-----------------------+ |
| 84 // | 10 frames silence | 20 frames @ 1.0x | 20 frames @ 0.5x | | 83 // | 10 frames silence | 20 frames @ 1.0x | 20 frames @ 0.5x | |
| 85 // | = 250 ms (wall) | = 500 ms (wall) | = 500 ms (wall) | | 84 // | = 250 ms (wall) | = 500 ms (wall) | = 500 ms (wall) | |
| 86 // | = 0 ms (media) | = 500 ms (media) | = 250 ms (media) | | 85 // | = 0 ms (media) | = 500 ms (media) | = 250 ms (media) | |
| 87 // +-----------------------+-----------------------+-----------------------+ | 86 // +-----------------------+-----------------------+-----------------------+ |
| 88 // ^ ^ | 87 // ^ ^ |
| 89 // front_timestamp() is equal to back_timestamp() is equal to | 88 // front_timestamp() is equal to back_timestamp() is equal to |
| 90 // |start_timestamp| since no amount of media frames tracked | 89 // |start_timestamp| since no amount of media frames tracked |
| 91 // media data has been played yet. by AudioClock, which would be | 90 // media data has been played yet. by AudioClock, which would be |
| 92 // 1000 + 500 + 250 = 1750 ms. | 91 // 1000 + 500 + 250 = 1750 ms. |
| 93 base::TimeDelta front_timestamp() const { | 92 base::TimeDelta front_timestamp() const { return front_timestamp_; } |
| 94 return base::TimeDelta::FromMicroseconds( | 93 base::TimeDelta back_timestamp() const { return back_timestamp_; } |
| 95 std::round(front_timestamp_micros_)); | |
| 96 } | |
| 97 base::TimeDelta back_timestamp() const { | |
| 98 return base::TimeDelta::FromMicroseconds( | |
| 99 std::round(back_timestamp_micros_)); | |
| 100 } | |
| 101 | 94 |
| 102 // Returns the amount of wall time until |timestamp| will be played by the | 95 // Returns the amount of wall time until |timestamp| will be played by the |
| 103 // audio hardware. | 96 // audio hardware. |
| 104 // | 97 // |
| 105 // |timestamp| must be within front_timestamp() and back_timestamp(). | 98 // |timestamp| must be within front_timestamp() and back_timestamp(). |
| 106 base::TimeDelta TimeUntilPlayback(base::TimeDelta timestamp) const; | 99 base::TimeDelta TimeUntilPlayback(base::TimeDelta timestamp) const; |
| 107 | 100 |
| 108 void ContiguousAudioDataBufferedForTesting( | 101 void ContiguousAudioDataBufferedForTesting( |
| 109 base::TimeDelta* total, | 102 base::TimeDelta* total, |
| 110 base::TimeDelta* same_rate_total) const; | 103 base::TimeDelta* same_rate_total) const; |
| 111 | 104 |
| 112 private: | 105 private: |
| 113 // Even with a ridiculously high sample rate of 256kHz, using 64 bits will | 106 // Even with a ridiculously high sample rate of 256kHz, using 64 bits will |
| 114 // permit tracking up to 416999965 days worth of time (that's 1141 millenia). | 107 // permit tracking up to 416999965 days worth of time (that's 1141 millenia). |
| 115 // | 108 // |
| 116 // 32 bits on the other hand would top out at measly 2 hours and 20 minutes. | 109 // 32 bits on the other hand would top out at measly 2 hours and 20 minutes. |
| 117 struct AudioData { | 110 struct AudioData { |
| 118 AudioData(int64_t frames, double playback_rate); | 111 AudioData(int64_t frames, double playback_rate); |
| 119 | 112 |
| 120 int64_t frames; | 113 int64_t frames; |
| 121 double playback_rate; | 114 double playback_rate; |
| 122 }; | 115 }; |
| 123 | 116 |
| 124 // Helpers for operating on |buffered_|. | 117 // Helpers for operating on |buffered_|. |
| 125 void PushBufferedAudioData(int64_t frames, double playback_rate); | 118 void PushBufferedAudioData(int64_t frames, double playback_rate); |
| 126 void PopBufferedAudioData(int64_t frames); | 119 void PopBufferedAudioData(int64_t frames); |
| 127 double ComputeBufferedMediaDurationMicros() const; | 120 base::TimeDelta ComputeBufferedMediaDuration() const; |
| 128 | 121 |
| 129 const base::TimeDelta start_timestamp_; | 122 const base::TimeDelta start_timestamp_; |
| 130 const double microseconds_per_frame_; | 123 const double microseconds_per_frame_; |
| 131 | 124 |
| 132 std::deque<AudioData> buffered_; | 125 std::deque<AudioData> buffered_; |
| 133 int64_t total_buffered_frames_; | 126 int64_t total_buffered_frames_; |
| 134 | 127 |
| 135 // Use double rather than TimeDelta to avoid loss of partial microseconds when | 128 base::TimeDelta front_timestamp_; |
| 136 // converting between frames-written/delayed and time-passed (see conversion | 129 base::TimeDelta back_timestamp_; |
| 137 // in WroteAudio()). Particularly for |back_timestamp|, which accumulates more | |
| 138 // time with each call to WroteAudio(), the loss of precision can accumulate | |
| 139 // to create noticeable audio/video sync drift for longer (2-3 hr) videos. | |
| 140 // See http://crbug.com/564604. | |
| 141 double front_timestamp_micros_; | |
| 142 double back_timestamp_micros_; | |
| 143 | 130 |
| 144 DISALLOW_COPY_AND_ASSIGN(AudioClock); | 131 DISALLOW_COPY_AND_ASSIGN(AudioClock); |
| 145 }; | 132 }; |
| 146 | 133 |
| 147 } // namespace media | 134 } // namespace media |
| 148 | 135 |
| 149 #endif // MEDIA_FILTERS_AUDIO_CLOCK_H_ | 136 #endif // MEDIA_FILTERS_AUDIO_CLOCK_H_ |
| OLD | NEW |