Remove VCMEncodedFrame from webrtc::EncodedFrame inheritance
Remove VCMEncodedFrame from the inheritance chain of EncodedFrames by
- moving getters for EncodedImage fields up to EncodedImage
- copying other non-deprecated fields & Methods from VCMEncodedFrame over to EncodedFrame
- Removing EncodedFrame's inheritance of VCMEncodedFrame
We leave VCMEncodedFrame as part of the (near) deprecated
VideoCodingModule code. The only place which needs to accept either is
in the generic decoder.
Bug: webrtc:9378, b:296992877
Change-Id: I60706aebbb6eacc7fd4b35ec90cc903efdbe14c8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/317160
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Auto-Submit: Tony Herre <herre@google.com>
Commit-Queue: Tony Herre <herre@google.com>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40639}
diff --git a/api/video/BUILD.gn b/api/video/BUILD.gn
index ae29d8e..807fdcc 100644
--- a/api/video/BUILD.gn
+++ b/api/video/BUILD.gn
@@ -170,7 +170,10 @@
]
deps = [
- "../../modules/video_coding:encoded_frame",
+ ":encoded_image",
+ ":video_frame",
+ "../../modules/rtp_rtcp:rtp_video_header",
+ "../../modules/video_coding:video_codec_interface",
"../units:timestamp",
]
absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
diff --git a/api/video/DEPS b/api/video/DEPS
index c84299f..1dd2943 100644
--- a/api/video/DEPS
+++ b/api/video/DEPS
@@ -1,11 +1,9 @@
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",
+ "encoded_frame.h" : [
+ "+modules/rtp_rtcp/source/rtp_video_header.h",
+ "+modules/video_coding/include/video_codec_interface.h",
+ "+modules/video_coding/include/video_coding_defines.h",
],
-
"encoded_image\.h" : [
"+rtc_base/ref_count.h",
],
diff --git a/api/video/encoded_frame.cc b/api/video/encoded_frame.cc
index c5e2abb..cf3d4a2 100644
--- a/api/video/encoded_frame.cc
+++ b/api/video/encoded_frame.cc
@@ -11,6 +11,7 @@
#include "api/video/encoded_frame.h"
#include "absl/types/optional.h"
+#include "modules/rtp_rtcp/source/rtp_video_header.h"
namespace webrtc {
@@ -30,4 +31,100 @@
return false;
}
+void EncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
+ if (header) {
+ switch (header->codec) {
+ case kVideoCodecVP8: {
+ const auto& vp8_header =
+ absl::get<RTPVideoHeaderVP8>(header->video_type_header);
+ if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
+ // This is the first packet for this frame.
+ _codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
+ _codecSpecificInfo.codecSpecific.VP8.layerSync = false;
+ _codecSpecificInfo.codecSpecific.VP8.keyIdx = -1;
+ _codecSpecificInfo.codecType = kVideoCodecVP8;
+ }
+ _codecSpecificInfo.codecSpecific.VP8.nonReference =
+ vp8_header.nonReference;
+ if (vp8_header.temporalIdx != kNoTemporalIdx) {
+ _codecSpecificInfo.codecSpecific.VP8.temporalIdx =
+ vp8_header.temporalIdx;
+ _codecSpecificInfo.codecSpecific.VP8.layerSync = vp8_header.layerSync;
+ }
+ if (vp8_header.keyIdx != kNoKeyIdx) {
+ _codecSpecificInfo.codecSpecific.VP8.keyIdx = vp8_header.keyIdx;
+ }
+ break;
+ }
+ case kVideoCodecVP9: {
+ const auto& vp9_header =
+ absl::get<RTPVideoHeaderVP9>(header->video_type_header);
+ if (_codecSpecificInfo.codecType != kVideoCodecVP9) {
+ // This is the first packet for this frame.
+ _codecSpecificInfo.codecSpecific.VP9.temporal_idx = 0;
+ _codecSpecificInfo.codecSpecific.VP9.gof_idx = 0;
+ _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = false;
+ _codecSpecificInfo.codecType = kVideoCodecVP9;
+ }
+ _codecSpecificInfo.codecSpecific.VP9.inter_pic_predicted =
+ vp9_header.inter_pic_predicted;
+ _codecSpecificInfo.codecSpecific.VP9.flexible_mode =
+ vp9_header.flexible_mode;
+ _codecSpecificInfo.codecSpecific.VP9.num_ref_pics =
+ vp9_header.num_ref_pics;
+ for (uint8_t r = 0; r < vp9_header.num_ref_pics; ++r) {
+ _codecSpecificInfo.codecSpecific.VP9.p_diff[r] =
+ vp9_header.pid_diff[r];
+ }
+ _codecSpecificInfo.codecSpecific.VP9.ss_data_available =
+ vp9_header.ss_data_available;
+ if (vp9_header.temporal_idx != kNoTemporalIdx) {
+ _codecSpecificInfo.codecSpecific.VP9.temporal_idx =
+ vp9_header.temporal_idx;
+ _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch =
+ vp9_header.temporal_up_switch;
+ }
+ if (vp9_header.spatial_idx != kNoSpatialIdx) {
+ _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted =
+ vp9_header.inter_layer_predicted;
+ SetSpatialIndex(vp9_header.spatial_idx);
+ }
+ if (vp9_header.gof_idx != kNoGofIdx) {
+ _codecSpecificInfo.codecSpecific.VP9.gof_idx = vp9_header.gof_idx;
+ }
+ if (vp9_header.ss_data_available) {
+ _codecSpecificInfo.codecSpecific.VP9.num_spatial_layers =
+ vp9_header.num_spatial_layers;
+ _codecSpecificInfo.codecSpecific.VP9
+ .spatial_layer_resolution_present =
+ vp9_header.spatial_layer_resolution_present;
+ if (vp9_header.spatial_layer_resolution_present) {
+ for (size_t i = 0; i < vp9_header.num_spatial_layers; ++i) {
+ _codecSpecificInfo.codecSpecific.VP9.width[i] =
+ vp9_header.width[i];
+ _codecSpecificInfo.codecSpecific.VP9.height[i] =
+ vp9_header.height[i];
+ }
+ }
+ _codecSpecificInfo.codecSpecific.VP9.gof.CopyGofInfoVP9(
+ vp9_header.gof);
+ }
+ break;
+ }
+ case kVideoCodecH264: {
+ _codecSpecificInfo.codecType = kVideoCodecH264;
+ break;
+ }
+ case kVideoCodecAV1: {
+ _codecSpecificInfo.codecType = kVideoCodecAV1;
+ break;
+ }
+ default: {
+ _codecSpecificInfo.codecType = kVideoCodecGeneric;
+ break;
+ }
+ }
+ }
+}
+
} // namespace webrtc
diff --git a/api/video/encoded_frame.h b/api/video/encoded_frame.h
index 66aee22..72473ba 100644
--- a/api/video/encoded_frame.h
+++ b/api/video/encoded_frame.h
@@ -16,14 +16,17 @@
#include "absl/types/optional.h"
#include "api/units/timestamp.h"
-#include "modules/video_coding/encoded_frame.h"
+#include "api/video/encoded_image.h"
+#include "api/video/video_codec_type.h"
+#include "modules/rtp_rtcp/source/rtp_video_header.h"
+#include "modules/video_coding/include/video_codec_interface.h"
+#include "modules/video_coding/include/video_coding_defines.h"
namespace webrtc {
-// TODO(philipel): Remove webrtc::VCMEncodedFrame inheritance.
// TODO(philipel): Move transport specific info out of EncodedFrame.
// NOTE: This class is still under development and may change without notice.
-class EncodedFrame : public webrtc::VCMEncodedFrame {
+class EncodedFrame : public EncodedImage {
public:
static const uint8_t kMaxFrameReferences = 5;
@@ -33,14 +36,16 @@
// When this frame was received.
// TODO(bugs.webrtc.org/13756): Use Timestamp instead of int.
- virtual int64_t ReceivedTime() const = 0;
+ virtual int64_t ReceivedTime() const { return -1; }
// Returns a Timestamp from `ReceivedTime`, or nullopt if there is no receive
// time.
absl::optional<webrtc::Timestamp> ReceivedTimestamp() const;
// When this frame should be rendered.
// TODO(bugs.webrtc.org/13756): Use Timestamp instead of int.
- virtual int64_t RenderTime() const = 0;
+ virtual int64_t RenderTime() const { return _renderTimeMs; }
+ // TODO(bugs.webrtc.org/13756): Migrate to ReceivedTimestamp.
+ int64_t RenderTimeMs() const { return _renderTimeMs; }
// Returns a Timestamp from `RenderTime`, or nullopt if there is no
// render time.
absl::optional<webrtc::Timestamp> RenderTimestamp() const;
@@ -55,6 +60,23 @@
void SetId(int64_t id) { id_ = id; }
int64_t Id() const { return id_; }
+ uint8_t PayloadType() const { return _payloadType; }
+
+ bool MissingFrame() const { return _missingFrame; }
+
+ void SetRenderTime(const int64_t renderTimeMs) {
+ _renderTimeMs = renderTimeMs;
+ }
+
+ const webrtc::EncodedImage& EncodedImage() const {
+ return static_cast<const webrtc::EncodedImage&>(*this);
+ }
+
+ const CodecSpecificInfo* CodecSpecific() const { return &_codecSpecificInfo; }
+ void SetCodecSpecific(const CodecSpecificInfo* codec_specific) {
+ _codecSpecificInfo = *codec_specific;
+ }
+
// TODO(philipel): Add simple modify/access functions to prevent adding too
// many `references`.
size_t num_references = 0;
@@ -63,6 +85,19 @@
// mean that the last packet has a marker bit set).
bool is_last_spatial_layer = true;
+ protected:
+ // TODO(https://bugs.webrtc.org/9378): Move RTP specifics down into a
+ // transport-aware subclass, eg RtpFrameObject.
+ void CopyCodecSpecific(const RTPVideoHeader* header);
+
+ // TODO(https://bugs.webrtc.org/9378): Make fields private with
+ // getters/setters as needed.
+ int64_t _renderTimeMs = -1;
+ uint8_t _payloadType = 0;
+ bool _missingFrame = false;
+ CodecSpecificInfo _codecSpecificInfo;
+ VideoCodecType _codec = kVideoCodecGeneric;
+
private:
// The ID of the frame is determined from RTP level information. The IDs are
// used to describe order and dependencies between frames.
diff --git a/api/video/encoded_image.h b/api/video/encoded_image.h
index c1f1447..5fc4a0e 100644
--- a/api/video/encoded_image.h
+++ b/api/video/encoded_image.h
@@ -201,6 +201,14 @@
at_target_quality_ = at_target_quality;
}
+ webrtc::VideoFrameType FrameType() const { return _frameType; }
+
+ void SetFrameType(webrtc::VideoFrameType frame_type) {
+ _frameType = frame_type;
+ }
+ VideoContentType contentType() const { return content_type_; }
+ VideoRotation rotation() const { return rotation_; }
+
uint32_t _encodedWidth = 0;
uint32_t _encodedHeight = 0;
// NTP time of the capture time in local timebase in milliseconds.
@@ -223,6 +231,8 @@
int64_t receive_start_ms = 0;
int64_t receive_finish_ms = 0;
} timing_;
+ EncodedImage::Timing video_timing() const { return timing_; }
+ EncodedImage::Timing* video_timing_mutable() { return &timing_; }
private:
size_t capacity() const { return encoded_data_ ? encoded_data_->size() : 0; }
diff --git a/modules/video_coding/decoder_database.cc b/modules/video_coding/decoder_database.cc
index 3410edc..dabef41 100644
--- a/modules/video_coding/decoder_database.cc
+++ b/modules/video_coding/decoder_database.cc
@@ -86,7 +86,7 @@
}
VCMGenericDecoder* VCMDecoderDatabase::GetDecoder(
- const VCMEncodedFrame& frame,
+ const EncodedFrame& frame,
VCMDecodedFrameCallback* decoded_frame_callback) {
RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
RTC_DCHECK(decoded_frame_callback->UserReceiveCallback());
@@ -117,7 +117,7 @@
return &*current_decoder_;
}
-void VCMDecoderDatabase::CreateAndInitDecoder(const VCMEncodedFrame& frame) {
+void VCMDecoderDatabase::CreateAndInitDecoder(const EncodedFrame& frame) {
uint8_t payload_type = frame.PayloadType();
RTC_DLOG(LS_INFO) << "Initializing decoder with payload type '"
<< int{payload_type} << "'.";
diff --git a/modules/video_coding/decoder_database.h b/modules/video_coding/decoder_database.h
index 98f4335..87edcd0 100644
--- a/modules/video_coding/decoder_database.h
+++ b/modules/video_coding/decoder_database.h
@@ -18,8 +18,8 @@
#include "absl/types/optional.h"
#include "api/sequence_checker.h"
+#include "api/video/encoded_frame.h"
#include "api/video_codecs/video_decoder.h"
-#include "modules/video_coding/encoded_frame.h"
#include "modules/video_coding/generic_decoder.h"
namespace webrtc {
@@ -49,11 +49,11 @@
// nullptr is returned if no decoder with the specified payload type was found
// and the function failed to create one.
VCMGenericDecoder* GetDecoder(
- const VCMEncodedFrame& frame,
+ const EncodedFrame& frame,
VCMDecodedFrameCallback* decoded_frame_callback);
private:
- void CreateAndInitDecoder(const VCMEncodedFrame& frame)
+ void CreateAndInitDecoder(const EncodedFrame& frame)
RTC_RUN_ON(decoder_sequence_checker_);
SequenceChecker decoder_sequence_checker_;
diff --git a/modules/video_coding/encoded_frame.h b/modules/video_coding/encoded_frame.h
index 87b59d8..b8c9d14 100644
--- a/modules/video_coding/encoded_frame.h
+++ b/modules/video_coding/encoded_frame.h
@@ -63,29 +63,6 @@
*/
int64_t RenderTimeMs() const { return _renderTimeMs; }
/**
- * Get frame type
- */
- webrtc::VideoFrameType FrameType() const { return _frameType; }
- /**
- * Set frame type
- */
- void SetFrameType(webrtc::VideoFrameType frame_type) {
- _frameType = frame_type;
- }
- /**
- * Get frame rotation
- */
- VideoRotation rotation() const { return rotation_; }
- /**
- * Get video content type
- */
- VideoContentType contentType() const { return content_type_; }
- /**
- * Get video timing
- */
- EncodedImage::Timing video_timing() const { return timing_; }
- EncodedImage::Timing* video_timing_mutable() { return &timing_; }
- /**
* True if there's a frame missing before this frame
*/
bool MissingFrame() const { return _missingFrame; }
diff --git a/modules/video_coding/generic_decoder.cc b/modules/video_coding/generic_decoder.cc
index e3ce413..7ebc387 100644
--- a/modules/video_coding/generic_decoder.cc
+++ b/modules/video_coding/generic_decoder.cc
@@ -281,19 +281,30 @@
return ok;
}
+int32_t VCMGenericDecoder::Decode(const EncodedFrame& frame, Timestamp now) {
+ return Decode(frame, now, frame.RenderTimeMs(), frame.MissingFrame());
+}
+
int32_t VCMGenericDecoder::Decode(const VCMEncodedFrame& frame, Timestamp now) {
+ return Decode(frame, now, frame.RenderTimeMs(), frame.MissingFrame());
+}
+
+int32_t VCMGenericDecoder::Decode(const EncodedImage& frame,
+ Timestamp now,
+ int64_t render_time_ms,
+ int64_t missing_frame) {
TRACE_EVENT1("webrtc", "VCMGenericDecoder::Decode", "timestamp",
frame.Timestamp());
FrameInfo frame_info;
frame_info.rtp_timestamp = frame.Timestamp();
frame_info.decode_start = now;
frame_info.render_time =
- frame.RenderTimeMs() >= 0
- ? absl::make_optional(Timestamp::Millis(frame.RenderTimeMs()))
+ render_time_ms >= 0
+ ? absl::make_optional(Timestamp::Millis(render_time_ms))
: absl::nullopt;
frame_info.rotation = frame.rotation();
frame_info.timing = frame.video_timing();
- frame_info.ntp_time_ms = frame.EncodedImage().ntp_time_ms_;
+ frame_info.ntp_time_ms = frame.ntp_time_ms_;
frame_info.packet_infos = frame.PacketInfos();
// Set correctly only for key frames. Thus, use latest key frame
@@ -308,8 +319,7 @@
frame_info.frame_type = frame.FrameType();
_callback->Map(std::move(frame_info));
- int32_t ret = decoder_->Decode(frame.EncodedImage(), frame.MissingFrame(),
- frame.RenderTimeMs());
+ int32_t ret = decoder_->Decode(frame, missing_frame, render_time_ms);
VideoDecoder::DecoderInfo decoder_info = decoder_->GetDecoderInfo();
if (decoder_info != decoder_info_) {
RTC_LOG(LS_INFO) << "Changed decoder implementation to: "
diff --git a/modules/video_coding/generic_decoder.h b/modules/video_coding/generic_decoder.h
index 5922b52..be08fc6 100644
--- a/modules/video_coding/generic_decoder.h
+++ b/modules/video_coding/generic_decoder.h
@@ -18,6 +18,7 @@
#include "api/field_trials_view.h"
#include "api/sequence_checker.h"
+#include "api/video/encoded_frame.h"
#include "api/video_codecs/video_decoder.h"
#include "modules/video_coding/encoded_frame.h"
#include "modules/video_coding/timing/timing.h"
@@ -102,7 +103,10 @@
*
* inputVideoBuffer reference to encoded video frame
*/
+ // TODO(https://bugs.webrtc.org/9378): Remove VCMEncodedFrame variant
+ // once the usage from code in deprecated/ is gone.
int32_t Decode(const VCMEncodedFrame& inputFrame, Timestamp now);
+ int32_t Decode(const EncodedFrame& inputFrame, Timestamp now);
/**
* Set decode callback. Deregistering while decoding is illegal.
@@ -114,6 +118,10 @@
}
private:
+ int32_t Decode(const EncodedImage& frame,
+ Timestamp now,
+ int64_t render_time_ms,
+ int64_t missing_frame);
VCMDecodedFrameCallback* _callback = nullptr;
VideoDecoder* const decoder_;
VideoContentType _last_keyframe_content_type;
diff --git a/modules/video_coding/generic_decoder_unittest.cc b/modules/video_coding/generic_decoder_unittest.cc
index 32ae4bf..e8d1dad 100644
--- a/modules/video_coding/generic_decoder_unittest.cc
+++ b/modules/video_coding/generic_decoder_unittest.cc
@@ -94,7 +94,7 @@
TEST_F(GenericDecoderTest, PassesPacketInfos) {
RtpPacketInfos packet_infos = CreatePacketInfos(3);
- VCMEncodedFrame encoded_frame;
+ EncodedFrame encoded_frame;
encoded_frame.SetPacketInfos(packet_infos);
generic_decoder_.Decode(encoded_frame, clock_->CurrentTime());
time_controller_.AdvanceTime(TimeDelta::Millis(10));
@@ -107,7 +107,7 @@
constexpr int kMaxFramesInFlight = 10;
decoder_.SetDelayedDecoding(10);
for (int i = 0; i < kMaxFramesInFlight + 1; ++i) {
- VCMEncodedFrame encoded_frame;
+ EncodedFrame encoded_frame;
encoded_frame.SetTimestamp(90000 * i);
generic_decoder_.Decode(encoded_frame, clock_->CurrentTime());
}
@@ -128,7 +128,7 @@
{
// Ensure the original frame is destroyed before the decoding is completed.
- VCMEncodedFrame encoded_frame;
+ EncodedFrame encoded_frame;
encoded_frame.SetPacketInfos(packet_infos);
generic_decoder_.Decode(encoded_frame, clock_->CurrentTime());
}
@@ -140,7 +140,7 @@
}
TEST_F(GenericDecoderTest, MaxCompositionDelayNotSetByDefault) {
- VCMEncodedFrame encoded_frame;
+ EncodedFrame encoded_frame;
generic_decoder_.Decode(encoded_frame, clock_->CurrentTime());
time_controller_.AdvanceTime(TimeDelta::Millis(10));
absl::optional<VideoFrame> decoded_frame = user_callback_.PopLastFrame();
@@ -151,7 +151,7 @@
}
TEST_F(GenericDecoderTest, MaxCompositionDelayActivatedByPlayoutDelay) {
- VCMEncodedFrame encoded_frame;
+ EncodedFrame encoded_frame;
// VideoReceiveStream2 would set MaxCompositionDelayInFrames if playout delay
// is specified as X,Y, where X=0, Y>0.
constexpr int kMaxCompositionDelayInFrames = 3; // ~50 ms at 60 fps.
@@ -167,7 +167,7 @@
}
TEST_F(GenericDecoderTest, IsLowLatencyStreamFalseByDefault) {
- VCMEncodedFrame encoded_frame;
+ EncodedFrame encoded_frame;
generic_decoder_.Decode(encoded_frame, clock_->CurrentTime());
time_controller_.AdvanceTime(TimeDelta::Millis(10));
absl::optional<VideoFrame> decoded_frame = user_callback_.PopLastFrame();
@@ -176,7 +176,7 @@
}
TEST_F(GenericDecoderTest, IsLowLatencyStreamActivatedByPlayoutDelay) {
- VCMEncodedFrame encoded_frame;
+ EncodedFrame encoded_frame;
const VideoPlayoutDelay kPlayoutDelay(TimeDelta::Zero(),
TimeDelta::Millis(50));
timing_.set_min_playout_delay(kPlayoutDelay.min());
diff --git a/modules/video_coding/video_receiver2.cc b/modules/video_coding/video_receiver2.cc
index 0751869..72f366d 100644
--- a/modules/video_coding/video_receiver2.cc
+++ b/modules/video_coding/video_receiver2.cc
@@ -20,7 +20,6 @@
#include "api/video_codecs/video_codec.h"
#include "api/video_codecs/video_decoder.h"
#include "modules/video_coding/decoder_database.h"
-#include "modules/video_coding/encoded_frame.h"
#include "modules/video_coding/generic_decoder.h"
#include "modules/video_coding/include/video_coding_defines.h"
#include "modules/video_coding/timing/timing.h"
@@ -74,7 +73,7 @@
}
// Must be called from inside the receive side critical section.
-int32_t VideoReceiver2::Decode(const VCMEncodedFrame* frame) {
+int32_t VideoReceiver2::Decode(const EncodedFrame* frame) {
RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
TRACE_EVENT0("webrtc", "VideoReceiver2::Decode");
// Change decoder if payload type has changed.
diff --git a/modules/video_coding/video_receiver2.h b/modules/video_coding/video_receiver2.h
index 4457a5b..0d3bdb4 100644
--- a/modules/video_coding/video_receiver2.h
+++ b/modules/video_coding/video_receiver2.h
@@ -16,9 +16,9 @@
#include "api/field_trials_view.h"
#include "api/sequence_checker.h"
+#include "api/video/encoded_frame.h"
#include "api/video_codecs/video_decoder.h"
#include "modules/video_coding/decoder_database.h"
-#include "modules/video_coding/encoded_frame.h"
#include "modules/video_coding/generic_decoder.h"
#include "modules/video_coding/timing/timing.h"
#include "rtc_base/system/no_unique_address.h"
@@ -49,7 +49,7 @@
bool IsExternalDecoderRegistered(uint8_t payload_type) const;
int32_t RegisterReceiveCallback(VCMReceiveCallback* receive_callback);
- int32_t Decode(const VCMEncodedFrame* frame);
+ int32_t Decode(const EncodedFrame* frame);
private:
RTC_NO_UNIQUE_ADDRESS SequenceChecker construction_sequence_checker_;
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 3de58b6..0349f2d 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -277,6 +277,7 @@
"../api/video:video_rtp_headers",
"../modules/video_coding",
"../modules/video_coding:frame_helpers",
+ "../modules/video_coding:video_codec_interface",
"../modules/video_coding/timing:inter_frame_delay_variation_calculator",
"../modules/video_coding/timing:jitter_estimator",
"../modules/video_coding/timing:timing_module",
diff --git a/video/video_stream_buffer_controller.h b/video/video_stream_buffer_controller.h
index bb67304..f879385 100644
--- a/video/video_stream_buffer_controller.h
+++ b/video/video_stream_buffer_controller.h
@@ -17,6 +17,7 @@
#include "api/task_queue/task_queue_base.h"
#include "api/video/encoded_frame.h"
#include "api/video/frame_buffer.h"
+#include "modules/video_coding/include/video_coding_defines.h"
#include "modules/video_coding/timing/inter_frame_delay_variation_calculator.h"
#include "modules/video_coding/timing/jitter_estimator.h"
#include "modules/video_coding/timing/timing.h"