aboutsummaryrefslogtreecommitdiffhomepage
path: root/audio
diff options
context:
space:
mode:
authorGravatar wm4 <wm4@nowhere>2015-09-10 23:38:42 +0200
committerGravatar wm4 <wm4@nowhere>2015-09-10 23:38:42 +0200
commite721660e6dd9b8785896dfd81519baa22ea6b2fb (patch)
tree3661739007350213cfd9f15d24a93fd725e8485e /audio
parent60a617df311fc6e56feced64143d912eb7b7099b (diff)
ao_lavc: use new sample format determination code
This is just a refactor, which makes it use the previously introduced function, and allows us to make af_format_conversion_score() private. (We drop 2 unlikely warning messages too... who cares.)
Diffstat (limited to 'audio')
-rw-r--r--audio/format.c4
-rw-r--r--audio/format.h1
-rw-r--r--audio/out/ao_lavc.c35
3 files changed, 16 insertions, 24 deletions
diff --git a/audio/format.c b/audio/format.c
index e26e5b6f5b..444d4b2b74 100644
--- a/audio/format.c
+++ b/audio/format.c
@@ -171,13 +171,11 @@ void af_fill_silence(void *dst, size_t bytes, int format)
memset(dst, af_fmt_is_unsigned(format) ? 0x80 : 0, bytes);
}
-#define FMT_DIFF(type, a, b) (((a) & type) - ((b) & type))
-
// Returns a "score" that serves as heuristic how lossy or hard a conversion is.
// If the formats are equal, 1024 is returned. If they are gravely incompatible
// (like s16<->ac3), INT_MIN is returned. If there is implied loss of precision
// (like s16->s8), a value <0 is returned.
-int af_format_conversion_score(int dst_format, int src_format)
+static int af_format_conversion_score(int dst_format, int src_format)
{
if (dst_format == AF_FORMAT_UNKNOWN || src_format == AF_FORMAT_UNKNOWN)
return INT_MIN;
diff --git a/audio/format.h b/audio/format.h
index 831fe0a825..de1ff1a30d 100644
--- a/audio/format.h
+++ b/audio/format.h
@@ -75,7 +75,6 @@ int af_fmt_seconds_to_bytes(int format, float seconds, int channels, int sampler
void af_fill_silence(void *dst, size_t bytes, int format);
-int af_format_conversion_score(int dst_format, int src_format);
void af_get_best_sample_formats(int src_format, int out_formats[AF_FORMAT_COUNT]);
int af_format_sample_alignment(int format);
diff --git a/audio/out/ao_lavc.c b/audio/out/ao_lavc.c
index eedc9c6a6b..a89324e9b0 100644
--- a/audio/out/ao_lavc.c
+++ b/audio/out/ao_lavc.c
@@ -58,33 +58,28 @@ struct priv {
bool shutdown;
};
-static void select_format(struct ao *ao, AVCodec *codec)
+static bool supports_format(AVCodec *codec, int format)
{
- int best_score = INT_MIN;
- int best_format = 0;
-
- // Check the encoder's list of supported formats.
for (const enum AVSampleFormat *sampleformat = codec->sample_fmts;
sampleformat && *sampleformat != AV_SAMPLE_FMT_NONE;
++sampleformat)
{
- int fmt = af_from_avformat(*sampleformat);
- if (!fmt) {
- MP_WARN(ao, "unsupported lavc format %s\n",
- av_get_sample_fmt_name(*sampleformat));
- continue;
- }
- int score = af_format_conversion_score(fmt, ao->format);
- if (score > best_score) {
- best_score = score;
- best_format = fmt;
- }
+ if (format && af_from_avformat(*sampleformat) == format)
+ return true;
}
+ return false;
+}
- if (best_format) {
- ao->format = best_format;
- } else {
- MP_ERR(ao, "sample format not found\n"); // shouldn't happen
+static void select_format(struct ao *ao, AVCodec *codec)
+{
+ int formats[AF_FORMAT_COUNT];
+ af_get_best_sample_formats(ao->format, formats);
+
+ for (int n = 0; n < AF_FORMAT_COUNT; n++) {
+ if (supports_format(codec, formats[n])) {
+ ao->format = formats[n];
+ break;
+ }
}
}