I forgot some stuff. Patch description follows:

This patch for qtpalette.c and qtpalette.h adds 1-bit video to the
"palettized video" category, since if the video sample description
contains a palette, the two colors in the palette can be any color, not
necessarily black & white.
Unfortunately, I've noticed that the qtrle (QuickTime Animation) decoder
blindly assumes that 1-bit video is black & white. I don't have enough
knowledge about the decoder to fix this, though.

Below is a link to a sample 1-bit QuickTime Animation clip of a rotating
earth that uses blueish colors, and they will be correctly rendered in
QuickTime, but not in FFmpeg (which will use black & white).

https://drive.google.com/open?id=0B3_pEBoLs0faUlItWm9KaGJSTEE

Mats

--
Mats Peterson
http://matsp888.no-ip.org/~mats/
>From 64dbe9e1555513d5ba3fc03951711ffb6c51b008 Mon Sep 17 00:00:00 2001
From: Mats Peterson <matsp...@yahoo.com>
Date: Tue, 29 Dec 2015 07:35:00 +0100
Subject: [PATCH v2] lavf/qtpalette: Treat 1-bit video as palettized

I forgot some stuff. Patch description follows:

This patch for qtpalette.c and qtpalette.h adds 1-bit video to the
"palettized video" category, since if the video sample description
contains a palette, the two colors in the palette can be any color, not
necessarily black & white.

Unfortunately, I've noticed that the qtrle (QuickTime Animation) decoder
blindly assumes that 1-bit video is black & white. I don't have enough
knowledge about the decoder to fix this, though.

Below is a link to a sample 1-bit QuickTime Animation clip of a rotating
earth that uses blueish colors, and they will be correctly rendered in
QuickTime, but not in FFmpeg (which will use black & white).

https://drive.google.com/open?id=0B3_pEBoLs0faUlItWm9KaGJSTEE

Mats


---
 libavformat/qtpalette.c |    8 +++++---
 libavformat/qtpalette.h |    5 +++++
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/libavformat/qtpalette.c b/libavformat/qtpalette.c
index 770df56..6544a55 100644
--- a/libavformat/qtpalette.c
+++ b/libavformat/qtpalette.c
@@ -46,8 +46,8 @@ int ff_get_qtpalette(int codec_id, AVIOContext *pb, uint32_t *palette)
     if (greyscale && codec_id == AV_CODEC_ID_CINEPAK)
         return 0;
 
-    /* If the depth is 2, 4, or 8 bpp, file is palettized. */
-    if ((bit_depth == 2 || bit_depth == 4 || bit_depth == 8)) {
+    /* If the depth is 1, 2, 4, or 8 bpp, file is palettized. */
+    if ((bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8)) {
         int color_count, color_start, color_end;
         uint32_t a, r, g, b;
 
@@ -70,7 +70,9 @@ int ff_get_qtpalette(int codec_id, AVIOContext *pb, uint32_t *palette)
              * color table */
             const uint8_t *color_table;
             color_count = 1 << bit_depth;
-            if (bit_depth == 2)
+            if (bit_depth == 1)
+                color_table = ff_qt_default_palette_2;
+            else if (bit_depth == 2)
                 color_table = ff_qt_default_palette_4;
             else if (bit_depth == 4)
                 color_table = ff_qt_default_palette_16;
diff --git a/libavformat/qtpalette.h b/libavformat/qtpalette.h
index da83421..b2bd360 100644
--- a/libavformat/qtpalette.h
+++ b/libavformat/qtpalette.h
@@ -26,6 +26,11 @@
 #include <stdint.h>
 #include "avformat.h"
 
+static const uint8_t ff_qt_default_palette_2[2 * 3] = {
+  0xFF, 0xFF, 0xFF,
+  0x00, 0x00, 0x00
+};
+
 static const uint8_t ff_qt_default_palette_4[4 * 3] = {
   0x93, 0x65, 0x5E,
   0xFF, 0xFF, 0xFF,
-- 
1.7.10.4

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to