annotate libmpdemux/demux_bmp.c @ 10252:d275152390ee

I've found some time to implement the encoding support for the new DivX API. Now it's possible to play and encode movies with the latest DivX release. One thing that doesn't work is the new Video Buffer Verifier (VBV) multipass encoding. The encoder segfaults. Maybe it just isn't supported with the standard profile of the released binary encoder. Andreas Hess <jaska@gmx.net>
author arpi
date Fri, 06 Jun 2003 19:57:37 +0000
parents 1a26db279e50
children c2e17a510b4b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5214
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
1 /*
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
2 BMP file parser for the MPlayer program
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
3 by Mike Melanson
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
4 */
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
5
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
6 #include <stdio.h>
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
7 #include <stdlib.h>
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
8 #include <unistd.h>
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
9
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
10 #include "config.h"
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
11 #include "mp_msg.h"
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
12 #include "help_mp.h"
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
13
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
14 #include "stream.h"
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
15 #include "demuxer.h"
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
16 #include "stheader.h"
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
17
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
18 typedef struct {
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
19 int image_size;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
20 int image_offset;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
21 } bmp_image_t;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
22
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
23 // Check if a file is a BMP file depending on whether starts with 'BM'
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
24 int bmp_check_file(demuxer_t *demuxer)
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
25 {
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
26 if (stream_read_word(demuxer->stream) == (('B' << 8) | 'M'))
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
27 return 1;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
28 else
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
29 return 0;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
30 }
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
31
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
32 // return value:
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
33 // 0 = EOF or no stream found
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
34 // 1 = successfully read a packet
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
35 int demux_bmp_fill_buffer(demuxer_t *demuxer)
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
36 {
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
37 bmp_image_t *bmp_image = (bmp_image_t *)demuxer->priv;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
38
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
39 stream_reset(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
40 stream_seek(demuxer->stream, bmp_image->image_offset);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
41 ds_read_packet(demuxer->video, demuxer->stream, bmp_image->image_size,
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
42 0, bmp_image->image_offset, 1);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
43
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
44 return 1;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
45 }
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
46
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
47 demuxer_t* demux_open_bmp(demuxer_t* demuxer)
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
48 {
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
49 sh_video_t *sh_video = NULL;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
50 unsigned int filesize;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
51 unsigned int data_offset;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
52 bmp_image_t *bmp_image;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
53
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
54 // go back to the beginning
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
55 stream_reset(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
56 stream_seek(demuxer->stream, 2);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
57 filesize = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
58 stream_skip(demuxer->stream, 4);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
59 data_offset = stream_read_word_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
60 stream_skip(demuxer->stream, 2);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
61
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
62 // create a new video stream header
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
63 sh_video = new_sh_video(demuxer, 0);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
64
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
65 // make sure the demuxer knows about the new video stream header
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
66 demuxer->video->sh = sh_video;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
67
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
68 // make sure that the video demuxer stream header knows about its
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
69 // parent video demuxer stream
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
70 sh_video->ds = demuxer->video;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
71
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
72 // load the BITMAPINFOHEADER
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
73 // allocate size and take the palette table into account
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
74 sh_video->bih = (BITMAPINFOHEADER *)malloc(data_offset - 12);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
75 sh_video->bih->biSize = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
76 sh_video->bih->biWidth = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
77 sh_video->bih->biHeight = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
78 sh_video->bih->biPlanes = stream_read_word_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
79 sh_video->bih->biBitCount = stream_read_word_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
80 sh_video->bih->biCompression = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
81 sh_video->bih->biSizeImage = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
82 sh_video->bih->biXPelsPerMeter = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
83 sh_video->bih->biYPelsPerMeter = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
84 sh_video->bih->biClrUsed = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
85 sh_video->bih->biClrImportant = stream_read_dword_le(demuxer->stream);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
86 // fetch the palette
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
87 stream_read(demuxer->stream, (unsigned char *)(sh_video->bih) + 40,
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
88 sh_video->bih->biClrUsed * 4);
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
89
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
90 // load the data
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
91 bmp_image = (bmp_image_t *)malloc(sizeof(bmp_image_t));
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
92 bmp_image->image_size = filesize - data_offset;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
93 bmp_image->image_offset = data_offset;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
94
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
95 // custom fourcc for internal MPlayer use
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
96 sh_video->format = sh_video->bih->biCompression;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
97
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
98 sh_video->disp_w = sh_video->bih->biWidth;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
99 sh_video->disp_h = sh_video->bih->biHeight;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
100
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
101 // get the speed
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
102 sh_video->fps = 2;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
103 sh_video->frametime = 1 / sh_video->fps;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
104
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
105 demuxer->priv = bmp_image;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
106
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
107 return demuxer;
dd79075bbd98 added a BMP file demuxer...yeah, that's right, a static image BMP file
melanson
parents:
diff changeset
108 }
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5214
diff changeset
109
8a357300d0ec Added demuxer uninit
albeu
parents: 5214
diff changeset
110 void demux_close_bmp(demuxer_t* demuxer) {
8a357300d0ec Added demuxer uninit
albeu
parents: 5214
diff changeset
111 bmp_image_t *bmp_image = demuxer->priv;
8a357300d0ec Added demuxer uninit
albeu
parents: 5214
diff changeset
112
8a357300d0ec Added demuxer uninit
albeu
parents: 5214
diff changeset
113 if(!bmp_image)
8a357300d0ec Added demuxer uninit
albeu
parents: 5214
diff changeset
114 return;
8a357300d0ec Added demuxer uninit
albeu
parents: 5214
diff changeset
115 free(bmp_image);
8a357300d0ec Added demuxer uninit
albeu
parents: 5214
diff changeset
116 }