diff --git a/webrtc/modules/audio_coding/neteq/neteq.gypi b/webrtc/modules/audio_coding/neteq/neteq.gypi index c68651d6de..3ca2aaa099 100644 --- a/webrtc/modules/audio_coding/neteq/neteq.gypi +++ b/webrtc/modules/audio_coding/neteq/neteq.gypi @@ -171,6 +171,7 @@ 'type': 'static_library', 'dependencies': [ 'rtp_rtcp', + '<(webrtc_root)/common_audio/common_audio.gyp:common_audio', '<(webrtc_root)/test/test.gyp:rtp_test_utils', ], 'direct_dependent_settings': { @@ -191,6 +192,7 @@ 'tools/input_audio_file.cc', 'tools/input_audio_file.h', 'tools/output_audio_file.h', + 'tools/output_wav_file.h', 'tools/packet.cc', 'tools/packet.h', 'tools/packet_source.h', diff --git a/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc b/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc index 4247807b38..7a5968a217 100644 --- a/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc +++ b/webrtc/modules/audio_coding/neteq/tools/neteq_rtpplay.cc @@ -26,6 +26,8 @@ #include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h" #include "webrtc/modules/audio_coding/neteq/interface/neteq.h" #include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h" +#include "webrtc/modules/audio_coding/neteq/tools/output_audio_file.h" +#include "webrtc/modules/audio_coding/neteq/tools/output_wav_file.h" #include "webrtc/modules/audio_coding/neteq/tools/packet.h" #include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h" #include "webrtc/modules/interface/module_common_types.h" @@ -163,7 +165,7 @@ int main(int argc, char* argv[]) { std::string usage = "Tool for decoding an RTP dump file using NetEq.\n" "Run " + program_name + " --helpshort for usage.\n" "Example usage:\n" + program_name + - " input.rtp output.pcm\n"; + " input.rtp output.{pcm, wav}\n"; google::SetUsageMessage(usage); google::ParseCommandLineFlags(&argc, &argv, true); @@ -193,13 +195,6 @@ int main(int argc, char* argv[]) { file_source->SelectSsrc(ssrc); } - FILE* out_file = fopen(argv[2], "wb"); - if (!out_file) { - std::cerr << "Cannot open output file " << argv[2] << std::endl; - exit(1); - } - std::cout << "Output file: " << argv[2] << std::endl; - // Check if a replacement audio file was provided, and if so, open it. bool replace_payload = false; webrtc::scoped_ptr replacement_audio_file; @@ -209,19 +204,6 @@ int main(int argc, char* argv[]) { replace_payload = true; } - // Enable tracing. - webrtc::Trace::CreateTrace(); - webrtc::Trace::SetTraceFile((webrtc::test::OutputPath() + - "neteq_trace.txt").c_str()); - webrtc::Trace::set_level_filter(webrtc::kTraceAll); - - // Initialize NetEq instance. - int sample_rate_hz = 16000; - NetEq::Config config; - config.sample_rate_hz = sample_rate_hz; - NetEq* neteq = NetEq::Create(config); - RegisterPayloadTypes(neteq); - // Read first packet. webrtc::scoped_ptr packet(file_source->NextPacket()); if (!packet) { @@ -233,6 +215,44 @@ int main(int argc, char* argv[]) { } bool packet_available = true; + // Check the sample rate. + int sample_rate_hz = CodecSampleRate(packet->header().payloadType); + if (sample_rate_hz <= 0) { + printf("Warning: Invalid sample rate from RTP packet.\n"); + webrtc::Trace::ReturnTrace(); + return 0; + } + + // Open the output file now that we know the sample rate. (Rate is only needed + // for wav files.) + // Check output file type. + std::string output_file_name = argv[2]; + webrtc::scoped_ptr output; + if (output_file_name.size() >= 4 && + output_file_name.substr(output_file_name.size() - 4) == ".wav") { + // Open a wav file. + output.reset( + new webrtc::test::OutputWavFile(output_file_name, sample_rate_hz)); + } else { + // Open a pcm file. + output.reset(new webrtc::test::OutputAudioFile(output_file_name)); + } + + std::cout << "Output file: " << argv[2] << std::endl; + + // Enable tracing. + webrtc::Trace::CreateTrace(); + webrtc::Trace::SetTraceFile((webrtc::test::OutputPath() + + "neteq_trace.txt").c_str()); + webrtc::Trace::set_level_filter(webrtc::kTraceAll); + + // Initialize NetEq instance. + NetEq::Config config; + config.sample_rate_hz = sample_rate_hz; + NetEq* neteq = NetEq::Create(config); + RegisterPayloadTypes(neteq); + + // Set up variables for audio replacement if needed. webrtc::scoped_ptr next_packet; bool next_packet_available = false; @@ -349,8 +369,7 @@ int main(int argc, char* argv[]) { // Write to file. // TODO(hlundin): Make writing to file optional. size_t write_len = samples_per_channel * num_channels; - if (fwrite(out_data, sizeof(out_data[0]), write_len, out_file) != - write_len) { + if (!output->WriteArray(out_data, write_len)) { std::cerr << "Error while writing to file" << std::endl; webrtc::Trace::ReturnTrace(); exit(1); @@ -363,7 +382,6 @@ int main(int argc, char* argv[]) { std::cout << "Simulation done" << std::endl; - fclose(out_file); delete neteq; webrtc::Trace::ReturnTrace(); return 0; diff --git a/webrtc/modules/audio_coding/neteq/tools/output_wav_file.h b/webrtc/modules/audio_coding/neteq/tools/output_wav_file.h new file mode 100644 index 0000000000..1f72162c62 --- /dev/null +++ b/webrtc/modules/audio_coding/neteq/tools/output_wav_file.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_OUTPUT_WAV_FILE_H_ +#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_OUTPUT_WAV_FILE_H_ + +#include + +#include "webrtc/base/constructormagic.h" +#include "webrtc/common_audio/wav_file.h" +#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h" + +namespace webrtc { +namespace test { + +class OutputWavFile : public AudioSink { + public: + // Creates an OutputWavFile, opening a file named |file_name| for writing. + // The output file is a PCM encoded wav file. + OutputWavFile(const std::string& file_name, int sample_rate_hz) + : wav_writer_(file_name, sample_rate_hz, 1) {} + + virtual bool WriteArray(const int16_t* audio, size_t num_samples) OVERRIDE { + wav_writer_.WriteSamples(audio, num_samples); + return true; + } + + private: + WavWriter wav_writer_; + + DISALLOW_COPY_AND_ASSIGN(OutputWavFile); +}; + +} // namespace test +} // namespace webrtc +#endif // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_OUTPUT_WAV_FILE_H_