---
 libswscale/swscale.c          |    3 +--
 libswscale/swscale_internal.h |   13 ++++---------
 libswscale/swscale_unscaled.c |    6 +++---
 libswscale/utils.c            |    4 +++-
 4 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 98daf22..514a291 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -2862,8 +2862,7 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
         }
     }
 
-    if (!(isGray(srcFormat) || isGray(c->dstFormat) ||
-          srcFormat == PIX_FMT_MONOBLACK || srcFormat == PIX_FMT_MONOWHITE))
+    if (!(isGray(srcFormat) || isGray(c->dstFormat)))
         c->needs_hcscale = 1;
 }
 
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index 7bfdc7e..d952859 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -552,18 +552,13 @@ const char *sws_format_name(enum PixelFormat format);
 #define isRGB(x) \
     (av_pix_fmt_descriptors[x].flags & PIX_FMT_RGB)
 
-#if 0 // FIXME
 #define isGray(x) \
     (!(av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL) && \
      av_pix_fmt_descriptors[x].nb_components <= 2)
-#else
-#define isGray(x)       (           \
-           (x)==PIX_FMT_GRAY8       \
-        || (x)==PIX_FMT_Y400A      \
-        || (x)==PIX_FMT_GRAY16BE    \
-        || (x)==PIX_FMT_GRAY16LE    \
-    )
-#endif
+
+#define isGrayMod8(x) \
+    (isGray(x) && \
+     (av_pix_fmt_descriptors[x].comp[0].depth_minus1 & 7) == 7)
 
 #define isRGBinInt(x)   (           \
            (x)==PIX_FMT_RGB48BE     \
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 86bc5ac..f9017dc 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -754,9 +754,9 @@ void ff_get_unscaled_swscale(SwsContext *c)
     if (  srcFormat == dstFormat
         || (srcFormat == PIX_FMT_YUVA420P && dstFormat == PIX_FMT_YUV420P)
         || (srcFormat == PIX_FMT_YUV420P && dstFormat == PIX_FMT_YUVA420P)
-        || (isPlanarYUV(srcFormat) && isGray(dstFormat))
-        || (isPlanarYUV(dstFormat) && isGray(srcFormat))
-        || (isGray(dstFormat) && isGray(srcFormat))
+        || (isPlanarYUV(srcFormat) && isGrayMod8(dstFormat))
+        || (isPlanarYUV(dstFormat) && isGrayMod8(srcFormat))
+        || (isGrayMod8(dstFormat) && isGrayMod8(srcFormat))
         || (isPlanarYUV(srcFormat) && isPlanarYUV(dstFormat)
             && c->chrDstHSubSample == c->chrSrcHSubSample
             && c->chrDstVSubSample == c->chrSrcVSubSample
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 7a96986..385b558 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -698,7 +698,9 @@ int sws_setColorspaceDetails(struct SwsContext *c, const 
int inv_table[4],
     c->saturation= saturation;
     c->srcRange  = srcRange;
     c->dstRange  = dstRange;
-    if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;
+    // FIXME the isGrayMod8 here is silly, we're creating (and using)
+    // rgb tables for monowhite/monoblack output
+    if (isYUV(c->dstFormat) || isGrayMod8(c->dstFormat)) return -1;
 
     c->dstFormatBpp = 
av_get_bits_per_pixel(&av_pix_fmt_descriptors[c->dstFormat]);
     c->srcFormatBpp = 
av_get_bits_per_pixel(&av_pix_fmt_descriptors[c->srcFormat]);
-- 
1.7.2.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to