blob: 73ba444ccf7fc1b7c4d3b047aa075ee63b7456e5 [file] [log] [blame]
/*
* 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
* 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_MODULES_VIDEO_CODING_CODEC_DATABASE_H_
#define WEBRTC_MODULES_VIDEO_CODING_CODEC_DATABASE_H_
#include <map>
#include "modules/video_coding/codecs/interface/video_codec_interface.h"
#include "modules/video_coding/main/interface/video_coding.h"
#include "modules/video_coding/main/source/generic_decoder.h"
#include "modules/video_coding/main/source/generic_encoder.h"
#include "typedefs.h"
namespace webrtc
{
enum VCMCodecDBProperties
{
kDefaultPayloadSize = 1440
};
class VCMDecoderMapItem {
public:
VCMDecoderMapItem(VideoCodec* settings,
WebRtc_UWord32 numberOfCores,
bool requireKeyFrame);
VideoCodec* _settings;
WebRtc_UWord32 _numberOfCores;
bool _requireKeyFrame;
};
class VCMExtDecoderMapItem {
public:
VCMExtDecoderMapItem(VideoDecoder* externalDecoderInstance,
WebRtc_UWord8 payloadType,
bool internalRenderTiming);
WebRtc_UWord8 _payloadType;
VideoDecoder* _externalDecoderInstance;
bool _internalRenderTiming;
};
/*******************************/
/* VCMCodecDataBase class */
/*******************************/
class VCMCodecDataBase
{
public:
VCMCodecDataBase(WebRtc_Word32 id);
~VCMCodecDataBase();
/**
* Fills "version" with the version of all codecs supported.
*/
WebRtc_Word32 Version(WebRtc_Word8* version,
WebRtc_UWord32& remainingBufferInBytes,
WebRtc_UWord32& position) const;
/**
* Release codecdatabase - release all memory for both send and receive side
*/
WebRtc_Word32 Reset();
/**
* Sender Side
*/
/**
* Returns the number of supported codecs (or -1 in case of error).
*/
static WebRtc_UWord8 NumberOfCodecs();
/**
* Get supported codecs with ID
* Input Values:
* listnr : Requested codec id number
* codec_inst: Pointer to the struct in which the returned codec information is copied
* Return Values: 0 if successful, otherwise
*/
static WebRtc_Word32 Codec(WebRtc_UWord8 listId, VideoCodec* settings);
static WebRtc_Word32 Codec(VideoCodecType codecType, VideoCodec* settings);
/**
* Reset Sender side
*/
WebRtc_Word32 ResetSender();
/**
* Setting the sender side codec and initiaiting the desired codec given the VideoCodec
* struct.
* Return Value: 0 if the codec and the settings are supported, otherwise
*/
WebRtc_Word32 RegisterSendCodec(const VideoCodec* sendCodec,
WebRtc_UWord32 numberOfCores,
WebRtc_UWord32 maxPayloadSize);
/**
* Get current send side codec. Relevant for internal codecs only.
*/
WebRtc_Word32 SendCodec(VideoCodec* currentSendCodec) const;
/**
* Get current send side codec type. Relevant for internal codecs only.
*/
VideoCodecType SendCodec() const;
/**
* Register external encoder - current assumption - if one is registered then it will also
* be used, and therefore it is also initialized
* Return value: A pointer to the encoder on success, or null, in case of an error.
*/
WebRtc_Word32 DeRegisterExternalEncoder(WebRtc_UWord8 payloadType, bool& wasSendCodec);
WebRtc_Word32 RegisterExternalEncoder(VideoEncoder* externalEncoder,
WebRtc_UWord8 payloadType,
bool internalSource);
/**
* Returns a encoder given a payloadname - to be used with internal encoders only.
* Special cases:
* Encoder exists - If payload matches, returns existing one, otherwise,
* deletes existing one and creates new one.
* No match found / Error - returns NULL.
*/
VCMGenericEncoder* SetEncoder(const VideoCodec* settings,
VCMEncodedFrameCallback* VCMencodedFrameCallback);
WebRtc_Word32 SetPeriodicKeyFrames(bool enable);
bool InternalSource() const;
/*
* Receiver Side
*/
WebRtc_Word32 ResetReceiver();
/**
* Register external decoder/render object
*/
WebRtc_Word32 DeRegisterExternalDecoder(WebRtc_UWord8 payloadType);
WebRtc_Word32 RegisterExternalDecoder(VideoDecoder* externalDecoder,
WebRtc_UWord8 payloadType,
bool internalRenderTiming);
bool DecoderRegistered() const;
/**
* Register recieve codec
*/
WebRtc_Word32 RegisterReceiveCodec(const VideoCodec* receiveCodec,
WebRtc_UWord32 numberOfCores,
bool requireKeyFrame);
WebRtc_Word32 DeRegisterReceiveCodec(WebRtc_UWord8 payloadType);
/**
* Get current receive side codec. Relevant for internal codecs only.
*/
WebRtc_Word32 ReceiveCodec(VideoCodec* currentReceiveCodec) const;
/**
* Get current receive side codec type. Relevant for internal codecs only.
*/
VideoCodecType ReceiveCodec() const;
/**
* Returns a decoder given which matches a payload type.
* Special cases:
* Decoder exists - If payload matches, returns existing one, otherwise, deletes
* existing one, and creates new one.
* No match found / Error - returns NULL.
*/
VCMGenericDecoder* SetDecoder(WebRtc_UWord8 payloadType, VCMDecodedFrameCallback& callback);
VCMGenericDecoder* CreateAndInitDecoder(WebRtc_UWord8 payloadType,
VideoCodec& newCodec,
bool &external) const;
VCMGenericDecoder* CreateDecoderCopy() const;
void ReleaseDecoder(VCMGenericDecoder* decoder) const;
void CopyDecoder(const VCMGenericDecoder& decoder);
bool RenderTiming() const;
protected:
/**
* Create an internal Encoder given a codec type
*/
VCMGenericEncoder* CreateEncoder(const VideoCodecType type) const;
void DeleteEncoder();
/*
* Create an internal Decoder given a codec type
*/
VCMGenericDecoder* CreateDecoder(VideoCodecType type) const;
VCMDecoderMapItem* FindDecoderItem(WebRtc_UWord8 payloadType) const;
VCMExtDecoderMapItem* FindExternalDecoderItem(WebRtc_UWord8 payloadType) const;
private:
typedef std::map<uint8_t, VCMDecoderMapItem*> DecoderMap;
typedef std::map<uint8_t, VCMExtDecoderMapItem*> ExternalDecoderMap;
WebRtc_Word32 _id;
WebRtc_UWord32 _numberOfCores;
WebRtc_UWord32 _maxPayloadSize;
bool _periodicKeyFrames;
bool _currentEncIsExternal;
VideoCodec _sendCodec;
VideoCodec _receiveCodec;
WebRtc_UWord8 _externalPayloadType;
VideoEncoder* _externalEncoder;
bool _internalSource;
VCMGenericEncoder* _ptrEncoder;
VCMGenericDecoder* _ptrDecoder;
bool _currentDecIsExternal;
DecoderMap _decMap;
ExternalDecoderMap _decExternalMap;
}; // end of VCMCodecDataBase class definition
} // namespace webrtc
#endif // WEBRTC_MODULES_VIDEO_CODING_CODEC_DATABASE_H_