annotate flacenc.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 92daebc423f4
children
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"
5857
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
25 #include "metadata.h"
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
26 #include "vorbiscomment.h"
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
27 #include "libavcodec/bytestream.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
29
5857
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
30 static int flac_write_block_padding(ByteIOContext *pb, unsigned int n_padding_bytes,
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
31 int last_block)
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
32 {
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
33 put_byte(pb, last_block ? 0x81 : 0x01);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
34 put_be24(pb, n_padding_bytes);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
35 while (n_padding_bytes > 0) {
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
36 put_byte(pb, 0);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
37 n_padding_bytes--;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
38 }
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
39 return 0;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
40 }
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
41
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
42 static int flac_write_block_comment(ByteIOContext *pb, AVMetadata *m,
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
43 int last_block, int bitexact)
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
44 {
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
45 const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
46 unsigned int len, count;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
47 uint8_t *p, *p0;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
48
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
49 len = ff_vorbiscomment_length(m, vendor, &count);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
50 p0 = av_malloc(len+4);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
51 if (!p0)
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
52 return AVERROR(ENOMEM);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
53 p = p0;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
54
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
55 bytestream_put_byte(&p, last_block ? 0x84 : 0x04);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
56 bytestream_put_be24(&p, len);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
57 ff_vorbiscomment_write(&p, m, vendor, count);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
58
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
59 put_buffer(pb, p0, len+4);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
60 av_freep(&p0);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
61 p = NULL;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
62
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
63 return 0;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
64 }
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
65
4581
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
66 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
67 {
5857
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
68 int ret;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
69 AVCodecContext *codec = s->streams[0]->codec;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
70
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
71 ret = ff_flac_write_header(s->pb, codec, 0);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
72 if (ret)
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
73 return ret;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
74
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
75 ret = flac_write_block_comment(s->pb, s->metadata, 0,
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
76 codec->flags & CODEC_FLAG_BITEXACT);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
77 if (ret)
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
78 return ret;
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
79
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
80 /* The command line flac encoder defaults to placing a seekpoint
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
81 * every 10s. So one might add padding to allow that later
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
82 * but there seems to be no simple way to get the duration here.
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
83 * So let's try the flac default of 8192 bytes */
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
84 flac_write_block_padding(s->pb, 8192, 1);
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
85
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
86 return ret;
4581
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
87 }
c52d40f0a955 Share the function to write a raw FLAC header and use it in the Matroska
jbr
parents: 4580
diff changeset
88
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
89 static int flac_write_trailer(struct AVFormatContext *s)
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
90 {
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
91 ByteIOContext *pb = s->pb;
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
92 uint8_t *streaminfo;
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
93 enum FLACExtradataFormat format;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3926
diff changeset
94 int64_t file_size;
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
95
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
96 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
97 return -1;
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
98
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
99 if (!url_is_streamed(pb)) {
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
100 /* rewrite the STREAMINFO header block data */
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
101 file_size = url_ftell(pb);
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
102 url_fseek(pb, 8, SEEK_SET);
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
103 put_buffer(pb, streaminfo, FLAC_STREAMINFO_SIZE);
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
104 url_fseek(pb, file_size, SEEK_SET);
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
105 put_flush_packet(pb);
4578
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
106 } else {
c05d167a4fe2 Use a shared function to validate FLAC extradata.
jbr
parents: 4577
diff changeset
107 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
108 }
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
109 return 0;
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
110 }
1078
0bc9422cc0ad Raw flac muxer, patch by Justin Ruggles (jruggle earthlink net). Can be
banan
parents: 1070
diff changeset
111
4577
1cc2041c2e03 Separate the raw FLAC muxer from raw.c to its own file, flacenc.c.
jbr
parents: 4563
diff changeset
112 static int flac_write_packet(struct AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
114 put_buffer(s->pb, pkt->data, pkt->size);
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2545
diff changeset
115 put_flush_packet(s->pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118
3546
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
119 AVOutputFormat flac_muxer = {
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
120 "flac",
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
121 NULL_IF_CONFIG_SMALL("raw FLAC"),
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
122 "audio/x-flac",
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
123 "flac",
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
124 0,
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
125 CODEC_ID_FLAC,
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
126 CODEC_ID_NONE,
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
127 flac_write_header,
4577
1cc2041c2e03 Separate the raw FLAC muxer from raw.c to its own file, flacenc.c.
jbr
parents: 4563
diff changeset
128 flac_write_packet,
3926
14020f10caf7 write number of samples in FLAC extradata.
jbr
parents: 3866
diff changeset
129 flac_write_trailer,
3546
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
130 .flags= AVFMT_NOTIMESTAMPS,
5857
121d6994c20e Add VorbisComment writing to FLAC files.
jbr
parents: 4581
diff changeset
131 .metadata_conv = ff_vorbiscomment_metadata_conv,
3546
45c3d2b2b2fb Alphabetically order AVInputFormat/AVOutputFormat declarations.
diego
parents: 3545
diff changeset
132 };