Reland 28629004: adding new AEC dump start interface for chrome.

This is required because we are not allow to pass CRT objects across dll boundaries, that says, when we pass a file descriptor from chrome dll to libpeerconnection dll, the file descriptor will become invalid immediate, more information can be found here:
http://msdn.microsoft.com/en-us/library/ms235460.aspx

R=andresp@webrtc.org, andrew@webrtc.org, bjornv@webrtc.org, henrike@webrtc.org, henrikg@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/30629004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7418 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/base/BUILD.gn b/webrtc/base/BUILD.gn
index 3be8a3a..be53e40 100644
--- a/webrtc/base/BUILD.gn
+++ b/webrtc/base/BUILD.gn
@@ -111,6 +111,8 @@
     "md5.cc",
     "md5.h",
     "md5digest.h",
+    "platform_file.cc",
+    "platform_file.h",
     "stringencode.cc",
     "stringencode.h",
     "stringutils.cc",
diff --git a/webrtc/base/base.gyp b/webrtc/base/base.gyp
index 07f4c0b..569db74 100644
--- a/webrtc/base/base.gyp
+++ b/webrtc/base/base.gyp
@@ -46,6 +46,8 @@
         'md5.cc',
         'md5.h',
         'md5digest.h',
+        'platform_file.cc',
+        'platform_file.h',
         'stringencode.cc',
         'stringencode.h',
         'stringutils.cc',
diff --git a/webrtc/base/fileutils.cc b/webrtc/base/fileutils.cc
index 06d76d2..24375c9 100644
--- a/webrtc/base/fileutils.cc
+++ b/webrtc/base/fileutils.cc
@@ -10,13 +10,6 @@
 
 #include <assert.h>
 
-#if defined(WEBRTC_WIN)
-// TODO(grunell): Remove io.h includes when Chromium has started
-// to use AEC in each source. http://crbug.com/264611.
-#include <io.h>
-#include "webrtc/base/win32.h"
-#endif
-
 #include "webrtc/base/pathutils.h"
 #include "webrtc/base/fileutils.h"
 #include "webrtc/base/stringutils.h"
@@ -279,28 +272,4 @@
   return true;
 }
 
-// Taken from Chromium's base/platform_file_*.cc.
-// TODO(grunell): Remove when Chromium has started to use AEC in each source.
-// http://crbug.com/264611.
-FILE* FdopenPlatformFileForWriting(PlatformFile file) {
-#if defined(WEBRTC_WIN)
-  if (file == kInvalidPlatformFileValue)
-    return NULL;
-  int fd = _open_osfhandle(reinterpret_cast<intptr_t>(file), 0);
-  if (fd < 0)
-    return NULL;
-  return _fdopen(fd, "w");
-#else
-  return fdopen(file, "w");
-#endif
-}
-
-bool ClosePlatformFile(PlatformFile file) {
-#if defined(WEBRTC_WIN)
-  return CloseHandle(file) != 0;
-#else
-  return close(file);
-#endif
-}
-
 }  // namespace rtc
diff --git a/webrtc/base/fileutils.h b/webrtc/base/fileutils.h
index 33ce457..9112952 100644
--- a/webrtc/base/fileutils.h
+++ b/webrtc/base/fileutils.h
@@ -13,9 +13,7 @@
 
 #include <string>
 
-#if defined(WEBRTC_WIN)
-#include "webrtc/base/win32.h"
-#else
+#if !defined(WEBRTC_WIN)
 #include <dirent.h>
 #include <stdio.h>
 #include <sys/stat.h>
@@ -25,6 +23,7 @@
 
 #include "webrtc/base/basictypes.h"
 #include "webrtc/base/common.h"
+#include "webrtc/base/platform_file.h"
 #include "webrtc/base/scoped_ptr.h"
 
 namespace rtc {
@@ -436,24 +435,6 @@
 // process).
 bool CreateUniqueFile(Pathname& path, bool create_empty);
 
-// Taken from Chromium's base/platform_file.h.
-// Don't use ClosePlatformFile to close a file opened with FdopenPlatformFile.
-// Use fclose instead.
-// TODO(grunell): Remove when Chromium has started to use AEC in each source.
-// http://crbug.com/264611.
-#if defined(WEBRTC_WIN)
-typedef HANDLE PlatformFile;
-const PlatformFile kInvalidPlatformFileValue = INVALID_HANDLE_VALUE;
-#elif defined(WEBRTC_POSIX)
-typedef int PlatformFile;
-const PlatformFile kInvalidPlatformFileValue = -1;
-#else
-#error Unsupported platform
-#endif
-
-FILE* FdopenPlatformFileForWriting(PlatformFile file);
-bool ClosePlatformFile(PlatformFile file);
-
 }  // namespace rtc
 
 #endif  // WEBRTC_BASE_FILEUTILS_H_
diff --git a/webrtc/base/platform_file.cc b/webrtc/base/platform_file.cc
new file mode 100644
index 0000000..d518b74
--- /dev/null
+++ b/webrtc/base/platform_file.cc
@@ -0,0 +1,49 @@
+/*
+ *  Copyright 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.
+ */
+
+#include "webrtc/base/platform_file.h"
+
+#if defined(WEBRTC_WIN)
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+namespace rtc {
+
+#if defined(WEBRTC_WIN)
+const PlatformFile kInvalidPlatformFileValue = INVALID_HANDLE_VALUE;
+
+FILE* FdopenPlatformFileForWriting(PlatformFile file) {
+  if (file == kInvalidPlatformFileValue)
+    return NULL;
+  int fd = _open_osfhandle(reinterpret_cast<intptr_t>(file), 0);
+  if (fd < 0)
+    return NULL;
+
+  return _fdopen(fd, "w");
+}
+
+bool ClosePlatformFile(PlatformFile file) {
+  return CloseHandle(file) != 0;
+}
+#else
+const PlatformFile kInvalidPlatformFileValue = -1;
+
+FILE* FdopenPlatformFileForWriting(PlatformFile file) {
+  return fdopen(file, "w");
+}
+
+bool ClosePlatformFile(PlatformFile file) {
+  return close(file);
+}
+#endif
+
+}  // namespace rtc
diff --git a/webrtc/base/platform_file.h b/webrtc/base/platform_file.h
new file mode 100644
index 0000000..12e08e9
--- /dev/null
+++ b/webrtc/base/platform_file.h
@@ -0,0 +1,44 @@
+/*
+ *  Copyright 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_BASE_PLATFORM_FILE_H_
+#define WEBRTC_BASE_PLATFORM_FILE_H_
+
+#include <stdio.h>
+
+#if defined(WEBRTC_WIN)
+#include <windows.h>
+#endif
+
+namespace rtc {
+
+#if defined(WEBRTC_WIN)
+typedef HANDLE PlatformFile;
+#elif defined(WEBRTC_POSIX)
+typedef int PlatformFile;
+#else
+#error Unsupported platform
+#endif
+
+extern const PlatformFile kInvalidPlatformFileValue;
+
+// Associates a standard FILE stream with an existing PlatformFile.
+// Note that after this function has returned a valid FILE stream,
+// the PlatformFile should no longer be used.
+FILE* FdopenPlatformFileForWriting(PlatformFile file);
+
+// Closes a PlatformFile.
+// Don't use ClosePlatformFile to close a file opened with FdopenPlatformFile.
+// Use fclose instead.
+bool ClosePlatformFile(PlatformFile file);
+
+}  // namespace rtc
+
+#endif  // WEBRTC_BASE_PLATFORM_FILE_H_
diff --git a/webrtc/modules/audio_processing/BUILD.gn b/webrtc/modules/audio_processing/BUILD.gn
index d631adc..2ef2bdf 100644
--- a/webrtc/modules/audio_processing/BUILD.gn
+++ b/webrtc/modules/audio_processing/BUILD.gn
@@ -157,6 +157,7 @@
   }
 
   deps += [
+    "../../base:rtc_base_approved",
     "../../common_audio",
     "../../system_wrappers",
   ]
diff --git a/webrtc/modules/audio_processing/audio_processing.gypi b/webrtc/modules/audio_processing/audio_processing.gypi
index 9bbcfae..ce65f64 100644
--- a/webrtc/modules/audio_processing/audio_processing.gypi
+++ b/webrtc/modules/audio_processing/audio_processing.gypi
@@ -9,6 +9,7 @@
 {
   'variables': {
     'audio_processing_dependencies': [
+      '<(webrtc_root)/base/base.gyp:rtc_base_approved',
       '<(webrtc_root)/common_audio/common_audio.gyp:common_audio',
       '<(webrtc_root)/system_wrappers/source/system_wrappers.gyp:system_wrappers',
     ],
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.cc b/webrtc/modules/audio_processing/audio_processing_impl.cc
index d91cbd2..d6e2906 100644
--- a/webrtc/modules/audio_processing/audio_processing_impl.cc
+++ b/webrtc/modules/audio_processing/audio_processing_impl.cc
@@ -12,6 +12,7 @@
 
 #include <assert.h>
 
+#include "webrtc/base/platform_file.h"
 #include "webrtc/common_audio/include/audio_util.h"
 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
 #include "webrtc/modules/audio_processing/audio_buffer.h"
@@ -716,6 +717,12 @@
 #endif  // WEBRTC_AUDIOPROC_DEBUG_DUMP
 }
 
+int AudioProcessingImpl::StartDebugRecordingForPlatformFile(
+    rtc::PlatformFile handle) {
+  FILE* stream = rtc::FdopenPlatformFileForWriting(handle);
+  return StartDebugRecording(stream);
+}
+
 int AudioProcessingImpl::StopDebugRecording() {
   CriticalSectionScoped crit_scoped(crit_);
 
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.h b/webrtc/modules/audio_processing/audio_processing_impl.h
index 9753423..0817f47 100644
--- a/webrtc/modules/audio_processing/audio_processing_impl.h
+++ b/webrtc/modules/audio_processing/audio_processing_impl.h
@@ -125,6 +125,8 @@
   virtual int StartDebugRecording(
       const char filename[kMaxFilenameSize]) OVERRIDE;
   virtual int StartDebugRecording(FILE* handle) OVERRIDE;
+  virtual int StartDebugRecordingForPlatformFile(
+      rtc::PlatformFile handle) OVERRIDE;
   virtual int StopDebugRecording() OVERRIDE;
   virtual EchoCancellation* echo_cancellation() const OVERRIDE;
   virtual EchoControlMobile* echo_control_mobile() const OVERRIDE;
diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h
index 30f0d9c..10d2b8b 100644
--- a/webrtc/modules/audio_processing/include/audio_processing.h
+++ b/webrtc/modules/audio_processing/include/audio_processing.h
@@ -14,6 +14,7 @@
 #include <stddef.h>  // size_t
 #include <stdio.h>  // FILE
 
+#include "webrtc/base/platform_file.h"
 #include "webrtc/common.h"
 #include "webrtc/typedefs.h"
 
@@ -325,6 +326,13 @@
   // of |handle| and closes it at StopDebugRecording().
   virtual int StartDebugRecording(FILE* handle) = 0;
 
+  // Same as above but uses an existing PlatformFile handle. Takes ownership
+  // of |handle| and closes it at StopDebugRecording().
+  // TODO(xians): Make this interface pure virtual.
+  virtual int StartDebugRecordingForPlatformFile(rtc::PlatformFile handle) {
+      return -1;
+  }
+
   // Stops recording debugging information, and closes the file. Recording
   // cannot be resumed in the same file (without overwriting it).
   virtual int StopDebugRecording() = 0;