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 bit_rate
the average bitrate
Definition: avcodec.h:1597
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:282
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:2324
Format I/O context.
Definition: avformat.h:1314
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:3805
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1382
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:252
#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:176
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2338
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:536
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:896
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:463
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:462
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:877
enum AVMediaType codec_type
Definition: avcodec.h:1540
enum AVCodecID codec_id
Definition: avcodec.h:1549
int sample_rate
samples per second
Definition: avcodec.h:2287
AVIOContext * pb
I/O context.
Definition: avformat.h:1356
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:486
This structure contains the data a format has to probe a file.
Definition: avformat.h:460
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:472
Main libavformat public API header.
int channels
number of audio channels
Definition: avcodec.h:2288
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:661
int stream_index
Definition: avcodec.h:1469
#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:1444