blob: 542797226e99434dc6e6e95b5c81599ddc47ef48 [file] [log] [blame]
philipelc707ab72016-04-01 02:01:54 -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
11#ifndef WEBRTC_MODULES_VIDEO_CODING_FRAME_OBJECT_H_
12#define WEBRTC_MODULES_VIDEO_CODING_FRAME_OBJECT_H_
13
philipel02447bc2016-05-13 06:01:03 -070014#include "webrtc/common_types.h"
15#include "webrtc/modules/include/module_common_types.h"
philipel552866c2016-07-04 16:18:55 +020016#include "webrtc/modules/video_coding/encoded_frame.h"
philipelc707ab72016-04-01 02:01:54 -070017
18namespace webrtc {
19namespace video_coding {
20
philipel552866c2016-07-04 16:18:55 +020021class FrameObject : public webrtc::VCMEncodedFrame {
philipelc707ab72016-04-01 02:01:54 -070022 public:
philipelf4139332016-04-20 10:26:34 +020023 static const uint8_t kMaxFrameReferences = 5;
24
philipela1059872016-05-09 11:41:48 +020025 FrameObject();
philipelb4d31082016-07-11 08:46:29 -070026 virtual ~FrameObject() {}
philipela1059872016-05-09 11:41:48 +020027
philipelc707ab72016-04-01 02:01:54 -070028 virtual bool GetBitstream(uint8_t* destination) const = 0;
philipelb4d31082016-07-11 08:46:29 -070029
30 // The capture timestamp of this frame.
31 virtual uint32_t Timestamp() const = 0;
32
33 // When this frame was received.
34 virtual int64_t ReceivedTime() const = 0;
35
36 // When this frame should be rendered.
37 virtual int64_t RenderTime() const = 0;
38
nisse37abf532016-10-28 00:37:29 -070039 size_t size() { return _length; }
philipelf4139332016-04-20 10:26:34 +020040
philipela1059872016-05-09 11:41:48 +020041 // The tuple (|picture_id|, |spatial_layer|) uniquely identifies a frame
42 // object. For codec types that don't necessarily have picture ids they
43 // have to be constructed from the header data relevant to that codec.
philipelf4139332016-04-20 10:26:34 +020044 uint16_t picture_id;
philipela1059872016-05-09 11:41:48 +020045 uint8_t spatial_layer;
philipelbe7a9e52016-05-19 12:19:35 +020046 uint32_t timestamp;
philipela1059872016-05-09 11:41:48 +020047
philipelf4139332016-04-20 10:26:34 +020048 size_t num_references;
philipelf4139332016-04-20 10:26:34 +020049 uint16_t references[kMaxFrameReferences];
philipela1059872016-05-09 11:41:48 +020050 bool inter_layer_predicted;
philipelc707ab72016-04-01 02:01:54 -070051};
52
53class PacketBuffer;
54
55class RtpFrameObject : public FrameObject {
56 public:
57 RtpFrameObject(PacketBuffer* packet_buffer,
philipel02447bc2016-05-13 06:01:03 -070058 uint16_t first_seq_num,
philipel5ceaaae2016-05-24 10:20:47 +020059 uint16_t last_seq_num,
60 size_t frame_size,
philipelb4d31082016-07-11 08:46:29 -070061 int times_nacked,
62 int64_t received_time);
philipelf4139332016-04-20 10:26:34 +020063
philipelc707ab72016-04-01 02:01:54 -070064 ~RtpFrameObject();
philipelf4139332016-04-20 10:26:34 +020065 uint16_t first_seq_num() const;
66 uint16_t last_seq_num() const;
philipel5ceaaae2016-05-24 10:20:47 +020067 int times_nacked() const;
philipel552866c2016-07-04 16:18:55 +020068 enum FrameType frame_type() const;
philipel02447bc2016-05-13 06:01:03 -070069 VideoCodecType codec_type() const;
philipelc707ab72016-04-01 02:01:54 -070070 bool GetBitstream(uint8_t* destination) const override;
philipelb4d31082016-07-11 08:46:29 -070071 uint32_t Timestamp() const override;
72 int64_t ReceivedTime() const override;
73 int64_t RenderTime() const override;
philipel02447bc2016-05-13 06:01:03 -070074 RTPVideoTypeHeader* GetCodecHeader() const;
philipelc707ab72016-04-01 02:01:54 -070075
76 private:
philipel17deeb42016-08-11 15:09:26 +020077 rtc::scoped_refptr<PacketBuffer> packet_buffer_;
philipel552866c2016-07-04 16:18:55 +020078 enum FrameType frame_type_;
philipel02447bc2016-05-13 06:01:03 -070079 VideoCodecType codec_type_;
80 uint16_t first_seq_num_;
81 uint16_t last_seq_num_;
philipelb4d31082016-07-11 08:46:29 -070082 uint32_t timestamp_;
83 int64_t received_time_;
philipel5ceaaae2016-05-24 10:20:47 +020084
85 // Equal to times nacked of the packet with the highet times nacked
86 // belonging to this frame.
87 int times_nacked_;
philipelc707ab72016-04-01 02:01:54 -070088};
89
90} // namespace video_coding
91} // namespace webrtc
92
93#endif // WEBRTC_MODULES_VIDEO_CODING_FRAME_OBJECT_H_