Go to the documentation of this file.
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_VIDEO_DATA_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_SET_SKIP_MAP 0x0E
70 #define OPCODE_SET_DECODING_MAP 0x0F
71 #define OPCODE_VIDEO_DATA_10 0x10
72 #define OPCODE_VIDEO_DATA_11 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
124 if (
s->audio_chunk_offset &&
s->audio_channels &&
s->audio_bits) {
127 "audio codec is known\n");
133 s->audio_chunk_offset += 6;
134 s->audio_chunk_size -= 6;
137 avio_seek(pb,
s->audio_chunk_offset, SEEK_SET);
138 s->audio_chunk_offset = 0;
144 pkt->
pts =
s->audio_frame_count;
148 s->audio_frame_count +=
149 (
s->audio_chunk_size /
s->audio_channels / (
s->audio_bits / 8));
151 s->audio_frame_count +=
152 (
s->audio_chunk_size - 6 -
s->audio_channels) /
s->audio_channels;
155 pkt->
pts,
s->audio_frame_count);
159 }
else if (
s->frame_format) {
163 if (
av_new_packet(
pkt, 8 +
s->decode_map_chunk_size +
s->video_chunk_size +
s->skip_map_chunk_size))
166 if (
s->has_palette) {
191 pkt->
pos =
s->video_chunk_offset;
192 avio_seek(pb,
s->video_chunk_offset, SEEK_SET);
193 s->video_chunk_offset = 0;
196 s->video_chunk_size) {
201 if (
s->decode_map_chunk_size) {
202 pkt->
pos =
s->decode_map_chunk_offset;
203 avio_seek(pb,
s->decode_map_chunk_offset, SEEK_SET);
204 s->decode_map_chunk_offset = 0;
207 s->decode_map_chunk_size) !=
s->decode_map_chunk_size) {
213 if (
s->skip_map_chunk_size) {
214 pkt->
pos =
s->skip_map_chunk_offset;
215 avio_seek(pb,
s->skip_map_chunk_offset, SEEK_SET);
216 s->skip_map_chunk_offset = 0;
219 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;
234 s->video_pts +=
s->frame_pts_inc;
240 avio_seek(pb,
s->next_chunk_offset, SEEK_SET);
282 unsigned char opcode_type;
283 unsigned char opcode_version;
285 unsigned char scratch[1024];
287 int first_color, last_color;
289 unsigned char r,
g,
b;
303 chunk_size =
AV_RL16(&chunk_preamble[0]);
304 chunk_type =
AV_RL16(&chunk_preamble[2]);
308 switch (chunk_type) {
341 while ((chunk_size > 0) && (chunk_type !=
CHUNK_BAD)) {
354 opcode_size =
AV_RL16(&opcode_preamble[0]);
355 opcode_type = opcode_preamble[2];
356 opcode_version = opcode_preamble[3];
359 chunk_size -= opcode_size;
360 if (chunk_size < 0) {
367 opcode_type, opcode_version, opcode_size);
368 switch (opcode_type) {
382 if ((opcode_version > 0) || (opcode_size != 6)) {
387 if (
avio_read(pb, scratch, opcode_size) !=
392 s->frame_pts_inc = ((uint64_t)
AV_RL32(&scratch[0])) *
AV_RL16(&scratch[4]);
397 if (opcode_version > 1 || opcode_size > 10 || opcode_size < 6) {
402 if (
avio_read(pb, scratch, opcode_size) !=
407 s->audio_sample_rate =
AV_RL16(&scratch[4]);
408 audio_flags =
AV_RL16(&scratch[2]);
410 s->audio_channels = (audio_flags & 1) + 1;
412 s->audio_bits = (((audio_flags >> 1) & 1) + 1) * 8;
414 if ((opcode_version == 1) && (audio_flags & 0x4))
416 else if (
s->audio_bits == 16)
421 s->audio_bits,
s->audio_sample_rate,
422 (
s->audio_channels == 2) ?
"stereo" :
"mono",
424 "Interplay audio" :
"PCM");
434 if ((opcode_version > 2) || (opcode_size > 8) || opcode_size < 4
435 || opcode_version == 2 && opcode_size < 8
441 if (
avio_read(pb, scratch, opcode_size) !=
448 if (
width !=
s->video_width) {
452 if (
height !=
s->video_height) {
456 if (opcode_version < 2 || !
AV_RL16(&scratch[6])) {
462 s->video_width,
s->video_height);
484 s->audio_chunk_size = opcode_size;
507 if (opcode_size > 0x304 || opcode_size < 4) {
512 if (
avio_read(pb, scratch, opcode_size) != opcode_size) {
518 first_color =
AV_RL16(&scratch[0]);
519 last_color = first_color +
AV_RL16(&scratch[2]) - 1;
521 if ( (first_color > 0xFF) || (last_color > 0xFF)
522 || (last_color - first_color + 1)*3 + 4 > opcode_size) {
523 av_log(
s->avf,
AV_LOG_TRACE,
"demux_ipmovie: set_palette indexes out of range (%d -> %d)\n",
524 first_color, last_color);
529 for (
i = first_color;
i <= last_color;
i++) {
532 r = scratch[j++] * 4;
533 g = scratch[j++] * 4;
534 b = scratch[j++] * 4;
535 s->palette[
i] = (0xFF
U << 24) | (
r << 16) | (
g << 8) | (
b);
536 s->palette[
i] |=
s->palette[
i] >> 6 & 0x30303;
551 s->skip_map_chunk_size = opcode_size;
560 s->decode_map_chunk_size = opcode_size;
566 s->frame_format = 0x06;
570 s->video_chunk_size = opcode_size;
576 s->frame_format = 0x10;
580 s->video_chunk_size = opcode_size;
586 s->frame_format = 0x11;
590 s->video_chunk_size = opcode_size;
602 if (
s->avf->nb_streams == 1 &&
s->audio_type)
615 static const char signature[] =
"Interplay MVE File\x1A\0\x1A";
642 avio_read(pb, signature_buffer,
sizeof(signature_buffer));
644 memmove(signature_buffer, signature_buffer + 1,
sizeof(signature_buffer) - 1);
645 signature_buffer[
sizeof(signature_buffer) - 1] =
avio_r8(pb);
660 for (
i = 0;
i < 256;
i++)
674 chunk_type =
AV_RL16(&chunk_preamble[2]);
#define OPCODE_CREATE_GRADIENT
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
enum AVMediaType codec_type
General type of the encoded data.
#define AVERROR_EOF
End of file.
#define AV_CH_LAYOUT_MONO
#define OPCODE_UNKNOWN_12
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
int64_t next_chunk_offset
int buf_size
Size of buf except extra allocated bytes.
#define OPCODE_SET_PALETTE_COMPRESSED
enum AVCodecID audio_type
#define OPCODE_INIT_AUDIO_BUFFERS
static int ipmovie_read_header(AVFormatContext *s)
#define OPCODE_UNKNOWN_14
static int ipmovie_probe(const AVProbeData *p)
int64_t audio_chunk_offset
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
#define AV_CH_LAYOUT_STEREO
static const char signature[]
#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_VIDEO_DATA_06
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
#define OPCODE_START_STOP_AUDIO
#define OPCODE_PREAMBLE_SIZE
#define OPCODE_END_OF_STREAM
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
unsigned int video_height
#define OPCODE_END_OF_CHUNK
int64_t decode_map_chunk_offset
AVCodecParameters * codecpar
Codec parameters associated with this stream.
static int read_header(FFV1Context *f)
int decode_map_chunk_size
@ AV_CODEC_ID_INTERPLAY_VIDEO
@ AV_CODEC_ID_INTERPLAY_DPCM
unsigned int audio_frame_count
int64_t skip_map_chunk_offset
This structure contains the data a format has to probe a file.
#define OPCODE_SET_SKIP_MAP
#define OPCODE_UNKNOWN_13
int sample_rate
Audio only.
AVCodecID
Identify the syntax and semantics of the bitstream.
static int init_audio(AVFormatContext *s)
#define OPCODE_INIT_VIDEO_BUFFERS
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define OPCODE_SET_DECODING_MAP
int avio_r8(AVIOContext *s)
#define OPCODE_INIT_VIDEO_MODE
unsigned int audio_channels
static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb, AVPacket *pkt)
#define OPCODE_VIDEO_DATA_10
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define OPCODE_SILENCE_FRAME
static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb, AVPacket *pkt)
#define OPCODE_VIDEO_DATA_11
int block_align
Audio only.
#define OPCODE_CREATE_TIMER
#define OPCODE_AUDIO_FRAME
#define OPCODE_UNKNOWN_15
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, buffer_size_t size)
static int ipmovie_read_packet(AVFormatContext *s, AVPacket *pkt)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
#define CHUNK_PREAMBLE_SIZE
int index
stream index in AVFormatContext
unsigned int audio_sample_rate
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
#define OPCODE_SET_PALETTE
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
int64_t video_chunk_offset
int bits_per_coded_sample
The number of bits per sample in the codedwords.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
AVInputFormat ff_ipmovie_demuxer
int64_t pos
byte position in stream, -1 if unknown
uint64_t channel_layout
Audio only.
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define OPCODE_SEND_BUFFER
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.