42#define CHUNK_PREAMBLE_SIZE 4
43#define OPCODE_PREAMBLE_SIZE 4
45#define CHUNK_INIT_AUDIO 0x0000
46#define CHUNK_AUDIO_ONLY 0x0001
47#define CHUNK_INIT_VIDEO 0x0002
48#define CHUNK_VIDEO 0x0003
49#define CHUNK_SHUTDOWN 0x0004
50#define CHUNK_END 0x0005
52#define CHUNK_HAVE_PACKET 0xFFFB
53#define CHUNK_DONE 0xFFFC
54#define CHUNK_NOMEM 0xFFFD
55#define CHUNK_EOF 0xFFFE
56#define CHUNK_BAD 0xFFFF
58#define OPCODE_END_OF_STREAM 0x00
59#define OPCODE_END_OF_CHUNK 0x01
60#define OPCODE_CREATE_TIMER 0x02
61#define OPCODE_INIT_AUDIO_BUFFERS 0x03
62#define OPCODE_START_STOP_AUDIO 0x04
63#define OPCODE_INIT_VIDEO_BUFFERS 0x05
64#define OPCODE_VIDEO_DATA_06 0x06
65#define OPCODE_SEND_BUFFER 0x07
66#define OPCODE_AUDIO_FRAME 0x08
67#define OPCODE_SILENCE_FRAME 0x09
68#define OPCODE_INIT_VIDEO_MODE 0x0A
69#define OPCODE_CREATE_GRADIENT 0x0B
70#define OPCODE_SET_PALETTE 0x0C
71#define OPCODE_SET_PALETTE_COMPRESSED 0x0D
72#define OPCODE_SET_SKIP_MAP 0x0E
73#define OPCODE_SET_DECODING_MAP 0x0F
74#define OPCODE_VIDEO_DATA_10 0x10
75#define OPCODE_VIDEO_DATA_11 0x11
76#define OPCODE_UNKNOWN_12 0x12
77#define OPCODE_UNKNOWN_13 0x13
78#define OPCODE_UNKNOWN_14 0x14
79#define OPCODE_UNKNOWN_15 0x15
81#define PALETTE_COUNT 256
127 if (
s->audio_chunk_offset &&
s->audio_channels &&
s->audio_bits) {
130 "audio codec is known\n");
136 s->audio_chunk_offset += 6;
137 s->audio_chunk_size -= 6;
140 avio_seek(pb,
s->audio_chunk_offset, SEEK_SET);
141 s->audio_chunk_offset = 0;
146 pkt->stream_index =
s->audio_stream_index;
147 pkt->pts =
s->audio_frame_count;
151 s->audio_frame_count +=
152 (
s->audio_chunk_size /
s->audio_channels / (
s->audio_bits / 8));
154 s->audio_frame_count +=
155 (
s->audio_chunk_size - 6 -
s->audio_channels) /
s->audio_channels;
158 pkt->pts,
s->audio_frame_count);
162 }
else if (
s->frame_format) {
166 if (
av_new_packet(
pkt, 8 +
s->decode_map_chunk_size +
s->video_chunk_size +
s->skip_map_chunk_size))
169 if (
s->has_palette) {
194 pkt->pos =
s->video_chunk_offset;
195 avio_seek(pb,
s->video_chunk_offset, SEEK_SET);
196 s->video_chunk_offset = 0;
199 s->video_chunk_size) {
203 if (
s->decode_map_chunk_size) {
204 pkt->pos =
s->decode_map_chunk_offset;
205 avio_seek(pb,
s->decode_map_chunk_offset, SEEK_SET);
206 s->decode_map_chunk_offset = 0;
209 s->decode_map_chunk_size) !=
s->decode_map_chunk_size) {
214 if (
s->skip_map_chunk_size) {
215 pkt->pos =
s->skip_map_chunk_offset;
216 avio_seek(pb,
s->skip_map_chunk_offset, SEEK_SET);
217 s->skip_map_chunk_offset = 0;
219 if (
avio_read(pb,
pkt->data + 8 +
s->video_chunk_size +
s->decode_map_chunk_size,
220 s->skip_map_chunk_size) !=
s->skip_map_chunk_size) {
225 s->video_chunk_size = 0;
226 s->decode_map_chunk_size = 0;
227 s->skip_map_chunk_size = 0;
229 pkt->stream_index =
s->video_stream_index;
230 pkt->pts =
s->video_pts;
234 s->video_pts +=
s->frame_pts_inc;
240 avio_seek(pb,
s->next_chunk_offset, SEEK_SET);
280 unsigned char opcode_type;
281 unsigned char opcode_version;
283 unsigned char scratch[1024];
285 int first_color, last_color;
287 unsigned char r,
g,
b;
301 chunk_size =
AV_RL16(&chunk_preamble[0]);
302 chunk_type =
AV_RL16(&chunk_preamble[2]);
306 switch (chunk_type) {
339 while ((chunk_size > 0) && (chunk_type !=
CHUNK_BAD)) {
352 opcode_size =
AV_RL16(&opcode_preamble[0]);
353 opcode_type = opcode_preamble[2];
354 opcode_version = opcode_preamble[3];
357 chunk_size -= opcode_size;
358 if (chunk_size < 0) {
365 opcode_type, opcode_version, opcode_size);
366 switch (opcode_type) {
380 if ((opcode_version > 0) || (opcode_size != 6)) {
385 if (
avio_read(pb, scratch, opcode_size) !=
390 s->frame_pts_inc = ((uint64_t)
AV_RL32(&scratch[0])) *
AV_RL16(&scratch[4]);
395 if (opcode_version > 1 || opcode_size > 10 || opcode_size < 6) {
400 if (
avio_read(pb, scratch, opcode_size) !=
405 s->audio_sample_rate =
AV_RL16(&scratch[4]);
406 audio_flags =
AV_RL16(&scratch[2]);
408 s->audio_channels = (audio_flags & 1) + 1;
410 s->audio_bits = (((audio_flags >> 1) & 1) + 1) * 8;
412 if ((opcode_version == 1) && (audio_flags & 0x4))
414 else if (
s->audio_bits == 16)
419 s->audio_bits,
s->audio_sample_rate,
420 (
s->audio_channels == 2) ?
"stereo" :
"mono",
422 "Interplay audio" :
"PCM");
432 if ((opcode_version > 2) || (opcode_size > 8) || opcode_size < 4
433 || opcode_version == 2 && opcode_size < 8
439 if (
avio_read(pb, scratch, opcode_size) !=
446 if (
width !=
s->video_width) {
450 if (
height !=
s->video_height) {
454 if (opcode_version < 2 || !
AV_RL16(&scratch[6])) {
460 s->video_width,
s->video_height);
482 s->audio_chunk_size = opcode_size;
505 if (opcode_size > 0x304 || opcode_size < 4) {
510 if (
avio_read(pb, scratch, opcode_size) != opcode_size) {
516 first_color =
AV_RL16(&scratch[0]);
517 last_color = first_color +
AV_RL16(&scratch[2]) - 1;
519 if ( (first_color > 0xFF) || (last_color > 0xFF)
520 || (last_color - first_color + 1)*3 + 4 > opcode_size) {
521 av_log(
s->avf,
AV_LOG_TRACE,
"demux_ipmovie: set_palette indexes out of range (%d -> %d)\n",
522 first_color, last_color);
527 for (
i = first_color;
i <= last_color;
i++) {
530 r = scratch[j++] * 4;
531 g = scratch[j++] * 4;
532 b = scratch[j++] * 4;
533 s->palette[
i] = (0xFFU << 24) | (
r << 16) | (
g << 8) | (
b);
534 s->palette[
i] |=
s->palette[
i] >> 6 & 0x30303;
549 s->skip_map_chunk_size = opcode_size;
558 s->decode_map_chunk_size = opcode_size;
565 s->frame_format = opcode_type;
571 s->video_chunk_size = opcode_size;
583 if (
s->avf->nb_streams == 1 &&
s->audio_type)
592static const char signature[] =
"Interplay MVE File\x1A\0\x1A";
596 const uint8_t *
b = p->buf;
597 const uint8_t *b_end = p->buf + p->buf_size -
sizeof(
signature);
614 uint8_t signature_buffer[
sizeof(
signature)];
619 ret =
ffio_read_size(pb, signature_buffer,
sizeof(signature_buffer));
623 memmove(signature_buffer, signature_buffer + 1,
sizeof(signature_buffer) - 1);
624 signature_buffer[
sizeof(signature_buffer) - 1] =
avio_r8(pb);
632 for (
i = 0;
i < 256;
i++)
644 chunk_type =
AV_RL16(&chunk_preamble[2]);
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
int avio_r8(AVIOContext *s)
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
#define i(width, name, range_min, range_max)
static int read_probe(const AVProbeData *p)
Public libavutil channel layout APIs header.
int ff_add_param_change(AVPacket *pkt, int32_t channels, uint64_t channel_layout, int32_t sample_rate, int32_t width, int32_t height)
Add side data to a packet for changing parameters to the given values.
static int read_header(FFV1Context *f, RangeCoder *c)
AVCodecID
Identify the syntax and semantics of the bitstream.
@ AV_CODEC_ID_INTERPLAY_DPCM
@ AV_CODEC_ID_INTERPLAY_VIDEO
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels)
Get the default channel layout for a given number of channels.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AVERROR_EOF
End of file.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define OPCODE_INIT_VIDEO_BUFFERS
#define OPCODE_UNKNOWN_12
#define OPCODE_SILENCE_FRAME
#define OPCODE_SET_SKIP_MAP
#define OPCODE_INIT_VIDEO_MODE
#define OPCODE_INIT_AUDIO_BUFFERS
#define OPCODE_VIDEO_DATA_11
#define OPCODE_VIDEO_DATA_06
#define OPCODE_SEND_BUFFER
#define OPCODE_SET_PALETTE
static int init_audio(AVFormatContext *s)
#define OPCODE_PREAMBLE_SIZE
static const char signature[]
#define OPCODE_CREATE_GRADIENT
#define OPCODE_END_OF_STREAM
#define OPCODE_SET_DECODING_MAP
#define OPCODE_SET_PALETTE_COMPRESSED
#define CHUNK_PREAMBLE_SIZE
#define OPCODE_START_STOP_AUDIO
#define OPCODE_UNKNOWN_14
#define OPCODE_AUDIO_FRAME
static int ipmovie_read_header(AVFormatContext *s)
#define OPCODE_UNKNOWN_15
static int ipmovie_probe(const AVProbeData *p)
#define OPCODE_UNKNOWN_13
#define CHUNK_HAVE_PACKET
#define OPCODE_END_OF_CHUNK
static int ipmovie_read_packet(AVFormatContext *s, AVPacket *pkt)
#define OPCODE_CREATE_TIMER
static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb, AVPacket *pkt)
#define OPCODE_VIDEO_DATA_10
static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb, AVPacket *pkt)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int height
The height of the video frame in pixels.
int bits_per_coded_sample
The number of bits per sample in the codedwords.
AVChannelLayout ch_layout
The channel layout and number of channels.
int width
The width of the video frame in pixels.
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
enum AVMediaType codec_type
General type of the encoded data.
int block_align
The number of bytes per coded audio frame, required by some formats.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int sample_rate
The number of audio samples per second.
This structure stores compressed data.
This structure contains the data a format has to probe a file.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int index
stream index in AVFormatContext
int64_t audio_chunk_offset
unsigned int audio_sample_rate
unsigned int audio_channels
int64_t video_chunk_offset
unsigned int video_height
int decode_map_chunk_size
int64_t decode_map_chunk_offset
int64_t skip_map_chunk_offset
int64_t next_chunk_offset
enum AVCodecID audio_type
unsigned int audio_frame_count