Mercurial > mplayer.hg
annotate libmpdemux/demux_lmlm4.c @ 33226:aca622bb31cf
Convert all manual pages to UTF-8 encoding.
This is the 21st century, the world has been using UTF-8 for long enough and we
have waited far too long for legacy encoding stragglers to catch up with the
present day and age. No current distribution should have trouble dealing with
UTF-8 manual pages anymore and any that do must strictly be considered legacy
systems in need of local workarounds.
author | diego |
---|---|
date | Sat, 23 Apr 2011 14:11:49 +0000 |
parents | a86413775fbe |
children | 25667edae85c |
rev | line source |
---|---|
11590 | 1 /* |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
2 * LMLM4 MPEG4 Compression Card stream & file parser |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
3 * Copyright (C) 2003 Maxim Yevtyushkin <max@linuxmedialabs.com> |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
4 * based on SMJPEG file parser by Alex Beregszaszi |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
5 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
6 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
7 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
9 * 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:
25707
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
11 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
12 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
16 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
17 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
18 * 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:
25707
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
25707
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
11590 | 21 */ |
22 | |
23 #include <stdio.h> | |
24 #include <stdlib.h> | |
25 #include <unistd.h> | |
26 #include <string.h> /* strtok */ | |
27 | |
28 #include "config.h" | |
29 #include "mp_msg.h" | |
30 #include "help_mp.h" | |
31 | |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
21421
diff
changeset
|
32 #include "stream/stream.h" |
11590 | 33 #include "demuxer.h" |
34 #include "stheader.h" | |
35 | |
25607
9d0b189ce1b2
Fix illegal identifiers: Names starting with __ or _ and uppercase are reserved
diego
parents:
24357
diff
changeset
|
36 typedef struct FrameInfo |
11590 | 37 { |
38 ssize_t frameSize; | |
39 ssize_t paddingSize; | |
40 int frameType; | |
41 int channelNo; | |
42 } FrameInfo; | |
43 | |
44 #define FRAMETYPE_I 0 | |
45 #define FRAMETYPE_P 1 | |
46 #define FRAMETYPE_B 2 | |
47 #define FRAMETYPE_AUDIO_MPEG1L2 4 | |
48 #define FRAMETYPE_AUDIO_ULAW 5 | |
49 #define FRAMETYPE_AUDIO_ADPCM 6 | |
50 | |
51 #define PACKET_BLOCK_SIZE 0x00000200 | |
52 #define PACKET_BLOCK_LAST 0x000001FF | |
53 #define PACKET_BLOCK_MASK 0xFFFFFE00 | |
54 | |
55 #define MAX_PACKET_SIZE 1048576 // 1 Mb | |
56 | |
57 #define STREAM_START_CODE_SIZE 4 | |
58 | |
59 /* | |
60 // codes in MSB first | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
61 static unsigned int start_code [] = |
11590 | 62 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
63 0xB0010000, // VISUAL_OBJECT_SEQUENCE_START_CODE |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
64 0xB6010000, // VOP_START_CODE |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
65 0x04C4FDFF, // MPEG1LAYERII_START_CODE |
11590 | 66 0x00000000 // end of start codes list |
67 }; | |
68 */ | |
69 | |
70 static int imeHeaderValid(FrameInfo *frame) | |
71 { | |
72 if ( frame->channelNo > 7 || | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
73 frame->frameSize > MAX_PACKET_SIZE || frame->frameSize <= 0) |
11590 | 74 { |
31858
bf37d5ac4516
Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents:
31609
diff
changeset
|
75 mp_msg(MSGT_DEMUX, MSGL_V, |
bf37d5ac4516
Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents:
31609
diff
changeset
|
76 "Invalid packet in LMLM4 stream: ch=%d size=%zd\n", |
bf37d5ac4516
Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents:
31609
diff
changeset
|
77 frame->channelNo, frame->frameSize); |
11590 | 78 return 0; |
79 } | |
80 switch (frame->frameType) { | |
81 case FRAMETYPE_I: | |
82 case FRAMETYPE_P: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
83 case FRAMETYPE_B: |
11590 | 84 case FRAMETYPE_AUDIO_MPEG1L2: |
85 case FRAMETYPE_AUDIO_ULAW: | |
86 case FRAMETYPE_AUDIO_ADPCM: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
87 break; |
11590 | 88 default: |
89 mp_msg(MSGT_DEMUX, MSGL_V, "Invalid packet in LMLM4 stream (wrong packet type %d)\n", frame->frameType); | |
90 return 0; | |
91 } | |
92 return 1; | |
93 } | |
94 | |
95 /* | |
96 int searchMPEG4Stream(demuxer_t* demuxer, IME6400Header *imeHeader) | |
97 { | |
98 void *data; | |
99 ssize_t imeHeaderSize = sizeof(IME6400Header); | |
100 ssize_t dataSize = sizeof(IME6400Header) * 3; | |
101 ssize_t ptr = imeHeaderSize * 2; | |
102 int errNo, startCodeNo; | |
103 off_t pos; | |
104 | |
105 data = malloc(dataSize); | |
106 | |
107 imeHeaderSwap(imeHeader); | |
108 memcpy(data + imeHeaderSize, imeHeader, imeHeaderSize); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
109 |
11590 | 110 // printHex(data + imeHeaderSize, imeHeaderSize); |
111 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
112 while ((errNo = stream_read(demuxer->stream, data + imeHeaderSize * 2 , imeHeaderSize)) == imeHeaderSize) |
11590 | 113 { |
114 // printHex(data + imeHeaderSize * 2, imeHeaderSize); | |
115 | |
116 pos = stream_tell(demuxer->stream); | |
117 while (dataSize - ptr >= STREAM_START_CODE_SIZE) { | |
118 startCodeNo = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
119 while (start_code[startCodeNo]) |
11590 | 120 { |
121 if (memcmp(&start_code[startCodeNo], data + ptr, STREAM_START_CODE_SIZE) == 0) // start code match | |
122 { | |
123 memcpy(imeHeader, data + ptr - imeHeaderSize, imeHeaderSize); | |
124 imeHeaderSwap(imeHeader); | |
125 if (imeHeaderValid(imeHeader)) | |
126 { | |
127 stream_seek(demuxer->stream, pos - (dataSize - ptr)); | |
128 free(data); | |
129 return 0; | |
130 } | |
131 } | |
132 startCodeNo++; | |
133 } | |
134 ptr++; | |
135 } | |
136 memcpy(data,data + imeHeaderSize, imeHeaderSize * 2); | |
137 ptr -= imeHeaderSize; | |
138 } | |
139 | |
140 free(data); | |
141 return errNo; | |
142 } | |
143 */ | |
144 | |
145 static int getFrame(demuxer_t *demuxer, FrameInfo *frameInfo) | |
146 { | |
147 unsigned int packetSize; | |
148 | |
149 frameInfo->channelNo = stream_read_word(demuxer->stream); | |
150 frameInfo->frameType = stream_read_word(demuxer->stream); | |
151 packetSize=stream_read_dword(demuxer->stream); | |
152 | |
153 if(stream_eof(demuxer->stream)){ | |
154 frameInfo->frameSize = 0; | |
155 return 0; | |
156 } | |
157 | |
158 frameInfo->frameSize = packetSize - 8; //sizeof(IME6400Header); | |
159 frameInfo->paddingSize = (packetSize & PACKET_BLOCK_LAST) ? PACKET_BLOCK_SIZE - (packetSize & PACKET_BLOCK_LAST) : 0; | |
160 | |
31858
bf37d5ac4516
Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents:
31609
diff
changeset
|
161 mp_msg(MSGT_DEMUX, MSGL_DBG2, "typ: %d chan: %d size: %zd pad: %zd\n", |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
162 frameInfo->frameType, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
163 frameInfo->channelNo, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
164 frameInfo->frameSize, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
165 frameInfo->paddingSize); |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
166 |
11590 | 167 if(!imeHeaderValid(frameInfo)){ |
168 // skip this packet | |
169 stream_skip(demuxer->stream,PACKET_BLOCK_SIZE-8); | |
170 frameInfo->frameSize = 0; | |
171 return -1; | |
172 } | |
173 | |
174 return 1; | |
175 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
176 |
16175 | 177 static int lmlm4_check_file(demuxer_t* demuxer) |
11590 | 178 { |
179 FrameInfo frameInfo; | |
180 unsigned int first; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
181 |
11590 | 182 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for LMLM4 Stream Format\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
183 |
11590 | 184 if(getFrame(demuxer, &frameInfo)!=1){ |
185 stream_skip(demuxer->stream,-8); | |
11790 | 186 mp_msg(MSGT_DEMUX, MSGL_V, "LMLM4 Stream Format not found\n"); |
11590 | 187 return 0; |
188 } | |
189 first=stream_read_dword(demuxer->stream); | |
190 stream_skip(demuxer->stream,-12); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
191 |
11590 | 192 mp_msg(MSGT_DEMUXER,MSGL_V,"LMLM4: first=0x%08X\n",first); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
193 |
11590 | 194 switch(frameInfo.frameType){ |
195 case FRAMETYPE_AUDIO_MPEG1L2: | |
196 if( (first & 0xffe00000) != 0xffe00000 ){ | |
197 mp_msg(MSGT_DEMUXER,MSGL_V,"LMLM4: not mpeg audio\n"); | |
198 return 0; | |
199 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
200 if((4-((first>>17)&3))!=2){ |
11590 | 201 mp_msg(MSGT_DEMUXER,MSGL_V,"LMLM4: not layer-2\n"); |
202 return 0; | |
203 } | |
204 if(((first>>10)&0x3)==3){ | |
205 mp_msg(MSGT_DEMUXER,MSGL_V,"LMLM4: invalid audio sampelrate\n"); | |
206 return 0; | |
207 } | |
208 mp_msg(MSGT_DEMUXER,MSGL_V,"LMLM4: first packet is audio, header checks OK!\n"); | |
209 break; | |
210 // TODO: add checks for video header too, for case of disabled audio | |
211 } | |
212 | |
213 | |
214 // stream_reset(demuxer->stream); | |
215 mp_msg(MSGT_DEMUX, MSGL_V, "LMLM4 Stream Format found\n"); | |
216 | |
16175 | 217 return DEMUXER_TYPE_LMLM4; |
11590 | 218 } |
219 | |
220 static int video = 0; | |
221 static int frames= 0; | |
222 | |
223 // return value: | |
224 // 0 = EOF or no stream found | |
225 // 1 = successfully read a packet | |
16175 | 226 static int demux_lmlm4_fill_buffer(demuxer_t *demux, demux_stream_t *ds) |
11590 | 227 { |
228 FrameInfo frameInfo; | |
229 double pts; | |
230 int id=1; | |
231 int ret; | |
232 | |
24357 | 233 //hdr: |
11590 | 234 demux->filepos = stream_tell(demux->stream); |
17366 | 235 mp_msg(MSGT_DEMUX, MSGL_DBG2, "fpos = %"PRId64"\n", (int64_t)demux->filepos); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
236 |
11590 | 237 ret=getFrame(demux, &frameInfo); |
238 if(ret<=0) return ret; // EOF/error | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
239 |
11590 | 240 pts=demux->video->sh ? frames*((sh_video_t*)(demux->video->sh))->frametime : 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
241 |
11590 | 242 switch(frameInfo.frameType){ |
243 case FRAMETYPE_AUDIO_MPEG1L2: | |
244 mp_dbg(MSGT_DEMUX, MSGL_DBG2, "Audio Packet\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
245 if (!video) |
11590 | 246 { |
247 stream_skip(demux->stream, frameInfo.frameSize + frameInfo.paddingSize); | |
248 mp_msg(MSGT_DEMUX, MSGL_V, "Skip Audio Packet\n"); | |
249 return -1; //goto hdr; | |
250 } | |
251 if(demux->audio->id==-1){ | |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
29263
diff
changeset
|
252 if(!demux->a_streams[id]) new_sh_audio(demux,id, NULL); |
11590 | 253 demux->audio->id=id; |
254 demux->audio->sh=demux->a_streams[id]; | |
255 ((sh_audio_t*)(demux->audio->sh))->format=0x50; // mpeg audio layer 1/2 | |
256 } | |
257 if(demux->audio->id==id) | |
258 ds_read_packet(demux->audio, demux->stream, frameInfo.frameSize, | |
259 pts, demux->filepos, 0); | |
260 else | |
261 stream_skip(demux->stream,frameInfo.frameSize); | |
262 break; | |
263 case FRAMETYPE_I: | |
264 if (!video) { | |
265 video = 1; | |
266 mp_dbg(MSGT_DEMUX, MSGL_DBG2, "First Video Packet\n"); | |
267 } | |
268 case FRAMETYPE_P: | |
269 frames=(frames+1)&(1024*1024-1); // wrap around at 4 hrs to avoid inaccurate float calculations | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
270 if (!video) |
11590 | 271 { |
272 stream_skip(demux->stream, frameInfo.frameSize + frameInfo.paddingSize); | |
273 mp_msg(MSGT_DEMUX, MSGL_V, "Skip Video P Packet\n"); | |
274 return -1; //goto hdr; | |
275 } | |
276 mp_dbg(MSGT_DEMUX, MSGL_DBG2, "Video Packet\n"); | |
277 if(demux->video->id==-1){ | |
278 if(!demux->v_streams[id]) new_sh_video(demux,id); | |
279 demux->video->id=id; | |
280 demux->video->sh=demux->v_streams[id]; | |
281 ((sh_video_t*)(demux->video->sh))->format=0x10000004; // mpeg4-ES | |
282 } | |
283 if(demux->video->id==id) | |
284 ds_read_packet(demux->video, demux->stream, frameInfo.frameSize, | |
285 pts, demux->filepos, 0); | |
286 break; | |
287 default: | |
288 stream_skip(demux->stream,frameInfo.frameSize); | |
289 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
290 |
11590 | 291 stream_skip(demux->stream, frameInfo.paddingSize); |
292 | |
293 return 1; | |
294 } | |
295 | |
16175 | 296 static demuxer_t* demux_open_lmlm4(demuxer_t* demuxer){ |
297 sh_audio_t *sh_audio=NULL; | |
298 sh_video_t *sh_video=NULL; | |
11590 | 299 |
300 #if 0 | |
301 sh_video_t* sh_video; | |
302 sh_audio_t* sh_audio; | |
303 unsigned int htype = 0, hleng; | |
304 int i = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
305 |
11590 | 306 sh_video = new_sh_video(demuxer, 0); |
307 demuxer->video->sh = sh_video; | |
308 sh_video->ds = demuxer->video; | |
309 sh_video->disp_w = 640; | |
310 sh_video->disp_h = 480; | |
311 sh_video->format = mmioFOURCC('D','I','V','X'); | |
312 | |
32123 | 313 sh_video->bih = calloc(1, sizeof(*sh_video->bih)); |
11590 | 314 |
315 /* these are false values */ | |
316 sh_video->bih->biSize = 40; | |
317 sh_video->bih->biWidth = sh_video->disp_w; | |
318 sh_video->bih->biHeight = sh_video->disp_h; | |
319 sh_video->bih->biPlanes = 3; | |
320 sh_video->bih->biBitCount = 16; | |
321 sh_video->bih->biCompression = sh_video->format; | |
322 sh_video->bih->biSizeImage = sh_video->disp_w*sh_video->disp_h; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
323 |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
29263
diff
changeset
|
324 sh_audio = new_sh_audio(demuxer, 0, NULL); |
11590 | 325 demuxer->audio->sh = sh_audio; |
326 sh_audio->ds = demuxer->audio; | |
327 | |
32121 | 328 sh_audio->wf = calloc(1, sizeof(*sh_audio->wf)); |
11590 | 329 |
330 sh_audio->samplerate = 48000; | |
331 sh_audio->wf->wBitsPerSample = 16; | |
332 sh_audio->channels = 2; | |
333 sh_audio->format = 0x50; | |
334 sh_audio->wf->wFormatTag = sh_audio->format; | |
335 sh_audio->wf->nChannels = sh_audio->channels; | |
336 sh_audio->wf->nSamplesPerSec = sh_audio->samplerate; | |
337 sh_audio->wf->nAvgBytesPerSec = sh_audio->wf->nChannels* | |
338 sh_audio->wf->wBitsPerSample*sh_audio->wf->nSamplesPerSec/8; | |
339 sh_audio->wf->nBlockAlign = sh_audio->channels *2; | |
340 sh_audio->wf->cbSize = 0; | |
341 | |
342 #endif | |
343 | |
344 demuxer->seekable = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
345 |
16175 | 346 if(!ds_fill_buffer(demuxer->video)){ |
347 mp_msg(MSGT_DEMUXER,MSGL_INFO,"LMLM4: " MSGTR_MissingVideoStream); | |
348 demuxer->video->sh=NULL; | |
349 } else { | |
350 sh_video=demuxer->video->sh;sh_video->ds=demuxer->video; | |
351 } | |
352 if(demuxer->audio->id!=-2) { | |
353 if(!ds_fill_buffer(demuxer->audio)){ | |
354 mp_msg(MSGT_DEMUXER,MSGL_INFO,"LMLM4: " MSGTR_MissingAudioStream); | |
355 demuxer->audio->sh=NULL; | |
356 } else { | |
357 sh_audio=demuxer->audio->sh;sh_audio->ds=demuxer->audio; | |
358 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
359 } |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
360 |
16175 | 361 return demuxer; |
11590 | 362 } |
363 | |
16175 | 364 static void demux_close_lmlm4(demuxer_t *demuxer) |
11590 | 365 { |
366 // printf("Close LMLM4 Stream\n"); | |
367 return; | |
368 } | |
16175 | 369 |
370 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25607
diff
changeset
|
371 const demuxer_desc_t demuxer_desc_lmlm4 = { |
16175 | 372 "LMLM4 MPEG4 Compression Card stream demuxer", |
373 "lmlm4", | |
374 "RAW LMLM4", | |
375 "Maxim Yevtyushkin", | |
376 "", | |
377 DEMUXER_TYPE_LMLM4, | |
378 0, // unsafe autodetect | |
379 lmlm4_check_file, | |
380 demux_lmlm4_fill_buffer, | |
381 demux_open_lmlm4, | |
382 demux_close_lmlm4, | |
383 NULL, | |
384 NULL | |
385 }; |