FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
apc.c
Go to the documentation of this file.
1
/*
2
* CRYO APC audio format demuxer
3
* Copyright (c) 2007 Anssi Hannula <anssi.hannula@gmail.com>
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
#include <string.h>
23
24
#include "
libavutil/channel_layout.h
"
25
#include "
avformat.h
"
26
27
static
int
apc_probe
(
AVProbeData
*p)
28
{
29
if
(!strncmp(p->
buf
,
"CRYO_APC"
, 8))
30
return
AVPROBE_SCORE_MAX
;
31
32
return
0;
33
}
34
35
static
int
apc_read_header
(
AVFormatContext
*
s
)
36
{
37
AVIOContext
*pb = s->
pb
;
38
AVStream
*st;
39
40
avio_rl32
(pb);
/* CRYO */
41
avio_rl32
(pb);
/* _APC */
42
avio_rl32
(pb);
/* 1.20 */
43
44
st =
avformat_new_stream
(s, NULL);
45
if
(!st)
46
return
AVERROR
(ENOMEM);
47
48
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
49
st->
codec
->
codec_id
=
AV_CODEC_ID_ADPCM_IMA_APC
;
50
51
avio_rl32
(pb);
/* number of samples */
52
st->
codec
->
sample_rate
=
avio_rl32
(pb);
53
54
st->
codec
->
extradata_size
= 2 * 4;
55
st->
codec
->
extradata
=
av_malloc
(st->
codec
->
extradata_size
+
56
FF_INPUT_BUFFER_PADDING_SIZE
);
57
if
(!st->
codec
->
extradata
)
58
return
AVERROR
(ENOMEM);
59
60
/* initial predictor values for adpcm decoder */
61
avio_read
(pb, st->
codec
->
extradata
, 2 * 4);
62
63
if
(
avio_rl32
(pb)) {
64
st->
codec
->
channels
= 2;
65
st->
codec
->
channel_layout
=
AV_CH_LAYOUT_STEREO
;
66
}
else
{
67
st->
codec
->
channels
= 1;
68
st->
codec
->
channel_layout
=
AV_CH_LAYOUT_MONO
;
69
}
70
71
st->
codec
->
bits_per_coded_sample
= 4;
72
st->
codec
->
bit_rate
= st->
codec
->
bits_per_coded_sample
* st->
codec
->
channels
73
* st->
codec
->
sample_rate
;
74
st->
codec
->
block_align
= 1;
75
76
return
0;
77
}
78
79
#define MAX_READ_SIZE 4096
80
81
static
int
apc_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
82
{
83
if
(
av_get_packet
(s->
pb
, pkt,
MAX_READ_SIZE
) <= 0)
84
return
AVERROR
(EIO);
85
pkt->
flags
&= ~
AV_PKT_FLAG_CORRUPT
;
86
pkt->
stream_index
= 0;
87
return
0;
88
}
89
90
AVInputFormat
ff_apc_demuxer
= {
91
.
name
=
"apc"
,
92
.long_name =
NULL_IF_CONFIG_SMALL
(
"CRYO APC"
),
93
.read_probe =
apc_probe
,
94
.read_header =
apc_read_header
,
95
.read_packet =
apc_read_packet
,
96
};
Generated on Wed Jul 10 2013 23:48:11 for FFmpeg by
1.8.2