1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-16 12:17:12 +00:00
Commit Graph

1013 Commits

Author SHA1 Message Date
wm4
37ad3e79dd threads: use utility+POSIX functions instead of weird wrappers
There is not much of a reason to have these wrappers around. Use POSIX
standard functions directly, and use a separate utility function to take
care of the timespec calculations. (Course POSIX for using this weird
format for time values.)

(cherry picked from commit 92b9d75d72)
2015-05-15 10:30:15 +09:00
wm4
328d0c7fc3 ao: make better use of atomics
The main reason for this was compatibility; but some associated problems
have been solved in the previous commit.

(cherry picked from commit ca9964a4fb)
2015-05-15 10:30:03 +09:00
wm4
01c452cfba audio: simplify further
Drop mp_chmap_diff() (which is unused too now), and implement
mp_chmap_diffn() in a slightly simpler way. (Too bad there is no
standard function for counting set bits.)

(cherry picked from commit 00130651da)
2015-05-09 21:14:51 +09:00
wm4
ba799895e1 audio: remove mp_chmap_contains()
It's unsued now.

(cherry picked from commit 8d5924f2c9)
2015-05-09 21:14:35 +09:00
wm4
438ae9f742 ao: log reordered versions of channel maps
Useful for debugging cases when no standard orders are used.

(cherry picked from commit 8b7035c8ff)
2015-05-09 21:14:25 +09:00
wm4
015a7638fb audio: redo channel map fallback selection
Instead of somehow having 4 different cases with each their own weight,
do it with a single function that decides which channel layout is the
better fallback.

This is simpler, and also introduces new (fixed) semantics. The new test
added to test/chmap_sel.c actually works now. This is a mixed case with
no perfect upmix or downmix, but the better choice is the one which
loses the least channels from the original layout.

One test also changes. If the input is 7.1(wide-side), and the available
layouts are 7.1 and 5.1(side), the latter is now chosen instead of the
former. This makes sense: both layouts contain 6 out of 8 channels from
the original layout, but the 5.1(side) one is smaller. This follows the
general logic. The 7.1 layout has FLC/RLC speakers instead of BL/BR,
and judging by the names, "front left center" is completely different
from "back left". If these should be exchangeable, a separate exception
would have to be added.

(cherry picked from commit 3560a50029)
2015-05-09 21:14:15 +09:00
wm4
0ed627d5ab audio: remove UNKNOWN pseudo speakers
Reuse MP_SPEAKER_ID_NA for this. If all mp_chmap entries are set to NA,
the channel layout has special "unknown channel layout" semantics, which
are used to deal with some corner cases.

(cherry picked from commit 55e777f10b)
2015-05-09 21:13:52 +09:00
wm4
1127bb41c2 audio: define only a single NA speaker ID
Remove the requirement from mp_chmap that speaker entries must be
unique. Use this to get rid of all the redundant NA speaker IDs.

(cherry picked from commit b91b4944bd)
2015-05-09 21:13:21 +09:00
wm4
f58646c85c audio: add chmap utility function
(cherry picked from commit d32b71d52e)
2015-05-09 20:18:54 +09:00
wm4
d224c89034 ao_alsa: log requested numbers of channels if ALSA rejects them
(cherry picked from commit ad9bce2a5c)
2015-05-09 20:18:35 +09:00
wm4
0f834d0d5a audio: fix messed up assert()
This made no sense and always evaluated to true.

(cherry picked from commit 7b09654c33)
2015-05-08 16:38:46 +09:00
wm4
b76df84687 ao_coreaudio_utils: don't list some formats as "unusable"
While mpv has no internal equivalent representation, they can still be
used as physical CoreAudio formats. Thus this label is confusing.

(cherry picked from commit 1bcb82ec93)
2015-05-08 16:38:46 +09:00
wm4
eccea21361 ao_sndio: add notice about padding channels
(I won't do this, but someone else seeing this might.)

(cherry picked from commit cd5ab98ff9)
2015-05-07 10:55:34 +09:00
wm4
52ed30e9b8 ao_alsa: use new padding channels support
Sometimes, ALSA will return channel layouts with padded channels (NA
speakers). Use them instead of failing.

This still includes the old "braindeath" code to retry with a layout
without NA channels. This might be helpful for performance, and also the
padded channel layout string looks confusing.

To be fair, I have not encountered a case yet which would really need
this, and for which the old "braindeath" code did not fix it.

(cherry picked from commit 85fc6b2a05)
2015-05-07 10:54:49 +09:00
wm4
76d2ba6283 ao_alsa: move ALSA -> mp channel map to a function
One side effect is that the warning about too many channels goes away,
and is replaced with printing the ALSA channel map as "unknown".

(cherry picked from commit d577872a28)
2015-05-07 10:54:32 +09:00
wm4
283a300aa9 ao_coreaudio_exclusive: check new format before waiting for change
It seems if the format was already set, setting the same format will
not cause a property change.

(cherry picked from commit 0ae0e90eb5)
2015-05-07 10:53:47 +09:00
wm4
099f2138bb ao_coreaudio_exclusive: use atomics instead of volatile
volatile barely means anything.

The polling is kind of bad too, but relatively harmless as device
opening/closing is a rare event, and the format change is not expected
to take long.

Remove the pointless talloc call too (must have been a leftover
from previous refactoring).

(cherry picked from commit 4444ff48fa)
2015-05-07 10:53:37 +09:00
wm4
b7ef055917 ao_coreaudio_exclusive: rename "digital" -> "compressed"
PCM is digital too.

(cherry picked from commit 028739932b)
2015-05-07 10:53:25 +09:00
wm4
4002258b3f ao_coreaudio_exclusive: explicitly check for spdif formats
(cherry picked from commit 1e1045b13e)
2015-05-07 10:53:18 +09:00
wm4
3b471462eb ao_coreaudio_exclusive: merge init_digital() function
No reason to keep them separate. It's an artifact from the old
ao_coreaudio.c, which kept usage of two different APIs in the same file.
Removes a forward reference too.

(cherry picked from commit 32bc61ae07)
2015-05-07 10:52:50 +09:00
wm4
5523c04af5 ao_coreaudio_utils: decide formats by comparing raw bits
Instead of trying to use af_format_conversion_score() (which tries to be
all kinds of clever), just compare the raw bits as a quality measure. Do
this because otherwise, weird formats like padded 24 bit formats will be
excluded, even though they might be the highest precision formats for
some hardware.

This means that for now, the user would have to check whether the format
is usable at all before calling ca_asbd_is_better(). But since this is
currently only used for ao_coreaudio.c and for the physical format, it
doesn't matter.

If coreaudio-exclusive should get PCM support, the best would be to
revert this change, and to add support for 24 bit formats directly.

(cherry picked from commit 4ffcf2531b)
2015-05-07 10:52:02 +09:00
wm4
625fb59d08 af: don't attempt to remove last filter for spdif filter removal
Some time ago, a mechanism was added for automatically removing PCM-only
filters if the input format is spdif.

This could cause an infinite loop if the AO did not support spdif, but
was falling back to some PCM format. Then this code tried to remove the
last filter, which is a dummy filter for receiving and queuing filter
output. af_remove() simply fails gracefully in this case, so this
happens over and over again.

Fix by explicitly checking whether the filter to remove is a dummy
filter. (af_remove() also fails only if the dummy filters are attempted
to be removed - checking this directly is simpler.)

(cherry picked from commit 0025030cef)
2015-05-07 10:51:30 +09:00
wm4
71a88d75ff audio: minor cosmetics
These ( ) were probably not removed when the format constants were
changed from defines to an enum.

(cherry picked from commit d76f9a484e)
2015-05-07 10:50:59 +09:00
wm4
938008fff1 ao_coreaudio_utils: don't require talloc for fourcc_repr()
Instead, apply a trick to make the caller allocate enough space on the
stack.

(cherry picked from commit 399267393b)
2015-05-07 10:50:32 +09:00
wm4
d723970279 ao_coreaudio_utils: unbreak default device selection
It appears this is the reason coreaudio-exclusive does not work without
explicitly specifying a device, even if the default device maps to
something passthrough-capable.

(cherry picked from commit 7a5f5a8adf)
2015-05-07 10:49:20 +09:00
wm4
0e37672270 ao_coreaudio_exclusive: fix latency calculation non-sense
Didn't use the properties it was supposed to use.

(cherry picked from commit bbedceb467)
2015-05-07 10:48:44 +09:00
wm4
2d35c84ebf ao_coreaudio_utils: refine format selection
Instead of always picking a somehow better format over the previous one,
select a format that is equal to or better the requested format, but is
also reasonably close.

Drop the mFormatID comparison - checking the sample format handles this
already.

Make sure to exclude channel counts that can't be used.

(cherry picked from commit fd6809f98a)
2015-05-07 10:48:34 +09:00
wm4
774e9ef261 ao_coreaudio_utils: add a format negotiation helper function
(cherry picked from commit 305a85cc9a)
2015-05-07 10:47:21 +09:00
wm4
b38766133b ao_coreaudio: support padded channel layouts
If for example the audio settings are set to 5.1 output, but the
hardware does 8 channels natively (HDMI), the reported channel
layout will have 2 dummy channels. To avoid falling back to stereo,
we have to write audio in this format to the device.

(cherry picked from commit 4d8a7e0394)
2015-05-07 10:47:07 +09:00
wm4
604daa861f audio: introduce support for padding channels
Some audio APIs explicitly require you to add dummy channels. These are
not rendered, and only exist for the sake of the audio API or hardware
strangeness. At least ALSA, Sndio, and CoreAudio seem to have them.

This commit is preparation for using them with ao_coreaudio.

The result is a bit messy. libavresample/libswresample don't have good
API for this; avresample_set_channel_mapping() is pretty useless.
Although in theory you can use it to add and remove channels, you
can't set the channel counts. So we do the ordering ourselves by making
sure the audio data is planar, and by swapping the plane pointers. This
requires lots of messiness to get the conversions in place. Also, the
input reordering is still done with the "old" method, and doesn't
support padded channels - hopefully this will never be needed. (I tried
to come up with cleaner solutions, but compared to my other attempts,
the final commit is not that bad.)

(cherry picked from commit 06050aed99)
2015-05-07 10:47:00 +09:00
wm4
322c79a6e1 audio: introduce mp_audio readonly bit
Convenience for the following commit.

(cherry picked from commit 1b0b094ca2)
2015-05-07 10:46:53 +09:00
wm4
6bcb8d200f audio: chmap: explicitly drop channels not supported by lavc
Basically as before, but avoid undefined behavior.

(cherry picked from commit 937c8e513f)
2015-05-07 10:46:48 +09:00
wm4
d9c42ff9ff audio: drop unused function
(cherry picked from commit 548cd826c2)
2015-05-07 10:46:41 +09:00
wm4
e0ad4ec8aa ao_coreaudio: fix out of bounds access
ca_label_to_mp_speaker_id() checked whether the last entry was >= 0, but
actually this condition was never true, and MP_SPEAKER_ID_UNKNOWN0 is
not negative.

(cherry picked from commit eead97f103)
2015-05-07 10:46:36 +09:00
wm4
63402eb1dd ao_coreaudio_exclusive: check format explicitly on change notifcation
This should for now be equivalent; it's merely more explicit and will
be required if we add PCM support.

Note that the property listeners actually tell you what property
exactly changed, but resolving the current listener mess would be too
hard. So check for changes manually.

(cherry picked from commit 382434d45a)
2015-05-07 10:41:26 +09:00
wm4
8bcd9ea671 ao_coreaudio_utils: log mp format with CoreAudio format description
As a consequence, it also logs whether mpv can a this format at all.

(cherry picked from commit 34a5229b23)
2015-05-07 10:41:15 +09:00
wm4
e37fae4f9e ao_coreaudio_utils: add function for ASBD -> mp format lookup
Useful with some of the following commits.

ca_fill_asbd() should behave exactly as before.

Instead of actually implementing the inverse function of ca_fill_asbd(),
just loop over the (small) list of mpv functions and check if any mpv
equivalent to a given ASBD exists.

(cherry picked from commit 32b835c03b)
2015-05-07 10:41:00 +09:00
wm4
047c761f90 ao_coreaudio_utils: float is not a signed integer format
kAudioFormatFlagIsSignedInteger implicates that it's only used with
integer formats. The mpv internal flag on the other hand signals the
presence of a sign, and this is set on float formats.

Until now, this probably worked fine, because at least AudioUnit is
ignoring the uncorrect flag.

(cherry picked from commit 3295ce48ab)
2015-05-07 10:40:53 +09:00
wm4
477eefa63f ao_coreaudio_exclusive: move code for getting original format
Should be almost equivalent, unless there are streams on which this call
does not work for unknown reasons.

(cherry picked from commit 8b4ca58062)
2015-04-29 18:40:37 +09:00
wm4
87713640ae ao_coreaudio_utils: change audio format logging
Make it easier to distinguish the fields.

(cherry picked from commit d5e9bf66a1)
2015-04-29 18:40:30 +09:00
wm4
63bd171c0d ao_coreaudio_exclusive: account for additional latency
Whether this is correct is unknown. This change tripples the latency
from ~15ms to ~45ms.

XBMC does this, VLC does not from what I could see.

(cherry picked from commit 5f86fad2f0)
2015-04-29 18:40:20 +09:00
wm4
2a6b10c9ca audio: separate fallbacks for upmix and downmix cases
We always want to prefer upmix to downmix, as long as it makes sense.
Even if the upmix is not "perfect" (not just adding channels), we want
to prefer the upmix.

Cleanup for commit d3c7fd9d.

(cherry picked from commit c4aa136155)
2015-04-29 18:38:57 +09:00
wm4
cb2461044b audio: avoid downmixing in a certain special-case
As indicated by the added test. In this case, fallback and downmix have
the same score, but fallback happens to give better results. So prefer
fallback over downmix.

(This is probably not a correct solution.)

(cherry picked from commit d3c7fd9d7c)
2015-04-28 08:34:36 +09:00
wm4
c6d046414b player: change video-bitrate and audio-bitrate properties
Remove the old implementation for these properties. It was never very
good, often returned very innaccurate values or just 0, and was static
even if the source was variable bitrate. Replace it with the
implementation of "packet-video-bitrate". Mark the "packet-..."
properties as deprecated. (The effective difference is different
formatting, and returning the raw value in bits instead of kilobits.)

Also extend the documentation a little.

It appears at least some decoders (sipr?) need the
AVCodecContext.bit_rate field set, so this one is still passed through.
2015-04-20 20:52:16 +02:00
wm4
d8dd4b6c39 af_lavrresample: fix draining
configure_lavrr() clears s->pending, so we have to assign it after that
call.
2015-04-18 13:39:40 +02:00
wm4
2896afaa39 ao_alsa: fallback to stereo channel layout if everything else fails
mp_chmap_from_channels_alsa() doesn't always succeed - there are a bunch
of channel counts for which no defined ALSA layout exists. Fallback to
stereo in this case. (Normally, this code path shouldn't happen at all.)
2015-04-14 21:19:01 +02:00
Marcin Kurczewski
f43017bfe9 Update license headers
Signed-off-by: wm4 <wm4@nowhere>
2015-04-13 12:10:01 +02:00
wm4
ab2a27ae01 af_lavrresample: minor simplification
The in/out pointers usually have not much meaning outside of
AF_CONTROL_REINIT. Also remove the redundant casts.
2015-04-12 18:07:05 +02:00
wm4
f8a98fc133 af_lavrresample: allow resetting output sample format
It must be allowed to set format==0.
2015-04-12 18:07:05 +02:00
wm4
e466a735a3 audio/filter: fully renegotiate audio formats on every reconfig
It could happen that a lavrresample filter would keep its old output
format when the decoder changed its output format. This simply happened
because the output format was never reset.

Normally, this was not an issue, because lavrresample filters only
inserted for format conversion were removed on format changes. But if
--no-audio-pitch-correction is set and playback speed is changed, then
there is a "permanent" lavrresample filter in the filter chain, which
shows this behavior.

Fix by explicitly resetting output formats for all filters which support
it.

Note: this can crash with libswresample in some cases. I'm not sure if
this is mpv's fault or libswresample's, but since it works with
libavresample, I'm going to assume it's not our's.
2015-04-12 18:06:23 +02:00