| /* |
| * Copyright (c) 2011 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. |
| */ |
| |
| /* |
| * vie_file_player.h |
| */ |
| |
| #ifndef WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_FILE_PLAYER_H_ |
| #define WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_FILE_PLAYER_H_ |
| |
| #include "typedefs.h" |
| #include "common_types.h" // webrtc::OutStream |
| #include "file_player.h" |
| #include "media_file_defines.h" |
| #include "vie_file.h" |
| #include "voe_file.h" |
| #include "voe_video_sync.h" |
| #include "list_wrapper.h" |
| #include "vie_frame_provider_base.h" |
| #include "file_wrapper.h" |
| |
| namespace webrtc |
| { |
| class EventWrapper; |
| class ThreadWrapper; |
| class ViEInputManager; |
| class ViEFilePlayer: public ViEFrameProviderBase, |
| protected webrtc::FileCallback, |
| protected webrtc::InStream // for audio |
| { |
| public: |
| static ViEFilePlayer *CreateViEFilePlayer(int fileId, int engineId, |
| const char* fileNameUTF8, |
| const bool loop, |
| const webrtc::FileFormats fileFormat, |
| ViEInputManager& inputManager, |
| VoiceEngine* vePtr); |
| |
| static int GetFileInformation(const int engineId, |
| const char* fileName, |
| webrtc::VideoCodec& videoCodec, |
| webrtc::CodecInst& audioCodec, |
| const webrtc::FileFormats fileFormat); |
| ~ViEFilePlayer(); |
| |
| bool IsObserverRegistered(); |
| int RegisterObserver(ViEFileObserver& observer); |
| int DeRegisterObserver(); |
| int SendAudioOnChannel(const int audioChannel, bool mixMicrophone, |
| float volumeScaling); |
| int StopSendAudioOnChannel(const int audioChannel); |
| int PlayAudioLocally(const int audioChannel, float volumeScaling); |
| int StopPlayAudioLocally(const int audioChannel); |
| |
| //Implement ViEFrameProviderBase |
| virtual int FrameCallbackChanged(); |
| |
| protected: |
| ViEFilePlayer(int Id, int engineId, ViEInputManager& inputManager); |
| int Init(const WebRtc_Word8* fileNameUTF8, const bool loop, |
| const webrtc::FileFormats fileFormat, VoiceEngine* vePtr); |
| int StopPlay(); |
| int StopPlayAudio(); |
| |
| // File play decode function. |
| static bool FilePlayDecodeThreadFunction(void* obj); |
| bool FilePlayDecodeProcess(); |
| bool NeedsAudioFromFile(void* buf); |
| |
| // From webrtc::InStream |
| virtual int Read(void *buf, int len); |
| virtual int Rewind() { return 0;} |
| |
| // From FileCallback |
| virtual void PlayNotification(const WebRtc_Word32 /*id*/, |
| const WebRtc_UWord32 /*notificationMs*/){} |
| virtual void RecordNotification(const WebRtc_Word32 id, |
| const WebRtc_UWord32 notificationMs){} |
| virtual void PlayFileEnded(const WebRtc_Word32 id); |
| virtual void RecordFileEnded(const WebRtc_Word32 id) { } |
| |
| |
| private: |
| enum { kThreadWaitTimeMs = 100 }; |
| |
| bool _playBackStarted; |
| ViEInputManager& _inputManager; |
| |
| CriticalSectionWrapper* _ptrFeedBackCritSect; |
| CriticalSectionWrapper* _ptrAudioCritSect; |
| |
| webrtc::FilePlayer* _filePlayer; |
| bool _audioStream; |
| |
| int _videoClients; // Number of active video clients |
| int _audioClients; //No of audio channels sending this audio. |
| int _localAudioChannel; //Local audio channel playing this video. Sync video against this. |
| |
| ViEFileObserver* _observer; |
| WebRtc_Word8 _fileName[FileWrapper::kMaxFileNameSize]; |
| |
| // VE Interface |
| VoEFile* _veFileInterface; |
| VoEVideoSync* _veVideoSync; |
| // Thread for decoding video (and audio if no audio clients connected) |
| ThreadWrapper* _ptrDecodeThread; |
| EventWrapper* _ptrDecodeEvent; |
| WebRtc_Word16 _decodedAudio[320]; |
| WebRtc_UWord32 _decodedAudioLength; |
| |
| ListWrapper _audioChannelBuffers; //trick - list containing VE buffer reading this file. Used if multiple audio channels are sending. |
| MapWrapper _audioChannelsSending; // AudioChannels sending audio from this file |
| VideoFrame _decodedVideo; // Frame receiving decoded video from file. |
| }; |
| } // namespace webrtc |
| |
| #endif // WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_FILE_PLAYER_H_ |