184 lines
7.0 KiB
C++
184 lines
7.0 KiB
C++
/*
|
|
* 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_encoder.h
|
|
*/
|
|
|
|
#ifndef WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_ENCODER_H_
|
|
#define WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_ENCODER_H_
|
|
|
|
#include "vie_defines.h"
|
|
#include "typedefs.h"
|
|
#include "vie_frame_provider_base.h"
|
|
#include "vie_file_recorder.h"
|
|
#include "rtp_rtcp_defines.h"
|
|
#include "video_coding_defines.h"
|
|
#include "video_processing.h"
|
|
#include "common_types.h"
|
|
|
|
namespace webrtc {
|
|
class CriticalSectionWrapper;
|
|
class ProcessThread;
|
|
class RtpRtcp;
|
|
class ViEEffectFilter;
|
|
class VideoCodingModule;
|
|
class ViEEncoderObserver;
|
|
|
|
class ViEEncoder: public ViEFrameCallback, // New frame delivery
|
|
public RtpVideoFeedback, // Feedback from RTP module
|
|
public RtcpFeedback, // RTP/RTCP Module
|
|
public VCMPacketizationCallback, // Callback from VCM
|
|
public VCMProtectionCallback, // Callback from VCM
|
|
public VCMSendStatisticsCallback // Callback from VCM
|
|
{
|
|
public:
|
|
ViEEncoder(WebRtc_Word32 engineId, WebRtc_Word32 channelId,
|
|
WebRtc_UWord32 numberOfCores,
|
|
ProcessThread& moduleProcessThread);
|
|
~ViEEncoder();
|
|
|
|
// Drops incoming packets
|
|
void Pause();
|
|
void Restart();
|
|
|
|
WebRtc_Word32 DropDeltaAfterKey(bool enable);
|
|
|
|
// Codec settings
|
|
WebRtc_UWord8 NumberOfCodecs();
|
|
WebRtc_Word32 GetCodec(WebRtc_UWord8 listIndex, VideoCodec& videoCodec);
|
|
WebRtc_Word32 RegisterExternalEncoder(VideoEncoder* encoder,
|
|
WebRtc_UWord8 plType);
|
|
WebRtc_Word32 DeRegisterExternalEncoder(WebRtc_UWord8 plType);
|
|
WebRtc_Word32 SetEncoder(const VideoCodec& videoCodec);
|
|
WebRtc_Word32 GetEncoder(VideoCodec& videoCodec);
|
|
|
|
WebRtc_Word32 GetCodecConfigParameters(
|
|
unsigned char configParameters[kConfigParameterSize],
|
|
unsigned char& configParametersSize);
|
|
|
|
// Scale or crop/pad image
|
|
WebRtc_Word32 ScaleInputImage(bool enable);
|
|
|
|
// RTP settings
|
|
RtpRtcp* SendRtpRtcpModule();
|
|
|
|
// Implementing ViEFrameCallback
|
|
virtual void DeliverFrame(int id, VideoFrame& videoFrame, int numCSRCs = 0,
|
|
const WebRtc_UWord32 CSRC[kRtpCsrcSize] = NULL);
|
|
virtual void DelayChanged(int id, int frameDelay);
|
|
virtual int GetPreferedFrameSettings(int &width, int &height,
|
|
int &frameRate);
|
|
|
|
virtual void ProviderDestroyed(int id) { return; }
|
|
|
|
WebRtc_Word32 EncodeFrame(VideoFrame& videoFrame);
|
|
WebRtc_Word32 SendKeyFrame();
|
|
WebRtc_Word32 SendCodecStatistics(WebRtc_UWord32& numKeyFrames,
|
|
WebRtc_UWord32& numDeltaFrames);
|
|
// Loss protection
|
|
WebRtc_Word32 UpdateProtectionMethod();
|
|
// Implements VCMPacketizationCallback
|
|
virtual WebRtc_Word32 SendData(const FrameType frameType,
|
|
const WebRtc_UWord8 payloadType,
|
|
const WebRtc_UWord32 timeStamp,
|
|
const WebRtc_UWord8* payloadData,
|
|
const WebRtc_UWord32 payloadSize,
|
|
const RTPFragmentationHeader& fragmentationHeader);
|
|
// Implements VideoProtectionCallback
|
|
virtual WebRtc_Word32 ProtectionRequest(const WebRtc_UWord8 deltaFECRate,
|
|
const WebRtc_UWord8 keyFECRate,
|
|
const bool nack);
|
|
// Implements VideoSendStatisticsCallback
|
|
virtual WebRtc_Word32 SendStatistics(const WebRtc_UWord32 bitRate,
|
|
const WebRtc_UWord32 frameRate);
|
|
WebRtc_Word32 RegisterCodecObserver(ViEEncoderObserver* observer);
|
|
// Implements RtcpFeedback
|
|
virtual void OnSLIReceived(const WebRtc_Word32 id,
|
|
const WebRtc_UWord8 pictureId);
|
|
virtual void OnRPSIReceived(const WebRtc_Word32 id,
|
|
const WebRtc_UWord64 pictureId);
|
|
|
|
// Implements RtpVideoFeedback
|
|
virtual void OnReceivedIntraFrameRequest(const WebRtc_Word32 id,
|
|
const WebRtc_UWord8 message = 0);
|
|
virtual void OnNetworkChanged(const WebRtc_Word32 id,
|
|
const WebRtc_UWord32 minBitrateBps,
|
|
const WebRtc_UWord32 maxBitrateBps,
|
|
const WebRtc_UWord8 fractionLost,
|
|
const WebRtc_UWord16 roundTripTimeMs,
|
|
const WebRtc_UWord16 bwEstimateKbitMin,
|
|
const WebRtc_UWord16 bwEstimateKbitMax);
|
|
// Effect filter
|
|
WebRtc_Word32 RegisterEffectFilter(ViEEffectFilter* effectFilter);
|
|
//Recording
|
|
ViEFileRecorder& GetOutgoingFileRecorder();
|
|
|
|
private:
|
|
WebRtc_Word32 _engineId;
|
|
|
|
class QMTestVideoSettingsCallback : public VCMQMSettingsCallback
|
|
{
|
|
public:
|
|
QMTestVideoSettingsCallback();
|
|
// update VPM with QM (quality modes: frame size & frame rate) settings
|
|
WebRtc_Word32 SetVideoQMSettings(const WebRtc_UWord32 frameRate,
|
|
const WebRtc_UWord32 width,
|
|
const WebRtc_UWord32 height);
|
|
// register VPM and VCM
|
|
void RegisterVPM(VideoProcessingModule* vpm);
|
|
void RegisterVCM(VideoCodingModule* vcm);
|
|
void SetNumOfCores(WebRtc_Word32 numOfCores)
|
|
{_numOfCores = numOfCores;};
|
|
void SetMaxPayloadLength(WebRtc_Word32 maxPayloadLength)
|
|
{_maxPayloadLength = maxPayloadLength;};
|
|
private:
|
|
VideoProcessingModule* _vpm;
|
|
VideoCodingModule* _vcm;
|
|
WebRtc_Word32 _numOfCores;
|
|
WebRtc_Word32 _maxPayloadLength;
|
|
};
|
|
|
|
WebRtc_Word32 _channelId;
|
|
const WebRtc_UWord32 _numberOfCores;
|
|
|
|
VideoCodingModule& _vcm;
|
|
VideoProcessingModule& _vpm;
|
|
RtpRtcp& _rtpRtcp;
|
|
CriticalSectionWrapper& _callbackCritsect;
|
|
CriticalSectionWrapper& _dataCritsect;
|
|
VideoCodec _sendCodec;
|
|
|
|
bool _paused;
|
|
WebRtc_Word64 _timeLastIntraRequestMs;
|
|
WebRtc_Word32 _channelsDroppingDeltaFrames;
|
|
bool _dropNextFrame;
|
|
//Loss protection
|
|
bool _fecEnabled;
|
|
// Uses
|
|
ViEEncoderObserver* _codecObserver;
|
|
ViEEffectFilter* _effectFilter;
|
|
ProcessThread& _moduleProcessThread;
|
|
|
|
bool _hasReceivedSLI;
|
|
WebRtc_UWord8 _pictureIdSLI;
|
|
bool _hasReceivedRPSI;
|
|
WebRtc_UWord64 _pictureIdRPSI;
|
|
|
|
//Recording
|
|
ViEFileRecorder _fileRecorder;
|
|
|
|
// Quality modes callback
|
|
QMTestVideoSettingsCallback* _qmCallback;
|
|
|
|
};
|
|
} // namespace webrtc
|
|
#endif // WEBRTC_VIDEO_ENGINE_MAIN_SOURCE_VIE_ENCODER_H_
|