blob: d3b0cc5394da5b311b02ced162fe016d8990bb05 [file] [log] [blame]
philipel02447bc2016-05-13 06:01:03 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_RTP_FRAME_REFERENCE_FINDER_H_
12#define MODULES_VIDEO_CODING_RTP_FRAME_REFERENCE_FINDER_H_
philipel02447bc2016-05-13 06:01:03 -070013
kwibergfd8be342016-05-14 19:44:11 -070014#include <memory>
philipel02447bc2016-05-13 06:01:03 -070015
philipel4e702162020-11-27 17:56:37 +010016#include "modules/video_coding/frame_object.h"
philipel02447bc2016-05-13 06:01:03 -070017
18namespace webrtc {
philipel4e702162020-11-27 17:56:37 +010019namespace internal {
20class RtpFrameReferenceFinderImpl;
21} // namespace internal
philipel17deeb42016-08-11 15:09:26 +020022
23// A complete frame is a frame which has received all its packets and all its
24// references are known.
25class OnCompleteFrameCallback {
26 public:
27 virtual ~OnCompleteFrameCallback() {}
philipel6a671502021-03-22 14:17:09 +010028 virtual void OnCompleteFrame(
29 std::unique_ptr<video_coding::EncodedFrame> frame) = 0;
philipel17deeb42016-08-11 15:09:26 +020030};
philipel02447bc2016-05-13 06:01:03 -070031
philipel6a671502021-03-22 14:17:09 +010032// TODO(bugs.webrtc.org/12579): Remove when downstream has been update.
33namespace video_coding {
34using OnCompleteFrameCallback = webrtc::OnCompleteFrameCallback;
35} // namespace video_coding
36
philipel02447bc2016-05-13 06:01:03 -070037class RtpFrameReferenceFinder {
38 public:
philipel6a671502021-03-22 14:17:09 +010039 using ReturnVector =
40 absl::InlinedVector<std::unique_ptr<video_coding::RtpFrameObject>, 3>;
philipel4e702162020-11-27 17:56:37 +010041
philipel02447bc2016-05-13 06:01:03 -070042 explicit RtpFrameReferenceFinder(OnCompleteFrameCallback* frame_callback);
philipel7acc4a42019-09-26 11:25:52 +020043 explicit RtpFrameReferenceFinder(OnCompleteFrameCallback* frame_callback,
44 int64_t picture_id_offset);
Mirko Bonadei8fdcac32018-08-28 16:30:18 +020045 ~RtpFrameReferenceFinder();
philipel463d3012016-09-09 03:32:44 -070046
47 // Manage this frame until:
48 // - We have all information needed to determine its references, after
49 // which |frame_callback_| is called with the completed frame, or
philipelafcf7f52017-04-26 08:17:35 -070050 // - We have too many stashed frames (determined by |kMaxStashedFrames|)
philipel463d3012016-09-09 03:32:44 -070051 // so we drop this frame, or
52 // - It gets cleared by ClearTo, which also means we drop it.
philipel6a671502021-03-22 14:17:09 +010053 void ManageFrame(std::unique_ptr<video_coding::RtpFrameObject> frame);
philipel463d3012016-09-09 03:32:44 -070054
55 // Notifies that padding has been received, which the reference finder
56 // might need to calculate the references of a frame.
philipel9b2ce6b2016-07-05 05:04:46 -070057 void PaddingReceived(uint16_t seq_num);
philipel02447bc2016-05-13 06:01:03 -070058
philipel463d3012016-09-09 03:32:44 -070059 // Clear all stashed frames that include packets older than |seq_num|.
60 void ClearTo(uint16_t seq_num);
61
philipel02447bc2016-05-13 06:01:03 -070062 private:
philipel4e702162020-11-27 17:56:37 +010063 void HandOffFrames(ReturnVector frames);
philipel02447bc2016-05-13 06:01:03 -070064
philipel4e702162020-11-27 17:56:37 +010065 // How far frames have been cleared out of the buffer by RTP sequence number.
66 // A frame will be cleared if it contains a packet with a sequence number
67 // older than |cleared_to_seq_num_|.
68 int cleared_to_seq_num_ = -1;
philipel7acc4a42019-09-26 11:25:52 +020069 const int64_t picture_id_offset_;
philipel4e702162020-11-27 17:56:37 +010070 OnCompleteFrameCallback* frame_callback_;
71 std::unique_ptr<internal::RtpFrameReferenceFinderImpl> impl_;
philipel02447bc2016-05-13 06:01:03 -070072};
73
philipel02447bc2016-05-13 06:01:03 -070074} // namespace webrtc
75
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020076#endif // MODULES_VIDEO_CODING_RTP_FRAME_REFERENCE_FINDER_H_