diff --git a/api/BUILD.gn b/api/BUILD.gn index 8d34b581cb..280b7e745a 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn @@ -238,6 +238,17 @@ rtc_source_set("video_frame_api") { ] } +rtc_source_set("encoded_frame_api") { + visibility = [ "*" ] + sources = [ + "video/encoded_frame.h", + ] + + deps = [ + "../modules/video_coding:encoded_frame", + ] +} + rtc_source_set("video_frame_api_i420") { visibility = [ "*" ] sources = [ diff --git a/api/video/DEPS b/api/video/DEPS new file mode 100644 index 0000000000..7351ce7c39 --- /dev/null +++ b/api/video/DEPS @@ -0,0 +1,8 @@ +specific_include_rules = { + # Until the new VideoStreamDecoder is implemented the current decoding + # pipeline will be used, and therefore EncodedFrame needs to inherit + # VCMEncodedFrame. + "encoded_frame.h": [ + "+modules/video_coding/encoded_frame.h", + ], +} diff --git a/api/video/encoded_frame.h b/api/video/encoded_frame.h new file mode 100644 index 0000000000..0b506be133 --- /dev/null +++ b/api/video/encoded_frame.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2016 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_ENCODED_FRAME_H_ +#define API_VIDEO_ENCODED_FRAME_H_ + +#include "modules/video_coding/encoded_frame.h" + +namespace webrtc { +namespace video_coding { + +// TODO(philipel): Rename FrameObject to EncodedFrame. +// TODO(philipel): Remove webrtc::VCMEncodedFrame inheritance. +class FrameObject : public webrtc::VCMEncodedFrame { + public: + static const uint8_t kMaxFrameReferences = 5; + + FrameObject() = default; + virtual ~FrameObject() {} + + virtual bool GetBitstream(uint8_t* destination) const = 0; + + // The capture timestamp of this frame. + virtual uint32_t Timestamp() const = 0; + + // When this frame was received. + virtual int64_t ReceivedTime() const = 0; + + // When this frame should be rendered. + virtual int64_t RenderTime() const = 0; + + // This information is currently needed by the timing calculation class. + // TODO(philipel): Remove this function when a new timing class has + // been implemented. + virtual bool delayed_by_retransmission() const { return 0; } + + size_t size() const { return _length; } + + bool is_keyframe() const { return num_references == 0; } + + // The tuple (|picture_id|, |spatial_layer|) uniquely identifies a frame + // object. For codec types that don't necessarily have picture ids they + // have to be constructed from the header data relevant to that codec. + int64_t picture_id = 0; + uint8_t spatial_layer = 0; + uint32_t timestamp = 0; + + // TODO(philipel): Add simple modify/access functions to prevent adding too + // many |references|. + size_t num_references = 0; + int64_t references[kMaxFrameReferences]; + bool inter_layer_predicted = false; +}; + +} // namespace video_coding +} // namespace webrtc + +#endif // API_VIDEO_ENCODED_FRAME_H_ diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn index 1b7b51160b..3269276625 100644 --- a/modules/video_coding/BUILD.gn +++ b/modules/video_coding/BUILD.gn @@ -8,6 +8,34 @@ import("../../webrtc.gni") +rtc_static_library("encoded_frame") { + visibility = [ "*" ] + sources = [ + "encoded_frame.cc", + "encoded_frame.h", + ] + deps = [ + ":video_codec_interface", + "../../:webrtc_common", + "../../api:optional", + "../../api:video_frame_api_i420", + "../../common_video:common_video", + "../../modules:module_api", + "../../modules:module_api_public", + "../../modules/video_coding:video_coding_utility", + "../../rtc_base:checks", + "../../rtc_base:rtc_base_approved", + "../../rtc_base/experiments:alr_experiment", + "../../system_wrappers:field_trial_api", + "../../system_wrappers:system_wrappers", + ] + + 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_static_library("video_coding") { visibility = [ "*" ] deps = [] @@ -19,8 +47,6 @@ rtc_static_library("video_coding") { "decoder_database.h", "decoding_state.cc", "decoding_state.h", - "encoded_frame.cc", - "encoded_frame.h", "encoder_database.cc", "encoder_database.h", "fec_controller_default.cc", @@ -110,6 +136,7 @@ rtc_static_library("video_coding") { deps += [ ":codec_globals_headers", + ":encoded_frame", ":video_codec_interface", ":video_coding_utility", ":webrtc_h264", @@ -118,6 +145,7 @@ rtc_static_library("video_coding") { "..:module_api_public", "../..:webrtc_common", "../../:typedefs", + "../../api:encoded_frame_api", "../../api:fec_controller_api", "../../api:optional", "../../api:video_frame_api", @@ -715,6 +743,7 @@ if (rtc_include_tests) { sources += [ "codecs/h264/h264_encoder_impl_unittest.cc" ] } deps = [ + ":encoded_frame", ":mock_headers", ":simulcast_test_utility", ":video_codec_interface", diff --git a/modules/video_coding/encoded_frame.cc b/modules/video_coding/encoded_frame.cc index 9950012bad..e3905575b7 100644 --- a/modules/video_coding/encoded_frame.cc +++ b/modules/video_coding/encoded_frame.cc @@ -8,10 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "modules/video_coding/include/video_coding_defines.h" #include "modules/video_coding/encoded_frame.h" -#include "modules/video_coding/generic_encoder.h" -#include "modules/video_coding/jitter_buffer_common.h" namespace webrtc { diff --git a/modules/video_coding/frame_object.cc b/modules/video_coding/frame_object.cc index 6a31cfd9b6..3bb5283b92 100644 --- a/modules/video_coding/frame_object.cc +++ b/modules/video_coding/frame_object.cc @@ -17,13 +17,6 @@ namespace webrtc { namespace video_coding { -FrameObject::FrameObject() - : picture_id(0), - spatial_layer(0), - timestamp(0), - num_references(0), - inter_layer_predicted(false) {} - RtpFrameObject::RtpFrameObject(PacketBuffer* packet_buffer, uint16_t first_seq_num, uint16_t last_seq_num, diff --git a/modules/video_coding/frame_object.h b/modules/video_coding/frame_object.h index 6f31c1af71..72b719c3fc 100644 --- a/modules/video_coding/frame_object.h +++ b/modules/video_coding/frame_object.h @@ -12,54 +12,13 @@ #define MODULES_VIDEO_CODING_FRAME_OBJECT_H_ #include "api/optional.h" +#include "api/video/encoded_frame.h" #include "common_types.h" // NOLINT(build/include) #include "modules/include/module_common_types.h" -#include "modules/video_coding/encoded_frame.h" namespace webrtc { namespace video_coding { -class FrameObject : public webrtc::VCMEncodedFrame { - public: - static const uint8_t kMaxFrameReferences = 5; - - FrameObject(); - virtual ~FrameObject() {} - - virtual bool GetBitstream(uint8_t* destination) const = 0; - - // The capture timestamp of this frame. - virtual uint32_t Timestamp() const = 0; - - // When this frame was received. - virtual int64_t ReceivedTime() const = 0; - - // When this frame should be rendered. - virtual int64_t RenderTime() const = 0; - - // This information is currently needed by the timing calculation class. - // TODO(philipel): Remove this function when a new timing class has - // been implemented. - virtual bool delayed_by_retransmission() const { return 0; } - - size_t size() const { return _length; } - - bool is_keyframe() const { return num_references == 0; } - - // The tuple (|picture_id|, |spatial_layer|) uniquely identifies a frame - // object. For codec types that don't necessarily have picture ids they - // have to be constructed from the header data relevant to that codec. - int64_t picture_id; - uint8_t spatial_layer; - uint32_t timestamp; - - // TODO(philipel): Add simple modify/access functions to prevent adding too - // many |references|. - size_t num_references; - int64_t references[kMaxFrameReferences]; - bool inter_layer_predicted; -}; - class PacketBuffer; class RtpFrameObject : public FrameObject {