FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
aea.c
Go to the documentation of this file.
1 /*
2  * MD STUDIO audio demuxer
3  *
4  * Copyright (c) 2009 Benjamin Larsson
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
24 #include "libavutil/intreadwrite.h"
25 #include "avformat.h"
26 #include "pcm.h"
27 
28 #define AT1_SU_SIZE 212
29 
31 {
32  if (p->buf_size <= 2048+212)
33  return 0;
34 
35  /* Magic is '00 08 00 00' in Little Endian*/
36  if (AV_RL32(p->buf)==0x800) {
37  int ch, i;
38  ch = p->buf[264];
39 
40  if (ch != 1 && ch != 2)
41  return 0;
42 
43  /* Check so that the redundant bsm bytes and info bytes are valid
44  * the block size mode bytes have to be the same
45  * the info bytes have to be the same
46  */
47  for (i = 2048; i + 211 < p->buf_size; i+= 212) {
48  int bsm_s, bsm_e, inb_s, inb_e;
49  bsm_s = p->buf[0];
50  inb_s = p->buf[1];
51  inb_e = p->buf[210];
52  bsm_e = p->buf[211];
53 
54  if (bsm_s != bsm_e || inb_s != inb_e)
55  return 0;
56  }
57  return AVPROBE_SCORE_MAX / 4 + 1;
58  }
59  return 0;
60 }
61 
63 {
65  if (!st)
66  return AVERROR(ENOMEM);
67 
68  /* Parse the amount of channels and skip to pos 2048(0x800) */
69  avio_skip(s->pb, 264);
70  st->codec->channels = avio_r8(s->pb);
71  avio_skip(s->pb, 1783);
72 
73 
76  st->codec->sample_rate = 44100;
77  st->codec->bit_rate = 292000;
78 
79  if (st->codec->channels != 1 && st->codec->channels != 2) {
80  av_log(s,AV_LOG_ERROR,"Channels %d not supported!\n",st->codec->channels);
81  return AVERROR_INVALIDDATA;
82  }
83 
85 
87  return 0;
88 }
89 
91 {
92  int ret = av_get_packet(s->pb, pkt, s->streams[0]->codec->block_align);
93 
94  pkt->stream_index = 0;
95  if (ret <= 0)
96  return AVERROR(EIO);
97 
98  return ret;
99 }
100 
102  .name = "aea",
103  .long_name = NULL_IF_CONFIG_SMALL("MD STUDIO audio"),
104  .read_probe = aea_read_probe,
105  .read_header = aea_read_header,
106  .read_packet = aea_read_packet,
107  .read_seek = ff_pcm_read_seek,
108  .flags = AVFMT_GENERIC_INDEX,
109  .extensions = "aea",
110 };
#define NULL
Definition: coverity.c:32
const char * s
Definition: avisynth_c.h:631
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:277
static AVPacket pkt
#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...
Definition: avcodec.h:2299
Format I/O context.
Definition: avformat.h:1273
AVInputFormat ff_aea_demuxer
Definition: aea.c:101
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:3749
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1341
static int aea_read_header(AVFormatContext *s)
Definition: aea.c:62
static int aea_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: aea.c:90
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition: utils.c:244
#define av_log(a,...)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define AVERROR(e)
Definition: error.h:43
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:175
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2323
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:529
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:861
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:451
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:450
int bit_rate
the average bitrate
Definition: avcodec.h:1567
audio channel layout utility functions
static int aea_read_probe(AVProbeData *p)
Definition: aea.c:30
int ff_pcm_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: pcm.c:45
#define AT1_SU_SIZE
Definition: aea.c:28
Stream structure.
Definition: avformat.h:842
enum AVMediaType codec_type
Definition: avcodec.h:1510
enum AVCodecID codec_id
Definition: avcodec.h:1519
int sample_rate
samples per second
Definition: avcodec.h:2262
AVIOContext * pb
I/O context.
Definition: avformat.h:1315
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:473
This structure contains the data a format has to probe a file.
Definition: avformat.h:448
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:460
Main libavformat public API header.
int channels
number of audio channels
Definition: avcodec.h:2263
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:628
int stream_index
Definition: avcodec.h:1425
#define AV_CH_LAYOUT_MONO
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:87
This structure stores compressed data.
Definition: avcodec.h:1400