VideoStreamDecoder skeleton.

Initial commit for the public VideoStreamDecoder. To get some initial feedback
about structuring within WebRTC this CL only contains the skeleton of the class.

Bug: webrtc:8909
Change-Id: I076bb45dd30a450b3f7ef239e69ff872dc34dcf2
Reviewed-on: https://webrtc-review.googlesource.com/62080
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22560}
This commit is contained in:
philipel
2018-03-21 16:52:13 +01:00
committed by Commit Bot
parent b3179c75ed
commit 2fee4d61ba
8 changed files with 251 additions and 0 deletions

View File

@ -250,6 +250,39 @@ rtc_source_set("encoded_frame_api") {
]
}
rtc_source_set("video_stream_decoder") {
visibility = [ "*" ]
sources = [
"video/video_stream_decoder.h",
]
deps = [
":encoded_frame_api",
":optional",
":video_frame_api",
"../api/video_codecs:video_codecs_api",
]
}
rtc_source_set("video_stream_decoder_create") {
visibility = [ "*" ]
sources = [
"video/video_stream_decoder_create.cc",
"video/video_stream_decoder_create.h",
]
deps = [
":video_stream_decoder",
"../rtc_base:rtc_base_approved",
"../video:video_stream_decoder_impl",
]
if (!build_with_chromium && is_clang) {
# Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
}
}
rtc_source_set("video_frame_api_i420") {
visibility = [ "*" ]
sources = [

View File

@ -5,4 +5,7 @@ specific_include_rules = {
"encoded_frame.h": [
"+modules/video_coding/encoded_frame.h",
],
"video_stream_decoder_create.cc": [
"+video/video_stream_decoder_impl.h",
],
}

View File

@ -0,0 +1,54 @@
/*
* Copyright (c) 2018 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 API_VIDEO_VIDEO_STREAM_DECODER_H_
#define API_VIDEO_VIDEO_STREAM_DECODER_H_
#include <map>
#include <memory>
#include <utility>
#include "api/video/encoded_frame.h"
#include "api/video/video_frame.h"
#include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_decoder_factory.h"
namespace webrtc {
// TODO(philipel): #include instead of forward declare when the relevant CL has
// landed.
class FrameKey;
// NOTE: This class is still under development and may change without notice.
class VideoStreamDecoder {
public:
class Callbacks {
public:
virtual ~Callbacks() = default;
// Called when the VideoStreamDecoder enters a non-decodable state.
virtual void OnNonDecodableState() = 0;
// Called with the last continuous frame.
virtual void OnContinuousUntil(const FrameKey& key) = 0;
// Called with the decoded frame.
virtual void OnDecodedFrame(VideoFrame decodedImage,
rtc::Optional<int> decode_time_ms,
rtc::Optional<int> qp) = 0;
};
virtual ~VideoStreamDecoder() = default;
virtual void OnFrame(std::unique_ptr<video_coding::EncodedFrame> frame) = 0;
};
} // namespace webrtc
#endif // API_VIDEO_VIDEO_STREAM_DECODER_H_

View File

@ -0,0 +1,24 @@
/*
* Copyright (c) 2018 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.
*/
#include "api/video/video_stream_decoder_create.h"
#include "rtc_base/ptr_util.h"
#include "video/video_stream_decoder_impl.h"
namespace webrtc {
std::unique_ptr<VideoStreamDecoder> CreateVideoStreamDecoder(
VideoStreamDecoder::Callbacks* callbacks,
VideoDecoderFactory* decoder_factory,
std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings) {
return rtc::MakeUnique<VideoStreamDecoderImpl>(callbacks, decoder_factory,
std::move(decoder_settings));
}
} // namespace webrtc

View File

@ -0,0 +1,32 @@
/*
* Copyright (c) 2018 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 API_VIDEO_VIDEO_STREAM_DECODER_CREATE_H_
#define API_VIDEO_VIDEO_STREAM_DECODER_CREATE_H_
#include <map>
#include <memory>
#include <utility>
#include "api/video/video_stream_decoder.h"
namespace webrtc {
// The |decoder_settings| parameter is a map between:
// <payload type> --> <<video format>, <number of cores>>.
// The video format is used when instantiating a decoder, and
// the number of cores is used when initializing the decoder.
std::unique_ptr<VideoStreamDecoder> CreateVideoStreamDecoder(
VideoStreamDecoder::Callbacks* callbacks,
VideoDecoderFactory* decoder_factory,
std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings);
} // namespace webrtc
#endif // API_VIDEO_VIDEO_STREAM_DECODER_CREATE_H_

View File

@ -102,6 +102,28 @@ rtc_static_library("video") {
}
}
rtc_source_set("video_stream_decoder_impl") {
visibility = [ "*" ]
sources = [
"video_stream_decoder_impl.cc",
"video_stream_decoder_impl.h",
]
deps = [
"../api:encoded_frame_api",
"../api:optional",
"../api:video_frame_api",
"../api:video_stream_decoder",
"../api/video_codecs:video_codecs_api",
"../rtc_base:rtc_base_approved",
]
if (!build_with_chromium && is_clang) {
# Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
}
}
if (rtc_include_tests) {
rtc_source_set("video_quality_test") {
testonly = true

View File

@ -0,0 +1,28 @@
/*
* Copyright (c) 2018 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.
*/
#include "video/video_stream_decoder_impl.h"
#include "rtc_base/ptr_util.h"
namespace webrtc {
VideoStreamDecoderImpl::VideoStreamDecoderImpl(
VideoStreamDecoder::Callbacks* callbacks,
VideoDecoderFactory* decoder_factory,
std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings)
: callbacks_(callbacks),
decoder_factory_(decoder_factory),
decoder_settings_(std::move(decoder_settings)) {}
VideoStreamDecoderImpl::~VideoStreamDecoderImpl() {}
void VideoStreamDecoderImpl::OnFrame(
std::unique_ptr<video_coding::EncodedFrame> frame) {}
} // namespace webrtc

View File

@ -0,0 +1,55 @@
/*
* Copyright (c) 2018 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 VIDEO_VIDEO_STREAM_DECODER_IMPL_H_
#define VIDEO_VIDEO_STREAM_DECODER_IMPL_H_
#include <functional>
#include <map>
#include <memory>
#include <utility>
#include "api/optional.h"
#include "api/video/encoded_frame.h"
#include "api/video/video_frame.h"
#include "api/video/video_stream_decoder.h"
#include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_decoder_factory.h"
namespace webrtc {
class VideoStreamDecoderImpl : public VideoStreamDecoder,
private DecodedImageCallback {
public:
VideoStreamDecoderImpl(
VideoStreamDecoder::Callbacks* callbacks,
VideoDecoderFactory* decoder_factory,
std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings);
~VideoStreamDecoderImpl() override;
void OnFrame(std::unique_ptr<video_coding::EncodedFrame> frame) override;
private:
// Implements DecodedImageCallback interface
int32_t Decoded(VideoFrame& decodedImage) override;
int32_t Decoded(VideoFrame& decodedImage, int64_t decode_time_ms) override;
void Decoded(VideoFrame& decodedImage,
rtc::Optional<int32_t> decode_time_ms,
rtc::Optional<uint8_t> qp) override;
VideoStreamDecoder::Callbacks* callbacks_;
VideoDecoderFactory* decoder_factory_;
std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings_;
};
} // namespace webrtc
#endif // VIDEO_VIDEO_STREAM_DECODER_IMPL_H_