104 int64_t h1offset,
pos, toffset;
105 uint32_t
size, asize, start = 0;
109 int bfstm = !strcmp(
"bfstm",
s->iformat->name);
119 if (
bom != 0xFEFF &&
bom != 0xFFFE) {
125 b->little_endian = 1;
140 uint32_t info_offset = 0;
141 uint16_t section_count, header_size,
i;
150 && !(start && info_offset)
151 &&
i < section_count;
i++) {
174 if (!info_offset || !start)
200 case 1: codec =
b->little_endian ?
203 case 2: codec =
b->little_endian ?
242 b->current_block = 0;
244 if (
b->block_count > UINT16_MAX) {
254 b->last_block_used_bytes =
read32(
s);
259 if (
b->last_block_used_bytes >
b->last_block_size)
278 b->offsets[ch].channel = ch;
291 if (
avio_read(
s->pb,
b->table + ch * 32, 32) != 32) {
317 case MKTAG(
'S',
'E',
'E',
'K'):
318 case MKTAG(
'A',
'D',
'P',
'C'):
341 for (
i = 0;
i < asize;
i += 2) {
351 case MKTAG(
'D',
'A',
'T',
'A'):
387 uint32_t samples,
size, skip = 0;
393 if (
b->current_block ==
b->block_count) {
394 size =
b->last_block_used_bytes;
395 samples =
b->last_block_samples;
396 skip =
b->last_block_size -
b->last_block_used_bytes;
398 if (samples <
size * 14 / 8) {
399 uint32_t adjusted_size = samples / 14 * 8;
401 adjusted_size += (samples % 14 + 1) / 2 + 1;
403 skip +=
size - adjusted_size;
404 size = adjusted_size;
406 }
else if (
b->current_block <
b->block_count) {
407 size =
b->block_size;
408 samples =
b->samples_per_block;
422 if (
size > (INT_MAX - 32 - 4) ||
431 bytestream_put_le32(&dst, samples);
434 bytestream_put_be32(&dst, samples);
438 (
b->current_block - 1), 4 * par->
channels);
463 int64_t timestamp,
int flags)
471 timestamp /=
b->samples_per_block;
472 if (timestamp >=
b->block_count)
473 timestamp =
b->block_count - 1;
474 ret =
avio_seek(
s->pb,
b->data_start + timestamp *
b->block_size *
479 b->current_block = timestamp;
493 .extensions =
"brstm",
505 .extensions =
"bfstm,bcstm",
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
unsigned int avio_rb16(AVIOContext *s)
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.
unsigned int avio_rl16(AVIOContext *s)
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.
unsigned int avio_rl32(AVIOContext *s)
unsigned int avio_rb32(AVIOContext *s)
int avio_r8(AVIOContext *s)
static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
static int sort_offsets(const void *a, const void *b)
AVInputFormat ff_brstm_demuxer
static int read_close(AVFormatContext *s)
static av_always_inline unsigned int read32(AVFormatContext *s)
static int read_packet(AVFormatContext *s, AVPacket *pkt)
static int probe_bfstm(const AVProbeData *p)
AVInputFormat ff_bfstm_demuxer
static int read_header(AVFormatContext *s)
static int probe(const AVProbeData *p)
static av_always_inline unsigned int read16(AVFormatContext *s)
static av_always_inline void bytestream_put_buffer(uint8_t **b, const uint8_t *src, unsigned int size)
#define flags(name, subs,...)
#define MKTAG(a, b, c, d)
#define FFDIFFSIGN(x, y)
Comparator.
@ AV_CODEC_ID_PCM_S16BE_PLANAR
@ AV_CODEC_ID_ADPCM_THP_LE
@ AV_CODEC_ID_PCM_S16LE_PLANAR
@ AV_CODEC_ID_PCM_S8_PLANAR
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 AVCodec *c)
Add a new stream to a media file.
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AVERROR_EOF
End of file.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
#define AV_TIME_BASE
Internal time base represented as integer.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
This struct describes the properties of an encoded stream.
enum AVMediaType codec_type
General type of the encoded data.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int sample_rate
Audio only.
This structure stores compressed data.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
This structure contains the data a format has to probe a file.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int64_t duration
Decoding: duration of the stream, in stream time base.
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base.
uint32_t last_block_used_bytes
uint32_t samples_per_block
uint32_t last_block_samples
BRSTMCoeffOffset offsets[256]
#define avpriv_request_sample(...)