annotate amr.c @ 331:4530681af424 libavformat

suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
author bellard
date Tue, 09 Dec 2003 18:06:18 +0000
parents 59c2e84817a1
children 60f897e8dd2d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
1 /*
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
2 * amr file format
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
3 * Copyright (c) 2001 ffmpeg project
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
4 *
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
9 *
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
13 * Lesser General Public License for more details.
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
14 *
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
18 */
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
19
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
20 /*
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
21 Write and read amr data according to RFC3267, http://www.ietf.org/rfc/rfc3267.txt?number=3267
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
22
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
23 Only mono files are supported.
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
24
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
25 */
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
26 #include "avformat.h"
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
27
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
28 static const unsigned char AMR_header [] = "#!AMR\n";
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
29 static const unsigned char AMRWB_header [] = "#!AMR-WB\n";
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
30
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
31 static int amr_write_header(AVFormatContext *s)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
32 {
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
33 ByteIOContext *pb = &s->pb;
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
34 AVCodecContext *enc = &s->streams[0]->codec;
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
35
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
36 s->priv_data = NULL;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
37
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
38 if (enc->codec_id == CODEC_ID_AMR_NB)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
39 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
40 put_tag(pb, AMR_header); /* magic number */
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
41 }
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
42 else if(enc->codec_id == CODEC_ID_AMR_WB)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
43 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
44 put_tag(pb, AMRWB_header); /* magic number */
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
45 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
46 else
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
47 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
48 //This is an error!
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
49 }
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
50 put_flush_packet(pb);
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
51 return 0;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
52 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
53
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
54 static int amr_write_packet(AVFormatContext *s, int stream_index_ptr,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
55 uint8_t *buf, int size, int force_pts)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
56 {
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
57 put_buffer(&s->pb, buf, size);
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
58 put_flush_packet(&s->pb);
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
59 return 0;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
60 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
61
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
62 static int amr_write_trailer(AVFormatContext *s)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
63 {
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
64 return 0;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
65 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
66
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
67 static int amr_probe(AVProbeData *p)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
68 {
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
69 //Only check for "#!AMR" which could be amr-wb, amr-nb.
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
70 //This will also trigger multichannel files: "#!AMR_MC1.0\n" and
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
71 //"#!AMR-WB_MC1.0\n" (not supported)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
72
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
73 if (p->buf_size < 5)
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
74 return 0;
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
75 if(memcmp(p->buf,AMR_header,5)==0)
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
76 return AVPROBE_SCORE_MAX;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
77 else
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
78 return 0;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
79 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
80
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
81 /* amr input */
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
82 static int amr_read_header(AVFormatContext *s,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
83 AVFormatParameters *ap)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
84 {
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
85 ByteIOContext *pb = &s->pb;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
86 AVStream *st;
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
87 uint8_t header[9];
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
88
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
89 get_buffer(pb, header, 6);
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
90
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
91 if(memcmp(header,AMR_header,6)!=0)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
92 {
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
93 get_buffer(pb, header+6, 3);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
94 if(memcmp(header,AMRWB_header,9)!=0)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
95 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
96 return -1;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
97 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
98 st = av_new_stream(s, 0);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
99 if (!st)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
100 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
101 return AVERROR_NOMEM;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
102 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
103
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
104 st->codec.codec_type = CODEC_TYPE_AUDIO;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
105 st->codec.codec_tag = CODEC_ID_AMR_WB;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
106 st->codec.codec_id = CODEC_ID_AMR_WB;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
107 st->codec.channels = 1;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
108 st->codec.sample_rate = 16000;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
109 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
110 else
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
111 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
112 st = av_new_stream(s, 0);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
113 if (!st)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
114 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
115 return AVERROR_NOMEM;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
116 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
117
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
118 st->codec.codec_type = CODEC_TYPE_AUDIO;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
119 st->codec.codec_tag = CODEC_ID_AMR_NB;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
120 st->codec.codec_id = CODEC_ID_AMR_NB;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
121 st->codec.channels = 1;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
122 st->codec.sample_rate = 8000;
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
123 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
124
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
125 return 0;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
126 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
127
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
128 #define MAX_SIZE 32
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
129
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
130 static int amr_read_packet(AVFormatContext *s,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
131 AVPacket *pkt)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
132 {
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
133 AVCodecContext *enc = &s->streams[0]->codec;
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
134
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
135 if (enc->codec_id == CODEC_ID_AMR_NB)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
136 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
137 const static uint8_t packed_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
138 uint8_t toc, q, ft;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
139 int read;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
140 int size;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
141
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
142 if (url_feof(&s->pb))
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
143 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
144 return -EIO;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
145 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
146
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
147 toc=get_byte(&s->pb);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
148 q = (toc >> 2) & 0x01;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
149 ft = (toc >> 3) & 0x0F;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
150
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
151 size=packed_size[ft];
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
152
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
153 if (av_new_packet(pkt, size+1))
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
154 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
155 return -EIO;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
156 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
157 pkt->stream_index = 0;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
158
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
159 pkt->data[0]=toc;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
160
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
161 read = get_buffer(&s->pb, pkt->data+1, size);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
162
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
163 if (read != size)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
164 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
165 av_free_packet(pkt);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
166 return -EIO;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
167 }
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
168
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
169 return 0;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
170 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
171 else if(enc->codec_id == CODEC_ID_AMR_WB)
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
172 {
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
173 static uint8_t packed_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
174 uint8_t toc, mode;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
175 int read;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
176 int size;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
177
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
178 if (url_feof(&s->pb))
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
179 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
180 return -EIO;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
181 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
182
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
183 toc=get_byte(&s->pb);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
184 mode = (uint8_t)((toc >> 3) & 0x0F);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
185 size = packed_size[mode];
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
186
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
187 if ( (size==0) || av_new_packet(pkt, size))
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
188 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
189 return -EIO;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
190 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
191
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
192 pkt->stream_index = 0;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
193 pkt->data[0]=toc;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
194
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
195 read = get_buffer(&s->pb, pkt->data+1, size-1);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
196
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
197 if (read != (size-1))
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
198 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
199 av_free_packet(pkt);
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
200 return -EIO;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
201 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
202
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
203 return 0;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
204 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
205 else
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
206 {
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
207 return -EIO;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
208 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
209 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
210
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
211 static int amr_read_close(AVFormatContext *s)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
212 {
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
213 return 0;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
214 }
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
215
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
216 static AVInputFormat amr_iformat = {
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
217 "amr",
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
218 "3gpp amr file format",
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 154
diff changeset
219 0, /*priv_data_size*/
148
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
220 amr_probe,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
221 amr_read_header,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
222 amr_read_packet,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
223 amr_read_close,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
224 };
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
225
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
226 static AVOutputFormat amr_oformat = {
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
227 "amr",
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
228 "3gpp amr file format",
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
229 "audio/amr",
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
230 "amr",
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
231 0,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
232 CODEC_ID_AMR_NB,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
233 CODEC_ID_NONE,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
234 amr_write_header,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
235 amr_write_packet,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
236 amr_write_trailer,
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
237 };
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
238
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
239 int amr_init(void)
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
240 {
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
241 av_register_input_format(&amr_iformat);
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
242 av_register_output_format(&amr_oformat);
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
243 return 0;
31d7c9a8678c * amr format - by Johannes Carlsson
kabi
parents:
diff changeset
244 }