Index: webrtc/modules/video_coding/codecs/tools/video_quality_measurement.cc |
diff --git a/webrtc/modules/video_coding/codecs/tools/video_quality_measurement.cc b/webrtc/modules/video_coding/codecs/tools/video_quality_measurement.cc |
index 8bc6e5faa9c516ce4538b9019f42b2edb420fd76..37fad483f7617b3c689f57f0e3387e6e7ca48ae6 100644 |
--- a/webrtc/modules/video_coding/codecs/tools/video_quality_measurement.cc |
+++ b/webrtc/modules/video_coding/codecs/tools/video_quality_measurement.cc |
@@ -16,7 +16,7 @@ |
#include <sys/stat.h> // To check for directory existence. |
#ifndef S_ISDIR // Not defined in stat.h on Windows. |
-#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) |
+#define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR) |
#endif |
#include "gflags/gflags.h" |
@@ -34,68 +34,102 @@ |
#include "webrtc/test/testsupport/packet_reader.h" |
DEFINE_string(test_name, "Quality test", "The name of the test to run. "); |
-DEFINE_string(test_description, "", "A more detailed description about what " |
+DEFINE_string(test_description, |
+ "", |
+ "A more detailed description about what " |
"the current test is about."); |
-DEFINE_string(input_filename, "", "Input file. " |
+DEFINE_string(input_filename, |
+ "", |
+ "Input file. " |
"The source video file to be encoded and decoded. Must be in " |
".yuv format"); |
DEFINE_int32(width, -1, "Width in pixels of the frames in the input file."); |
DEFINE_int32(height, -1, "Height in pixels of the frames in the input file."); |
-DEFINE_int32(framerate, 30, "Frame rate of the input file, in FPS " |
+DEFINE_int32(framerate, |
+ 30, |
+ "Frame rate of the input file, in FPS " |
"(frames-per-second). "); |
-DEFINE_string(output_dir, ".", "Output directory. " |
+DEFINE_string(output_dir, |
+ ".", |
+ "Output directory. " |
"The directory where the output file will be put. Must already " |
"exist."); |
-DEFINE_bool(use_single_core, false, "Force using a single core. If set to " |
+DEFINE_bool(use_single_core, |
+ false, |
+ "Force using a single core. If set to " |
"true, only one core will be used for processing. Using a single " |
"core is necessary to get a deterministic behavior for the" |
"encoded frames - using multiple cores will produce different " |
"encoded frames since multiple cores are competing to consume the " |
"byte budget for each frame in parallel. If set to false, " |
"the maximum detected number of cores will be used. "); |
-DEFINE_bool(disable_fixed_random_seed , false, "Set this flag to disable the" |
+DEFINE_bool(disable_fixed_random_seed, |
+ false, |
+ "Set this flag to disable the" |
"usage of a fixed random seed for the random generator used " |
"for packet loss. Disabling this will cause consecutive runs " |
"loose packets at different locations, which is bad for " |
"reproducibility."); |
-DEFINE_string(output_filename, "", "Output file. " |
+DEFINE_string(output_filename, |
+ "", |
+ "Output file. " |
"The name of the output video file resulting of the processing " |
"of the source file. By default this is the same name as the " |
"input file with '_out' appended before the extension."); |
DEFINE_int32(bitrate, 500, "Bit rate in kilobits/second."); |
-DEFINE_int32(keyframe_interval, 0, "Forces a keyframe every Nth frame. " |
+DEFINE_int32(keyframe_interval, |
+ 0, |
+ "Forces a keyframe every Nth frame. " |
"0 means the encoder decides when to insert keyframes. Note that " |
"the encoder may create a keyframe in other locations in addition " |
"to the interval that is set using this parameter."); |
-DEFINE_int32(temporal_layers, 0, "The number of temporal layers to use " |
+DEFINE_int32(temporal_layers, |
+ 0, |
+ "The number of temporal layers to use " |
"(VP8 specific codec setting). Must be 0-4."); |
-DEFINE_int32(packet_size, 1500, "Simulated network packet size in bytes (MTU). " |
+DEFINE_int32(packet_size, |
+ 1500, |
+ "Simulated network packet size in bytes (MTU). " |
"Used for packet loss simulation."); |
-DEFINE_int32(max_payload_size, 1440, "Max payload size in bytes for the " |
+DEFINE_int32(max_payload_size, |
+ 1440, |
+ "Max payload size in bytes for the " |
"encoder."); |
-DEFINE_string(packet_loss_mode, "uniform", "Packet loss mode. Two different " |
+DEFINE_string(packet_loss_mode, |
+ "uniform", |
+ "Packet loss mode. Two different " |
"packet loss models are supported: uniform or burst. This " |
"setting has no effect unless packet_loss_rate is >0. "); |
-DEFINE_double(packet_loss_probability, 0.0, "Packet loss probability. A value " |
+DEFINE_double(packet_loss_probability, |
+ 0.0, |
+ "Packet loss probability. A value " |
"between 0.0 and 1.0 that defines the probability of a packet " |
"being lost. 0.1 means 10% and so on."); |
-DEFINE_int32(packet_loss_burst_length, 1, "Packet loss burst length. Defines " |
+DEFINE_int32(packet_loss_burst_length, |
+ 1, |
+ "Packet loss burst length. Defines " |
"how many packets will be lost in a burst when a packet has been " |
"decided to be lost. Must be >=1."); |
-DEFINE_bool(csv, false, "CSV output. Enabling this will output all frame " |
+DEFINE_bool(csv, |
+ false, |
+ "CSV output. Enabling this will output all frame " |
"statistics at the end of execution. Recommended to run combined " |
"with --noverbose to avoid mixing output."); |
-DEFINE_bool(python, false, "Python output. Enabling this will output all frame " |
+DEFINE_bool(python, |
+ false, |
+ "Python output. Enabling this will output all frame " |
"statistics as a Python script at the end of execution. " |
"Recommended to run combine with --noverbose to avoid mixing " |
"output."); |
-DEFINE_bool(verbose, true, "Verbose mode. Prints a lot of debugging info. " |
+DEFINE_bool(verbose, |
+ true, |
+ "Verbose mode. Prints a lot of debugging info. " |
"Suitable for tracking progress but not for capturing output. " |
"Disable with --noverbose flag."); |
// Custom log method that only prints if the verbose flag is given. |
// Supports all the standard printf parameters and formatting (just forwarded). |
-int Log(const char *format, ...) { |
+int Log(const char* format, ...) { |
int result = 0; |
if (FLAGS_verbose) { |
va_list args; |
@@ -132,9 +166,9 @@ int HandleCommandLineFlags(webrtc::test::TestConfig* config) { |
// Verify the output dir exists. |
struct stat dir_info; |
if (!(stat(FLAGS_output_dir.c_str(), &dir_info) == 0 && |
- S_ISDIR(dir_info.st_mode))) { |
+ S_ISDIR(dir_info.st_mode))) { |
fprintf(stderr, "Cannot find output directory: %s\n", |
- FLAGS_output_dir.c_str()); |
+ FLAGS_output_dir.c_str()); |
return 3; |
} |
config->output_dir = FLAGS_output_dir; |
@@ -148,16 +182,16 @@ int HandleCommandLineFlags(webrtc::test::TestConfig* config) { |
startIndex = 0; |
} |
FLAGS_output_filename = |
- FLAGS_input_filename.substr(startIndex, |
- FLAGS_input_filename.find_last_of(".") |
- - startIndex) + "_out.yuv"; |
+ FLAGS_input_filename.substr( |
+ startIndex, FLAGS_input_filename.find_last_of(".") - startIndex) + |
+ "_out.yuv"; |
} |
// Verify output file can be written. |
if (FLAGS_output_dir == ".") { |
config->output_filename = FLAGS_output_filename; |
} else { |
- config->output_filename = FLAGS_output_dir + "/"+ FLAGS_output_filename; |
+ config->output_filename = FLAGS_output_dir + "/" + FLAGS_output_filename; |
} |
test_file = fopen(config->output_filename.c_str(), "wb"); |
if (test_file == NULL) { |
@@ -232,27 +266,32 @@ int HandleCommandLineFlags(webrtc::test::TestConfig* config) { |
// Check packet loss settings |
if (FLAGS_packet_loss_mode != "uniform" && |
FLAGS_packet_loss_mode != "burst") { |
- fprintf(stderr, "Unsupported packet loss mode, must be 'uniform' or " |
+ fprintf(stderr, |
+ "Unsupported packet loss mode, must be 'uniform' or " |
"'burst'\n."); |
return 10; |
} |
config->networking_config.packet_loss_mode = webrtc::test::kUniform; |
if (FLAGS_packet_loss_mode == "burst") { |
- config->networking_config.packet_loss_mode = webrtc::test::kBurst; |
+ config->networking_config.packet_loss_mode = webrtc::test::kBurst; |
} |
if (FLAGS_packet_loss_probability < 0.0 || |
FLAGS_packet_loss_probability > 1.0) { |
- fprintf(stderr, "Invalid packet loss probability. Must be 0.0 - 1.0, " |
- "was: %f\n", FLAGS_packet_loss_probability); |
+ fprintf(stderr, |
+ "Invalid packet loss probability. Must be 0.0 - 1.0, " |
+ "was: %f\n", |
+ FLAGS_packet_loss_probability); |
return 11; |
} |
config->networking_config.packet_loss_probability = |
FLAGS_packet_loss_probability; |
if (FLAGS_packet_loss_burst_length < 1) { |
- fprintf(stderr, "Invalid packet loss burst length, must be >=1, " |
- "was: %d\n", FLAGS_packet_loss_burst_length); |
+ fprintf(stderr, |
+ "Invalid packet loss burst length, must be >=1, " |
+ "was: %d\n", |
+ FLAGS_packet_loss_burst_length); |
return 12; |
} |
config->networking_config.packet_loss_burst_length = |
@@ -264,10 +303,9 @@ int HandleCommandLineFlags(webrtc::test::TestConfig* config) { |
void CalculateSsimVideoMetrics(webrtc::test::TestConfig* config, |
webrtc::test::QualityMetricsResult* result) { |
Log("Calculating SSIM...\n"); |
- I420SSIMFromFiles(config->input_filename.c_str(), |
- config->output_filename.c_str(), |
- config->codec_settings->width, |
- config->codec_settings->height, result); |
+ I420SSIMFromFiles( |
+ config->input_filename.c_str(), config->output_filename.c_str(), |
+ config->codec_settings->width, config->codec_settings->height, result); |
Log(" Average: %3.2f\n", result->average); |
Log(" Min : %3.2f (frame %d)\n", result->min, result->min_frame_number); |
Log(" Max : %3.2f (frame %d)\n", result->max, result->max_frame_number); |
@@ -276,10 +314,9 @@ void CalculateSsimVideoMetrics(webrtc::test::TestConfig* config, |
void CalculatePsnrVideoMetrics(webrtc::test::TestConfig* config, |
webrtc::test::QualityMetricsResult* result) { |
Log("Calculating PSNR...\n"); |
- I420PSNRFromFiles(config->input_filename.c_str(), |
- config->output_filename.c_str(), |
- config->codec_settings->width, |
- config->codec_settings->height, result); |
+ I420PSNRFromFiles( |
+ config->input_filename.c_str(), config->output_filename.c_str(), |
+ config->codec_settings->width, config->codec_settings->height, result); |
Log(" Average: %3.2f\n", result->average); |
Log(" Min : %3.2f (frame %d)\n", result->min, result->min_frame_number); |
Log(" Max : %3.2f (frame %d)\n", result->max, result->max_frame_number); |
@@ -309,9 +346,11 @@ void PrintConfigurationSummary(const webrtc::test::TestConfig& config) { |
void PrintCsvOutput(const webrtc::test::Stats& stats, |
const webrtc::test::QualityMetricsResult& ssim_result, |
const webrtc::test::QualityMetricsResult& psnr_result) { |
- Log("\nCSV output (recommended to run with --noverbose to skip the " |
- "above output)\n"); |
- printf("frame_number encoding_successful decoding_successful " |
+ Log( |
+ "\nCSV output (recommended to run with --noverbose to skip the " |
+ "above output)\n"); |
+ printf( |
+ "frame_number encoding_successful decoding_successful " |
"encode_return_code decode_return_code " |
"encode_time_in_us decode_time_in_us " |
"bit_rate_in_kbps encoded_frame_length_in_bytes frame_type " |
@@ -322,22 +361,13 @@ void PrintCsvOutput(const webrtc::test::Stats& stats, |
const webrtc::test::FrameStatistic& f = stats.stats_[i]; |
const webrtc::test::FrameResult& ssim = ssim_result.frames[i]; |
const webrtc::test::FrameResult& psnr = psnr_result.frames[i]; |
- printf("%4d, %d, %d, %2d, %2d, %6d, %6d, %5d, %7" PRIuS ", %d, %2d, %2" |
- PRIuS ", %5.3f, %5.2f\n", |
- f.frame_number, |
- f.encoding_successful, |
- f.decoding_successful, |
- f.encode_return_code, |
- f.decode_return_code, |
- f.encode_time_in_us, |
- f.decode_time_in_us, |
- f.bit_rate_in_kbps, |
- f.encoded_frame_length_in_bytes, |
- f.frame_type, |
- f.packets_dropped, |
- f.total_packets, |
- ssim.value, |
- psnr.value); |
+ printf("%4d, %d, %d, %2d, %2d, %6d, %6d, %5d, %7" PRIuS |
+ ", %d, %2d, %2" PRIuS ", %5.3f, %5.2f\n", |
+ f.frame_number, f.encoding_successful, f.decoding_successful, |
+ f.encode_return_code, f.decode_return_code, f.encode_time_in_us, |
+ f.decode_time_in_us, f.bit_rate_in_kbps, |
+ f.encoded_frame_length_in_bytes, f.frame_type, f.packets_dropped, |
+ f.total_packets, ssim.value, psnr.value); |
} |
} |
@@ -345,91 +375,85 @@ void PrintPythonOutput(const webrtc::test::TestConfig& config, |
const webrtc::test::Stats& stats, |
const webrtc::test::QualityMetricsResult& ssim_result, |
const webrtc::test::QualityMetricsResult& psnr_result) { |
- Log("\nPython output (recommended to run with --noverbose to skip the " |
- "above output)\n"); |
- printf("test_configuration = [" |
- "{'name': 'name', 'value': '%s'},\n" |
- "{'name': 'description', 'value': '%s'},\n" |
- "{'name': 'test_number', 'value': '%d'},\n" |
- "{'name': 'input_filename', 'value': '%s'},\n" |
- "{'name': 'output_filename', 'value': '%s'},\n" |
- "{'name': 'output_dir', 'value': '%s'},\n" |
- "{'name': 'packet_size_in_bytes', 'value': '%" PRIuS "'},\n" |
- "{'name': 'max_payload_size_in_bytes', 'value': '%" PRIuS "'},\n" |
- "{'name': 'packet_loss_mode', 'value': '%s'},\n" |
- "{'name': 'packet_loss_probability', 'value': '%f'},\n" |
- "{'name': 'packet_loss_burst_length', 'value': '%d'},\n" |
- "{'name': 'exclude_frame_types', 'value': '%s'},\n" |
- "{'name': 'frame_length_in_bytes', 'value': '%" PRIuS "'},\n" |
- "{'name': 'use_single_core', 'value': '%s'},\n" |
- "{'name': 'keyframe_interval;', 'value': '%d'},\n" |
- "{'name': 'video_codec_type', 'value': '%s'},\n" |
- "{'name': 'width', 'value': '%d'},\n" |
- "{'name': 'height', 'value': '%d'},\n" |
- "{'name': 'bit_rate_in_kbps', 'value': '%d'},\n" |
- "]\n", |
- config.name.c_str(), |
- config.description.c_str(), |
- config.test_number, |
- config.input_filename.c_str(), |
- config.output_filename.c_str(), |
- config.output_dir.c_str(), |
- config.networking_config.packet_size_in_bytes, |
- config.networking_config.max_payload_size_in_bytes, |
- PacketLossModeToStr(config.networking_config.packet_loss_mode), |
- config.networking_config.packet_loss_probability, |
- config.networking_config.packet_loss_burst_length, |
- ExcludeFrameTypesToStr(config.exclude_frame_types), |
- config.frame_length_in_bytes, |
- config.use_single_core ? "True " : "False", |
- config.keyframe_interval, |
- webrtc::test::VideoCodecTypeToStr(config.codec_settings->codecType), |
- config.codec_settings->width, |
- config.codec_settings->height, |
- config.codec_settings->startBitrate); |
- printf("frame_data_types = {" |
- "'frame_number': ('number', 'Frame number'),\n" |
- "'encoding_successful': ('boolean', 'Encoding successful?'),\n" |
- "'decoding_successful': ('boolean', 'Decoding successful?'),\n" |
- "'encode_time': ('number', 'Encode time (us)'),\n" |
- "'decode_time': ('number', 'Decode time (us)'),\n" |
- "'encode_return_code': ('number', 'Encode return code'),\n" |
- "'decode_return_code': ('number', 'Decode return code'),\n" |
- "'bit_rate': ('number', 'Bit rate (kbps)'),\n" |
- "'encoded_frame_length': " |
- "('number', 'Encoded frame length (bytes)'),\n" |
- "'frame_type': ('string', 'Frame type'),\n" |
- "'packets_dropped': ('number', 'Packets dropped'),\n" |
- "'total_packets': ('number', 'Total packets'),\n" |
- "'ssim': ('number', 'SSIM'),\n" |
- "'psnr': ('number', 'PSNR (dB)'),\n" |
- "}\n"); |
+ Log( |
+ "\nPython output (recommended to run with --noverbose to skip the " |
+ "above output)\n"); |
+ printf( |
+ "test_configuration = [" |
+ "{'name': 'name', 'value': '%s'},\n" |
+ "{'name': 'description', 'value': '%s'},\n" |
+ "{'name': 'test_number', 'value': '%d'},\n" |
+ "{'name': 'input_filename', 'value': '%s'},\n" |
+ "{'name': 'output_filename', 'value': '%s'},\n" |
+ "{'name': 'output_dir', 'value': '%s'},\n" |
+ "{'name': 'packet_size_in_bytes', 'value': '%" PRIuS |
+ "'},\n" |
+ "{'name': 'max_payload_size_in_bytes', 'value': '%" PRIuS |
+ "'},\n" |
+ "{'name': 'packet_loss_mode', 'value': '%s'},\n" |
+ "{'name': 'packet_loss_probability', 'value': '%f'},\n" |
+ "{'name': 'packet_loss_burst_length', 'value': '%d'},\n" |
+ "{'name': 'exclude_frame_types', 'value': '%s'},\n" |
+ "{'name': 'frame_length_in_bytes', 'value': '%" PRIuS |
+ "'},\n" |
+ "{'name': 'use_single_core', 'value': '%s'},\n" |
+ "{'name': 'keyframe_interval;', 'value': '%d'},\n" |
+ "{'name': 'video_codec_type', 'value': '%s'},\n" |
+ "{'name': 'width', 'value': '%d'},\n" |
+ "{'name': 'height', 'value': '%d'},\n" |
+ "{'name': 'bit_rate_in_kbps', 'value': '%d'},\n" |
+ "]\n", |
+ config.name.c_str(), config.description.c_str(), config.test_number, |
+ config.input_filename.c_str(), config.output_filename.c_str(), |
+ config.output_dir.c_str(), config.networking_config.packet_size_in_bytes, |
+ config.networking_config.max_payload_size_in_bytes, |
+ PacketLossModeToStr(config.networking_config.packet_loss_mode), |
+ config.networking_config.packet_loss_probability, |
+ config.networking_config.packet_loss_burst_length, |
+ ExcludeFrameTypesToStr(config.exclude_frame_types), |
+ config.frame_length_in_bytes, config.use_single_core ? "True " : "False", |
+ config.keyframe_interval, |
+ webrtc::test::VideoCodecTypeToStr(config.codec_settings->codecType), |
+ config.codec_settings->width, config.codec_settings->height, |
+ config.codec_settings->startBitrate); |
+ printf( |
+ "frame_data_types = {" |
+ "'frame_number': ('number', 'Frame number'),\n" |
+ "'encoding_successful': ('boolean', 'Encoding successful?'),\n" |
+ "'decoding_successful': ('boolean', 'Decoding successful?'),\n" |
+ "'encode_time': ('number', 'Encode time (us)'),\n" |
+ "'decode_time': ('number', 'Decode time (us)'),\n" |
+ "'encode_return_code': ('number', 'Encode return code'),\n" |
+ "'decode_return_code': ('number', 'Decode return code'),\n" |
+ "'bit_rate': ('number', 'Bit rate (kbps)'),\n" |
+ "'encoded_frame_length': " |
+ "('number', 'Encoded frame length (bytes)'),\n" |
+ "'frame_type': ('string', 'Frame type'),\n" |
+ "'packets_dropped': ('number', 'Packets dropped'),\n" |
+ "'total_packets': ('number', 'Total packets'),\n" |
+ "'ssim': ('number', 'SSIM'),\n" |
+ "'psnr': ('number', 'PSNR (dB)'),\n" |
+ "}\n"); |
printf("frame_data = ["); |
for (unsigned int i = 0; i < stats.stats_.size(); ++i) { |
const webrtc::test::FrameStatistic& f = stats.stats_[i]; |
const webrtc::test::FrameResult& ssim = ssim_result.frames[i]; |
const webrtc::test::FrameResult& psnr = psnr_result.frames[i]; |
- printf("{'frame_number': %d, " |
- "'encoding_successful': %s, 'decoding_successful': %s, " |
- "'encode_time': %d, 'decode_time': %d, " |
- "'encode_return_code': %d, 'decode_return_code': %d, " |
- "'bit_rate': %d, 'encoded_frame_length': %" PRIuS ", " |
- "'frame_type': %s, 'packets_dropped': %d, " |
- "'total_packets': %" PRIuS ", 'ssim': %f, 'psnr': %f},\n", |
- f.frame_number, |
- f.encoding_successful ? "True " : "False", |
- f.decoding_successful ? "True " : "False", |
- f.encode_time_in_us, |
- f.decode_time_in_us, |
- f.encode_return_code, |
- f.decode_return_code, |
- f.bit_rate_in_kbps, |
- f.encoded_frame_length_in_bytes, |
- f.frame_type == webrtc::kVideoFrameDelta ? "'Delta'" : "'Other'", |
- f.packets_dropped, |
- f.total_packets, |
- ssim.value, |
- psnr.value); |
+ printf( |
+ "{'frame_number': %d, " |
+ "'encoding_successful': %s, 'decoding_successful': %s, " |
+ "'encode_time': %d, 'decode_time': %d, " |
+ "'encode_return_code': %d, 'decode_return_code': %d, " |
+ "'bit_rate': %d, 'encoded_frame_length': %" PRIuS |
+ ", " |
+ "'frame_type': %s, 'packets_dropped': %d, " |
+ "'total_packets': %" PRIuS ", 'ssim': %f, 'psnr': %f},\n", |
+ f.frame_number, f.encoding_successful ? "True " : "False", |
+ f.decoding_successful ? "True " : "False", f.encode_time_in_us, |
+ f.decode_time_in_us, f.encode_return_code, f.decode_return_code, |
+ f.bit_rate_in_kbps, f.encoded_frame_length_in_bytes, |
+ f.frame_type == webrtc::kVideoFrameDelta ? "'Delta'" : "'Other'", |
+ f.packets_dropped, f.total_packets, ssim.value, psnr.value); |
} |
printf("]\n"); |
} |
@@ -438,10 +462,14 @@ void PrintPythonOutput(const webrtc::test::TestConfig& config, |
// The input file must be in YUV format. |
int main(int argc, char* argv[]) { |
std::string program_name = argv[0]; |
- std::string usage = "Quality test application for video comparisons.\n" |
- "Run " + program_name + " --helpshort for usage.\n" |
- "Example usage:\n" + program_name + |
- " --input_filename=filename.yuv --width=352 --height=288\n"; |
+ std::string usage = |
+ "Quality test application for video comparisons.\n" |
+ "Run " + |
+ program_name + |
+ " --helpshort for usage.\n" |
+ "Example usage:\n" + |
+ program_name + |
+ " --input_filename=filename.yuv --width=352 --height=288\n"; |
google::SetUsageMessage(usage); |
google::ParseCommandLineFlags(&argc, &argv, true); |
@@ -478,10 +506,8 @@ int main(int argc, char* argv[]) { |
packet_manipulator.InitializeRandomSeed(time(NULL)); |
} |
webrtc::test::VideoProcessor* processor = |
- new webrtc::test::VideoProcessorImpl(encoder, decoder, |
- &frame_reader, |
- &frame_writer, |
- &packet_manipulator, |
+ new webrtc::test::VideoProcessorImpl(encoder, decoder, &frame_reader, |
+ &frame_writer, &packet_manipulator, |
config, &stats); |
processor->Init(); |