| /* | 
 |  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #include <stdio.h> | 
 |  | 
 | #include <algorithm> | 
 | #include <vector> | 
 |  | 
 | #include "webrtc/modules/audio_coding/neteq/test/NETEQTEST_DummyRTPpacket.h" | 
 | #include "webrtc/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.h" | 
 |  | 
 | #define FIRSTLINELEN 40 | 
 | //#define WEBRTC_DUMMY_RTP | 
 |  | 
 | static bool pktCmp(NETEQTEST_RTPpacket *a, NETEQTEST_RTPpacket *b) { | 
 |   return (a->time() < b->time()); | 
 | } | 
 |  | 
 | int main(int argc, char* argv[]) { | 
 |   FILE* in_file = fopen(argv[1], "rb"); | 
 |   if (!in_file) { | 
 |     printf("Cannot open input file %s\n", argv[1]); | 
 |     return -1; | 
 |   } | 
 |   printf("Input RTP file: %s\n", argv[1]); | 
 |  | 
 |   FILE* stat_file = fopen(argv[2], "rt"); | 
 |   if (!stat_file) { | 
 |     printf("Cannot open timing file %s\n", argv[2]); | 
 |     return -1; | 
 |   } | 
 |   printf("Timing file: %s\n", argv[2]); | 
 |  | 
 |   FILE* out_file = fopen(argv[3], "wb"); | 
 |   if (!out_file) { | 
 |     printf("Cannot open output file %s\n", argv[3]); | 
 |     return -1; | 
 |   } | 
 |   printf("Output RTP file: %s\n\n", argv[3]); | 
 |  | 
 |   // Read all statistics and insert into map. | 
 |   // Read first line. | 
 |   char temp_str[100]; | 
 |   if (fgets(temp_str, 100, stat_file) == NULL) { | 
 |     printf("Failed to read timing file %s\n", argv[2]); | 
 |     return -1; | 
 |   } | 
 |   // Define map. | 
 |   std::map<std::pair<uint16_t, uint32_t>, uint32_t> packet_stats; | 
 |   uint16_t seq_no; | 
 |   uint32_t ts; | 
 |   uint32_t send_time; | 
 |  | 
 |   while (fscanf(stat_file, | 
 |                 "%hu %u %u %*i %*i\n", &seq_no, &ts, &send_time) == 3) { | 
 |     std::pair<uint16_t, uint32_t> | 
 |         temp_pair = std::pair<uint16_t, uint32_t>(seq_no, ts); | 
 |  | 
 |     packet_stats[temp_pair] = send_time; | 
 |   } | 
 |  | 
 |   fclose(stat_file); | 
 |  | 
 |   // Read file header and write directly to output file. | 
 |   char first_line[FIRSTLINELEN]; | 
 |   if (fgets(first_line, FIRSTLINELEN, in_file) == NULL) { | 
 |     printf("Failed to read first line of input file %s\n", argv[1]); | 
 |     return -1; | 
 |   } | 
 |   fputs(first_line, out_file); | 
 |   // start_sec + start_usec + source + port + padding | 
 |   const unsigned int kRtpDumpHeaderSize = 4 + 4 + 4 + 2 + 2; | 
 |   if (fread(first_line, 1, kRtpDumpHeaderSize, in_file) | 
 |       != kRtpDumpHeaderSize) { | 
 |     printf("Failed to read RTP dump header from input file %s\n", argv[1]); | 
 |     return -1; | 
 |   } | 
 |   if (fwrite(first_line, 1, kRtpDumpHeaderSize, out_file) | 
 |       != kRtpDumpHeaderSize) { | 
 |     printf("Failed to write RTP dump header to output file %s\n", argv[3]); | 
 |     return -1; | 
 |   } | 
 |  | 
 |   std::vector<NETEQTEST_RTPpacket *> packet_vec; | 
 |  | 
 |   while (1) { | 
 |     // Insert in vector. | 
 | #ifdef WEBRTC_DUMMY_RTP | 
 |     NETEQTEST_RTPpacket *new_packet = new NETEQTEST_DummyRTPpacket(); | 
 | #else | 
 |     NETEQTEST_RTPpacket *new_packet = new NETEQTEST_RTPpacket(); | 
 | #endif | 
 |     if (new_packet->readFromFile(in_file) < 0) { | 
 |       // End of file. | 
 |       break; | 
 |     } | 
 |  | 
 |     // Look for new send time in statistics vector. | 
 |     std::pair<uint16_t, uint32_t> temp_pair = | 
 |         std::pair<uint16_t, uint32_t>(new_packet->sequenceNumber(), | 
 |                                       new_packet->timeStamp()); | 
 |  | 
 |     uint32_t new_send_time = packet_stats[temp_pair]; | 
 |     new_packet->setTime(new_send_time);  // Set new send time. | 
 |     packet_vec.push_back(new_packet);  // Insert in vector. | 
 |   } | 
 |  | 
 |   // Sort the vector according to send times. | 
 |   std::sort(packet_vec.begin(), packet_vec.end(), pktCmp); | 
 |  | 
 |   std::vector<NETEQTEST_RTPpacket *>::iterator it; | 
 |   for (it = packet_vec.begin(); it != packet_vec.end(); it++) { | 
 |     // Write to out file. | 
 |     if ((*it)->writeToFile(out_file) < 0) { | 
 |       printf("Error writing to file\n"); | 
 |       return -1; | 
 |     } | 
 |     // Delete packet. | 
 |     delete *it; | 
 |   } | 
 |  | 
 |   fclose(in_file); | 
 |   fclose(out_file); | 
 |  | 
 |   return 0; | 
 | } |