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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
5c7b35fc0588 Fix FSF postal address.
diego
parents: 1169
diff changeset
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
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
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 };