blob: 6afadc339aabd36472b765df26bbd33b094db4aa [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/video_coding/packet.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
13#include <assert.h>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/include/module_common_types.h"
philipel9d3ab612015-12-21 04:12:39 -080016
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),
johan0d1b2b62017-01-10 04:21:35 -080030 is_first_packet_in_frame(false),
pbos22993e12015-10-19 02:39:06 -070031 completeNALU(kNaluUnset),
32 insertStartCode(false),
33 width(0),
34 height(0),
ilnik04f4d122017-06-19 07:18:55 -070035 video_header(),
36 receive_time_ms(0) {
isheriff6b4b5f32016-06-08 00:24:21 -070037 video_header.playout_delay = {-1, -1};
38}
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000039
pbos@webrtc.org7b859cc2013-04-02 15:54:38 +000040VCMPacket::VCMPacket(const uint8_t* ptr,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000041 const size_t size,
philipel9d3ab612015-12-21 04:12:39 -080042 const WebRtcRTPHeader& rtpHeader)
43 : payloadType(rtpHeader.header.payloadType),
44 timestamp(rtpHeader.header.timestamp),
45 ntp_time_ms_(rtpHeader.ntp_time_ms),
46 seqNum(rtpHeader.header.sequenceNumber),
47 dataPtr(ptr),
48 sizeBytes(size),
49 markerBit(rtpHeader.header.markerBit),
philipel5ceaaae2016-05-24 10:20:47 +020050 timesNacked(-1),
philipel9d3ab612015-12-21 04:12:39 -080051 frameType(rtpHeader.frameType),
52 codec(kVideoCodecUnknown),
philipelcb96ad82018-07-02 14:41:58 +020053 is_first_packet_in_frame(
54 rtpHeader.video_header().is_first_packet_in_frame),
philipel9d3ab612015-12-21 04:12:39 -080055 completeNALU(kNaluComplete),
56 insertStartCode(false),
philipelcb96ad82018-07-02 14:41:58 +020057 width(rtpHeader.video_header().width),
58 height(rtpHeader.video_header().height),
59 video_header(rtpHeader.video_header()) {
60 CopyCodecSpecifics(rtpHeader.video_header());
isheriff6b4b5f32016-06-08 00:24:21 -070061
62 if (markerBit) {
philipelcb96ad82018-07-02 14:41:58 +020063 video_header.rotation = rtpHeader.video_header().rotation;
isheriff6b4b5f32016-06-08 00:24:21 -070064 }
65 // Playout decisions are made entirely based on first packet in a frame.
johan0d1b2b62017-01-10 04:21:35 -080066 if (is_first_packet_in_frame) {
philipelcb96ad82018-07-02 14:41:58 +020067 video_header.playout_delay = rtpHeader.video_header().playout_delay;
isheriff6b4b5f32016-06-08 00:24:21 -070068 } else {
69 video_header.playout_delay = {-1, -1};
70 }
niklase@google.com470e71d2011-07-07 08:21:25 +000071}
72
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000073void VCMPacket::Reset() {
74 payloadType = 0;
75 timestamp = 0;
wu@webrtc.org6c75c982014-04-15 17:46:33 +000076 ntp_time_ms_ = 0;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000077 seqNum = 0;
78 dataPtr = NULL;
79 sizeBytes = 0;
80 markerBit = false;
philipel5ceaaae2016-05-24 10:20:47 +020081 timesNacked = -1;
pbos22993e12015-10-19 02:39:06 -070082 frameType = kEmptyFrame;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000083 codec = kVideoCodecUnknown;
johan0d1b2b62017-01-10 04:21:35 -080084 is_first_packet_in_frame = false;
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000085 completeNALU = kNaluUnset;
86 insertStartCode = false;
stefan@webrtc.org3417eb42013-05-21 15:25:53 +000087 width = 0;
88 height = 0;
philipel1a4746a2018-07-09 15:52:29 +020089 video_header = {};
stefan@webrtc.orgc3d89102011-09-08 06:50:28 +000090}
91
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000092void VCMPacket::CopyCodecSpecifics(const RTPVideoHeader& videoHeader) {
Niels Möller520ca4e2018-06-04 11:14:38 +020093 codec = videoHeader.codec;
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000094 switch (videoHeader.codec) {
Niels Möller520ca4e2018-06-04 11:14:38 +020095 case kVideoCodecVP8:
stefan@webrtc.org2ec56062014-07-31 14:59:24 +000096 // Handle all packets within a frame as depending on the previous packet
97 // TODO(holmer): This should be changed to make fragments independent
98 // when the VP8 RTP receiver supports fragments.
johan0d1b2b62017-01-10 04:21:35 -080099 if (is_first_packet_in_frame && markerBit)
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000100 completeNALU = kNaluComplete;
johan0d1b2b62017-01-10 04:21:35 -0800101 else if (is_first_packet_in_frame)
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000102 completeNALU = kNaluStart;
103 else if (markerBit)
104 completeNALU = kNaluEnd;
105 else
106 completeNALU = kNaluIncomplete;
holmer@google.com155188c2011-08-15 09:21:27 +0000107
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000108 return;
Niels Möller520ca4e2018-06-04 11:14:38 +0200109 case kVideoCodecVP9:
johan0d1b2b62017-01-10 04:21:35 -0800110 if (is_first_packet_in_frame && markerBit)
asaperssonf38ea3c2015-07-28 04:02:54 -0700111 completeNALU = kNaluComplete;
johan0d1b2b62017-01-10 04:21:35 -0800112 else if (is_first_packet_in_frame)
asaperssonf38ea3c2015-07-28 04:02:54 -0700113 completeNALU = kNaluStart;
114 else if (markerBit)
115 completeNALU = kNaluEnd;
116 else
117 completeNALU = kNaluIncomplete;
118
asaperssonf38ea3c2015-07-28 04:02:54 -0700119 return;
Niels Möller520ca4e2018-06-04 11:14:38 +0200120 case kVideoCodecH264:
johan0d1b2b62017-01-10 04:21:35 -0800121 is_first_packet_in_frame = videoHeader.is_first_packet_in_frame;
122 if (is_first_packet_in_frame)
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000123 insertStartCode = true;
124
johan0d1b2b62017-01-10 04:21:35 -0800125 if (is_first_packet_in_frame && markerBit) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000126 completeNALU = kNaluComplete;
johan0d1b2b62017-01-10 04:21:35 -0800127 } else if (is_first_packet_in_frame) {
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000128 completeNALU = kNaluStart;
129 } else if (markerBit) {
130 completeNALU = kNaluEnd;
131 } else {
132 completeNALU = kNaluIncomplete;
133 }
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000134 return;
Niels Möller520ca4e2018-06-04 11:14:38 +0200135 case kVideoCodecGeneric:
kthelgason1cdddc92017-08-24 03:52:48 -0700136 return;
Niels Möller520ca4e2018-06-04 11:14:38 +0200137 default:
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000138 codec = kVideoCodecUnknown;
139 return;
140 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000141}
142
stefan@webrtc.org2ec56062014-07-31 14:59:24 +0000143} // namespace webrtc