bit: replace assert() by proper check.
[ffmpeg.git] / libavformat / bit.c
1 #include "avformat.h"
2 #include "libavcodec/get_bits.h"
3 #include "libavcodec/put_bits.h"
4
5 #define MAX_FRAME_SIZE 10
6
7 #define SYNC_WORD  0x6b21
8 #define BIT_0      0x7f
9 #define BIT_1      0x81
10
11 static int probe(AVProbeData *p)
12 {
13     int i;
14     i=AV_RL16(&p->buf[0]);
15     if(i != SYNC_WORD)
16         return 0;
17
18     switch(AV_RL16(&p->buf[2]))
19     {
20     case 0x40:
21     case 0x50:
22         return AVPROBE_SCORE_MAX/2;
23     default:
24         return 0;
25     }
26 }
27
28 static int read_header(AVFormatContext *s, AVFormatParameters *ap)
29 {
30     AVStream* st;
31     ByteIOContext *pb = s->pb;
32
33     st=av_new_stream(s, 0);
34     if (!st)
35         return AVERROR(ENOMEM);
36
37     url_fskip(pb, 2);
38     switch(get_le16(pb))
39     {
40         case 0x40:
41             st->codec->bit_rate = 6400;
42             break;
43         case 0x50:
44             st->codec->bit_rate = 8000;
45             break;
46     }
47
48     st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
49     st->codec->codec_id=CODEC_ID_G729;
50     st->codec->sample_rate=8000;
51     st->codec->block_align = 16;
52     st->codec->channels=1;
53
54     av_set_pts_info(st, 64, 1, 100);
55     url_fseek(pb, 0, SEEK_SET);
56     return 0;
57 }
58
59 static int read_packet(AVFormatContext *s,
60                           AVPacket *pkt)
61 {
62     ByteIOContext *pb = s->pb;
63     PutBitContext pbo;
64     uint16_t buf[8 * MAX_FRAME_SIZE + 2];
65     int packet_size;
66     int sync;
67     uint16_t* src=buf;
68     int i, j, ret;
69
70     if(url_feof(pb))
71         return AVERROR_EOF;
72
73     sync = get_le16(pb); // sync word
74     packet_size = get_le16(pb) / 8;
75     if(packet_size > MAX_FRAME_SIZE)
76         return AVERROR(EIO);
77
78     ret = get_buffer(pb, (uint8_t*)buf, (8 * packet_size) * sizeof(uint16_t));
79     if(ret<0)
80         return ret;
81     if(ret != 8 * packet_size * sizeof(uint16_t))
82         return AVERROR(EIO);
83
84     av_new_packet(pkt, packet_size);
85
86     init_put_bits(&pbo, pkt->data, packet_size);
87     for(j=0; j < packet_size; j++)
88         for(i=0; i<8;i++)
89             put_bits(&pbo,1, AV_RL16(src++) == BIT_1 ? 1 : 0);
90
91     flush_put_bits(&pbo);
92
93     pkt->duration=1;
94     return 0;
95 }
96
97 AVInputFormat ff_bit_demuxer = {
98     "bit",
99     "G.729 BIT file format",
100     0,
101     probe,
102     read_header,
103     read_packet,
104     .extensions = "bit"
105 };
106
107 #ifdef CONFIG_MUXERS
108 static int write_header(AVFormatContext *s)
109 {
110     AVCodecContext *enc = s->streams[0]->codec;
111
112     enc->codec_id = CODEC_ID_G729;
113     enc->channels = 1;
114     enc->bits_per_coded_sample = 16;
115     enc->block_align = (enc->bits_per_coded_sample * enc->channels) >> 3;
116
117     return 0;
118 }
119
120 static int write_packet(AVFormatContext *s, AVPacket *pkt)
121 {
122     ByteIOContext *pb = s->pb;
123     GetBitContext gb;
124     int i;
125     uint16_t b;
126
127     put_le16(pb, SYNC_WORD);
128     put_le16(pb, 8 * 10);
129
130     init_get_bits(&gb, pkt->data, 8*10);
131     for(i=0; i< 8 * 10; i++)
132         put_le16(pb, get_bits1(&gb) ? BIT_1 : BIT_0);
133     put_flush_packet(pb);
134
135     return 0;
136 }
137
138 AVOutputFormat ff_bit_muxer = {
139     "bit",
140     "G.729 BIT file format",
141     "audio/bit",
142     "bit",
143     0,
144     CODEC_ID_G729,
145     CODEC_ID_NONE,
146     write_header,
147     write_packet,
148     .extensions = "bit"
149 };
150 #endif