| Index: webrtc/modules/video_coding/codec_database.cc
|
| diff --git a/webrtc/modules/video_coding/codec_database.cc b/webrtc/modules/video_coding/codec_database.cc
|
| index 4d5e20215caa090aebff54ef3b387ff39ee56dd6..29899fccaae6bb1b242ebaafe1c8d7c6958f72e4 100644
|
| --- a/webrtc/modules/video_coding/codec_database.cc
|
| +++ b/webrtc/modules/video_coding/codec_database.cc
|
| @@ -71,6 +71,31 @@ VideoCodecH264 VideoEncoder::GetDefaultH264Settings() {
|
| return h264_settings;
|
| }
|
|
|
| +// Create an internal Decoder given a codec type
|
| +static std::unique_ptr<VCMGenericDecoder> CreateDecoder(VideoCodecType type) {
|
| + switch (type) {
|
| + case kVideoCodecVP8:
|
| + return std::unique_ptr<VCMGenericDecoder>(
|
| + new VCMGenericDecoder(VP8Decoder::Create()));
|
| + case kVideoCodecVP9:
|
| + return std::unique_ptr<VCMGenericDecoder>(
|
| + new VCMGenericDecoder(VP9Decoder::Create()));
|
| + case kVideoCodecI420:
|
| + return std::unique_ptr<VCMGenericDecoder>(
|
| + new VCMGenericDecoder(new I420Decoder()));
|
| + case kVideoCodecH264:
|
| + if (H264Decoder::IsSupported()) {
|
| + return std::unique_ptr<VCMGenericDecoder>(
|
| + new VCMGenericDecoder(H264Decoder::Create()));
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + LOG(LS_WARNING) << "No internal decoder of this type exists.";
|
| + return std::unique_ptr<VCMGenericDecoder>();
|
| +}
|
| +
|
| VCMDecoderMapItem::VCMDecoderMapItem(VideoCodec* settings,
|
| int number_of_cores,
|
| bool require_key_frame)
|
| @@ -98,13 +123,12 @@ VCMCodecDataBase::VCMCodecDataBase(
|
| external_encoder_(nullptr),
|
| internal_source_(false),
|
| encoded_frame_callback_(encoded_frame_callback),
|
| - ptr_decoder_(nullptr),
|
| dec_map_(),
|
| dec_external_map_() {}
|
|
|
| VCMCodecDataBase::~VCMCodecDataBase() {
|
| DeleteEncoder();
|
| - ReleaseDecoder(ptr_decoder_);
|
| + ptr_decoder_.reset();
|
| for (auto& kv : dec_map_)
|
| delete kv.second;
|
| for (auto& kv : dec_external_map_)
|
| @@ -391,11 +415,10 @@ bool VCMCodecDataBase::DeregisterExternalDecoder(uint8_t payload_type) {
|
| // We can't use payload_type to check if the decoder is currently in use,
|
| // because payload type may be out of date (e.g. before we decode the first
|
| // frame after RegisterReceiveCodec)
|
| - if (ptr_decoder_ != nullptr &&
|
| - ptr_decoder_->_decoder == (*it).second->external_decoder_instance) {
|
| + if (ptr_decoder_ &&
|
| + ptr_decoder_->IsSameDecoder((*it).second->external_decoder_instance)) {
|
| // Release it if it was registered and in use.
|
| - ReleaseDecoder(ptr_decoder_);
|
| - ptr_decoder_ = nullptr;
|
| + ptr_decoder_.reset();
|
| }
|
| DeregisterReceiveCodec(payload_type);
|
| delete it->second;
|
| @@ -455,12 +478,11 @@ VCMGenericDecoder* VCMCodecDataBase::GetDecoder(
|
| RTC_DCHECK(decoded_frame_callback->UserReceiveCallback());
|
| uint8_t payload_type = frame.PayloadType();
|
| if (payload_type == receive_codec_.plType || payload_type == 0) {
|
| - return ptr_decoder_;
|
| + return ptr_decoder_.get();
|
| }
|
| // Check for exisitng decoder, if exists - delete.
|
| if (ptr_decoder_) {
|
| - ReleaseDecoder(ptr_decoder_);
|
| - ptr_decoder_ = nullptr;
|
| + ptr_decoder_.reset();
|
| memset(&receive_codec_, 0, sizeof(VideoCodec));
|
| }
|
| ptr_decoder_ = CreateAndInitDecoder(frame, &receive_codec_);
|
| @@ -471,36 +493,26 @@ VCMGenericDecoder* VCMCodecDataBase::GetDecoder(
|
| callback->OnIncomingPayloadType(receive_codec_.plType);
|
| if (ptr_decoder_->RegisterDecodeCompleteCallback(decoded_frame_callback) <
|
| 0) {
|
| - ReleaseDecoder(ptr_decoder_);
|
| - ptr_decoder_ = nullptr;
|
| + ptr_decoder_.reset();
|
| memset(&receive_codec_, 0, sizeof(VideoCodec));
|
| return nullptr;
|
| }
|
| - return ptr_decoder_;
|
| + return ptr_decoder_.get();
|
| }
|
|
|
| -void VCMCodecDataBase::ReleaseDecoder(VCMGenericDecoder* decoder) const {
|
| - if (decoder) {
|
| - RTC_DCHECK(decoder->_decoder);
|
| - decoder->Release();
|
| - if (!decoder->External()) {
|
| - delete decoder->_decoder;
|
| - }
|
| - delete decoder;
|
| - }
|
| +VCMGenericDecoder* VCMCodecDataBase::GetCurrentDecoder() {
|
| + return ptr_decoder_.get();
|
| }
|
|
|
| bool VCMCodecDataBase::PrefersLateDecoding() const {
|
| - if (!ptr_decoder_)
|
| - return true;
|
| - return ptr_decoder_->PrefersLateDecoding();
|
| + return ptr_decoder_ ? ptr_decoder_->PrefersLateDecoding() : true;
|
| }
|
|
|
| bool VCMCodecDataBase::MatchesCurrentResolution(int width, int height) const {
|
| return send_codec_.width == width && send_codec_.height == height;
|
| }
|
|
|
| -VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder(
|
| +std::unique_ptr<VCMGenericDecoder> VCMCodecDataBase::CreateAndInitDecoder(
|
| const VCMEncodedFrame& frame,
|
| VideoCodec* new_codec) const {
|
| uint8_t payload_type = frame.PayloadType();
|
| @@ -513,13 +525,13 @@ VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder(
|
| << static_cast<int>(payload_type);
|
| return nullptr;
|
| }
|
| - VCMGenericDecoder* ptr_decoder = nullptr;
|
| + std::unique_ptr<VCMGenericDecoder> ptr_decoder;
|
| const VCMExtDecoderMapItem* external_dec_item =
|
| FindExternalDecoderItem(payload_type);
|
| if (external_dec_item) {
|
| // External codec.
|
| - ptr_decoder = new VCMGenericDecoder(
|
| - external_dec_item->external_decoder_instance, true);
|
| + ptr_decoder.reset(new VCMGenericDecoder(
|
| + external_dec_item->external_decoder_instance, true));
|
| } else {
|
| // Create decoder.
|
| ptr_decoder = CreateDecoder(decoder_item->settings->codecType);
|
| @@ -538,7 +550,6 @@ VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder(
|
| }
|
| if (ptr_decoder->InitDecode(decoder_item->settings.get(),
|
| decoder_item->number_of_cores) < 0) {
|
| - ReleaseDecoder(ptr_decoder);
|
| return nullptr;
|
| }
|
| memcpy(new_codec, decoder_item->settings.get(), sizeof(VideoCodec));
|
| @@ -552,26 +563,6 @@ void VCMCodecDataBase::DeleteEncoder() {
|
| ptr_encoder_.reset();
|
| }
|
|
|
| -VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const {
|
| - switch (type) {
|
| - case kVideoCodecVP8:
|
| - return new VCMGenericDecoder(VP8Decoder::Create());
|
| - case kVideoCodecVP9:
|
| - return new VCMGenericDecoder(VP9Decoder::Create());
|
| - case kVideoCodecI420:
|
| - return new VCMGenericDecoder(new I420Decoder());
|
| - case kVideoCodecH264:
|
| - if (H264Decoder::IsSupported()) {
|
| - return new VCMGenericDecoder(H264Decoder::Create());
|
| - }
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - LOG(LS_WARNING) << "No internal decoder of this type exists.";
|
| - return nullptr;
|
| -}
|
| -
|
| const VCMDecoderMapItem* VCMCodecDataBase::FindDecoderItem(
|
| uint8_t payload_type) const {
|
| DecoderMap::const_iterator it = dec_map_.find(payload_type);
|
|
|