FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
flacenc.c
Go to the documentation of this file.
1
/*
2
* raw FLAC muxer
3
* Copyright (c) 2006-2009 Justin Ruggles
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
libavcodec/flac.h
"
23
#include "
avformat.h
"
24
#include "
avio_internal.h
"
25
#include "
flacenc.h
"
26
#include "
vorbiscomment.h
"
27
#include "
libavcodec/bytestream.h
"
28
29
30
static
int
flac_write_block_padding
(
AVIOContext
*pb,
unsigned
int
n_padding_bytes,
31
int
last_block)
32
{
33
avio_w8
(pb, last_block ? 0x81 : 0x01);
34
avio_wb24
(pb, n_padding_bytes);
35
ffio_fill
(pb, 0, n_padding_bytes);
36
return
0;
37
}
38
39
static
int
flac_write_block_comment
(
AVIOContext
*pb,
AVDictionary
**
m
,
40
int
last_block,
int
bitexact)
41
{
42
const
char
*vendor = bitexact ?
"ffmpeg"
:
LIBAVFORMAT_IDENT
;
43
unsigned
int
len
,
count
;
44
uint8_t
*p, *p0;
45
46
ff_metadata_conv
(m,
ff_vorbiscomment_metadata_conv
, NULL);
47
48
len =
ff_vorbiscomment_length
(*m, vendor, &count);
49
p0 =
av_malloc
(len+4);
50
if
(!p0)
51
return
AVERROR
(ENOMEM);
52
p = p0;
53
54
bytestream_put_byte(&p, last_block ? 0x84 : 0x04);
55
bytestream_put_be24(&p, len);
56
ff_vorbiscomment_write
(&p, m, vendor, count);
57
58
avio_write
(pb, p0, len+4);
59
av_freep
(&p0);
60
p = NULL;
61
62
return
0;
63
}
64
65
static
int
flac_write_header
(
struct
AVFormatContext
*
s
)
66
{
67
int
ret
;
68
AVCodecContext
*codec = s->
streams
[0]->
codec
;
69
70
if
(s->
nb_streams
> 1) {
71
av_log
(s,
AV_LOG_ERROR
,
"only one stream is supported\n"
);
72
return
AVERROR
(EINVAL);
73
}
74
if
(codec->
codec_id
!=
AV_CODEC_ID_FLAC
) {
75
av_log
(s,
AV_LOG_ERROR
,
"unsupported codec\n"
);
76
return
AVERROR
(EINVAL);
77
}
78
79
ret =
ff_flac_write_header
(s->
pb
, codec, 0);
80
if
(ret)
81
return
ret
;
82
83
ret =
flac_write_block_comment
(s->
pb
, &s->
metadata
, 0,
84
codec->
flags
&
CODEC_FLAG_BITEXACT
);
85
if
(ret)
86
return
ret
;
87
88
/* The command line flac encoder defaults to placing a seekpoint
89
* every 10s. So one might add padding to allow that later
90
* but there seems to be no simple way to get the duration here.
91
* So let's try the flac default of 8192 bytes */
92
flac_write_block_padding
(s->
pb
, 8192, 1);
93
94
return
ret
;
95
}
96
97
static
int
flac_write_trailer
(
struct
AVFormatContext
*
s
)
98
{
99
AVIOContext
*pb = s->
pb
;
100
uint8_t
*streaminfo;
101
enum
FLACExtradataFormat
format;
102
int64_t file_size;
103
104
if
(!
avpriv_flac_is_extradata_valid
(s->
streams
[0]->
codec
, &format, &streaminfo))
105
return
-1;
106
107
if
(pb->
seekable
) {
108
/* rewrite the STREAMINFO header block data */
109
file_size =
avio_tell
(pb);
110
avio_seek
(pb, 8, SEEK_SET);
111
avio_write
(pb, streaminfo,
FLAC_STREAMINFO_SIZE
);
112
avio_seek
(pb, file_size, SEEK_SET);
113
avio_flush
(pb);
114
}
else
{
115
av_log
(s,
AV_LOG_WARNING
,
"unable to rewrite FLAC header.\n"
);
116
}
117
return
0;
118
}
119
120
static
int
flac_write_packet
(
struct
AVFormatContext
*
s
,
AVPacket
*
pkt
)
121
{
122
avio_write
(s->
pb
, pkt->
data
, pkt->
size
);
123
return
0;
124
}
125
126
AVOutputFormat
ff_flac_muxer
= {
127
.
name
=
"flac"
,
128
.long_name =
NULL_IF_CONFIG_SMALL
(
"raw FLAC"
),
129
.mime_type =
"audio/x-flac"
,
130
.extensions =
"flac"
,
131
.audio_codec =
AV_CODEC_ID_FLAC
,
132
.video_codec =
AV_CODEC_ID_NONE
,
133
.write_header =
flac_write_header
,
134
.write_packet =
flac_write_packet
,
135
.write_trailer =
flac_write_trailer
,
136
.flags =
AVFMT_NOTIMESTAMPS
,
137
};
Generated on Wed Jul 10 2013 23:47:58 for FFmpeg by
1.8.2