mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-19 08:37:54 +01:00

This CL breaks out descriptor specific parts into separate classes. All logic in the newly added classes is just copy pasted from the (previously massive) RtpFrameReferenceFinder with the exception of how frames are being returned, which is now done via return value rather than a callback. Basically, all interesting changes have been made in the RtpFrameReferenceFinder. Bug: webrtc:12221 Change-Id: I5f958d2fbf4b77ba11c3c6c01d8d0d80e325be60 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/195448 Commit-Queue: Philip Eliasson <philipel@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32717}
72 lines
2.5 KiB
C++
72 lines
2.5 KiB
C++
/*
|
|
* Copyright (c) 2020 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 MODULES_VIDEO_CODING_RTP_SEQ_NUM_ONLY_REF_FINDER_H_
|
|
#define MODULES_VIDEO_CODING_RTP_SEQ_NUM_ONLY_REF_FINDER_H_
|
|
|
|
#include <deque>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <set>
|
|
#include <utility>
|
|
|
|
#include "absl/container/inlined_vector.h"
|
|
#include "modules/video_coding/frame_object.h"
|
|
#include "modules/video_coding/rtp_frame_reference_finder.h"
|
|
#include "rtc_base/numerics/sequence_number_util.h"
|
|
|
|
namespace webrtc {
|
|
namespace video_coding {
|
|
|
|
class RtpSeqNumOnlyRefFinder {
|
|
public:
|
|
RtpSeqNumOnlyRefFinder() = default;
|
|
|
|
RtpFrameReferenceFinder::ReturnVector ManageFrame(
|
|
std::unique_ptr<RtpFrameObject> frame);
|
|
RtpFrameReferenceFinder::ReturnVector PaddingReceived(uint16_t seq_num);
|
|
void ClearTo(uint16_t seq_num);
|
|
|
|
private:
|
|
static constexpr int kMaxStashedFrames = 100;
|
|
static constexpr int kMaxPaddingAge = 100;
|
|
|
|
enum FrameDecision { kStash, kHandOff, kDrop };
|
|
|
|
FrameDecision ManageFrameInternal(RtpFrameObject* frame);
|
|
void RetryStashedFrames(RtpFrameReferenceFinder::ReturnVector& res);
|
|
void UpdateLastPictureIdWithPadding(uint16_t seq_num);
|
|
|
|
// For every group of pictures, hold two sequence numbers. The first being
|
|
// the sequence number of the last packet of the last completed frame, and
|
|
// the second being the sequence number of the last packet of the last
|
|
// completed frame advanced by any potential continuous packets of padding.
|
|
std::map<uint16_t,
|
|
std::pair<uint16_t, uint16_t>,
|
|
DescendingSeqNumComp<uint16_t>>
|
|
last_seq_num_gop_;
|
|
|
|
// Padding packets that have been received but that are not yet continuous
|
|
// with any group of pictures.
|
|
std::set<uint16_t, DescendingSeqNumComp<uint16_t>> stashed_padding_;
|
|
|
|
// Frames that have been fully received but didn't have all the information
|
|
// needed to determine their references.
|
|
std::deque<std::unique_ptr<RtpFrameObject>> stashed_frames_;
|
|
|
|
// Unwrapper used to unwrap generic RTP streams. In a generic stream we derive
|
|
// a picture id from the packet sequence number.
|
|
SeqNumUnwrapper<uint16_t> rtp_seq_num_unwrapper_;
|
|
};
|
|
|
|
} // namespace video_coding
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_VIDEO_CODING_RTP_SEQ_NUM_ONLY_REF_FINDER_H_
|