[FFmpeg-devel] [RFC]Don't use round when encoding png
Carl Eugen Hoyos
cehoyos at ag.or.at
Sun Mar 1 09:44:30 CET 2015
Hi!
Attached untested patch should fix compilation on broken platforms.
We don't use round() currently because it appears less portable than
lrintf().
Please comment, Carl Eugen
-------------- next part --------------
diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c
index 9fd8eef..2826f36 100644
--- a/libavcodec/pngenc.c
+++ b/libavcodec/pngenc.c
@@ -231,46 +231,45 @@ static int png_write_row(PNGEncContext *s, const uint8_t *data, int size)
return 0;
}
-#define AV_WB32_PNG(buf, n) (AV_WB32(buf, round((n) * 100000)))
static int png_get_chrm(enum AVColorPrimaries prim, uint8_t *buf)
{
- double rx, ry, gx, gy, bx, by, wx = 0.3127, wy = 0.3290;
+ int rx, ry, gx, gy, bx, by, wx = 312700, wy = 329000;
switch (prim) {
case AVCOL_PRI_BT709:
- rx = 0.640; ry = 0.330;
- gx = 0.300; gy = 0.600;
- bx = 0.150; by = 0.060;
+ rx = 64000; ry = 33000;
+ gx = 30000; gy = 60000;
+ bx = 15000; by = 6000;
break;
case AVCOL_PRI_BT470M:
- rx = 0.670; ry = 0.330;
- gx = 0.210; gy = 0.710;
- bx = 0.140; by = 0.080;
- wx = 0.310; wy = 0.316;
+ rx = 67000; ry = 33000;
+ gx = 21000; gy = 71000;
+ bx = 14000; by = 8000;
+ wx = 31000; wy = 31600;
break;
case AVCOL_PRI_BT470BG:
- rx = 0.640; ry = 0.330;
- gx = 0.290; gy = 0.600;
- bx = 0.150; by = 0.060;
+ rx = 64000; ry = 33000;
+ gx = 29000; gy = 60000;
+ bx = 15000; by = 06000;
break;
case AVCOL_PRI_SMPTE170M:
case AVCOL_PRI_SMPTE240M:
- rx = 0.630; ry = 0.340;
- gx = 0.310; gy = 0.595;
- bx = 0.155; by = 0.070;
+ rx = 63000; ry = 34000;
+ gx = 31000; gy = 59500;
+ bx = 15500; by = 7000;
break;
case AVCOL_PRI_BT2020:
- rx = 0.708; ry = 0.292;
- gx = 0.170; gy = 0.797;
- bx = 0.131; by = 0.046;
+ rx = 70800; ry = 29200;
+ gx = 17000; gy = 79700;
+ bx = 13100; by = 4600;
break;
default:
return 0;
}
- AV_WB32_PNG(buf , wx); AV_WB32_PNG(buf + 4 , wy);
- AV_WB32_PNG(buf + 8 , rx); AV_WB32_PNG(buf + 12, ry);
- AV_WB32_PNG(buf + 16, gx); AV_WB32_PNG(buf + 20, gy);
- AV_WB32_PNG(buf + 24, bx); AV_WB32_PNG(buf + 28, by);
+ AV_WB32(buf , wx); AV_WB32(buf + 4 , wy);
+ AV_WB32(buf + 8 , rx); AV_WB32(buf + 12, ry);
+ AV_WB32(buf + 16, gx); AV_WB32(buf + 20, gy);
+ AV_WB32(buf + 24, bx); AV_WB32(buf + 28, by);
return 1;
}
@@ -302,7 +301,7 @@ static int png_get_gama(enum AVColorTransferCharacteristic trc, uint8_t *buf)
return 0;
}
- AV_WB32_PNG(buf, 1.0 / gamma);
+ AV_WB32(buf, lrintf(100000.0 / gamma ));
return 1;
}
More information about the ffmpeg-devel
mailing list