Reland "Supporting 48kHz PCM file."

This was first reviewed in https://codereview.webrtc.org/2790493004/.

It got reverted in https://codereview.webrtc.org/2791453004/ due to
upstreaming error.

Bug: None
TBR: niklas.enbom@webrtc.org
Change-Id: Ia5e9bf86e004258b2aa7822bd489d357fcb8f906
Reviewed-on: https://chromium-review.googlesource.com/645634
Reviewed-by: Minyue Li (BackIn2018March) <minyue@webrtc.org>
Commit-Queue: Minyue Li (BackIn2018March) <minyue@webrtc.org>
Cr-Original-Commit-Position: refs/heads/master@{#19642}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 85a3b6b43a479688eb3b05f810f4ec7441cfa4cc
diff --git a/common_types.h b/common_types.h
index ac5c2e2..868bee4 100644
--- a/common_types.h
+++ b/common_types.h
@@ -142,7 +142,8 @@
   kFileFormatPreencodedFile = 4,
   kFileFormatPcm16kHzFile = 7,
   kFileFormatPcm8kHzFile = 8,
-  kFileFormatPcm32kHzFile = 9
+  kFileFormatPcm32kHzFile = 9,
+  kFileFormatPcm48kHzFile = 10
 };
 
 enum FrameType {
diff --git a/modules/media_file/media_file_impl.cc b/modules/media_file/media_file_impl.cc
index a869625..a43769d 100644
--- a/modules/media_file/media_file_impl.cc
+++ b/modules/media_file/media_file_impl.cc
@@ -125,6 +125,7 @@
 
         switch(_fileFormat)
         {
+            case kFileFormatPcm48kHzFile:
             case kFileFormatPcm32kHzFile:
             case kFileFormatPcm16kHzFile:
             case kFileFormatPcm8kHzFile:
@@ -450,6 +451,7 @@
         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 @@
                 case kFileFormatPcm8kHzFile:
                 case kFileFormatPcm16kHzFile:
                 case kFileFormatPcm32kHzFile:
+                case kFileFormatPcm48kHzFile:
                     bytesWritten = _ptrFileUtilityObj->WritePCMData(
                         *_ptrOutStream,
                         buffer,
@@ -795,12 +798,14 @@
         }
         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 @@
         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::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/modules/media_file/media_file_utility.cc b/modules/media_file/media_file_utility.cc
index 883f177..8b0f22d 100644
--- a/modules/media_file/media_file_utility.cc
+++ b/modules/media_file/media_file_utility.cc
@@ -1128,6 +1128,16 @@
         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 @@
 
         _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 @@
         {
             _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/modules/media_file/media_file_utility.h b/modules/media_file/media_file_utility.h
index 8139a7c..b339af7 100644
--- a/modules/media_file/media_file_utility.h
+++ b/modules/media_file/media_file_utility.h
@@ -228,6 +228,7 @@
         kCodecL16_8Khz,
         kCodecL16_16kHz,
         kCodecL16_32Khz,
+        kCodecL16_48Khz,
         kCodecPcmu,
         kCodecPcma,
         kCodecIlbc20Ms,
diff --git a/voice_engine/file_player.cc b/voice_engine/file_player.cc
index 6d9aaae..8c5824d 100644
--- a/voice_engine/file_player.cc
+++ b/voice_engine/file_player.cc
@@ -100,7 +100,7 @@
   } else if (_codec.plfreq == 44000) {
     return 32000;
   } else if (_codec.plfreq == 48000) {
-    return 32000;
+    return 48000;
   } else {
     return _codec.plfreq;
   }
@@ -220,16 +220,18 @@
       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 @@
                                          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 @@
       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 @@
     case kFileFormatPcm16kHzFile:
     case kFileFormatPcm8kHzFile:
     case kFileFormatPcm32kHzFile:
+    case kFileFormatPcm48kHzFile:
       // audio formats
       return std::unique_ptr<FilePlayer>(
           new FilePlayerImpl(instanceID, fileFormat));
diff --git a/voice_engine/file_player.h b/voice_engine/file_player.h
index 956016f..cb14c8f 100644
--- a/voice_engine/file_player.h
+++ b/voice_engine/file_player.h
@@ -23,8 +23,8 @@
 
 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.