blob: 640b37c4009b005a6709a8242495a6cf7e48b991 [file] [log] [blame]
/*
* 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.
*/
#ifndef WEBRTC_VIDEO_ENGINE_VIE_FILE_PLAYER_H_
#define WEBRTC_VIDEO_ENGINE_VIE_FILE_PLAYER_H_
#include <list>
#include <set>
#include "common_types.h"
#include "modules/media_file/interface/media_file_defines.h"
#include "system_wrappers/interface/file_wrapper.h"
#include "typedefs.h"
#include "video_engine/vie_frame_provider_base.h"
namespace webrtc {
class EventWrapper;
class FilePlayer;
class ThreadWrapper;
class ViEFileObserver;
class ViEInputManager;
class VoEFile;
class VoEVideoSync;
class VoiceEngine;
class ViEFilePlayer
: public ViEFrameProviderBase,
protected FileCallback,
protected InStream {
public:
static ViEFilePlayer* CreateViEFilePlayer(int file_id,
int engine_id,
const char* file_nameUTF8,
const bool loop,
const FileFormats file_format,
ViEInputManager& input_manager,
VoiceEngine* voe_ptr);
static int GetFileInformation(const int engine_id,
const char* file_name,
VideoCodec& video_codec,
CodecInst& audio_codec,
const FileFormats file_format);
~ViEFilePlayer();
bool IsObserverRegistered();
int RegisterObserver(ViEFileObserver& observer);
int DeRegisterObserver();
int SendAudioOnChannel(const int audio_channel,
bool mix_microphone,
float volume_scaling);
int StopSendAudioOnChannel(const int audio_channel);
int PlayAudioLocally(const int audio_channel, float volume_scaling);
int StopPlayAudioLocally(const int audio_channel);
// Implements ViEFrameProviderBase.
virtual int FrameCallbackChanged();
protected:
ViEFilePlayer(int Id, int engine_id, ViEInputManager& input_manager);
int Init(const WebRtc_Word8* file_nameUTF8,
const bool loop,
const FileFormats file_format,
VoiceEngine* voe_ptr);
int StopPlay();
int StopPlayAudio();
// File play decode function.
static bool FilePlayDecodeThreadFunction(void* obj);
bool FilePlayDecodeProcess();
bool NeedsAudioFromFile(void* buf);
// Implements webrtc::InStream.
virtual int Read(void* buf, int len);
virtual int Rewind() {
return 0;
}
// Implements FileCallback.
virtual void PlayNotification(const WebRtc_Word32 /*id*/,
const WebRtc_UWord32 /*notification_ms*/) {}
virtual void RecordNotification(const WebRtc_Word32 /*id*/,
const WebRtc_UWord32 /*notification_ms*/) {}
virtual void PlayFileEnded(const WebRtc_Word32 id);
virtual void RecordFileEnded(const WebRtc_Word32 /*id*/) {}
private:
static const int kMaxDecodedAudioLength = 320;
bool play_back_started_;
ViEInputManager& input_manager_;
CriticalSectionWrapper* feedback_cs_;
CriticalSectionWrapper* audio_cs_;
FilePlayer* file_player_;
bool audio_stream_;
// Number of active video clients.
int video_clients_;
// Number of audio channels sending this audio.
int audio_clients_;
// Local audio channel playing this video. Sync video against this.
int local_audio_channel_;
ViEFileObserver* observer_;
WebRtc_Word8 file_name_[FileWrapper::kMaxFileNameSize];
// VoE Interface.
VoEFile* voe_file_interface_;
VoEVideoSync* voe_video_sync_;
// Thread for decoding video (and audio if no audio clients connected).
ThreadWrapper* decode_thread_;
EventWrapper* decode_event_;
WebRtc_Word16 decoded_audio_[kMaxDecodedAudioLength];
WebRtc_UWord32 decoded_audio_length_;
// Trick - list containing VoE buffer reading this file. Used if multiple
// audio channels are sending.
std::list<void*> audio_channel_buffers_;
// AudioChannels sending audio from this file.
std::set<int> audio_channels_sending_;
// Frame receiving decoded video from file.
VideoFrame decoded_video_;
};
} // namespace webrtc
#endif // WEBRTC_VIDEO_ENGINE_VIE_FILE_PLAYER_H_