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 }