mirror of
https://github.com/panzi/mediaextract
synced 2025-02-19 05:56:51 +00:00
added BMP support
This commit is contained in:
parent
e273a056cf
commit
834328808e
9
Makefile
9
Makefile
@ -23,7 +23,8 @@ OBJ=\
|
||||
$(BUILDDIR)/asf.o \
|
||||
$(BUILDDIR)/bink.o \
|
||||
$(BUILDDIR)/au.o \
|
||||
$(BUILDDIR)/smk.o
|
||||
$(BUILDDIR)/smk.o \
|
||||
$(BUILDDIR)/bmp.o
|
||||
CC=gcc
|
||||
LD=$(CC)
|
||||
COMMON_CFLAGS=-Wall -Werror -Wextra -std=gnu99 -O2 -g $(INCLUDE) $(LIBDIRS) -D_FILE_OFFSET_BITS=64
|
||||
@ -90,7 +91,8 @@ $(BUILDDIR)/audioextract.o: src/audioextract.c \
|
||||
src/asf.h \
|
||||
src/bink.h \
|
||||
src/au.h \
|
||||
src/smk.h
|
||||
src/smk.h \
|
||||
src/bmp.h
|
||||
$(CC) $(CFLAGS) $< -o $@ -c $(LIBS)
|
||||
|
||||
$(BUILDDIR)/audioextract_$(PLATFORM).o: src/audioextract_$(PLATFORM).c src/audioextract.h
|
||||
@ -141,6 +143,9 @@ $(BUILDDIR)/au.o: src/au.c src/audioextract.h src/au.h
|
||||
$(BUILDDIR)/smk.o: src/smk.c src/audioextract.h src/smk.h
|
||||
$(CC) $(CFLAGS) $< -o $@ -c $(LIBS)
|
||||
|
||||
$(BUILDDIR)/bmp.o: src/bmp.c src/audioextract.h src/bmp.h
|
||||
$(CC) $(CFLAGS) $< -o $@ -c $(LIBS)
|
||||
|
||||
ifeq ($(PLATFORM),posix)
|
||||
install: $(PREFIX)/bin/$(APPNAME)
|
||||
|
||||
|
@ -95,6 +95,7 @@ files.
|
||||
asf Advanced Systems Format files (also WMA and WMV)
|
||||
au Sun Microsystems audio file format (.au or .snd)
|
||||
bink BINK files
|
||||
bmp Windows Bitmap files
|
||||
id3v2 MPEG layer 1/2/3 files with ID3v2 tags
|
||||
it ImpulseTracker files
|
||||
midi MIDI files
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "bink.h"
|
||||
#include "au.h"
|
||||
#include "smk.h"
|
||||
#include "bmp.h"
|
||||
|
||||
#if defined(__WINDOWS__) && !defined(__CYGWIN__)
|
||||
# ifdef _WIN64
|
||||
@ -62,11 +63,12 @@ enum fileformat {
|
||||
ASF = 0x800,
|
||||
BINK = 0x1000,
|
||||
AU = 0x2000,
|
||||
SMK = 0x4000
|
||||
SMK = 0x4000,
|
||||
BMP = 0x8000
|
||||
};
|
||||
|
||||
#define ALL_FORMATS (OGG | RIFF | AIFF | MPG123 | MP4 | ID3v2 | MIDI | MOD | S3M | IT | XM | ASF | BINK | AU | SMK)
|
||||
#define DEFAULT_FORMATS (OGG | RIFF | AIFF | MP4 | ID3v2 | MIDI | S3M | IT | XM | ASF | BINK | AU | SMK)
|
||||
#define ALL_FORMATS (OGG | RIFF | AIFF | MPG123 | MP4 | ID3v2 | MIDI | MOD | S3M | IT | XM | ASF | BINK | AU | SMK | BMP)
|
||||
#define DEFAULT_FORMATS (OGG | RIFF | AIFF | MP4 | ID3v2 | MIDI | S3M | IT | XM | ASF | BINK | AU | SMK | BMP)
|
||||
#define TRACKER_FORMATS (MOD | S3M | IT | XM)
|
||||
|
||||
static int usage(int argc, char **argv);
|
||||
@ -144,6 +146,7 @@ static int usage(int argc, char **argv)
|
||||
" asf Advanced Systems Format files (also WMA and WMV)\n"
|
||||
" au Sun Microsystems audio file format (.au or .snd)\n"
|
||||
" bink BINK files\n"
|
||||
" bmp Windows Bitmap files\n"
|
||||
" id3v2 MPEG layer 1/2/3 files with ID3v2 tags\n"
|
||||
" it ImpulseTracker files\n"
|
||||
" midi MIDI files\n"
|
||||
@ -429,6 +432,13 @@ int do_extract(const uint8_t *filedata, size_t filesize, const struct extract_op
|
||||
continue;
|
||||
}
|
||||
|
||||
if (formats & BMP && IS_BMP_MAGIC(ptr) && bmp_isfile(ptr, input_len, &length))
|
||||
{
|
||||
WRITE_FILE(ptr, length, "bmp");
|
||||
ptr += length;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (formats & SMK && IS_SMK_MAGIC(magic) && smk_isfile(ptr, input_len, &length))
|
||||
{
|
||||
WRITE_FILE(ptr, length, "smk");
|
||||
@ -559,6 +569,14 @@ int parse_formats(const char *formats)
|
||||
{
|
||||
mask = BINK;
|
||||
}
|
||||
else if (strncasecmp("smk", start, len) == 0)
|
||||
{
|
||||
mask = SMK;
|
||||
}
|
||||
else if (strncasecmp("bmp", start, len) == 0)
|
||||
{
|
||||
mask = BMP;
|
||||
}
|
||||
else if (strncasecmp("tracker", start, len) == 0)
|
||||
{
|
||||
mask = TRACKER_FORMATS;
|
||||
|
74
src/bmp.c
Normal file
74
src/bmp.c
Normal file
@ -0,0 +1,74 @@
|
||||
#include "bmp.h"
|
||||
|
||||
// see: http://en.wikipedia.org/wiki/BMP_file_format
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct bmp_header {
|
||||
uint16_t magic;
|
||||
uint32_t filesize;
|
||||
uint16_t reserved1;
|
||||
uint16_t reserved2;
|
||||
uint32_t dataoffset;
|
||||
|
||||
// DIB header
|
||||
uint32_t headersize;
|
||||
int32_t width;
|
||||
int32_t height;
|
||||
uint16_t planes;
|
||||
uint16_t bpp;
|
||||
uint32_t compression;
|
||||
uint32_t datasize;
|
||||
uint32_t hres;
|
||||
uint32_t vres;
|
||||
uint32_t palettecolors;
|
||||
uint32_t importantcolors;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
int bmp_isfile(const uint8_t *data, size_t input_len, size_t *lengthptr)
|
||||
{
|
||||
if (input_len < (BMP_HEADER_SIZE + DIB_HEADER_SIZE) || !IS_BMP_MAGIC(data))
|
||||
return 0;
|
||||
|
||||
const struct bmp_header *header = (const struct bmp_header *)data;
|
||||
|
||||
size_t filesize = le32toh(header->filesize);
|
||||
uint16_t reserved1 = le16toh(header->reserved1);
|
||||
uint16_t reserved2 = le16toh(header->reserved2);
|
||||
size_t dataoffset = le32toh(header->dataoffset);
|
||||
size_t headersize = le32toh(header->headersize);
|
||||
int32_t width = le32toh(header->width);
|
||||
int32_t height = le32toh(header->height);
|
||||
uint16_t planes = le16toh(header->planes);
|
||||
uint16_t bpp = le16toh(header->bpp);
|
||||
uint32_t compression = le32toh(header->compression);
|
||||
size_t datasize = le32toh(header->datasize);
|
||||
uint32_t hres = le32toh(header->hres);
|
||||
uint32_t vres = le32toh(header->vres);
|
||||
size_t palettecolors = le32toh(header->palettecolors);
|
||||
size_t colortblsize = 4 * palettecolors;
|
||||
|
||||
// integer overflow?
|
||||
if (SIZE_MAX / 4 < palettecolors)
|
||||
return 0;
|
||||
|
||||
// sanity of all sizes and offsets
|
||||
if (filesize < (BMP_HEADER_SIZE + DIB_HEADER_SIZE) || dataoffset >= filesize || datasize >= filesize ||
|
||||
headersize >= filesize || headersize < DIB_HEADER_SIZE || colortblsize >= filesize ||
|
||||
dataoffset < (BMP_HEADER_SIZE + headersize + colortblsize) ||
|
||||
filesize - datasize < dataoffset)
|
||||
return 0;
|
||||
|
||||
// legal range of values?
|
||||
if (width <= 0 || height == 0 || planes != 1 || bpp == 0 || hres == 0 || vres == 0 ||
|
||||
reserved1 != 0 || reserved2 != 0 || compression > 6)
|
||||
return 0;
|
||||
|
||||
if (filesize > input_len)
|
||||
return 0;
|
||||
|
||||
if (lengthptr)
|
||||
*lengthptr = filesize;
|
||||
|
||||
return 1;
|
||||
}
|
13
src/bmp.h
Normal file
13
src/bmp.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef AUDIOEXTRACT_BMP_H__
|
||||
#define AUDIOEXTRACT_BMP_H__
|
||||
|
||||
#include "audioextract.h"
|
||||
|
||||
#define IS_BMP_MAGIC(data) ((*(const uint16_t *)(data)) == (*(const uint16_t *)("BM")))
|
||||
|
||||
#define BMP_HEADER_SIZE 14
|
||||
#define DIB_HEADER_SIZE 40
|
||||
|
||||
int bmp_isfile(const uint8_t *data, size_t input_len, size_t *lengthptr);
|
||||
|
||||
#endif /* AUDIOEXTRACT_BMP_H__ */
|
Loading…
Reference in New Issue
Block a user