[gstreamer-bugs] [Bug 587570] New: Use libavcodec codec's own downmixing

GStreamer (bugzilla.gnome.org) bugzilla-daemon at bugzilla.gnome.org
Wed Jul 1 20:39:05 PDT 2009


If you have any questions why you received this email, please see the text at
the end of this email. Replies to this email are NOT read, please see the text
at the end of this email. You can add comments to this bug at:
  http://bugzilla.gnome.org/show_bug.cgi?id=587570

  GStreamer | gst-ffmpeg | Ver: git
           Summary: Use libavcodec codec's own downmixing
           Product: GStreamer
           Version: git
          Platform: Other
        OS/Version: All
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: Normal
         Component: gst-ffmpeg
        AssignedTo: gstreamer-bugs at lists.sourceforge.net
        ReportedBy: lrn1986 at gmail.com
         QAContact: gstreamer-bugs at lists.sourceforge.net
     GNOME version: Unspecified
   GNOME milestone: Unspecified


When i proposed to use ffdec_ac3 instead of a52dec as a default ac3 decoder
(ffdec_ac3 is licensed under LGPL and is being maintained by FFmpeg developers,
while liba52 is in -ugly and looks unmaintained), __tim expressed some concerns
about libavcodec's ability to decode and output multichannel audio and to do
correct downstream downmixing negotiation (which supposedly means that
libavocodec should heed the channel count requirements of downstream elements
and use internal codec-specific downmixers to reduce the channel count instead
of relying on audioconvert to do so).

Multichannel output in libavcodec is fairly stable (at least for ac3 decoder),
and it should be, because 5.1 AC3s are very widespread these days.

Some of the libavcodec's codecs (ac3, mlp, dca and faad) are capable of
performing internal downmixing. OK, we aren't very interested in dca (got
dca-based decoder in -bad, with downmixing) and faad (same here, although
libgstfaad does not use downmixing, which is available via
faadcfg->downMatrix), but mlp and ac3 are desirable (since there is no mlp
decoders in GStreamer and since ffdec_ac3 is LGPL), and with downmixing too!

So, i've made a patch that adds downmixing support to GstFFmpegDec. What it
does:
* Exposes request_channels AVCodecContext as "request-channels" property of
ffdec_* elements
* When request_channels is not set, ffmpegdec sets it up automatically to match
the caps of downstream elements
The latter part is a bit shaky, but i hope that it works at least as good as
the similar code in a52dec. Even if it doesn't, it's a good start.

To check the results of my changes, i decided to run a couple of tests. I had
to use vorbis to encode various ac3 decoders' output, since i have to real
multichannel hardware. Vorbis appears to be the only encoder capable of
encoding 6-channel audio, except flac, which encodes it too, but with highly
reduced volume level (dunno why it happens and i had no desire to find that
out). I've performed tests only on combinations of 2 and 6 channel audio, for
simplicity. I've used Audacity to open the resulting ogg-vorbis files and see
the contents.

The test subject was this file - http://www.tfm.ro/ac3/download/test_ac3.rar
(i've used ffmpeg -i "Test AC3 v2.0.avi" -acodec copy surround.ac3 to extract
raw .ac3 audio stream)

The pipelines i've used:

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! ffdec_ac3 !
audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc ! oggmux ! filesink
location=surround_ffdec_ac3_org_e2.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! ffdec_ac3 !
audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc ! oggmux ! filesink
location=surround_ffdec_ac3_org_e6.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! ffdec_ac3 !
audioconvert ! vorbisenc ! oggmux ! filesink
location=surround_ffdec_ac3_org_default.ogg

Replaced libgstffmpeg with modified version

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! ffdec_ac3
request-channels=2 ! audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc !
oggmux ! filesink location=surround_ffdec_ac3_mod_r2e2.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! ffdec_ac3
request-channels=6 ! audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc !
oggmux ! filesink location=surround_ffdec_ac3_mod_r6e2.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! ffdec_ac3
request-channels=2 ! audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc !
oggmux ! filesink location=surround_ffdec_ac3_mod_r2e6.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! ffdec_ac3
request-channels=6 ! audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc !
oggmux ! filesink location=surround_ffdec_ac3_mod_r6e6.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! ffdec_ac3 !
audioconvert ! vorbisenc ! oggmux ! filesink
location=surround_ffdec_ac3_mod_default.ogg

For reference, the output from a52dec

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=7
lfe=true ! audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc ! oggmux !
filesink location=surround_a52dec_r6e6_lfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=2
lfe=true ! audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc ! oggmux !
filesink location=surround_a52dec_r2e6_lfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=7
lfe=true ! audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc ! oggmux !
filesink location=surround_a52dec_r6e2_lfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=2
lfe=true ! audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc ! oggmux !
filesink location=surround_a52dec_r2e2_lfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=7
lfe=false ! audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc ! oggmux !
filesink location=surround_a52dec_r6e6_nolfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=2
lfe=false ! audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc ! oggmux !
filesink location=surround_a52dec_r2e6_nolfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=7
lfe=false ! audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc ! oggmux !
filesink location=surround_a52dec_r6e2_nolfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=2
lfe=false ! audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc ! oggmux !
filesink location=surround_a52dec_r2e2_nolfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=7 !
audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc ! oggmux ! filesink
location=surround_a52dec_r6e6_defaultlfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=2 !
audioconvert ! audio/x-raw-float,channels=6 ! vorbisenc ! oggmux ! filesink
location=surround_a52dec_r2e6_defaultlfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=7 !
audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc ! oggmux ! filesink
location=surround_a52dec_r6e2_defaultlfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec mode=2 !
audioconvert ! audio/x-raw-float,channels=2 ! vorbisenc ! oggmux ! filesink
location=surround_a52dec_r2e2_defaultlfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec lfe=true !
audioconvert ! vorbisenc ! oggmux ! filesink
location=surround_a52dec_default_lfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec lfe=false !
audioconvert ! vorbisenc ! oggmux ! filesink
location=surround_a52dec_default_nolfe.ogg

gst-launch-0.10 filesrc location=surround.ac3 ! typefind ! a52dec !
audioconvert ! vorbisenc ! oggmux ! filesink
location=surround_a52dec_default.ogg

Conclusions:
* Despite what g_object_class_install_property (G_OBJECT_CLASS (klass),
ARG_LFE, g_param_spec_boolean ("lfe", "LFE", "LFE", TRUE, G_PARAM_READWRITE));
says, LFE is disabled by default (or maybe a52dec disables it by itself in such
circumstances)
* There is no lfe on/off switch in ffdec_ac3 (lfe is always on)

* Unpatched (request_channel-unaware) ffdec_ac3 outputs 6-channel audio by
default (no downstream downmixing negotiation)

* When lfe is off, a52dec outputs mono audio without lfe by default (negotiates
1 channel?)
* Patched ffdec_ac3 outputs mono audio without lfe by default, just like a52dec
with lfe=false (negotiates 1 channel?)

* When lfe is forced on, a52dec outputs 3-channel audio with lfe by default
(negotiates 3 channels?)
* When 3 channels are requested, patched ffdec_ac3 outputs 3-channel audio with
lfe (although the mixing strategy is different from default a52dec with
lfe=false)

* When lfe is forced on and 2 channels are requested, a52dec outputs stereo
with lfe
* When 2 channels are requested, patched ffdec_ac3 outputs stereo without lfe

* When lfe is forced on and 6 channels are requested, a52dec outputs 6ch audio
with lfe
* When 6 channels are requested, patched ffdec_ac3 outputs 6ch audio with lfe

* When 2 or 3 channels are forced downstream, patched ffdec_ac3 behaves just as
if 2 or 3 channels were explicitly requested from it (which means that
negotiation works as intended)

* It seems that ffmpeg is being "smart" about lfe, discarding it when
low-channel-count output is requested/negotiated, and preserving it when
high-channel-cout output is requested/negotiated

surround.ac3 and the resulting ogg-vorbis files are available here -
http://lrn.no-ip.info/other/gstreamer/surround_ffdec_ac3_vs_a52dec.7z


-- 
See http://bugzilla.gnome.org/page.cgi?id=email.html for more info about why you received
this email, why you can't respond via email, how to stop receiving
emails (or reduce the number you receive), and how to contact someone
if you are having problems with the system.

You can add comments to this bug at http://bugzilla.gnome.org/show_bug.cgi?id=587570.




More information about the Gstreamer-bugs mailing list