Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(664)

Unified Diff: webrtc/modules/utility/source/file_recorder.cc

Issue 2622493002: Move FilePlayer and FileRecorder to Voice Engine (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/utility/source/file_recorder.cc
diff --git a/webrtc/modules/utility/source/file_recorder.cc b/webrtc/modules/utility/source/file_recorder.cc
deleted file mode 100644
index 34bd3945faee0c27ad95d6ba7f279ed141bebef1..0000000000000000000000000000000000000000
--- a/webrtc/modules/utility/source/file_recorder.cc
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (c) 2012 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/modules/utility/include/file_recorder.h"
-
-#include <list>
-
-#include "webrtc/base/platform_thread.h"
-#include "webrtc/common_audio/resampler/include/resampler.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/media_file/media_file.h"
-#include "webrtc/modules/media_file/media_file_defines.h"
-#include "webrtc/modules/utility/source/coder.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/logging.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace {
-
-// The largest decoded frame size in samples (60ms with 32kHz sample rate).
-enum { MAX_AUDIO_BUFFER_IN_SAMPLES = 60 * 32 };
-enum { MAX_AUDIO_BUFFER_IN_BYTES = MAX_AUDIO_BUFFER_IN_SAMPLES * 2 };
-enum { kMaxAudioBufferQueueLength = 100 };
-
-class CriticalSectionWrapper;
-
-class FileRecorderImpl : public FileRecorder {
- public:
- FileRecorderImpl(uint32_t instanceID, FileFormats fileFormat);
- ~FileRecorderImpl() override;
-
- // FileRecorder functions.
- int32_t RegisterModuleFileCallback(FileCallback* callback) override;
- FileFormats RecordingFileFormat() const override;
- int32_t StartRecordingAudioFile(const char* fileName,
- const CodecInst& codecInst,
- uint32_t notificationTimeMs) override;
- int32_t StartRecordingAudioFile(OutStream* destStream,
- const CodecInst& codecInst,
- uint32_t notificationTimeMs) override;
- int32_t StopRecording() override;
- bool IsRecording() const override;
- int32_t codec_info(CodecInst* codecInst) const override;
- int32_t RecordAudioToFile(const AudioFrame& frame) override;
-
- private:
- int32_t WriteEncodedAudioData(const int8_t* audioBuffer, size_t bufferLength);
-
- int32_t SetUpAudioEncoder();
-
- uint32_t _instanceID;
- FileFormats _fileFormat;
- MediaFile* _moduleFile;
-
- CodecInst codec_info_;
- int8_t _audioBuffer[MAX_AUDIO_BUFFER_IN_BYTES];
- AudioCoder _audioEncoder;
- Resampler _audioResampler;
-};
-
-FileRecorderImpl::FileRecorderImpl(uint32_t instanceID, FileFormats fileFormat)
- : _instanceID(instanceID),
- _fileFormat(fileFormat),
- _moduleFile(MediaFile::CreateMediaFile(_instanceID)),
- codec_info_(),
- _audioBuffer(),
- _audioEncoder(instanceID),
- _audioResampler() {}
-
-FileRecorderImpl::~FileRecorderImpl() {
- MediaFile::DestroyMediaFile(_moduleFile);
-}
-
-FileFormats FileRecorderImpl::RecordingFileFormat() const {
- return _fileFormat;
-}
-
-int32_t FileRecorderImpl::RegisterModuleFileCallback(FileCallback* callback) {
- if (_moduleFile == NULL) {
- return -1;
- }
- return _moduleFile->SetModuleFileCallback(callback);
-}
-
-int32_t FileRecorderImpl::StartRecordingAudioFile(const char* fileName,
- const CodecInst& codecInst,
- uint32_t notificationTimeMs) {
- if (_moduleFile == NULL) {
- return -1;
- }
- codec_info_ = codecInst;
- int32_t retVal = 0;
- retVal = _moduleFile->StartRecordingAudioFile(fileName, _fileFormat,
- codecInst, notificationTimeMs);
-
- if (retVal == 0) {
- retVal = SetUpAudioEncoder();
- }
- if (retVal != 0) {
- LOG(LS_WARNING) << "Failed to initialize file " << fileName
- << " for recording.";
-
- if (IsRecording()) {
- StopRecording();
- }
- }
- return retVal;
-}
-
-int32_t FileRecorderImpl::StartRecordingAudioFile(OutStream* destStream,
- const CodecInst& codecInst,
- uint32_t notificationTimeMs) {
- codec_info_ = codecInst;
- int32_t retVal = _moduleFile->StartRecordingAudioStream(
- *destStream, _fileFormat, codecInst, notificationTimeMs);
-
- if (retVal == 0) {
- retVal = SetUpAudioEncoder();
- }
- if (retVal != 0) {
- LOG(LS_WARNING) << "Failed to initialize outStream for recording.";
-
- if (IsRecording()) {
- StopRecording();
- }
- }
- return retVal;
-}
-
-int32_t FileRecorderImpl::StopRecording() {
- memset(&codec_info_, 0, sizeof(CodecInst));
- return _moduleFile->StopRecording();
-}
-
-bool FileRecorderImpl::IsRecording() const {
- return _moduleFile->IsRecording();
-}
-
-int32_t FileRecorderImpl::RecordAudioToFile(
- const AudioFrame& incomingAudioFrame) {
- if (codec_info_.plfreq == 0) {
- LOG(LS_WARNING) << "RecordAudioToFile() recording audio is not "
- << "turned on.";
- return -1;
- }
- AudioFrame tempAudioFrame;
- tempAudioFrame.samples_per_channel_ = 0;
- if (incomingAudioFrame.num_channels_ == 2 && !_moduleFile->IsStereo()) {
- // Recording mono but incoming audio is (interleaved) stereo.
- tempAudioFrame.num_channels_ = 1;
- tempAudioFrame.sample_rate_hz_ = incomingAudioFrame.sample_rate_hz_;
- tempAudioFrame.samples_per_channel_ =
- incomingAudioFrame.samples_per_channel_;
- for (size_t i = 0; i < (incomingAudioFrame.samples_per_channel_); i++) {
- // Sample value is the average of left and right buffer rounded to
- // closest integer value. Note samples can be either 1 or 2 byte.
- tempAudioFrame.data_[i] = ((incomingAudioFrame.data_[2 * i] +
- incomingAudioFrame.data_[(2 * i) + 1] + 1) >>
- 1);
- }
- } else if (incomingAudioFrame.num_channels_ == 1 && _moduleFile->IsStereo()) {
- // Recording stereo but incoming audio is mono.
- tempAudioFrame.num_channels_ = 2;
- tempAudioFrame.sample_rate_hz_ = incomingAudioFrame.sample_rate_hz_;
- tempAudioFrame.samples_per_channel_ =
- incomingAudioFrame.samples_per_channel_;
- for (size_t i = 0; i < (incomingAudioFrame.samples_per_channel_); i++) {
- // Duplicate sample to both channels
- tempAudioFrame.data_[2 * i] = incomingAudioFrame.data_[i];
- tempAudioFrame.data_[2 * i + 1] = incomingAudioFrame.data_[i];
- }
- }
-
- const AudioFrame* ptrAudioFrame = &incomingAudioFrame;
- if (tempAudioFrame.samples_per_channel_ != 0) {
- // If ptrAudioFrame is not empty it contains the audio to be recorded.
- ptrAudioFrame = &tempAudioFrame;
- }
-
- // Encode the audio data before writing to file. Don't encode if the codec
- // is PCM.
- // NOTE: stereo recording is only supported for WAV files.
- // TODO(hellner): WAV expect PCM in little endian byte order. Not
- // "encoding" with PCM coder should be a problem for big endian systems.
- size_t encodedLenInBytes = 0;
- if (_fileFormat == kFileFormatPreencodedFile ||
- STR_CASE_CMP(codec_info_.plname, "L16") != 0) {
- if (_audioEncoder.Encode(*ptrAudioFrame, _audioBuffer,
- &encodedLenInBytes) == -1) {
- LOG(LS_WARNING) << "RecordAudioToFile() codec " << codec_info_.plname
- << " not supported or failed to encode stream.";
- return -1;
- }
- } else {
- size_t outLen = 0;
- _audioResampler.ResetIfNeeded(ptrAudioFrame->sample_rate_hz_,
- codec_info_.plfreq,
- ptrAudioFrame->num_channels_);
- _audioResampler.Push(
- ptrAudioFrame->data_,
- ptrAudioFrame->samples_per_channel_ * ptrAudioFrame->num_channels_,
- reinterpret_cast<int16_t*>(_audioBuffer), MAX_AUDIO_BUFFER_IN_BYTES,
- outLen);
- encodedLenInBytes = outLen * sizeof(int16_t);
- }
-
- // Codec may not be operating at a frame rate of 10 ms. Whenever enough
- // 10 ms chunks of data has been pushed to the encoder an encoded frame
- // will be available. Wait until then.
- if (encodedLenInBytes) {
- if (WriteEncodedAudioData(_audioBuffer, encodedLenInBytes) == -1) {
- return -1;
- }
- }
- return 0;
-}
-
-int32_t FileRecorderImpl::SetUpAudioEncoder() {
- if (_fileFormat == kFileFormatPreencodedFile ||
- STR_CASE_CMP(codec_info_.plname, "L16") != 0) {
- if (_audioEncoder.SetEncodeCodec(codec_info_) == -1) {
- LOG(LS_ERROR) << "SetUpAudioEncoder() codec " << codec_info_.plname
- << " not supported.";
- return -1;
- }
- }
- return 0;
-}
-
-int32_t FileRecorderImpl::codec_info(CodecInst* codecInst) const {
- if (codec_info_.plfreq == 0) {
- return -1;
- }
- *codecInst = codec_info_;
- return 0;
-}
-
-int32_t FileRecorderImpl::WriteEncodedAudioData(const int8_t* audioBuffer,
- size_t bufferLength) {
- return _moduleFile->IncomingAudioData(audioBuffer, bufferLength);
-}
-
-} // namespace
-
-std::unique_ptr<FileRecorder> FileRecorder::CreateFileRecorder(
- uint32_t instanceID,
- FileFormats fileFormat) {
- return std::unique_ptr<FileRecorder>(
- new FileRecorderImpl(instanceID, fileFormat));
-}
-
-} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698