Mercurial > mplayer.hg
annotate libmpdemux/demux_lmlm4.c @ 33882:08a90b0e44e1
doxygen: drop filename from @file directive
Specifying the filename is not necessary and brittle across renames.
author | diego |
---|---|
date | Thu, 11 Aug 2011 17:45:38 +0000 |
parents | 25667edae85c |
children | 8f81a826c86e |
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, |
33841
25667edae85c
cleanup: adjust printf format strings to match parameter types
diego
parents:
32123
diff
changeset
|
76 "Invalid packet in LMLM4 stream: ch=%d size=%zu\n", |
31858
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 | |
33841
25667edae85c
cleanup: adjust printf format strings to match parameter types
diego
parents:
32123
diff
changeset
|
161 mp_msg(MSGT_DEMUX, MSGL_DBG2, "typ: %d chan: %d size: %zu pad: %zu\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 }; |