1 /*
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
11 #include <stdio.h>
12 #include <algorithm>
13 #include <vector>
14
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "webrtc/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.h"
17
18 #define FIRSTLINELEN 40
19
main(int argc,char * argv[])20 int main(int argc, char* argv[]) {
21 if (argc < 4 || argc > 6) {
22 printf(
23 "Usage: RTPtimeshift in.rtp out.rtp newStartTS [newStartSN "
24 "[newStartArrTime]]\n");
25 exit(1);
26 }
27
28 FILE* inFile = fopen(argv[1], "rb");
29 if (!inFile) {
30 printf("Cannot open input file %s\n", argv[1]);
31 return (-1);
32 }
33 printf("Input RTP file: %s\n", argv[1]);
34
35 FILE* outFile = fopen(argv[2], "wb");
36 if (!outFile) {
37 printf("Cannot open output file %s\n", argv[2]);
38 return (-1);
39 }
40 printf("Output RTP file: %s\n\n", argv[2]);
41
42 // Read file header and write directly to output file.
43 const unsigned int kRtpDumpHeaderSize = 4 + 4 + 4 + 2 + 2;
44 char firstline[FIRSTLINELEN];
45 EXPECT_TRUE(fgets(firstline, FIRSTLINELEN, inFile) != NULL);
46 EXPECT_GT(fputs(firstline, outFile), 0);
47 EXPECT_EQ(kRtpDumpHeaderSize,
48 fread(firstline, 1, kRtpDumpHeaderSize, inFile));
49 EXPECT_EQ(kRtpDumpHeaderSize,
50 fwrite(firstline, 1, kRtpDumpHeaderSize, outFile));
51 NETEQTEST_RTPpacket packet;
52 int packLen = packet.readFromFile(inFile);
53 if (packLen < 0) {
54 exit(1);
55 }
56
57 // Get new start TS and start SeqNo from arguments.
58 uint32_t TSdiff = atoi(argv[3]) - packet.timeStamp();
59 uint16_t SNdiff = 0;
60 uint32_t ATdiff = 0;
61 if (argc > 4) {
62 int startSN = atoi(argv[4]);
63 if (startSN >= 0)
64 SNdiff = startSN - packet.sequenceNumber();
65 if (argc > 5) {
66 int startTS = atoi(argv[5]);
67 if (startTS >= 0)
68 ATdiff = startTS - packet.time();
69 }
70 }
71
72 while (packLen >= 0) {
73 packet.setTimeStamp(packet.timeStamp() + TSdiff);
74 packet.setSequenceNumber(packet.sequenceNumber() + SNdiff);
75 packet.setTime(packet.time() + ATdiff);
76
77 packet.writeToFile(outFile);
78
79 packLen = packet.readFromFile(inFile);
80 }
81
82 fclose(inFile);
83 fclose(outFile);
84
85 return 0;
86 }
87