On Thu, Jun 08, 2017 at 10:34:15PM +0530, Paras Chadha wrote: > It supports all 2-d images alongwith bzero, bscale and blank keywords. > RGBA images are supported as NAXIS3 = 3 or 4 i.e. Planes in RGBA order. Also > CTYPE = 'RGB ' should be present. > It currently does not support XTENSION keyword. > > Signed-off-by: Paras Chadha <paraschadh...@gmail.com> > --- > Changelog | 1 + > doc/general.texi | 2 + > libavcodec/Makefile | 1 + > libavcodec/allcodecs.c | 1 + > libavcodec/avcodec.h | 1 + > libavcodec/codec_desc.c | 8 + > libavcodec/fitsdec.c | 527 > +++++++++++++++++++++++++++++++++++++++++++++++ > libavcodec/version.h | 4 +- > libavformat/Makefile | 1 + > libavformat/allformats.c | 1 + > libavformat/img2.c | 1 + > libavformat/img2dec.c | 10 + > 12 files changed, 556 insertions(+), 2 deletions(-) > create mode 100644 libavcodec/fitsdec.c [...] > +/** > + * function reads the fits header and stores the values in fits_header > pointed by header > + * @param avctx - AVCodec context > + * @param ptr - pointer to pointer to the data > + * @param header - pointer to the fits_header > + * @param end - pointer to end of packet > + * @return 1, if calculated successfully, otherwise AVERROR_INVALIDDATA > + */ > +static int fits_read_header(AVCodecContext *avctx, const uint8_t **ptr, > fits_header * header, const uint8_t * end) > +{ > + const uint8_t *ptr8 = *ptr; > + int lines_read = 0, i, dim_no, t, data_min_found = 0, data_max_found = > 0, ret; > + uint64_t size=1; > + char str_val[80]; > + double d; > + > + header->blank = 0; > + header->bscale = 1.0; > + header->bzero = 0; > + header->rgb = 0; > + > + if (end - ptr8 < 80) > + return AVERROR_INVALIDDATA; > + > + if (sscanf(ptr8, "SIMPLE = %c", &header->simple) != 1) { > + av_log(avctx, AV_LOG_ERROR, "missing SIMPLE keyword\n"); > + return AVERROR_INVALIDDATA; > + } > + > + if (header->simple == 'F') > + av_log(avctx, AV_LOG_WARNING, "not a standard FITS file\n"); > + else if (header->simple != 'T') { > + av_log(avctx, AV_LOG_ERROR, "invalid SIMPLE value, SIMPLE = %c\n", > header->simple); > + return AVERROR_INVALIDDATA; > + } > + > + ptr8 += 80; > + lines_read++; > + > + if (end - ptr8 < 80) > + return AVERROR_INVALIDDATA; > + > + if (sscanf(ptr8, "BITPIX = %d", &header->bitpix) != 1) { > + av_log(avctx, AV_LOG_ERROR, "missing BITPIX keyword\n"); > + return AVERROR_INVALIDDATA; > + } > + > + size = abs(header->bitpix) / 8; > + ptr8 += 80; > + lines_read++; > + > + if (end - ptr8 < 80) > + return AVERROR_INVALIDDATA; > + > + if (sscanf(ptr8, "NAXIS = %d", &header->naxis) != 1) { > + av_log(avctx, AV_LOG_ERROR, "missing NAXIS keyword\n"); > + return AVERROR_INVALIDDATA; > + } > + > + if (header->naxis == 0) { > + av_log(avctx, AV_LOG_ERROR, "No image data found, NAXIS = %d\n", > header->naxis); > + return AVERROR_INVALIDDATA; > + } > + > + if (header->naxis != 2 && header->naxis != 3) { > + av_log(avctx, AV_LOG_ERROR, "unsupported number of dimensions, NAXIS > = %d\n", header->naxis); > + return AVERROR_INVALIDDATA; > + } > + > + ptr8 += 80; > + lines_read++; > + > + for (i = 0; i < header->naxis; i++) { > + if (end - ptr8 < 80) > + return AVERROR_INVALIDDATA; > + > + if (sscanf(ptr8, "NAXIS%d = %d", &dim_no, &header->naxisn[i]) != 2 > || dim_no != i+1) { > + av_log(avctx, AV_LOG_ERROR, "missing NAXIS%d keyword\n", i+1); > + return AVERROR_INVALIDDATA; > + } > + > + size *= header->naxisn[i]; > + ptr8 += 80; > + lines_read++; > + } > + > + if (end - ptr8 < 80) > + return AVERROR_INVALIDDATA; > + > + while (strncmp(ptr8, "END", 3)) { > + if (sscanf(ptr8, "BLANK = %d", &t) == 1) > + header->blank = t; > + else if (sscanf(ptr8, "BSCALE = %lf", &d) == 1) > + header->bscale = d; > + else if (sscanf(ptr8, "BZERO = %lf", &d) == 1) > + header->bzero = d; > + else if (sscanf(ptr8, "DATAMAX = %lf", &d) == 1) { > + data_max_found = 1; > + header->data_max = d; > + } > + else if (sscanf(ptr8, "DATAMIN = %lf", &d) == 1) { > + data_min_found = 1; > + header->data_min = d; > + }
> + else if (sscanf(ptr8, "CTYPE3 = '%s '", str_val) == 1) { what prevents a buffer overflow here ? [...] > + > +static int fits_decode_frame(AVCodecContext *avctx, void *data, int > *got_frame, AVPacket *avpkt) > +{ > + AVFrame *p=data; > + const uint8_t *ptr8 = avpkt->data, *end; > + int16_t t16; > + int32_t t32; > + int64_t t64; > + float tflt; > + double tdbl; > + int ret, i, j; > + uint8_t *dst8; > + uint16_t *dst16; > + uint32_t *dst32; > + uint64_t *dst64, size, r, g, b, a, t; > + fits_header header; > + > + end = ptr8 + avpkt->size; > + if ((ret = fits_read_header(avctx, &ptr8, &header, end) < 0)) wrongly placed () [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Take away the freedom of one citizen and you will be jailed, take away the freedom of all citizens and you will be congratulated by your peers in Parliament.
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel