annotate flacenc.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 c52d40f0a955
children 121d6994c20e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 868
diff changeset
1 /*
4577
1cc2041c2e03 Separate the raw FLAC muxer from raw.c to its own file, flacenc.c.
jbr
parents: 4563
diff changeset
2 * raw FLAC muxer
1cc2041c2e03 Separate the raw FLAC muxer from raw.c to its own file, flacenc.c.
jbr
parents: 4563
diff changeset
3 * Copyright (c) 2006-2009 Justin Ruggles
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1245
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1245
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1245
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
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: 1245
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1245
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
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: 1245
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3274
diff changeset
21
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
22 #include "libavcodec/flac.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #include "avformat.h"
4581
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
24 #include "flacenc.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25
4581
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
26 int ff_flac_write_header(ByteIOContext *pb, AVCodecContext *codec)
1078
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
27 {
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
28 static const uint8_t header[8] = {
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
29 0x66, 0x4C, 0x61, 0x43, 0x80, 0x00, 0x00, 0x22
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
30 };
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
31 uint8_t *streaminfo;
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
32 enum FLACExtradataFormat format;
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
33
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
34 if (!ff_flac_is_extradata_valid(codec, &format, &streaminfo))
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
35 return -1;
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
36
4580
f9775a0b7fdb cosmetics: add a comment in flac_write_header().
jbr
parents: 4579
diff changeset
37 /* write "fLaC" stream marker and first metadata block header if needed */
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
38 if (format == FLAC_EXTRADATA_FORMAT_STREAMINFO) {
4581
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
39 put_buffer(pb, header, 8);
1078
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
40 }
4579
e5fca5c56cb2 Add support for full header extradata to raw FLAC muxer.
jbr
parents: 4578
diff changeset
41
e5fca5c56cb2 Add support for full header extradata to raw FLAC muxer.
jbr
parents: 4578
diff changeset
42 /* write STREAMINFO or full header */
4581
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
43 put_buffer(pb, codec->extradata, codec->extradata_size);
4579
e5fca5c56cb2 Add support for full header extradata to raw FLAC muxer.
jbr
parents: 4578
diff changeset
44
1078
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
45 return 0;
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
46 }
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
47
4581
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
48 static int flac_write_header(struct AVFormatContext *s)
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
49 {
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
50 return ff_flac_write_header(s->pb, s->streams[0]->codec);
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
51 }
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
52
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
53 static int flac_write_trailer(struct AVFormatContext *s)
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
54 {
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
55 ByteIOContext *pb = s->pb;
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
56 uint8_t *streaminfo;
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
57 enum FLACExtradataFormat format;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3926
diff changeset
58 int64_t file_size;
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
59
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
60 if (!ff_flac_is_extradata_valid(s->streams[0]->codec, &format, &streaminfo))
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
61 return -1;
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
62
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
63 if (!url_is_streamed(pb)) {
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
64 /* rewrite the STREAMINFO header block data */
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
65 file_size = url_ftell(pb);
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
66 url_fseek(pb, 8, SEEK_SET);
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
67 put_buffer(pb, streaminfo, FLAC_STREAMINFO_SIZE);
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
68 url_fseek(pb, file_size, SEEK_SET);
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
69 put_flush_packet(pb);
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
70 } else {
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
71 av_log(s, AV_LOG_WARNING, "unable to rewrite FLAC header.\n");
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
72 }
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
73 return 0;
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
74 }
1078
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
75
4577
1cc2041c2e03 Separate the raw FLAC muxer from raw.c to its own file, flacenc.c.
jbr
parents: 4563
diff changeset
76 static int flac_write_packet(struct AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
78 put_buffer(s->pb, pkt->data, pkt->size);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
79 put_flush_packet(s->pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82
3546
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
83 AVOutputFormat flac_muxer = {
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
84 "flac",
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
85 NULL_IF_CONFIG_SMALL("raw FLAC"),
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
86 "audio/x-flac",
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
87 "flac",
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
88 0,
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
89 CODEC_ID_FLAC,
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
90 CODEC_ID_NONE,
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
91 flac_write_header,
4577
1cc2041c2e03 Separate the raw FLAC muxer from raw.c to its own file, flacenc.c.
jbr
parents: 4563
diff changeset
92 flac_write_packet,
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
93 flac_write_trailer,
3546
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
94 .flags= AVFMT_NOTIMESTAMPS,
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
95 };