blob: e25de2ed6c6f4fb45361b0642f431b642131a438 [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),
27 frameType(kEmptyFrame),
28 codec(kVideoCodecUnknown),
29 isFirstPacket(false),
30 completeNALU(kNaluUnset),
31 insertStartCode(false),
32 width(0),
33 height(0),
34 codecSpecificHeader() {}
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000035
pbos@webrtc.org7b859cc2013-04-02 15:54:38 +000036VCMPacket::VCMPacket(const uint8_t* ptr,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000037 const size_t size,
philipel9d3ab612015-12-21 04:12:39 -080038 const WebRtcRTPHeader& rtpHeader)
39 : payloadType(rtpHeader.header.payloadType),
40 timestamp(rtpHeader.header.timestamp),
41 ntp_time_ms_(rtpHeader.ntp_time_ms),
42 seqNum(rtpHeader.header.sequenceNumber),
43 dataPtr(ptr),
44 sizeBytes(size),
45 markerBit(rtpHeader.header.markerBit),
niklase@google.com470e71d2011-07-07 08:21:25 +000046
philipel9d3ab612015-12-21 04:12:39 -080047 frameType(rtpHeader.frameType),
48 codec(kVideoCodecUnknown),
49 isFirstPacket(rtpHeader.type.Video.isFirstPacket),
50 completeNALU(kNaluComplete),
51 insertStartCode(false),
52 width(rtpHeader.type.Video.width),
53 height(rtpHeader.type.Video.height),
54 codecSpecificHeader(rtpHeader.type.Video) {
55 CopyCodecSpecifics(rtpHeader.type.Video);
niklase@google.com470e71d2011-07-07 08:21:25 +000056}
57
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000058VCMPacket::VCMPacket(const uint8_t* ptr,
59 size_t size,
60 uint16_t seq,
61 uint32_t ts,
philipel9d3ab612015-12-21 04:12:39 -080062 bool mBit)
63 : payloadType(0),
64 timestamp(ts),
65 ntp_time_ms_(0),
66 seqNum(seq),
67 dataPtr(ptr),
68 sizeBytes(size),
69 markerBit(mBit),
niklase@google.com470e71d2011-07-07 08:21:25 +000070
philipel9d3ab612015-12-21 04:12:39 -080071 frameType(kVideoFrameDelta),
72 codec(kVideoCodecUnknown),
73 isFirstPacket(false),
74 completeNALU(kNaluComplete),
75 insertStartCode(false),
76 width(0),
77 height(0),
78 codecSpecificHeader() {}
niklase@google.com470e71d2011-07-07 08:21:25 +000079
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000080void VCMPacket::Reset() {
81 payloadType = 0;
82 timestamp = 0;
wu@webrtc.org6c75c982014-04-15 17:46:33 +000083 ntp_time_ms_ = 0;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000084 seqNum = 0;
85 dataPtr = NULL;
86 sizeBytes = 0;
87 markerBit = false;
pbos22993e12015-10-19 02:39:06 -070088 frameType = kEmptyFrame;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000089 codec = kVideoCodecUnknown;
90 isFirstPacket = false;
91 completeNALU = kNaluUnset;
92 insertStartCode = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +000093 width = 0;
94 height = 0;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000095 memset(&codecSpecificHeader, 0, sizeof(RTPVideoHeader));
96}
97
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000098void VCMPacket::CopyCodecSpecifics(const RTPVideoHeader& videoHeader) {
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -070099 if (markerBit) {
100 codecSpecificHeader.rotation = videoHeader.rotation;
101 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000102 switch (videoHeader.codec) {
103 case kRtpVideoVp8:
104 // Handle all packets within a frame as depending on the previous packet
105 // TODO(holmer): This should be changed to make fragments independent
106 // when the VP8 RTP receiver supports fragments.
107 if (isFirstPacket && markerBit)
108 completeNALU = kNaluComplete;
109 else if (isFirstPacket)
110 completeNALU = kNaluStart;
111 else if (markerBit)
112 completeNALU = kNaluEnd;
113 else
114 completeNALU = kNaluIncomplete;
holmer@google.com155188c2011-08-15 09:21:27 +0000115
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000116 codec = kVideoCodecVP8;
117 return;
asaperssonf38ea3c2015-07-28 04:02:54 -0700118 case kRtpVideoVp9:
119 if (isFirstPacket && markerBit)
120 completeNALU = kNaluComplete;
121 else if (isFirstPacket)
122 completeNALU = kNaluStart;
123 else if (markerBit)
124 completeNALU = kNaluEnd;
125 else
126 completeNALU = kNaluIncomplete;
127
128 codec = kVideoCodecVP9;
129 return;
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000130 case kRtpVideoH264:
131 isFirstPacket = videoHeader.isFirstPacket;
132 if (isFirstPacket)
133 insertStartCode = true;
134
Noah Richards97282412015-04-23 11:15:08 -0700135 if (isFirstPacket && markerBit) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000136 completeNALU = kNaluComplete;
137 } else if (isFirstPacket) {
138 completeNALU = kNaluStart;
139 } else if (markerBit) {
140 completeNALU = kNaluEnd;
141 } else {
142 completeNALU = kNaluIncomplete;
143 }
144 codec = kVideoCodecH264;
145 return;
146 case kRtpVideoGeneric:
147 case kRtpVideoNone:
148 codec = kVideoCodecUnknown;
149 return;
150 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000151}
152
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000153} // namespace webrtc