[vlc-devel] [PATCH 2/2] es: replace i_original_channels with i_stereo_mode

Thomas Guillem thomas at gllm.fr
Tue Jul 11 10:01:34 CEST 2017


The i_original_channels value (that is now i_stereo_mode) should not be used by
aout modules, and shouldn't be set by input if there is no special stereo mode.

If accepeted, this commits will be splitted in the following way:

 - One commit per module that remove the usage of i_original_channels when not
   needed at all.

 - One big commit that replace i_original_channels with i_stereo_mode and that
   changes few modules (mpg/a52/dca/dts/filters/core).
---
 include/vlc_aout.h                             |  2 +-
 include/vlc_es.h                               | 20 +++++++------
 modules/access/alsa.c                          |  1 -
 modules/access/linsys/linsys_hdsdi.c           |  1 -
 modules/access/linsys/linsys_sdi.c             |  1 -
 modules/access/pulse.c                         |  3 +-
 modules/access/qtsound.m                       |  5 ----
 modules/access/rtp/rtp.c                       |  7 -----
 modules/access/wasapi.c                        |  1 -
 modules/audio_filter/channel_mixer/dolby.c     |  8 +++---
 modules/audio_filter/channel_mixer/headphone.c |  6 ++--
 modules/audio_filter/channel_mixer/simple.c    |  4 +--
 modules/audio_filter/channel_mixer/trivial.c   | 18 ++++++------
 modules/audio_output/alsa.c                    |  1 -
 modules/audio_output/amem.c                    |  1 -
 modules/audio_output/audiotrack.c              |  7 +----
 modules/audio_output/coreaudio_common.c        |  3 +-
 modules/audio_output/directsound.c             |  2 --
 modules/audio_output/oss.c                     |  1 -
 modules/audio_output/pulse.c                   |  7 ++---
 modules/audio_output/sndio.c                   |  2 +-
 modules/audio_output/wasapi.c                  |  1 -
 modules/codec/a52.c                            | 20 ++++++-------
 modules/codec/adpcm.c                          |  4 +--
 modules/codec/aes3.c                           |  2 +-
 modules/codec/araw.c                           | 10 ++-----
 modules/codec/avcodec/audio.c                  | 12 +++-----
 modules/codec/dca.c                            | 14 ++++-----
 modules/codec/dmo/dmo.c                        |  3 +-
 modules/codec/faad.c                           |  9 ++----
 modules/codec/flac.c                           |  7 ++---
 modules/codec/fluidsynth.c                     |  4 +--
 modules/codec/g711.c                           |  7 +----
 modules/codec/lpcm.c                           |  2 +-
 modules/codec/mad.c                            |  1 -
 modules/codec/mft.c                            |  1 -
 modules/codec/mpg123.c                         | 13 ++++-----
 modules/codec/omxil/mediacodec.c               |  1 -
 modules/codec/omxil/omxil.c                    |  3 +-
 modules/codec/opus.c                           |  3 +-
 modules/codec/speex.c                          |  5 ++--
 modules/codec/uleaddvaudio.c                   |  4 +--
 modules/codec/vorbis.c                         |  2 +-
 modules/codec/wmafixed/wma.c                   |  5 ++--
 modules/demux/mkv/matroska_segment_parse.cpp   |  3 +-
 modules/demux/mp4/essetup.c                    |  3 +-
 modules/demux/ogg.c                            |  3 +-
 modules/demux/wav.c                            |  3 +-
 modules/packetizer/a52.c                       |  5 ++--
 modules/packetizer/a52.h                       | 18 ++++++++----
 modules/packetizer/dts.c                       |  5 ++--
 modules/packetizer/dts_header.c                | 40 ++++++++++++++------------
 modules/packetizer/dts_header.h                |  3 +-
 modules/packetizer/flac.c                      |  3 +-
 modules/packetizer/mlp.c                       |  1 -
 modules/packetizer/mpeg4audio.c                |  1 -
 modules/packetizer/mpegaudio.c                 | 28 +++++++++---------
 modules/stream_out/transcode/audio.c           | 12 +-------
 src/audio_output/aout_internal.h               |  1 -
 src/audio_output/common.c                      | 36 +++++++++++------------
 src/audio_output/filters.c                     |  4 +--
 src/audio_output/output.c                      | 19 ++++++------
 src/input/decoder.c                            | 13 ++-------
 src/misc/es_format.c                           |  2 +-
 64 files changed, 175 insertions(+), 262 deletions(-)

diff --git a/include/vlc_aout.h b/include/vlc_aout.h
index bbe7b4cbbe..529fd827d4 100644
--- a/include/vlc_aout.h
+++ b/include/vlc_aout.h
@@ -65,7 +65,7 @@
 #define AOUT_FMTS_SIMILAR( p_first, p_second ) (                            \
     ((p_first)->i_rate == (p_second)->i_rate)                               \
       && ((p_first)->i_physical_channels == (p_second)->i_physical_channels)\
-      && ((p_first)->i_original_channels == (p_second)->i_original_channels) )
+      && ((p_first)->i_stereo_mode == (p_second)->i_stereo_mode) )
 
 #define AOUT_FMT_LINEAR( p_format ) \
     (aout_BitsPerSample((p_format)->i_format) != 0)
diff --git a/include/vlc_es.h b/include/vlc_es.h
index e9d11d85a8..bc3c8ccd54 100644
--- a/include/vlc_es.h
+++ b/include/vlc_es.h
@@ -77,9 +77,10 @@ struct audio_format_t
      * channels which are available in the buffer, and positions). */
     uint16_t     i_physical_channels;
 
-    /* Describes from which original channels, before downmixing, the
-     * buffer is derived. */
-    uint32_t     i_original_channels;
+    /* Describes the stereo mode, either set from the input
+     * (demux/codec/packetizer) or overridden by the user, used by audio
+     * filters (should be ignored by aout modules). */
+    uint16_t     i_stereo_mode;
 
     /* Optional - for A/52, SPDIF and DTS types : */
     /* Bytes used by one compressed frame, depends on bitrate. */
@@ -134,18 +135,19 @@ struct audio_format_t
 #define AOUT_CHANS_5_0_MIDDLE (AOUT_CHANS_4_0_MIDDLE | AOUT_CHAN_CENTER)
 #define AOUT_CHANS_6_1_MIDDLE (AOUT_CHANS_5_0_MIDDLE | AOUT_CHAN_REARCENTER | AOUT_CHAN_LFE)
 
-/* Values available for original channels only */
-#define AOUT_CHAN_DOLBYSTEREO       0x10000
-#define AOUT_CHAN_DUALMONO          0x20000
-#define AOUT_CHAN_REVERSESTEREO     0x40000
-
-#define AOUT_CHAN_PHYSMASK          0xFFFF
 /* Maximum number of mapped channels (or the maximum of bits set in
  * i_physical_channels) */
 #define AOUT_CHAN_MAX               9
 /* Maximum number of unmapped channels */
 #define INPUT_CHAN_MAX              64
 
+/* Values available for i_stereo_mode only */
+#define AOUT_STEREOMODE_LEFT        0x1
+#define AOUT_STEREOMODE_RIGHT       0x2
+#define AOUT_STEREOMODE_DUALMONO    0x4
+#define AOUT_STEREOMODE_DOLBY       0x8
+#define AOUT_STEREOMODE_REVERSE     0x10
+
 /**
  * Picture orientation.
  */
diff --git a/modules/access/alsa.c b/modules/access/alsa.c
index a265f24127..406dcde0e3 100644
--- a/modules/access/alsa.c
+++ b/modules/access/alsa.c
@@ -433,7 +433,6 @@ static int Open (vlc_object_t *obj)
     assert (param > 0);
     assert (param < (sizeof (channel_maps) / sizeof (channel_maps[0])));
     fmt.audio.i_channels = param;
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = channel_maps[param - 1];
 
     param = var_InheritInteger (demux, "alsa-samplerate");
diff --git a/modules/access/linsys/linsys_hdsdi.c b/modules/access/linsys/linsys_hdsdi.c
index 3a227b85b1..b6d439483d 100644
--- a/modules/access/linsys/linsys_hdsdi.c
+++ b/modules/access/linsys/linsys_hdsdi.c
@@ -538,7 +538,6 @@ static int InitAudio( demux_t *p_demux )
         es_format_Init( &fmt, AUDIO_ES, VLC_CODEC_S16L );
         fmt.i_id = p_audio->i_id;
         fmt.audio.i_channels          = 2;
-        fmt.audio.i_original_channels =
         fmt.audio.i_physical_channels = AOUT_CHANS_STEREO;
         fmt.audio.i_rate              = p_sys->i_sample_rate;
         fmt.audio.i_bitspersample     = 16;
diff --git a/modules/access/linsys/linsys_sdi.c b/modules/access/linsys/linsys_sdi.c
index b123bb5ed2..c641b24c12 100644
--- a/modules/access/linsys/linsys_sdi.c
+++ b/modules/access/linsys/linsys_sdi.c
@@ -847,7 +847,6 @@ static int InitAudio( demux_t *p_demux, sdi_audio_t *p_audio )
     es_format_Init( &fmt, AUDIO_ES, VLC_CODEC_S16L );
     fmt.i_id = p_audio->i_id;
     fmt.audio.i_channels          = 2;
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = AOUT_CHANS_STEREO;
     fmt.audio.i_rate              = p_audio->i_rate;
     fmt.audio.i_bitspersample     = 16;
diff --git a/modules/access/pulse.c b/modules/access/pulse.c
index 9d1a1e82b6..3ab5d9a2b4 100644
--- a/modules/access/pulse.c
+++ b/modules/access/pulse.c
@@ -341,8 +341,7 @@ static int Open(vlc_object_t *obj)
     }
 
     es_format_Init(&fmt, AUDIO_ES, format);
-    fmt.audio.i_physical_channels = fmt.audio.i_original_channels =
-        AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
+    fmt.audio.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
     fmt.audio.i_channels = ss.channels;
     fmt.audio.i_rate = pss->rate;
     fmt.audio.i_bitspersample = aout_BitsPerSample(format);
diff --git a/modules/access/qtsound.m b/modules/access/qtsound.m
index eaf882c49d..6183474a49 100644
--- a/modules/access/qtsound.m
+++ b/modules/access/qtsound.m
@@ -415,11 +415,6 @@ static int Open(vlc_object_t *p_this)
          */
         audiofmt.audio.i_physical_channels = AOUT_CHAN_RIGHT | AOUT_CHAN_LEFT;
         /*
-         * i_original_channels Describes from which original channels,
-         * before downmixing, the buffer is derived.
-         */
-        audiofmt.audio.i_original_channels = AOUT_CHAN_RIGHT | AOUT_CHAN_LEFT;
-        /*
          * Please note that it may be completely arbitrary - buffers are not
          * obliged to contain a integral number of so-called "frames". It's
          * just here for the division:
diff --git a/modules/access/rtp/rtp.c b/modules/access/rtp/rtp.c
index 0c4a04e13c..9c6c0666b4 100644
--- a/modules/access/rtp/rtp.c
+++ b/modules/access/rtp/rtp.c
@@ -500,7 +500,6 @@ static void *pcmu_init (demux_t *demux)
 
     es_format_Init (&fmt, AUDIO_ES, VLC_CODEC_MULAW);
     fmt.audio.i_rate = 8000;
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = AOUT_CHAN_CENTER;
     return codec_init (demux, &fmt);
 }
@@ -514,7 +513,6 @@ static void *gsm_init (demux_t *demux)
 
     es_format_Init (&fmt, AUDIO_ES, VLC_CODEC_GSM);
     fmt.audio.i_rate = 8000;
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = AOUT_CHAN_CENTER;
     return codec_init (demux, &fmt);
 }
@@ -528,7 +526,6 @@ static void *pcma_init (demux_t *demux)
 
     es_format_Init (&fmt, AUDIO_ES, VLC_CODEC_ALAW);
     fmt.audio.i_rate = 8000;
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = AOUT_CHAN_CENTER;
     return codec_init (demux, &fmt);
 }
@@ -542,7 +539,6 @@ static void *l16s_init (demux_t *demux)
 
     es_format_Init (&fmt, AUDIO_ES, VLC_CODEC_S16B);
     fmt.audio.i_rate = 44100;
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = AOUT_CHANS_STEREO;
     return codec_init (demux, &fmt);
 }
@@ -553,7 +549,6 @@ static void *l16m_init (demux_t *demux)
 
     es_format_Init (&fmt, AUDIO_ES, VLC_CODEC_S16B);
     fmt.audio.i_rate = 44100;
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = AOUT_CHAN_CENTER;
     return codec_init (demux, &fmt);
 }
@@ -567,7 +562,6 @@ static void *qcelp_init (demux_t *demux)
 
     es_format_Init (&fmt, AUDIO_ES, VLC_CODEC_QCELP);
     fmt.audio.i_rate = 8000;
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = AOUT_CHAN_CENTER;
     return codec_init (demux, &fmt);
 }
@@ -580,7 +574,6 @@ static void *mpa_init (demux_t *demux)
     es_format_t fmt;
 
     es_format_Init (&fmt, AUDIO_ES, VLC_CODEC_MPGA);
-    fmt.audio.i_original_channels =
     fmt.audio.i_physical_channels = AOUT_CHANS_STEREO;
     fmt.b_packetized = false;
     return codec_init (demux, &fmt);
diff --git a/modules/access/wasapi.c b/modules/access/wasapi.c
index f7b8c6683f..296e2feda2 100644
--- a/modules/access/wasapi.c
+++ b/modules/access/wasapi.c
@@ -143,7 +143,6 @@ static int vlc_FromWave(const WAVEFORMATEX *restrict wf,
     if (wfe->dwChannelMask & SPEAKER_LOW_FREQUENCY)
         fmt->i_physical_channels |= AOUT_CHAN_LFE;
 
-    fmt->i_original_channels = fmt->i_physical_channels;
     assert(popcount(wfe->dwChannelMask) == wf->nChannels);
 
     if (IsEqualIID(&wfe->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))
diff --git a/modules/audio_filter/channel_mixer/dolby.c b/modules/audio_filter/channel_mixer/dolby.c
index 344d961cc7..164cc69f46 100644
--- a/modules/audio_filter/channel_mixer/dolby.c
+++ b/modules/audio_filter/channel_mixer/dolby.c
@@ -80,10 +80,10 @@ static int Create( vlc_object_t *p_this )
 
     /* Validate audio filter format */
     if ( p_filter->fmt_in.audio.i_physical_channels != (AOUT_CHAN_LEFT|AOUT_CHAN_RIGHT)
-       || ! ( p_filter->fmt_in.audio.i_original_channels & AOUT_CHAN_DOLBYSTEREO )
-       || aout_FormatNbChannels( &p_filter->fmt_out.audio ) <= 2
-       || ( p_filter->fmt_in.audio.i_original_channels & ~AOUT_CHAN_DOLBYSTEREO )
-          != ( p_filter->fmt_out.audio.i_original_channels & ~AOUT_CHAN_DOLBYSTEREO ) )
+       || ! ( p_filter->fmt_in.audio.i_stereo_mode & AOUT_STEREOMODE_DOLBY )
+       || p_filter->fmt_out.audio.i_channels <= 2
+       || ( p_filter->fmt_in.audio.i_stereo_mode & ~AOUT_STEREOMODE_DOLBY )
+          != ( p_filter->fmt_out.audio.i_stereo_mode & ~AOUT_STEREOMODE_DOLBY ) )
     {
         return VLC_EGENERIC;
     }
diff --git a/modules/audio_filter/channel_mixer/headphone.c b/modules/audio_filter/channel_mixer/headphone.c
index 80e4ef3c5b..4438355ad1 100644
--- a/modules/audio_filter/channel_mixer/headphone.c
+++ b/modules/audio_filter/channel_mixer/headphone.c
@@ -472,10 +472,10 @@ static int OpenFilter( vlc_object_t *p_this )
     p_filter->fmt_in.audio.i_format = VLC_CODEC_FL32;
     p_filter->fmt_out.audio.i_format = VLC_CODEC_FL32;
     p_filter->fmt_out.audio.i_rate = p_filter->fmt_in.audio.i_rate;
-    p_filter->fmt_in.audio.i_original_channels =
-                                   p_filter->fmt_out.audio.i_original_channels;
+    p_filter->fmt_in.audio.i_stereo_mode =
+                                   p_filter->fmt_out.audio.i_stereo_mode;
     if( p_filter->fmt_in.audio.i_physical_channels == AOUT_CHANS_STEREO
-     && (p_filter->fmt_in.audio.i_original_channels & AOUT_CHAN_DOLBYSTEREO)
+     && (p_filter->fmt_in.audio.i_stereo_mode & AOUT_STEREOMODE_DOLBY)
      && !var_InheritBool( p_filter, "headphone-dolby" ) )
     {
         p_filter->fmt_in.audio.i_physical_channels = AOUT_CHANS_5_0;
diff --git a/modules/audio_filter/channel_mixer/simple.c b/modules/audio_filter/channel_mixer/simple.c
index 25af5a8d70..131f7d7a9b 100644
--- a/modules/audio_filter/channel_mixer/simple.c
+++ b/modules/audio_filter/channel_mixer/simple.c
@@ -284,8 +284,8 @@ static int OpenFilter( vlc_object_t *p_this )
 
     /* Short circuit the common case of not remixing */
     if( input == output
-     && p_filter->fmt_in.audio.i_original_channels
-            == p_filter->fmt_out.audio.i_original_channels )
+     && p_filter->fmt_in.audio.i_stereo_mode
+            == p_filter->fmt_out.audio.i_stereo_mode )
         return VLC_EGENERIC;
 
     const bool b_input_6_1 = input == AOUT_CHANS_6_1_MIDDLE;
diff --git a/modules/audio_filter/channel_mixer/trivial.c b/modules/audio_filter/channel_mixer/trivial.c
index c762a32ac9..45aecb2318 100644
--- a/modules/audio_filter/channel_mixer/trivial.c
+++ b/modules/audio_filter/channel_mixer/trivial.c
@@ -263,24 +263,22 @@ static int Create( vlc_object_t *p_this )
      || infmt->i_format != VLC_CODEC_FL32 )
         return VLC_EGENERIC;
     if( infmt->i_physical_channels == outfmt->i_physical_channels
-     && infmt->i_original_channels == outfmt->i_original_channels )
+     && infmt->i_stereo_mode == outfmt->i_stereo_mode )
         return VLC_EGENERIC;
 
     p_filter->p_sys = NULL;
     if( outfmt->i_physical_channels == AOUT_CHANS_STEREO )
     {
-        bool swap = (outfmt->i_original_channels & AOUT_CHAN_REVERSESTEREO)
-                  != (infmt->i_original_channels & AOUT_CHAN_REVERSESTEREO);
+        bool swap = (outfmt->i_stereo_mode & AOUT_STEREOMODE_REVERSE)
+                  != (infmt->i_stereo_mode & AOUT_STEREOMODE_REVERSE);
 
-        if( (outfmt->i_original_channels & AOUT_CHAN_PHYSMASK)
-                                                            == AOUT_CHAN_LEFT )
+        if( (outfmt->i_stereo_mode & AOUT_STEREOMODE_LEFT) )
         {
             p_filter->pf_audio_filter = swap ? CopyRight : CopyLeft;
             return VLC_SUCCESS;
         }
 
-        if( (outfmt->i_original_channels & AOUT_CHAN_PHYSMASK)
-                                                           == AOUT_CHAN_RIGHT )
+        if( (outfmt->i_stereo_mode & AOUT_STEREOMODE_RIGHT ) )
         {
             p_filter->pf_audio_filter = swap ? CopyLeft : CopyRight;
             return VLC_SUCCESS;
@@ -295,15 +293,15 @@ static int Create( vlc_object_t *p_this )
 
     if ( aout_FormatNbChannels( outfmt ) == 1 )
     {
-        bool mono = !!(infmt->i_original_channels & AOUT_CHAN_DUALMONO);
+        bool mono = !!(infmt->i_stereo_mode & AOUT_STEREOMODE_DUALMONO);
 
-        if( mono && (infmt->i_original_channels & AOUT_CHAN_LEFT) )
+        if( mono && (infmt->i_stereo_mode & AOUT_STEREOMODE_LEFT) )
         {
             p_filter->pf_audio_filter = ExtractLeft;
             return VLC_SUCCESS;
         }
 
-        if( mono && (infmt->i_original_channels & AOUT_CHAN_RIGHT) )
+        if( mono && (infmt->i_stereo_mode & AOUT_STEREOMODE_RIGHT) )
         {
             p_filter->pf_audio_filter = ExtractRight;
             return VLC_SUCCESS;
diff --git a/modules/audio_output/alsa.c b/modules/audio_output/alsa.c
index 580ebb06b1..ec5a218233 100644
--- a/modules/audio_output/alsa.c
+++ b/modules/audio_output/alsa.c
@@ -469,7 +469,6 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt)
         sys->chans_to_reorder = SetupChannels (VLC_OBJECT(aout), pcm, &map,
                                                sys->chans_table);
         fmt->i_physical_channels = map;
-        fmt->i_original_channels = map;
         channels = popcount (map);
     }
     else
diff --git a/modules/audio_output/amem.c b/modules/audio_output/amem.c
index 1821e46e07..7171690d25 100644
--- a/modules/audio_output/amem.c
+++ b/modules/audio_output/amem.c
@@ -231,7 +231,6 @@ static int Start (audio_output_t *aout, audio_sample_format_t *fmt)
     }
 
     fmt->i_format = VLC_CODEC_S16N;
-    fmt->i_original_channels = fmt->i_physical_channels;
     return VLC_SUCCESS;
 }
 
diff --git a/modules/audio_output/audiotrack.c b/modules/audio_output/audiotrack.c
index 1a6b4f387b..86b28a691b 100644
--- a/modules/audio_output/audiotrack.c
+++ b/modules/audio_output/audiotrack.c
@@ -990,7 +990,6 @@ StartPassthrough( JNIEnv *env, audio_output_t *p_aout )
                 return VLC_EGENERIC;
         }
         p_sys->fmt.i_frame_length = 1;
-        p_sys->fmt.i_original_channels = p_sys->fmt.i_physical_channels;
         p_sys->fmt.i_channels = aout_FormatNbChannels( &p_sys->fmt );
         p_sys->fmt.i_format = VLC_CODEC_SPDIFL;
     }
@@ -1013,8 +1012,7 @@ StartPassthrough( JNIEnv *env, audio_output_t *p_aout )
         }
         p_sys->fmt.i_bytes_per_frame = 4;
         p_sys->fmt.i_frame_length = 1;
-        p_sys->fmt.i_physical_channels =
-        p_sys->fmt.i_original_channels = AOUT_CHANS_STEREO;
+        p_sys->fmt.i_physical_channels = AOUT_CHANS_STEREO;
         p_sys->fmt.i_channels = 2;
         p_sys->fmt.i_format = VLC_CODEC_SPDIFB;
     }
@@ -1094,7 +1092,6 @@ StartPCM( JNIEnv *env, audio_output_t *p_aout, unsigned i_max_channels )
             else
                 p_sys->fmt.i_physical_channels = AOUT_CHANS_STEREO;
         }
-        p_sys->fmt.i_original_channels = p_sys->fmt.i_physical_channels;
 
         /* Try to create an AudioTrack with the most advanced channel and
          * format configuration. If AudioTrack_Create fails, try again with a
@@ -1162,8 +1159,6 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
 
     aout_FormatPrint( p_aout, "VLC is looking for:", &p_sys->fmt );
 
-    p_sys->fmt.i_original_channels = p_sys->fmt.i_physical_channels;
-
     if( AOUT_FMT_LINEAR( &p_sys->fmt ) )
         i_ret = StartPCM( env, p_aout, i_max_channels );
     else if( b_try_passthrough )
diff --git a/modules/audio_output/coreaudio_common.c b/modules/audio_output/coreaudio_common.c
index 406c30d743..69dba235ab 100644
--- a/modules/audio_output/coreaudio_common.c
+++ b/modules/audio_output/coreaudio_common.c
@@ -324,7 +324,7 @@ MapOutputLayout(audio_output_t *p_aout, audio_sample_format_t *fmt,
 {
     /* Fill VLC physical_channels from output layout */
     fmt->i_physical_channels = 0;
-    uint32_t i_original = fmt->i_original_channels & AOUT_CHAN_PHYSMASK;
+    uint32_t i_original = fmt->i_physical_channels;
     AudioChannelLayout *reslayout = NULL;
 
     if (outlayout == NULL)
@@ -434,7 +434,6 @@ MapOutputLayout(audio_output_t *p_aout, audio_sample_format_t *fmt,
 
 end:
     free(reslayout);
-    fmt->i_original_channels = fmt->i_physical_channels;
     aout_FormatPrepare(fmt);
 
     msg_Dbg(p_aout, "selected %d physical channels for device output",
diff --git a/modules/audio_output/directsound.c b/modules/audio_output/directsound.c
index 8c52e07645..b8639b7bbd 100644
--- a/modules/audio_output/directsound.c
+++ b/modules/audio_output/directsound.c
@@ -788,8 +788,6 @@ static HRESULT Start( vlc_object_t *obj, aout_stream_sys_t *sys,
         }
     }
 
-    fmt.i_original_channels = fmt.i_physical_channels;
-
     int ret = vlc_clone(&sys->eraser_thread, PlayedDataEraser, (void*) obj,
                         VLC_THREAD_PRIORITY_LOW);
     if( unlikely( ret ) )
diff --git a/modules/audio_output/oss.c b/modules/audio_output/oss.c
index d60c68a996..d3e2a6f640 100644
--- a/modules/audio_output/oss.c
+++ b/modules/audio_output/oss.c
@@ -213,7 +213,6 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt)
     else
     {
         fmt->i_rate = rate;
-        fmt->i_original_channels =
         fmt->i_physical_channels = channels;
     }
     aout_FormatPrepare (fmt);
diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c
index b23d110388..e9c70c562d 100644
--- a/modules/audio_output/pulse.c
+++ b/modules/audio_output/pulse.c
@@ -719,7 +719,7 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
             fmt->i_format = VLC_CODEC_SPDIFL;
             fmt->i_bytes_per_frame = 4;
             fmt->i_frame_length = 1;
-            fmt->i_physical_channels = fmt->i_original_channels = AOUT_CHANS_2_0;
+            fmt->i_physical_channels = AOUT_CHANS_2_0;
             fmt->i_channels = 2;
             encoding = PA_ENCODING_AC3_IEC61937;
             ss.format = PA_SAMPLE_S16NE;
@@ -728,7 +728,7 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
             fmt->i_format = VLC_CODEC_SPDIFL;
             fmt->i_bytes_per_frame = 4;
             fmt->i_frame_length = 1;
-            fmt->i_physical_channels = fmt->i_original_channels = AOUT_CHANS_2_0;
+            fmt->i_physical_channels = AOUT_CHANS_2_0;
             fmt->i_channels = 2;
             encoding = PA_ENCODING_EAC3_IEC61937;
             ss.format = PA_SAMPLE_S16NE;
@@ -742,7 +742,7 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
             fmt->i_format = VLC_CODEC_SPDIFL;
             fmt->i_bytes_per_frame = 4;
             fmt->i_frame_length = 1;
-            fmt->i_physical_channels = fmt->i_original_channels = AOUT_CHANS_2_0;
+            fmt->i_physical_channels = AOUT_CHANS_2_0;
             fmt->i_channels = 2;
             encoding = PA_ENCODING_DTS_IEC61937;
             ss.format = PA_SAMPLE_S16NE;
@@ -844,7 +844,6 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
         }
         if (fmt->i_physical_channels & AOUT_CHAN_LFE)
             map.map[map.channels++] = PA_CHANNEL_POSITION_LFE;
-        fmt->i_original_channels = fmt->i_physical_channels;
 
         static_assert(AOUT_CHAN_MAX == 9, "Missing channels");
 
diff --git a/modules/audio_output/sndio.c b/modules/audio_output/sndio.c
index fb5f4bd35b..b8d5e90e03 100644
--- a/modules/audio_output/sndio.c
+++ b/modules/audio_output/sndio.c
@@ -174,7 +174,7 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt)
             goto error;
     }
 
-    fmt->i_original_channels = fmt->i_physical_channels = chans;
+    fmt->i_physical_channels = chans;
     aout_FormatPrepare (fmt);
 
     aout->time_get = TimeGet;
diff --git a/modules/audio_output/wasapi.c b/modules/audio_output/wasapi.c
index e4803b2c6f..5fde72f41b 100644
--- a/modules/audio_output/wasapi.c
+++ b/modules/audio_output/wasapi.c
@@ -428,7 +428,6 @@ static int vlc_FromWave(const WAVEFORMATEX *restrict wf,
     else
         return -1;
 
-    audio->i_original_channels = audio->i_physical_channels;
     aout_FormatPrepare (audio);
 
     if (wf->nChannels != audio->i_channels)
diff --git a/modules/codec/a52.c b/modules/codec/a52.c
index af9f55996a..74e24f2712 100644
--- a/modules/codec/a52.c
+++ b/modules/codec/a52.c
@@ -215,8 +215,7 @@ static int Decode( decoder_t *p_dec, block_t *p_in_buf )
             Duplicate( (sample_t *)(p_out_buf->p_buffer + i * i_bytes_per_block),
                        p_samples );
         }
-        else if ( p_dec->fmt_out.audio.i_original_channels
-                    & AOUT_CHAN_REVERSESTEREO )
+        else if ( p_dec->fmt_out.audio.i_stereo_mode & AOUT_STEREOMODE_REVERSE )
         {
             Exchange( (sample_t *)(p_out_buf->p_buffer + i * i_bytes_per_block),
                       p_samples );
@@ -245,26 +244,24 @@ static int channels_vlc2a52( const audio_format_t *p_audio, int *p_flags )
     switch ( p_audio->i_physical_channels & ~AOUT_CHAN_LFE )
     {
     case AOUT_CHAN_CENTER:
-        if ( (p_audio->i_original_channels & AOUT_CHAN_CENTER)
-              || (p_audio->i_original_channels
+        if ( (p_audio->i_physical_channels & AOUT_CHAN_CENTER)
+              || (p_audio->i_physical_channels
                    & (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)) )
             i_flags = A52_MONO;
-        else if ( p_audio->i_original_channels & AOUT_CHAN_LEFT )
+        else if ( p_audio->i_physical_channels & AOUT_CHAN_LEFT )
             i_flags = A52_CHANNEL1;
         else
             i_flags = A52_CHANNEL2;
         break;
 
     case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT:
-        if ( p_audio->i_original_channels & AOUT_CHAN_DOLBYSTEREO )
+        if ( p_audio->i_stereo_mode & AOUT_STEREOMODE_DOLBY )
             i_flags = A52_DOLBY;
-        else if ( p_audio->i_original_channels == AOUT_CHAN_CENTER )
-            i_flags = A52_MONO;
-        else if ( p_audio->i_original_channels & AOUT_CHAN_DUALMONO )
+        else if ( p_audio->i_stereo_mode & AOUT_STEREOMODE_DUALMONO )
             i_flags = A52_CHANNEL;
-        else if ( !(p_audio->i_original_channels & AOUT_CHAN_RIGHT) )
+        else if ( !(p_audio->i_physical_channels & AOUT_CHAN_RIGHT) )
             i_flags = A52_CHANNEL1;
-        else if ( !(p_audio->i_original_channels & AOUT_CHAN_LEFT) )
+        else if ( !(p_audio->i_physical_channels & AOUT_CHAN_LEFT) )
             i_flags = A52_CHANNEL2;
         else
             i_flags = A52_STEREO;
@@ -311,7 +308,6 @@ static int Open( vlc_object_t *p_this )
     if( p_dec->fmt_in.i_codec != VLC_CODEC_A52
      || p_dec->fmt_in.audio.i_rate == 0
      || p_dec->fmt_in.audio.i_physical_channels == 0
-     || p_dec->fmt_in.audio.i_original_channels == 0
      || p_dec->fmt_in.audio.i_bytes_per_frame == 0
      || p_dec->fmt_in.audio.i_frame_length == 0 )
         return VLC_EGENERIC;
diff --git a/modules/codec/adpcm.c b/modules/codec/adpcm.c
index 3abe252a23..c67cb5ed8f 100644
--- a/modules/codec/adpcm.c
+++ b/modules/codec/adpcm.c
@@ -278,8 +278,8 @@ static int OpenDecoder( vlc_object_t *p_this )
     p_dec->fmt_out.i_codec = VLC_CODEC_S16N;
     p_dec->fmt_out.audio.i_rate = p_dec->fmt_in.audio.i_rate;
     p_dec->fmt_out.audio.i_channels = i_channels;
-    p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels = pi_channels_maps[i_channels];
+    p_dec->fmt_out.audio.i_physical_channels = pi_channels_maps[i_channels];
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
 
     date_Init( &p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1 );
     date_Set( &p_sys->end_date, 0 );
diff --git a/modules/codec/aes3.c b/modules/codec/aes3.c
index 2df8363192..8365dddd1f 100644
--- a/modules/codec/aes3.c
+++ b/modules/codec/aes3.c
@@ -393,8 +393,8 @@ static block_t * Parse( decoder_t *p_dec, int *pi_frame_length, int *pi_bits,
     }
 
     p_dec->fmt_out.audio.i_channels = i_channels;
-    p_dec->fmt_out.audio.i_original_channels = pi_original_channels[i_channels/2-1];
     p_dec->fmt_out.audio.i_physical_channels = pi_original_channels[i_channels/2-1];
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
 
     *pi_frame_length = (p_block->i_buffer - AES3_HEADER_LEN) / ( (4+i_bits) * i_channels / 8 );
     *pi_bits = i_bits;
diff --git a/modules/codec/araw.c b/modules/codec/araw.c
index ffa585bf9e..94f0e21234 100644
--- a/modules/codec/araw.c
+++ b/modules/codec/araw.c
@@ -284,20 +284,14 @@ static int DecoderOpen( vlc_object_t *p_this )
         else
             p_dec->fmt_out.audio.i_physical_channels =
                                   pi_channels_maps[p_dec->fmt_in.audio.i_channels];
-        if( p_dec->fmt_in.audio.i_original_channels )
-            p_dec->fmt_out.audio.i_original_channels =
-                                           p_dec->fmt_in.audio.i_original_channels;
-        else
-            p_dec->fmt_out.audio.i_original_channels =
-                                          p_dec->fmt_out.audio.i_physical_channels;
     }
     else
     {
         /* Unknown channel map, let the aout/filters decide what to do */
         p_dec->fmt_out.audio.i_channels = p_dec->fmt_in.audio.i_channels;
-        p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels = 0;
+        p_dec->fmt_out.audio.i_physical_channels = 0;
     }
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
     aout_FormatPrepare( &p_dec->fmt_out.audio );
 
     p_sys->decode = decode;
diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
index ea568f9dc7..22450c182d 100644
--- a/modules/codec/avcodec/audio.c
+++ b/modules/codec/avcodec/audio.c
@@ -258,6 +258,7 @@ int InitAudioDec( vlc_object_t *obj )
         p_dec->fmt_out.audio.i_rate = p_dec->fmt_in.audio.i_rate;
     if( p_dec->fmt_out.audio.i_rate )
         date_Init( &p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1 );
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
 
     p_dec->pf_decode = DecodeAudio;
     p_dec->pf_flush  = Flush;
@@ -607,12 +608,11 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
         if( i_channels_src != p_sys->p_context->channels && b_trust )
             msg_Err( p_dec, "Channel layout not understood" );
 
-        bool dual_mono = false;
         /* Detect special dual mono case */
         if( i_channels_src == 2 && pi_order_src[0] == AOUT_CHAN_CENTER
          && pi_order_src[1] == AOUT_CHAN_CENTER )
         {
-            dual_mono = true;
+            p_dec->fmt_out.audio.i_stereo_mode |= AOUT_STEREOMODE_DUALMONO;
             pi_order_src[0] = AOUT_CHAN_LEFT;
             pi_order_src[1] = AOUT_CHAN_RIGHT;
         }
@@ -625,16 +625,12 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
         if( i_channels_dst != i_channels_src && b_trust )
             msg_Warn( p_dec, "%d channels are dropped", i_channels_src - i_channels_dst );
 
-        p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels = i_layout_dst;
-        if (dual_mono)
-            p_dec->fmt_out.audio.i_original_channels |= AOUT_CHAN_DUALMONO;
+        p_dec->fmt_out.audio.i_physical_channels = i_layout_dst;
     }
     else
     {
         msg_Warn( p_dec, "no channel layout found");
-        p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels = 0;
+        p_dec->fmt_out.audio.i_physical_channels = 0;
         p_dec->fmt_out.audio.i_channels = p_sys->p_context->channels;
     }
 
diff --git a/modules/codec/dca.c b/modules/codec/dca.c
index bb8f96dbb2..117084188d 100644
--- a/modules/codec/dca.c
+++ b/modules/codec/dca.c
@@ -186,8 +186,7 @@ static int Decode( decoder_t *p_dec, block_t *p_in_buf )
             Duplicate( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block),
                        p_samples );
         }
-        else if ( p_dec->fmt_out.audio.i_original_channels
-                    & AOUT_CHAN_REVERSESTEREO )
+        else if ( p_dec->fmt_out.audio.i_stereo_mode & AOUT_STEREOMODE_REVERSE )
         {
             Exchange( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block),
                       p_samples );
@@ -219,18 +218,16 @@ static int channels_vlc2dca( const audio_format_t *p_audio, int *p_flags )
     switch ( p_audio->i_physical_channels & ~AOUT_CHAN_LFE )
     {
     case AOUT_CHAN_CENTER:
-        if ( (p_audio->i_original_channels & AOUT_CHAN_CENTER)
-              || (p_audio->i_original_channels
+        if ( (p_audio->i_physical_channels & AOUT_CHAN_CENTER)
+              || (p_audio->i_physical_channels
                    & (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)) )
             i_flags = DCA_MONO;
         break;
 
     case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT:
-        if ( p_audio->i_original_channels & AOUT_CHAN_DOLBYSTEREO )
+        if ( p_audio->i_stereo_mode & AOUT_STEREOMODE_DOLBY )
             i_flags = DCA_DOLBY;
-        else if ( p_audio->i_original_channels == AOUT_CHAN_CENTER )
-            i_flags = DCA_MONO;
-        else if ( p_audio->i_original_channels & AOUT_CHAN_DUALMONO )
+        else if ( p_audio->i_stereo_mode & AOUT_STEREOMODE_DUALMONO )
             i_flags = DCA_CHANNEL;
         else
             i_flags = DCA_STEREO;
@@ -277,7 +274,6 @@ static int Open( vlc_object_t *p_this )
     if( p_dec->fmt_in.i_codec != VLC_CODEC_DTS
      || p_dec->fmt_in.audio.i_rate == 0
      || p_dec->fmt_in.audio.i_physical_channels == 0
-     || p_dec->fmt_in.audio.i_original_channels == 0
      || p_dec->fmt_in.audio.i_bytes_per_frame == 0
      || p_dec->fmt_in.audio.i_frame_length == 0 )
         return VLC_EGENERIC;
diff --git a/modules/codec/dmo/dmo.c b/modules/codec/dmo/dmo.c
index 86d625e92b..790617e74b 100644
--- a/modules/codec/dmo/dmo.c
+++ b/modules/codec/dmo/dmo.c
@@ -458,8 +458,7 @@ static int DecOpen( decoder_t *p_dec )
         p_dec->fmt_out.audio.i_channels = p_dec->fmt_in.audio.i_channels;
         p_dec->fmt_out.audio.i_bitspersample = 16;//p_dec->fmt_in.audio.i_bitspersample; We request 16
         p_dec->fmt_out.audio.i_physical_channels =
-            p_dec->fmt_out.audio.i_original_channels =
-                pi_channels_maps[p_dec->fmt_out.audio.i_channels];
+            pi_channels_maps[p_dec->fmt_out.audio.i_channels];
 
         p_wf->wFormatTag = WAVE_FORMAT_PCM;
         p_wf->nSamplesPerSec = p_dec->fmt_out.audio.i_rate;
diff --git a/modules/codec/faad.c b/modules/codec/faad.c
index db0e29d158..043eaafa5a 100644
--- a/modules/codec/faad.c
+++ b/modules/codec/faad.c
@@ -132,8 +132,8 @@ static int Open( vlc_object_t *p_this )
 
     p_dec->fmt_out.i_codec = HAVE_FPU ? VLC_CODEC_FL32 : VLC_CODEC_S16N;
 
-    p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels = 0;
+    p_dec->fmt_out.audio.i_physical_channels = 0;
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
 
     if( p_dec->fmt_in.i_extra > 0 )
     {
@@ -154,7 +154,6 @@ static int Open( vlc_object_t *p_this )
         p_dec->fmt_out.audio.i_rate = i_rate;
         p_dec->fmt_out.audio.i_channels = i_channels;
         p_dec->fmt_out.audio.i_physical_channels
-            = p_dec->fmt_out.audio.i_original_channels
             = mpeg4_asc_channelsbyindex[i_channels];
         date_Init( &p_sys->date, i_rate, 1 );
     }
@@ -289,7 +288,6 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
             p_dec->fmt_out.audio.i_rate = i_rate;
             p_dec->fmt_out.audio.i_channels = i_channels;
             p_dec->fmt_out.audio.i_physical_channels
-                = p_dec->fmt_out.audio.i_original_channels
                 = mpeg4_asc_channelsbyindex[i_channels];
 
             date_Init( &p_sys->date, i_rate, 1 );
@@ -312,7 +310,6 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
         p_dec->fmt_out.audio.i_rate = i_rate;
         p_dec->fmt_out.audio.i_channels = i_channels;
         p_dec->fmt_out.audio.i_physical_channels
-            = p_dec->fmt_out.audio.i_original_channels
             = mpeg4_asc_channelsbyindex[i_channels];
         date_Init( &p_sys->date, i_rate, 1 );
     }
@@ -381,7 +378,6 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
                     p_dec->fmt_out.audio.i_rate = i_rate;
                     p_dec->fmt_out.audio.i_channels = i_channels;
                     p_dec->fmt_out.audio.i_physical_channels
-                        = p_dec->fmt_out.audio.i_original_channels
                         = mpeg4_asc_channelsbyindex[i_channels];
                     date_Init( &p_sys->date, i_rate, 1 );
                 }
@@ -501,7 +497,6 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
                                   p_dec->fmt_out.audio.i_physical_channels, pi_neworder_table );
 
 
-        p_dec->fmt_out.audio.i_original_channels = p_dec->fmt_out.audio.i_physical_channels;
         p_dec->fmt_out.audio.i_channels = popcount(p_dec->fmt_out.audio.i_physical_channels);
 
         if( !decoder_UpdateAudioFormat( p_dec ) && p_dec->fmt_out.audio.i_channels > 0 )
diff --git a/modules/codec/flac.c b/modules/codec/flac.c
index ee51e4b233..3b81423366 100644
--- a/modules/codec/flac.c
+++ b/modules/codec/flac.c
@@ -209,8 +209,7 @@ static int DecoderSetOutputFormat( unsigned i_channels, unsigned i_rate,
 
     fmt->i_channels = i_channels;
     fmt->i_rate = (i_rate > 0 ) ? i_rate : i_streaminfo_rate;
-    fmt->i_physical_channels =
-    fmt->i_original_channels = pi_channels_maps[i_channels];
+    fmt->i_physical_channels = pi_channels_maps[i_channels];
     memcpy( pi_channels_reorder, ppi_reorder[i_channels], i_channels );
     fmt->i_bitspersample = i_bitspersample;
 
@@ -373,8 +372,7 @@ static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
                         for( unsigned i=0; i<i_wfxchannels; i++ )
                             p_sys->rgi_channels_reorder[neworder[i]] = i;
 
-                        p_dec->fmt_out.audio.i_physical_channels =
-                        p_dec->fmt_out.audio.i_original_channels = i_vlcmask;
+                        p_dec->fmt_out.audio.i_physical_channels = i_vlcmask;
                         p_dec->fmt_out.audio.i_channels = i_wfxchannels;
                     }
 
@@ -489,6 +487,7 @@ static int OpenDecoder( vlc_object_t *p_this )
 
     /* Set output properties */
     p_dec->fmt_out.i_codec = VLC_CODEC_S32N;
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
 
     /* Set callbacks */
     p_dec->pf_decode = DecodeBlock;
diff --git a/modules/codec/fluidsynth.c b/modules/codec/fluidsynth.c
index 37603f180c..b2455300b2 100644
--- a/modules/codec/fluidsynth.c
+++ b/modules/codec/fluidsynth.c
@@ -171,9 +171,7 @@ static int Open (vlc_object_t *p_this)
         var_InheritInteger (p_this, "synth-sample-rate");;
     fluid_synth_set_sample_rate (p_sys->synth, p_dec->fmt_out.audio.i_rate);
     p_dec->fmt_out.audio.i_channels = 2;
-    p_dec->fmt_out.audio.i_original_channels =
-    p_dec->fmt_out.audio.i_physical_channels =
-        AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
+    p_dec->fmt_out.audio.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
     p_dec->fmt_out.i_codec = VLC_CODEC_FL32;
     p_dec->fmt_out.audio.i_bitspersample = 32;
     date_Init (&p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1);
diff --git a/modules/codec/g711.c b/modules/codec/g711.c
index 92a80606c1..cc13fbb3dd 100644
--- a/modules/codec/g711.c
+++ b/modules/codec/g711.c
@@ -197,12 +197,7 @@ static int DecoderOpen( vlc_object_t *p_this )
     else
         p_dec->fmt_out.audio.i_physical_channels =
                               pi_channels_maps[p_dec->fmt_in.audio.i_channels];
-    if( p_dec->fmt_in.audio.i_original_channels )
-        p_dec->fmt_out.audio.i_original_channels =
-                                       p_dec->fmt_in.audio.i_original_channels;
-    else
-        p_dec->fmt_out.audio.i_original_channels =
-                                      p_dec->fmt_out.audio.i_physical_channels;
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
     aout_FormatPrepare( &p_dec->fmt_out.audio );
 
     p_sys->table = table;
diff --git a/modules/codec/lpcm.c b/modules/codec/lpcm.c
index d713c2b632..de6c007518 100644
--- a/modules/codec/lpcm.c
+++ b/modules/codec/lpcm.c
@@ -413,8 +413,8 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
     }
     p_dec->fmt_out.audio.i_rate = i_rate;
     p_dec->fmt_out.audio.i_channels = i_channels;
-    p_dec->fmt_out.audio.i_original_channels = i_original_channels;
     p_dec->fmt_out.audio.i_physical_channels = i_original_channels;
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
 
     if ( p_sys->i_type == LPCM_AOB )
     {
diff --git a/modules/codec/mad.c b/modules/codec/mad.c
index 047243dd5f..194182961d 100644
--- a/modules/codec/mad.c
+++ b/modules/codec/mad.c
@@ -249,7 +249,6 @@ static int Open( vlc_object_t *p_this )
      && p_dec->fmt_in.i_codec != VLC_FOURCC('m','p','g','3') )
      || p_dec->fmt_in.audio.i_rate == 0
      || p_dec->fmt_in.audio.i_physical_channels == 0
-     || p_dec->fmt_in.audio.i_original_channels == 0
      || p_dec->fmt_in.audio.i_bytes_per_frame == 0
      || p_dec->fmt_in.audio.i_frame_length == 0 )
         return VLC_EGENERIC;
diff --git a/modules/codec/mft.c b/modules/codec/mft.c
index 8fc6ff532b..215e0fa475 100644
--- a/modules/codec/mft.c
+++ b/modules/codec/mft.c
@@ -445,7 +445,6 @@ static int SetOutputType(decoder_t *p_dec, DWORD stream_id, IMFMediaType **resul
         p_dec->fmt_out.i_codec = vlc_fourcc_GetCodecAudio(fourcc, p_dec->fmt_out.audio.i_bitspersample);
 
         p_dec->fmt_out.audio.i_physical_channels = pi_channels_maps[p_dec->fmt_out.audio.i_channels];
-        p_dec->fmt_out.audio.i_original_channels = p_dec->fmt_out.audio.i_physical_channels;
     }
 
     *result = output_media_type;
diff --git a/modules/codec/mpg123.c b/modules/codec/mpg123.c
index 4ab9d6cd5f..ed2db8dc38 100644
--- a/modules/codec/mpg123.c
+++ b/modules/codec/mpg123.c
@@ -168,24 +168,21 @@ static int UpdateAudioFormat( decoder_t *p_dec )
 
     switch( frame_info.mode )
     {
+        case MPG123_M_DUAL:
+            /* fall through */
+            p_dec->fmt_out.audio.i_stereo_mode = AOUT_STEREOMODE_DUALMONO;
         case MPG123_M_STEREO:
         case MPG123_M_JOINT:
-            p_dec->fmt_out.audio.i_original_channels =
+            p_dec->fmt_out.audio.i_physical_channels =
                 AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
             break;
-        case MPG123_M_DUAL:
-            p_dec->fmt_out.audio.i_original_channels =
-                AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_DUALMONO;
-            break;
         case MPG123_M_MONO:
-            p_dec->fmt_out.audio.i_original_channels = AOUT_CHAN_CENTER;
+            p_dec->fmt_out.audio.i_physical_channels = AOUT_CHAN_CENTER;
             break;
         default:
             return VLC_EGENERIC;
     }
 
-    p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels & AOUT_CHAN_PHYSMASK;
     aout_FormatPrepare( &p_dec->fmt_out.audio );
 
     /* Date management */
diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c
index 3373a7293e..f7a6027a1b 100644
--- a/modules/codec/omxil/mediacodec.c
+++ b/modules/codec/omxil/mediacodec.c
@@ -1077,7 +1077,6 @@ static int Audio_ProcessOutput(decoder_t *p_dec, mc_api_out *p_out,
             msg_Warn(p_dec, "need channel extraction: %d -> %d",
                      p_sys->audio.i_channels, i_channels_dst);
 
-        p_dec->fmt_out.audio.i_original_channels =
         p_dec->fmt_out.audio.i_physical_channels = i_layout_dst;
         aout_FormatPrepare(&p_dec->fmt_out.audio);
 
diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c
index b8812a95fc..619e90a280 100644
--- a/modules/codec/omxil/omxil.c
+++ b/modules/codec/omxil/omxil.c
@@ -717,8 +717,7 @@ static OMX_ERRORTYPE GetPortDefinition(decoder_t *p_dec, OmxPort *p_port,
                 | AOUT_CHAN_LFE
             };
             p_fmt->audio.i_physical_channels =
-                p_fmt->audio.i_original_channels =
-                    pi_channels_maps[p_fmt->audio.i_channels];
+                pi_channels_maps[p_fmt->audio.i_channels];
         }
 
         date_Init( &p_dec->p_sys->end_date, p_fmt->audio.i_rate, 1 );
diff --git a/modules/codec/opus.c b/modules/codec/opus.c
index 22d40949d7..7d354a8973 100644
--- a/modules/codec/opus.c
+++ b/modules/codec/opus.c
@@ -337,8 +337,7 @@ static int ProcessInitialHeader( decoder_t *p_dec, ogg_packet *p_oggpacket )
 
     /* Setup the format */
     p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels =
-            pi_channels_maps[p_header->channels];
+        pi_channels_maps[p_header->channels];
     p_dec->fmt_out.audio.i_channels = p_header->channels;
     p_dec->fmt_out.audio.i_rate = 48000;
 
diff --git a/modules/codec/speex.c b/modules/codec/speex.c
index aa18d112e7..9c90b473a0 100644
--- a/modules/codec/speex.c
+++ b/modules/codec/speex.c
@@ -225,6 +225,7 @@ static int OpenDecoder( vlc_object_t *p_this )
 
     /* Set output properties */
     p_dec->fmt_out.i_codec = VLC_CODEC_S16N;
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
 
     /*
       Set callbacks
@@ -548,8 +549,7 @@ static int ProcessInitialHeader( decoder_t *p_dec, ogg_packet *p_oggpacket )
 
     /* Setup the format */
     p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels =
-            pi_channels_maps[p_header->nb_channels];
+        pi_channels_maps[p_header->nb_channels];
     p_dec->fmt_out.audio.i_channels = p_header->nb_channels;
     p_dec->fmt_out.audio.i_rate = p_header->rate;
 
@@ -718,7 +718,6 @@ static int DecodeRtpSpeexPacket( decoder_t *p_dec, block_t *p_speex_bit_block )
 
         p_dec->fmt_out.audio.i_channels = p_sys->p_header->nb_channels;
         p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels =
             pi_channels_maps[p_sys->p_header->nb_channels];
         p_dec->fmt_out.audio.i_rate = p_sys->p_header->rate;
 
diff --git a/modules/codec/uleaddvaudio.c b/modules/codec/uleaddvaudio.c
index b6bff684e9..627ea4efa7 100644
--- a/modules/codec/uleaddvaudio.c
+++ b/modules/codec/uleaddvaudio.c
@@ -167,8 +167,8 @@ static int Open(vlc_object_t *object)
     es_format_Init(&dec->fmt_out, AUDIO_ES, VLC_CODEC_S16N);
     dec->fmt_out.audio.i_rate = dec->fmt_in.audio.i_rate;
     dec->fmt_out.audio.i_channels = 2;
-    dec->fmt_out.audio.i_physical_channels =
-    dec->fmt_out.audio.i_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
+    dec->fmt_out.audio.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
+    dec->fmt_out.audio.i_stereo_mode = dec->fmt_in.audio.i_stereo_mode;
 
     dec->pf_decode = DecodeAudio;
     dec->pf_flush  = Flush;
diff --git a/modules/codec/vorbis.c b/modules/codec/vorbis.c
index 592354d9ce..7aab7f8dbe 100644
--- a/modules/codec/vorbis.c
+++ b/modules/codec/vorbis.c
@@ -259,6 +259,7 @@ static int OpenDecoder( vlc_object_t *p_this )
 #else
     p_dec->fmt_out.i_codec = VLC_CODEC_FL32;
 #endif
+    p_dec->fmt_out.audio.i_stereo_mode = p_dec->fmt_in.audio.i_stereo_mode;
 
     /* Set callbacks */
     p_dec->pf_decode     = DecodeAudio;
@@ -390,7 +391,6 @@ static int ProcessHeaders( decoder_t *p_dec )
     }
 
     p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels =
             pi_channels_maps[p_sys->vi.channels];
     p_dec->fmt_out.i_bitrate = __MAX( 0, (int32_t) p_sys->vi.bitrate_nominal );
 
diff --git a/modules/codec/wmafixed/wma.c b/modules/codec/wmafixed/wma.c
index 1d65b89174..a1b7124f1c 100644
--- a/modules/codec/wmafixed/wma.c
+++ b/modules/codec/wmafixed/wma.c
@@ -148,9 +148,8 @@ static int OpenDecoder( vlc_object_t *p_this )
     assert( p_dec->fmt_out.audio.i_channels <
         ( sizeof( pi_channels_maps ) / sizeof( pi_channels_maps[0] ) ) );
 
-    p_dec->fmt_out.audio.i_original_channels =
-        p_dec->fmt_out.audio.i_physical_channels =
-            pi_channels_maps[p_dec->fmt_out.audio.i_channels];
+    p_dec->fmt_out.audio.i_physical_channels =
+        pi_channels_maps[p_dec->fmt_out.audio.i_channels];
 
     /* aout core assumes this number is not 0 and uses it in divisions */
     assert( p_dec->fmt_out.audio.i_physical_channels != 0 );
diff --git a/modules/demux/mkv/matroska_segment_parse.cpp b/modules/demux/mkv/matroska_segment_parse.cpp
index d640bc4b29..9e42a256fe 100644
--- a/modules/demux/mkv/matroska_segment_parse.cpp
+++ b/modules/demux/mkv/matroska_segment_parse.cpp
@@ -1557,8 +1557,7 @@ int32_t matroska_segment_c::TrackInit( mkv_track_t * p_tk )
                                 i_channel_mask,
                                 p_tk->pi_chan_table );
 
-                            p_tk->fmt.audio.i_physical_channels =
-                            p_tk->fmt.audio.i_original_channels = i_channel_mask;
+                            p_tk->fmt.audio.i_physical_channels = i_channel_mask;
                         }
                     }
                 }
diff --git a/modules/demux/mp4/essetup.c b/modules/demux/mp4/essetup.c
index 86d718e779..74359a4022 100644
--- a/modules/demux/mp4/essetup.c
+++ b/modules/demux/mp4/essetup.c
@@ -1105,8 +1105,7 @@ int SetupAudioES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample )
             {
                 p_track->b_chans_reorder = true;
                 p_track->fmt.audio.i_channels = i_channels;
-                p_track->fmt.audio.i_physical_channels =
-                p_track->fmt.audio.i_original_channels = i_vlc_mapping;
+                p_track->fmt.audio.i_physical_channels = i_vlc_mapping;
             }
 
         }
diff --git a/modules/demux/ogg.c b/modules/demux/ogg.c
index 8c4c9df0b3..66575c976c 100644
--- a/modules/demux/ogg.c
+++ b/modules/demux/ogg.c
@@ -189,8 +189,7 @@ static void fill_channels_info(audio_format_t *audio)
 
     unsigned chans = audio->i_channels;
     if (chans < sizeof(pi_channels_map) / sizeof(pi_channels_map[0]))
-        audio->i_physical_channels =
-        audio->i_original_channels = pi_channels_map[chans];
+        audio->i_physical_channels = pi_channels_map[chans];
 }
 
 /* Special TS value: don't send or derive any pts/pcr from it.
diff --git a/modules/demux/wav.c b/modules/demux/wav.c
index d48ca384a4..f490039908 100644
--- a/modules/demux/wav.c
+++ b/modules/demux/wav.c
@@ -310,8 +310,7 @@ static int Open( vlc_object_t * p_this )
                  p_sys->i_channel_mask, p_sys->i_chans_to_reorder );
     }
 
-    p_sys->fmt.audio.i_physical_channels =
-    p_sys->fmt.audio.i_original_channels = p_sys->i_channel_mask;
+    p_sys->fmt.audio.i_physical_channels = p_sys->i_channel_mask;
 
     if( p_sys->fmt.i_extra > 0 )
     {
diff --git a/modules/packetizer/a52.c b/modules/packetizer/a52.c
index 41a4a9955c..c4c5abd4b5 100644
--- a/modules/packetizer/a52.c
+++ b/modules/packetizer/a52.c
@@ -103,9 +103,8 @@ static block_t *GetOutBuffer( decoder_t *p_dec )
         p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->frame.i_size;
     p_dec->fmt_out.audio.i_frame_length = p_sys->frame.i_samples;
 
-    p_dec->fmt_out.audio.i_original_channels = p_sys->frame.i_channels_conf;
-    p_dec->fmt_out.audio.i_physical_channels =
-        p_sys->frame.i_channels_conf & AOUT_CHAN_PHYSMASK;
+    p_dec->fmt_out.audio.i_stereo_mode = p_sys->frame.i_stereo_mode;
+    p_dec->fmt_out.audio.i_physical_channels = p_sys->frame.i_channels_conf;
 
     p_dec->fmt_out.i_bitrate = p_sys->frame.i_bitrate;
 
diff --git a/modules/packetizer/a52.h b/modules/packetizer/a52.h
index 3faf24320b..00152bf017 100644
--- a/modules/packetizer/a52.h
+++ b/modules/packetizer/a52.h
@@ -44,6 +44,7 @@ typedef struct
 
     unsigned int i_channels;
     unsigned int i_channels_conf;
+    unsigned int i_stereo_mode;
     unsigned int i_rate;
     unsigned int i_bitrate;
 
@@ -153,13 +154,16 @@ static inline int vlc_a52_header_ParseAc3( vlc_a52_header_t *p_header,
     const uint8_t i_lfeon = bs_read( &s, 1 );
 
     p_header->i_channels_conf = p_acmod[i_acmod];
+    p_header->i_stereo_mode = 0;
     if( i_dsurmod == 2 )
-        p_header->i_channels_conf |= AOUT_CHAN_DOLBYSTEREO;
+        p_header->i_stereo_mode |= AOUT_STEREOMODE_DOLBY;
+    if( i_acmod == 0 )
+        p_header->i_stereo_mode |= AOUT_STEREOMODE_DUALMONO;
+
     if( i_lfeon )
         p_header->i_channels_conf |= AOUT_CHAN_LFE;
 
-    p_header->i_channels = popcount(p_header->i_channels_conf
-                                    & AOUT_CHAN_PHYSMASK);
+    p_header->i_channels = popcount(p_header->i_channels_conf);
 
     const unsigned i_rate_shift = VLC_CLIP(i_bsid, 8, 11) - 8;
     p_header->i_bitrate = (pi_frmsizcod_bitrates[i_frmsizcod >> 1] * 1000)
@@ -214,10 +218,12 @@ static inline int vlc_a52_header_ParseEac3( vlc_a52_header_t *p_header,
     const unsigned i_lfeon = bs_read1( &s );
 
     p_header->i_channels_conf = p_acmod[i_acmod];
+    p_header->i_stereo_mode = 0;
+    if( i_acmod == 0 )
+        p_header->i_stereo_mode |= AOUT_STEREOMODE_DUALMONO;
     if( i_lfeon )
         p_header->i_channels_conf |= AOUT_CHAN_LFE;
-    p_header->i_channels = popcount( p_header->i_channels_conf
-                                     & AOUT_CHAN_PHYSMASK );
+    p_header->i_channels = popcount( p_header->i_channels_conf );
     p_header->i_bitrate = 8 * p_header->i_size * p_header->i_rate
                         / (p_header->i_blocks_per_sync_frame * 256);
     p_header->i_samples = p_header->i_blocks_per_sync_frame * 256;
@@ -236,7 +242,7 @@ static inline int vlc_a52_header_Parse( vlc_a52_header_t *p_header,
                                         const uint8_t *p_buffer, int i_buffer )
 {
     static const uint32_t p_acmod[8] = {
-        AOUT_CHANS_2_0 | AOUT_CHAN_DUALMONO,
+        AOUT_CHANS_2_0,
         AOUT_CHAN_CENTER,
         AOUT_CHANS_2_0,
         AOUT_CHANS_3_0,
diff --git a/modules/packetizer/dts.c b/modules/packetizer/dts.c
index 12ec0a6708..09e83e80e9 100644
--- a/modules/packetizer/dts.c
+++ b/modules/packetizer/dts.c
@@ -102,9 +102,8 @@ static block_t *GetOutBuffer( decoder_t *p_dec )
         p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->dts.i_frame_size;
     p_dec->fmt_out.audio.i_frame_length = p_sys->dts.i_frame_length;
 
-    p_dec->fmt_out.audio.i_original_channels = p_sys->dts.i_original_channels;
-    p_dec->fmt_out.audio.i_physical_channels = 
-        p_sys->dts.i_original_channels & AOUT_CHAN_PHYSMASK;
+    p_dec->fmt_out.audio.i_stereo_mode = p_sys->dts.i_stereo_mode;
+    p_dec->fmt_out.audio.i_physical_channels = p_sys->dts.i_physical_channels;
     p_dec->fmt_out.audio.i_channels =
         popcount( p_dec->fmt_out.audio.i_physical_channels );
 
diff --git a/modules/packetizer/dts_header.c b/modules/packetizer/dts_header.c
index 8074a627d3..1c3e9c5b3c 100644
--- a/modules/packetizer/dts_header.c
+++ b/modules/packetizer/dts_header.c
@@ -162,7 +162,8 @@ static unsigned int dca_get_bitrate( uint8_t i_rate )
     return p_dca_bitrates[i_rate];
 }
 
-static uint32_t dca_get_channels( uint8_t i_amode, bool b_lfe )
+static uint16_t dca_get_channels( uint8_t i_amode, bool b_lfe,
+                                  uint16_t *p_stereo_mode )
 {
     /* See ETSI TS 102 114, table 5-4
      * 00: A
@@ -183,59 +184,60 @@ static uint32_t dca_get_channels( uint8_t i_amode, bool b_lfe )
      * 0F: CL + C + CR + L + R + SL + S + SR
      * 10-3F: user defined */
 
-    uint32_t i_original_channels;
+    uint16_t i_physical_channels;
 
     switch( i_amode )
     {
         case 0x0:
-            i_original_channels = AOUT_CHAN_CENTER;
+            i_physical_channels = AOUT_CHAN_CENTER;
             break;
         case 0x1:
-            i_original_channels = AOUT_CHANS_FRONT | AOUT_CHAN_DUALMONO;
+            i_physical_channels = AOUT_CHANS_FRONT;
+            *p_stereo_mode = AOUT_STEREOMODE_DUALMONO;
             break;
         case 0x2:
         case 0x3:
         case 0x4:
-            i_original_channels = AOUT_CHANS_FRONT;
+            i_physical_channels = AOUT_CHANS_FRONT;
             break;
         case 0x5:
-            i_original_channels = AOUT_CHANS_3_0;
+            i_physical_channels = AOUT_CHANS_3_0;
             break;
         case 0x6:
-            i_original_channels = AOUT_CHANS_FRONT | AOUT_CHAN_REARCENTER;
+            i_physical_channels = AOUT_CHANS_FRONT | AOUT_CHAN_REARCENTER;
             break;
         case 0x7:
-            i_original_channels = AOUT_CHANS_4_CENTER_REAR;
+            i_physical_channels = AOUT_CHANS_4_CENTER_REAR;
             break;
         case 0x8:
-            i_original_channels = AOUT_CHANS_4_0;
+            i_physical_channels = AOUT_CHANS_4_0;
             break;
         case 0x9:
-            i_original_channels = AOUT_CHANS_5_0;
+            i_physical_channels = AOUT_CHANS_5_0;
             break;
         case 0xA:
         case 0xB:
-            i_original_channels = AOUT_CHANS_6_0;
+            i_physical_channels = AOUT_CHANS_6_0;
             break;
         case 0xC:
-            i_original_channels = AOUT_CHANS_CENTER | AOUT_CHANS_FRONT
+            i_physical_channels = AOUT_CHANS_CENTER | AOUT_CHANS_FRONT
                                 | AOUT_CHANS_REAR;
             break;
         case 0xD:
-            i_original_channels = AOUT_CHANS_7_0;
+            i_physical_channels = AOUT_CHANS_7_0;
             break;
         case 0xE:
         case 0xF:
             /* FIXME: AOUT_CHANS_8_0 */
-            i_original_channels = AOUT_CHANS_7_0;
+            i_physical_channels = AOUT_CHANS_7_0;
             break;
         default:
             return 0;
     }
     if (b_lfe)
-        i_original_channels |= AOUT_CHAN_LFE;
+        i_physical_channels |= AOUT_CHAN_LFE;
 
-    return i_original_channels;
+    return i_physical_channels;
 }
 
 static int dts_header_ParseSubstream( vlc_dts_header_t *p_header,
@@ -290,10 +292,12 @@ static int dts_header_ParseCore( vlc_dts_header_t *p_header,
                                     : ( i_fsize + 1 ) * 16 / 14;
     /* See ETSI TS 102 114, table 5-2 */
     p_header->i_frame_length = (i_nblks + 1) * 32;
-    p_header->i_original_channels = dca_get_channels( i_amode, b_lfe );
+    p_header->i_stereo_mode = 0;
+    p_header->i_physical_channels =
+        dca_get_channels( i_amode, b_lfe, &p_header->i_stereo_mode );
 
     if( !p_header->i_rate || !p_header->i_frame_size ||
-        !p_header->i_frame_length || !p_header->i_original_channels )
+        !p_header->i_frame_length || !p_header->i_physical_channels )
         return VLC_EGENERIC;
 
     return VLC_SUCCESS;
diff --git a/modules/packetizer/dts_header.h b/modules/packetizer/dts_header.h
index c5740559a7..71fe1b048a 100644
--- a/modules/packetizer/dts_header.h
+++ b/modules/packetizer/dts_header.h
@@ -31,7 +31,8 @@ typedef struct
     unsigned int    i_bitrate;
     unsigned int    i_frame_size;
     unsigned int    i_frame_length;
-    uint32_t        i_original_channels;
+    uint16_t        i_physical_channels;
+    uint16_t        i_stereo_mode;
 } vlc_dts_header_t;
 
 int     vlc_dts_header_Parse( vlc_dts_header_t *p_header,
diff --git a/modules/packetizer/flac.c b/modules/packetizer/flac.c
index eca86fa505..309804a289 100644
--- a/modules/packetizer/flac.c
+++ b/modules/packetizer/flac.c
@@ -763,8 +763,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
         p_sys->i_frame_size = 0;
 
         p_dec->fmt_out.audio.i_channels = p_sys->i_channels;
-        p_dec->fmt_out.audio.i_physical_channels =
-        p_dec->fmt_out.audio.i_original_channels = pi_channels_maps[p_sys->stream_info.channels];
+        p_dec->fmt_out.audio.i_physical_channels = pi_channels_maps[p_sys->stream_info.channels];
 
         /* So p_block doesn't get re-added several times */
         if ( pp_block )
diff --git a/modules/packetizer/mlp.c b/modules/packetizer/mlp.c
index 389fefe687..e16aca157c 100644
--- a/modules/packetizer/mlp.c
+++ b/modules/packetizer/mlp.c
@@ -431,7 +431,6 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
 
             p_dec->fmt_out.audio.i_rate     = p_sys->mlp.i_rate;
             p_dec->fmt_out.audio.i_channels = p_sys->mlp.i_channels;
-            p_dec->fmt_out.audio.i_original_channels = p_sys->mlp.i_channels_conf;
             p_dec->fmt_out.audio.i_physical_channels = p_sys->mlp.i_channels_conf;
             p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->i_frame_size;
             p_dec->fmt_out.audio.i_frame_length = p_sys->mlp.i_samples;
diff --git a/modules/packetizer/mpeg4audio.c b/modules/packetizer/mpeg4audio.c
index 45ff7e2af7..bb7e5663a5 100644
--- a/modules/packetizer/mpeg4audio.c
+++ b/modules/packetizer/mpeg4audio.c
@@ -978,7 +978,6 @@ static void SetupOutput(decoder_t *p_dec, block_t *p_block)
     p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
 
 #if 0
-    p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
     p_dec->fmt_out.audio.i_physical_channels = p_sys->i_channels_conf;
 #endif
 
diff --git a/modules/packetizer/mpegaudio.c b/modules/packetizer/mpegaudio.c
index 66137c0006..8df8da6c13 100644
--- a/modules/packetizer/mpegaudio.c
+++ b/modules/packetizer/mpegaudio.c
@@ -62,7 +62,7 @@ struct decoder_sys_t
     mtime_t i_pts;
 
     int i_frame_size, i_free_frame_size;
-    unsigned int i_channels_conf, i_channels;
+    unsigned int i_channels_conf, i_stereo_mode, i_channels;
     unsigned int i_rate, i_max_frame_size, i_frame_length;
     unsigned int i_layer, i_bit_rate;
 
@@ -128,9 +128,8 @@ static uint8_t *GetOutBuffer( decoder_t *p_dec, block_t **pp_out_buffer )
     p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
     p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->i_max_frame_size;
 
-    p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
-    p_dec->fmt_out.audio.i_physical_channels =
-        p_sys->i_channels_conf & AOUT_CHAN_PHYSMASK;
+    p_dec->fmt_out.audio.i_physical_channels = p_sys->i_channels_conf;
+    p_dec->fmt_out.audio.i_stereo_mode = p_sys->i_stereo_mode;
 
     p_dec->fmt_out.i_bitrate = p_sys->i_bit_rate * 1000;
 
@@ -151,6 +150,7 @@ static uint8_t *GetOutBuffer( decoder_t *p_dec, block_t **pp_out_buffer )
  *****************************************************************************/
 static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
                      unsigned int * pi_channels_conf,
+                     unsigned int * pi_stereo_mode,
                      unsigned int * pi_sample_rate, unsigned int * pi_bit_rate,
                      unsigned int * pi_frame_length,
                      unsigned int * pi_max_frame_size, unsigned int * pi_layer)
@@ -205,6 +205,7 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
     i_mode      = (i_header & 0xc0) >> 6;
     /* Modeext, copyright & original */
     i_emphasis  = i_header & 0x3;
+    *pi_stereo_mode = 0;
 
     if( *pi_layer != 4 &&
         i_bitrate_index < 0x0f &&
@@ -213,16 +214,14 @@ static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
     {
         switch ( i_mode )
         {
+        case 2: /* dual-mono */
+            *pi_stereo_mode = AOUT_STEREOMODE_DUALMONO;
+            /* fall through */
         case 0: /* stereo */
         case 1: /* joint stereo */
             *pi_channels = 2;
             *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
             break;
-        case 2: /* dual-mono */
-            *pi_channels = 2;
-            *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
-                                | AOUT_CHAN_DUALMONO;
-            break;
         case 3: /* mono */
             *pi_channels = 1;
             *pi_channels_conf = AOUT_CHAN_CENTER;
@@ -379,6 +378,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             p_sys->i_frame_size = SyncInfo( i_header,
                                             &p_sys->i_channels,
                                             &p_sys->i_channels_conf,
+                                            &p_sys->i_stereo_mode,
                                             &p_sys->i_rate,
                                             &p_sys->i_bit_rate,
                                             &p_sys->i_frame_length,
@@ -427,7 +427,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             {
                 /* Startcode is fine, let's try the header as an extra check */
                 int i_next_frame_size;
-                unsigned int i_next_channels, i_next_channels_conf;
+                unsigned int i_next_channels, i_next_stereo_mode, i_next_channels_conf;
                 unsigned int i_next_rate, i_next_bit_rate;
                 unsigned int i_next_frame_length, i_next_max_frame_size;
                 unsigned int i_next_layer;
@@ -438,6 +438,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                 i_next_frame_size = SyncInfo( i_header,
                                               &i_next_channels,
                                               &i_next_channels_conf,
+                                              &i_next_stereo_mode,
                                               &i_next_rate,
                                               &i_next_bit_rate,
                                               &i_next_frame_length,
@@ -473,6 +474,7 @@ static block_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
                 /* Check info is in sync with previous one */
                 if( i_next_channels_conf != p_sys->i_channels_conf ||
+                    i_next_stereo_mode != p_sys->i_stereo_mode ||
                     i_next_rate != p_sys->i_rate ||
                     i_next_layer != p_sys->i_layer ||
                     i_next_frame_length != p_sys->i_frame_length )
@@ -630,9 +632,9 @@ static int Open( vlc_object_t *p_this )
     p_sys->b_discontinuity = false;
     p_sys->i_frame_size = 0;
 
-    p_sys->i_channels_conf = p_sys->i_channels = p_sys->i_rate =
-    p_sys->i_max_frame_size = p_sys->i_frame_length = p_sys->i_layer =
-    p_sys->i_bit_rate = 0;
+    p_sys->i_channels_conf = p_sys->i_stereo_mode = p_sys->i_channels =
+    p_sys->i_rate = p_sys->i_max_frame_size = p_sys->i_frame_length =
+    p_sys->i_layer = p_sys->i_bit_rate = 0;
 
     /* Set output properties */
     p_dec->fmt_out.i_codec = VLC_CODEC_MPGA;
diff --git a/modules/stream_out/transcode/audio.c b/modules/stream_out/transcode/audio.c
index 6279a77fa8..4fc5f88118 100644
--- a/modules/stream_out/transcode/audio.c
+++ b/modules/stream_out/transcode/audio.c
@@ -120,12 +120,10 @@ static int transcode_audio_initialize_encoder( sout_stream_id_sys_t *id, sout_st
 
     /* Fix input format */
     id->p_encoder->fmt_in.audio.i_format = id->p_encoder->fmt_in.i_codec;
-    if( !id->p_encoder->fmt_in.audio.i_physical_channels
-     || !id->p_encoder->fmt_in.audio.i_original_channels )
+    if( !id->p_encoder->fmt_in.audio.i_physical_channels )
     {
         if( id->p_encoder->fmt_in.audio.i_channels < (sizeof(pi_channels_maps) / sizeof(*pi_channels_maps)) )
             id->p_encoder->fmt_in.audio.i_physical_channels =
-            id->p_encoder->fmt_in.audio.i_original_channels =
                       pi_channels_maps[id->p_encoder->fmt_in.audio.i_channels];
     }
     aout_FormatPrepare( &id->p_encoder->fmt_in.audio );
@@ -265,10 +263,6 @@ int transcode_audio_process( sout_stream_t *p_stream,
             id->p_encoder->fmt_out.audio.i_channels = p_sys->i_channels > 0 ?
                 p_sys->i_channels : id->p_decoder->fmt_out.audio.i_channels;
 
-            id->p_encoder->fmt_in.audio.i_original_channels =
-            id->p_encoder->fmt_out.audio.i_original_channels =
-                id->p_decoder->fmt_out.audio.i_physical_channels;
-
             id->p_encoder->fmt_in.audio.i_physical_channels =
             id->p_encoder->fmt_out.audio.i_physical_channels =
                 pi_channels_maps[id->p_encoder->fmt_out.audio.i_channels];
@@ -388,10 +382,6 @@ bool transcode_audio_add( sout_stream_t *p_stream, const es_format_t *p_fmt,
     id->p_encoder->fmt_out.audio.i_channels = p_sys->i_channels > 0 ?
         p_sys->i_channels : p_fmt->audio.i_channels;
 
-    id->p_encoder->fmt_in.audio.i_original_channels =
-    id->p_encoder->fmt_out.audio.i_original_channels =
-        id->p_decoder->fmt_out.audio.i_physical_channels;
-
     id->p_encoder->fmt_in.audio.i_physical_channels =
     id->p_encoder->fmt_out.audio.i_physical_channels =
             pi_channels_maps[id->p_encoder->fmt_out.audio.i_channels];
diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h
index 4088d1a956..0f1ec8e9c0 100644
--- a/src/audio_output/aout_internal.h
+++ b/src/audio_output/aout_internal.h
@@ -162,7 +162,6 @@ static inline void aout_SetWavePhysicalChannels(audio_sample_format_t *fmt)
     fmt->i_physical_channels = 0;
     for (int i = 0; i < fmt->i_channels && i < AOUT_CHAN_MAX; ++i)
         fmt->i_physical_channels |= wave_channels[i];
-    fmt->i_original_channels = fmt->i_physical_channels;
     aout_FormatPrepare(fmt);
 }
 
diff --git a/src/audio_output/common.c b/src/audio_output/common.c
index 55b1550017..8a4fc84dc6 100644
--- a/src/audio_output/common.c
+++ b/src/audio_output/common.c
@@ -110,31 +110,31 @@ const char * aout_FormatPrintChannels( const audio_sample_format_t * p_format )
     case AOUT_CHAN_LEFT:
     case AOUT_CHAN_RIGHT:
     case AOUT_CHAN_CENTER:
-        if ( (p_format->i_original_channels & AOUT_CHAN_CENTER)
-              || (p_format->i_original_channels
+        if ( (p_format->i_physical_channels & AOUT_CHAN_CENTER)
+              || (p_format->i_physical_channels
                    & (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)) )
             return "Mono";
-        else if ( p_format->i_original_channels & AOUT_CHAN_LEFT )
+        else if ( p_format->i_physical_channels & AOUT_CHAN_LEFT )
             return "Left";
         return "Right";
     case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT:
-        if ( p_format->i_original_channels & AOUT_CHAN_REVERSESTEREO )
+        if ( p_format->i_stereo_mode & AOUT_STEREOMODE_REVERSE )
         {
-            if ( p_format->i_original_channels & AOUT_CHAN_DOLBYSTEREO )
+            if ( p_format->i_stereo_mode & AOUT_STEREOMODE_DOLBY )
                 return "Dolby/Reverse";
             return "Stereo/Reverse";
         }
         else
         {
-            if ( p_format->i_original_channels & AOUT_CHAN_DOLBYSTEREO )
+            if ( p_format->i_stereo_mode & AOUT_STEREOMODE_DOLBY )
                 return "Dolby";
-            else if ( p_format->i_original_channels & AOUT_CHAN_DUALMONO )
+            else if ( p_format->i_stereo_mode & AOUT_STEREOMODE_DUALMONO )
                 return "Dual-mono";
-            else if ( p_format->i_original_channels == AOUT_CHAN_CENTER )
+            else if ( p_format->i_physical_channels == AOUT_CHAN_CENTER )
                 return "Stereo/Mono";
-            else if ( !(p_format->i_original_channels & AOUT_CHAN_RIGHT) )
+            else if ( !(p_format->i_physical_channels & AOUT_CHAN_RIGHT) )
                 return "Stereo/Left";
-            else if ( !(p_format->i_original_channels & AOUT_CHAN_LEFT) )
+            else if ( !(p_format->i_physical_channels & AOUT_CHAN_LEFT) )
                 return "Stereo/Right";
             return "Stereo";
         }
@@ -159,23 +159,23 @@ const char * aout_FormatPrintChannels( const audio_sample_format_t * p_format )
         return "3F2M";
 
     case AOUT_CHAN_CENTER | AOUT_CHAN_LFE:
-        if ( (p_format->i_original_channels & AOUT_CHAN_CENTER)
-              || (p_format->i_original_channels
+        if ( (p_format->i_physical_channels & AOUT_CHAN_CENTER)
+              || (p_format->i_physical_channels
                    & (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)) )
             return "Mono/LFE";
-        else if ( p_format->i_original_channels & AOUT_CHAN_LEFT )
+        else if ( p_format->i_physical_channels & AOUT_CHAN_LEFT )
             return "Left/LFE";
         return "Right/LFE";
     case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_LFE:
-        if ( p_format->i_original_channels & AOUT_CHAN_DOLBYSTEREO )
+        if ( p_format->i_stereo_mode & AOUT_STEREOMODE_DOLBY )
             return "Dolby/LFE";
-        else if ( p_format->i_original_channels & AOUT_CHAN_DUALMONO )
+        else if ( p_format->i_stereo_mode & AOUT_STEREOMODE_DUALMONO )
             return "Dual-mono/LFE";
-        else if ( p_format->i_original_channels == AOUT_CHAN_CENTER )
+        else if ( p_format->i_physical_channels == AOUT_CHAN_CENTER )
             return "Mono/LFE";
-        else if ( !(p_format->i_original_channels & AOUT_CHAN_RIGHT) )
+        else if ( !(p_format->i_physical_channels & AOUT_CHAN_RIGHT) )
             return "Stereo/Left/LFE";
-        else if ( !(p_format->i_original_channels & AOUT_CHAN_LEFT) )
+        else if ( !(p_format->i_physical_channels & AOUT_CHAN_LEFT) )
             return "Stereo/Right/LFE";
          return "Stereo/LFE";
     case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER | AOUT_CHAN_LFE:
diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c
index 9944d0f2e0..e8da499e92 100644
--- a/src/audio_output/filters.c
+++ b/src/audio_output/filters.c
@@ -153,7 +153,7 @@ static int aout_FiltersPipelineCreate(vlc_object_t *obj, filter_t **filters,
 
     /* Remix channels */
     if (infmt->i_physical_channels != outfmt->i_physical_channels
-     || infmt->i_original_channels != outfmt->i_original_channels)
+     || infmt->i_stereo_mode != outfmt->i_stereo_mode)
     {   /* Remixing currently requires FL32... TODO: S16N */
         if (input.i_format != VLC_CODEC_FL32)
         {
@@ -178,7 +178,7 @@ static int aout_FiltersPipelineCreate(vlc_object_t *obj, filter_t **filters,
         output.i_format = input.i_format;
         output.i_rate = input.i_rate;
         output.i_physical_channels = outfmt->i_physical_channels;
-        output.i_original_channels = outfmt->i_original_channels;
+        output.i_stereo_mode = outfmt->i_stereo_mode;
         aout_FormatPrepare (&output);
 
         filter_t *f = FindConverter (obj, &input, &output);
diff --git a/src/audio_output/output.c b/src/audio_output/output.c
index 59d2cb121d..af39018dd9 100644
--- a/src/audio_output/output.c
+++ b/src/audio_output/output.c
@@ -392,30 +392,29 @@ int aout_OutputNew (audio_output_t *aout, audio_sample_format_t *restrict fmt)
     switch (var_GetInteger (aout, "stereo-mode"))
     {
         case AOUT_VAR_CHAN_RSTEREO:
-            fmt->i_original_channels |= AOUT_CHAN_REVERSESTEREO;
+            fmt->i_stereo_mode = AOUT_STEREOMODE_REVERSE;
             break;
         case AOUT_VAR_CHAN_STEREO:
-            fmt->i_original_channels = AOUT_CHANS_STEREO;
+            fmt->i_stereo_mode = 0;
             break;
         case AOUT_VAR_CHAN_LEFT:
-            fmt->i_original_channels = AOUT_CHAN_LEFT;
+            fmt->i_stereo_mode = AOUT_STEREOMODE_LEFT;
             break;
         case AOUT_VAR_CHAN_RIGHT:
-            fmt->i_original_channels = AOUT_CHAN_RIGHT;
+            fmt->i_stereo_mode = AOUT_STEREOMODE_RIGHT;
             break;
         case AOUT_VAR_CHAN_DOLBYS:
-            fmt->i_original_channels = AOUT_CHANS_STEREO|AOUT_CHAN_DOLBYSTEREO;
+            fmt->i_stereo_mode = AOUT_STEREOMODE_DOLBY;
             break;
         default:
         {
-            if ((fmt->i_original_channels & AOUT_CHAN_PHYSMASK)
-                                                          != AOUT_CHANS_STEREO)
+            if (fmt->i_physical_channels != AOUT_CHANS_STEREO)
                  break;
 
             vlc_value_t val, txt;
             val.i_int = 0;
             var_Change (aout, "stereo-mode", VLC_VAR_DELCHOICE, &val, NULL);
-            if (fmt->i_original_channels & AOUT_CHAN_DOLBYSTEREO)
+            if (fmt->i_stereo_mode & AOUT_STEREOMODE_DOLBY)
             {
                 val.i_int = AOUT_VAR_CHAN_DOLBYS;
                 txt.psz_string = _("Dolby Surround");
@@ -430,9 +429,9 @@ int aout_OutputNew (audio_output_t *aout, audio_sample_format_t *restrict fmt)
             val.i_int = AOUT_VAR_CHAN_LEFT;
             txt.psz_string = _("Left");
             var_Change (aout, "stereo-mode", VLC_VAR_ADDCHOICE, &val, &txt);
-            if (fmt->i_original_channels & AOUT_CHAN_DUALMONO)
+            if (fmt->i_stereo_mode & AOUT_STEREOMODE_DUALMONO)
             {   /* Go directly to the left channel. */
-                fmt->i_original_channels = AOUT_CHAN_LEFT;
+                fmt->i_stereo_mode = AOUT_STEREOMODE_LEFT;
                 var_Change (aout, "stereo-mode", VLC_VAR_SETVALUE, &val, NULL);
             }
             val.i_int = AOUT_VAR_CHAN_RIGHT;
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 9678a1ed5f..c9c0633c9b 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -346,19 +346,12 @@ static int aout_update_format( decoder_t *p_dec )
 
         const int i_force_dolby = var_InheritInteger( p_dec, "force-dolby-surround" );
         if( i_force_dolby &&
-            (format.i_original_channels&AOUT_CHAN_PHYSMASK) ==
-                (AOUT_CHAN_LEFT|AOUT_CHAN_RIGHT) )
+            format.i_physical_channels == (AOUT_CHAN_LEFT|AOUT_CHAN_RIGHT) )
         {
             if( i_force_dolby == 1 )
-            {
-                format.i_original_channels = format.i_original_channels |
-                                             AOUT_CHAN_DOLBYSTEREO;
-            }
+                format.i_stereo_mode |= AOUT_STEREOMODE_DOLBY;
             else /* i_force_dolby == 2 */
-            {
-                format.i_original_channels = format.i_original_channels &
-                                             ~AOUT_CHAN_DOLBYSTEREO;
-            }
+                format.i_stereo_mode &= ~AOUT_STEREOMODE_DOLBY;
         }
 
         aout_request_vout_t request_vout = {
diff --git a/src/misc/es_format.c b/src/misc/es_format.c
index a436599058..a3a7ee8921 100644
--- a/src/misc/es_format.c
+++ b/src/misc/es_format.c
@@ -583,7 +583,7 @@ bool es_format_IsSimilar( const es_format_t *p_fmt1, const es_format_t *p_fmt2 )
         if( a1.i_rate != a2.i_rate ||
             a1.i_channels != a2.i_channels ||
             a1.i_physical_channels != a2.i_physical_channels ||
-            a1.i_original_channels != a2.i_original_channels )
+            a1.i_stereo_mode != a2.i_stereo_mode )
             return false;
         return true;
     }
-- 
2.11.0



More information about the vlc-devel mailing list