/* * 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. */ // This sub-API supports the following functionalities: // - Setting send and receive codecs. // - Codec specific settings. // - Key frame signaling. // - Stream management settings. #ifndef WEBRTC_VIDEO_ENGINE_MAIN_INTERFACE_VIE_CODEC_H_ #define WEBRTC_VIDEO_ENGINE_MAIN_INTERFACE_VIE_CODEC_H_ #include "common_types.h" namespace webrtc { class VideoEngine; struct VideoCodec; // ---------------------------------------------------------------------------- // ViEEncoderObserver // ---------------------------------------------------------------------------- // This class declares an abstract interface for a user defined observer. It is // up to the VideoEngine user to implement a derived class which implements the // observer class. The observer is registered using RegisterEncoderObserver() // and deregistered using DeregisterEncoderObserver(). class WEBRTC_DLLEXPORT ViEEncoderObserver { public: // This method is called once per second with the current encoded frame rate // and bit rate. virtual void OutgoingRate(const int videoChannel, const unsigned int framerate, const unsigned int bitrate) = 0; protected: virtual ~ViEEncoderObserver() {}; }; // ---------------------------------------------------------------------------- // ViEEncoderObserver // ---------------------------------------------------------------------------- // This class declares an abstract interface for a user defined observer. It is // up to the VideoEngine user to implement a derived class which implements the // observer class. The observer is registered using RegisterDecoderObserver() // and deregistered using DeregisterDecoderObserver(). class WEBRTC_DLLEXPORT ViEDecoderObserver { public: // This method is called when a new incoming stream is detected, normally // triggered by a new incoming SSRC or payload type. virtual void IncomingCodecChanged(const int videoChannel, const VideoCodec& videoCodec) = 0; // This method is called once per second containing the frame rate and bit // rate for the incoming stream virtual void IncomingRate(const int videoChannel, const unsigned int framerate, const unsigned int bitrate) = 0; // This method is called when the decoder needs a new key frame from encoder // on the sender. virtual void RequestNewKeyFrame(const int videoChannel) = 0; protected: virtual ~ViEDecoderObserver() {}; }; // ---------------------------------------------------------------------------- // ViECodec // ---------------------------------------------------------------------------- class WEBRTC_DLLEXPORT ViECodec { public: // Factory for the ViECodec sub‐API and increases an internal reference // counter if successful. Returns NULL if the API is not supported or if // construction fails. static ViECodec* GetInterface(VideoEngine* videoEngine); // Releases the ViECodec sub-API and decreases an internal reference // counter. // Returns the new reference count. This value should be zero // for all sub-API:s before the VideoEngine object can be safely deleted. virtual int Release() = 0; // Gets the number of available codecs for the VideoEngine build. virtual int NumberOfCodecs() const = 0; // Gets a VideoCodec struct for a codec containing the default configuration // for that codec type. virtual int GetCodec(const unsigned char listNumber, VideoCodec& videoCodec) const = 0; // Sets the send codec to use for a specified channel. virtual int SetSendCodec(const int videoChannel, const VideoCodec& videoCodec) = 0; // Gets the current send codec settings. virtual int GetSendCodec(const int videoChannel, VideoCodec& videoCodec) const = 0; // Prepares VideoEngine to receive a certain codec type and setting for a // specified payload type. virtual int SetReceiveCodec(const int videoChannel, const VideoCodec& videoCodec) = 0; // Gets the current receive codec. virtual int GetReceiveCodec(const int videoChannel, VideoCodec& videoCodec) const = 0; // This function is used to get codec configuration parameters to be // signaled from the encoder to the decoder in the call setup. virtual int GetCodecConfigParameters( const int videoChannel, unsigned char configParameters[kConfigParameterSize], unsigned char& configParametersSize) const = 0; // Enables advanced scaling of the captured video stream if the stream // differs from the send codec settings. virtual int SetImageScaleStatus(const int videoChannel, const bool enable) = 0; // Gets the number of sent key frames and number of sent delta frames. virtual int GetSendCodecStastistics(const int videoChannel, unsigned int& keyFrames, unsigned int& deltaFrames) const = 0; // Gets the number of decoded key frames and number of decoded delta frames. virtual int GetReceiveCodecStastistics(const int videoChannel, unsigned int& keyFrames, unsigned int& deltaFrames) const = 0; // Enables key frame request callback in ViEDecoderObserver. virtual int SetKeyFrameRequestCallbackStatus(const int videoChannel, const bool enable) = 0; // Enables key frame requests for detected lost packets. virtual int SetSignalKeyPacketLossStatus( const int videoChannel, const bool enable, const bool onlyKeyFrames = false) = 0; // Registers an instance of a user implementation of the ViEEncoderObserver. virtual int RegisterEncoderObserver(const int videoChannel, ViEEncoderObserver& observer) = 0; // Removes an already registered instance of ViEEncoderObserver. virtual int DeregisterEncoderObserver(const int videoChannel) = 0; // Registers an instance of a user implementation of the ViEDecoderObserver. virtual int RegisterDecoderObserver(const int videoChannel, ViEDecoderObserver& observer) = 0; // Removes an already registered instance of ViEDecoderObserver. virtual int DeregisterDecoderObserver(const int videoChannel) = 0; // This function forces the next encoded frame to be a key frame. This is // normally used when the remote endpoint only supports out‐band key frame // request. virtual int SendKeyFrame(const int videoChannel) = 0; // This function makes the decoder wait for a key frame before starting to // decode the incoming video stream. virtual int WaitForFirstKeyFrame(const int videoChannel, const bool wait) = 0; // This function makes VideoEngine decode all incoming H.263 key frames as // delta frames and all incoming delta frames as key frames. virtual int SetInverseH263Logic(int videoChannel, bool enable) = 0; protected: ViECodec() {}; virtual ~ViECodec() {}; }; } // namespace webrtc #endif // WEBRTC_VIDEO_ENGINE_MAIN_INTERFACE_VIE_CODEC_H_