diff --git a/libavresample/audio_convert.c b/libavresample/audio_convert.c
index e68d5727f48a1c1621ba796cebd994532a8842cc..c3e9aa3da9b954a2fdec4be382fd89e49888f2a0 100644
--- a/libavresample/audio_convert.c
+++ b/libavresample/audio_convert.c
@@ -288,8 +288,8 @@ AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr,
         return ac;
     }
 
-    in_planar  = av_sample_fmt_is_planar(in_fmt);
-    out_planar = av_sample_fmt_is_planar(out_fmt);
+    in_planar  = ff_sample_fmt_is_planar(in_fmt, channels);
+    out_planar = ff_sample_fmt_is_planar(out_fmt, channels);
 
     if (in_planar == out_planar) {
         ac->func_type = CONV_FUNC_TYPE_FLAT;
diff --git a/libavresample/audio_data.c b/libavresample/audio_data.c
index 1521d7e2d1227b374a09cc1cde51ad57f182b425..c2f545013c57d77eea037f214d85af03606866cc 100644
--- a/libavresample/audio_data.c
+++ b/libavresample/audio_data.c
@@ -48,6 +48,14 @@ static void calc_ptr_alignment(AudioData *a)
     a->ptr_align = min_align;
 }
 
+int ff_sample_fmt_is_planar(enum AVSampleFormat sample_fmt, int channels)
+{
+    if (channels == 1)
+        return 1;
+    else
+        return av_sample_fmt_is_planar(sample_fmt);
+}
+
 int ff_audio_data_set_channels(AudioData *a, int channels)
 {
     if (channels < 1 || channels > AVRESAMPLE_MAX_CHANNELS ||
@@ -81,7 +89,7 @@ int ff_audio_data_init(AudioData *a, uint8_t **src, int plane_size, int channels
         av_log(a, AV_LOG_ERROR, "invalid sample format\n");
         return AVERROR(EINVAL);
     }
-    a->is_planar = av_sample_fmt_is_planar(sample_fmt);
+    a->is_planar = ff_sample_fmt_is_planar(sample_fmt, channels);
     a->planes    = a->is_planar ? channels : 1;
     a->stride    = a->sample_size * (a->is_planar ? 1 : channels);
 
@@ -125,7 +133,7 @@ AudioData *ff_audio_data_alloc(int channels, int nb_samples,
         av_free(a);
         return NULL;
     }
-    a->is_planar = av_sample_fmt_is_planar(sample_fmt);
+    a->is_planar = ff_sample_fmt_is_planar(sample_fmt, channels);
     a->planes    = a->is_planar ? channels : 1;
     a->stride    = a->sample_size * (a->is_planar ? 1 : channels);
 
diff --git a/libavresample/audio_data.h b/libavresample/audio_data.h
index b2b8bdddac8417a7388c7cd6ae2379af81477278..b50bd40600a1aa090a824de1721865ad8539dff0 100644
--- a/libavresample/audio_data.h
+++ b/libavresample/audio_data.h
@@ -29,6 +29,8 @@
 #include "avresample.h"
 #include "internal.h"
 
+int ff_sample_fmt_is_planar(enum AVSampleFormat sample_fmt, int channels);
+
 /**
  * Audio buffer used for intermediate storage between conversion phases.
  */
diff --git a/libavresample/utils.c b/libavresample/utils.c
index 48874d6103c72d756e4a6da138d64e272d448690..f4eb66684e04132047cb0f2a2ac436e3b7348628 100644
--- a/libavresample/utils.c
+++ b/libavresample/utils.c
@@ -101,16 +101,10 @@ int avresample_open(AVAudioResampleContext *avr)
                av_get_sample_fmt_name(avr->internal_sample_fmt));
     }
 
-    /* treat all mono as planar for easier comparison */
-    if (avr->in_channels == 1)
-        avr->in_sample_fmt = av_get_planar_sample_fmt(avr->in_sample_fmt);
-    if (avr->out_channels == 1)
-        avr->out_sample_fmt = av_get_planar_sample_fmt(avr->out_sample_fmt);
-
     /* we may need to add an extra conversion in order to remap channels if
        the output format is not planar */
     if (avr->use_channel_map && !avr->mixing_needed && !avr->resample_needed &&
-        !av_sample_fmt_is_planar(avr->out_sample_fmt)) {
+        !ff_sample_fmt_is_planar(avr->out_sample_fmt, avr->out_channels)) {
         avr->internal_sample_fmt = av_get_planar_sample_fmt(avr->out_sample_fmt);
     }
 
@@ -119,7 +113,7 @@ int avresample_open(AVAudioResampleContext *avr)
         avr->in_convert_needed = avr->in_sample_fmt != avr->internal_sample_fmt;
     else
         avr->in_convert_needed = avr->use_channel_map &&
-                                 !av_sample_fmt_is_planar(avr->out_sample_fmt);
+                                 !ff_sample_fmt_is_planar(avr->out_sample_fmt, avr->out_channels);
 
     if (avr->resample_needed || avr->mixing_needed || avr->in_convert_needed)
         avr->out_convert_needed = avr->internal_sample_fmt != avr->out_sample_fmt;