blob: 643a10a346f0ab6f1146eb361155f85eeacf4a23 [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),
isheriff6b4b5f32016-06-08 00:24:21 -070035 video_header() {
36 video_header.playout_delay = {-1, -1};
37}
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000038
pbos@webrtc.org7b859cc2013-04-02 15:54:38 +000039VCMPacket::VCMPacket(const uint8_t* ptr,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000040 const size_t size,
philipel9d3ab612015-12-21 04:12:39 -080041 const WebRtcRTPHeader& rtpHeader)
42 : payloadType(rtpHeader.header.payloadType),
43 timestamp(rtpHeader.header.timestamp),
44 ntp_time_ms_(rtpHeader.ntp_time_ms),
45 seqNum(rtpHeader.header.sequenceNumber),
46 dataPtr(ptr),
47 sizeBytes(size),
48 markerBit(rtpHeader.header.markerBit),
philipel5ceaaae2016-05-24 10:20:47 +020049 timesNacked(-1),
philipel9d3ab612015-12-21 04:12:39 -080050 frameType(rtpHeader.frameType),
51 codec(kVideoCodecUnknown),
52 isFirstPacket(rtpHeader.type.Video.isFirstPacket),
53 completeNALU(kNaluComplete),
54 insertStartCode(false),
55 width(rtpHeader.type.Video.width),
56 height(rtpHeader.type.Video.height),
isheriff6b4b5f32016-06-08 00:24:21 -070057 video_header(rtpHeader.type.Video) {
philipel9d3ab612015-12-21 04:12:39 -080058 CopyCodecSpecifics(rtpHeader.type.Video);
isheriff6b4b5f32016-06-08 00:24:21 -070059
60 if (markerBit) {
61 video_header.rotation = rtpHeader.type.Video.rotation;
62 }
63 // Playout decisions are made entirely based on first packet in a frame.
64 if (isFirstPacket) {
65 video_header.playout_delay = rtpHeader.type.Video.playout_delay;
66 } else {
67 video_header.playout_delay = {-1, -1};
68 }
niklase@google.com470e71d2011-07-07 08:21:25 +000069}
70
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000071void VCMPacket::Reset() {
72 payloadType = 0;
73 timestamp = 0;
wu@webrtc.org6c75c982014-04-15 17:46:33 +000074 ntp_time_ms_ = 0;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000075 seqNum = 0;
76 dataPtr = NULL;
77 sizeBytes = 0;
78 markerBit = false;
philipel5ceaaae2016-05-24 10:20:47 +020079 timesNacked = -1;
pbos22993e12015-10-19 02:39:06 -070080 frameType = kEmptyFrame;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000081 codec = kVideoCodecUnknown;
82 isFirstPacket = false;
83 completeNALU = kNaluUnset;
84 insertStartCode = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +000085 width = 0;
86 height = 0;
isheriff6b4b5f32016-06-08 00:24:21 -070087 memset(&video_header, 0, sizeof(RTPVideoHeader));
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000088}
89
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000090void VCMPacket::CopyCodecSpecifics(const RTPVideoHeader& videoHeader) {
91 switch (videoHeader.codec) {
92 case kRtpVideoVp8:
93 // Handle all packets within a frame as depending on the previous packet
94 // TODO(holmer): This should be changed to make fragments independent
95 // when the VP8 RTP receiver supports fragments.
96 if (isFirstPacket && markerBit)
97 completeNALU = kNaluComplete;
98 else if (isFirstPacket)
99 completeNALU = kNaluStart;
100 else if (markerBit)
101 completeNALU = kNaluEnd;
102 else
103 completeNALU = kNaluIncomplete;
holmer@google.com155188c2011-08-15 09:21:27 +0000104
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000105 codec = kVideoCodecVP8;
106 return;
asaperssonf38ea3c2015-07-28 04:02:54 -0700107 case kRtpVideoVp9:
108 if (isFirstPacket && markerBit)
109 completeNALU = kNaluComplete;
110 else if (isFirstPacket)
111 completeNALU = kNaluStart;
112 else if (markerBit)
113 completeNALU = kNaluEnd;
114 else
115 completeNALU = kNaluIncomplete;
116
117 codec = kVideoCodecVP9;
118 return;
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000119 case kRtpVideoH264:
120 isFirstPacket = videoHeader.isFirstPacket;
121 if (isFirstPacket)
122 insertStartCode = true;
123
Noah Richards97282412015-04-23 11:15:08 -0700124 if (isFirstPacket && markerBit) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000125 completeNALU = kNaluComplete;
126 } else if (isFirstPacket) {
127 completeNALU = kNaluStart;
128 } else if (markerBit) {
129 completeNALU = kNaluEnd;
130 } else {
131 completeNALU = kNaluIncomplete;
132 }
133 codec = kVideoCodecH264;
134 return;
135 case kRtpVideoGeneric:
136 case kRtpVideoNone:
137 codec = kVideoCodecUnknown;
138 return;
139 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000140}
141
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000142} // namespace webrtc