// Signature format: 2.0
package media.codecs {

  public class Alias {
    ctor public Alias();
    method public String getName();
    method public void setName(String);
  }

  public class Decoders {
    ctor public Decoders();
    method public java.util.List<media.codecs.MediaCodec> getMediaCodec();
  }

  public class Encoders {
    ctor public Encoders();
    method public java.util.List<media.codecs.MediaCodec> getMediaCodec();
  }

  public class Feature {
    ctor public Feature();
    method public String getName();
    method public String getOptional();
    method public String getRequired();
    method public String getValue();
    method public void setName(String);
    method public void setOptional(String);
    method public void setRequired(String);
    method public void setValue(String);
  }

  public class Include {
    ctor public Include();
    method public String getHref();
    method public void setHref(String);
  }

  public class Included {
    ctor public Included();
    method public java.util.List<media.codecs.Decoders> getDecoders_optional();
    method public java.util.List<media.codecs.Encoders> getEncoders_optional();
    method public java.util.List<media.codecs.Include> getInclude_optional();
    method public java.util.List<media.codecs.Settings> getSettings_optional();
  }

  public class Limit {
    ctor public Limit();
    method public String getIn();
    method public String getMax();
    method public String getMin();
    method public String getName();
    method public String getRange();
    method public String getRanges();
    method public String getScale();
    method public String getValue();
    method public String get_default();
    method public void setIn(String);
    method public void setMax(String);
    method public void setMin(String);
    method public void setName(String);
    method public void setRange(String);
    method public void setRanges(String);
    method public void setScale(String);
    method public void setValue(String);
    method public void set_default(String);
  }

  public class Mapping {
    ctor public Mapping();
    method public String getKind();
    method public String getName();
    method public String getValue();
    method public void setKind(String);
    method public void setName(String);
    method public void setValue(String);
  }

  public class MediaCodec {
    ctor public MediaCodec();
    method public java.util.List<media.codecs.Alias> getAlias_optional();
    method public java.util.List<media.codecs.Quirk> getAttribute_optional();
    method public String getDomain();
    method public String getEnabled();
    method public java.util.List<media.codecs.Feature> getFeature_optional();
    method public java.util.List<media.codecs.Limit> getLimit_optional();
    method public java.util.List<media.codecs.Mapping> getMapping_optional();
    method public String getMinsdk();
    method public String getName();
    method public java.util.List<media.codecs.Quirk> getQuirk_optional();
    method public String getRank();
    method public java.util.List<media.codecs.Tuning> getTuning_optional();
    method public String getType();
    method public java.util.List<media.codecs.Type> getType_optional();
    method public String getUpdate();
    method public String getVariant();
    method public java.util.List<media.codecs.Variant> getVariant_optional();
    method public void setDomain(String);
    method public void setEnabled(String);
    method public void setMinsdk(String);
    method public void setName(String);
    method public void setRank(String);
    method public void setType(String);
    method public void setUpdate(String);
    method public void setVariant(String);
  }

  public class MediaCodecs {
    ctor public MediaCodecs();
    method public java.util.List<media.codecs.Decoders> getDecoders_optional();
    method public java.util.List<media.codecs.Encoders> getEncoders_optional();
    method public java.util.List<media.codecs.Include> getInclude_optional();
    method public java.util.List<media.codecs.Settings> getSettings_optional();
  }

  public class Quirk {
    ctor public Quirk();
    method public String getName();
    method public String getValue();
    method public void setName(String);
    method public void setValue(String);
  }

  public class Setting {
    ctor public Setting();
    method public String getEnabled();
    method public String getName();
    method public String getUpdate();
    method public String getValue();
    method public void setEnabled(String);
    method public void setName(String);
    method public void setUpdate(String);
    method public void setValue(String);
  }

  public class Settings {
    ctor public Settings();
    method public java.util.List<media.codecs.Setting> getDomain_optional();
    method public java.util.List<media.codecs.Setting> getSetting_optional();
    method public java.util.List<media.codecs.Setting> getVariant_optional();
  }

  public class Tuning {
    ctor public Tuning();
    method public String getName();
    method public String getValue();
    method public void setName(String);
    method public void setValue(String);
  }

  public class Type {
    ctor public Type();
    method public java.util.List<media.codecs.Alias> getAlias();
    method public java.util.List<media.codecs.Feature> getFeature();
    method public java.util.List<media.codecs.Limit> getLimit();
    method public String getName();
    method public String getUpdate();
    method public void setName(String);
    method public void setUpdate(String);
  }

  public class Variant {
    ctor public Variant();
    method public java.util.List<media.codecs.Alias> getAlias_optional();
    method public java.util.List<media.codecs.Quirk> getAttribute_optional();
    method public java.util.List<media.codecs.Feature> getFeature_optional();
    method public java.util.List<media.codecs.Limit> getLimit_optional();
    method public String getName();
    method public java.util.List<media.codecs.Quirk> getQuirk_optional();
    method public void setName(String);
  }

  public class XmlParser {
    ctor public XmlParser();
    method public static media.codecs.Included readIncluded(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static media.codecs.MediaCodecs readMediaCodecs(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
  }

}

