It addes support PAL8 pixel format for APNG-picture.
The picture is http://littlesvr.ca/apng/samples.html (clock)
It is a qualification task of GSoC 2015 (mentor is Paul B Mahol)
---
libavcodec/pngdec.c | 58 +
1 file changed, 36 insertions(+), 22 deletions(-)
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 901abae..7dbf28a 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -877,7 +877,8 @@ static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s,
return ls;
if (s-blend_op == APNG_BLEND_OP_OVER
-avctx-pix_fmt != AV_PIX_FMT_RGBA avctx-pix_fmt != AV_PIX_FMT_ARGB) {
+avctx-pix_fmt != AV_PIX_FMT_RGBA avctx-pix_fmt != AV_PIX_FMT_ARGB
+avctx-pix_fmt != AV_PIX_FMT_PAL8) {
avpriv_request_sample(avctx, Blending with pixel format %s,
av_get_pix_fmt_name(avctx-pix_fmt));
return AVERROR_PATCHWELCOME;
@@ -897,43 +898,56 @@ static int handle_p_frame_apng(AVCodecContext *avctx, PNGDecContext *s,
uint8_t ri, gi, bi, ai;
pd_last_region += s-y_offset * s-image_linesize;
-if (avctx-pix_fmt == AV_PIX_FMT_RGBA) {
+switch(avctx-pix_fmt)
+{
+case AV_PIX_FMT_RGBA:
ri = 0;
gi = 1;
bi = 2;
ai = 3;
-} else {
+break;
+case AV_PIX_FMT_ARGB:
ri = 3;
gi = 2;
bi = 1;
ai = 0;
+break;
+case AV_PIX_FMT_PAL8:
+memcpy(s-palette, p-data[1], 256 * sizeof(uint32_t));
+break;
}
for (j = s-y_offset; j s-y_offset + s-cur_h; j++) {
i = s-x_offset * s-bpp;
+
if (i)
memcpy(pd, pd_last, i);
-for (; i (s-x_offset + s-cur_w) * s-bpp; i += s-bpp) {
-uint8_t alpha = pd[i+ai];
-
-/* output = alpha * foreground + (1-alpha) * background */
-switch (alpha) {
-case 0:
-pd[i+ri] = pd_last_region[i+ri];
-pd[i+gi] = pd_last_region[i+gi];
-pd[i+bi] = pd_last_region[i+bi];
-pd[i+ai] = 0xff;
-break;
-case 255:
-break;
-default:
-pd[i+ri] = FAST_DIV255(alpha * pd[i+ri] + (255 - alpha) * pd_last_region[i+ri]);
-pd[i+gi] = FAST_DIV255(alpha * pd[i+gi] + (255 - alpha) * pd_last_region[i+gi]);
-pd[i+bi] = FAST_DIV255(alpha * pd[i+bi] + (255 - alpha) * pd_last_region[i+bi]);
-pd[i+ai] = 0xff;
-break;
+
+if (avctx-pix_fmt != AV_PIX_FMT_PAL8) {
+for (; i (s-x_offset + s-cur_w) * s-bpp; i += s-bpp) {
+uint8_t alpha = pd[i+ai];
+/* output = alpha * foreground + (1-alpha) * background */
+switch (alpha) {
+case 0:
+pd[i+ri] = pd_last_region[i+ri];
+pd[i+gi] = pd_last_region[i+gi];
+pd[i+bi] = pd_last_region[i+bi];
+pd[i+ai] = 0xff;
+break;
+case 255:
+break;
+default:
+pd[i+ri] = FAST_DIV255(alpha * pd[i+ri] + (255 - alpha) * pd_last_region[i+ri]);
+pd[i+gi] = FAST_DIV255(alpha * pd[i+gi] + (255 - alpha) * pd_last_region[i+gi]);
+pd[i+bi] = FAST_DIV255(alpha * pd[i+bi] + (255 - alpha) * pd_last_region[i+bi]);
+pd[i+ai] = 0xff;
+break;
+}
}
}
+else
+i = (s-x_offset + s-cur_w) * s-bpp;
+
if (ls - i)
memcpy(pd+i, pd_last+i, ls - i);
pd += s-image_linesize;
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel