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>
		
			
				
	
	
		
			129 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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);
 | |
| }
 |