Mercurial > mplayer.hg
annotate libmpdemux/demux_smjpeg.c @ 36182:8587ae275646
Rename HAVE_CMOV to HAVE_I686 for FFmpeg.
Keep the cmov name in configure since it is less
confusing, since cmov is what we test for and
also since for example VIA C3 sometimes is considered
i686 that does not implement the optional CMOV
instruction.
author | reimar |
---|---|
date | Fri, 17 May 2013 15:59:38 +0000 |
parents | c08363dc5320 |
children | f3c835ddce85 |
rev | line source |
---|---|
7382 | 1 /* |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
2 * SMJPEG file parser |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
3 * copyright (c) 2002 Alex Beregszaszi |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
4 * based on text by Arpi (SMJPEG-format.txt) and later on |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
5 * http://www.lokigames.com/development/download/smjpeg/SMJPEG.txt |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
6 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
7 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
8 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
9 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
10 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
11 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
12 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
13 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
14 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
17 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
18 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
19 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
22 */ |
7382 | 23 |
24 #include <stdio.h> | |
25 #include <stdlib.h> | |
26 #include <unistd.h> | |
27 #include <string.h> /* strtok */ | |
28 | |
29 #include "config.h" | |
30 #include "mp_msg.h" | |
31 #include "help_mp.h" | |
32 | |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
21421
diff
changeset
|
33 #include "stream/stream.h" |
7382 | 34 #include "demuxer.h" |
35 #include "stheader.h" | |
36 | |
16175 | 37 static int smjpeg_check_file(demuxer_t* demuxer){ |
7382 | 38 int orig_pos = stream_tell(demuxer->stream); |
11109
084c271c785e
10l found by Mark Berryman <mplayer@theberrymans.com>
alex
parents:
7382
diff
changeset
|
39 char buf[8]; |
7382 | 40 int version; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
41 |
7382 | 42 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for SMJPEG\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
43 |
7382 | 44 if (stream_read_word(demuxer->stream) == 0xA) |
45 { | |
46 stream_read(demuxer->stream, buf, 6); | |
47 buf[7] = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
48 |
7382 | 49 if (strncmp("SMJPEG", buf, 6)) { |
50 mp_msg(MSGT_DEMUX, MSGL_DBG2, "Failed: SMJPEG\n"); | |
51 return 0; | |
52 } | |
53 } | |
54 else | |
55 return 0; | |
56 | |
57 version = stream_read_dword(demuxer->stream); | |
58 if (version != 0) | |
59 { | |
60 mp_msg(MSGT_DEMUX, MSGL_ERR, "Unknown version (%d) of SMJPEG. Please report!\n", | |
61 version); | |
62 return 0; | |
63 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
64 |
7382 | 65 stream_seek(demuxer->stream, orig_pos); |
66 | |
16175 | 67 return DEMUXER_TYPE_SMJPEG; |
7382 | 68 } |
69 | |
70 | |
71 // return value: | |
72 // 0 = EOF or no stream found | |
73 // 1 = successfully read a packet | |
16175 | 74 static int demux_smjpeg_fill_buffer(demuxer_t *demux, demux_stream_t *ds) |
7382 | 75 { |
76 int dtype, dsize, dpts; | |
77 | |
78 demux->filepos = stream_tell(demux->stream); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
79 |
7382 | 80 dtype = stream_read_dword_le(demux->stream); |
81 dpts = stream_read_dword(demux->stream); | |
82 dsize = stream_read_dword(demux->stream); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
83 |
7382 | 84 switch(dtype) |
85 { | |
86 case mmioFOURCC('s','n','d','D'): | |
87 /* fixme, but no decoder implemented yet */ | |
88 ds_read_packet(demux->audio, demux->stream, dsize, | |
89 (float)dpts/1000.0, demux->filepos, 0); | |
90 break; | |
91 case mmioFOURCC('v','i','d','D'): | |
92 ds_read_packet(demux->video, demux->stream, dsize, | |
93 (float)dpts/1000.0, demux->filepos, 0); | |
94 break; | |
95 case mmioFOURCC('D','O','N','E'): | |
96 return 1; | |
97 default: | |
98 return 0; | |
99 } | |
100 | |
101 return 1; | |
102 } | |
103 | |
16175 | 104 static demuxer_t* demux_open_smjpeg(demuxer_t* demuxer){ |
7382 | 105 sh_video_t* sh_video; |
106 sh_audio_t* sh_audio; | |
107 unsigned int htype = 0, hleng; | |
108 int i = 0; | |
109 | |
110 /* file header */ | |
111 stream_skip(demuxer->stream, 8); /* \x00\x0aSMJPEG */ | |
112 stream_skip(demuxer->stream, 4); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
113 |
7382 | 114 mp_msg(MSGT_DEMUX, MSGL_INFO, "This clip is %d seconds\n", |
115 stream_read_dword(demuxer->stream)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
116 |
7382 | 117 /* stream header */ |
118 while (i < 3) | |
119 { | |
120 i++; | |
121 htype = stream_read_dword_le(demuxer->stream); | |
122 if (htype == mmioFOURCC('H','E','N','D')) | |
123 break; | |
124 hleng = (stream_read_word(demuxer->stream)<<16)|stream_read_word(demuxer->stream); | |
125 switch(htype) | |
126 { | |
127 case mmioFOURCC('_','V','I','D'): | |
128 sh_video = new_sh_video(demuxer, 0); | |
129 demuxer->video->sh = sh_video; | |
130 sh_video->ds = demuxer->video; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
131 |
32105 | 132 sh_video->bih = calloc(1, sizeof(*sh_video->bih)); |
7382 | 133 |
134 stream_skip(demuxer->stream, 4); /* number of frames */ | |
135 // sh_video->fps = 24; | |
136 // sh_video->frametime = 1.0f/sh_video->fps; | |
137 sh_video->disp_w = stream_read_word(demuxer->stream); | |
138 sh_video->disp_h = stream_read_word(demuxer->stream); | |
139 sh_video->format = stream_read_dword_le(demuxer->stream); | |
140 | |
141 /* these are false values */ | |
142 sh_video->bih->biSize = 40; | |
143 sh_video->bih->biWidth = sh_video->disp_w; | |
144 sh_video->bih->biHeight = sh_video->disp_h; | |
145 sh_video->bih->biPlanes = 3; | |
146 sh_video->bih->biBitCount = 12; | |
147 sh_video->bih->biCompression = sh_video->format; | |
148 sh_video->bih->biSizeImage = sh_video->disp_w*sh_video->disp_h; | |
149 break; | |
150 case mmioFOURCC('_','S','N','D'): | |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
29263
diff
changeset
|
151 sh_audio = new_sh_audio(demuxer, 0, NULL); |
26299
4d56038ec730
Fix lots and lots of other demuxers broken by r26301
reimar
parents:
25707
diff
changeset
|
152 demuxer->audio->id = 0; |
7382 | 153 demuxer->audio->sh = sh_audio; |
154 sh_audio->ds = demuxer->audio; | |
155 | |
32105 | 156 sh_audio->wf = calloc(1, sizeof(*sh_audio->wf)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
157 |
7382 | 158 sh_audio->samplerate = stream_read_word(demuxer->stream); |
159 sh_audio->wf->wBitsPerSample = stream_read_char(demuxer->stream); | |
160 sh_audio->channels = stream_read_char(demuxer->stream); | |
161 sh_audio->format = stream_read_dword_le(demuxer->stream); | |
162 sh_audio->wf->wFormatTag = sh_audio->format; | |
163 sh_audio->wf->nChannels = sh_audio->channels; | |
164 sh_audio->wf->nSamplesPerSec = sh_audio->samplerate; | |
165 sh_audio->wf->nAvgBytesPerSec = sh_audio->wf->nChannels* | |
166 sh_audio->wf->wBitsPerSample*sh_audio->wf->nSamplesPerSec/8; | |
167 sh_audio->wf->nBlockAlign = sh_audio->channels *2; | |
168 sh_audio->wf->cbSize = 0; | |
169 break; | |
170 case mmioFOURCC('_','T','X','T'): | |
171 stream_skip(demuxer->stream, stream_read_dword(demuxer->stream)); | |
172 break; | |
173 } | |
174 } | |
175 | |
176 demuxer->seekable = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
177 |
16175 | 178 return demuxer; |
7382 | 179 } |
180 | |
16175 | 181 static void demux_close_smjpeg(demuxer_t *demuxer) |
7382 | 182 { |
183 return; | |
184 } | |
16175 | 185 |
186 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
187 const demuxer_desc_t demuxer_desc_smjpeg = { |
16175 | 188 "smjpeg demuxer", |
189 "smjpeg", | |
190 "SMJPEG", | |
191 "Alex Beregszasi", | |
192 "", | |
193 DEMUXER_TYPE_SMJPEG, | |
194 1, // safe autodetect | |
195 smjpeg_check_file, | |
196 demux_smjpeg_fill_buffer, | |
197 demux_open_smjpeg, | |
198 demux_close_smjpeg, | |
199 NULL, | |
200 NULL | |
201 }; |