// 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 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 String getName();
    method public java.util.List<media.codecs.Quirk> getQuirk_optional();
    method public String getRank();
    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 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 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 String getName();
    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;
  }

}

