2 * G.729 bit format muxer and demuxer
3 * Copyright (c) 2007-2008 Vladimir Voroshilov
5 * This file is part of FFmpeg.
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.
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.
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
23 #include "libavcodec/get_bits.h"
24 #include "libavcodec/put_bits.h"
26 #define MAX_FRAME_SIZE 10
28 #define SYNC_WORD 0x6b21
32 static int probe(AVProbeData
*p
)
36 if(p
->buf_size
< 0x40)
39 for(i
=0; i
+3<p
->buf_size
&& i
< 10*0x50; ){
40 if(AV_RL16(&p
->buf
[0]) != SYNC_WORD
)
42 j
=AV_RL16(&p
->buf
[2]);
43 if(j
!=0x40 && j
!=0x50)
47 return AVPROBE_SCORE_EXTENSION
;
50 static int read_header(AVFormatContext
*s
)
54 st
=avformat_new_stream(s
, NULL
);
56 return AVERROR(ENOMEM
);
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;
64 avpriv_set_pts_info(st
, 64, 1, 100);
68 static int read_packet(AVFormatContext
*s
,
71 AVIOContext
*pb
= s
->pb
;
73 uint16_t buf
[8 * MAX_FRAME_SIZE
+ 2];
77 int64_t pos
= avio_tell(pb
);
82 avio_rl16(pb
); // sync word
83 packet_size
= avio_rl16(pb
) / 8;
84 if(packet_size
> MAX_FRAME_SIZE
)
85 return AVERROR_INVALIDDATA
;
87 ret
= avio_read(pb
, (uint8_t*)buf
, (8 * packet_size
) * sizeof(uint16_t));
90 if(ret
!= 8 * packet_size
* sizeof(uint16_t))
93 if (av_new_packet(pkt
, packet_size
) < 0)
94 return AVERROR(ENOMEM
);
96 init_put_bits(&pbo
, pkt
->data
, packet_size
);
97 for(j
=0; j
< packet_size
; j
++)
99 put_bits(&pbo
,1, AV_RL16(src
++) == BIT_1
? 1 : 0);
101 flush_put_bits(&pbo
);
108 AVInputFormat ff_bit_demuxer
= {
110 .long_name
= NULL_IF_CONFIG_SMALL("G.729 BIT file format"),
112 .read_header
= read_header
,
113 .read_packet
= read_packet
,
118 static int write_header(AVFormatContext
*s
)
120 AVCodecContext
*enc
= s
->streams
[0]->codec
;
122 enc
->codec_id
= AV_CODEC_ID_G729
;
124 enc
->bits_per_coded_sample
= 16;
125 enc
->block_align
= (enc
->bits_per_coded_sample
* enc
->channels
) >> 3;
130 static int write_packet(AVFormatContext
*s
, AVPacket
*pkt
)
132 AVIOContext
*pb
= s
->pb
;
136 avio_wl16(pb
, SYNC_WORD
);
137 avio_wl16(pb
, 8 * 10);
139 init_get_bits(&gb
, pkt
->data
, 8*10);
140 for(i
=0; i
< 8 * 10; i
++)
141 avio_wl16(pb
, get_bits1(&gb
) ? BIT_1
: BIT_0
);
146 AVOutputFormat ff_bit_muxer
= {
148 .long_name
= NULL_IF_CONFIG_SMALL("G.729 BIT file format"),
149 .mime_type
= "audio/bit",
151 .audio_codec
= AV_CODEC_ID_G729
,
152 .video_codec
= AV_CODEC_ID_NONE
,
153 .write_header
= write_header
,
154 .write_packet
= write_packet
,