VideoStreamDecoderImpl implementation, part 2.
In this CL the GetDecoder support function is implemented. It will be called from the (not yet existing) Decode function whenever a frame is about to be decoded in order to get the correct decoder for the current frame. Bug: webrtc:8909 Change-Id: I35e40c108fb652d566b1a5fdff60a703f5615406 Reviewed-on: https://webrtc-review.googlesource.com/64448 Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Stefan Holmer <stefan@webrtc.org> Commit-Queue: Philip Eliasson <philipel@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22627}
This commit is contained in:
parent
ef99888bca
commit
79aab3ff51
@ -67,4 +67,48 @@ void VideoStreamDecoderImpl::OnFrame(
|
||||
}
|
||||
}
|
||||
|
||||
VideoDecoder* VideoStreamDecoderImpl::GetDecoder(int payload_type) {
|
||||
if (current_payload_type_ == payload_type) {
|
||||
RTC_DCHECK(decoder_);
|
||||
return decoder_.get();
|
||||
}
|
||||
|
||||
current_payload_type_.reset();
|
||||
decoder_.reset();
|
||||
|
||||
auto decoder_settings_it = decoder_settings_.find(payload_type);
|
||||
if (decoder_settings_it == decoder_settings_.end()) {
|
||||
RTC_LOG(LS_WARNING) << "Payload type " << payload_type
|
||||
<< " not registered.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const SdpVideoFormat& video_format = decoder_settings_it->second.first;
|
||||
std::unique_ptr<VideoDecoder> decoder =
|
||||
decoder_factory_->CreateVideoDecoder(video_format);
|
||||
if (!decoder) {
|
||||
RTC_LOG(LS_WARNING) << "Failed to create decoder for payload type "
|
||||
<< payload_type << ".";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int num_cores = decoder_settings_it->second.second;
|
||||
int32_t init_result = decoder->InitDecode(nullptr, num_cores);
|
||||
if (init_result != WEBRTC_VIDEO_CODEC_OK) {
|
||||
RTC_LOG(LS_WARNING) << "Failed to initialize decoder for payload type "
|
||||
<< payload_type << ".";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int32_t register_result = decoder->RegisterDecodeCompleteCallback(this);
|
||||
if (register_result != WEBRTC_VIDEO_CODEC_OK) {
|
||||
RTC_LOG(LS_WARNING) << "Failed to register decode callback.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
current_payload_type_.emplace(payload_type);
|
||||
decoder_ = std::move(decoder);
|
||||
return decoder_.get();
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "api/optional.h"
|
||||
#include "api/video/video_stream_decoder.h"
|
||||
#include "modules/video_coding/frame_buffer2.h"
|
||||
#include "modules/video_coding/jitter_estimator.h"
|
||||
@ -38,6 +39,8 @@ class VideoStreamDecoderImpl : public VideoStreamDecoder,
|
||||
void OnFrame(std::unique_ptr<video_coding::EncodedFrame> frame) override;
|
||||
|
||||
private:
|
||||
VideoDecoder* GetDecoder(int payload_type);
|
||||
|
||||
// Implements DecodedImageCallback interface
|
||||
int32_t Decoded(VideoFrame& decodedImage) override;
|
||||
int32_t Decoded(VideoFrame& decodedImage, int64_t decode_time_ms) override;
|
||||
@ -60,6 +63,8 @@ class VideoStreamDecoderImpl : public VideoStreamDecoder,
|
||||
VCMTiming timing_;
|
||||
video_coding::FrameBuffer frame_buffer_;
|
||||
video_coding::VideoLayerFrameId last_continuous_id_;
|
||||
rtc::Optional<int> current_payload_type_;
|
||||
std::unique_ptr<VideoDecoder> decoder_;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user