Mercurial > libavformat.hg
annotate mm.c @ 1477:56fe078ffc27 libavformat
updating nut demuxer to latest spec
no muxing yet
no index yet
no seeking yet
libnuts crcs dont match mine (didnt investigate yet)
samplerate is stored wrong by libnut (demuxer has a workaround)
code is not clean or beautifull yet, but i thought its better to commit early before someone unneccesarily wastes his time duplicating the work
demuxer split from muxer
author | michael |
---|---|
date | Sat, 11 Nov 2006 01:35:50 +0000 |
parents | 0899bfe4105c |
children | a782462e2497 |
rev | line source |
---|---|
950
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
1 /* |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
2 * American Laser Games MM Format Demuxer |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
3 * Copyright (c) 2006 Peter Ross |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1187
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1187
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1187
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
950
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1187
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
950
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1187
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
950
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
16 * |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1187
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
1187 | 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
950
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
20 */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
21 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
22 /** |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
23 * @file mm.c |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
24 * American Laser Games MM Format Demuxer |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
25 * by Peter Ross (suxen_drol at hotmail dot com) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
26 * |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
27 * The MM format was used by IBM-PC ports of ALG's "arcade shooter" games, |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
28 * including Mad Dog McCree and Crime Patrol. |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
29 * |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
30 * Technical details here: |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
31 * http://wiki.multimedia.cx/index.php?title=American_Laser_Games_MM |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
32 */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
33 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
34 #include "avformat.h" |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
35 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
36 #define MM_PREAMBLE_SIZE 6 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
37 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
38 #define MM_TYPE_HEADER 0x0 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
39 #define MM_TYPE_INTER 0x5 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
40 #define MM_TYPE_INTRA 0x8 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
41 #define MM_TYPE_INTRA_HH 0xc |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
42 #define MM_TYPE_INTER_HH 0xd |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
43 #define MM_TYPE_INTRA_HHV 0xe |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
44 #define MM_TYPE_INTER_HHV 0xf |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
45 #define MM_TYPE_AUDIO 0x15 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
46 #define MM_TYPE_PALETTE 0x31 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
47 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
48 #define MM_HEADER_LEN_V 0x16 /* video only */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
49 #define MM_HEADER_LEN_AV 0x18 /* video + audio */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
50 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
51 #define MM_PALETTE_COUNT 128 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
52 #define MM_PALETTE_SIZE (MM_PALETTE_COUNT*3) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
53 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
54 typedef struct { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
55 AVPaletteControl palette_control; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
56 unsigned int audio_pts, video_pts; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
57 } MmDemuxContext; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
58 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
59 static int mm_probe(AVProbeData *p) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
60 { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
61 /* the first chunk is always the header */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
62 if (p->buf_size < MM_PREAMBLE_SIZE) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
63 return 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
64 if (LE_16(&p->buf[0]) != MM_TYPE_HEADER) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
65 return 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
66 if (LE_32(&p->buf[2]) != MM_HEADER_LEN_V && LE_32(&p->buf[2]) != MM_HEADER_LEN_AV) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
67 return 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
68 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
69 /* only return half certainty since this check is a bit sketchy */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
70 return AVPROBE_SCORE_MAX / 2; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
71 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
72 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
73 static int mm_read_header(AVFormatContext *s, |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
74 AVFormatParameters *ap) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
75 { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
76 MmDemuxContext *mm = (MmDemuxContext *)s->priv_data; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
77 ByteIOContext *pb = &s->pb; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
78 AVStream *st; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
79 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
80 unsigned int type, length; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
81 unsigned int frame_rate, width, height; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
82 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
83 type = get_le16(pb); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
84 length = get_le32(pb); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
85 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
86 if (type != MM_TYPE_HEADER) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
87 return AVERROR_INVALIDDATA; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
88 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
89 /* read header */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
90 get_le16(pb); /* total number of chunks */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
91 frame_rate = get_le16(pb); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
92 get_le16(pb); /* ibm-pc video bios mode */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
93 width = get_le16(pb); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
94 height = get_le16(pb); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
95 url_fseek(pb, length - 10, SEEK_CUR); /* unknown data */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
96 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
97 /* video stream */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
98 st = av_new_stream(s, 0); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
99 if (!st) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
100 return AVERROR_NOMEM; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
101 st->codec->codec_type = CODEC_TYPE_VIDEO; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
102 st->codec->codec_id = CODEC_ID_MMVIDEO; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
103 st->codec->codec_tag = 0; /* no fourcc */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
104 st->codec->width = width; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
105 st->codec->height = height; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
106 st->codec->palctrl = &mm->palette_control; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
107 av_set_pts_info(st, 64, 1, frame_rate); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
108 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
109 /* audio stream */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
110 if (length == MM_HEADER_LEN_AV) { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
111 st = av_new_stream(s, 0); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
112 if (!st) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
113 return AVERROR_NOMEM; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
114 st->codec->codec_type = CODEC_TYPE_AUDIO; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
115 st->codec->codec_tag = 0; /* no fourcc */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
116 st->codec->codec_id = CODEC_ID_PCM_U8; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
117 st->codec->channels = 1; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
118 st->codec->sample_rate = 8000; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
119 av_set_pts_info(st, 64, 1, 8000); /* 8000 hz */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
120 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
121 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
122 mm->palette_control.palette_changed = 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
123 mm->audio_pts = 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
124 mm->video_pts = 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
125 return 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
126 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
127 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
128 static int mm_read_packet(AVFormatContext *s, |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
129 AVPacket *pkt) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
130 { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
131 MmDemuxContext *mm = (MmDemuxContext *)s->priv_data; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
132 ByteIOContext *pb = &s->pb; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
133 unsigned char preamble[MM_PREAMBLE_SIZE]; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
134 unsigned char pal[MM_PALETTE_SIZE]; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
135 unsigned int type, length; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
136 int i; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
137 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
138 while(1) { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
139 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
140 if (get_buffer(pb, preamble, MM_PREAMBLE_SIZE) != MM_PREAMBLE_SIZE) { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
141 return AVERROR_IO; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
142 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
143 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
144 type = LE_16(&preamble[0]); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
145 length = LE_16(&preamble[2]); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
146 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
147 switch(type) { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
148 case MM_TYPE_PALETTE : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
149 url_fseek(pb, 4, SEEK_CUR); /* unknown data */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
150 if (get_buffer(pb, pal, MM_PALETTE_SIZE) != MM_PALETTE_SIZE) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
151 return AVERROR_IO; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
152 url_fseek(pb, length - (4 + MM_PALETTE_SIZE), SEEK_CUR); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
153 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
154 for (i=0; i<MM_PALETTE_COUNT; i++) { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
155 int r = pal[i*3 + 0]; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
156 int g = pal[i*3 + 1]; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
157 int b = pal[i*3 + 2]; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
158 mm->palette_control.palette[i] = (r << 16) | (g << 8) | (b); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
159 /* repeat palette, where each components is multiplied by four */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
160 mm->palette_control.palette[i+128] = (r << 18) | (g << 10) | (b<<2); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
161 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
162 mm->palette_control.palette_changed = 1; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
163 break; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
164 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
165 case MM_TYPE_INTER : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
166 case MM_TYPE_INTRA : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
167 case MM_TYPE_INTRA_HH : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
168 case MM_TYPE_INTER_HH : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
169 case MM_TYPE_INTRA_HHV : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
170 case MM_TYPE_INTER_HHV : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
171 /* output preamble + data */ |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
172 if (av_new_packet(pkt, length + MM_PREAMBLE_SIZE)) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
173 return AVERROR_NOMEM; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
174 memcpy(pkt->data, preamble, MM_PREAMBLE_SIZE); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
175 if (get_buffer(pb, pkt->data + MM_PREAMBLE_SIZE, length) != length) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
176 return AVERROR_IO; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
177 pkt->size = length + MM_PREAMBLE_SIZE; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
178 pkt->stream_index = 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
179 pkt->pts = mm->video_pts++; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
180 return 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
181 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
182 case MM_TYPE_AUDIO : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
183 if (av_get_packet(&s->pb, pkt, length)<0) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
184 return AVERROR_NOMEM; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
185 pkt->size = length; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
186 pkt->stream_index = 1; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
187 pkt->pts = mm->audio_pts++; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
188 return 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
189 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
190 default : |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
191 av_log(NULL, AV_LOG_INFO, "mm: unknown chunk type 0x%x\n", type); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
192 url_fseek(pb, length, SEEK_CUR); |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
193 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
194 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
195 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
196 return 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
197 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
198 |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
199 static int mm_read_close(AVFormatContext *s) |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
200 { |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
201 return 0; |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
202 } |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
203 |
1169 | 204 AVInputFormat mm_demuxer = { |
950
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
205 "mm", |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
206 "American Laser Games MM format", |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
207 sizeof(MmDemuxContext), |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
208 mm_probe, |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
209 mm_read_header, |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
210 mm_read_packet, |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
211 mm_read_close, |
3a64595e57be
complete American Laser Games MM playback system, courtesy of Peter Ross
melanson
parents:
diff
changeset
|
212 }; |