FFmpeg: libavformat/aea.c Source File

FFmpeg
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 
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/intreadwrite.h"
25 #include "avformat.h"
26 #include "pcm.h"
27 
28  #define AT1_SU_SIZE 212
29 
30  static int aea_read_probe(AVProbeData *p)
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 
62  static int aea_read_header(AVFormatContext *s)
63 {
64  AVStream *st = avformat_new_stream(s, NULL);
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 
74  st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
75  st->codec->codec_id = AV_CODEC_ID_ATRAC1;
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 
84  st->codec->channel_layout = (st->codec->channels == 1) ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO;
85 
86  st->codec->block_align = AT1_SU_SIZE * st->codec->channels;
87  return 0;
88 }
89 
90  static int aea_read_packet(AVFormatContext *s, AVPacket *pkt)
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 
101  AVInputFormat ff_aea_demuxer = {
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 };
NULL
#define NULL
Definition: coverity.c:32
s
const char * s
Definition: avisynth_c.h:631
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:1597
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:282
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
AV_CH_LAYOUT_STEREO
#define AV_CH_LAYOUT_STEREO
Definition: channel_layout.h:86
AVCodecContext::block_align
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
AVFormatContext
Format I/O context.
Definition: avformat.h:1314
ff_aea_demuxer
AVInputFormat ff_aea_demuxer
Definition: aea.c:101
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:3805
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1382
aea_read_header
static int aea_read_header(AVFormatContext *s)
Definition: aea.c:62
aea_read_packet
static int aea_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: aea.c:90
av_get_packet
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
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
AVERROR
#define AVERROR(e)
Definition: error.h:43
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:176
AVCodecContext::channel_layout
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2338
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:536
AVStream::codec
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:896
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:463
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:462
channel_layout.h
audio channel layout utility functions
aea_read_probe
static int aea_read_probe(AVProbeData *p)
Definition: aea.c:30
ff_pcm_read_seek
int ff_pcm_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: pcm.c:45
AT1_SU_SIZE
#define AT1_SU_SIZE
Definition: aea.c:28
AVStream
Stream structure.
Definition: avformat.h:877
AVCodecContext::codec_type
enum AVMediaType codec_type
Definition: avcodec.h:1540
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:1549
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:2287
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1356
AVFMT_GENERIC_INDEX
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:486
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:460
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:472
avformat.h
Main libavformat public API header.
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:2288
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:661
AVPacket::stream_index
int stream_index
Definition: avcodec.h:1469
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:85
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:87
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1444

Generated on Mon Feb 15 2016 15:20:45 for FFmpeg by   doxygen 1.8.6

AltStyle によって変換されたページ (->オリジナル) /