| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2  *  Copyright (c) 2013 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 // TODO(hlundin): The functionality in this file should be moved into one or | 11 // TODO(hlundin): The functionality in this file should be moved into one or | 
| 12 // several classes. | 12 // several classes. | 
| 13 | 13 | 
| 14 #include <assert.h> | 14 #include <assert.h> | 
| 15 #include <errno.h> | 15 #include <errno.h> | 
| 16 #include <limits.h>  // For ULONG_MAX returned by strtoul. | 16 #include <limits.h>  // For ULONG_MAX returned by strtoul. | 
| 17 #include <stdio.h> | 17 #include <stdio.h> | 
| 18 #include <stdlib.h>  // For strtoul. | 18 #include <stdlib.h>  // For strtoul. | 
| 19 | 19 | 
| 20 #include <algorithm> | 20 #include <algorithm> | 
| 21 #include <iostream> | 21 #include <iostream> | 
| 22 #include <string> | 22 #include <string> | 
| 23 | 23 | 
| 24 #include "google/gflags.h" | 24 #include "google/gflags.h" | 
| 25 #include "webrtc/base/checks.h" | 25 #include "webrtc/base/checks.h" | 
|  | 26 #include "webrtc/base/safe_conversions.h" | 
| 26 #include "webrtc/base/scoped_ptr.h" | 27 #include "webrtc/base/scoped_ptr.h" | 
| 27 #include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h" | 28 #include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h" | 
| 28 #include "webrtc/modules/audio_coding/neteq/interface/neteq.h" | 29 #include "webrtc/modules/audio_coding/neteq/interface/neteq.h" | 
| 29 #include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h" | 30 #include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h" | 
| 30 #include "webrtc/modules/audio_coding/neteq/tools/output_audio_file.h" | 31 #include "webrtc/modules/audio_coding/neteq/tools/output_audio_file.h" | 
| 31 #include "webrtc/modules/audio_coding/neteq/tools/output_wav_file.h" | 32 #include "webrtc/modules/audio_coding/neteq/tools/output_wav_file.h" | 
| 32 #include "webrtc/modules/audio_coding/neteq/tools/packet.h" | 33 #include "webrtc/modules/audio_coding/neteq/tools/packet.h" | 
| 33 #include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h" | 34 #include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h" | 
| 34 #include "webrtc/modules/interface/module_common_types.h" | 35 #include "webrtc/modules/interface/module_common_types.h" | 
| 35 #include "webrtc/system_wrappers/interface/trace.h" | 36 #include "webrtc/system_wrappers/interface/trace.h" | 
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 317     assert(*frame_size_samples > 0); | 318     assert(*frame_size_samples > 0); | 
| 318     if (!replacement_audio_file->Read(*frame_size_samples, | 319     if (!replacement_audio_file->Read(*frame_size_samples, | 
| 319                                       (*replacement_audio).get())) { | 320                                       (*replacement_audio).get())) { | 
| 320       std::cerr << "Could not read replacement audio file." << std::endl; | 321       std::cerr << "Could not read replacement audio file." << std::endl; | 
| 321       webrtc::Trace::ReturnTrace(); | 322       webrtc::Trace::ReturnTrace(); | 
| 322       exit(1); | 323       exit(1); | 
| 323     } | 324     } | 
| 324     // Encode it as PCM16. | 325     // Encode it as PCM16. | 
| 325     assert((*payload).get()); | 326     assert((*payload).get()); | 
| 326     payload_len = WebRtcPcm16b_Encode((*replacement_audio).get(), | 327     payload_len = WebRtcPcm16b_Encode((*replacement_audio).get(), | 
| 327                                       static_cast<int16_t>(*frame_size_samples), | 328                                       *frame_size_samples, | 
| 328                                       (*payload).get()); | 329                                       (*payload).get()); | 
| 329     assert(payload_len == 2 * *frame_size_samples); | 330     assert(payload_len == 2 * *frame_size_samples); | 
| 330     // Change payload type to PCM16. | 331     // Change payload type to PCM16. | 
| 331     switch (CodecSampleRate(rtp_header->header.payloadType)) { | 332     switch (CodecSampleRate(rtp_header->header.payloadType)) { | 
| 332       case 8000: | 333       case 8000: | 
| 333         rtp_header->header.payloadType = static_cast<uint8_t>(FLAGS_pcm16b); | 334         rtp_header->header.payloadType = static_cast<uint8_t>(FLAGS_pcm16b); | 
| 334         break; | 335         break; | 
| 335       case 16000: | 336       case 16000: | 
| 336         rtp_header->header.payloadType = static_cast<uint8_t>(FLAGS_pcm16b_wb); | 337         rtp_header->header.payloadType = static_cast<uint8_t>(FLAGS_pcm16b_wb); | 
| 337         break; | 338         break; | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 351         exit(1); | 352         exit(1); | 
| 352     } | 353     } | 
| 353   } | 354   } | 
| 354   return payload_len; | 355   return payload_len; | 
| 355 } | 356 } | 
| 356 | 357 | 
| 357 }  // namespace | 358 }  // namespace | 
| 358 | 359 | 
| 359 int main(int argc, char* argv[]) { | 360 int main(int argc, char* argv[]) { | 
| 360   static const int kMaxChannels = 5; | 361   static const int kMaxChannels = 5; | 
| 361   static const int kMaxSamplesPerMs = 48000 / 1000; | 362   static const size_t kMaxSamplesPerMs = 48000 / 1000; | 
| 362   static const int kOutputBlockSizeMs = 10; | 363   static const int kOutputBlockSizeMs = 10; | 
| 363 | 364 | 
| 364   std::string program_name = argv[0]; | 365   std::string program_name = argv[0]; | 
| 365   std::string usage = "Tool for decoding an RTP dump file using NetEq.\n" | 366   std::string usage = "Tool for decoding an RTP dump file using NetEq.\n" | 
| 366       "Run " + program_name + " --helpshort for usage.\n" | 367       "Run " + program_name + " --helpshort for usage.\n" | 
| 367       "Example usage:\n" + program_name + | 368       "Example usage:\n" + program_name + | 
| 368       " input.rtp output.{pcm, wav}\n"; | 369       " input.rtp output.{pcm, wav}\n"; | 
| 369   google::SetUsageMessage(usage); | 370   google::SetUsageMessage(usage); | 
| 370   google::ParseCommandLineFlags(&argc, &argv, true); | 371   google::ParseCommandLineFlags(&argc, &argv, true); | 
| 371 | 372 | 
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 545         if (packet_available != next_packet_available) { | 546         if (packet_available != next_packet_available) { | 
| 546           packet_available = !packet_available; | 547           packet_available = !packet_available; | 
| 547           next_packet_available = !next_packet_available; | 548           next_packet_available = !next_packet_available; | 
| 548         } | 549         } | 
| 549       } | 550       } | 
| 550       next_input_time_ms = packet->time_ms(); | 551       next_input_time_ms = packet->time_ms(); | 
| 551     } | 552     } | 
| 552 | 553 | 
| 553     // Check if it is time to get output audio. | 554     // Check if it is time to get output audio. | 
| 554     if (time_now_ms >= next_output_time_ms) { | 555     if (time_now_ms >= next_output_time_ms) { | 
| 555       static const int kOutDataLen = | 556       static const size_t kOutDataLen = | 
| 556           kOutputBlockSizeMs * kMaxSamplesPerMs * kMaxChannels; | 557           kOutputBlockSizeMs * kMaxSamplesPerMs * kMaxChannels; | 
| 557       int16_t out_data[kOutDataLen]; | 558       int16_t out_data[kOutDataLen]; | 
| 558       int num_channels; | 559       int num_channels; | 
| 559       int samples_per_channel; | 560       size_t samples_per_channel; | 
| 560       int error = neteq->GetAudio(kOutDataLen, out_data, &samples_per_channel, | 561       int error = neteq->GetAudio(kOutDataLen, out_data, &samples_per_channel, | 
| 561                                    &num_channels, NULL); | 562                                    &num_channels, NULL); | 
| 562       if (error != NetEq::kOK) { | 563       if (error != NetEq::kOK) { | 
| 563         std::cerr << "GetAudio returned error code " << | 564         std::cerr << "GetAudio returned error code " << | 
| 564             neteq->LastError() << std::endl; | 565             neteq->LastError() << std::endl; | 
| 565       } else { | 566       } else { | 
| 566         // Calculate sample rate from output size. | 567         // Calculate sample rate from output size. | 
| 567         sample_rate_hz = 1000 * samples_per_channel / kOutputBlockSizeMs; | 568         sample_rate_hz = rtc::checked_cast<int>( | 
|  | 569             1000 * samples_per_channel / kOutputBlockSizeMs); | 
| 568       } | 570       } | 
| 569 | 571 | 
| 570       // Write to file. | 572       // Write to file. | 
| 571       // TODO(hlundin): Make writing to file optional. | 573       // TODO(hlundin): Make writing to file optional. | 
| 572       size_t write_len = samples_per_channel * num_channels; | 574       size_t write_len = samples_per_channel * num_channels; | 
| 573       if (!output->WriteArray(out_data, write_len)) { | 575       if (!output->WriteArray(out_data, write_len)) { | 
| 574         std::cerr << "Error while writing to file" << std::endl; | 576         std::cerr << "Error while writing to file" << std::endl; | 
| 575         webrtc::Trace::ReturnTrace(); | 577         webrtc::Trace::ReturnTrace(); | 
| 576         exit(1); | 578         exit(1); | 
| 577       } | 579       } | 
| 578       next_output_time_ms += kOutputBlockSizeMs; | 580       next_output_time_ms += kOutputBlockSizeMs; | 
| 579     } | 581     } | 
| 580     // Advance time to next event. | 582     // Advance time to next event. | 
| 581     time_now_ms = std::min(next_input_time_ms, next_output_time_ms); | 583     time_now_ms = std::min(next_input_time_ms, next_output_time_ms); | 
| 582   } | 584   } | 
| 583 | 585 | 
| 584   printf("Simulation done\n"); | 586   printf("Simulation done\n"); | 
| 585   printf("Produced %i ms of audio\n", time_now_ms - start_time_ms); | 587   printf("Produced %i ms of audio\n", time_now_ms - start_time_ms); | 
| 586 | 588 | 
| 587   delete neteq; | 589   delete neteq; | 
| 588   webrtc::Trace::ReturnTrace(); | 590   webrtc::Trace::ReturnTrace(); | 
| 589   return 0; | 591   return 0; | 
| 590 } | 592 } | 
| OLD | NEW | 
|---|