Mercurial > libavformat.hg
annotate ipmovie.c @ 5854:3dc78fb78b2a libavformat
Fix erroneous behaviour when format probe hits end of file
If the format probe hits end of file, do not add the error code
to the buffer position. This is obviously wrong, and with a
small input file would cause a negative buffer overflow.
Fixes issue 1818.
author | mru |
---|---|
date | Tue, 16 Mar 2010 21:45:30 +0000 |
parents | c47a84f46ae2 |
children | 536e5527c1e0 |
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 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
8 * 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
|
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:
1169
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
13 * 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
|
14 * 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
|
15 * Lesser General Public License for more details. |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
16 * |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
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:
1169
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
211
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 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
22 /** |
4331
49c1d3b27727
Use full internal pathname in doxygen @file directives.
diego
parents:
4201
diff
changeset
|
23 * @file libavformat/ipmovie.c |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
24 * Interplay MVE file demuxer |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
25 * by Mike Melanson (melanson@pcisys.net) |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
26 * 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
|
27 * http://www.pcisys.net/~melanson/codecs/ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
28 * 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
|
29 * 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
|
30 * 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
|
31 * 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
|
32 * up and sending out the chunks. |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
33 */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
34 |
4201
7d2f3f1b68d8
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
4128
diff
changeset
|
35 #include "libavutil/intreadwrite.h" |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
36 #include "avformat.h" |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
37 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
38 /* 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
|
39 * verbose information about the demux process */ |
483 | 40 #define DEBUG_IPMOVIE 0 |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
41 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
42 #if DEBUG_IPMOVIE |
4601
06b665831f43
Hack: #undef printf so compilation works with DEBUG_IPMOVIE set to 1
reimar
parents:
4331
diff
changeset
|
43 #undef printf |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
44 #define debug_ipmovie printf |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
45 #else |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
46 static inline void debug_ipmovie(const char *format, ...) { } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
47 #endif |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
48 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
49 #define CHUNK_PREAMBLE_SIZE 4 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
50 #define OPCODE_PREAMBLE_SIZE 4 |
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 CHUNK_INIT_AUDIO 0x0000 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
53 #define CHUNK_AUDIO_ONLY 0x0001 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
54 #define CHUNK_INIT_VIDEO 0x0002 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
55 #define CHUNK_VIDEO 0x0003 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
56 #define CHUNK_SHUTDOWN 0x0004 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
57 #define CHUNK_END 0x0005 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
58 /* these last types are used internally */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
59 #define CHUNK_DONE 0xFFFC |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
60 #define CHUNK_NOMEM 0xFFFD |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
61 #define CHUNK_EOF 0xFFFE |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
62 #define CHUNK_BAD 0xFFFF |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
63 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
64 #define OPCODE_END_OF_STREAM 0x00 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
65 #define OPCODE_END_OF_CHUNK 0x01 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
66 #define OPCODE_CREATE_TIMER 0x02 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
67 #define OPCODE_INIT_AUDIO_BUFFERS 0x03 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
68 #define OPCODE_START_STOP_AUDIO 0x04 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
69 #define OPCODE_INIT_VIDEO_BUFFERS 0x05 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
70 #define OPCODE_UNKNOWN_06 0x06 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
71 #define OPCODE_SEND_BUFFER 0x07 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
72 #define OPCODE_AUDIO_FRAME 0x08 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
73 #define OPCODE_SILENCE_FRAME 0x09 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
74 #define OPCODE_INIT_VIDEO_MODE 0x0A |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
75 #define OPCODE_CREATE_GRADIENT 0x0B |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
76 #define OPCODE_SET_PALETTE 0x0C |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
77 #define OPCODE_SET_PALETTE_COMPRESSED 0x0D |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
78 #define OPCODE_UNKNOWN_0E 0x0E |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
79 #define OPCODE_SET_DECODING_MAP 0x0F |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
80 #define OPCODE_UNKNOWN_10 0x10 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
81 #define OPCODE_VIDEO_DATA 0x11 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
82 #define OPCODE_UNKNOWN_12 0x12 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
83 #define OPCODE_UNKNOWN_13 0x13 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
84 #define OPCODE_UNKNOWN_14 0x14 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
85 #define OPCODE_UNKNOWN_15 0x15 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
86 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
87 #define PALETTE_COUNT 256 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
88 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
89 typedef struct IPMVEContext { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
90 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
91 unsigned char *buf; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
92 int buf_size; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
93 |
4603
04f857454909
Simplify ipmovie.c pts calculation by using an appropriate time_base.
reimar
parents:
4601
diff
changeset
|
94 uint64_t frame_pts_inc; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
95 |
5475 | 96 unsigned int video_bpp; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
97 unsigned int video_width; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
98 unsigned int video_height; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
99 int64_t video_pts; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
100 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
101 unsigned int audio_bits; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
102 unsigned int audio_channels; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
103 unsigned int audio_sample_rate; |
4128 | 104 enum CodecID audio_type; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
105 unsigned int audio_frame_count; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
106 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
107 int video_stream_index; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
108 int audio_stream_index; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
109 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
110 int64_t audio_chunk_offset; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
111 int audio_chunk_size; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
112 int64_t video_chunk_offset; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
113 int video_chunk_size; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
114 int64_t decode_map_chunk_offset; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
115 int decode_map_chunk_size; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
116 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
117 int64_t next_chunk_offset; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
118 |
247
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
119 AVPaletteControl palette_control; |
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
120 |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
121 } IPMVEContext; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
122 |
885 | 123 static int load_ipmovie_packet(IPMVEContext *s, ByteIOContext *pb, |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
124 AVPacket *pkt) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
125 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
126 int chunk_type; |
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 if (s->audio_chunk_offset) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
129 |
252 | 130 /* adjust for PCM audio by skipping chunk header */ |
131 if (s->audio_type != CODEC_ID_INTERPLAY_DPCM) { | |
132 s->audio_chunk_offset += 6; | |
133 s->audio_chunk_size -= 6; | |
134 } | |
135 | |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
136 url_fseek(pb, s->audio_chunk_offset, SEEK_SET); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
137 s->audio_chunk_offset = 0; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
138 |
775 | 139 if (s->audio_chunk_size != av_get_packet(pb, pkt, s->audio_chunk_size)) |
140 return CHUNK_EOF; | |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
141 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
142 pkt->stream_index = s->audio_stream_index; |
4603
04f857454909
Simplify ipmovie.c pts calculation by using an appropriate time_base.
reimar
parents:
4601
diff
changeset
|
143 pkt->pts = s->audio_frame_count; |
211
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 /* audio frame maintenance */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
146 if (s->audio_type != CODEC_ID_INTERPLAY_DPCM) |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
147 s->audio_frame_count += |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
148 (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
|
149 else |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
150 s->audio_frame_count += |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
151 (s->audio_chunk_size - 6) / s->audio_channels; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
152 |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1358
diff
changeset
|
153 debug_ipmovie("sending audio frame with pts %"PRId64" (%d audio frames)\n", |
4603
04f857454909
Simplify ipmovie.c pts calculation by using an appropriate time_base.
reimar
parents:
4601
diff
changeset
|
154 pkt->pts, s->audio_frame_count); |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
155 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
156 chunk_type = CHUNK_VIDEO; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
157 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
158 } else if (s->decode_map_chunk_offset) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
159 |
247
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
160 /* 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
|
161 |
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
162 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
|
163 return CHUNK_NOMEM; |
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
164 |
775 | 165 pkt->pos= s->decode_map_chunk_offset; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
166 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
|
167 s->decode_map_chunk_offset = 0; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
168 |
885 | 169 if (get_buffer(pb, pkt->data, s->decode_map_chunk_size) != |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
170 s->decode_map_chunk_size) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
171 av_free_packet(pkt); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
172 return CHUNK_EOF; |
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 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
175 url_fseek(pb, s->video_chunk_offset, SEEK_SET); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
176 s->video_chunk_offset = 0; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
177 |
247
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
178 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
|
179 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
|
180 av_free_packet(pkt); |
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
181 return CHUNK_EOF; |
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
182 } |
211
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 pkt->stream_index = s->video_stream_index; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
185 pkt->pts = s->video_pts; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
186 |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1358
diff
changeset
|
187 debug_ipmovie("sending video frame with pts %"PRId64"\n", |
269
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
188 pkt->pts); |
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
189 |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
190 s->video_pts += s->frame_pts_inc; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
191 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
192 chunk_type = CHUNK_VIDEO; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
193 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
194 } else { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
195 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
196 url_fseek(pb, s->next_chunk_offset, SEEK_SET); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
197 chunk_type = CHUNK_DONE; |
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 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
200 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
201 return chunk_type; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
202 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
203 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
204 /* 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
|
205 * It returns the type of chunk that was processed. */ |
885 | 206 static int process_ipmovie_chunk(IPMVEContext *s, ByteIOContext *pb, |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
207 AVPacket *pkt) |
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 unsigned char chunk_preamble[CHUNK_PREAMBLE_SIZE]; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
210 int chunk_type; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
211 int chunk_size; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
212 unsigned char opcode_preamble[OPCODE_PREAMBLE_SIZE]; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
213 unsigned char opcode_type; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
214 unsigned char opcode_version; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
215 int opcode_size; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
216 unsigned char scratch[1024]; |
247
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
217 int i, j; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
218 int first_color, last_color; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
219 int audio_flags; |
295
bff1a372ae38
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
269
diff
changeset
|
220 unsigned char r, g, b; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
221 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
222 /* see if there are any pending packets */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
223 chunk_type = load_ipmovie_packet(s, pb, pkt); |
1800 | 224 if (chunk_type != CHUNK_DONE) |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
225 return chunk_type; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
226 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
227 /* 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
|
228 if (url_feof(pb)) |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
229 return CHUNK_EOF; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
230 if (get_buffer(pb, chunk_preamble, CHUNK_PREAMBLE_SIZE) != |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
231 CHUNK_PREAMBLE_SIZE) |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
232 return CHUNK_BAD; |
1673 | 233 chunk_size = AV_RL16(&chunk_preamble[0]); |
234 chunk_type = AV_RL16(&chunk_preamble[2]); | |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
235 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
236 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
|
237 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
238 switch (chunk_type) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
239 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
240 case CHUNK_INIT_AUDIO: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
241 debug_ipmovie("initialize audio\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
242 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
243 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
244 case CHUNK_AUDIO_ONLY: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
245 debug_ipmovie("audio only\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
246 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
247 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
248 case CHUNK_INIT_VIDEO: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
249 debug_ipmovie("initialize video\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
250 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
251 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
252 case CHUNK_VIDEO: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
253 debug_ipmovie("video (and audio)\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
254 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
255 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
256 case CHUNK_SHUTDOWN: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
257 debug_ipmovie("shutdown\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
258 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
259 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
260 case CHUNK_END: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
261 debug_ipmovie("end\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
262 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
263 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
264 default: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
265 debug_ipmovie("invalid chunk\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
266 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
267 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
268 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
269 } |
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 while ((chunk_size > 0) && (chunk_type != CHUNK_BAD)) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
272 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
273 /* 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
|
274 if (url_feof(pb)) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
275 chunk_type = CHUNK_EOF; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
276 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
277 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
278 if (get_buffer(pb, opcode_preamble, CHUNK_PREAMBLE_SIZE) != |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
279 CHUNK_PREAMBLE_SIZE) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
280 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
281 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
282 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
283 |
1673 | 284 opcode_size = AV_RL16(&opcode_preamble[0]); |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
285 opcode_type = opcode_preamble[2]; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
286 opcode_version = opcode_preamble[3]; |
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 chunk_size -= OPCODE_PREAMBLE_SIZE; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
289 chunk_size -= opcode_size; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
290 if (chunk_size < 0) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
291 debug_ipmovie("chunk_size countdown just went negative\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
292 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
293 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
294 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
295 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
296 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
|
297 opcode_type, opcode_version, opcode_size); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
298 switch (opcode_type) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
299 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
300 case OPCODE_END_OF_STREAM: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
301 debug_ipmovie("end of stream\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
302 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
303 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
304 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
305 case OPCODE_END_OF_CHUNK: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
306 debug_ipmovie("end of chunk\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
307 url_fseek(pb, opcode_size, SEEK_CUR); |
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 case OPCODE_CREATE_TIMER: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
311 debug_ipmovie("create timer\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
312 if ((opcode_version > 0) || (opcode_size > 6)) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
313 debug_ipmovie("bad create_timer opcode\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
314 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
315 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
316 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
317 if (get_buffer(pb, scratch, opcode_size) != |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
318 opcode_size) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
319 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
320 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
321 } |
4603
04f857454909
Simplify ipmovie.c pts calculation by using an appropriate time_base.
reimar
parents:
4601
diff
changeset
|
322 s->frame_pts_inc = ((uint64_t)AV_RL32(&scratch[0])) * AV_RL16(&scratch[4]); |
269
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
323 debug_ipmovie(" %.2f frames/second (timer div = %d, subdiv = %d)\n", |
4603
04f857454909
Simplify ipmovie.c pts calculation by using an appropriate time_base.
reimar
parents:
4601
diff
changeset
|
324 1000000.0/s->frame_pts_inc, AV_RL32(&scratch[0]), AV_RL16(&scratch[4])); |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
325 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
326 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
327 case OPCODE_INIT_AUDIO_BUFFERS: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
328 debug_ipmovie("initialize audio buffers\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
329 if ((opcode_version > 1) || (opcode_size > 10)) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
330 debug_ipmovie("bad init_audio_buffers opcode\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
331 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
332 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
333 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
334 if (get_buffer(pb, scratch, opcode_size) != |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
335 opcode_size) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
336 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
337 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
338 } |
1673 | 339 s->audio_sample_rate = AV_RL16(&scratch[4]); |
340 audio_flags = AV_RL16(&scratch[2]); | |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
341 /* bit 0 of the flags: 0 = mono, 1 = stereo */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
342 s->audio_channels = (audio_flags & 1) + 1; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
343 /* 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
|
344 s->audio_bits = (((audio_flags >> 1) & 1) + 1) * 8; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
345 /* bit 2 indicates compressed audio in version 1 opcode */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
346 if ((opcode_version == 1) && (audio_flags & 0x4)) |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
347 s->audio_type = CODEC_ID_INTERPLAY_DPCM; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
348 else if (s->audio_bits == 16) |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
349 s->audio_type = CODEC_ID_PCM_S16LE; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
350 else |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
351 s->audio_type = CODEC_ID_PCM_U8; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
352 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
|
353 s->audio_bits, |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
354 s->audio_sample_rate, |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
355 (s->audio_channels == 2) ? "stereo" : "mono", |
885 | 356 (s->audio_type == CODEC_ID_INTERPLAY_DPCM) ? |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
357 "Interplay audio" : "PCM"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
358 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
359 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
360 case OPCODE_START_STOP_AUDIO: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
361 debug_ipmovie("start/stop audio\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
362 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
363 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
364 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
365 case OPCODE_INIT_VIDEO_BUFFERS: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
366 debug_ipmovie("initialize video buffers\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
367 if ((opcode_version > 2) || (opcode_size > 8)) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
368 debug_ipmovie("bad init_video_buffers opcode\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
369 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
370 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
371 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
372 if (get_buffer(pb, scratch, opcode_size) != |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
373 opcode_size) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
374 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
375 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
376 } |
1673 | 377 s->video_width = AV_RL16(&scratch[0]) * 8; |
378 s->video_height = AV_RL16(&scratch[2]) * 8; | |
5475 | 379 if (opcode_version < 2 || !AV_RL16(&scratch[6])) { |
380 s->video_bpp = 8; | |
381 } else { | |
382 s->video_bpp = 16; | |
383 } | |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
384 debug_ipmovie("video resolution: %d x %d\n", |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
385 s->video_width, s->video_height); |
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 case OPCODE_UNKNOWN_06: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
389 case OPCODE_UNKNOWN_0E: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
390 case OPCODE_UNKNOWN_10: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
391 case OPCODE_UNKNOWN_12: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
392 case OPCODE_UNKNOWN_13: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
393 case OPCODE_UNKNOWN_14: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
394 case OPCODE_UNKNOWN_15: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
395 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
|
396 url_fseek(pb, opcode_size, SEEK_CUR); |
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_SEND_BUFFER: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
400 debug_ipmovie("send buffer\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
401 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
402 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
403 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
404 case OPCODE_AUDIO_FRAME: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
405 debug_ipmovie("audio frame\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
406 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
407 /* log position and move on for now */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
408 s->audio_chunk_offset = url_ftell(pb); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
409 s->audio_chunk_size = opcode_size; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
410 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
411 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
412 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
413 case OPCODE_SILENCE_FRAME: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
414 debug_ipmovie("silence frame\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
415 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
416 break; |
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 case OPCODE_INIT_VIDEO_MODE: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
419 debug_ipmovie("initialize video mode\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
420 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
421 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
422 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
423 case OPCODE_CREATE_GRADIENT: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
424 debug_ipmovie("create gradient\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
425 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
426 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
427 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
428 case OPCODE_SET_PALETTE: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
429 debug_ipmovie("set palette\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
430 /* check for the logical maximum palette size |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
431 * (3 * 256 + 4 bytes) */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
432 if (opcode_size > 0x304) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
433 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
|
434 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
435 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
436 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
437 if (get_buffer(pb, scratch, opcode_size) != opcode_size) { |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
438 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
439 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
440 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
441 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
442 /* load the palette into internal data structure */ |
1673 | 443 first_color = AV_RL16(&scratch[0]); |
444 last_color = first_color + AV_RL16(&scratch[2]) - 1; | |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
445 /* sanity check (since they are 16 bit values) */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
446 if ((first_color > 0xFF) || (last_color > 0xFF)) { |
3365 | 447 debug_ipmovie("demux_ipmovie: set_palette indexes out of range (%d -> %d)\n", |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
448 first_color, last_color); |
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 j = 4; /* offset of first palette data */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
453 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
|
454 /* 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
|
455 * 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
|
456 r = scratch[j++] * 4; |
bff1a372ae38
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
269
diff
changeset
|
457 g = scratch[j++] * 4; |
bff1a372ae38
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
269
diff
changeset
|
458 b = scratch[j++] * 4; |
bff1a372ae38
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
269
diff
changeset
|
459 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
|
460 } |
247
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
461 /* indicate a palette change */ |
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
462 s->palette_control.palette_changed = 1; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
463 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
464 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
465 case OPCODE_SET_PALETTE_COMPRESSED: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
466 debug_ipmovie("set palette compressed\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
467 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
468 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
469 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
470 case OPCODE_SET_DECODING_MAP: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
471 debug_ipmovie("set decoding map\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
472 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
473 /* log position and move on for now */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
474 s->decode_map_chunk_offset = url_ftell(pb); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
475 s->decode_map_chunk_size = opcode_size; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
476 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
477 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
478 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
479 case OPCODE_VIDEO_DATA: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
480 debug_ipmovie("set video data\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
481 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
482 /* log position and move on for now */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
483 s->video_chunk_offset = url_ftell(pb); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
484 s->video_chunk_size = opcode_size; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
485 url_fseek(pb, opcode_size, SEEK_CUR); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
486 break; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
487 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
488 default: |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
489 debug_ipmovie("*** unknown opcode type\n"); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
490 chunk_type = CHUNK_BAD; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
491 break; |
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 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
494 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
495 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
496 /* make a note of where the stream is sitting */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
497 s->next_chunk_offset = url_ftell(pb); |
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 /* dispatch the first of any pending packets */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
500 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
|
501 chunk_type = load_ipmovie_packet(s, pb, pkt); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
502 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
503 return chunk_type; |
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 |
5156
6c50f319725d
Extend ipmovie signature to match exactly one place in mve files that have a
reimar
parents:
4603
diff
changeset
|
506 static const char signature[] = "Interplay MVE File\x1A\0\x1A"; |
6c50f319725d
Extend ipmovie signature to match exactly one place in mve files that have a
reimar
parents:
4603
diff
changeset
|
507 |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
508 static int ipmovie_probe(AVProbeData *p) |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
509 { |
5157
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
510 uint8_t *b = p->buf; |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
511 uint8_t *b_end = p->buf + p->buf_size - sizeof(signature); |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
512 do { |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
513 if (memcmp(b++, signature, sizeof(signature)) == 0) |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
514 return AVPROBE_SCORE_MAX; |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
515 } while (b < b_end); |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
516 |
5157
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
517 return 0; |
211
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 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
520 static int ipmovie_read_header(AVFormatContext *s, |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
521 AVFormatParameters *ap) |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
522 { |
2006 | 523 IPMVEContext *ipmovie = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
524 ByteIOContext *pb = s->pb; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
525 AVPacket pkt; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
526 AVStream *st; |
269
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
527 unsigned char chunk_preamble[CHUNK_PREAMBLE_SIZE]; |
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
528 int chunk_type; |
5157
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
529 uint8_t signature_buffer[sizeof(signature)]; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
530 |
5157
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
531 get_buffer(pb, signature_buffer, sizeof(signature_buffer)); |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
532 while (memcmp(signature_buffer, signature, sizeof(signature))) { |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
533 memmove(signature_buffer, signature_buffer + 1, sizeof(signature_buffer) - 1); |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
534 signature_buffer[sizeof(signature_buffer) - 1] = get_byte(pb); |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
535 if (url_feof(pb)) |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
536 return AVERROR_EOF; |
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
537 } |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
538 /* initialize private context members */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
539 ipmovie->video_pts = ipmovie->audio_frame_count = 0; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
540 ipmovie->audio_chunk_offset = ipmovie->video_chunk_offset = |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
541 ipmovie->decode_map_chunk_offset = 0; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
542 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
543 /* on the first read, this will position the stream at the first chunk */ |
5157
a74bea5a7084
Search for ipmovie signature beyond the start of the file.
reimar
parents:
5156
diff
changeset
|
544 ipmovie->next_chunk_offset = url_ftell(pb) + 4; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
545 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
546 /* 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
|
547 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
|
548 return AVERROR_INVALIDDATA; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
549 |
269
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
550 /* 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
|
551 * 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
|
552 if (get_buffer(pb, chunk_preamble, CHUNK_PREAMBLE_SIZE) != |
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
553 CHUNK_PREAMBLE_SIZE) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
554 return AVERROR(EIO); |
1673 | 555 chunk_type = AV_RL16(&chunk_preamble[2]); |
269
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
556 url_fseek(pb, -CHUNK_PREAMBLE_SIZE, SEEK_CUR); |
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
557 |
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
558 if (chunk_type == CHUNK_VIDEO) |
4128 | 559 ipmovie->audio_type = CODEC_ID_NONE; /* no audio */ |
269
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
560 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
|
561 return AVERROR_INVALIDDATA; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
562 |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
563 /* initialize the stream decoders */ |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
564 st = av_new_stream(s, 0); |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
565 if (!st) |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
566 return AVERROR(ENOMEM); |
4603
04f857454909
Simplify ipmovie.c pts calculation by using an appropriate time_base.
reimar
parents:
4601
diff
changeset
|
567 av_set_pts_info(st, 63, 1, 1000000); |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
568 ipmovie->video_stream_index = st->index; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
569 st->codec->codec_type = CODEC_TYPE_VIDEO; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
570 st->codec->codec_id = CODEC_ID_INTERPLAY_VIDEO; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
571 st->codec->codec_tag = 0; /* no fourcc */ |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
572 st->codec->width = ipmovie->video_width; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
573 st->codec->height = ipmovie->video_height; |
5475 | 574 st->codec->bits_per_coded_sample = ipmovie->video_bpp; |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
575 |
247
697dae977e6d
adapt to use interim palette control API; do away with multi-chunk data
tmmm
parents:
211
diff
changeset
|
576 /* palette considerations */ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
577 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
|
578 |
269
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
579 if (ipmovie->audio_type) { |
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
580 st = av_new_stream(s, 0); |
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
581 if (!st) |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
582 return AVERROR(ENOMEM); |
4603
04f857454909
Simplify ipmovie.c pts calculation by using an appropriate time_base.
reimar
parents:
4601
diff
changeset
|
583 av_set_pts_info(st, 32, 1, ipmovie->audio_sample_rate); |
269
021c58ac2f2c
properly demux silent files; implemented precise framerate calculation
tmmm
parents:
253
diff
changeset
|
584 ipmovie->audio_stream_index = st->index; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
585 st->codec->codec_type = CODEC_TYPE_AUDIO; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
586 st->codec->codec_id = ipmovie->audio_type; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
587 st->codec->codec_tag = 0; /* no tag */ |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
588 st->codec->channels = ipmovie->audio_channels; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
589 st->codec->sample_rate = ipmovie->audio_sample_rate; |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3484
diff
changeset
|
590 st->codec->bits_per_coded_sample = ipmovie->audio_bits; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
591 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3484
diff
changeset
|
592 st->codec->bits_per_coded_sample; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
593 if (st->codec->codec_id == CODEC_ID_INTERPLAY_DPCM) |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
775
diff
changeset
|
594 st->codec->bit_rate /= 2; |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3484
diff
changeset
|
595 st->codec->block_align = st->codec->channels * st->codec->bits_per_coded_sample; |
269
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 { |
2006 | 604 IPMVEContext *ipmovie = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
605 ByteIOContext *pb = s->pb; |
211
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) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
612 ret = AVERROR(EIO); |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
613 else if (ret == CHUNK_NOMEM) |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2006
diff
changeset
|
614 ret = AVERROR(ENOMEM); |
1800 | 615 else if (ret == CHUNK_VIDEO) |
616 ret = 0; | |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
617 else |
1800 | 618 ret = -1; |
211
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 return ret; |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
621 } |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
622 |
1169 | 623 AVInputFormat ipmovie_demuxer = { |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
624 "ipmovie", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3365
diff
changeset
|
625 NULL_IF_CONFIG_SMALL("Interplay MVE format"), |
211
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
626 sizeof(IPMVEContext), |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
627 ipmovie_probe, |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
628 ipmovie_read_header, |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
629 ipmovie_read_packet, |
349d63d52e7e
initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff
changeset
|
630 }; |