blob: cdd9c933a7799cc023047b43b6bf45a3ad902bdc [file] [log] [blame]
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +00001/*
2 * Copyright (c) 2014 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 "test/rtp_file_writer.h"
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <stdint.h>
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000014#include <stdio.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020015
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000016#include <string>
17
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "rtc_base/constructor_magic.h"
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000020
21namespace webrtc {
22namespace test {
23
24static const uint16_t kPacketHeaderSize = 8;
25static const char kFirstLine[] = "#!rtpplay1.0 0.0.0.0/0\n";
26
27// Write RTP packets to file in rtpdump format, as documented at:
28// http://www.cs.columbia.edu/irt/software/rtptools/
29class RtpDumpWriter : public RtpFileWriter {
30 public:
31 explicit RtpDumpWriter(FILE* file) : file_(file) {
henrikg91d6ede2015-09-17 00:24:34 -070032 RTC_CHECK(file_ != NULL);
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000033 Init();
34 }
Mirko Bonadeife055c12019-01-29 22:53:28 +010035 ~RtpDumpWriter() override {
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000036 if (file_ != NULL) {
37 fclose(file_);
38 file_ = NULL;
39 }
40 }
41
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000042 bool WritePacket(const RtpPacket* packet) override {
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000043 uint16_t len = static_cast<uint16_t>(packet->length + kPacketHeaderSize);
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000044 uint16_t plen = static_cast<uint16_t>(packet->original_length);
45 uint32_t offset = packet->time_ms;
henrikg91d6ede2015-09-17 00:24:34 -070046 RTC_CHECK(WriteUint16(len));
47 RTC_CHECK(WriteUint16(plen));
48 RTC_CHECK(WriteUint32(offset));
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000049 return fwrite(packet->data, sizeof(uint8_t), packet->length, file_) ==
50 packet->length;
51 }
52
53 private:
54 bool Init() {
55 fprintf(file_, "%s", kFirstLine);
56
henrikg91d6ede2015-09-17 00:24:34 -070057 RTC_CHECK(WriteUint32(0));
58 RTC_CHECK(WriteUint32(0));
59 RTC_CHECK(WriteUint32(0));
60 RTC_CHECK(WriteUint16(0));
61 RTC_CHECK(WriteUint16(0));
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000062
63 return true;
64 }
65
66 bool WriteUint32(uint32_t in) {
67 // Loop through shifts = {24, 16, 8, 0}.
68 for (int shifts = 24; shifts >= 0; shifts -= 8) {
69 uint8_t tmp = static_cast<uint8_t>((in >> shifts) & 0xFF);
70 if (fwrite(&tmp, sizeof(uint8_t), 1, file_) != 1)
71 return false;
72 }
73 return true;
74 }
75
76 bool WriteUint16(uint16_t in) {
77 // Write 8 MSBs.
78 uint8_t tmp = static_cast<uint8_t>((in >> 8) & 0xFF);
79 if (fwrite(&tmp, sizeof(uint8_t), 1, file_) != 1)
80 return false;
81 // Write 8 LSBs.
82 tmp = static_cast<uint8_t>(in & 0xFF);
83 if (fwrite(&tmp, sizeof(uint8_t), 1, file_) != 1)
84 return false;
85 return true;
86 }
87
88 FILE* file_;
89
henrikg3c089d72015-09-16 05:37:44 -070090 RTC_DISALLOW_COPY_AND_ASSIGN(RtpDumpWriter);
henrik.lundin@webrtc.org83317142014-12-01 11:25:04 +000091};
92
93RtpFileWriter* RtpFileWriter::Create(FileFormat format,
94 const std::string& filename) {
95 FILE* file = fopen(filename.c_str(), "wb");
96 if (file == NULL) {
97 printf("ERROR: Can't open file: %s\n", filename.c_str());
98 return NULL;
99 }
100 switch (format) {
101 case kRtpDump:
102 return new RtpDumpWriter(file);
103 }
104 fclose(file);
105 return NULL;
106}
107
108} // namespace test
109} // namespace webrtc