1 /*
2 * Tiertex Limited SEQ File Demuxer
3 * Copyright (c) 2006 Gregory Montoir (cyx@users.sourceforge.net)
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * Tiertex Limited SEQ file demuxer
25 */
26
30
31 #define SEQ_FRAME_SIZE 6144
32 #define SEQ_FRAME_W 256
33 #define SEQ_FRAME_H 128
34 #define SEQ_NUM_FRAME_BUFFERS 30
35 #define SEQ_AUDIO_BUFFER_SIZE 882
36 #define SEQ_SAMPLE_RATE 22050
37 #define SEQ_FRAME_RATE 25
38
39
45
61
62
64 {
65 int i;
66
68 return 0;
69
70 /* there's no real header in a .seq file, the only thing they have in common */
71 /* is the first 256 bytes of the file which are always filled with 0 */
72 for (i = 0; i < 256; i++)
74 return 0;
75
76 if(p->
buf[256]==0 && p->
buf[257]==0)
77 return 0;
78
79 /* only one fourth of the score since the previous check is too naive */
81 }
82
84 {
85 int i, sz;
87
89
92 if (sz == 0)
93 break;
94 else {
99 if (!seq_buffer->
data)
101 }
102 }
104 return 0;
105 }
106
108 {
110
113
117
121
123 return 0;
124 }
125
127 {
130 int i, e, err;
131
134
135 /* sound data */
139 } else {
141 }
142
143 /* palette data */
147 } else {
149 }
150
151 /* video data */
152 for (i = 0; i < 4; i++)
154
155 for (i = 0; i < 4; i++)
157
158 for (i = 0; i < 3; i++) {
159 if (offset_table[i]) {
160 for (e = i + 1; e < 3 && offset_table[e] == 0; e++);
162 offset_table[i],
163 offset_table[e] - offset_table[i]);
164 if (err)
165 return err;
166 }
167 }
168
169 if (buffer_num[0] != 255) {
172
177 } else {
180 }
181
182 return 0;
183 }
184
186 {
187 int i, rc;
191
192 /* init internal buffers */
194 if (rc)
195 return rc;
196
198
199 /* preload (no audio data, just buffer operations related data) */
200 for (i = 1; i <= 100; i++) {
202 if (rc)
203 return rc;
204 }
205
207
209
210 /* initialize the video decoder stream */
212 if (!st)
214
222
223 /* initialize the audio decoder stream */
225 if (!st)
227
240
241 return 0;
242 }
243
245 {
246 int rc;
249
252 if (rc)
253 return rc;
254
255 /* video packet */
259
266 }
272 }
275
276 /* sound buffer will be processed on next read_packet() call */
278 return 0;
279 }
280 }
281
282 /* audio packet */
285
288 if (rc < 0)
289 return rc;
290
293
295 return 0;
296 }
297
299 {
300 int i;
302
305
306 return 0;
307 }
308
310 .
name =
"tiertexseq",
317 };
unsigned int current_audio_data_size
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int seq_probe(AVProbeData *p)
AVInputFormat ff_tiertexseq_demuxer
int64_t bit_rate
the average bitrate
int index
stream index in AVFormatContext
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define SEQ_AUDIO_BUFFER_SIZE
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
unsigned int current_audio_data_offs
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
static av_cold int read_close(AVFormatContext *ctx)
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
unsigned int current_pal_data_size
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
static int seq_parse_frame_data(SeqDemuxContext *seq, AVIOContext *pb)
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
#define SEQ_NUM_FRAME_BUFFERS
static int seq_fill_buffer(SeqDemuxContext *seq, AVIOContext *pb, int buffer_num, unsigned int data_offs, int data_size)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static int seq_read_packet(AVFormatContext *s, AVPacket *pkt)
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.
audio channel layout utility functions
unsigned int current_pal_data_offs
int width
picture width / height.
unsigned char * current_video_data_ptr
TiertexSeqFrameBuffer frame_buffers[SEQ_NUM_FRAME_BUFFERS]
static int read_header(FFV1Context *f)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
enum AVMediaType codec_type
int sample_rate
samples per second
AVIOContext * pb
I/O context.
static int seq_read_close(AVFormatContext *s)
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
unsigned int current_video_data_size
This structure contains the data a format has to probe a file.
unsigned int avio_rl16(AVIOContext *s)
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base...
static const uint8_t offset_table[]
int channels
number of audio channels
void * priv_data
Format private data.
#define AV_CH_LAYOUT_MONO
static int seq_read_header(AVFormatContext *s)
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static int seq_init_frame_buffers(SeqDemuxContext *seq, AVIOContext *pb)