From 2fee4d61ba26fcc5a130521c3d62792259b64a20 Mon Sep 17 00:00:00 2001 From: philipel Date: Wed, 21 Mar 2018 16:52:13 +0100 Subject: [PATCH] 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 Reviewed-by: Karl Wiberg Commit-Queue: Philip Eliasson Cr-Commit-Position: refs/heads/master@{#22560} --- api/BUILD.gn | 33 ++++++++++++++ api/video/DEPS | 3 ++ api/video/video_stream_decoder.h | 54 +++++++++++++++++++++++ api/video/video_stream_decoder_create.cc | 24 +++++++++++ api/video/video_stream_decoder_create.h | 32 ++++++++++++++ video/BUILD.gn | 22 ++++++++++ video/video_stream_decoder_impl.cc | 28 ++++++++++++ video/video_stream_decoder_impl.h | 55 ++++++++++++++++++++++++ 8 files changed, 251 insertions(+) create mode 100644 api/video/video_stream_decoder.h create mode 100644 api/video/video_stream_decoder_create.cc create mode 100644 api/video/video_stream_decoder_create.h create mode 100644 video/video_stream_decoder_impl.cc create mode 100644 video/video_stream_decoder_impl.h diff --git a/api/BUILD.gn b/api/BUILD.gn index ec717841c6..b7ff32ba4c 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn @@ -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 = [ diff --git a/api/video/DEPS b/api/video/DEPS index 7351ce7c39..3cdc754464 100644 --- a/api/video/DEPS +++ b/api/video/DEPS @@ -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", + ], } diff --git a/api/video/video_stream_decoder.h b/api/video/video_stream_decoder.h new file mode 100644 index 0000000000..0f04827f0e --- /dev/null +++ b/api/video/video_stream_decoder.h @@ -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 +#include +#include + +#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 decode_time_ms, + rtc::Optional qp) = 0; + }; + + virtual ~VideoStreamDecoder() = default; + + virtual void OnFrame(std::unique_ptr frame) = 0; +}; + +} // namespace webrtc + +#endif // API_VIDEO_VIDEO_STREAM_DECODER_H_ diff --git a/api/video/video_stream_decoder_create.cc b/api/video/video_stream_decoder_create.cc new file mode 100644 index 0000000000..e756096082 --- /dev/null +++ b/api/video/video_stream_decoder_create.cc @@ -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 CreateVideoStreamDecoder( + VideoStreamDecoder::Callbacks* callbacks, + VideoDecoderFactory* decoder_factory, + std::map> decoder_settings) { + return rtc::MakeUnique(callbacks, decoder_factory, + std::move(decoder_settings)); +} +} // namespace webrtc diff --git a/api/video/video_stream_decoder_create.h b/api/video/video_stream_decoder_create.h new file mode 100644 index 0000000000..04682901da --- /dev/null +++ b/api/video/video_stream_decoder_create.h @@ -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 +#include +#include + +#include "api/video/video_stream_decoder.h" + +namespace webrtc { +// The |decoder_settings| parameter is a map between: +// --> <