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
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 *
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
f4e9e55f703c cvs diff before cvs commit
melanson
parents: 482
diff changeset
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
c47a84f46ae2 Recognize 16-bit Interplay Video variant
kostya
parents: 5157
diff changeset
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
e51ace85da6c Fix a warning when compiling with icc:
cehoyos
parents: 3973
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
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
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
130 /* adjust for PCM audio by skipping chunk header */
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
131 if (s->audio_type != CODEC_ID_INTERPLAY_DPCM) {
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
132 s->audio_chunk_offset += 6;
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
133 s->audio_chunk_size -= 6;
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
134 }
4aa51913d0b2 provisions for raw PCM audio
tmmm
parents: 247
diff changeset
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
c5077fdab490 AVPacket.pos
michael
parents: 483
diff changeset
139 if (s->audio_chunk_size != av_get_packet(pb, pkt, s->audio_chunk_size))
c5077fdab490 AVPacket.pos
michael
parents: 483
diff changeset
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
c5077fdab490 AVPacket.pos
michael
parents: 483
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
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
3edc6f0468be not checking error return, resulting double free
michael
parents: 1673
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
233 chunk_size = AV_RL16(&chunk_preamble[0]);
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
339 s->audio_sample_rate = AV_RL16(&scratch[4]);
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
377 s->video_width = AV_RL16(&scratch[0]) * 8;
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
378 s->video_height = AV_RL16(&scratch[2]) * 8;
5475
c47a84f46ae2 Recognize 16-bit Interplay Video variant
kostya
parents: 5157
diff changeset
379 if (opcode_version < 2 || !AV_RL16(&scratch[6])) {
c47a84f46ae2 Recognize 16-bit Interplay Video variant
kostya
parents: 5157
diff changeset
380 s->video_bpp = 8;
c47a84f46ae2 Recognize 16-bit Interplay Video variant
kostya
parents: 5157
diff changeset
381 } else {
c47a84f46ae2 Recognize 16-bit Interplay Video variant
kostya
parents: 5157
diff changeset
382 s->video_bpp = 16;
c47a84f46ae2 Recognize 16-bit Interplay Video variant
kostya
parents: 5157
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
443 first_color = AV_RL16(&scratch[0]);
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
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
19bd4caf27a9 consistency cosmetics: indices --> indexes
diego
parents: 2771
diff changeset
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
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
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
a782462e2497 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 1443
diff changeset
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
e51ace85da6c Fix a warning when compiling with icc:
cehoyos
parents: 3973
diff changeset
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
c47a84f46ae2 Recognize 16-bit Interplay Video variant
kostya
parents: 5157
diff changeset
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
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
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
3edc6f0468be not checking error return, resulting double free
michael
parents: 1673
diff changeset
615 else if (ret == CHUNK_VIDEO)
3edc6f0468be not checking error return, resulting double free
michael
parents: 1673
diff changeset
616 ret = 0;
211
349d63d52e7e initial commit for Id RoQ and Interplay MVE multimedia subsystems
tmmm
parents:
diff changeset
617 else
1800
3edc6f0468be not checking error return, resulting double free
michael
parents: 1673
diff changeset
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
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
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 };