10l fix by Jindrich Makovicka
[mplayer/greg.git] / libmpdemux / demux_bmp.c
blob7ec2e6c973795fa9464142edfb0d7cc8dcbdca9a
1 /*
2 BMP file parser for the MPlayer program
3 by Mike Melanson
4 */
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <unistd.h>
10 #include "config.h"
11 #include "mp_msg.h"
12 #include "help_mp.h"
14 #include "stream.h"
15 #include "demuxer.h"
16 #include "stheader.h"
18 typedef struct {
19 int image_size;
20 int image_offset;
21 } bmp_image_t;
23 // Check if a file is a BMP file depending on whether starts with 'BM'
24 int bmp_check_file(demuxer_t *demuxer)
26 if (stream_read_word(demuxer->stream) == (('B' << 8) | 'M'))
27 return 1;
28 else
29 return 0;
32 // return value:
33 // 0 = EOF or no stream found
34 // 1 = successfully read a packet
35 int demux_bmp_fill_buffer(demuxer_t *demuxer)
37 bmp_image_t *bmp_image = (bmp_image_t *)demuxer->priv;
39 stream_reset(demuxer->stream);
40 stream_seek(demuxer->stream, bmp_image->image_offset);
41 ds_read_packet(demuxer->video, demuxer->stream, bmp_image->image_size,
42 0, bmp_image->image_offset, 1);
44 return 1;
47 demuxer_t* demux_open_bmp(demuxer_t* demuxer)
49 sh_video_t *sh_video = NULL;
50 unsigned int filesize;
51 unsigned int data_offset;
52 bmp_image_t *bmp_image;
54 // go back to the beginning
55 stream_reset(demuxer->stream);
56 stream_seek(demuxer->stream, 2);
57 filesize = stream_read_dword_le(demuxer->stream);
58 stream_skip(demuxer->stream, 4);
59 data_offset = stream_read_word_le(demuxer->stream);
60 stream_skip(demuxer->stream, 2);
62 // create a new video stream header
63 sh_video = new_sh_video(demuxer, 0);
65 // make sure the demuxer knows about the new video stream header
66 demuxer->video->sh = sh_video;
68 // make sure that the video demuxer stream header knows about its
69 // parent video demuxer stream
70 sh_video->ds = demuxer->video;
72 // load the BITMAPINFOHEADER
73 // allocate size and take the palette table into account
74 sh_video->bih = (BITMAPINFOHEADER *)malloc(data_offset - 12);
75 sh_video->bih->biSize = stream_read_dword_le(demuxer->stream);
76 sh_video->bih->biWidth = stream_read_dword_le(demuxer->stream);
77 sh_video->bih->biHeight = stream_read_dword_le(demuxer->stream);
78 sh_video->bih->biPlanes = stream_read_word_le(demuxer->stream);
79 sh_video->bih->biBitCount = stream_read_word_le(demuxer->stream);
80 sh_video->bih->biCompression = stream_read_dword_le(demuxer->stream);
81 sh_video->bih->biSizeImage = stream_read_dword_le(demuxer->stream);
82 sh_video->bih->biXPelsPerMeter = stream_read_dword_le(demuxer->stream);
83 sh_video->bih->biYPelsPerMeter = stream_read_dword_le(demuxer->stream);
84 sh_video->bih->biClrUsed = stream_read_dword_le(demuxer->stream);
85 sh_video->bih->biClrImportant = stream_read_dword_le(demuxer->stream);
86 // fetch the palette
87 stream_read(demuxer->stream, (unsigned char *)(sh_video->bih) + 40,
88 sh_video->bih->biClrUsed * 4);
90 // load the data
91 bmp_image = (bmp_image_t *)malloc(sizeof(bmp_image_t));
92 bmp_image->image_size = filesize - data_offset;
93 bmp_image->image_offset = data_offset;
95 // custom fourcc for internal MPlayer use
96 sh_video->format = sh_video->bih->biCompression;
98 sh_video->disp_w = sh_video->bih->biWidth;
99 sh_video->disp_h = sh_video->bih->biHeight;
101 // get the speed
102 sh_video->fps = 2;
103 sh_video->frametime = 1 / sh_video->fps;
105 demuxer->priv = bmp_image;
107 return demuxer;
110 void demux_close_bmp(demuxer_t* demuxer) {
111 bmp_image_t *bmp_image = demuxer->priv;
113 if(!bmp_image)
114 return;
115 free(bmp_image);