annotate ipmovie.c @ 355:46029c682234 libavformat

seeking stuff adaptively change middle position selection algo for seeking, this avoids some ugly worstcases of the interpolated variant avoid backward search for mpeg where possible, its 17 times slower then forward according to my benchmark
author michael
date Sat, 17 Jan 2004 20:26:44 +0000
parents 0fb9e6396a0d
children c152849ee643
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
1 /*
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
2 * Interplay MVE File Demuxer
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
3 * Copyright (c) 2003 The ffmpeg Project
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
4 *
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
9 *
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
13 * Lesser General Public License for more details.
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
14 *
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
18 */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
19
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
20 /**
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
21 * @file ipmovie.c
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
22 * Interplay MVE file demuxer
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
23 * by Mike Melanson (melanson@pcisys.net)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
24 * For more information regarding the Interplay MVE file format, visit:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
25 * http://www.pcisys.net/~melanson/codecs/
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
26 * The aforementioned site also contains a command line utility for parsing
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
27 * IP MVE files so that you can get a good idea of the typical structure of
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
28 * such files. This demuxer is not the best example to use if you are trying
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
29 * to write your own as it uses a rather roundabout approach for splitting
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
30 * up and sending out the chunks.
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
31 */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
32
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
33 #include "avformat.h"
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
34
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
35 /* debugging support: #define DEBUG_IPMOVIE as non-zero to see extremely
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
36 * verbose information about the demux process */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
37 #define DEBUG_IPMOVIE 0
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
38
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
39 #if DEBUG_IPMOVIE
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
40 #define debug_ipmovie printf
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
41 #else
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
42 static inline void debug_ipmovie(const char *format, ...) { }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
43 #endif
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
44
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
45
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
46 #define LE_16(x) ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0])
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
47 #define LE_32(x) ((((uint8_t*)(x))[3] << 24) | \
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
48 (((uint8_t*)(x))[2] << 16) | \
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
49 (((uint8_t*)(x))[1] << 8) | \
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
50 ((uint8_t*)(x))[0])
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
51
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
52 #define IPMOVIE_SIGNATURE "Interplay MVE File\x1A\0"
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
53 #define IPMOVIE_SIGNATURE_SIZE 20
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
54 #define CHUNK_PREAMBLE_SIZE 4
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
55 #define OPCODE_PREAMBLE_SIZE 4
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
56
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
57 #define CHUNK_INIT_AUDIO 0x0000
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
58 #define CHUNK_AUDIO_ONLY 0x0001
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
59 #define CHUNK_INIT_VIDEO 0x0002
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
60 #define CHUNK_VIDEO 0x0003
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
61 #define CHUNK_SHUTDOWN 0x0004
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
62 #define CHUNK_END 0x0005
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
63 /* these last types are used internally */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
64 #define CHUNK_DONE 0xFFFC
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
65 #define CHUNK_NOMEM 0xFFFD
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
66 #define CHUNK_EOF 0xFFFE
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
67 #define CHUNK_BAD 0xFFFF
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
68
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
69 #define OPCODE_END_OF_STREAM 0x00
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
70 #define OPCODE_END_OF_CHUNK 0x01
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
71 #define OPCODE_CREATE_TIMER 0x02
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
72 #define OPCODE_INIT_AUDIO_BUFFERS 0x03
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
73 #define OPCODE_START_STOP_AUDIO 0x04
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
74 #define OPCODE_INIT_VIDEO_BUFFERS 0x05
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
75 #define OPCODE_UNKNOWN_06 0x06
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
76 #define OPCODE_SEND_BUFFER 0x07
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
77 #define OPCODE_AUDIO_FRAME 0x08
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
78 #define OPCODE_SILENCE_FRAME 0x09
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
79 #define OPCODE_INIT_VIDEO_MODE 0x0A
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
80 #define OPCODE_CREATE_GRADIENT 0x0B
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
81 #define OPCODE_SET_PALETTE 0x0C
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
82 #define OPCODE_SET_PALETTE_COMPRESSED 0x0D
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
83 #define OPCODE_UNKNOWN_0E 0x0E
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
84 #define OPCODE_SET_DECODING_MAP 0x0F
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
85 #define OPCODE_UNKNOWN_10 0x10
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
86 #define OPCODE_VIDEO_DATA 0x11
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
87 #define OPCODE_UNKNOWN_12 0x12
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
88 #define OPCODE_UNKNOWN_13 0x13
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
89 #define OPCODE_UNKNOWN_14 0x14
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
90 #define OPCODE_UNKNOWN_15 0x15
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
91
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
92 #define PALETTE_COUNT 256
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
93
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
94 typedef struct IPMVEContext {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
95
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
96 unsigned char *buf;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
97 int buf_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
98
269
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
99 float fps;
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
100 int frame_pts_inc;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
101
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
102 unsigned int video_width;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
103 unsigned int video_height;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
104 int64_t video_pts;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
105
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
106 unsigned int audio_bits;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
107 unsigned int audio_channels;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
108 unsigned int audio_sample_rate;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
109 unsigned int audio_type;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
110 unsigned int audio_frame_count;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
111
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
112 int video_stream_index;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
113 int audio_stream_index;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
114
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
115 offset_t audio_chunk_offset;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
116 int audio_chunk_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
117 offset_t video_chunk_offset;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
118 int video_chunk_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
119 offset_t decode_map_chunk_offset;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
120 int decode_map_chunk_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
121
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
122 offset_t next_chunk_offset;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
123
247
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
124 AVPaletteControl palette_control;
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
125
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
126 } IPMVEContext;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
127
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
128 static int load_ipmovie_packet(IPMVEContext *s, ByteIOContext *pb,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
129 AVPacket *pkt) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
130
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
131 int chunk_type;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
132 int64_t audio_pts = 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
133
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
134 if (s->audio_chunk_offset) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
135
252
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
136 /* adjust for PCM audio by skipping chunk header */
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
137 if (s->audio_type != CODEC_ID_INTERPLAY_DPCM) {
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
138 s->audio_chunk_offset += 6;
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
139 s->audio_chunk_size -= 6;
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
140 }
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
141
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
142 url_fseek(pb, s->audio_chunk_offset, SEEK_SET);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
143 s->audio_chunk_offset = 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
144
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
145 /* figure out the audio pts */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
146 audio_pts = 90000;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
147 audio_pts *= s->audio_frame_count;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
148 audio_pts /= s->audio_sample_rate;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
149
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
150 if (av_new_packet(pkt, s->audio_chunk_size))
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
151 return CHUNK_NOMEM;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
152
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
153 pkt->stream_index = s->audio_stream_index;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
154 pkt->pts = audio_pts;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
155 if (get_buffer(pb, pkt->data, s->audio_chunk_size) !=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
156 s->audio_chunk_size) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
157 av_free_packet(pkt);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
158 return CHUNK_EOF;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
159 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
160
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
161 /* audio frame maintenance */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
162 if (s->audio_type != CODEC_ID_INTERPLAY_DPCM)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
163 s->audio_frame_count +=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
164 (s->audio_chunk_size / s->audio_channels / (s->audio_bits / 8));
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
165 else
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
166 s->audio_frame_count +=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
167 (s->audio_chunk_size - 6) / s->audio_channels;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
168
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
169 debug_ipmovie("sending audio frame with pts %lld (%d audio frames)\n",
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
170 audio_pts, s->audio_frame_count);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
171
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
172 chunk_type = CHUNK_VIDEO;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
173
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
174 } else if (s->decode_map_chunk_offset) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
175
247
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
176 /* send both the decode map and the video data together */
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
177
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
178 if (av_new_packet(pkt, s->decode_map_chunk_size + s->video_chunk_size))
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
179 return CHUNK_NOMEM;
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
180
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
181 url_fseek(pb, s->decode_map_chunk_offset, SEEK_SET);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
182 s->decode_map_chunk_offset = 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
183
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
184 if (get_buffer(pb, pkt->data, s->decode_map_chunk_size) !=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
185 s->decode_map_chunk_size) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
186 av_free_packet(pkt);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
187 return CHUNK_EOF;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
188 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
189
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
190 url_fseek(pb, s->video_chunk_offset, SEEK_SET);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
191 s->video_chunk_offset = 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
192
247
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
193 if (get_buffer(pb, pkt->data + s->decode_map_chunk_size,
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
194 s->video_chunk_size) != s->video_chunk_size) {
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
195 av_free_packet(pkt);
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
196 return CHUNK_EOF;
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
197 }
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
198
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
199 pkt->stream_index = s->video_stream_index;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
200 pkt->pts = s->video_pts;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
201
269
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
202 debug_ipmovie("sending video frame with pts %lld\n",
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
203 pkt->pts);
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
204
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
205 s->video_pts += s->frame_pts_inc;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
206
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
207 chunk_type = CHUNK_VIDEO;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
208
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
209 } else {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
210
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
211 url_fseek(pb, s->next_chunk_offset, SEEK_SET);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
212 chunk_type = CHUNK_DONE;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
213
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
214 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
215
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
216 return chunk_type;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
217 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
218
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
219 /* This function loads and processes a single chunk in an IP movie file.
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
220 * It returns the type of chunk that was processed. */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
221 static int process_ipmovie_chunk(IPMVEContext *s, ByteIOContext *pb,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
222 AVPacket *pkt)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
223 {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
224 unsigned char chunk_preamble[CHUNK_PREAMBLE_SIZE];
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
225 int chunk_type;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
226 int chunk_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
227 unsigned char opcode_preamble[OPCODE_PREAMBLE_SIZE];
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
228 unsigned char opcode_type;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
229 unsigned char opcode_version;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
230 int opcode_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
231 unsigned char scratch[1024];
247
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
232 int i, j;
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
233 int first_color, last_color;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
234 int audio_flags;
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 269
diff changeset
235 unsigned char r, g, b;
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
236
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
237 /* see if there are any pending packets */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
238 chunk_type = load_ipmovie_packet(s, pb, pkt);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
239 if ((chunk_type == CHUNK_VIDEO) && (chunk_type != CHUNK_DONE))
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
240 return chunk_type;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
241
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
242 /* read the next chunk, wherever the file happens to be pointing */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
243 if (url_feof(pb))
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
244 return CHUNK_EOF;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
245 if (get_buffer(pb, chunk_preamble, CHUNK_PREAMBLE_SIZE) !=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
246 CHUNK_PREAMBLE_SIZE)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
247 return CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
248 chunk_size = LE_16(&chunk_preamble[0]);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
249 chunk_type = LE_16(&chunk_preamble[2]);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
250
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
251 debug_ipmovie("chunk type 0x%04X, 0x%04X bytes: ", chunk_type, chunk_size);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
252
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
253 switch (chunk_type) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
254
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
255 case CHUNK_INIT_AUDIO:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
256 debug_ipmovie("initialize audio\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
257 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
258
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
259 case CHUNK_AUDIO_ONLY:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
260 debug_ipmovie("audio only\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
261 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
262
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
263 case CHUNK_INIT_VIDEO:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
264 debug_ipmovie("initialize video\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
265 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
266
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
267 case CHUNK_VIDEO:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
268 debug_ipmovie("video (and audio)\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
269 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
270
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
271 case CHUNK_SHUTDOWN:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
272 debug_ipmovie("shutdown\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
273 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
274
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
275 case CHUNK_END:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
276 debug_ipmovie("end\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
277 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
278
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
279 default:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
280 debug_ipmovie("invalid chunk\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
281 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
282 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
283
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
284 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
285
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
286 while ((chunk_size > 0) && (chunk_type != CHUNK_BAD)) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
287
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
288 /* read the next chunk, wherever the file happens to be pointing */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
289 if (url_feof(pb)) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
290 chunk_type = CHUNK_EOF;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
291 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
292 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
293 if (get_buffer(pb, opcode_preamble, CHUNK_PREAMBLE_SIZE) !=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
294 CHUNK_PREAMBLE_SIZE) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
295 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
296 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
297 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
298
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
299 opcode_size = LE_16(&opcode_preamble[0]);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
300 opcode_type = opcode_preamble[2];
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
301 opcode_version = opcode_preamble[3];
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
302
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
303 chunk_size -= OPCODE_PREAMBLE_SIZE;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
304 chunk_size -= opcode_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
305 if (chunk_size < 0) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
306 debug_ipmovie("chunk_size countdown just went negative\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
307 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
308 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
309 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
310
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
311 debug_ipmovie(" opcode type %02X, version %d, 0x%04X bytes: ",
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
312 opcode_type, opcode_version, opcode_size);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
313 switch (opcode_type) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
314
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
315 case OPCODE_END_OF_STREAM:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
316 debug_ipmovie("end of stream\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
317 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
318 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
319
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
320 case OPCODE_END_OF_CHUNK:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
321 debug_ipmovie("end of chunk\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
322 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
323 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
324
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
325 case OPCODE_CREATE_TIMER:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
326 debug_ipmovie("create timer\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
327 if ((opcode_version > 0) || (opcode_size > 6)) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
328 debug_ipmovie("bad create_timer opcode\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
329 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
330 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
331 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
332 if (get_buffer(pb, scratch, opcode_size) !=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
333 opcode_size) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
334 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
335 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
336 }
269
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
337 s->fps = 1000000.0 / (LE_32(&scratch[0]) * LE_16(&scratch[4]));
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
338 s->frame_pts_inc = 90000 / s->fps;
269
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
339 debug_ipmovie(" %.2f frames/second (timer div = %d, subdiv = %d)\n",
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
340 s->fps, LE_32(&scratch[0]), LE_16(&scratch[4]));
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
341 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
342
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
343 case OPCODE_INIT_AUDIO_BUFFERS:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
344 debug_ipmovie("initialize audio buffers\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
345 if ((opcode_version > 1) || (opcode_size > 10)) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
346 debug_ipmovie("bad init_audio_buffers opcode\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
347 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
348 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
349 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
350 if (get_buffer(pb, scratch, opcode_size) !=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
351 opcode_size) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
352 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
353 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
354 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
355 s->audio_sample_rate = LE_16(&scratch[4]);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
356 audio_flags = LE_16(&scratch[2]);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
357 /* bit 0 of the flags: 0 = mono, 1 = stereo */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
358 s->audio_channels = (audio_flags & 1) + 1;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
359 /* bit 1 of the flags: 0 = 8 bit, 1 = 16 bit */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
360 s->audio_bits = (((audio_flags >> 1) & 1) + 1) * 8;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
361 /* bit 2 indicates compressed audio in version 1 opcode */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
362 if ((opcode_version == 1) && (audio_flags & 0x4))
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
363 s->audio_type = CODEC_ID_INTERPLAY_DPCM;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
364 else if (s->audio_bits == 16)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
365 s->audio_type = CODEC_ID_PCM_S16LE;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
366 else
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
367 s->audio_type = CODEC_ID_PCM_U8;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
368 debug_ipmovie("audio: %d bits, %d Hz, %s, %s format\n",
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
369 s->audio_bits,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
370 s->audio_sample_rate,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
371 (s->audio_channels == 2) ? "stereo" : "mono",
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
372 (s->audio_type == CODEC_ID_INTERPLAY_DPCM) ?
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
373 "Interplay audio" : "PCM");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
374 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
375
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
376 case OPCODE_START_STOP_AUDIO:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
377 debug_ipmovie("start/stop audio\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
378 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
379 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
380
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
381 case OPCODE_INIT_VIDEO_BUFFERS:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
382 debug_ipmovie("initialize video buffers\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
383 if ((opcode_version > 2) || (opcode_size > 8)) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
384 debug_ipmovie("bad init_video_buffers opcode\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
385 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
386 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
387 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
388 if (get_buffer(pb, scratch, opcode_size) !=
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
389 opcode_size) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
390 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
391 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
392 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
393 s->video_width = LE_16(&scratch[0]) * 8;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
394 s->video_height = LE_16(&scratch[2]) * 8;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
395 debug_ipmovie("video resolution: %d x %d\n",
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
396 s->video_width, s->video_height);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
397 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
398
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
399 case OPCODE_UNKNOWN_06:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
400 case OPCODE_UNKNOWN_0E:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
401 case OPCODE_UNKNOWN_10:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
402 case OPCODE_UNKNOWN_12:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
403 case OPCODE_UNKNOWN_13:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
404 case OPCODE_UNKNOWN_14:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
405 case OPCODE_UNKNOWN_15:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
406 debug_ipmovie("unknown (but documented) opcode %02X\n", opcode_type);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
407 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
408 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
409
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
410 case OPCODE_SEND_BUFFER:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
411 debug_ipmovie("send buffer\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
412 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
413 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
414
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
415 case OPCODE_AUDIO_FRAME:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
416 debug_ipmovie("audio frame\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
417
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
418 /* log position and move on for now */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
419 s->audio_chunk_offset = url_ftell(pb);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
420 s->audio_chunk_size = opcode_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
421 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
422 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
423
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
424 case OPCODE_SILENCE_FRAME:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
425 debug_ipmovie("silence frame\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
426 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
427 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
428
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
429 case OPCODE_INIT_VIDEO_MODE:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
430 debug_ipmovie("initialize video mode\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
431 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
432 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
433
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
434 case OPCODE_CREATE_GRADIENT:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
435 debug_ipmovie("create gradient\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
436 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
437 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
438
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
439 case OPCODE_SET_PALETTE:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
440 debug_ipmovie("set palette\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
441 /* check for the logical maximum palette size
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
442 * (3 * 256 + 4 bytes) */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
443 if (opcode_size > 0x304) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
444 debug_ipmovie("demux_ipmovie: set_palette opcode too large\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
445 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
446 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
447 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
448 if (get_buffer(pb, scratch, opcode_size) != opcode_size) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
449 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
450 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
451 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
452
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
453 /* load the palette into internal data structure */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
454 first_color = LE_16(&scratch[0]);
323
0fb9e6396a0d off by 1 in the palette
melanson
parents: 295
diff changeset
455 last_color = first_color + LE_16(&scratch[2]) - 1;
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
456 /* sanity check (since they are 16 bit values) */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
457 if ((first_color > 0xFF) || (last_color > 0xFF)) {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
458 debug_ipmovie("demux_ipmovie: set_palette indices out of range (%d -> %d)\n",
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
459 first_color, last_color);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
460 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
461 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
462 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
463 j = 4; /* offset of first palette data */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
464 for (i = first_color; i <= last_color; i++) {
247
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
465 /* the palette is stored as a 6-bit VGA palette, thus each
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
466 * component is shifted up to a 8-bit range */
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 269
diff changeset
467 r = scratch[j++] * 4;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 269
diff changeset
468 g = scratch[j++] * 4;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 269
diff changeset
469 b = scratch[j++] * 4;
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 269
diff changeset
470 s->palette_control.palette[i] = (r << 16) | (g << 8) | (b);
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
471 }
247
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
472 /* indicate a palette change */
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
473 s->palette_control.palette_changed = 1;
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
474 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
475
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
476 case OPCODE_SET_PALETTE_COMPRESSED:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
477 debug_ipmovie("set palette compressed\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
478 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
479 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
480
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
481 case OPCODE_SET_DECODING_MAP:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
482 debug_ipmovie("set decoding map\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
483
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
484 /* log position and move on for now */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
485 s->decode_map_chunk_offset = url_ftell(pb);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
486 s->decode_map_chunk_size = opcode_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
487 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
488 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
489
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
490 case OPCODE_VIDEO_DATA:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
491 debug_ipmovie("set video data\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
492
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
493 /* log position and move on for now */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
494 s->video_chunk_offset = url_ftell(pb);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
495 s->video_chunk_size = opcode_size;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
496 url_fseek(pb, opcode_size, SEEK_CUR);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
497 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
498
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
499 default:
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
500 debug_ipmovie("*** unknown opcode type\n");
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
501 chunk_type = CHUNK_BAD;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
502 break;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
503
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
504 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
505 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
506
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
507 /* make a note of where the stream is sitting */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
508 s->next_chunk_offset = url_ftell(pb);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
509
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
510 /* dispatch the first of any pending packets */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
511 if ((chunk_type == CHUNK_VIDEO) || (chunk_type == CHUNK_AUDIO_ONLY))
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
512 chunk_type = load_ipmovie_packet(s, pb, pkt);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
513
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
514 return chunk_type;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
515 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
516
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
517 static int ipmovie_probe(AVProbeData *p)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
518 {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
519 if (p->buf_size < IPMOVIE_SIGNATURE_SIZE)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
520 return 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
521 if (strncmp(p->buf, IPMOVIE_SIGNATURE, IPMOVIE_SIGNATURE_SIZE) != 0)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
522 return 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
523
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
524 return AVPROBE_SCORE_MAX;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
525 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
526
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
527 static int ipmovie_read_header(AVFormatContext *s,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
528 AVFormatParameters *ap)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
529 {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
530 IPMVEContext *ipmovie = (IPMVEContext *)s->priv_data;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
531 ByteIOContext *pb = &s->pb;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
532 AVPacket pkt;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
533 AVStream *st;
269
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
534 unsigned char chunk_preamble[CHUNK_PREAMBLE_SIZE];
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
535 int chunk_type;
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
536
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
537 /* initialize private context members */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
538 ipmovie->video_pts = ipmovie->audio_frame_count = 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
539 ipmovie->audio_chunk_offset = ipmovie->video_chunk_offset =
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
540 ipmovie->decode_map_chunk_offset = 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
541
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
542 /* on the first read, this will position the stream at the first chunk */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
543 ipmovie->next_chunk_offset = IPMOVIE_SIGNATURE_SIZE + 6;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
544
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
545 /* process the first chunk which should be CHUNK_INIT_VIDEO */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
546 if (process_ipmovie_chunk(ipmovie, pb, &pkt) != CHUNK_INIT_VIDEO)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
547 return AVERROR_INVALIDDATA;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
548
269
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
549 /* peek ahead to the next chunk-- if it is an init audio chunk, process
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
550 * it; if it is the first video chunk, this is a silent file */
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
551 if (get_buffer(pb, chunk_preamble, CHUNK_PREAMBLE_SIZE) !=
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
552 CHUNK_PREAMBLE_SIZE)
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
553 return -EIO;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
554 chunk_type = LE_16(&chunk_preamble[2]);
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
555 url_fseek(pb, -CHUNK_PREAMBLE_SIZE, SEEK_CUR);
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
556
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
557 if (chunk_type == CHUNK_VIDEO)
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
558 ipmovie->audio_type = 0; /* no audio */
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
559 else if (process_ipmovie_chunk(ipmovie, pb, &pkt) != CHUNK_INIT_AUDIO)
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
560 return AVERROR_INVALIDDATA;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
561
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
562 /* set the pts reference (1 pts = 1/90000) */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
563 s->pts_num = 1;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
564 s->pts_den = 90000;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
565
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
566 /* initialize the stream decoders */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
567 st = av_new_stream(s, 0);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
568 if (!st)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
569 return AVERROR_NOMEM;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
570 ipmovie->video_stream_index = st->index;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
571 st->codec.codec_type = CODEC_TYPE_VIDEO;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
572 st->codec.codec_id = CODEC_ID_INTERPLAY_VIDEO;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
573 st->codec.codec_tag = 0; /* no fourcc */
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
574 st->codec.width = ipmovie->video_width;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
575 st->codec.height = ipmovie->video_height;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
576
247
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
577 /* palette considerations */
295
bff1a372ae38 revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents: 269
diff changeset
578 st->codec.palctrl = &ipmovie->palette_control;
247
697dae977e6d adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents: 211
diff changeset
579
269
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
580 if (ipmovie->audio_type) {
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
581 st = av_new_stream(s, 0);
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
582 if (!st)
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
583 return AVERROR_NOMEM;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
584 ipmovie->audio_stream_index = st->index;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
585 st->codec.codec_type = CODEC_TYPE_AUDIO;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
586 st->codec.codec_id = ipmovie->audio_type;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
587 st->codec.codec_tag = 0; /* no tag */
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
588 st->codec.channels = ipmovie->audio_channels;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
589 st->codec.sample_rate = ipmovie->audio_sample_rate;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
590 st->codec.bits_per_sample = ipmovie->audio_bits;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
591 st->codec.bit_rate = st->codec.channels * st->codec.sample_rate *
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
592 st->codec.bits_per_sample;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
593 if (st->codec.codec_id == CODEC_ID_INTERPLAY_DPCM)
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
594 st->codec.bit_rate /= 2;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
595 st->codec.block_align = st->codec.channels * st->codec.bits_per_sample;
021c58ac2f2c properly demux silent files; implemented precise framerate calculation
tmmm
parents: 253
diff changeset
596 }
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
597
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
598 return 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
599 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
600
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
601 static int ipmovie_read_packet(AVFormatContext *s,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
602 AVPacket *pkt)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
603 {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
604 IPMVEContext *ipmovie = (IPMVEContext *)s->priv_data;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
605 ByteIOContext *pb = &s->pb;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
606 int ret;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
607
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
608 ret = process_ipmovie_chunk(ipmovie, pb, pkt);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
609 if (ret == CHUNK_BAD)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
610 ret = AVERROR_INVALIDDATA;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
611 else if (ret == CHUNK_EOF)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
612 ret = -EIO;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
613 else if (ret == CHUNK_NOMEM)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
614 ret = AVERROR_NOMEM;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
615 else
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
616 ret = 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
617
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
618 return ret;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
619 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
620
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
621 static int ipmovie_read_close(AVFormatContext *s)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
622 {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
623 // IPMVEContext *ipmovie = (IPMVEContext *)s->priv_data;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
624
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
625 return 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
626 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
627
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
628 static AVInputFormat ipmovie_iformat = {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
629 "ipmovie",
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
630 "Interplay MVE format",
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
631 sizeof(IPMVEContext),
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
632 ipmovie_probe,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
633 ipmovie_read_header,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
634 ipmovie_read_packet,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
635 ipmovie_read_close,
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
636 };
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
637
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
638 int ipmovie_init(void)
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
639 {
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
640 av_register_input_format(&ipmovie_iformat);
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
641 return 0;
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
642 }
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
643