Mercurial > libavformat.hg
annotate tta.c @ 1960:c0289552590f libavformat
Change the vhook code to send real timestamps to the filters instead of the
current time of day, which is useless, and which the filters could just as
easily query for themselves.
patch by Bobby Bingham, uhmmmm gmail com
author | diego |
---|---|
date | Thu, 29 Mar 2007 05:24:35 +0000 |
parents | 0899bfe4105c |
children | 170e151f1d9e |
rev | line source |
---|---|
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
1 /* |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
2 * TTA demuxer |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
3 * Copyright (c) 2006 Alex Beregszaszi |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1281
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1281
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1281
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1281
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1281
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
16 * |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1281
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
1187 | 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
20 */ |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
21 #include "avformat.h" |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
22 #include "bitstream.h" |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
23 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
24 typedef struct { |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
25 int totalframes, currentframe; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
26 uint32_t *seektable; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
27 } TTAContext; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
28 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
29 static int tta_probe(AVProbeData *p) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
30 { |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
31 const uint8_t *d = p->buf; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
32 if (p->buf_size < 4) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
33 return 0; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
34 if (d[0] == 'T' && d[1] == 'T' && d[2] == 'A' && d[3] == '1') |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
35 return 80; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
36 return 0; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
37 } |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
38 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
39 static int tta_read_header(AVFormatContext *s, AVFormatParameters *ap) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
40 { |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
41 TTAContext *c = s->priv_data; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
42 AVStream *st; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
43 int i, channels, bps, samplerate, datalen, framelen, start; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
44 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
45 start = url_ftell(&s->pb); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
46 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
47 if (get_le32(&s->pb) != ff_get_fourcc("TTA1")) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
48 return -1; // not tta file |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
49 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
50 url_fskip(&s->pb, 2); // FIXME: flags |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
51 channels = get_le16(&s->pb); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
52 bps = get_le16(&s->pb); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
53 samplerate = get_le32(&s->pb); |
1079 | 54 if(samplerate <= 0 || samplerate > 1000000){ |
55 av_log(s, AV_LOG_ERROR, "nonsense samplerate\n"); | |
56 return -1; | |
57 } | |
58 | |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
59 datalen = get_le32(&s->pb); |
1079 | 60 if(datalen < 0){ |
61 av_log(s, AV_LOG_ERROR, "nonsense datalen\n"); | |
62 return -1; | |
63 } | |
64 | |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
65 url_fskip(&s->pb, 4); // header crc |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
66 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
67 framelen = 1.04489795918367346939 * samplerate; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
68 c->totalframes = datalen / framelen + ((datalen % framelen) ? 1 : 0); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
69 c->currentframe = 0; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
70 |
1079 | 71 if(c->totalframes >= UINT_MAX/sizeof(uint32_t)){ |
72 av_log(s, AV_LOG_ERROR, "totalframes too large\n"); | |
73 return -1; | |
74 } | |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
75 c->seektable = av_mallocz(sizeof(uint32_t)*c->totalframes); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
76 if (!c->seektable) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
77 return AVERROR_NOMEM; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
78 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
79 for (i = 0; i < c->totalframes; i++) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
80 c->seektable[i] = get_le32(&s->pb); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
81 url_fskip(&s->pb, 4); // seektable crc |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
82 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
83 st = av_new_stream(s, 0); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
84 // av_set_pts_info(st, 32, 1, 1000); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
85 if (!st) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
86 return AVERROR_NOMEM; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
87 st->codec->codec_type = CODEC_TYPE_AUDIO; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
88 st->codec->codec_id = CODEC_ID_TTA; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
89 st->codec->channels = channels; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
90 st->codec->sample_rate = samplerate; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
91 st->codec->bits_per_sample = bps; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
92 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
93 st->codec->extradata_size = url_ftell(&s->pb) - start; |
1079 | 94 if(st->codec->extradata_size+FF_INPUT_BUFFER_PADDING_SIZE <= (unsigned)st->codec->extradata_size){ |
95 //this check is redundant as get_buffer should fail | |
96 av_log(s, AV_LOG_ERROR, "extradata_size too large\n"); | |
97 return -1; | |
98 } | |
957
99a7f76a8954
10l, allocate bitbuffer with regard to the padding size
alex
parents:
948
diff
changeset
|
99 st->codec->extradata = av_mallocz(st->codec->extradata_size+FF_INPUT_BUFFER_PADDING_SIZE); |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
100 url_fseek(&s->pb, start, SEEK_SET); // or SEEK_CUR and -size ? :) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
101 get_buffer(&s->pb, st->codec->extradata, st->codec->extradata_size); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
102 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
103 return 0; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
104 } |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
105 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
106 static int tta_read_packet(AVFormatContext *s, AVPacket *pkt) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
107 { |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
108 TTAContext *c = s->priv_data; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
109 int ret, size; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
110 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
111 // FIXME! |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
112 if (c->currentframe > c->totalframes) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
113 size = 0; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
114 else |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
115 size = c->seektable[c->currentframe]; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
116 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
117 c->currentframe++; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
118 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
119 if (av_new_packet(pkt, size) < 0) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
120 return AVERROR_IO; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
121 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
122 pkt->pos = url_ftell(&s->pb); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
123 pkt->stream_index = 0; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
124 ret = get_buffer(&s->pb, pkt->data, size); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
125 if (ret <= 0) { |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
126 av_free_packet(pkt); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
127 return AVERROR_IO; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
128 } |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
129 pkt->size = ret; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
130 // av_log(s, AV_LOG_INFO, "TTA packet #%d desired size: %d read size: %d at pos %d\n", |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
131 // c->currentframe, size, ret, pkt->pos); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
132 return 0; //ret; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
133 } |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
134 |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
135 static int tta_read_close(AVFormatContext *s) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
136 { |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
137 TTAContext *c = s->priv_data; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
138 if (c->seektable) |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
139 av_free(c->seektable); |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
140 return 0; |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
141 } |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
142 |
1167 | 143 AVInputFormat tta_demuxer = { |
948
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
144 "tta", |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
145 "true-audio", |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
146 sizeof(TTAContext), |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
147 tta_probe, |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
148 tta_read_header, |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
149 tta_read_packet, |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
150 tta_read_close, |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
151 .extensions = "tta", |
1e766711e6c8
tta demuxer, also usable for moving tta audio data into an other container
alex
parents:
diff
changeset
|
152 }; |