annotate oggparseskeleton.c @ 5854:3dc78fb78b2a libavformat

Fix erroneous behaviour when format probe hits end of file If the format probe hits end of file, do not add the error code to the buffer position. This is obviously wrong, and with a small input file would cause a negative buffer overflow. Fixes issue 1818.
author mru
date Tue, 16 Mar 2010 21:45:30 +0000
parents c66b238d4d33
children 79084b40586c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5812
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
1 /*
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
2 * Copyright (C) 2010 David Conrad
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
3 *
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
4 * This file is part of FFmpeg.
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
5 *
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
10 *
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
14 * Lesser General Public License for more details.
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
15 *
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
19 */
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
20
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
21 #include "libavcodec/bytestream.h"
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
22 #include "avformat.h"
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
23 #include "oggdec.h"
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
24
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
25 static int skeleton_header(AVFormatContext *s, int idx)
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
26 {
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
27 struct ogg *ogg = s->priv_data;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
28 struct ogg_stream *os = ogg->streams + idx;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
29 AVStream *st = s->streams[idx];
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
30 uint8_t *buf = os->buf + os->pstart;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
31 int version_major, version_minor;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
32 int64_t start_num, start_den, start_granule;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
33 int target_idx, start_time;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
34
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
35 strcpy(st->codec->codec_name, "skeleton");
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
36 st->codec->codec_type = CODEC_TYPE_DATA;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
37
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
38 if (os->psize < 8)
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
39 return -1;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
40
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
41 if (!strncmp(buf, "fishead", 8)) {
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
42 if (os->psize < 64)
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
43 return -1;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
44
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
45 version_major = AV_RL16(buf+8);
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
46 version_minor = AV_RL16(buf+10);
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
47
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
48 if (version_major != 3) {
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
49 av_log(s, AV_LOG_WARNING, "Unknown skeleton version %d.%d\n",
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
50 version_major, version_minor);
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
51 return -1;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
52 }
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
53
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
54 // This is the overall start time. We use it for the start time of
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
55 // of the skeleton stream since if left unset lavf assumes 0,
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
56 // which we don't want since skeleton is timeless
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
57 // FIXME: the real meaning of this field is "start playback at
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
58 // this time which can be in the middle of a packet
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
59 start_num = AV_RL64(buf+12);
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
60 start_den = AV_RL64(buf+20);
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
61
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
62 if (start_den) {
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
63 av_reduce(&start_time, &st->time_base.den, start_num, start_den, INT_MAX);
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
64 st->time_base.num = 1;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
65 st->start_time = start_time;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
66 }
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
67 } else if (!strncmp(buf, "fisbone", 8)) {
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
68 if (os->psize < 52)
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
69 return -1;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
70
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
71 target_idx = ogg_find_stream(ogg, AV_RL32(buf+12));
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
72 start_granule = AV_RL64(buf+36);
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
73 if (target_idx >= 0 && start_granule != -1) {
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
74 s->streams[target_idx]->start_time = ogg_gptopts(s, target_idx, start_granule, NULL);
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
75 }
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
76 }
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
77
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
78 return 1;
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
79 }
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
80
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
81 const struct ogg_codec ff_skeleton_codec = {
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
82 .magic = "fishead",
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
83 .magicsize = 8,
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
84 .header = skeleton_header,
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents:
diff changeset
85 };