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",
199 av_dlog(
NULL,
"sending video frame with pts %"PRId64
"\n", pkt->
pts);
224 unsigned char opcode_type;
225 unsigned char opcode_version;
227 unsigned char scratch[1024];
229 int first_color, last_color;
231 unsigned char r,
g,
b;
245 chunk_size =
AV_RL16(&chunk_preamble[0]);
246 chunk_type =
AV_RL16(&chunk_preamble[2]);
248 av_dlog(
NULL,
"chunk type 0x%04X, 0x%04X bytes: ", chunk_type, chunk_size);
250 switch (chunk_type) {
283 while ((chunk_size > 0) && (chunk_type !=
CHUNK_BAD)) {
296 opcode_size =
AV_RL16(&opcode_preamble[0]);
297 opcode_type = opcode_preamble[2];
298 opcode_version = opcode_preamble[3];
301 chunk_size -= opcode_size;
302 if (chunk_size < 0) {
303 av_dlog(
NULL,
"chunk_size countdown just went negative\n");
308 av_dlog(
NULL,
" opcode type %02X, version %d, 0x%04X bytes: ",
309 opcode_type, opcode_version, opcode_size);
310 switch (opcode_type) {
324 if ((opcode_version > 0) || (opcode_size > 6)) {
329 if (
avio_read(pb, scratch, opcode_size) !=
335 av_dlog(
NULL,
" %.2f frames/second (timer div = %d, subdiv = %d)\n",
342 if ((opcode_version > 1) || (opcode_size > 10)) {
347 if (
avio_read(pb, scratch, opcode_size) !=
353 audio_flags =
AV_RL16(&scratch[2]);
357 s->
audio_bits = (((audio_flags >> 1) & 1) + 1) * 8;
359 if ((opcode_version == 1) && (audio_flags & 0x4))
365 av_dlog(
NULL,
"audio: %d bits, %d Hz, %s, %s format\n",
369 "Interplay audio" :
"PCM");
379 if ((opcode_version > 2) || (opcode_size > 8)) {
384 if (
avio_read(pb, scratch, opcode_size) !=
389 width =
AV_RL16(&scratch[0]) * 8;
390 height =
AV_RL16(&scratch[2]) * 8;
399 if (opcode_version < 2 || !
AV_RL16(&scratch[6])) {
415 av_dlog(
NULL,
"unknown (but documented) opcode %02X\n", opcode_type);
452 if (opcode_size > 0x304) {
453 av_dlog(
NULL,
"demux_ipmovie: set_palette opcode too large\n");
457 if (
avio_read(pb, scratch, opcode_size) != opcode_size) {
463 first_color =
AV_RL16(&scratch[0]);
464 last_color = first_color +
AV_RL16(&scratch[2]) - 1;
466 if ((first_color > 0xFF) || (last_color > 0xFF)) {
467 av_dlog(
NULL,
"demux_ipmovie: set_palette indexes out of range (%d -> %d)\n",
468 first_color, last_color);
473 for (i = first_color; i <= last_color; i++) {
476 r = scratch[j++] * 4;
477 g = scratch[j++] * 4;
478 b = scratch[j++] * 4;
479 s->
palette[i] = (r << 16) | (g << 8) | (
b);
525 static const char signature[] =
"Interplay MVE File\x1A\0\x1A";
549 avio_read(pb, signature_buffer,
sizeof(signature_buffer));
551 memmove(signature_buffer, signature_buffer + 1,
sizeof(signature_buffer) - 1);
552 signature_buffer[
sizeof(signature_buffer) - 1] =
avio_r8(pb);
573 chunk_type =
AV_RL16(&chunk_preamble[2]);
#define OPCODE_SET_PALETTE_COMPRESSED
int64_t decode_map_chunk_offset
#define OPCODE_UNKNOWN_06
#define OPCODE_SEND_BUFFER
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void av_free_packet(AVPacket *pkt)
Free a packet.
static int ipmovie_read_header(AVFormatContext *s)
#define OPCODE_VIDEO_DATA
int64_t pos
byte position in stream, -1 if unknown
#define OPCODE_UNKNOWN_14
int index
stream index in AVFormatContext
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define AV_CH_LAYOUT_STEREO
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
#define OPCODE_CREATE_GRADIENT
static int ipmovie_probe(AVProbeData *p)
av_dlog(ac->avr, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
static const char signature[]
#define OPCODE_UNKNOWN_12
int64_t audio_chunk_offset
unsigned int audio_channels
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
int decode_map_chunk_size
int64_t next_chunk_offset
#define AVERROR_EOF
End of file.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
unsigned int video_height
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
#define OPCODE_INIT_AUDIO_BUFFERS
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_log(void *avcl, int level, const char *fmt,...)
#define OPCODE_UNKNOWN_13
#define OPCODE_SET_DECODING_MAP
#define OPCODE_END_OF_CHUNK
uint64_t channel_layout
Audio channel layout.
int avio_r8(AVIOContext *s)
AVCodecContext * codec
Codec context associated with this stream.
int buf_size
Size of buf except extra allocated bytes.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
int bit_rate
the average bitrate
audio channel layout utility functions
#define OPCODE_UNKNOWN_10
int width
picture width / height.
static av_always_inline int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
#define OPCODE_PREAMBLE_SIZE
#define OPCODE_START_STOP_AUDIO
#define OPCODE_UNKNOWN_0E
#define OPCODE_END_OF_STREAM
static int read_header(FFV1Context *f)
enum AVCodecID audio_type
#define OPCODE_INIT_VIDEO_MODE
enum AVMediaType codec_type
int sample_rate
samples per second
AVIOContext * pb
I/O context.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb, AVPacket *pkt)
#define OPCODE_INIT_VIDEO_BUFFERS
int64_t video_chunk_offset
This structure contains the data a format has to probe a file.
static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb, AVPacket *pkt)
#define OPCODE_AUDIO_FRAME
#define OPCODE_CREATE_TIMER
#define OPCODE_SILENCE_FRAME
#define CHUNK_PREAMBLE_SIZE
AVInputFormat ff_ipmovie_demuxer
int eof_reached
true if eof reached
#define OPCODE_SET_PALETTE
int channels
number of audio channels
unsigned int audio_frame_count
void * priv_data
Format private data.
#define OPCODE_UNKNOWN_15
static int ipmovie_read_packet(AVFormatContext *s, AVPacket *pkt)
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
unsigned int audio_sample_rate
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...