From 5f93709e7c65faa9616f09368a92d47087b778f5 Mon Sep 17 00:00:00 2001 From: minyue Date: Fri, 31 Mar 2017 12:27:09 -0700 Subject: [PATCH] Supporting 48kHz PCM file. BUG=None Review-Url: https://codereview.webrtc.org/2790493004 Cr-Commit-Position: refs/heads/master@{#17493} --- webrtc/common_types.h | 3 +- webrtc/modules/media_file/media_file_impl.cc | 14 ++++++--- .../modules/media_file/media_file_utility.cc | 30 +++++++++++++++++-- .../modules/media_file/media_file_utility.h | 1 + webrtc/voice_engine/file_player.cc | 22 +++++++++----- webrtc/voice_engine/file_player.h | 4 +-- 6 files changed, 57 insertions(+), 17 deletions(-) diff --git a/webrtc/common_types.h b/webrtc/common_types.h index e1a4c77d37..cbad3b8d81 100644 --- a/webrtc/common_types.h +++ b/webrtc/common_types.h @@ -139,7 +139,8 @@ enum FileFormats { kFileFormatPreencodedFile = 4, kFileFormatPcm16kHzFile = 7, kFileFormatPcm8kHzFile = 8, - kFileFormatPcm32kHzFile = 9 + kFileFormatPcm32kHzFile = 9, + kFileFormatPcm48kHzFile = 10 }; enum FrameType { diff --git a/webrtc/modules/media_file/media_file_impl.cc b/webrtc/modules/media_file/media_file_impl.cc index e35626c760..88310a5ef6 100644 --- a/webrtc/modules/media_file/media_file_impl.cc +++ b/webrtc/modules/media_file/media_file_impl.cc @@ -132,6 +132,7 @@ int32_t MediaFileImpl::PlayoutAudioData(int8_t* buffer, switch(_fileFormat) { + case kFileFormatPcm48kHzFile: case kFileFormatPcm32kHzFile: case kFileFormatPcm16kHzFile: case kFileFormatPcm8kHzFile: @@ -479,6 +480,7 @@ int32_t MediaFileImpl::StartPlayingStream( case kFileFormatPcm8kHzFile: case kFileFormatPcm16kHzFile: case kFileFormatPcm32kHzFile: + case kFileFormatPcm48kHzFile: { // ValidFileFormat() called in the beginneing of this function // prevents codecInst from being NULL here. @@ -631,6 +633,7 @@ int32_t MediaFileImpl::IncomingAudioData( case kFileFormatPcm8kHzFile: case kFileFormatPcm16kHzFile: case kFileFormatPcm32kHzFile: + case kFileFormatPcm48kHzFile: bytesWritten = _ptrFileUtilityObj->WritePCMData( *_ptrOutStream, buffer, @@ -845,13 +848,15 @@ int32_t MediaFileImpl::StartRecordingAudioStream( } case kFileFormatPcm8kHzFile: case kFileFormatPcm16kHzFile: + case kFileFormatPcm32kHzFile: + case kFileFormatPcm48kHzFile: { if(!ValidFrequency(codecInst.plfreq) || _ptrFileUtilityObj->InitPCMWriting(stream, codecInst.plfreq) == -1) { WEBRTC_TRACE(kTraceError, kTraceFile, _id, - "Failed to initialize 8 or 16KHz PCM file!"); + "Failed to initialize PCM file!"); delete _ptrFileUtilityObj; _ptrFileUtilityObj = NULL; return -1; @@ -1070,7 +1075,8 @@ bool MediaFileImpl::ValidFileFormat(const FileFormats format, if(format == kFileFormatPreencodedFile || format == kFileFormatPcm8kHzFile || format == kFileFormatPcm16kHzFile || - format == kFileFormatPcm32kHzFile) + format == kFileFormatPcm32kHzFile || + format == kFileFormatPcm48kHzFile) { WEBRTC_TRACE(kTraceError, kTraceFile, -1, "Codec info required for file format specified!"); @@ -1115,12 +1121,12 @@ bool MediaFileImpl::ValidFilePositions(const uint32_t startPointMs, bool MediaFileImpl::ValidFrequency(const uint32_t frequency) { - if((frequency == 8000) || (frequency == 16000)|| (frequency == 32000)) + if((frequency == 8000) || (frequency == 16000)|| (frequency == 32000) || (frequency == 48000)) { return true; } WEBRTC_TRACE(kTraceError, kTraceFile, -1, - "Frequency should be 8000, 16000 or 32000 (Hz)"); + "Frequency should be 8000, 16000, 32000, or 48000 (Hz)"); return false; } } // namespace webrtc diff --git a/webrtc/modules/media_file/media_file_utility.cc b/webrtc/modules/media_file/media_file_utility.cc index ae8d06f634..6c60b056b7 100644 --- a/webrtc/modules/media_file/media_file_utility.cc +++ b/webrtc/modules/media_file/media_file_utility.cc @@ -1178,6 +1178,16 @@ int32_t ModuleFileUtility::InitPCMReading(InStream& pcm, codec_info_.rate = 512000; _codecId = kCodecL16_32Khz; } + else if(freq == 48000) + { + strcpy(codec_info_.plname, "L16"); + codec_info_.pltype = -1; + codec_info_.plfreq = 48000; + codec_info_.pacsize = 480; + codec_info_.channels = 1; + codec_info_.rate = 768000; + _codecId = kCodecL16_48Khz; + } // Readsize for 10ms of audio data (2 bytes per sample). _readSizeBytes = 2 * codec_info_. plfreq / 100; @@ -1313,12 +1323,24 @@ int32_t ModuleFileUtility::InitPCMWriting(OutStream& out, uint32_t freq) _codecId = kCodecL16_32Khz; } + else if(freq == 48000) + { + strcpy(codec_info_.plname, "L16"); + codec_info_.pltype = -1; + codec_info_.plfreq = 48000; + codec_info_.pacsize = 480; + codec_info_.channels = 1; + codec_info_.rate = 768000; + + _codecId = kCodecL16_48Khz; + } if((_codecId != kCodecL16_8Khz) && (_codecId != kCodecL16_16kHz) && - (_codecId != kCodecL16_32Khz)) + (_codecId != kCodecL16_32Khz) && + (_codecId != kCodecL16_48Khz)) { WEBRTC_TRACE(kTraceError, kTraceFile, _id, - "CodecInst is not 8KHz PCM or 16KHz PCM!"); + "CodecInst is not 8KHz, 16KHz, 32kHz or 48kHz PCM!"); return -1; } _writing = true; @@ -1389,6 +1411,10 @@ int32_t ModuleFileUtility::set_codec_info(const CodecInst& codecInst) { _codecId = kCodecL16_32Khz; } + else if(codecInst.plfreq == 48000) + { + _codecId = kCodecL16_48Khz; + } } #ifdef WEBRTC_CODEC_ILBC else if(STR_CASE_CMP(codecInst.plname, "ilbc") == 0) diff --git a/webrtc/modules/media_file/media_file_utility.h b/webrtc/modules/media_file/media_file_utility.h index 52cd8078df..659ddd0e5f 100644 --- a/webrtc/modules/media_file/media_file_utility.h +++ b/webrtc/modules/media_file/media_file_utility.h @@ -228,6 +228,7 @@ private: kCodecL16_8Khz, kCodecL16_16kHz, kCodecL16_32Khz, + kCodecL16_48Khz, kCodecPcmu, kCodecPcma, kCodecIlbc20Ms, diff --git a/webrtc/voice_engine/file_player.cc b/webrtc/voice_engine/file_player.cc index 4ee1322e9b..81ba34fa7a 100644 --- a/webrtc/voice_engine/file_player.cc +++ b/webrtc/voice_engine/file_player.cc @@ -100,7 +100,7 @@ int32_t FilePlayerImpl::Frequency() const { } else if (_codec.plfreq == 44000) { return 32000; } else if (_codec.plfreq == 48000) { - return 32000; + return 48000; } else { return _codec.plfreq; } @@ -220,16 +220,18 @@ int32_t FilePlayerImpl::StartPlayingFile(const char* fileName, codecInstL16.rate = 128000; codecInstL16.plfreq = 8000; codecInstL16.pacsize = 80; - } else if (_fileFormat == kFileFormatPcm16kHzFile) { codecInstL16.rate = 256000; codecInstL16.plfreq = 16000; codecInstL16.pacsize = 160; - } else if (_fileFormat == kFileFormatPcm32kHzFile) { codecInstL16.rate = 512000; codecInstL16.plfreq = 32000; - codecInstL16.pacsize = 160; + codecInstL16.pacsize = 320; + } else if (_fileFormat == kFileFormatPcm48kHzFile) { + codecInstL16.rate = 768000; + codecInstL16.plfreq = 48000; + codecInstL16.pacsize = 480; } else { LOG(LS_ERROR) << "StartPlayingFile() sample frequency not " << "supported for PCM format."; @@ -277,7 +279,8 @@ int32_t FilePlayerImpl::StartPlayingFile(InStream* sourceStream, const CodecInst* codecInst) { if (_fileFormat == kFileFormatPcm16kHzFile || _fileFormat == kFileFormatPcm32kHzFile || - _fileFormat == kFileFormatPcm8kHzFile) { + _fileFormat == kFileFormatPcm8kHzFile || + _fileFormat == kFileFormatPcm48kHzFile) { CodecInst codecInstL16; strncpy(codecInstL16.plname, "L16", 32); codecInstL16.pltype = 93; @@ -287,16 +290,18 @@ int32_t FilePlayerImpl::StartPlayingFile(InStream* sourceStream, codecInstL16.rate = 128000; codecInstL16.plfreq = 8000; codecInstL16.pacsize = 80; - } else if (_fileFormat == kFileFormatPcm16kHzFile) { codecInstL16.rate = 256000; codecInstL16.plfreq = 16000; codecInstL16.pacsize = 160; - } else if (_fileFormat == kFileFormatPcm32kHzFile) { codecInstL16.rate = 512000; codecInstL16.plfreq = 32000; - codecInstL16.pacsize = 160; + codecInstL16.pacsize = 320; + } else if (_fileFormat == kFileFormatPcm48kHzFile) { + codecInstL16.rate = 768000; + codecInstL16.plfreq = 48000; + codecInstL16.pacsize = 480; } else { LOG(LS_ERROR) << "StartPlayingFile() sample frequency not " << "supported for PCM format."; @@ -379,6 +384,7 @@ std::unique_ptr FilePlayer::CreateFilePlayer( case kFileFormatPcm16kHzFile: case kFileFormatPcm8kHzFile: case kFileFormatPcm32kHzFile: + case kFileFormatPcm48kHzFile: // audio formats return std::unique_ptr( new FilePlayerImpl(instanceID, fileFormat)); diff --git a/webrtc/voice_engine/file_player.h b/webrtc/voice_engine/file_player.h index 956016f07f..1a321f6407 100644 --- a/webrtc/voice_engine/file_player.h +++ b/webrtc/voice_engine/file_player.h @@ -23,8 +23,8 @@ class FileCallback; class FilePlayer { public: - // The largest decoded frame size in samples (60ms with 32kHz sample rate). - enum { MAX_AUDIO_BUFFER_IN_SAMPLES = 60 * 32 }; + // The largest decoded frame size in samples (120ms with 48kHz sample rate). + enum { MAX_AUDIO_BUFFER_IN_SAMPLES = 120 * 48 }; enum { MAX_AUDIO_BUFFER_IN_BYTES = MAX_AUDIO_BUFFER_IN_SAMPLES * 2 }; // Note: will return NULL for unsupported formats.