mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-04-08 16:54:03 +02:00
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.
This commit is contained in:
parent
4aef642cfd
commit
e0fd35d867
@ -45,7 +45,8 @@ static int fits_write_header(AVFormatContext *s)
|
|||||||
* @param lines_written to keep track of lines written so far
|
* @param lines_written to keep track of lines written so far
|
||||||
* @return 0
|
* @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;
|
int len, ret;
|
||||||
uint8_t header[80];
|
uint8_t header[80];
|
||||||
@ -57,7 +58,12 @@ static int write_keyword_value(AVFormatContext *s, const char *keyword, int valu
|
|||||||
header[8] = '=';
|
header[8] = '=';
|
||||||
header[9] = ' ';
|
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));
|
memset(&header[ret + 10], ' ', sizeof(header) - (ret + 10));
|
||||||
|
|
||||||
avio_write(s->pb, header, sizeof(header));
|
avio_write(s->pb, header, sizeof(header));
|
||||||
@ -72,16 +78,22 @@ static int write_image_header(AVFormatContext *s)
|
|||||||
FITSContext *fitsctx = s->priv_data;
|
FITSContext *fitsctx = s->priv_data;
|
||||||
uint8_t buffer[80];
|
uint8_t buffer[80];
|
||||||
int bitpix, naxis, naxis3 = 1, bzero = 0, rgb = 0, lines_written = 0, lines_left;
|
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) {
|
switch (encctx->format) {
|
||||||
case AV_PIX_FMT_GRAY8:
|
case AV_PIX_FMT_GRAY8:
|
||||||
bitpix = 8;
|
bitpix = 8;
|
||||||
naxis = 2;
|
naxis = 2;
|
||||||
|
datamin = 0;
|
||||||
|
datamax = 255;
|
||||||
break;
|
break;
|
||||||
case AV_PIX_FMT_GRAY16BE:
|
case AV_PIX_FMT_GRAY16BE:
|
||||||
bitpix = 16;
|
bitpix = 16;
|
||||||
naxis = 2;
|
naxis = 2;
|
||||||
bzero = 32768;
|
bzero = 32768;
|
||||||
|
datamin = 0;
|
||||||
|
datamax = 65535;
|
||||||
break;
|
break;
|
||||||
case AV_PIX_FMT_GBRP:
|
case AV_PIX_FMT_GBRP:
|
||||||
case AV_PIX_FMT_GBRAP:
|
case AV_PIX_FMT_GBRAP:
|
||||||
@ -93,6 +105,8 @@ static int write_image_header(AVFormatContext *s)
|
|||||||
} else {
|
} else {
|
||||||
naxis3 = 4;
|
naxis3 = 4;
|
||||||
}
|
}
|
||||||
|
datamin = 0;
|
||||||
|
datamax = 255;
|
||||||
break;
|
break;
|
||||||
case AV_PIX_FMT_GBRP16BE:
|
case AV_PIX_FMT_GBRP16BE:
|
||||||
case AV_PIX_FMT_GBRAP16BE:
|
case AV_PIX_FMT_GBRAP16BE:
|
||||||
@ -105,6 +119,8 @@ static int write_image_header(AVFormatContext *s)
|
|||||||
naxis3 = 4;
|
naxis3 = 4;
|
||||||
}
|
}
|
||||||
bzero = 32768;
|
bzero = 32768;
|
||||||
|
datamin = 0;
|
||||||
|
datamax = 65535;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
@ -122,28 +138,31 @@ static int write_image_header(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
lines_written++;
|
lines_written++;
|
||||||
|
|
||||||
write_keyword_value(s, "BITPIX", bitpix, &lines_written); // no of bits per pixel
|
write_keyword_value(s, "%d", "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, "%d", "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, "%d", "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", "NAXIS2", &encctx->height, &lines_written); // second dimension i.e. height
|
||||||
|
|
||||||
if (rgb)
|
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) {
|
if (!fitsctx->first_image) {
|
||||||
write_keyword_value(s, "PCOUNT", 0, &lines_written);
|
write_keyword_value(s, "%d", "PCOUNT", &pcount, &lines_written);
|
||||||
write_keyword_value(s, "GCOUNT", 1, &lines_written);
|
write_keyword_value(s, "%d", "GCOUNT", &gcount, &lines_written);
|
||||||
} else {
|
} else {
|
||||||
fitsctx->first_image = 0;
|
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,
|
* Since FITS does not support unsigned 16 bit integers,
|
||||||
* BZERO = 32768 is used to store unsigned 16 bit integers as
|
* BZERO = 32768 is used to store unsigned 16 bit integers as
|
||||||
* signed integers so that it can be read properly.
|
* signed integers so that it can be read properly.
|
||||||
*/
|
*/
|
||||||
if (bitpix == 16)
|
if (bitpix == 16)
|
||||||
write_keyword_value(s, "BZERO", bzero, &lines_written);
|
write_keyword_value(s, "%d", "BZERO", &bzero, &lines_written);
|
||||||
|
|
||||||
if (rgb) {
|
if (rgb) {
|
||||||
memcpy(buffer, "CTYPE3 = 'RGB '", 20);
|
memcpy(buffer, "CTYPE3 = 'RGB '", 20);
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
#codec_id 0: fits
|
#codec_id 0: fits
|
||||||
#dimensions 0: 72x36
|
#dimensions 0: 72x36
|
||||||
#sar 0: 0/1
|
#sar 0: 0/1
|
||||||
0, 0, 0, 1, 14320, 0x0ecf72e0
|
0, 0, 0, 1, 14320, 0xa9ee75a4
|
||||||
0, 1, 1, 1, 14320, 0xd94af6eb
|
0, 1, 1, 1, 14320, 0xb9daf9af
|
||||||
0, 2, 2, 1, 14320, 0x15c21892
|
0, 2, 2, 1, 14320, 0xf6431b56
|
||||||
0, 3, 3, 1, 14320, 0xb18adc01
|
0, 3, 3, 1, 14320, 0x921adec5
|
||||||
0, 4, 4, 1, 14320, 0xc2be706d
|
0, 4, 4, 1, 14320, 0xa34e7331
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
#codec_id 0: rawvideo
|
#codec_id 0: rawvideo
|
||||||
#dimensions 0: 128x128
|
#dimensions 0: 128x128
|
||||||
#sar 0: 0/1
|
#sar 0: 0/1
|
||||||
0, 0, 0, 1, 16384, 0x353dbacd
|
0, 0, 0, 1, 16384, 0xeff50901
|
||||||
|
@ -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
|
10224000 tests/data/lavf/lavf.gbrap.fits
|
||||||
tests/data/lavf/lavf.gbrap.fits CRC=0x883af247
|
tests/data/lavf/lavf.gbrap.fits CRC=0x883af247
|
||||||
|
@ -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
|
20376000 tests/data/lavf/lavf.gbrap16be.fits
|
||||||
tests/data/lavf/lavf.gbrap16be.fits CRC=0xa981271b
|
tests/data/lavf/lavf.gbrap16be.fits CRC=0xa981271b
|
||||||
|
@ -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
|
7704000 tests/data/lavf/lavf.gbrp.fits
|
||||||
tests/data/lavf/lavf.gbrp.fits CRC=0x80745c5e
|
tests/data/lavf/lavf.gbrp.fits CRC=0x80745c5e
|
||||||
|
@ -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
|
15336000 tests/data/lavf/lavf.gbrp16be.fits
|
||||||
tests/data/lavf/lavf.gbrp16be.fits CRC=0x9573fb2b
|
tests/data/lavf/lavf.gbrp16be.fits CRC=0x9573fb2b
|
||||||
|
@ -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
|
2664000 tests/data/lavf/lavf.gray.fits
|
||||||
tests/data/lavf/lavf.gray.fits CRC=0x7aa0122f
|
tests/data/lavf/lavf.gray.fits CRC=0x7aa0122f
|
||||||
|
@ -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
|
5184000 tests/data/lavf/lavf.gray16be.fits
|
||||||
tests/data/lavf/lavf.gray16be.fits CRC=0x8cdcbeb2
|
tests/data/lavf/lavf.gray16be.fits CRC=0x737e8998
|
||||||
|
Loading…
x
Reference in New Issue
Block a user