summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_bmp.c
diff options
context:
space:
mode:
authormelanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-03-20 05:15:53 +0000
committermelanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-03-20 05:15:53 +0000
commitcfaca0053dbfda1c2a091fa92037427bb3600e9e (patch)
treea54e215c474afb2a22aa2cf324c023257d1989f6 /libmpdemux/demux_bmp.c
parentc09119195d1d1705216eb992ccc7177820125108 (diff)
downloadmpv-cfaca0053dbfda1c2a091fa92037427bb3600e9e.tar.bz2
mpv-cfaca0053dbfda1c2a091fa92037427bb3600e9e.tar.xz
added a BMP file demuxer...yeah, that's right, a static image BMP file
demuxer; what, is that so weird?...:) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5215 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_bmp.c')
-rw-r--r--libmpdemux/demux_bmp.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/libmpdemux/demux_bmp.c b/libmpdemux/demux_bmp.c
new file mode 100644
index 0000000000..df28daee37
--- /dev/null
+++ b/libmpdemux/demux_bmp.c
@@ -0,0 +1,111 @@
+/*
+ BMP file parser for the MPlayer program
+ by Mike Melanson
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "config.h"
+#include "mp_msg.h"
+#include "help_mp.h"
+
+#include "stream.h"
+#include "demuxer.h"
+#include "stheader.h"
+
+typedef struct {
+ int image_size;
+ int image_offset;
+} bmp_image_t;
+
+// Check if a file is a BMP file depending on whether starts with 'BM'
+int bmp_check_file(demuxer_t *demuxer)
+{
+ stream_reset(demuxer->stream);
+ stream_seek(demuxer->stream, 0);
+
+ if (stream_read_word(demuxer->stream) == (('B' << 8) | 'M'))
+ return 1;
+ else
+ return 0;
+}
+
+// return value:
+// 0 = EOF or no stream found
+// 1 = successfully read a packet
+int demux_bmp_fill_buffer(demuxer_t *demuxer)
+{
+ bmp_image_t *bmp_image = (bmp_image_t *)demuxer->priv;
+
+ stream_reset(demuxer->stream);
+ stream_seek(demuxer->stream, bmp_image->image_offset);
+ ds_read_packet(demuxer->video, demuxer->stream, bmp_image->image_size,
+ 0, bmp_image->image_offset, 1);
+
+ return 1;
+}
+
+demuxer_t* demux_open_bmp(demuxer_t* demuxer)
+{
+ sh_video_t *sh_video = NULL;
+ unsigned int filesize;
+ unsigned int data_offset;
+ bmp_image_t *bmp_image;
+
+ // go back to the beginning
+ stream_reset(demuxer->stream);
+ stream_seek(demuxer->stream, 2);
+ filesize = stream_read_dword_le(demuxer->stream);
+ stream_skip(demuxer->stream, 4);
+ data_offset = stream_read_word_le(demuxer->stream);
+ stream_skip(demuxer->stream, 2);
+
+ // create a new video stream header
+ sh_video = new_sh_video(demuxer, 0);
+
+ // make sure the demuxer knows about the new video stream header
+ demuxer->video->sh = sh_video;
+
+ // make sure that the video demuxer stream header knows about its
+ // parent video demuxer stream
+ sh_video->ds = demuxer->video;
+
+ // load the BITMAPINFOHEADER
+ // allocate size and take the palette table into account
+ sh_video->bih = (BITMAPINFOHEADER *)malloc(data_offset - 12);
+ sh_video->bih->biSize = stream_read_dword_le(demuxer->stream);
+ sh_video->bih->biWidth = stream_read_dword_le(demuxer->stream);
+ sh_video->bih->biHeight = stream_read_dword_le(demuxer->stream);
+ sh_video->bih->biPlanes = stream_read_word_le(demuxer->stream);
+ sh_video->bih->biBitCount = stream_read_word_le(demuxer->stream);
+ sh_video->bih->biCompression = stream_read_dword_le(demuxer->stream);
+ sh_video->bih->biSizeImage = stream_read_dword_le(demuxer->stream);
+ sh_video->bih->biXPelsPerMeter = stream_read_dword_le(demuxer->stream);
+ sh_video->bih->biYPelsPerMeter = stream_read_dword_le(demuxer->stream);
+ sh_video->bih->biClrUsed = stream_read_dword_le(demuxer->stream);
+ sh_video->bih->biClrImportant = stream_read_dword_le(demuxer->stream);
+ // fetch the palette
+ stream_read(demuxer->stream, (unsigned char *)(sh_video->bih) + 40,
+ sh_video->bih->biClrUsed * 4);
+
+ // load the data
+ bmp_image = (bmp_image_t *)malloc(sizeof(bmp_image_t));
+ bmp_image->image_size = filesize - data_offset;
+ bmp_image->image_offset = data_offset;
+
+ // custom fourcc for internal MPlayer use
+ sh_video->format = sh_video->bih->biCompression;
+
+ sh_video->disp_w = sh_video->bih->biWidth;
+ sh_video->disp_h = sh_video->bih->biHeight;
+
+ // get the speed
+ sh_video->fps = 2;
+ sh_video->frametime = 1 / sh_video->fps;
+
+ demuxer->priv = bmp_image;
+
+ return demuxer;
+}