// instrument by jscoverage, do not modifly this file
(function () {
  var BASE;
  if (typeof global === 'object') {
    BASE = global;
  } else if (typeof window === 'object') {
    BASE = window;
  } else {
    throw new Error('[jscoverage] unknow ENV!');
  }
  if (!BASE._$jscoverage) {
    BASE._$jscoverage = {};
    BASE._$jscoverage_cond = {};
    BASE._$jscoverage_done = function (file, line, express) {
      if (arguments.length === 2) {
        BASE._$jscoverage[file][line] ++;
      } else {
        BASE._$jscoverage_cond[file][line] ++;
        return express;
      }
    };
    BASE._$jscoverage_init = function (base, file, lines) {
      var tmp = [];
      for (var i = 0; i < lines.length; i ++) {
        tmp[lines[i]] = 0;
      }
      base[file] = tmp;
    };
  }
})();
_$jscoverage_init(_$jscoverage, "lib/fluent-ffmpeg.js",[4,5,6,8,9,32,33,36,38,40,43,44,48,49,50,54,55,58,59,60,64,65,68,71,78,79,110,111,112,115,116,119,120,127,129,130,133,139,140,143,144,145,148,152,153,156,162,163,164,165,166,167,168,173,178,180,182,185,187,190,192,198,200,201,206]);
_$jscoverage_init(_$jscoverage_cond, "lib/fluent-ffmpeg.js",[32,38,38,49,127,143]);
_$jscoverage["lib/fluent-ffmpeg.js"].source = ["/*jshint node:true*/","'use strict';","","var path = require('path');","var util = require('util');","var EventEmitter = require('events').EventEmitter;","","var utils = require('./utils');","var ARGLISTS = ['_global', '_audio', '_audioFilters', '_video', '_videoFilters', '_sizeFilters', '_complexFilters'];","","","/**"," * Create an ffmpeg command"," *"," * Can be called with or without the 'new' operator, and the 'input' parameter"," * may be specified as 'options.source' instead (or passed later with the"," * addInput method)."," *"," * @constructor"," * @param {String|ReadableStream} [input] input file path or readable stream"," * @param {Object} [options] command options"," * @param {Object} [options.logger=<no logging>] logger object with 'error', 'warning', 'info' and 'debug' methods"," * @param {Number} [options.niceness=0] ffmpeg process niceness, ignored on Windows"," * @param {Number} [options.priority=0] alias for `niceness`"," * @param {String} [options.presets=\"fluent-ffmpeg/lib/presets\"] directory to load presets from"," * @param {String} [options.preset=\"fluent-ffmpeg/lib/presets\"] alias for `presets`"," * @param {Number} [options.timeout=<no timeout>] ffmpeg processing timeout in seconds"," * @param {String|ReadableStream} [options.source=<no input>] alias for the `input` parameter"," */","function FfmpegCommand(input, options) {","  // Make 'new' optional","  if (!(this instanceof FfmpegCommand)) {","    return new FfmpegCommand(input, options);","  }","","  EventEmitter.call(this);","","  if (typeof input === 'object' && !('readable' in input)) {","    // Options object passed directly","    options = input;","  } else {","    // Input passed first","    options = options || {};","    options.source = input;","  }","","  // Add input if present","  this._inputs = [];","  if (options.source) {","    this.input(options.source);","  }","","  // Add target-less output for backwards compatibility","  this._outputs = [];","  this.output();","","  // Create argument lists","  var self = this;","  ['_global', '_complexFilters'].forEach(function(prop) {","    self[prop] = utils.args();","  });","","  // Set default option values","  options.presets = options.presets || options.preset || path.join(__dirname, 'presets');","  options.niceness = options.niceness || options.priority || 0;","","  // Save options","  this.options = options;","","  // Setup logger","  this.logger = options.logger || {","    debug: function() {},","    info: function() {},","    warn: function() {},","    error: function() {}","  };","}","util.inherits(FfmpegCommand, EventEmitter);","module.exports = FfmpegCommand;","","","/**"," * Clone an ffmpeg command"," *"," * This method is useful when you want to process the same input multiple times."," * It returns a new FfmpegCommand instance with the exact same options."," *"," * All options set _after_ the clone() call will only be applied to the instance"," * it has been called on."," *"," * @example"," *   var command = ffmpeg('/path/to/source.avi')"," *     .audioCodec('libfaac')"," *     .videoCodec('libx264')"," *     .format('mp4');"," *"," *   command.clone()"," *     .size('320x200')"," *     .save('/path/to/output-small.mp4');"," *"," *   command.clone()"," *     .size('640x400')"," *     .save('/path/to/output-medium.mp4');"," *"," *   command.save('/path/to/output-original-size.mp4');"," *"," * @method FfmpegCommand#clone"," * @return FfmpegCommand"," */","FfmpegCommand.prototype.clone = function() {","  var clone = new FfmpegCommand();","  var self = this;","","  // Clone options and logger","  clone.options = this.options;","  clone.logger = this.logger;","","  // Clone inputs","  clone._inputs = this._inputs.map(function(input) {","    return {","      source: input.source,","      options: input.options.clone()","    };","  });","","  // Create first output","  if ('target' in this._outputs[0]) {","    // We have outputs set, don't clone them and create first output","    clone._outputs = [];","    clone.output();","  } else {","    // No outputs set, clone first output options","    clone._outputs = [","      clone._currentOutput = {","        flags: {}","      }","    ];","","    ['audio', 'audioFilters', 'video', 'videoFilters', 'sizeFilters', 'options'].forEach(function(key) {","      clone._currentOutput[key] = self._currentOutput[key].clone();","    });","","    if (this._currentOutput.sizeData) {","      clone._currentOutput.sizeData = {};","      utils.copy(this._currentOutput.sizeData, clone._currentOutput.sizeData);","    }","","    utils.copy(this._currentOutput.flags, clone._currentOutput.flags);","  }","","  // Clone argument lists","  ['_global', '_complexFilters'].forEach(function(prop) {","    clone[prop] = self[prop].clone();","  });","","  return clone;","};","","","/* Add methods from options submodules */","","require('./options/inputs')(FfmpegCommand.prototype);","require('./options/audio')(FfmpegCommand.prototype);","require('./options/video')(FfmpegCommand.prototype);","require('./options/videosize')(FfmpegCommand.prototype);","require('./options/output')(FfmpegCommand.prototype);","require('./options/custom')(FfmpegCommand.prototype);","require('./options/misc')(FfmpegCommand.prototype);","","","/* Add processor methods */","","require('./processor')(FfmpegCommand.prototype);","","","/* Add capabilities methods */","","require('./capabilities')(FfmpegCommand.prototype);","","FfmpegCommand.availableFilters =","FfmpegCommand.getAvailableFilters = function(callback) {","  (new FfmpegCommand()).availableFilters(callback);","};","","FfmpegCommand.availableCodecs =","FfmpegCommand.getAvailableCodecs = function(callback) {","  (new FfmpegCommand()).availableCodecs(callback);","};","","FfmpegCommand.availableFormats =","FfmpegCommand.getAvailableFormats = function(callback) {","  (new FfmpegCommand()).availableFormats(callback);","};","","","/* Add ffprobe methods */","","require('./ffprobe')(FfmpegCommand.prototype);","","FfmpegCommand.ffprobe = function(file, callback) {","  (new FfmpegCommand(file)).ffprobe(callback);","};","","/* Add processing recipes */","","require('./recipes')(FfmpegCommand.prototype);",""];
"use strict";

_$jscoverage_done("lib/fluent-ffmpeg.js", 4);
var path = require("path");

_$jscoverage_done("lib/fluent-ffmpeg.js", 5);
var util = require("util");

_$jscoverage_done("lib/fluent-ffmpeg.js", 6);
var EventEmitter = require("events").EventEmitter;

_$jscoverage_done("lib/fluent-ffmpeg.js", 8);
var utils = require("./utils");

_$jscoverage_done("lib/fluent-ffmpeg.js", 9);
var ARGLISTS = [ "_global", "_audio", "_audioFilters", "_video", "_videoFilters", "_sizeFilters", "_complexFilters" ];

function FfmpegCommand(input, options) {
    _$jscoverage_done("lib/fluent-ffmpeg.js", 32);
    if (_$jscoverage_done("lib/fluent-ffmpeg.js", 32, !(this instanceof FfmpegCommand))) {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 33);
        return new FfmpegCommand(input, options);
    }
    _$jscoverage_done("lib/fluent-ffmpeg.js", 36);
    EventEmitter.call(this);
    _$jscoverage_done("lib/fluent-ffmpeg.js", 38);
    if (_$jscoverage_done("lib/fluent-ffmpeg.js", 38, typeof input === "object") && _$jscoverage_done("lib/fluent-ffmpeg.js", 38, !("readable" in input))) {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 40);
        options = input;
    } else {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 43);
        options = options || {};
        _$jscoverage_done("lib/fluent-ffmpeg.js", 44);
        options.source = input;
    }
    _$jscoverage_done("lib/fluent-ffmpeg.js", 48);
    this._inputs = [];
    _$jscoverage_done("lib/fluent-ffmpeg.js", 49);
    if (_$jscoverage_done("lib/fluent-ffmpeg.js", 49, options.source)) {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 50);
        this.input(options.source);
    }
    _$jscoverage_done("lib/fluent-ffmpeg.js", 54);
    this._outputs = [];
    _$jscoverage_done("lib/fluent-ffmpeg.js", 55);
    this.output();
    _$jscoverage_done("lib/fluent-ffmpeg.js", 58);
    var self = this;
    _$jscoverage_done("lib/fluent-ffmpeg.js", 59);
    [ "_global", "_complexFilters" ].forEach(function(prop) {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 60);
        self[prop] = utils.args();
    });
    _$jscoverage_done("lib/fluent-ffmpeg.js", 64);
    options.presets = options.presets || options.preset || path.join(__dirname, "presets");
    _$jscoverage_done("lib/fluent-ffmpeg.js", 65);
    options.niceness = options.niceness || options.priority || 0;
    _$jscoverage_done("lib/fluent-ffmpeg.js", 68);
    this.options = options;
    _$jscoverage_done("lib/fluent-ffmpeg.js", 71);
    this.logger = options.logger || {
        debug: function() {},
        info: function() {},
        warn: function() {},
        error: function() {}
    };
}

_$jscoverage_done("lib/fluent-ffmpeg.js", 78);
util.inherits(FfmpegCommand, EventEmitter);

_$jscoverage_done("lib/fluent-ffmpeg.js", 79);
module.exports = FfmpegCommand;

_$jscoverage_done("lib/fluent-ffmpeg.js", 110);
FfmpegCommand.prototype.clone = function() {
    _$jscoverage_done("lib/fluent-ffmpeg.js", 111);
    var clone = new FfmpegCommand;
    _$jscoverage_done("lib/fluent-ffmpeg.js", 112);
    var self = this;
    _$jscoverage_done("lib/fluent-ffmpeg.js", 115);
    clone.options = this.options;
    _$jscoverage_done("lib/fluent-ffmpeg.js", 116);
    clone.logger = this.logger;
    _$jscoverage_done("lib/fluent-ffmpeg.js", 119);
    clone._inputs = this._inputs.map(function(input) {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 120);
        return {
            source: input.source,
            options: input.options.clone()
        };
    });
    _$jscoverage_done("lib/fluent-ffmpeg.js", 127);
    if (_$jscoverage_done("lib/fluent-ffmpeg.js", 127, "target" in this._outputs[0])) {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 129);
        clone._outputs = [];
        _$jscoverage_done("lib/fluent-ffmpeg.js", 130);
        clone.output();
    } else {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 133);
        clone._outputs = [ clone._currentOutput = {
            flags: {}
        } ];
        _$jscoverage_done("lib/fluent-ffmpeg.js", 139);
        [ "audio", "audioFilters", "video", "videoFilters", "sizeFilters", "options" ].forEach(function(key) {
            _$jscoverage_done("lib/fluent-ffmpeg.js", 140);
            clone._currentOutput[key] = self._currentOutput[key].clone();
        });
        _$jscoverage_done("lib/fluent-ffmpeg.js", 143);
        if (_$jscoverage_done("lib/fluent-ffmpeg.js", 143, this._currentOutput.sizeData)) {
            _$jscoverage_done("lib/fluent-ffmpeg.js", 144);
            clone._currentOutput.sizeData = {};
            _$jscoverage_done("lib/fluent-ffmpeg.js", 145);
            utils.copy(this._currentOutput.sizeData, clone._currentOutput.sizeData);
        }
        _$jscoverage_done("lib/fluent-ffmpeg.js", 148);
        utils.copy(this._currentOutput.flags, clone._currentOutput.flags);
    }
    _$jscoverage_done("lib/fluent-ffmpeg.js", 152);
    [ "_global", "_complexFilters" ].forEach(function(prop) {
        _$jscoverage_done("lib/fluent-ffmpeg.js", 153);
        clone[prop] = self[prop].clone();
    });
    _$jscoverage_done("lib/fluent-ffmpeg.js", 156);
    return clone;
};

_$jscoverage_done("lib/fluent-ffmpeg.js", 162);
require("./options/inputs")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 163);
require("./options/audio")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 164);
require("./options/video")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 165);
require("./options/videosize")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 166);
require("./options/output")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 167);
require("./options/custom")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 168);
require("./options/misc")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 173);
require("./processor")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 178);
require("./capabilities")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 180);
FfmpegCommand.availableFilters = FfmpegCommand.getAvailableFilters = function(callback) {
    _$jscoverage_done("lib/fluent-ffmpeg.js", 182);
    (new FfmpegCommand).availableFilters(callback);
};

_$jscoverage_done("lib/fluent-ffmpeg.js", 185);
FfmpegCommand.availableCodecs = FfmpegCommand.getAvailableCodecs = function(callback) {
    _$jscoverage_done("lib/fluent-ffmpeg.js", 187);
    (new FfmpegCommand).availableCodecs(callback);
};

_$jscoverage_done("lib/fluent-ffmpeg.js", 190);
FfmpegCommand.availableFormats = FfmpegCommand.getAvailableFormats = function(callback) {
    _$jscoverage_done("lib/fluent-ffmpeg.js", 192);
    (new FfmpegCommand).availableFormats(callback);
};

_$jscoverage_done("lib/fluent-ffmpeg.js", 198);
require("./ffprobe")(FfmpegCommand.prototype);

_$jscoverage_done("lib/fluent-ffmpeg.js", 200);
FfmpegCommand.ffprobe = function(file, callback) {
    _$jscoverage_done("lib/fluent-ffmpeg.js", 201);
    (new FfmpegCommand(file)).ffprobe(callback);
};

_$jscoverage_done("lib/fluent-ffmpeg.js", 206);
require("./recipes")(FfmpegCommand.prototype);