ffmpeg/libavformat/img2.c
Andreas Rheinhardt 497a0f839d avformat/img2: Avoid relocations for ff_img_tags
The strings here are so short that using a pointer is wasteful
(the longest string takes nine bytes; on 64 bit systems,
the pointer+padding already take 12 bytes). So avoid them
and add asserts to ensure that no one ever tries to use a too
long tag.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2024-04-11 12:53:26 +02:00

129 lines
4.2 KiB
C

/*
* Image format
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
* Copyright (c) 2004 Michael Niedermayer
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <assert.h>
#include "libavutil/avstring.h"
#include "internal.h"
#include "img2.h"
#define IMG_TAGS(TAG) \
TAG(MJPEG, jpeg ) \
TAG(MJPEG, jpg ) \
TAG(MJPEG, jps ) \
TAG(MJPEG, mpo ) \
TAG(LJPEG, ljpg ) \
TAG(JPEGLS, jls ) \
TAG(PNG, png ) \
TAG(PNG, pns ) \
TAG(PNG, mng ) \
TAG(PPM, ppm ) \
TAG(PPM, pnm ) \
TAG(PGM, pgm ) \
TAG(PGMYUV, pgmyuv ) \
TAG(PBM, pbm ) \
TAG(PAM, pam ) \
TAG(PFM, pfm ) \
TAG(PHM, phm ) \
TAG(CRI, cri ) \
TAG(ALIAS_PIX, pix ) \
TAG(DDS, dds ) \
TAG(MPEG1VIDEO, mpg1-img ) \
TAG(MPEG2VIDEO, mpg2-img ) \
TAG(MPEG4, mpg4-img ) \
TAG(RAWVIDEO, y ) \
TAG(RAWVIDEO, raw ) \
TAG(BMP, bmp ) \
TAG(TARGA, tga ) \
TAG(TIFF, tiff ) \
TAG(TIFF, tif ) \
TAG(TIFF, dng ) \
TAG(SGI, sgi ) \
TAG(PTX, ptx ) \
TAG(PHOTOCD, pcd ) \
TAG(PCX, pcx ) \
TAG(QDRAW, pic ) \
TAG(QDRAW, pct ) \
TAG(QDRAW, pict ) \
TAG(SUNRAST, sun ) \
TAG(SUNRAST, ras ) \
TAG(SUNRAST, rs ) \
TAG(SUNRAST, im1 ) \
TAG(SUNRAST, im8 ) \
TAG(SUNRAST, im24 ) \
TAG(SUNRAST, im32 ) \
TAG(SUNRAST, sunras ) \
TAG(SVG, svg ) \
TAG(SVG, svgz ) \
TAG(JPEG2000, j2c ) \
TAG(JPEG2000, jp2 ) \
TAG(JPEG2000, jpc ) \
TAG(JPEG2000, j2k ) \
TAG(DPX, dpx ) \
TAG(EXR, exr ) \
TAG(PICTOR, pic ) \
TAG(V210X, yuv10 ) \
TAG(WEBP, webp ) \
TAG(XBM, xbm ) \
TAG(XPM, xpm ) \
TAG(XFACE, xface ) \
TAG(XWD, xwd ) \
TAG(GEM, img ) \
TAG(GEM, ximg ) \
TAG(GEM, timg ) \
TAG(VBN, vbn ) \
TAG(JPEGXL, jxl ) \
TAG(QOI, qoi ) \
TAG(RADIANCE_HDR, hdr ) \
TAG(WBMP, wbmp ) \
TAG(NONE, )
#define LENGTH_CHECK(CODECID, STR) \
static_assert(sizeof(#STR) <= sizeof(ff_img_tags->str), #STR " does not fit into IdStrMap.str\n");
IMG_TAGS(LENGTH_CHECK)
const IdStrMap ff_img_tags[] = {
#define TAG(CODECID, STR) { AV_CODEC_ID_ ## CODECID, #STR },
IMG_TAGS(TAG)
};
static enum AVCodecID str2id(const IdStrMap *tags, const char *str)
{
str = strrchr(str, '.');
if (!str)
return AV_CODEC_ID_NONE;
str++;
while (tags->id) {
if (!av_strcasecmp(str, tags->str))
return tags->id;
tags++;
}
return AV_CODEC_ID_NONE;
}
enum AVCodecID ff_guess_image2_codec(const char *filename)
{
return str2id(ff_img_tags, filename);
}