summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-10-22 01:01:41 +0200
committerwm4 <wm4@nowhere>2013-10-22 01:01:41 +0200
commit33707c6d6394592f528fb200af2dd6e104fc6df6 (patch)
tree5f9aa685683d8dc952c4a2caf122a972414867fa /audio
parentbb5fe4d874e2eded092e47812aea0e52ce1fa6cb (diff)
downloadmpv-33707c6d6394592f528fb200af2dd6e104fc6df6.tar.bz2
mpv-33707c6d6394592f528fb200af2dd6e104fc6df6.tar.xz
audio/format: add some helper functions
Diffstat (limited to 'audio')
-rw-r--r--audio/format.c30
-rw-r--r--audio/format.h3
2 files changed, 33 insertions, 0 deletions
diff --git a/audio/format.c b/audio/format.c
index aa6099022f..c6c617cf28 100644
--- a/audio/format.c
+++ b/audio/format.c
@@ -42,6 +42,27 @@ int af_fmt2bits(int format)
return 0;
}
+static int bits_to_mask(int bits)
+{
+ switch (bits) {
+ case 8: return AF_FORMAT_8BIT;
+ case 16: return AF_FORMAT_16BIT;
+ case 24: return AF_FORMAT_24BIT;
+ case 32: return AF_FORMAT_32BIT;
+ case 64: return AF_FORMAT_64BIT;
+ }
+ return 0;
+}
+
+int af_fmt_change_bits(int format, int bits)
+{
+ if (!af_fmt_is_valid(format) || (format & AF_FORMAT_SPECIAL_MASK))
+ return 0;
+ int mask = bits_to_mask(bits);
+ format = (format & ~AF_FORMAT_BITS_MASK) | mask;
+ return af_fmt_is_valid(format) ? format : 0;
+}
+
/* Convert format to str input str is a buffer for the
converted string, size is the size of the buffer */
char* af_fmt2str(int format, char* str, int size)
@@ -90,6 +111,15 @@ const struct af_fmt_entry af_fmtstr_table[] = {
{0}
};
+bool af_fmt_is_valid(int format)
+{
+ for (int i = 0; af_fmtstr_table[i].name; i++) {
+ if (af_fmtstr_table[i].format == format)
+ return true;
+ }
+ return false;
+}
+
const char *af_fmt2str_short(int format)
{
int i;
diff --git a/audio/format.h b/audio/format.h
index e4173550c6..66eec17cd8 100644
--- a/audio/format.h
+++ b/audio/format.h
@@ -131,6 +131,7 @@ extern const struct af_fmt_entry af_fmtstr_table[];
int af_str2fmt_short(bstr str);
int af_fmt2bits(int format);
+int af_fmt_change_bits(int format, int bits);
// Amount of bytes that contain audio of the given duration, aligned to frames.
int af_fmt_seconds_to_bytes(int format, float seconds, int channels, int samplerate);
@@ -138,4 +139,6 @@ int af_fmt_seconds_to_bytes(int format, float seconds, int channels, int sampler
char* af_fmt2str(int format, char* str, int size);
const char* af_fmt2str_short(int format);
+bool af_fmt_is_valid(int format);
+
#endif /* MPLAYER_AF_FORMAT_H */