2 BMP file parser for the MPlayer program
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'))
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);
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
);
87 stream_read(demuxer
->stream
, (unsigned char *)(sh_video
->bih
) + 40,
88 sh_video
->bih
->biClrUsed
* 4);
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
;
103 sh_video
->frametime
= 1 / sh_video
->fps
;
105 demuxer
->priv
= bmp_image
;
110 void demux_close_bmp(demuxer_t
* demuxer
) {
111 bmp_image_t
*bmp_image
= demuxer
->priv
;