blob: 76df28e58806696f54d817f3f5208d604e365e4c [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
stefan@webrtc.org29794612012-02-08 08:58:55 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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_FRAME_BUFFER_H_
12#define MODULES_VIDEO_CODING_FRAME_BUFFER_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
Yves Gerey3e707812018-11-28 16:47:49 +010014#include <stddef.h>
15#include <stdint.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020016
stefana669a3a2016-10-06 05:04:52 -070017#include <vector>
18
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "modules/video_coding/codecs/h264/include/h264_globals.h"
20#include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "modules/video_coding/encoded_frame.h"
Yves Gerey665174f2018-06-19 15:03:05 +020022#include "modules/video_coding/include/video_coding.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "modules/video_coding/jitter_buffer_common.h"
Yves Gerey3e707812018-11-28 16:47:49 +010024#include "modules/video_coding/packet.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "modules/video_coding/session_info.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000026
agalusza@google.comd818dcb2013-07-29 21:48:11 +000027namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000028
agalusza@google.comd818dcb2013-07-29 21:48:11 +000029class VCMFrameBuffer : public VCMEncodedFrame {
30 public:
31 VCMFrameBuffer();
32 virtual ~VCMFrameBuffer();
niklase@google.com470e71d2011-07-07 08:21:25 +000033
agalusza@google.comd818dcb2013-07-29 21:48:11 +000034 virtual void Reset();
niklase@google.com470e71d2011-07-07 08:21:25 +000035
agalusza@google.comd818dcb2013-07-29 21:48:11 +000036 VCMFrameBufferEnum InsertPacket(const VCMPacket& packet,
37 int64_t timeInMs,
agalusza@google.comd818dcb2013-07-29 21:48:11 +000038 const FrameData& frame_data);
niklase@google.com470e71d2011-07-07 08:21:25 +000039
agalusza@google.comd818dcb2013-07-29 21:48:11 +000040 // State
41 // Get current state of frame
42 VCMFrameBufferStateEnum GetState() const;
agalusza@google.comd818dcb2013-07-29 21:48:11 +000043 void PrepareForDecode(bool continuous);
niklase@google.com470e71d2011-07-07 08:21:25 +000044
agalusza@google.comd818dcb2013-07-29 21:48:11 +000045 bool IsSessionComplete() const;
46 bool HaveFirstPacket() const;
agalusza@google.comd818dcb2013-07-29 21:48:11 +000047 int NumPackets() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000048
agalusza@google.comd818dcb2013-07-29 21:48:11 +000049 // Sequence numbers
50 // Get lowest packet sequence number in frame
51 int32_t GetLowSeqNum() const;
52 // Get highest packet sequence number in frame
53 int32_t GetHighSeqNum() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000054
agalusza@google.comd818dcb2013-07-29 21:48:11 +000055 int PictureId() const;
56 int TemporalId() const;
57 bool LayerSync() const;
58 int Tl0PicId() const;
stefan@webrtc.orgffd28f92011-10-19 15:55:39 +000059
stefana669a3a2016-10-06 05:04:52 -070060 std::vector<NaluInfo> GetNaluInfos() const;
61
asapersson9a4cd872015-10-23 00:27:14 -070062 void SetGofInfo(const GofInfoVP9& gof_info, size_t idx);
63
agalusza@google.comd818dcb2013-07-29 21:48:11 +000064 // Increments a counter to keep track of the number of packets of this frame
65 // which were NACKed before they arrived.
66 void IncrementNackCount();
67 // Returns the number of packets of this frame which were NACKed before they
68 // arrived.
69 int16_t GetNackCount() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000070
agalusza@google.comd818dcb2013-07-29 21:48:11 +000071 int64_t LatestPacketTimeMs() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000072
Niels Möller87e2d782019-03-07 10:18:23 +010073 webrtc::VideoFrameType FrameType() const;
niklase@google.com470e71d2011-07-07 08:21:25 +000074
agalusza@google.comd818dcb2013-07-29 21:48:11 +000075 private:
76 void SetState(VCMFrameBufferStateEnum state); // Set state of frame
stefan@webrtc.org4cf1a8a2013-06-27 15:20:14 +000077
asapersson9a4cd872015-10-23 00:27:14 -070078 VCMFrameBufferStateEnum _state; // Current state of the frame
Niels Möller2449d7a2019-09-30 10:18:16 +020079 // Set with SetEncodedData, but keep pointer to the concrete class here, to
80 // enable reallocation and mutation.
81 rtc::scoped_refptr<EncodedImageBuffer> encoded_image_buffer_;
asapersson9a4cd872015-10-23 00:27:14 -070082 VCMSessionInfo _sessionInfo;
83 uint16_t _nackCount;
84 int64_t _latestPacketTimeMs;
niklase@google.com470e71d2011-07-07 08:21:25 +000085};
86
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +000087} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +000088
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020089#endif // MODULES_VIDEO_CODING_FRAME_BUFFER_H_