diff --git a/webrtc/common_types.h b/webrtc/common_types.h index ac5c2e2e7b..868bee4fec 100644 --- a/webrtc/common_types.h +++ b/webrtc/common_types.h @@ -142,7 +142,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 a869625cf5..a43769d6c6 100644 --- a/webrtc/modules/media_file/media_file_impl.cc +++ b/webrtc/modules/media_file/media_file_impl.cc @@ -125,6 +125,7 @@ int32_t MediaFileImpl::PlayoutAudioData(int8_t* buffer, switch(_fileFormat) { + case kFileFormatPcm48kHzFile: case kFileFormatPcm32kHzFile: case kFileFormatPcm16kHzFile: case kFileFormatPcm8kHzFile: @@ -450,6 +451,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. @@ -593,6 +595,7 @@ int32_t MediaFileImpl::IncomingAudioData( case kFileFormatPcm8kHzFile: case kFileFormatPcm16kHzFile: case kFileFormatPcm32kHzFile: + case kFileFormatPcm48kHzFile: bytesWritten = _ptrFileUtilityObj->WritePCMData( *_ptrOutStream, buffer, @@ -795,12 +798,14 @@ int32_t MediaFileImpl::StartRecordingAudioStream( } case kFileFormatPcm8kHzFile: case kFileFormatPcm16kHzFile: + case kFileFormatPcm32kHzFile: + case kFileFormatPcm48kHzFile: { if(!ValidFrequency(codecInst.plfreq) || _ptrFileUtilityObj->InitPCMWriting(stream, codecInst.plfreq) == -1) { - LOG(LS_ERROR) << "Failed to initialize 8 or 16KHz PCM file!"; + LOG(LS_ERROR) << "Failed to initialize PCM file!"; delete _ptrFileUtilityObj; _ptrFileUtilityObj = NULL; return -1; @@ -1010,7 +1015,8 @@ bool MediaFileImpl::ValidFileFormat(const FileFormats format, if(format == kFileFormatPreencodedFile || format == kFileFormatPcm8kHzFile || format == kFileFormatPcm16kHzFile || - format == kFileFormatPcm32kHzFile) + format == kFileFormatPcm32kHzFile || + format == kFileFormatPcm48kHzFile) { LOG(LS_ERROR) << "Codec info required for file format specified!"; return false; @@ -1052,11 +1058,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; } - LOG(LS_ERROR) << "Frequency should be 8000, 16000 or 32000 (Hz)"; + LOG(LS_ERROR) << "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 883f17780e..8b0f22d9b7 100644 --- a/webrtc/modules/media_file/media_file_utility.cc +++ b/webrtc/modules/media_file/media_file_utility.cc @@ -1128,6 +1128,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; @@ -1261,11 +1271,23 @@ 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)) { - LOG(LS_ERROR) << "CodecInst is not 8KHz PCM or 16KHz PCM!"; + LOG(LS_ERROR) << "CodecInst is not 8KHz, 16KHz, 32kHz or 48kHz PCM!"; return -1; } _writing = true; @@ -1335,6 +1357,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 8139a7c449..b339af7e41 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 6d9aaae6b8..8c5824d1bb 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..cb14c8f752 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 (60ms with 48kHz sample rate). + enum { MAX_AUDIO_BUFFER_IN_SAMPLES = 60 * 48 }; enum { MAX_AUDIO_BUFFER_IN_BYTES = MAX_AUDIO_BUFFER_IN_SAMPLES * 2 }; // Note: will return NULL for unsupported formats.