On Sunday 01 March 2015 11:22:10 am Michael Niedermayer wrote: > On Sun, Mar 01, 2015 at 09:44:30AM +0100, Carl Eugen Hoyos wrote: > > Attached untested patch should fix compilation on broken platforms. > > We don't use round() currently because it appears less portable than > > lrintf().
> yes reducing float code usage should be fine, less potential to > cause problems with regression tests New patch attached. Please review, Carl Eugen
diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c index 9fd8eef..b6eedde 100644 --- a/libavcodec/pngenc.c +++ b/libavcodec/pngenc.c @@ -231,78 +231,77 @@ 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; } static int png_get_gama(enum AVColorTransferCharacteristic trc, uint8_t *buf) { - double gamma; + int gamma; switch (trc) { case AVCOL_TRC_BT709: case AVCOL_TRC_SMPTE170M: case AVCOL_TRC_SMPTE240M: case AVCOL_TRC_BT1361_ECG: case AVCOL_TRC_BT2020_10: case AVCOL_TRC_BT2020_12: /* these share a segmented TRC, but gamma 1.961 is a close approximation, and also more correct for decoding content */ - gamma = 1.961; + gamma = 50994; // 100000 / 1.961 break; case AVCOL_TRC_GAMMA22: case AVCOL_TRC_IEC61966_2_1: - gamma = 2.2; + gamma = 45455; // 100000 / 2.2 break; case AVCOL_TRC_GAMMA28: - gamma = 2.8; + gamma = 35714; // 100000 / 2.8 break; case AVCOL_TRC_LINEAR: - gamma = 1.0; + gamma = 100000; break; default: return 0; } - AV_WB32_PNG(buf, 1.0 / gamma); + AV_WB32(buf, gamma); return 1; }
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel