40 #define CHUNK_PREAMBLE_SIZE 4
41 #define OPCODE_PREAMBLE_SIZE 4
43 #define CHUNK_INIT_AUDIO 0x0000
44 #define CHUNK_AUDIO_ONLY 0x0001
45 #define CHUNK_INIT_VIDEO 0x0002
46 #define CHUNK_VIDEO 0x0003
47 #define CHUNK_SHUTDOWN 0x0004
48 #define CHUNK_END 0x0005
50 #define CHUNK_DONE 0xFFFC
51 #define CHUNK_NOMEM 0xFFFD
52 #define CHUNK_EOF 0xFFFE
53 #define CHUNK_BAD 0xFFFF
55 #define OPCODE_END_OF_STREAM 0x00
56 #define OPCODE_END_OF_CHUNK 0x01
57 #define OPCODE_CREATE_TIMER 0x02
58 #define OPCODE_INIT_AUDIO_BUFFERS 0x03
59 #define OPCODE_START_STOP_AUDIO 0x04
60 #define OPCODE_INIT_VIDEO_BUFFERS 0x05
61 #define OPCODE_UNKNOWN_06 0x06
62 #define OPCODE_SEND_BUFFER 0x07
63 #define OPCODE_AUDIO_FRAME 0x08
64 #define OPCODE_SILENCE_FRAME 0x09
65 #define OPCODE_INIT_VIDEO_MODE 0x0A
66 #define OPCODE_CREATE_GRADIENT 0x0B
67 #define OPCODE_SET_PALETTE 0x0C
68 #define OPCODE_SET_PALETTE_COMPRESSED 0x0D
69 #define OPCODE_UNKNOWN_0E 0x0E
70 #define OPCODE_SET_DECODING_MAP 0x0F
71 #define OPCODE_UNKNOWN_10 0x10
72 #define OPCODE_VIDEO_DATA 0x11
73 #define OPCODE_UNKNOWN_12 0x12
74 #define OPCODE_UNKNOWN_13 0x13
75 #define OPCODE_UNKNOWN_14 0x14
76 #define OPCODE_UNKNOWN_15 0x15
78 #define PALETTE_COUNT 256
123 "audio codec is known\n");
150 av_dlog(
NULL,
"sending audio frame with pts %"PRId64
" (%d audio frames)\n",
200 av_dlog(
NULL,
"sending video frame with pts %"PRId64
"\n", pkt->
pts);
225 unsigned char opcode_type;
226 unsigned char opcode_version;
228 unsigned char scratch[1024];
230 int first_color, last_color;
232 unsigned char r,
g,
b;
246 chunk_size =
AV_RL16(&chunk_preamble[0]);
247 chunk_type =
AV_RL16(&chunk_preamble[2]);
249 av_dlog(
NULL,
"chunk type 0x%04X, 0x%04X bytes: ", chunk_type, chunk_size);
251 switch (chunk_type) {
284 while ((chunk_size > 0) && (chunk_type !=
CHUNK_BAD)) {
297 opcode_size =
AV_RL16(&opcode_preamble[0]);
298 opcode_type = opcode_preamble[2];
299 opcode_version = opcode_preamble[3];
302 chunk_size -= opcode_size;
303 if (chunk_size < 0) {
304 av_dlog(
NULL,
"chunk_size countdown just went negative\n");
309 av_dlog(
NULL,
" opcode type %02X, version %d, 0x%04X bytes: ",
310 opcode_type, opcode_version, opcode_size);
311 switch (opcode_type) {
325 if ((opcode_version > 0) || (opcode_size != 6)) {
330 if (
avio_read(pb, scratch, opcode_size) !=
336 av_dlog(
NULL,
" %.2f frames/second (timer div = %d, subdiv = %d)\n",
343 if (opcode_version > 1 || opcode_size > 10 || opcode_size < 6) {
348 if (
avio_read(pb, scratch, opcode_size) !=
354 audio_flags =
AV_RL16(&scratch[2]);
358 s->
audio_bits = (((audio_flags >> 1) & 1) + 1) * 8;
360 if ((opcode_version == 1) && (audio_flags & 0x4))
366 av_dlog(
NULL,
"audio: %d bits, %d Hz, %s, %s format\n",
370 "Interplay audio" :
"PCM");
380 if ((opcode_version > 2) || (opcode_size > 8) || opcode_size < 4
381 || opcode_version == 2 && opcode_size < 8
387 if (
avio_read(pb, scratch, opcode_size) !=
392 width =
AV_RL16(&scratch[0]) * 8;
393 height =
AV_RL16(&scratch[2]) * 8;
402 if (opcode_version < 2 || !
AV_RL16(&scratch[6])) {
418 av_dlog(
NULL,
"unknown (but documented) opcode %02X\n", opcode_type);
455 if (opcode_size > 0x304 || opcode_size < 4) {
456 av_dlog(
NULL,
"demux_ipmovie: set_palette opcode with invalid size\n");
460 if (
avio_read(pb, scratch, opcode_size) != opcode_size) {
466 first_color =
AV_RL16(&scratch[0]);
467 last_color = first_color +
AV_RL16(&scratch[2]) - 1;
469 if ( (first_color > 0xFF) || (last_color > 0xFF)
470 || (last_color - first_color + 1)*3 + 4 > opcode_size) {
471 av_dlog(
NULL,
"demux_ipmovie: set_palette indexes out of range (%d -> %d)\n",
472 first_color, last_color);
477 for (i = first_color; i <= last_color; i++) {
480 r = scratch[j++] * 4;
481 g = scratch[j++] * 4;
482 b = scratch[j++] * 4;
483 s->
palette[i] = (0xFF
U << 24) | (r << 16) | (g << 8) | (b);
530 static const char signature[] =
"Interplay MVE File\x1A\0\x1A";
555 avio_read(pb, signature_buffer,
sizeof(signature_buffer));
557 memmove(signature_buffer, signature_buffer + 1,
sizeof(signature_buffer) - 1);
558 signature_buffer[
sizeof(signature_buffer) - 1] =
avio_r8(pb);
570 for (i = 0; i < 256; i++)
571 ipmovie->
palette[i] = 0xFFU << 24;
582 chunk_type =
AV_RL16(&chunk_preamble[2]);