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: +// --> <