// Signature format: 2.0
package media.profiles {

  public class Audio {
    ctor public Audio();
    method public int getBitRate();
    method public int getChannels();
    method public String getCodec();
    method public int getSampleRate();
    method public void setBitRate(int);
    method public void setChannels(int);
    method public void setCodec(String);
    method public void setSampleRate(int);
  }

  public class AudioDecoderCap {
    ctor public AudioDecoderCap();
    method public boolean getEnabled();
    method public String getName();
    method public void setEnabled(boolean);
    method public void setName(String);
  }

  public class AudioEncoderCap {
    ctor public AudioEncoderCap();
    method public boolean getEnabled();
    method public int getMaxBitRate();
    method public int getMaxChannels();
    method public int getMaxSampleRate();
    method public int getMinBitRate();
    method public int getMinChannels();
    method public int getMinSampleRate();
    method public String getName();
    method public void setEnabled(boolean);
    method public void setMaxBitRate(int);
    method public void setMaxChannels(int);
    method public void setMaxSampleRate(int);
    method public void setMinBitRate(int);
    method public void setMinChannels(int);
    method public void setMinSampleRate(int);
    method public void setName(String);
  }

  public class CamcorderProfiles {
    ctor public CamcorderProfiles();
    method public int getCameraId();
    method public java.util.List<media.profiles.EncoderProfile> getEncoderProfile();
    method public java.util.List<media.profiles.CamcorderProfiles.ImageEncoding> getImageEncoding();
    method public void setCameraId(int);
  }

  public static class CamcorderProfiles.ImageEncoding {
    ctor public CamcorderProfiles.ImageEncoding();
    method public int getQuality();
    method public void setQuality(int);
  }

  public class EncoderProfile {
    ctor public EncoderProfile();
    method public java.util.List<media.profiles.Audio> getAudio();
    method public int getDuration();
    method public String getFileFormat();
    method public String getQuality();
    method public java.util.List<media.profiles.Video> getVideo();
    method public void setDuration(int);
    method public void setFileFormat(String);
    method public void setQuality(String);
  }

  public class MediaSettings {
    ctor public MediaSettings();
    method public java.util.List<media.profiles.AudioDecoderCap> getAudioDecoderCap();
    method public java.util.List<media.profiles.AudioEncoderCap> getAudioEncoderCap();
    method public java.util.List<media.profiles.CamcorderProfiles> getCamcorderProfiles();
    method public java.util.List<media.profiles.MediaSettings.EncoderOutputFileFormat> getEncoderOutputFileFormat();
    method public java.util.List<media.profiles.VideoDecoderCap> getVideoDecoderCap();
    method public java.util.List<media.profiles.VideoEncoderCap> getVideoEncoderCap();
  }

  public static class MediaSettings.EncoderOutputFileFormat {
    ctor public MediaSettings.EncoderOutputFileFormat();
    method public String getName();
    method public void setName(String);
  }

  public class Video {
    ctor public Video();
    method public int getBitRate();
    method public String getCodec();
    method public int getFrameRate();
    method public int getHeight();
    method public int getWidth();
    method public void setBitRate(int);
    method public void setCodec(String);
    method public void setFrameRate(int);
    method public void setHeight(int);
    method public void setWidth(int);
  }

  public class VideoDecoderCap {
    ctor public VideoDecoderCap();
    method public boolean getEnabled();
    method public String getName();
    method public void setEnabled(boolean);
    method public void setName(String);
  }

  public class VideoEncoderCap {
    ctor public VideoEncoderCap();
    method public boolean getEnabled();
    method public int getMaxBitRate();
    method public int getMaxFrameHeight();
    method public int getMaxFrameRate();
    method public int getMaxFrameWidth();
    method public int getMinBitRate();
    method public int getMinFrameHeight();
    method public int getMinFrameRate();
    method public int getMinFrameWidth();
    method public String getName();
    method public void setEnabled(boolean);
    method public void setMaxBitRate(int);
    method public void setMaxFrameHeight(int);
    method public void setMaxFrameRate(int);
    method public void setMaxFrameWidth(int);
    method public void setMinBitRate(int);
    method public void setMinFrameHeight(int);
    method public void setMinFrameRate(int);
    method public void setMinFrameWidth(int);
    method public void setName(String);
  }

  public class XmlParser {
    ctor public XmlParser();
    method public static media.profiles.MediaSettings read(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;
  }

}

