diff --git a/demux/codec_tags.c b/demux/codec_tags.c index d3b166f763..accc1d918d 100644 --- a/demux/codec_tags.c +++ b/demux/codec_tags.c @@ -180,6 +180,70 @@ void mp_set_pcm_codec(struct mp_codec_params *c, bool sign, bool is_float, c->codec = talloc_strdup(c, codec); } +// map file extension/type to an image codec name +static const char *const type_to_codec[][2] = { + { "bmp", "bmp" }, + { "dpx", "dpx" }, + { "j2c", "jpeg2000" }, + { "j2k", "jpeg2000" }, + { "jp2", "jpeg2000" }, + { "jpc", "jpeg2000" }, + { "jpeg", "mjpeg" }, + { "jpg", "mjpeg" }, + { "jps", "mjpeg" }, + { "jls", "ljpeg" }, + { "thm", "mjpeg" }, + { "db", "mjpeg" }, + { "pcd", "photocd" }, + { "pfm", "pfm" }, + { "phm", "phm" }, + { "hdr", "hdr" }, + { "pcx", "pcx" }, + { "png", "png" }, + { "pns", "png" }, + { "ptx", "ptx" }, + { "tga", "targa" }, + { "tif", "tiff" }, + { "tiff", "tiff" }, + { "sgi", "sgi" }, + { "sun", "sunrast" }, + { "ras", "sunrast" }, + { "rs", "sunrast" }, + { "ra", "sunrast" }, + { "im1", "sunrast" }, + { "im8", "sunrast" }, + { "im24", "sunrast" }, + { "im32", "sunrast" }, + { "sunras", "sunrast" }, + { "xbm", "xbm" }, + { "pam", "pam" }, + { "pbm", "pbm" }, + { "pgm", "pgm" }, + { "pgmyuv", "pgmyuv" }, + { "ppm", "ppm" }, + { "pnm", "ppm" }, + { "gif", "gif" }, + { "pix", "brender_pix" }, + { "exr", "exr" }, + { "pic", "pictor" }, + { "qoi", "qoi" }, + { "xface", "xface" }, + { "xwd", "xwd" }, + { "svg", "svg" }, + {0} +}; + +const char *mp_map_type_to_image_codec(const char *type) +{ + if (type) { + for (int n = 0; type_to_codec[n][0]; n++) { + if (strcasecmp(type_to_codec[n][0], type) == 0) + return type_to_codec[n][1]; + } + } + return NULL; +}; + static const char *const mimetype_to_codec[][2] = { {"image/apng", "apng"}, {"image/avif", "av1"}, diff --git a/demux/codec_tags.h b/demux/codec_tags.h index 147760b0fe..694f4c64d4 100644 --- a/demux/codec_tags.h +++ b/demux/codec_tags.h @@ -28,6 +28,7 @@ void mp_set_codec_from_tag(struct mp_codec_params *c); void mp_set_pcm_codec(struct mp_codec_params *c, bool sign, bool is_float, int bits, bool is_be); +const char *mp_map_type_to_image_codec(const char *type); const char *mp_map_mimetype_to_video_codec(const char *mimetype); #endif diff --git a/demux/demux_mf.c b/demux/demux_mf.c index b24dd3be01..8f7cb70b91 100644 --- a/demux/demux_mf.c +++ b/demux/demux_mf.c @@ -284,63 +284,6 @@ static bool demux_mf_read_packet(struct demuxer *demuxer, return true; } -// map file extension/type to a codec name - -static const struct { - const char *type; - const char *codec; -} type2format[] = { - { "bmp", "bmp" }, - { "dpx", "dpx" }, - { "j2c", "jpeg2000" }, - { "j2k", "jpeg2000" }, - { "jp2", "jpeg2000" }, - { "jpc", "jpeg2000" }, - { "jpeg", "mjpeg" }, - { "jpg", "mjpeg" }, - { "jps", "mjpeg" }, - { "jls", "ljpeg" }, - { "thm", "mjpeg" }, - { "db", "mjpeg" }, - { "pcd", "photocd" }, - { "pfm", "pfm" }, - { "phm", "phm" }, - { "hdr", "hdr" }, - { "pcx", "pcx" }, - { "png", "png" }, - { "pns", "png" }, - { "ptx", "ptx" }, - { "tga", "targa" }, - { "tif", "tiff" }, - { "tiff", "tiff" }, - { "sgi", "sgi" }, - { "sun", "sunrast" }, - { "ras", "sunrast" }, - { "rs", "sunrast" }, - { "ra", "sunrast" }, - { "im1", "sunrast" }, - { "im8", "sunrast" }, - { "im24", "sunrast" }, - { "im32", "sunrast" }, - { "sunras", "sunrast" }, - { "xbm", "xbm" }, - { "pam", "pam" }, - { "pbm", "pbm" }, - { "pgm", "pgm" }, - { "pgmyuv", "pgmyuv" }, - { "ppm", "ppm" }, - { "pnm", "ppm" }, - { "gif", "gif" }, // usually handled by demux_lavf - { "pix", "brender_pix" }, - { "exr", "exr" }, - { "pic", "pictor" }, - { "qoi", "qoi" }, - { "xface", "xface" }, - { "xwd", "xwd" }, - { "svg", "svg" }, - {0} -}; - static const char *probe_format(mf_t *mf, char *type, enum demux_check check) { if (check > DEMUX_CHECK_REQUEST) @@ -351,10 +294,9 @@ static const char *probe_format(mf_t *mf, char *type, enum demux_check check) if (p) type = p + 1; } - for (int i = 0; type2format[i].type; i++) { - if (type && strcasecmp(type, type2format[i].type) == 0) - return type2format[i].codec; - } + const char *codec = mp_map_type_to_image_codec(type); + if (codec) + return codec; if (check == DEMUX_CHECK_REQUEST) { if (!org_type) { MP_ERR(mf, "file type was not set! (try --mf-type=ext)\n");