blob: e8c06a69771e86aaaa57aacc8e9237ba455927ec [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 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
Henrik Kjellander2557b862015-11-18 22:00:21 +010011#include "webrtc/modules/video_coding/packet.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
13#include <assert.h>
14
philipel9d3ab612015-12-21 04:12:39 -080015#include "webrtc/modules/include/module_common_types.h"
16
niklase@google.com470e71d2011-07-07 08:21:25 +000017namespace webrtc {
18
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000019VCMPacket::VCMPacket()
pbos22993e12015-10-19 02:39:06 -070020 : payloadType(0),
21 timestamp(0),
22 ntp_time_ms_(0),
23 seqNum(0),
24 dataPtr(NULL),
25 sizeBytes(0),
26 markerBit(false),
philipel5ceaaae2016-05-24 10:20:47 +020027 timesNacked(-1),
pbos22993e12015-10-19 02:39:06 -070028 frameType(kEmptyFrame),
29 codec(kVideoCodecUnknown),
30 isFirstPacket(false),
31 completeNALU(kNaluUnset),
32 insertStartCode(false),
33 width(0),
34 height(0),
35 codecSpecificHeader() {}
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000036
pbos@webrtc.org7b859cc2013-04-02 15:54:38 +000037VCMPacket::VCMPacket(const uint8_t* ptr,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000038 const size_t size,
philipel9d3ab612015-12-21 04:12:39 -080039 const WebRtcRTPHeader& rtpHeader)
40 : payloadType(rtpHeader.header.payloadType),
41 timestamp(rtpHeader.header.timestamp),
42 ntp_time_ms_(rtpHeader.ntp_time_ms),
43 seqNum(rtpHeader.header.sequenceNumber),
44 dataPtr(ptr),
45 sizeBytes(size),
46 markerBit(rtpHeader.header.markerBit),
philipel5ceaaae2016-05-24 10:20:47 +020047 timesNacked(-1),
niklase@google.com470e71d2011-07-07 08:21:25 +000048
philipel9d3ab612015-12-21 04:12:39 -080049 frameType(rtpHeader.frameType),
50 codec(kVideoCodecUnknown),
51 isFirstPacket(rtpHeader.type.Video.isFirstPacket),
52 completeNALU(kNaluComplete),
53 insertStartCode(false),
54 width(rtpHeader.type.Video.width),
55 height(rtpHeader.type.Video.height),
56 codecSpecificHeader(rtpHeader.type.Video) {
57 CopyCodecSpecifics(rtpHeader.type.Video);
niklase@google.com470e71d2011-07-07 08:21:25 +000058}
59
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000060VCMPacket::VCMPacket(const uint8_t* ptr,
61 size_t size,
62 uint16_t seq,
63 uint32_t ts,
philipel9d3ab612015-12-21 04:12:39 -080064 bool mBit)
65 : payloadType(0),
66 timestamp(ts),
67 ntp_time_ms_(0),
68 seqNum(seq),
69 dataPtr(ptr),
70 sizeBytes(size),
71 markerBit(mBit),
philipel5ceaaae2016-05-24 10:20:47 +020072 timesNacked(-1),
niklase@google.com470e71d2011-07-07 08:21:25 +000073
philipel9d3ab612015-12-21 04:12:39 -080074 frameType(kVideoFrameDelta),
75 codec(kVideoCodecUnknown),
76 isFirstPacket(false),
77 completeNALU(kNaluComplete),
78 insertStartCode(false),
79 width(0),
80 height(0),
81 codecSpecificHeader() {}
niklase@google.com470e71d2011-07-07 08:21:25 +000082
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000083void VCMPacket::Reset() {
84 payloadType = 0;
85 timestamp = 0;
wu@webrtc.org6c75c982014-04-15 17:46:33 +000086 ntp_time_ms_ = 0;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000087 seqNum = 0;
88 dataPtr = NULL;
89 sizeBytes = 0;
90 markerBit = false;
philipel5ceaaae2016-05-24 10:20:47 +020091 timesNacked = -1;
pbos22993e12015-10-19 02:39:06 -070092 frameType = kEmptyFrame;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000093 codec = kVideoCodecUnknown;
94 isFirstPacket = false;
95 completeNALU = kNaluUnset;
96 insertStartCode = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +000097 width = 0;
98 height = 0;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000099 memset(&codecSpecificHeader, 0, sizeof(RTPVideoHeader));
100}
101
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000102void VCMPacket::CopyCodecSpecifics(const RTPVideoHeader& videoHeader) {
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -0700103 if (markerBit) {
104 codecSpecificHeader.rotation = videoHeader.rotation;
105 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000106 switch (videoHeader.codec) {
107 case kRtpVideoVp8:
108 // Handle all packets within a frame as depending on the previous packet
109 // TODO(holmer): This should be changed to make fragments independent
110 // when the VP8 RTP receiver supports fragments.
111 if (isFirstPacket && markerBit)
112 completeNALU = kNaluComplete;
113 else if (isFirstPacket)
114 completeNALU = kNaluStart;
115 else if (markerBit)
116 completeNALU = kNaluEnd;
117 else
118 completeNALU = kNaluIncomplete;
holmer@google.com155188c2011-08-15 09:21:27 +0000119
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000120 codec = kVideoCodecVP8;
121 return;
asaperssonf38ea3c2015-07-28 04:02:54 -0700122 case kRtpVideoVp9:
123 if (isFirstPacket && markerBit)
124 completeNALU = kNaluComplete;
125 else if (isFirstPacket)
126 completeNALU = kNaluStart;
127 else if (markerBit)
128 completeNALU = kNaluEnd;
129 else
130 completeNALU = kNaluIncomplete;
131
132 codec = kVideoCodecVP9;
133 return;
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000134 case kRtpVideoH264:
135 isFirstPacket = videoHeader.isFirstPacket;
136 if (isFirstPacket)
137 insertStartCode = true;
138
Noah Richards97282412015-04-23 11:15:08 -0700139 if (isFirstPacket && markerBit) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000140 completeNALU = kNaluComplete;
141 } else if (isFirstPacket) {
142 completeNALU = kNaluStart;
143 } else if (markerBit) {
144 completeNALU = kNaluEnd;
145 } else {
146 completeNALU = kNaluIncomplete;
147 }
148 codec = kVideoCodecH264;
149 return;
150 case kRtpVideoGeneric:
151 case kRtpVideoNone:
152 codec = kVideoCodecUnknown;
153 return;
154 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000155}
156
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000157} // namespace webrtc