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
bit.c
Go to the documentation of this file.
1
/*
2
* G.729 bit format muxer and demuxer
3
* Copyright (c) 2007-2008 Vladimir Voroshilov
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
#include "
avformat.h
"
22
#include "
internal.h
"
23
#include "
libavcodec/get_bits.h
"
24
#include "
libavcodec/put_bits.h
"
25
26
#define MAX_FRAME_SIZE 10
27
28
#define SYNC_WORD 0x6b21
29
#define BIT_0 0x7f
30
#define BIT_1 0x81
31
32
static
int
probe
(
AVProbeData
*p)
33
{
34
int
i, j;
35
36
if
(p->
buf_size
< 0x40)
37
return
0;
38
39
for
(i=0; i+3<p->
buf_size
&& i< 10*0x50; ){
40
if
(
AV_RL16
(&p->
buf
[0]) !=
SYNC_WORD
)
41
return
0;
42
j=
AV_RL16
(&p->
buf
[2]);
43
if
(j!=0x40 && j!=0x50)
44
return
0;
45
i+=j;
46
}
47
return
AVPROBE_SCORE_EXTENSION
;
48
}
49
50
static
int
read_header
(
AVFormatContext
*
s
)
51
{
52
AVStream
* st;
53
54
st=
avformat_new_stream
(s,
NULL
);
55
if
(!st)
56
return
AVERROR
(ENOMEM);
57
58
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
59
st->
codec
->
codec_id
=
AV_CODEC_ID_G729
;
60
st->
codec
->
sample_rate
=8000;
61
st->
codec
->
block_align
= 16;
62
st->
codec
->
channels
=1;
63
64
avpriv_set_pts_info
(st, 64, 1, 100);
65
return
0;
66
}
67
68
static
int
read_packet
(
AVFormatContext
*
s
,
69
AVPacket
*
pkt
)
70
{
71
AVIOContext
*pb = s->
pb
;
72
PutBitContext
pbo;
73
uint16_t
buf
[8 *
MAX_FRAME_SIZE
+ 2];
74
int
packet_size;
75
uint16_t*
src
=
buf
;
76
int
i, j,
ret
;
77
int64_t pos=
avio_tell
(pb);
78
79
if
(
avio_feof
(pb))
80
return
AVERROR_EOF
;
81
82
avio_rl16
(pb);
// sync word
83
packet_size =
avio_rl16
(pb) / 8;
84
if
(packet_size >
MAX_FRAME_SIZE
)
85
return
AVERROR_INVALIDDATA
;
86
87
ret =
avio_read
(pb, (
uint8_t
*)buf, (8 * packet_size) *
sizeof
(uint16_t));
88
if
(ret<0)
89
return
ret
;
90
if
(ret != 8 * packet_size *
sizeof
(uint16_t))
91
return
AVERROR
(EIO);
92
93
if
(
av_new_packet
(pkt, packet_size) < 0)
94
return
AVERROR
(ENOMEM);
95
96
init_put_bits
(&pbo, pkt->
data
, packet_size);
97
for
(j=0; j < packet_size; j++)
98
for
(i=0; i<8;i++)
99
put_bits
(&pbo,1,
AV_RL16
(src++) ==
BIT_1
? 1 : 0);
100
101
flush_put_bits
(&pbo);
102
103
pkt->
duration
=1;
104
pkt->
pos
= pos;
105
return
0;
106
}
107
108
AVInputFormat
ff_bit_demuxer
= {
109
.
name
=
"bit"
,
110
.long_name =
NULL_IF_CONFIG_SMALL
(
"G.729 BIT file format"
),
111
.read_probe =
probe
,
112
.read_header =
read_header
,
113
.read_packet =
read_packet
,
114
.extensions =
"bit"
,
115
};
116
117
#if CONFIG_MUXERS
118
static
int
write_header
(
AVFormatContext
*
s
)
119
{
120
AVCodecContext
*enc = s->
streams
[0]->
codec
;
121
122
if
((enc->
codec_id
!=
AV_CODEC_ID_G729
) || enc->
channels
!= 1) {
123
av_log
(s,
AV_LOG_ERROR
,
124
"only codec g729 with 1 channel is supported by this format\n"
);
125
return
AVERROR
(EINVAL);
126
}
127
128
enc->
bits_per_coded_sample
= 16;
129
enc->
block_align
= (enc->
bits_per_coded_sample
* enc->
channels
) >> 3;
130
131
return
0;
132
}
133
134
static
int
write_packet
(
AVFormatContext
*s,
AVPacket
*
pkt
)
135
{
136
AVIOContext
*pb = s->
pb
;
137
GetBitContext
gb;
138
int
i;
139
140
if
(pkt->
size
!= 10)
141
return
AVERROR
(EINVAL);
142
143
avio_wl16
(pb,
SYNC_WORD
);
144
avio_wl16
(pb, 8 * 10);
145
146
init_get_bits
(&gb, pkt->
data
, 8*10);
147
for
(i=0; i< 8 * 10; i++)
148
avio_wl16
(pb,
get_bits1
(&gb) ?
BIT_1
:
BIT_0
);
149
150
return
0;
151
}
152
153
AVOutputFormat
ff_bit_muxer = {
154
.
name
=
"bit"
,
155
.long_name =
NULL_IF_CONFIG_SMALL
(
"G.729 BIT file format"
),
156
.mime_type =
"audio/bit"
,
157
.extensions =
"bit"
,
158
.audio_codec =
AV_CODEC_ID_G729
,
159
.video_codec =
AV_CODEC_ID_NONE
,
160
.write_header =
write_header
,
161
.write_packet =
write_packet
,
162
};
163
#endif
Generated on Sun Mar 8 2015 02:35:09 for FFmpeg by
1.8.2