Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Unified Diff: ppapi/tests/test_media_stream_audio_track.cc

Issue 414643003: Support configuring the audio buffer duration in the Pepper MediaStream API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ppapi/tests/test_media_stream_audio_track.cc
diff --git a/ppapi/tests/test_media_stream_audio_track.cc b/ppapi/tests/test_media_stream_audio_track.cc
index 636e7b515d887113614d6e97a1932855a186e744..87ca97387fd77e4a8f9beaf07348222dba928df0 100644
--- a/ppapi/tests/test_media_stream_audio_track.cc
+++ b/ppapi/tests/test_media_stream_audio_track.cc
@@ -18,9 +18,11 @@ REGISTER_TEST_CASE(MediaStreamAudioTrack);
namespace {
-// Real max defined in
+// Real constants defined in
// content/renderer/pepper/pepper_media_stream_audio_track_host.cc.
const int32_t kMaxNumberOfBuffers = 1000;
+const int32_t kMinDuration = 10;
+const int32_t kMaxDuration = 10000;
const int32_t kTimes = 3;
const char kJSCode[] =
"function gotStream(stream) {"
@@ -145,6 +147,53 @@ std::string TestMediaStreamAudioTrack::TestGetBuffer() {
PASS();
}
+std::string TestMediaStreamAudioTrack::CheckConfigure(
+ int32_t attrib_list[], int32_t expected_result) {
+ TestCompletionCallback cc_configure(instance_->pp_instance(), false);
+ cc_configure.WaitForResult(
+ audio_track_.Configure(attrib_list, cc_configure.GetCallback()));
+ ASSERT_EQ(expected_result, cc_configure.result());
+ PASS();
+}
+
+std::string TestMediaStreamAudioTrack::CheckGetBuffer(
+ int times, int expected_duration) {
+ PP_TimeDelta timestamp = 0.0;
+ for (int j = 0; j < times; ++j) {
+ TestCompletionCallbackWithOutput<pp::AudioBuffer> cc_get_buffer(
+ instance_->pp_instance(), false);
+ cc_get_buffer.WaitForResult(
+ audio_track_.GetBuffer(cc_get_buffer.GetCallback()));
+ ASSERT_EQ(PP_OK, cc_get_buffer.result());
+ pp::AudioBuffer buffer = cc_get_buffer.output();
+ ASSERT_FALSE(buffer.is_null());
+ ASSERT_TRUE(IsSampleRateValid(buffer.GetSampleRate()));
+ ASSERT_EQ(buffer.GetSampleSize(), PP_AUDIOBUFFER_SAMPLESIZE_16_BITS);
+
+ ASSERT_GE(buffer.GetTimestamp(), timestamp);
+ timestamp = buffer.GetTimestamp();
+
+ // TODO(amistry): Figure out how to inject a predictable audio pattern, such
+ // as a sawtooth, and check the buffer data to make sure it's correct.
+ ASSERT_TRUE(buffer.GetDataBuffer() != NULL);
+ if (expected_duration > 0) {
+ uint32_t buffer_size = buffer.GetDataBufferSize();
+ uint32_t channels = buffer.GetNumberOfChannels();
+ uint32_t sample_rate = buffer.GetSampleRate();
+ uint32_t bytes_per_frame = channels * 2;
+ int32_t duration = expected_duration;
+ ASSERT_EQ(buffer_size % bytes_per_frame, 0U);
+ ASSERT_EQ(buffer_size,
+ (duration * sample_rate * bytes_per_frame) / 1000);
+ } else {
+ ASSERT_GT(buffer.GetDataBufferSize(), 0U);
+ }
+
+ audio_track_.RecycleBuffer(buffer);
+ }
+ PASS();
+}
+
std::string TestMediaStreamAudioTrack::TestConfigure() {
Peng 2014/07/24 15:38:37 The test is disabled in https://codereview.chromiu
Anand Mistry (off Chromium) 2014/07/25 03:38:15 Done.
// Create a track.
instance_->EvalScript(kJSCode);
@@ -155,8 +204,6 @@ std::string TestMediaStreamAudioTrack::TestConfigure() {
ASSERT_FALSE(audio_track_.HasEnded());
ASSERT_FALSE(audio_track_.GetId().empty());
- PP_TimeDelta timestamp = 0.0;
-
// Configure number of buffers.
struct {
int32_t buffers;
@@ -170,36 +217,46 @@ std::string TestMediaStreamAudioTrack::TestConfigure() {
{ 0, PP_OK }, // Use default.
};
for (size_t i = 0; i < sizeof(buffers) / sizeof(buffers[0]); ++i) {
- TestCompletionCallback cc_configure(instance_->pp_instance(), false);
int32_t attrib_list[] = {
PP_MEDIASTREAMAUDIOTRACK_ATTRIB_BUFFERS, buffers[i].buffers,
PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE,
};
- cc_configure.WaitForResult(
- audio_track_.Configure(attrib_list, cc_configure.GetCallback()));
- ASSERT_EQ(buffers[i].expect_result, cc_configure.result());
-
+ ASSERT_SUBTEST_SUCCESS(CheckConfigure(attrib_list,
+ buffers[i].expect_result));
// Get some buffers. This should also succeed when configure fails.
- for (int j = 0; j < kTimes; ++j) {
- TestCompletionCallbackWithOutput<pp::AudioBuffer> cc_get_buffer(
- instance_->pp_instance(), false);
- cc_get_buffer.WaitForResult(
- audio_track_.GetBuffer(cc_get_buffer.GetCallback()));
- ASSERT_EQ(PP_OK, cc_get_buffer.result());
- pp::AudioBuffer buffer = cc_get_buffer.output();
- ASSERT_FALSE(buffer.is_null());
- ASSERT_TRUE(IsSampleRateValid(buffer.GetSampleRate()));
- ASSERT_EQ(buffer.GetSampleSize(), PP_AUDIOBUFFER_SAMPLESIZE_16_BITS);
-
- ASSERT_GE(buffer.GetTimestamp(), timestamp);
- timestamp = buffer.GetTimestamp();
+ ASSERT_SUBTEST_SUCCESS(CheckGetBuffer(kTimes, -1));
+ }
- ASSERT_GT(buffer.GetDataBufferSize(), 0U);
- ASSERT_TRUE(buffer.GetDataBuffer() != NULL);
+ // Configure buffer duration.
+ struct {
+ int32_t duration;
+ int32_t expect_result;
+ } durations[] = {
+ { kMinDuration, PP_OK },
+ { 123, PP_OK },
+ { kMinDuration - 1, PP_ERROR_BADARGUMENT },
+ { kMaxDuration + 1, PP_ERROR_BADARGUMENT },
+ };
+ for (size_t i = 0; i < sizeof(durations) / sizeof(durations[0]); ++i) {
+ int32_t attrib_list[] = {
+ PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION, durations[i].duration,
+ PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE,
+ };
+ ASSERT_SUBTEST_SUCCESS(CheckConfigure(attrib_list,
+ durations[i].expect_result));
- audio_track_.RecycleBuffer(buffer);
- }
+ // Get some buffers. This always works, but the buffer size will vary.
+ int duration =
+ durations[i].expect_result == PP_OK ? durations[i].duration : -1;
+ ASSERT_SUBTEST_SUCCESS(CheckGetBuffer(kTimes, duration));
}
+ // Test kMaxDuration separately since each GetBuffer will take 10 seconds.
+ int32_t attrib_list[] = {
+ PP_MEDIASTREAMAUDIOTRACK_ATTRIB_DURATION, kMaxDuration,
+ PP_MEDIASTREAMAUDIOTRACK_ATTRIB_NONE,
+ };
+ ASSERT_SUBTEST_SUCCESS(CheckConfigure(attrib_list, PP_OK));
+
// Configure should fail while plugin holds buffers.
{

Powered by Google App Engine
This is Rietveld 408576698