diff --git a/src/modules/video_coding/main/interface/video_coding.h b/src/modules/video_coding/main/interface/video_coding.h index 1aa047b6b1..af054912f1 100644 --- a/src/modules/video_coding/main/interface/video_coding.h +++ b/src/modules/video_coding/main/interface/video_coding.h @@ -544,6 +544,12 @@ public: // < 0, on error. virtual int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode, DecodeErrors errorMode) = 0; + + // Enables recording of debugging information. + virtual int StartDebugRecording(const char* file_name_utf8) = 0; + + // Disables recording of debugging information. + virtual int StopDebugRecording() = 0; }; } // namespace webrtc diff --git a/src/modules/video_coding/main/source/video_coding_impl.cc b/src/modules/video_coding/main/source/video_coding_impl.cc index 2c71c11d63..68390a0cfe 100644 --- a/src/modules/video_coding/main/source/video_coding_impl.cc +++ b/src/modules/video_coding/main/source/video_coding_impl.cc @@ -21,7 +21,6 @@ namespace webrtc { //#define DEBUG_DECODER_BIT_STREAM -//#define DEBUG_ENCODER_INPUT WebRtc_UWord32 VCMProcessTimer::Period() const @@ -78,10 +77,7 @@ _nextFrameType(kVideoFrameDelta), _mediaOpt(id, clock_), _sendCodecType(kVideoCodecUnknown), _sendStatsCallback(NULL), -#ifdef DEBUG_ENCODER_INPUT _encoderInputFile(NULL), -#endif - _codecDataBase(id), _receiveStatsTimer(1000, clock_), _sendStatsTimer(1000, clock_), @@ -92,9 +88,6 @@ _keyRequestTimer(500, clock_) #ifdef DEBUG_DECODER_BIT_STREAM _bitStreamBeforeDecoder = fopen("decoderBitStream.bit", "wb"); #endif -#ifdef DEBUG_ENCODER_INPUT - _encoderInputFile = fopen("encoderInput.yuv", "wb"); -#endif } VideoCodingModuleImpl::~VideoCodingModuleImpl() @@ -109,9 +102,10 @@ VideoCodingModuleImpl::~VideoCodingModuleImpl() #ifdef DEBUG_DECODER_BIT_STREAM fclose(_bitStreamBeforeDecoder); #endif -#ifdef DEBUG_ENCODER_INPUT - fclose(_encoderInputFile); -#endif + if (_encoderInputFile != NULL) + { + fclose(_encoderInputFile); + } } VideoCodingModule* @@ -686,7 +680,6 @@ VideoCodingModuleImpl::AddVideoFrame(const VideoFrame& videoFrame, WebRtc_Word32 ret = _encoder->Encode(videoFrame, codecSpecificInfo, _nextFrameType); -#ifdef DEBUG_ENCODER_INPUT if (_encoderInputFile != NULL) { if (fwrite(videoFrame.Buffer(), 1, videoFrame.Length(), @@ -694,7 +687,6 @@ VideoCodingModuleImpl::AddVideoFrame(const VideoFrame& videoFrame, return -1; } } -#endif if (ret < 0) { WEBRTC_TRACE(webrtc::kTraceError, @@ -1374,4 +1366,19 @@ int VideoCodingModuleImpl::SetReceiverRobustnessMode( return VCM_OK; } +int VideoCodingModuleImpl::StartDebugRecording(const char* file_name_utf8) { + _encoderInputFile = fopen(file_name_utf8, "wb"); + if (_encoderInputFile == NULL) + return VCM_GENERAL_ERROR; + return VCM_OK; +} + +int VideoCodingModuleImpl::StopDebugRecording(){ + if (_encoderInputFile != NULL) { + fclose(_encoderInputFile); + _encoderInputFile = NULL; + } + return VCM_OK; +} + } // namespace webrtc diff --git a/src/modules/video_coding/main/source/video_coding_impl.h b/src/modules/video_coding/main/source/video_coding_impl.h index 3228d44b5d..1e39cbbec2 100644 --- a/src/modules/video_coding/main/source/video_coding_impl.h +++ b/src/modules/video_coding/main/source/video_coding_impl.h @@ -259,6 +259,11 @@ public: // Set the receiver robustness mode. virtual int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode, DecodeErrors errorMode); + // Enables recording of debugging information. + virtual int StartDebugRecording(const char* file_name_utf8); + + // Disables recording of debugging information. + virtual int StopDebugRecording(); protected: WebRtc_Word32 Decode(const webrtc::VCMEncodedFrame& frame); @@ -299,10 +304,7 @@ private: VCMMediaOptimization _mediaOpt; VideoCodecType _sendCodecType; VCMSendStatisticsCallback* _sendStatsCallback; -#ifdef DEBUG_ENCODER_INPUT FILE* _encoderInputFile; -#endif - VCMCodecDataBase _codecDataBase; VCMProcessTimer _receiveStatsTimer; VCMProcessTimer _sendStatsTimer; diff --git a/src/video_engine/include/vie_file.h b/src/video_engine/include/vie_file.h index fbc3d2bfa2..6a521cf536 100644 --- a/src/video_engine/include/vie_file.h +++ b/src/video_engine/include/vie_file.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * 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 @@ -211,6 +211,13 @@ class WEBRTC_DLLEXPORT ViEFile { const ViEPicture& picture, const unsigned int timeout_ms) = 0; + // Enables recording of debugging information. + virtual int StartDebugRecording(int video_channel, + const char* file_name_utf8) = 0; + // Disables recording of debugging information. + virtual int StopDebugRecording(int video_channel) = 0; + + protected: ViEFile() {} virtual ~ViEFile() {} diff --git a/src/video_engine/test/auto_test/source/vie_autotest_file.cc b/src/video_engine/test/auto_test/source/vie_autotest_file.cc index e82fb9c829..606149cab3 100644 --- a/src/video_engine/test/auto_test/source/vie_autotest_file.cc +++ b/src/video_engine/test/auto_test/source/vie_autotest_file.cc @@ -169,6 +169,10 @@ void ViEAutoTest::ViEFileStandardTest() AutoTestSleep(TEST_SPACING); + // Test debug information recording. + EXPECT_EQ(0, ptrViEFile->StartDebugRecording(videoChannel, + "vie_autotest_debug.yuv")); + // testing StartRecordIncomingVideo and StopRecordIncomingVideo { ViETest::Log("Recording incoming video (currently no audio) for %d " @@ -457,6 +461,9 @@ void ViEAutoTest::ViEFileStandardTest() EXPECT_NE(0, ptrViEFile->DeregisterObserver(fileId, fileObserver)); } + // Stop debug record. + EXPECT_EQ(0, ptrViEFile->StopDebugRecording(videoChannel)); + //*************************************************************** // Testing finished. Tear down Video Engine //*************************************************************** diff --git a/src/video_engine/vie_encoder.cc b/src/video_engine/vie_encoder.cc index 74539525eb..e0b0e39f95 100644 --- a/src/video_engine/vie_encoder.cc +++ b/src/video_engine/vie_encoder.cc @@ -868,6 +868,14 @@ ViEFileRecorder& ViEEncoder::GetOutgoingFileRecorder() { return file_recorder_; } +int ViEEncoder::StartDebugRecording(const char* fileNameUTF8) { + return vcm_.StartDebugRecording(fileNameUTF8); +} + +int ViEEncoder::StopDebugRecording() { + return vcm_.StopDebugRecording(); +} + QMVideoSettingsCallback::QMVideoSettingsCallback(VideoProcessingModule* vpm) : vpm_(vpm) { } diff --git a/src/video_engine/vie_encoder.h b/src/video_engine/vie_encoder.h index 7bfa918289..031ebf6436 100644 --- a/src/video_engine/vie_encoder.h +++ b/src/video_engine/vie_encoder.h @@ -143,6 +143,12 @@ class ViEEncoder // Recording. ViEFileRecorder& GetOutgoingFileRecorder(); + // Enables recording of debugging information. + virtual int StartDebugRecording(const char* fileNameUTF8); + + // Disables recording of debugging information. + virtual int StopDebugRecording(); + protected: // Called by BitrateObserver. void OnNetworkChanged(const uint32_t bitrate_bps, diff --git a/src/video_engine/vie_file_impl.cc b/src/video_engine/vie_file_impl.cc index c53e879a6a..1e2753b776 100644 --- a/src/video_engine/vie_file_impl.cc +++ b/src/video_engine/vie_file_impl.cc @@ -949,6 +949,31 @@ WebRtc_Word32 ViEFileImpl::GetNextCapturedFrame(WebRtc_Word32 capture_id, return -1; } +int ViEFileImpl::StartDebugRecording(int video_channel, + const char* file_name_utf8) { + ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); + ViEEncoder* vie_encoder = cs.Encoder(video_channel); + if (!vie_encoder) { + WEBRTC_TRACE(kTraceError, kTraceVideo, + ViEId(shared_data_->instance_id(), video_channel), + "%s: No encoder %d", __FUNCTION__, video_channel); + return -1; + } + return vie_encoder->StartDebugRecording(file_name_utf8); +} + +int ViEFileImpl::StopDebugRecording(int video_channel) { + ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); + ViEEncoder* vie_encoder = cs.Encoder(video_channel); + if (!vie_encoder) { + WEBRTC_TRACE(kTraceError, kTraceVideo, + ViEId(shared_data_->instance_id(), video_channel), + "%s: No encoder %d", __FUNCTION__, video_channel); + return -1; + } + return vie_encoder->StopDebugRecording(); +} + ViECaptureSnapshot::ViECaptureSnapshot() : crit_(CriticalSectionWrapper::CreateCriticalSection()), condition_varaible_(ConditionVariableWrapper::CreateConditionVariable()), diff --git a/src/video_engine/vie_file_impl.h b/src/video_engine/vie_file_impl.h index 29f532930d..b90c92bf9a 100644 --- a/src/video_engine/vie_file_impl.h +++ b/src/video_engine/vie_file_impl.h @@ -120,6 +120,9 @@ class ViEFileImpl virtual int SetRenderTimeoutImage(const int video_channel, const ViEPicture& picture, const unsigned int timeout_ms); + virtual int StartDebugRecording(int video_channel, + const char* file_name_utf8); + virtual int StopDebugRecording(int video_channel); protected: explicit ViEFileImpl(ViESharedData* shared_data);