Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <math.h> | 11 #include <math.h> |
| 12 #include <stdio.h> | 12 #include <stdio.h> |
| 13 #include <string.h> | 13 #include <string.h> |
| 14 #ifdef WEBRTC_ANDROID | 14 #ifdef WEBRTC_ANDROID |
| 15 #include <sys/stat.h> | 15 #include <sys/stat.h> |
| 16 #endif | 16 #endif |
| 17 | 17 |
| 18 #include <algorithm> | 18 #include <algorithm> |
| 19 #include <memory> | 19 #include <memory> |
| 20 | 20 |
| 21 #include "webrtc/base/format_macros.h" | 21 #include "webrtc/base/format_macros.h" |
| 22 #include "webrtc/base/timeutils.h" | |
| 22 #include "webrtc/common.h" | 23 #include "webrtc/common.h" |
| 23 #include "webrtc/modules/audio_processing/include/audio_processing.h" | 24 #include "webrtc/modules/audio_processing/include/audio_processing.h" |
| 24 #include "webrtc/modules/audio_processing/test/protobuf_utils.h" | 25 #include "webrtc/modules/audio_processing/test/protobuf_utils.h" |
| 25 #include "webrtc/modules/audio_processing/test/test_utils.h" | 26 #include "webrtc/modules/audio_processing/test/test_utils.h" |
| 26 #include "webrtc/modules/include/module_common_types.h" | 27 #include "webrtc/modules/include/module_common_types.h" |
| 27 #include "webrtc/system_wrappers/include/cpu_features_wrapper.h" | 28 #include "webrtc/system_wrappers/include/cpu_features_wrapper.h" |
| 28 #include "webrtc/system_wrappers/include/tick_util.h" | |
| 29 #include "webrtc/test/testsupport/fileutils.h" | 29 #include "webrtc/test/testsupport/fileutils.h" |
| 30 #include "webrtc/test/testsupport/perf_test.h" | 30 #include "webrtc/test/testsupport/perf_test.h" |
| 31 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | 31 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD |
| 32 #include "gtest/gtest.h" | 32 #include "gtest/gtest.h" |
| 33 #include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h" | 33 #include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h" |
| 34 #else | 34 #else |
| 35 #include "testing/gtest/include/gtest/gtest.h" | 35 #include "testing/gtest/include/gtest/gtest.h" |
| 36 #include "webrtc/modules/audio_processing/debug.pb.h" | 36 #include "webrtc/modules/audio_processing/debug.pb.h" |
| 37 #endif | 37 #endif |
| 38 | 38 |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 551 } | 551 } |
| 552 | 552 |
| 553 if (aecm_echo_path_out_filename != NULL) { | 553 if (aecm_echo_path_out_filename != NULL) { |
| 554 aecm_echo_path_out_file = OpenFile(aecm_echo_path_out_filename, "wb"); | 554 aecm_echo_path_out_file = OpenFile(aecm_echo_path_out_filename, "wb"); |
| 555 } | 555 } |
| 556 | 556 |
| 557 size_t read_count = 0; | 557 size_t read_count = 0; |
| 558 int reverse_count = 0; | 558 int reverse_count = 0; |
| 559 int primary_count = 0; | 559 int primary_count = 0; |
| 560 int near_read_bytes = 0; | 560 int near_read_bytes = 0; |
| 561 TickInterval acc_ticks; | 561 int64_t acc_ticks = 0; |
| 562 | 562 |
| 563 AudioFrame far_frame; | 563 AudioFrame far_frame; |
| 564 AudioFrame near_frame; | 564 AudioFrame near_frame; |
| 565 | 565 |
| 566 int delay_ms = 0; | 566 int delay_ms = 0; |
| 567 int drift_samples = 0; | 567 int drift_samples = 0; |
| 568 int capture_level = 127; | 568 int capture_level = 127; |
| 569 int8_t stream_has_voice = 0; | 569 int8_t stream_has_voice = 0; |
| 570 float ns_speech_prob = 0.0f; | 570 float ns_speech_prob = 0.0f; |
| 571 | 571 |
| 572 TickTime t0 = TickTime::Now(); | 572 int64_t t0 = rtc::TimeNanos(); |
| 573 TickTime t1 = t0; | 573 int64_t t1 = t0; |
| 574 int64_t max_time_us = 0; | 574 int64_t max_time_us = 0; |
| 575 int64_t max_time_reverse_us = 0; | 575 int64_t max_time_reverse_us = 0; |
| 576 int64_t min_time_us = 1e6; | 576 int64_t min_time_us = 1e6; |
| 577 int64_t min_time_reverse_us = 1e6; | 577 int64_t min_time_reverse_us = 1e6; |
| 578 | 578 |
| 579 // TODO(ajm): Ideally we would refactor this block into separate functions, | 579 // TODO(ajm): Ideally we would refactor this block into separate functions, |
| 580 // but for now we want to share the variables. | 580 // but for now we want to share the variables. |
| 581 if (pb_file) { | 581 if (pb_file) { |
| 582 Event event_msg; | 582 Event event_msg; |
| 583 std::unique_ptr<ChannelBuffer<float> > reverse_cb; | 583 std::unique_ptr<ChannelBuffer<float> > reverse_cb; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 665 } else { | 665 } else { |
| 666 for (int i = 0; i < msg.channel_size(); ++i) { | 666 for (int i = 0; i < msg.channel_size(); ++i) { |
| 667 memcpy(reverse_cb->channels()[i], | 667 memcpy(reverse_cb->channels()[i], |
| 668 msg.channel(i).data(), | 668 msg.channel(i).data(), |
| 669 reverse_cb->num_frames() * | 669 reverse_cb->num_frames() * |
| 670 sizeof(reverse_cb->channels()[i][0])); | 670 sizeof(reverse_cb->channels()[i][0])); |
| 671 } | 671 } |
| 672 } | 672 } |
| 673 | 673 |
| 674 if (perf_testing) { | 674 if (perf_testing) { |
| 675 t0 = TickTime::Now(); | 675 t0 = rtc::TimeNanos(); |
| 676 } | 676 } |
| 677 | 677 |
| 678 if (msg.has_data()) { | 678 if (msg.has_data()) { |
| 679 ASSERT_EQ(apm->kNoError, | 679 ASSERT_EQ(apm->kNoError, |
| 680 apm->ProcessReverseStream(&far_frame)); | 680 apm->ProcessReverseStream(&far_frame)); |
| 681 } else { | 681 } else { |
| 682 ASSERT_EQ(apm->kNoError, | 682 ASSERT_EQ(apm->kNoError, |
| 683 apm->AnalyzeReverseStream( | 683 apm->AnalyzeReverseStream( |
| 684 reverse_cb->channels(), | 684 reverse_cb->channels(), |
| 685 far_frame.samples_per_channel_, | 685 far_frame.samples_per_channel_, |
| 686 far_frame.sample_rate_hz_, | 686 far_frame.sample_rate_hz_, |
| 687 LayoutFromChannels(far_frame.num_channels_))); | 687 LayoutFromChannels(far_frame.num_channels_))); |
| 688 } | 688 } |
| 689 | 689 |
| 690 if (perf_testing) { | 690 if (perf_testing) { |
| 691 t1 = TickTime::Now(); | 691 t1 = rtc::TimeNanos(); |
| 692 TickInterval tick_diff = t1 - t0; | 692 int64_t tick_diff = t1 - t0; |
|
stefan-webrtc
2016/04/19 09:19:12
tick_diff is a bad variable name now.
nisse-webrtc
2016/04/19 12:19:25
Renaming tick_diff --> diff_nanos and acc_ticks --
| |
| 693 acc_ticks += tick_diff; | 693 acc_ticks += tick_diff; |
| 694 if (tick_diff.Microseconds() > max_time_reverse_us) { | 694 int64_t diff_us = tick_diff / rtc::kNumNanosecsPerMicrosec; |
| 695 max_time_reverse_us = tick_diff.Microseconds(); | 695 if (diff_us > max_time_reverse_us) { |
| 696 max_time_reverse_us = diff_us; | |
| 696 } | 697 } |
| 697 if (tick_diff.Microseconds() < min_time_reverse_us) { | 698 if (diff_us < min_time_reverse_us) { |
| 698 min_time_reverse_us = tick_diff.Microseconds(); | 699 min_time_reverse_us = diff_us; |
| 699 } | 700 } |
| 700 } | 701 } |
| 701 | 702 |
| 702 } else if (event_msg.type() == Event::STREAM) { | 703 } else if (event_msg.type() == Event::STREAM) { |
| 703 ASSERT_TRUE(event_msg.has_stream()); | 704 ASSERT_TRUE(event_msg.has_stream()); |
| 704 const Stream msg = event_msg.stream(); | 705 const Stream msg = event_msg.stream(); |
| 705 primary_count++; | 706 primary_count++; |
| 706 | 707 |
| 707 // ProcessStream could have changed this for the output frame. | 708 // ProcessStream could have changed this for the output frame. |
| 708 near_frame.num_channels_ = apm->num_input_channels(); | 709 near_frame.num_channels_ = apm->num_input_channels(); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 726 } | 727 } |
| 727 | 728 |
| 728 if (progress && primary_count % 100 == 0) { | 729 if (progress && primary_count % 100 == 0) { |
| 729 near_read_bytes = std::min(near_read_bytes, near_size_bytes); | 730 near_read_bytes = std::min(near_read_bytes, near_size_bytes); |
| 730 printf("%.0f%% complete\r", | 731 printf("%.0f%% complete\r", |
| 731 (near_read_bytes * 100.0) / near_size_bytes); | 732 (near_read_bytes * 100.0) / near_size_bytes); |
| 732 fflush(stdout); | 733 fflush(stdout); |
| 733 } | 734 } |
| 734 | 735 |
| 735 if (perf_testing) { | 736 if (perf_testing) { |
| 736 t0 = TickTime::Now(); | 737 t0 = rtc::TimeNanos(); |
| 737 } | 738 } |
| 738 | 739 |
| 739 ASSERT_EQ(apm->kNoError, | 740 ASSERT_EQ(apm->kNoError, |
| 740 apm->gain_control()->set_stream_analog_level(msg.level())); | 741 apm->gain_control()->set_stream_analog_level(msg.level())); |
| 741 delay_ms = msg.delay() + extra_delay_ms; | 742 delay_ms = msg.delay() + extra_delay_ms; |
| 742 if (override_delay_ms) { | 743 if (override_delay_ms) { |
| 743 delay_ms = override_delay_ms; | 744 delay_ms = override_delay_ms; |
| 744 } | 745 } |
| 745 ASSERT_EQ(apm->kNoError, | 746 ASSERT_EQ(apm->kNoError, |
| 746 apm->set_stream_delay_ms(delay_ms)); | 747 apm->set_stream_delay_ms(delay_ms)); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 784 | 785 |
| 785 if (ns_prob_file != NULL) { | 786 if (ns_prob_file != NULL) { |
| 786 ns_speech_prob = apm->noise_suppression()->speech_probability(); | 787 ns_speech_prob = apm->noise_suppression()->speech_probability(); |
| 787 ASSERT_EQ(1u, fwrite(&ns_speech_prob, | 788 ASSERT_EQ(1u, fwrite(&ns_speech_prob, |
| 788 sizeof(ns_speech_prob), | 789 sizeof(ns_speech_prob), |
| 789 1, | 790 1, |
| 790 ns_prob_file)); | 791 ns_prob_file)); |
| 791 } | 792 } |
| 792 | 793 |
| 793 if (perf_testing) { | 794 if (perf_testing) { |
| 794 t1 = TickTime::Now(); | 795 t1 = rtc::TimeNanos(); |
| 795 TickInterval tick_diff = t1 - t0; | 796 int64_t tick_diff = t1 - t0; |
|
stefan-webrtc
2016/04/19 09:19:12
diff_nanos? Same below
| |
| 796 acc_ticks += tick_diff; | 797 acc_ticks += tick_diff; |
| 797 if (tick_diff.Microseconds() > max_time_us) { | 798 int64_t diff_us = tick_diff / rtc::kNumNanosecsPerMicrosec; |
| 798 max_time_us = tick_diff.Microseconds(); | 799 if (diff_us > max_time_us) { |
| 800 max_time_us = diff_us; | |
| 799 } | 801 } |
| 800 if (tick_diff.Microseconds() < min_time_us) { | 802 if (diff_us < min_time_us) { |
| 801 min_time_us = tick_diff.Microseconds(); | 803 min_time_us = diff_us; |
| 802 } | 804 } |
| 803 } | 805 } |
| 804 | 806 |
| 805 const size_t samples_per_channel = output_sample_rate / 100; | 807 const size_t samples_per_channel = output_sample_rate / 100; |
| 806 if (msg.has_input_data()) { | 808 if (msg.has_input_data()) { |
| 807 if (raw_output && !output_raw_file) { | 809 if (raw_output && !output_raw_file) { |
| 808 output_raw_file.reset(new RawFile(out_filename + ".pcm")); | 810 output_raw_file.reset(new RawFile(out_filename + ".pcm")); |
| 809 } | 811 } |
| 810 WriteIntData(near_frame.data_, | 812 WriteIntData(near_frame.data_, |
| 811 apm->num_output_channels() * samples_per_channel, | 813 apm->num_output_channels() * samples_per_channel, |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 914 // not reaching end-of-file. | 916 // not reaching end-of-file. |
| 915 EXPECT_EQ(0, fseek(near_file, read_count * sizeof(int16_t), | 917 EXPECT_EQ(0, fseek(near_file, read_count * sizeof(int16_t), |
| 916 SEEK_CUR)); | 918 SEEK_CUR)); |
| 917 break; // This is expected. | 919 break; // This is expected. |
| 918 } | 920 } |
| 919 } else { | 921 } else { |
| 920 ASSERT_EQ(size, read_count); | 922 ASSERT_EQ(size, read_count); |
| 921 } | 923 } |
| 922 | 924 |
| 923 if (perf_testing) { | 925 if (perf_testing) { |
| 924 t0 = TickTime::Now(); | 926 t0 = rtc::TimeNanos(); |
| 925 } | 927 } |
| 926 | 928 |
| 927 ASSERT_EQ(apm->kNoError, | 929 ASSERT_EQ(apm->kNoError, |
| 928 apm->ProcessReverseStream(&far_frame)); | 930 apm->ProcessReverseStream(&far_frame)); |
| 929 | 931 |
| 930 if (perf_testing) { | 932 if (perf_testing) { |
| 931 t1 = TickTime::Now(); | 933 t1 = rtc::TimeNanos(); |
| 932 TickInterval tick_diff = t1 - t0; | 934 int64_t tick_diff = t1 - t0; |
| 933 acc_ticks += tick_diff; | 935 acc_ticks += tick_diff; |
| 934 if (tick_diff.Microseconds() > max_time_reverse_us) { | 936 int64_t diff_us = tick_diff / rtc::kNumNanosecsPerMicrosec; |
| 935 max_time_reverse_us = tick_diff.Microseconds(); | 937 if (diff_us > max_time_reverse_us) { |
| 938 max_time_reverse_us = diff_us; | |
| 936 } | 939 } |
| 937 if (tick_diff.Microseconds() < min_time_reverse_us) { | 940 if (diff_us < min_time_reverse_us) { |
| 938 min_time_reverse_us = tick_diff.Microseconds(); | 941 min_time_reverse_us = diff_us; |
| 939 } | 942 } |
| 940 } | 943 } |
| 941 | 944 |
| 942 } else if (event == kCaptureEvent) { | 945 } else if (event == kCaptureEvent) { |
| 943 primary_count++; | 946 primary_count++; |
| 944 near_frame.num_channels_ = num_capture_input_channels; | 947 near_frame.num_channels_ = num_capture_input_channels; |
| 945 | 948 |
| 946 size_t size = samples_per_channel * num_capture_input_channels; | 949 size_t size = samples_per_channel * num_capture_input_channels; |
| 947 read_count = fread(near_frame.data_, | 950 read_count = fread(near_frame.data_, |
| 948 sizeof(int16_t), | 951 sizeof(int16_t), |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 971 ASSERT_EQ(1u, | 974 ASSERT_EQ(1u, |
| 972 fread(&drift_samples, sizeof(drift_samples), 1, drift_file)); | 975 fread(&drift_samples, sizeof(drift_samples), 1, drift_file)); |
| 973 } | 976 } |
| 974 | 977 |
| 975 if (apm->gain_control()->is_enabled() && | 978 if (apm->gain_control()->is_enabled() && |
| 976 apm->gain_control()->mode() == GainControl::kAdaptiveAnalog) { | 979 apm->gain_control()->mode() == GainControl::kAdaptiveAnalog) { |
| 977 SimulateMic(capture_level, &near_frame); | 980 SimulateMic(capture_level, &near_frame); |
| 978 } | 981 } |
| 979 | 982 |
| 980 if (perf_testing) { | 983 if (perf_testing) { |
| 981 t0 = TickTime::Now(); | 984 t0 = rtc::TimeNanos(); |
| 982 } | 985 } |
| 983 | 986 |
| 984 const int capture_level_in = capture_level; | 987 const int capture_level_in = capture_level; |
| 985 ASSERT_EQ(apm->kNoError, | 988 ASSERT_EQ(apm->kNoError, |
| 986 apm->gain_control()->set_stream_analog_level(capture_level)); | 989 apm->gain_control()->set_stream_analog_level(capture_level)); |
| 987 delay_ms += extra_delay_ms; | 990 delay_ms += extra_delay_ms; |
| 988 if (override_delay_ms) { | 991 if (override_delay_ms) { |
| 989 delay_ms = override_delay_ms; | 992 delay_ms = override_delay_ms; |
| 990 } | 993 } |
| 991 ASSERT_EQ(apm->kNoError, | 994 ASSERT_EQ(apm->kNoError, |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1019 sizeof(ns_speech_prob), | 1022 sizeof(ns_speech_prob), |
| 1020 1, | 1023 1, |
| 1021 ns_prob_file)); | 1024 ns_prob_file)); |
| 1022 } | 1025 } |
| 1023 | 1026 |
| 1024 if (apm->gain_control()->mode() != GainControl::kAdaptiveAnalog) { | 1027 if (apm->gain_control()->mode() != GainControl::kAdaptiveAnalog) { |
| 1025 ASSERT_EQ(capture_level_in, capture_level); | 1028 ASSERT_EQ(capture_level_in, capture_level); |
| 1026 } | 1029 } |
| 1027 | 1030 |
| 1028 if (perf_testing) { | 1031 if (perf_testing) { |
| 1029 t1 = TickTime::Now(); | 1032 t1 = rtc::TimeNanos(); |
| 1030 TickInterval tick_diff = t1 - t0; | 1033 int64_t tick_diff = t1 - t0; |
| 1031 acc_ticks += tick_diff; | 1034 acc_ticks += tick_diff; |
| 1032 if (tick_diff.Microseconds() > max_time_us) { | 1035 int64_t diff_us = tick_diff / rtc::kNumNanosecsPerMicrosec; |
| 1033 max_time_us = tick_diff.Microseconds(); | 1036 if (diff_us > max_time_us) { |
| 1037 max_time_us = diff_us; | |
| 1034 } | 1038 } |
| 1035 if (tick_diff.Microseconds() < min_time_us) { | 1039 if (diff_us < min_time_us) { |
| 1036 min_time_us = tick_diff.Microseconds(); | 1040 min_time_us = diff_us; |
| 1037 } | 1041 } |
| 1038 } | 1042 } |
| 1039 | 1043 |
| 1040 if (raw_output && !output_raw_file) { | 1044 if (raw_output && !output_raw_file) { |
| 1041 output_raw_file.reset(new RawFile(out_filename + ".pcm")); | 1045 output_raw_file.reset(new RawFile(out_filename + ".pcm")); |
| 1042 } | 1046 } |
| 1043 if (!raw_output && !output_wav_file) { | 1047 if (!raw_output && !output_wav_file) { |
| 1044 output_wav_file.reset(new WavWriter(out_filename + ".wav", | 1048 output_wav_file.reset(new WavWriter(out_filename + ".wav", |
| 1045 sample_rate_hz, | 1049 sample_rate_hz, |
| 1046 num_capture_output_channels)); | 1050 num_capture_output_channels)); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1119 EXPECT_NE(0, feof(event_file)) << "Event file not fully processed"; | 1123 EXPECT_NE(0, feof(event_file)) << "Event file not fully processed"; |
| 1120 read_count = fread(&temp_int8, sizeof(temp_int8), 1, delay_file); | 1124 read_count = fread(&temp_int8, sizeof(temp_int8), 1, delay_file); |
| 1121 EXPECT_NE(0, feof(delay_file)) << "Delay file not fully processed"; | 1125 EXPECT_NE(0, feof(delay_file)) << "Delay file not fully processed"; |
| 1122 read_count = fread(&temp_int8, sizeof(temp_int8), 1, drift_file); | 1126 read_count = fread(&temp_int8, sizeof(temp_int8), 1, drift_file); |
| 1123 EXPECT_NE(0, feof(drift_file)) << "Drift file not fully processed"; | 1127 EXPECT_NE(0, feof(drift_file)) << "Drift file not fully processed"; |
| 1124 } | 1128 } |
| 1125 } | 1129 } |
| 1126 | 1130 |
| 1127 if (perf_testing) { | 1131 if (perf_testing) { |
| 1128 if (primary_count > 0) { | 1132 if (primary_count > 0) { |
| 1129 int64_t exec_time = acc_ticks.Milliseconds(); | 1133 int64_t exec_time = acc_ticks / rtc::kNumNanosecsPerMillisec; |
| 1130 printf("\nTotal time: %.3f s, file time: %.2f s\n", | 1134 printf("\nTotal time: %.3f s, file time: %.2f s\n", |
| 1131 exec_time * 0.001, primary_count * 0.01); | 1135 exec_time * 0.001, primary_count * 0.01); |
| 1132 printf("Time per frame: %.3f ms (average), %.3f ms (max)," | 1136 printf("Time per frame: %.3f ms (average), %.3f ms (max)," |
| 1133 " %.3f ms (min)\n", | 1137 " %.3f ms (min)\n", |
| 1134 (exec_time * 1.0) / primary_count, | 1138 (exec_time * 1.0) / primary_count, |
| 1135 (max_time_us + max_time_reverse_us) / 1000.0, | 1139 (max_time_us + max_time_reverse_us) / 1000.0, |
| 1136 (min_time_us + min_time_reverse_us) / 1000.0); | 1140 (min_time_us + min_time_reverse_us) / 1000.0); |
| 1137 // Record the results with Perf test tools. | 1141 // Record the results with Perf test tools. |
| 1138 webrtc::test::PrintResult("audioproc", "", "time_per_10ms_frame", | 1142 webrtc::test::PrintResult("audioproc", "", "time_per_10ms_frame", |
| 1139 (exec_time * 1000) / primary_count, "us", false); | 1143 (exec_time * 1000) / primary_count, "us", false); |
| 1140 } else { | 1144 } else { |
| 1141 printf("Warning: no capture frames\n"); | 1145 printf("Warning: no capture frames\n"); |
| 1142 } | 1146 } |
| 1143 } | 1147 } |
| 1144 } | 1148 } |
| 1145 | 1149 |
| 1146 } // namespace | 1150 } // namespace |
| 1147 } // namespace webrtc | 1151 } // namespace webrtc |
| 1148 | 1152 |
| 1149 int main(int argc, char* argv[]) { | 1153 int main(int argc, char* argv[]) { |
| 1150 webrtc::void_main(argc, argv); | 1154 webrtc::void_main(argc, argv); |
| 1151 | 1155 |
| 1152 // Optional, but removes memory leak noise from Valgrind. | 1156 // Optional, but removes memory leak noise from Valgrind. |
| 1153 google::protobuf::ShutdownProtobufLibrary(); | 1157 google::protobuf::ShutdownProtobufLibrary(); |
| 1154 return 0; | 1158 return 0; |
| 1155 } | 1159 } |
| OLD | NEW |