[FFmpeg-cvslog] avformat/fitsenc: write DATAMIN/DATAMAX to encoded output

Paul B Mahol git at videolan.org
Wed Feb 10 01:08:58 EET 2021


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon Feb  8 18:46:36 2021 +0100| [e0fd35d867752e6fcc7329a7d4f5e5fc619f2634] | committer: Paul B Mahol

avformat/fitsenc: write DATAMIN/DATAMAX to encoded output

There is no point in doing normalization when such files are decoded.

Update fate test with new results.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e0fd35d867752e6fcc7329a7d4f5e5fc619f2634
---

 libavformat/fitsenc.c         | 39 +++++++++++++++++++++++++++++----------
 tests/ref/fate/fits-demux     | 10 +++++-----
 tests/ref/fate/fitsdec-gray   |  2 +-
 tests/ref/lavf/gbrap.fits     |  2 +-
 tests/ref/lavf/gbrap16be.fits |  2 +-
 tests/ref/lavf/gbrp.fits      |  2 +-
 tests/ref/lavf/gbrp16be.fits  |  2 +-
 tests/ref/lavf/gray.fits      |  2 +-
 tests/ref/lavf/gray16be.fits  |  4 ++--
 9 files changed, 42 insertions(+), 23 deletions(-)

diff --git a/libavformat/fitsenc.c b/libavformat/fitsenc.c
index cc3999aa8a..212c769df1 100644
--- a/libavformat/fitsenc.c
+++ b/libavformat/fitsenc.c
@@ -45,7 +45,8 @@ static int fits_write_header(AVFormatContext *s)
  * @param lines_written to keep track of lines written so far
  * @return 0
  */
-static int write_keyword_value(AVFormatContext *s, const char *keyword, int value, int *lines_written)
+static int write_keyword_value(AVFormatContext *s, const char *fmt,
+                               const char *keyword, void *value, int *lines_written)
 {
     int len, ret;
     uint8_t header[80];
@@ -57,7 +58,12 @@ static int write_keyword_value(AVFormatContext *s, const char *keyword, int valu
     header[8] = '=';
     header[9] = ' ';
 
-    ret = snprintf(header + 10, 70, "%d", value);
+    if (!strcmp(fmt, "%d")) {
+        ret = snprintf(header + 10, 70, fmt, *(int *)value);
+    } else {
+        ret = snprintf(header + 10, 70, fmt, *(float *)value);
+    }
+
     memset(&header[ret + 10], ' ', sizeof(header) - (ret + 10));
 
     avio_write(s->pb, header, sizeof(header));
@@ -72,16 +78,22 @@ static int write_image_header(AVFormatContext *s)
     FITSContext *fitsctx = s->priv_data;
     uint8_t buffer[80];
     int bitpix, naxis, naxis3 = 1, bzero = 0, rgb = 0, lines_written = 0, lines_left;
+    int pcount = 0, gcount = 1;
+    float datamax, datamin;
 
     switch (encctx->format) {
         case AV_PIX_FMT_GRAY8:
             bitpix = 8;
             naxis = 2;
+            datamin = 0;
+            datamax = 255;
             break;
         case AV_PIX_FMT_GRAY16BE:
             bitpix = 16;
             naxis = 2;
             bzero = 32768;
+            datamin = 0;
+            datamax = 65535;
             break;
         case AV_PIX_FMT_GBRP:
         case AV_PIX_FMT_GBRAP:
@@ -93,6 +105,8 @@ static int write_image_header(AVFormatContext *s)
             } else {
                 naxis3 = 4;
             }
+            datamin = 0;
+            datamax = 255;
             break;
         case AV_PIX_FMT_GBRP16BE:
         case AV_PIX_FMT_GBRAP16BE:
@@ -105,6 +119,8 @@ static int write_image_header(AVFormatContext *s)
                 naxis3 = 4;
             }
             bzero = 32768;
+            datamin = 0;
+            datamax = 65535;
             break;
         default:
             return AVERROR(EINVAL);
@@ -122,28 +138,31 @@ static int write_image_header(AVFormatContext *s)
     }
     lines_written++;
 
-    write_keyword_value(s, "BITPIX", bitpix, &lines_written);         // no of bits per pixel
-    write_keyword_value(s, "NAXIS", naxis, &lines_written);           // no of dimensions of image
-    write_keyword_value(s, "NAXIS1", encctx->width, &lines_written);   // first dimension i.e. width
-    write_keyword_value(s, "NAXIS2", encctx->height, &lines_written);  // second dimension i.e. height
+    write_keyword_value(s, "%d", "BITPIX", &bitpix, &lines_written);         // no of bits per pixel
+    write_keyword_value(s, "%d", "NAXIS", &naxis, &lines_written);           // no of dimensions of image
+    write_keyword_value(s, "%d", "NAXIS1", &encctx->width, &lines_written);   // first dimension i.e. width
+    write_keyword_value(s, "%d", "NAXIS2", &encctx->height, &lines_written);  // second dimension i.e. height
 
     if (rgb)
-        write_keyword_value(s, "NAXIS3", naxis3, &lines_written);     // third dimension to store RGBA planes
+        write_keyword_value(s, "%d", "NAXIS3", &naxis3, &lines_written);     // third dimension to store RGBA planes
 
     if (!fitsctx->first_image) {
-        write_keyword_value(s, "PCOUNT", 0, &lines_written);
-        write_keyword_value(s, "GCOUNT", 1, &lines_written);
+        write_keyword_value(s, "%d", "PCOUNT", &pcount, &lines_written);
+        write_keyword_value(s, "%d", "GCOUNT", &gcount, &lines_written);
     } else {
         fitsctx->first_image = 0;
     }
 
+    write_keyword_value(s, "%g", "DATAMIN", &datamin, &lines_written);
+    write_keyword_value(s, "%g", "DATAMAX", &datamax, &lines_written);
+
     /*
      * Since FITS does not support unsigned 16 bit integers,
      * BZERO = 32768 is used to store unsigned 16 bit integers as
      * signed integers so that it can be read properly.
      */
     if (bitpix == 16)
-        write_keyword_value(s, "BZERO", bzero, &lines_written);
+        write_keyword_value(s, "%d", "BZERO", &bzero, &lines_written);
 
     if (rgb) {
         memcpy(buffer, "CTYPE3  = 'RGB     '", 20);
diff --git a/tests/ref/fate/fits-demux b/tests/ref/fate/fits-demux
index 85605ab11a..de7aa11d5d 100644
--- a/tests/ref/fate/fits-demux
+++ b/tests/ref/fate/fits-demux
@@ -3,8 +3,8 @@
 #codec_id 0: fits
 #dimensions 0: 72x36
 #sar 0: 0/1
-0,          0,          0,        1,    14320, 0x0ecf72e0
-0,          1,          1,        1,    14320, 0xd94af6eb
-0,          2,          2,        1,    14320, 0x15c21892
-0,          3,          3,        1,    14320, 0xb18adc01
-0,          4,          4,        1,    14320, 0xc2be706d
+0,          0,          0,        1,    14320, 0xa9ee75a4
+0,          1,          1,        1,    14320, 0xb9daf9af
+0,          2,          2,        1,    14320, 0xf6431b56
+0,          3,          3,        1,    14320, 0x921adec5
+0,          4,          4,        1,    14320, 0xa34e7331
diff --git a/tests/ref/fate/fitsdec-gray b/tests/ref/fate/fitsdec-gray
index d080732452..488ee71022 100644
--- a/tests/ref/fate/fitsdec-gray
+++ b/tests/ref/fate/fitsdec-gray
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 0/1
-0,          0,          0,        1,    16384, 0x353dbacd
+0,          0,          0,        1,    16384, 0xeff50901
diff --git a/tests/ref/lavf/gbrap.fits b/tests/ref/lavf/gbrap.fits
index 57c71e179d..4662c3e6cc 100644
--- a/tests/ref/lavf/gbrap.fits
+++ b/tests/ref/lavf/gbrap.fits
@@ -1,3 +1,3 @@
-28eb102547b82acca57ef097a6c639d8 *tests/data/lavf/lavf.gbrap.fits
+d953a6a2c719de9d922d0624a7eb796b *tests/data/lavf/lavf.gbrap.fits
 10224000 tests/data/lavf/lavf.gbrap.fits
 tests/data/lavf/lavf.gbrap.fits CRC=0x883af247
diff --git a/tests/ref/lavf/gbrap16be.fits b/tests/ref/lavf/gbrap16be.fits
index 030a6d90ed..7206d242cd 100644
--- a/tests/ref/lavf/gbrap16be.fits
+++ b/tests/ref/lavf/gbrap16be.fits
@@ -1,3 +1,3 @@
-ff5fb24a67aeabd4f56088ca8b03d8b0 *tests/data/lavf/lavf.gbrap16be.fits
+e9a04d25104fc43ddc62b58eb33ecd08 *tests/data/lavf/lavf.gbrap16be.fits
 20376000 tests/data/lavf/lavf.gbrap16be.fits
 tests/data/lavf/lavf.gbrap16be.fits CRC=0xa981271b
diff --git a/tests/ref/lavf/gbrp.fits b/tests/ref/lavf/gbrp.fits
index 2b60ddb336..54c239687e 100644
--- a/tests/ref/lavf/gbrp.fits
+++ b/tests/ref/lavf/gbrp.fits
@@ -1,3 +1,3 @@
-dae49b5f6eb58981ba91e3e108355717 *tests/data/lavf/lavf.gbrp.fits
+3952247f7f9669f968826c909852bbd7 *tests/data/lavf/lavf.gbrp.fits
 7704000 tests/data/lavf/lavf.gbrp.fits
 tests/data/lavf/lavf.gbrp.fits CRC=0x80745c5e
diff --git a/tests/ref/lavf/gbrp16be.fits b/tests/ref/lavf/gbrp16be.fits
index 9aa9db60a2..5bec5e80f9 100644
--- a/tests/ref/lavf/gbrp16be.fits
+++ b/tests/ref/lavf/gbrp16be.fits
@@ -1,3 +1,3 @@
-693ea80c33eb9b348db27a0bc4a5cc8a *tests/data/lavf/lavf.gbrp16be.fits
+caf72fec125df9c7a1d59c9d1bc70b80 *tests/data/lavf/lavf.gbrp16be.fits
 15336000 tests/data/lavf/lavf.gbrp16be.fits
 tests/data/lavf/lavf.gbrp16be.fits CRC=0x9573fb2b
diff --git a/tests/ref/lavf/gray.fits b/tests/ref/lavf/gray.fits
index ce6783b7c1..410467506f 100644
--- a/tests/ref/lavf/gray.fits
+++ b/tests/ref/lavf/gray.fits
@@ -1,3 +1,3 @@
-d76b46a5a336b56f73451817cdf3897c *tests/data/lavf/lavf.gray.fits
+e690dc6db533b87f5f843737007ed070 *tests/data/lavf/lavf.gray.fits
 2664000 tests/data/lavf/lavf.gray.fits
 tests/data/lavf/lavf.gray.fits CRC=0x7aa0122f
diff --git a/tests/ref/lavf/gray16be.fits b/tests/ref/lavf/gray16be.fits
index 058fa4ad19..a0526f3db8 100644
--- a/tests/ref/lavf/gray16be.fits
+++ b/tests/ref/lavf/gray16be.fits
@@ -1,3 +1,3 @@
-15e85a553bbd07783f92377ed369308b *tests/data/lavf/lavf.gray16be.fits
+262658f437a256cd843db2b401bc20a9 *tests/data/lavf/lavf.gray16be.fits
 5184000 tests/data/lavf/lavf.gray16be.fits
-tests/data/lavf/lavf.gray16be.fits CRC=0x8cdcbeb2
+tests/data/lavf/lavf.gray16be.fits CRC=0x737e8998



More information about the ffmpeg-cvslog mailing list