[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