From: Niklas Haas <g...@haasn.dev>

PNG always uses straight alpha.
---
 libavcodec/pngdec.c | 5 +++++
 libavcodec/pngenc.c | 6 ++++++
 2 files changed, 11 insertions(+)

diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index b9c997ab0e..d2a61d3bce 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -875,6 +875,11 @@ static int decode_idat_chunk(AVCodecContext *avctx, 
PNGDecContext *s,
             s->bpp += byte_depth;
         }
 
+        /* PNG spec mandates independent alpha channel */
+        if (s->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+            s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+            avctx->alpha_mode = AVALPHA_MODE_STRAIGHT;
+
         ff_progress_frame_unref(&s->picture);
         if (s->dispose_op == APNG_DISPOSE_OP_PREVIOUS) {
             /* We only need a buffer for the current picture. */
diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c
index 37e8d5bfcf..1818edcf4f 100644
--- a/libavcodec/pngenc.c
+++ b/libavcodec/pngenc.c
@@ -1241,6 +1241,9 @@ const FFCodec ff_png_encoder = {
         AV_PIX_FMT_GRAY16BE, AV_PIX_FMT_YA16BE,
         AV_PIX_FMT_MONOBLACK, AV_PIX_FMT_NONE
     },
+    .alpha_modes    = (const enum AVAlphaMode[]) {
+        AVALPHA_MODE_STRAIGHT, AVALPHA_MODE_UNSPECIFIED
+    },
     .p.priv_class   = &pngenc_class,
     .caps_internal  = FF_CODEC_CAP_ICC_PROFILES,
 };
@@ -1264,6 +1267,9 @@ const FFCodec ff_apng_encoder = {
         AV_PIX_FMT_GRAY16BE, AV_PIX_FMT_YA16BE,
         AV_PIX_FMT_NONE
     },
+    .alpha_modes    = (const enum AVAlphaMode[]) {
+        AVALPHA_MODE_STRAIGHT, AVALPHA_MODE_UNSPECIFIED
+    },
     .p.priv_class   = &pngenc_class,
     .caps_internal  = FF_CODEC_CAP_ICC_PROFILES,
 };
-- 
2.47.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to