Index: content/renderer/media/repetition_detector.h |
diff --git a/content/renderer/media/repetition_detector.h b/content/renderer/media/repetition_detector.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2b65011cab02559266b10f6e63e7b0cb03bdc652 |
--- /dev/null |
+++ b/content/renderer/media/repetition_detector.h |
@@ -0,0 +1,101 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CONTENT_RENDERER_MEDIA_REPETITION_DETECTOR_H_ |
+#define CONTENT_RENDERER_MEDIA_REPETITION_DETECTOR_H_ |
+ |
+#include <vector> |
+ |
+#include "base/memory/scoped_vector.h" |
+#include "content/common/content_export.h" |
+ |
+namespace content { |
+ |
+class RepetitionDetectorForTest; |
Henrik Grunell
2015/09/23 10:36:42
Remove.
minyue
2015/09/25 14:40:08
Done.
|
+ |
+class CONTENT_EXPORT RepetitionDetector { |
Henrik Grunell
2015/09/23 10:36:42
Call it AudioRepetitionDetector. (And rename files
Henrik Grunell
2015/09/23 10:36:42
Add comment describing the class briefly. Also giv
minyue
2015/09/25 14:40:08
Done.
minyue
2015/09/25 14:40:08
Done.
|
+ public: |
+ RepetitionDetector(); |
+ virtual ~RepetitionDetector(); |
tommi (sloooow) - chröme
2015/09/25 08:57:14
Can you add documentation for the class, what it d
minyue
2015/09/25 14:40:08
Yes, also per Henrik's request. The virtual is bec
|
+ |
+ struct Pattern { |
Henrik Grunell
2015/09/23 10:36:42
Can this be private?
minyue
2015/09/25 14:40:08
Not really if we want the RegisterRepetitionPatter
|
+ int id_; |
+ // All followings are in milliseconds, since repetition patterns are |
Henrik Grunell
2015/09/23 10:36:42
Move this comment to before the struct statement,
minyue
2015/09/25 14:40:08
Done.
|
+ // supposedly bounded to certain duration in time. |
+ int look_back_ms_; |
+ int min_length_ms_; |
+ }; |
+ |
+ // Detect repetition in |data|. When multichannel, samples should be |
+ // interleaved. |
Henrik Grunell
2015/09/23 10:36:42
Describe what it does if repetition is detected.
minyue
2015/09/25 14:40:08
Done.
|
+ void Detect(const float* data, size_t num_frames, size_t num_channels, |
Henrik Grunell
2015/09/23 10:36:42
This should take a const AudioBus*.
minyue
2015/09/25 14:40:08
See my comment on a concern of making input format
|
+ int sample_rate_hz); |
+ |
+ private: |
+ friend class RepetitionDetectorForTest; // For testing. |
Henrik Grunell
2015/09/23 10:36:42
Should you use FRIEND_TEST_ALL_PREFIXES()? See oth
minyue
2015/09/25 14:40:08
This has been considered and discussed in the para
tommi (sloooow) - chröme
2015/09/28 10:28:39
Did you discuss making the parts that the derived
minyue
2015/09/28 14:47:50
I used protected, and reviewers wanted me to use F
|
+ |
+ class State { |
Henrik Grunell
2015/09/23 10:36:42
Comment and describe the class and what it's used
minyue
2015/09/25 14:40:08
Done.
|
+ public: |
+ State(int id, int look_back_ms, int min_length_ms); |
+ |
+ bool reported() const { return reported_; } |
+ void set_reported(bool reported) { reported_ = reported; } |
+ |
+ // Increase the counter by 1, and tell if the counted audio is zero. |
+ void Increment(bool zero); |
+ |
+ bool HasValidReport(int sample_rate_khz) const; |
+ |
+ void Reset(); |
+ int id() const { return id_; } |
+ int look_back_ms() const { return look_back_ms_; } |
+ |
+ private: |
+ const int id_; |
Henrik Grunell
2015/09/23 10:36:42
Comment on all member variables.
minyue
2015/09/25 14:40:08
Done.
|
+ const int look_back_ms_; |
+ const int min_length_ms_; |
+ size_t count_frames_; |
+ bool all_zero_; |
+ bool reported_; |
+ }; |
+ |
+ void RegisterRepetitionPatterns(const Pattern* patterns, |
+ size_t num_patterns); |
+ |
+ void ClearRepetitionPatterns(); |
+ |
+ // Reset |audio_buffer_| when number of channels or sample rate changes. |
+ void Reset(size_t num_channels, int sample_rate_hz); |
+ |
+ // Add frames (interleaved if stereo) to |audio_buffer_|. |
+ void AddFramesToBuffer(const float* data, size_t num_frames); |
+ |
+ // Determine if an audio frame (samples interleaved if stereo) is identical to |
+ // |audio_buffer_| at a look back position. |
+ bool Equal(const float* frame, int look_back_samples) const; |
+ |
+ // Determine if an audio frame (samples interleaved if stereo) is zero. |
+ bool IsZero(const float* frame) const; |
+ |
+ // Action when found repetition. |
+ virtual void ReportRepetition(int id); |
+ |
+ std::vector<int> ids_; |
Henrik Grunell
2015/09/23 10:36:42
Comment on all member variables.
minyue
2015/09/25 14:40:08
Done.
|
+ ScopedVector<State> states_; |
+ int max_look_back_ms_; |
+ |
+ std::vector<float> audio_buffer_; // Ring buffers to store input audio. |
Henrik Grunell
2015/09/23 10:36:42
Put comments on its own line before the variable.
minyue
2015/09/25 14:40:08
Done.
|
+ size_t num_channels_; // Number of audio channels in buffer. |
+ int sample_rate_hz_; // Sample rate in Hz. |
+ size_t buffer_size_frames_; // Number of frames in |audio_buffer|. |
+ size_t buffer_end_index_; // The index of the last frame in |audio_buffer|. |
+ size_t max_frames_; // The maximum input frames that |audio_buffer_| |
+ // can handle for each detection. |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RepetitionDetector); |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_RENDERER_MEDIA_REPETITION_DETECTOR_H_ |