Home | History | Annotate | Download | only in test
      1 /*
      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 
     11 #include "webrtc/modules/audio_coding/neteq/audio_classifier.h"
     12 
     13 #include <math.h>
     14 #include <stdio.h>
     15 #include <stdlib.h>
     16 #include <string.h>
     17 
     18 #include <string>
     19 #include <iostream>
     20 
     21 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     22 
     23 int main(int argc, char* argv[]) {
     24   if (argc != 5) {
     25     std::cout << "Usage: " << argv[0] <<
     26         " channels output_type <input file name> <output file name> "
     27         << std::endl << std::endl;
     28     std::cout << "Where channels can be 1 (mono) or 2 (interleaved stereo),";
     29     std::cout << " outputs can be 1 (classification (boolean)) or 2";
     30     std::cout << " (classification and music probability (float)),"
     31         << std::endl;
     32     std::cout << "and the sampling frequency is assumed to be 48 kHz."
     33         << std::endl;
     34     return -1;
     35   }
     36 
     37   const int kFrameSizeSamples = 960;
     38   int channels = atoi(argv[1]);
     39   if (channels < 1 || channels > 2) {
     40     std::cout << "Disallowed number of channels  " << channels << std::endl;
     41     return -1;
     42   }
     43 
     44   int outputs = atoi(argv[2]);
     45   if (outputs < 1 || outputs > 2) {
     46     std::cout << "Disallowed number of outputs  " << outputs << std::endl;
     47     return -1;
     48   }
     49 
     50   const int data_size = channels * kFrameSizeSamples;
     51   webrtc::scoped_ptr<int16_t[]> in(new int16_t[data_size]);
     52 
     53   std::string input_filename = argv[3];
     54   std::string output_filename = argv[4];
     55 
     56   std::cout << "Input file: " << input_filename << std::endl;
     57   std::cout << "Output file: " << output_filename << std::endl;
     58 
     59   FILE* in_file = fopen(input_filename.c_str(), "rb");
     60   if (!in_file) {
     61     std::cout << "Cannot open input file " << input_filename << std::endl;
     62     return -1;
     63   }
     64 
     65   FILE* out_file = fopen(output_filename.c_str(), "wb");
     66   if (!out_file) {
     67     std::cout << "Cannot open output file " << output_filename << std::endl;
     68     return -1;
     69   }
     70 
     71   webrtc::AudioClassifier classifier;
     72   int frame_counter = 0;
     73   int music_counter = 0;
     74   while (fread(in.get(), sizeof(*in.get()),
     75                data_size, in_file) == (size_t) data_size) {
     76     bool is_music = classifier.Analysis(in.get(), data_size, channels);
     77     if (!fwrite(&is_music, sizeof(is_music), 1, out_file)) {
     78        std::cout << "Error writing." << std::endl;
     79        return -1;
     80     }
     81     if (is_music) {
     82       music_counter++;
     83     }
     84     std::cout << "frame " << frame_counter << " decision " << is_music;
     85     if (outputs == 2) {
     86       float music_prob = classifier.music_probability();
     87       if (!fwrite(&music_prob, sizeof(music_prob), 1, out_file)) {
     88         std::cout << "Error writing." << std::endl;
     89         return -1;
     90       }
     91       std::cout << " music prob " << music_prob;
     92     }
     93     std::cout << std::endl;
     94     frame_counter++;
     95   }
     96   std::cout << frame_counter << " frames processed." << std::endl;
     97   if (frame_counter > 0) {
     98     float music_percentage = music_counter / static_cast<float>(frame_counter);
     99     std::cout <<  music_percentage <<  " percent music." << std::endl;
    100   }
    101 
    102   fclose(in_file);
    103   fclose(out_file);
    104   return 0;
    105 }
    106