Commit e45a92dc authored by Nicolas George's avatar Nicolas George

audioconvert: implement av_bprint_channel_layout().

And reimplement av_get_channel_layout_string() on top of it.
parent 7a2b4291
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "avstring.h" #include "avstring.h"
#include "avutil.h" #include "avutil.h"
#include "audioconvert.h" #include "audioconvert.h"
#include "bprint.h"
static const char * const channel_names[] = { static const char * const channel_names[] = {
[0] = "FL", /* front left */ [0] = "FL", /* front left */
...@@ -136,8 +137,8 @@ uint64_t av_get_channel_layout(const char *name) ...@@ -136,8 +137,8 @@ uint64_t av_get_channel_layout(const char *name)
return layout; return layout;
} }
void av_get_channel_layout_string(char *buf, int buf_size, void av_bprint_channel_layout(struct AVBPrint *bp,
int nb_channels, uint64_t channel_layout) int nb_channels, uint64_t channel_layout)
{ {
int i; int i;
...@@ -147,29 +148,38 @@ void av_get_channel_layout_string(char *buf, int buf_size, ...@@ -147,29 +148,38 @@ void av_get_channel_layout_string(char *buf, int buf_size,
for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++) for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++)
if (nb_channels == channel_layout_map[i].nb_channels && if (nb_channels == channel_layout_map[i].nb_channels &&
channel_layout == channel_layout_map[i].layout) { channel_layout == channel_layout_map[i].layout) {
av_strlcpy(buf, channel_layout_map[i].name, buf_size); av_bprintf(bp, "%s", channel_layout_map[i].name);
return; return;
} }
snprintf(buf, buf_size, "%d channels", nb_channels); av_bprintf(bp, "%d channels", nb_channels);
if (channel_layout) { if (channel_layout) {
int i, ch; int i, ch;
av_strlcat(buf, " (", buf_size); av_bprintf(bp, " (");
for (i = 0, ch = 0; i < 64; i++) { for (i = 0, ch = 0; i < 64; i++) {
if ((channel_layout & (UINT64_C(1) << i))) { if ((channel_layout & (UINT64_C(1) << i))) {
const char *name = get_channel_name(i); const char *name = get_channel_name(i);
if (name) { if (name) {
if (ch > 0) if (ch > 0)
av_strlcat(buf, "+", buf_size); av_bprintf(bp, "+");
av_strlcat(buf, name, buf_size); av_bprintf(bp, "%s", name);
} }
ch++; ch++;
} }
} }
av_strlcat(buf, ")", buf_size); av_bprintf(bp, ")");
} }
} }
void av_get_channel_layout_string(char *buf, int buf_size,
int nb_channels, uint64_t channel_layout)
{
AVBPrint bp;
av_bprint_init_for_buffer(&bp, buf, buf_size);
av_bprint_channel_layout(&bp, nb_channels, channel_layout);
}
int av_get_channel_layout_nb_channels(uint64_t channel_layout) int av_get_channel_layout_nb_channels(uint64_t channel_layout)
{ {
int count; int count;
......
...@@ -133,6 +133,12 @@ uint64_t av_get_channel_layout(const char *name); ...@@ -133,6 +133,12 @@ uint64_t av_get_channel_layout(const char *name);
*/ */
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout); void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout);
struct AVBPrint;
/**
* Append a description of a channel layout to a bprint buffer.
*/
void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout);
/** /**
* Return the number of channels in the channel layout. * Return the number of channels in the channel layout.
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment