| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/protocol/rtp_utils.h" | 5 #include "remoting/protocol/rtp_utils.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "third_party/libjingle/source/talk/base/byteorder.h" | 8 #include "third_party/libjingle/source/talk/base/byteorder.h" |
| 9 | 9 |
| 10 using talk_base::GetBE16; | 10 using talk_base::GetBE16; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 SetBE16(buffer + 2, header.sequence_number); | 41 SetBE16(buffer + 2, header.sequence_number); |
| 42 SetBE32(buffer + 4, header.timestamp); | 42 SetBE32(buffer + 4, header.timestamp); |
| 43 SetBE32(buffer + 8, header.sync_source_id); | 43 SetBE32(buffer + 8, header.sync_source_id); |
| 44 | 44 |
| 45 for (int i = 0; i < header.sources; i++) { | 45 for (int i = 0; i < header.sources; i++) { |
| 46 SetBE32(buffer + i * 4 + 12, header.source_id[i]); | 46 SetBE32(buffer + i * 4 + 12, header.source_id[i]); |
| 47 } | 47 } |
| 48 } | 48 } |
| 49 | 49 |
| 50 static inline uint8 ExtractBits(uint8 byte, int bits_count, int shift) { | 50 static inline uint8 ExtractBits(uint8 byte, int bits_count, int shift) { |
| 51 return (byte >> shift) && ((1 << bits_count) - 1); | 51 return (byte >> shift) & ((1 << bits_count) - 1); |
| 52 } | 52 } |
| 53 | 53 |
| 54 int UnpackRtpHeader(const uint8* buffer, int buffer_size, RtpHeader* header) { | 54 int UnpackRtpHeader(const uint8* buffer, int buffer_size, RtpHeader* header) { |
| 55 DCHECK_LT(header->sources, 1 << 4); | |
| 56 DCHECK_LT(header->payload_type, 1 << 7); | |
| 57 | |
| 58 if (buffer_size < kRtpBaseHeaderSize) { | 55 if (buffer_size < kRtpBaseHeaderSize) { |
| 59 return -1; | 56 return -1; |
| 60 } | 57 } |
| 61 | 58 |
| 62 int version = ExtractBits(buffer[0], 2, 6); | 59 int version = ExtractBits(buffer[0], 2, 6); |
| 63 if (version != kRtpVersionNumber) { | 60 if (version != kRtpVersionNumber) { |
| 64 return -1; | 61 return -1; |
| 65 } | 62 } |
| 66 | 63 |
| 67 header->padding = ExtractBits(buffer[0], 1, 5) != 0; | 64 header->padding = ExtractBits(buffer[0], 1, 5) != 0; |
| 68 header->extension = ExtractBits(buffer[0], 1, 4) != 0; | 65 header->extension = ExtractBits(buffer[0], 1, 4) != 0; |
| 69 header->sources = ExtractBits(buffer[0], 4, 0); | 66 header->sources = ExtractBits(buffer[0], 4, 0); |
| 70 | 67 |
| 71 header->marker = ExtractBits(buffer[1], 1, 7) != 0; | 68 header->marker = ExtractBits(buffer[1], 1, 7) != 0; |
| 72 header->sources = ExtractBits(buffer[1], 7, 0); | 69 header->payload_type = ExtractBits(buffer[1], 7, 0); |
| 73 | 70 |
| 74 header->sequence_number = GetBE16(buffer + 2); | 71 header->sequence_number = GetBE16(buffer + 2); |
| 75 header->timestamp = GetBE32(buffer + 4); | 72 header->timestamp = GetBE32(buffer + 4); |
| 76 header->sync_source_id = GetBE32(buffer + 8); | 73 header->sync_source_id = GetBE32(buffer + 8); |
| 77 | 74 |
| 78 DCHECK_LE(header->sources, 16); | 75 DCHECK_LT(header->sources, 16); |
| 79 | 76 |
| 80 if (buffer_size < GetRtpHeaderSize(header->sources)) { | 77 if (buffer_size < GetRtpHeaderSize(header->sources)) { |
| 81 return -1; | 78 return -1; |
| 82 } | 79 } |
| 83 for (int i = 0; i < header->sources; i++) { | 80 for (int i = 0; i < header->sources; i++) { |
| 84 header->source_id[i] = GetBE32(buffer + i * 4 + 12); | 81 header->source_id[i] = GetBE32(buffer + i * 4 + 12); |
| 85 } | 82 } |
| 86 | 83 |
| 87 return GetRtpHeaderSize(header->sources); | 84 return GetRtpHeaderSize(header->sources); |
| 88 } | 85 } |
| 89 | 86 |
| 90 } // namespace remoting | 87 } // namespace remoting |
| OLD | NEW |