Mercurial > mplayer.hg
comparison libmpdemux/demux_bmp.c @ 5214:dd79075bbd98
added a BMP file demuxer...yeah, that's right, a static image BMP file
demuxer; what, is that so weird?...:)
author | melanson |
---|---|
date | Wed, 20 Mar 2002 05:15:53 +0000 |
parents | |
children | 8a357300d0ec |
comparison
equal
deleted
inserted
replaced
5213:b40644bb0e61 | 5214:dd79075bbd98 |
---|---|
1 /* | |
2 BMP file parser for the MPlayer program | |
3 by Mike Melanson | |
4 */ | |
5 | |
6 #include <stdio.h> | |
7 #include <stdlib.h> | |
8 #include <unistd.h> | |
9 | |
10 #include "config.h" | |
11 #include "mp_msg.h" | |
12 #include "help_mp.h" | |
13 | |
14 #include "stream.h" | |
15 #include "demuxer.h" | |
16 #include "stheader.h" | |
17 | |
18 typedef struct { | |
19 int image_size; | |
20 int image_offset; | |
21 } bmp_image_t; | |
22 | |
23 // Check if a file is a BMP file depending on whether starts with 'BM' | |
24 int bmp_check_file(demuxer_t *demuxer) | |
25 { | |
26 stream_reset(demuxer->stream); | |
27 stream_seek(demuxer->stream, 0); | |
28 | |
29 if (stream_read_word(demuxer->stream) == (('B' << 8) | 'M')) | |
30 return 1; | |
31 else | |
32 return 0; | |
33 } | |
34 | |
35 // return value: | |
36 // 0 = EOF or no stream found | |
37 // 1 = successfully read a packet | |
38 int demux_bmp_fill_buffer(demuxer_t *demuxer) | |
39 { | |
40 bmp_image_t *bmp_image = (bmp_image_t *)demuxer->priv; | |
41 | |
42 stream_reset(demuxer->stream); | |
43 stream_seek(demuxer->stream, bmp_image->image_offset); | |
44 ds_read_packet(demuxer->video, demuxer->stream, bmp_image->image_size, | |
45 0, bmp_image->image_offset, 1); | |
46 | |
47 return 1; | |
48 } | |
49 | |
50 demuxer_t* demux_open_bmp(demuxer_t* demuxer) | |
51 { | |
52 sh_video_t *sh_video = NULL; | |
53 unsigned int filesize; | |
54 unsigned int data_offset; | |
55 bmp_image_t *bmp_image; | |
56 | |
57 // go back to the beginning | |
58 stream_reset(demuxer->stream); | |
59 stream_seek(demuxer->stream, 2); | |
60 filesize = stream_read_dword_le(demuxer->stream); | |
61 stream_skip(demuxer->stream, 4); | |
62 data_offset = stream_read_word_le(demuxer->stream); | |
63 stream_skip(demuxer->stream, 2); | |
64 | |
65 // create a new video stream header | |
66 sh_video = new_sh_video(demuxer, 0); | |
67 | |
68 // make sure the demuxer knows about the new video stream header | |
69 demuxer->video->sh = sh_video; | |
70 | |
71 // make sure that the video demuxer stream header knows about its | |
72 // parent video demuxer stream | |
73 sh_video->ds = demuxer->video; | |
74 | |
75 // load the BITMAPINFOHEADER | |
76 // allocate size and take the palette table into account | |
77 sh_video->bih = (BITMAPINFOHEADER *)malloc(data_offset - 12); | |
78 sh_video->bih->biSize = stream_read_dword_le(demuxer->stream); | |
79 sh_video->bih->biWidth = stream_read_dword_le(demuxer->stream); | |
80 sh_video->bih->biHeight = stream_read_dword_le(demuxer->stream); | |
81 sh_video->bih->biPlanes = stream_read_word_le(demuxer->stream); | |
82 sh_video->bih->biBitCount = stream_read_word_le(demuxer->stream); | |
83 sh_video->bih->biCompression = stream_read_dword_le(demuxer->stream); | |
84 sh_video->bih->biSizeImage = stream_read_dword_le(demuxer->stream); | |
85 sh_video->bih->biXPelsPerMeter = stream_read_dword_le(demuxer->stream); | |
86 sh_video->bih->biYPelsPerMeter = stream_read_dword_le(demuxer->stream); | |
87 sh_video->bih->biClrUsed = stream_read_dword_le(demuxer->stream); | |
88 sh_video->bih->biClrImportant = stream_read_dword_le(demuxer->stream); | |
89 // fetch the palette | |
90 stream_read(demuxer->stream, (unsigned char *)(sh_video->bih) + 40, | |
91 sh_video->bih->biClrUsed * 4); | |
92 | |
93 // load the data | |
94 bmp_image = (bmp_image_t *)malloc(sizeof(bmp_image_t)); | |
95 bmp_image->image_size = filesize - data_offset; | |
96 bmp_image->image_offset = data_offset; | |
97 | |
98 // custom fourcc for internal MPlayer use | |
99 sh_video->format = sh_video->bih->biCompression; | |
100 | |
101 sh_video->disp_w = sh_video->bih->biWidth; | |
102 sh_video->disp_h = sh_video->bih->biHeight; | |
103 | |
104 // get the speed | |
105 sh_video->fps = 2; | |
106 sh_video->frametime = 1 / sh_video->fps; | |
107 | |
108 demuxer->priv = bmp_image; | |
109 | |
110 return demuxer; | |
111 } |