/*
 *  Copyright (c) 2010 The VP8 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.
 */


#if 0

#include <map>
#include <string>
#include <fstream>
extern "C"
{
    #include "onyx.h"
}


using namespace std;

typedef map<string,int> Parms;

#define ALLPARMS(O,DOTHIS) \
    DOTHIS(O,  interquantizer             )\
    DOTHIS(O,  auto_gold                   )\
    DOTHIS(O,  auto_adjust_gold_quantizer    )\
    DOTHIS(O,  goldquantizer              )\
    DOTHIS(O,  goldfreq                   )\
    DOTHIS(O,  auto_key                    )\
    DOTHIS(O,  auto_adjust_key_quantizer     )\
    DOTHIS(O,  keyquantizer               )\
    DOTHIS(O,  keyfreq                    )\
    DOTHIS(O,  pass                       )\
    DOTHIS(O,  fixed_q                     )\
    DOTHIS(O,  target_bandwidth            )\
    DOTHIS(O,  auto_worst_q                 )\
    DOTHIS(O,  worst_quality               )\
    DOTHIS(O,  best_allowed_q               )\
    DOTHIS(O,  end_usage                   )\
    DOTHIS(O,  starting_buffer_level        )\
    DOTHIS(O,  optimal_buffer_level         )\
    DOTHIS(O,  maximum_buffer_size          )\
    DOTHIS(O,  under_shoot_pct              )\
    DOTHIS(O,  allow_df                    )\
    DOTHIS(O,  drop_frames_water_mark        )\
    DOTHIS(O,  max_allowed_datarate         )\
    DOTHIS(O,  two_pass_vbrbias             )\
    DOTHIS(O,  two_pass_vbrmin_section       )\
    DOTHIS(O,  two_pass_vbrmax_section       )\
    DOTHIS(O,  filter_type                 )\
    DOTHIS(O,  compressor_speed            )\
    DOTHIS(O,  mbpitch_feature             )\
    DOTHIS(O,  allow_spatial_resampling     )\
    DOTHIS(O,  resample_down_water_mark      )\
    DOTHIS(O,  resample_up_water_mark        )\
    DOTHIS(O,  noise_sensitivity           )\
    DOTHIS(O,  horiz_scale                 )\
    DOTHIS(O,  vert_scale                  )


#define GET(O,V) O->V = x[#V];
#define PUT(O,V) x[#V] = O->V;


extern "C" void get_parms(VP8_CONFIG *ocf,char *filename)
{

    Parms x;
    int value;
    string variable;
    string equal;

    ifstream config_file(filename);

    ALLPARMS(ocf, PUT);

    // store all the parms in a map (really simple parsing)
    while(!config_file.eof() && config_file.is_open())
    {
        config_file >> variable;
        config_file >> equal;

        if(equal != "=")
            continue;

        config_file >> value;

        x[variable] = value;
    }

    ALLPARMS(ocf, GET);

}

#define PRINT(O,V) debug_file<<#V <<" = " << O->V <<"\n";
extern "C" void print_parms(VP8_CONFIG *ocf,char *filename)
{
    ofstream debug_file(filename,ios_base::app);
    ALLPARMS(ocf, PRINT);
    debug_file << "=============================================="<<"\n";
}

#endif
