annotate tta.c @ 1407:fb4bf3858f77 libavformat

Make read_packet fail is the v4l2 driver returns an unexpected frame size (driver's bug? If not, we will have to support this in some way)
author lucabe
date Sun, 22 Oct 2006 09:56:08 +0000
parents 0899bfe4105c
children 170e151f1d9e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
5c7b35fc0588 Fix FSF postal address.
diego
parents: 1169
diff changeset
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
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
54 if(samplerate <= 0 || samplerate > 1000000){
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
55 av_log(s, AV_LOG_ERROR, "nonsense samplerate\n");
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
56 return -1;
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
57 }
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
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
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
60 if(datalen < 0){
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
61 av_log(s, AV_LOG_ERROR, "nonsense datalen\n");
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
62 return -1;
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
63 }
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
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
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
71 if(c->totalframes >= UINT_MAX/sizeof(uint32_t)){
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
72 av_log(s, AV_LOG_ERROR, "totalframes too large\n");
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
73 return -1;
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
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
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
94 if(st->codec->extradata_size+FF_INPUT_BUFFER_PADDING_SIZE <= (unsigned)st->codec->extradata_size){
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
95 //this check is redundant as get_buffer should fail
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
96 av_log(s, AV_LOG_ERROR, "extradata_size too large\n");
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
97 return -1;
40e81416015d sanity checks some might have been exploitable
michael
parents: 957
diff changeset
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
d89d7ef290da give AVInput/OutputFormat structs consistent names
mru
parents: 1079
diff changeset
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 };