summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2021-02-08 18:46:36 +0100
committerPaul B Mahol <onemda@gmail.com>2021-02-10 00:03:38 +0100
commite0fd35d867752e6fcc7329a7d4f5e5fc619f2634 (patch)
tree24218f69b5edf9fa8d86d2c44b5f16194ba29a9f
parent4aef642cfdd0cb9a351709a5f57fd48a4d587c9f (diff)
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.
-rw-r--r--libavformat/fitsenc.c39
-rw-r--r--tests/ref/fate/fits-demux10
-rw-r--r--tests/ref/fate/fitsdec-gray2
-rw-r--r--tests/ref/lavf/gbrap.fits2
-rw-r--r--tests/ref/lavf/gbrap16be.fits2
-rw-r--r--tests/ref/lavf/gbrp.fits2
-rw-r--r--tests/ref/lavf/gbrp16be.fits2
-rw-r--r--tests/ref/lavf/gray.fits2
-rw-r--r--tests/ref/lavf/gray16be.fits4
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