Mercurial > libavformat.hg
annotate flvenc.c @ 6275:287072e5227b libavformat
Add MD5 protocol
This is a write-only protocol which computes the md5sum of data written,
and on close writes this to the designated output or stdout if none
is specified. It can be used to test muxers without writing an actual
file.
author | mru |
---|---|
date | Sun, 18 Jul 2010 20:19:08 +0000 |
parents | c7b98381ec2d |
children | ea409874020e |
rev | line source |
---|---|
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
1 /* |
1415
3b00fb8ef8e4
replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents:
1358
diff
changeset
|
2 * FLV muxer |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4228
diff
changeset
|
3 * Copyright (c) 2003 The FFmpeg Project |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1233
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1233
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1233
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
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:
1233
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1233
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
16 * |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
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:
1233
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 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
20 */ |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
21 #include "avformat.h" |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
22 #include "flv.h" |
6033 | 23 #include "internal.h" |
3363 | 24 #include "avc.h" |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
25 |
445 | 26 #undef NDEBUG |
27 #include <assert.h> | |
28 | |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1622
diff
changeset
|
29 static const AVCodecTag flv_video_codec_ids[] = { |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
30 {CODEC_ID_FLV1, FLV_CODECID_H263 }, |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
31 {CODEC_ID_FLASHSV, FLV_CODECID_SCREEN}, |
5373 | 32 {CODEC_ID_FLASHSV2, FLV_CODECID_SCREEN2}, |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
33 {CODEC_ID_VP6F, FLV_CODECID_VP6 }, |
1615 | 34 {CODEC_ID_VP6, FLV_CODECID_VP6 }, |
3363 | 35 {CODEC_ID_H264, FLV_CODECID_H264 }, |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
36 {CODEC_ID_NONE, 0} |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
37 }; |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
38 |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1622
diff
changeset
|
39 static const AVCodecTag flv_audio_codec_ids[] = { |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
40 {CODEC_ID_MP3, FLV_CODECID_MP3 >> FLV_AUDIO_CODECID_OFFSET}, |
5461 | 41 {CODEC_ID_PCM_U8, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET}, |
3061
8ae0431d7f43
flv/swf do not have a big endian codec id, they only support
michael
parents:
2771
diff
changeset
|
42 {CODEC_ID_PCM_S16BE, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET}, |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
43 {CODEC_ID_PCM_S16LE, FLV_CODECID_PCM_LE >> FLV_AUDIO_CODECID_OFFSET}, |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
44 {CODEC_ID_ADPCM_SWF, FLV_CODECID_ADPCM >> FLV_AUDIO_CODECID_OFFSET}, |
3363 | 45 {CODEC_ID_AAC, FLV_CODECID_AAC >> FLV_AUDIO_CODECID_OFFSET}, |
3273 | 46 {CODEC_ID_NELLYMOSER, FLV_CODECID_NELLYMOSER >> FLV_AUDIO_CODECID_OFFSET}, |
5287 | 47 {CODEC_ID_SPEEX, FLV_CODECID_SPEEX >> FLV_AUDIO_CODECID_OFFSET}, |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
48 {CODEC_ID_NONE, 0} |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
49 }; |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
50 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
51 typedef struct FLVContext { |
446 | 52 int reserved; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
53 int64_t duration_offset; |
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
54 int64_t filesize_offset; |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
55 int64_t duration; |
3363 | 56 int delay; ///< first dts delay for AVC |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
57 } FLVContext; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
58 |
490 | 59 static int get_audio_flags(AVCodecContext *enc){ |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3802
diff
changeset
|
60 int flags = (enc->bits_per_coded_sample == 16) ? FLV_SAMPLESSIZE_16BIT : FLV_SAMPLESSIZE_8BIT; |
490 | 61 |
3363 | 62 if (enc->codec_id == CODEC_ID_AAC) // specs force these parameters |
63 return FLV_CODECID_AAC | FLV_SAMPLERATE_44100HZ | FLV_SAMPLESSIZE_16BIT | FLV_STEREO; | |
5287 | 64 else if (enc->codec_id == CODEC_ID_SPEEX) { |
65 if (enc->sample_rate != 16000) { | |
66 av_log(enc, AV_LOG_ERROR, "flv only supports wideband (16kHz) Speex audio\n"); | |
67 return -1; | |
68 } | |
69 if (enc->channels != 1) { | |
70 av_log(enc, AV_LOG_ERROR, "flv only supports mono Speex audio\n"); | |
71 return -1; | |
72 } | |
73 if (enc->frame_size / 320 > 8) { | |
5289
269fd2e634ba
Log a clearer warning message when muxing FLV with Speex containing more than
jbr
parents:
5287
diff
changeset
|
74 av_log(enc, AV_LOG_WARNING, "Warning: Speex stream has more than " |
269fd2e634ba
Log a clearer warning message when muxing FLV with Speex containing more than
jbr
parents:
5287
diff
changeset
|
75 "8 frames per packet. Adobe Flash " |
269fd2e634ba
Log a clearer warning message when muxing FLV with Speex containing more than
jbr
parents:
5287
diff
changeset
|
76 "Player cannot handle this!\n"); |
5287 | 77 } |
78 return FLV_CODECID_SPEEX | FLV_SAMPLERATE_11025HZ | FLV_SAMPLESSIZE_16BIT; | |
79 } else { | |
490 | 80 switch (enc->sample_rate) { |
81 case 44100: | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
82 flags |= FLV_SAMPLERATE_44100HZ; |
490 | 83 break; |
84 case 22050: | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
85 flags |= FLV_SAMPLERATE_22050HZ; |
490 | 86 break; |
87 case 11025: | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
88 flags |= FLV_SAMPLERATE_11025HZ; |
490 | 89 break; |
90 case 8000: //nellymoser only | |
91 case 5512: //not mp3 | |
2590 | 92 if(enc->codec_id != CODEC_ID_MP3){ |
2591 | 93 flags |= FLV_SAMPLERATE_SPECIAL; |
94 break; | |
2590 | 95 } |
490 | 96 default: |
2164 | 97 av_log(enc, AV_LOG_ERROR, "flv does not support that sample rate, choose from (44100, 22050, 11025).\n"); |
490 | 98 return -1; |
99 } | |
3363 | 100 } |
490 | 101 |
102 if (enc->channels > 1) { | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
103 flags |= FLV_STEREO; |
490 | 104 } |
885 | 105 |
490 | 106 switch(enc->codec_id){ |
107 case CODEC_ID_MP3: | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
108 flags |= FLV_CODECID_MP3 | FLV_SAMPLESSIZE_16BIT; |
490 | 109 break; |
5461 | 110 case CODEC_ID_PCM_U8: |
3061
8ae0431d7f43
flv/swf do not have a big endian codec id, they only support
michael
parents:
2771
diff
changeset
|
111 flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_8BIT; |
887 | 112 break; |
679 | 113 case CODEC_ID_PCM_S16BE: |
3061
8ae0431d7f43
flv/swf do not have a big endian codec id, they only support
michael
parents:
2771
diff
changeset
|
114 flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_16BIT; |
887 | 115 break; |
679 | 116 case CODEC_ID_PCM_S16LE: |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
117 flags |= FLV_CODECID_PCM_LE | FLV_SAMPLESSIZE_16BIT; |
887 | 118 break; |
872 | 119 case CODEC_ID_ADPCM_SWF: |
1839 | 120 flags |= FLV_CODECID_ADPCM | FLV_SAMPLESSIZE_16BIT; |
887 | 121 break; |
3273 | 122 case CODEC_ID_NELLYMOSER: |
3997
637c51f793f1
Nellymoser 8KHZ flv muxing fix, patch by Alexander Wichers development at wichersdot nu
banan
parents:
3973
diff
changeset
|
123 if (enc->sample_rate == 8000) { |
637c51f793f1
Nellymoser 8KHZ flv muxing fix, patch by Alexander Wichers development at wichersdot nu
banan
parents:
3973
diff
changeset
|
124 flags |= FLV_CODECID_NELLYMOSER_8KHZ_MONO | FLV_SAMPLESSIZE_16BIT; |
637c51f793f1
Nellymoser 8KHZ flv muxing fix, patch by Alexander Wichers development at wichersdot nu
banan
parents:
3973
diff
changeset
|
125 } else { |
637c51f793f1
Nellymoser 8KHZ flv muxing fix, patch by Alexander Wichers development at wichersdot nu
banan
parents:
3973
diff
changeset
|
126 flags |= FLV_CODECID_NELLYMOSER | FLV_SAMPLESSIZE_16BIT; |
637c51f793f1
Nellymoser 8KHZ flv muxing fix, patch by Alexander Wichers development at wichersdot nu
banan
parents:
3973
diff
changeset
|
127 } |
3273 | 128 break; |
490 | 129 case 0: |
130 flags |= enc->codec_tag<<4; | |
131 break; | |
132 default: | |
822 | 133 av_log(enc, AV_LOG_ERROR, "codec not compatible with flv\n"); |
490 | 134 return -1; |
135 } | |
885 | 136 |
490 | 137 return flags; |
138 } | |
139 | |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
140 static void put_amf_string(ByteIOContext *pb, const char *str) |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
141 { |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
142 size_t len = strlen(str); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
143 put_be16(pb, len); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
144 put_buffer(pb, str, len); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
145 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
146 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
147 static void put_amf_double(ByteIOContext *pb, double d) |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
148 { |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
149 put_byte(pb, AMF_DATA_TYPE_NUMBER); |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
150 put_be64(pb, av_dbl2int(d)); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
151 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
152 |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
153 static void put_amf_bool(ByteIOContext *pb, int b) { |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
154 put_byte(pb, AMF_DATA_TYPE_BOOL); |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
155 put_byte(pb, !!b); |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
156 } |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
157 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
158 static int flv_write_header(AVFormatContext *s) |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
159 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2756
diff
changeset
|
160 ByteIOContext *pb = s->pb; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
161 FLVContext *flv = s->priv_data; |
3338 | 162 AVCodecContext *audio_enc = NULL, *video_enc = NULL; |
163 int i; | |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
164 double framerate = 0.0; |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
165 int metadata_size_pos, data_size; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
166 |
446 | 167 for(i=0; i<s->nb_streams; i++){ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
759
diff
changeset
|
168 AVCodecContext *enc = s->streams[i]->codec; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5622
diff
changeset
|
169 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) { |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
170 if (s->streams[i]->r_frame_rate.den && s->streams[i]->r_frame_rate.num) { |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
171 framerate = av_q2d(s->streams[i]->r_frame_rate); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
172 } else { |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
173 framerate = 1/av_q2d(s->streams[i]->codec->time_base); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
174 } |
3338 | 175 video_enc = enc; |
176 if(enc->codec_tag == 0) { | |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
177 av_log(enc, AV_LOG_ERROR, "video codec not compatible with flv\n"); |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
178 return -1; |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
179 } |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
180 } else { |
3338 | 181 audio_enc = enc; |
1558
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
182 if(get_audio_flags(enc)<0) |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
183 return -1; |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
184 } |
3250 | 185 av_set_pts_info(s->streams[i], 32, 1, 1000); /* 32 bit pts in ms */ |
1558
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
186 } |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
187 put_tag(pb,"FLV"); |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
188 put_byte(pb,1); |
3338 | 189 put_byte(pb, FLV_HEADER_FLAG_HASAUDIO * !!audio_enc |
190 + FLV_HEADER_FLAG_HASVIDEO * !!video_enc); | |
1558
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
191 put_be32(pb,9); |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
192 put_be32(pb,0); |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
193 |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
194 for(i=0; i<s->nb_streams; i++){ |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
195 if(s->streams[i]->codec->codec_tag == 5){ |
446 | 196 put_byte(pb,8); // message type |
197 put_be24(pb,0); // include flags | |
198 put_be24(pb,0); // time stamp | |
199 put_be32(pb,0); // reserved | |
200 put_be32(pb,11); // size | |
201 flv->reserved=5; | |
202 } | |
203 } | |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
204 |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
205 /* write meta_tag */ |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
206 put_byte(pb, 18); // tag type META |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
207 metadata_size_pos= url_ftell(pb); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
208 put_be24(pb, 0); // size of data part (sum of all parts below) |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
209 put_be24(pb, 0); // time stamp |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
210 put_be32(pb, 0); // reserved |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
211 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
212 /* now data of data_size size */ |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
213 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
214 /* first event name as a string */ |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
215 put_byte(pb, AMF_DATA_TYPE_STRING); |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
216 put_amf_string(pb, "onMetaData"); // 12 bytes |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
217 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
218 /* mixed array (hash) with size and string/type/data tuples */ |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
219 put_byte(pb, AMF_DATA_TYPE_MIXEDARRAY); |
5050
3769dc8df347
Fix onMetaData property count in flv files (issue 1206).
cehoyos
parents:
4348
diff
changeset
|
220 put_be32(pb, 5*!!video_enc + 5*!!audio_enc + 2); // +2 for duration and file size |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
221 |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
222 put_amf_string(pb, "duration"); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
223 flv->duration_offset= url_ftell(pb); |
5622
a427102c12cd
Guess the duration before converting video and write guessed duration
cehoyos
parents:
5461
diff
changeset
|
224 put_amf_double(pb, s->duration / AV_TIME_BASE); // fill in the guessed duration, it'll be corrected later if incorrect |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
225 |
3338 | 226 if(video_enc){ |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
227 put_amf_string(pb, "width"); |
3338 | 228 put_amf_double(pb, video_enc->width); |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
229 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
230 put_amf_string(pb, "height"); |
3338 | 231 put_amf_double(pb, video_enc->height); |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
232 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
233 put_amf_string(pb, "videodatarate"); |
4348
1ce2aaf9c918
Splits the totalbitrate in a videodatarate and audiodatarate part.
benoit
parents:
4251
diff
changeset
|
234 put_amf_double(pb, video_enc->bit_rate / 1024.0); |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
235 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
236 put_amf_string(pb, "framerate"); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
237 put_amf_double(pb, framerate); |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
238 |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
239 put_amf_string(pb, "videocodecid"); |
3338 | 240 put_amf_double(pb, video_enc->codec_tag); |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
241 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
242 |
3338 | 243 if(audio_enc){ |
4348
1ce2aaf9c918
Splits the totalbitrate in a videodatarate and audiodatarate part.
benoit
parents:
4251
diff
changeset
|
244 put_amf_string(pb, "audiodatarate"); |
1ce2aaf9c918
Splits the totalbitrate in a videodatarate and audiodatarate part.
benoit
parents:
4251
diff
changeset
|
245 put_amf_double(pb, audio_enc->bit_rate / 1024.0); |
1ce2aaf9c918
Splits the totalbitrate in a videodatarate and audiodatarate part.
benoit
parents:
4251
diff
changeset
|
246 |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
247 put_amf_string(pb, "audiosamplerate"); |
3338 | 248 put_amf_double(pb, audio_enc->sample_rate); |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
249 |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
250 put_amf_string(pb, "audiosamplesize"); |
5461 | 251 put_amf_double(pb, audio_enc->codec_id == CODEC_ID_PCM_U8 ? 8 : 16); |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
252 |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
253 put_amf_string(pb, "stereo"); |
3338 | 254 put_amf_bool(pb, audio_enc->channels == 2); |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
255 |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
256 put_amf_string(pb, "audiocodecid"); |
3338 | 257 put_amf_double(pb, audio_enc->codec_tag); |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
258 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
259 |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
260 put_amf_string(pb, "filesize"); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
261 flv->filesize_offset= url_ftell(pb); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
262 put_amf_double(pb, 0); // delayed write |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
263 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
264 put_amf_string(pb, ""); |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
265 put_byte(pb, AMF_END_OF_OBJECT); |
1179
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
266 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
267 /* write total size of tag */ |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
268 data_size= url_ftell(pb) - metadata_size_pos - 10; |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
269 url_fseek(pb, metadata_size_pos, SEEK_SET); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
270 put_be24(pb, data_size); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
271 url_fseek(pb, data_size + 10 - 3, SEEK_CUR); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
272 put_be32(pb, data_size + 11); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
273 |
3363 | 274 for (i = 0; i < s->nb_streams; i++) { |
275 AVCodecContext *enc = s->streams[i]->codec; | |
276 if (enc->codec_id == CODEC_ID_AAC || enc->codec_id == CODEC_ID_H264) { | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
277 int64_t pos; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5622
diff
changeset
|
278 put_byte(pb, enc->codec_type == AVMEDIA_TYPE_VIDEO ? |
3363 | 279 FLV_TAG_TYPE_VIDEO : FLV_TAG_TYPE_AUDIO); |
280 put_be24(pb, 0); // size patched later | |
281 put_be24(pb, 0); // ts | |
282 put_byte(pb, 0); // ts ext | |
283 put_be24(pb, 0); // streamid | |
284 pos = url_ftell(pb); | |
285 if (enc->codec_id == CODEC_ID_AAC) { | |
286 put_byte(pb, get_audio_flags(enc)); | |
287 put_byte(pb, 0); // AAC sequence header | |
288 put_buffer(pb, enc->extradata, enc->extradata_size); | |
289 } else { | |
290 put_byte(pb, enc->codec_tag | FLV_FRAME_KEY); // flags | |
291 put_byte(pb, 0); // AVC sequence header | |
292 put_be24(pb, 0); // composition time | |
293 ff_isom_write_avcc(pb, enc->extradata, enc->extradata_size); | |
294 } | |
295 data_size = url_ftell(pb) - pos; | |
296 url_fseek(pb, -data_size - 10, SEEK_CUR); | |
297 put_be24(pb, data_size); | |
298 url_fseek(pb, data_size + 10 - 3, SEEK_CUR); | |
299 put_be32(pb, data_size + 11); // previous tag size | |
300 } | |
301 } | |
302 | |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
303 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
304 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
305 |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
306 static int flv_write_trailer(AVFormatContext *s) |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
307 { |
166
2271829b6f7e
Building ffmpeg with gcc-2.95.3 encountered a problem due to C99 initialization fix by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michaelni
parents:
164
diff
changeset
|
308 int64_t file_size; |
2271829b6f7e
Building ffmpeg with gcc-2.95.3 encountered a problem due to C99 initialization fix by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michaelni
parents:
164
diff
changeset
|
309 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2756
diff
changeset
|
310 ByteIOContext *pb = s->pb; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
311 FLVContext *flv = s->priv_data; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
312 |
166
2271829b6f7e
Building ffmpeg with gcc-2.95.3 encountered a problem due to C99 initialization fix by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michaelni
parents:
164
diff
changeset
|
313 file_size = url_ftell(pb); |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
314 |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
315 /* update informations */ |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
316 url_fseek(pb, flv->duration_offset, SEEK_SET); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
317 put_amf_double(pb, flv->duration / (double)1000); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
318 url_fseek(pb, flv->filesize_offset, SEEK_SET); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
319 put_amf_double(pb, file_size); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
320 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
321 url_fseek(pb, file_size, SEEK_SET); |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
322 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
323 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
324 |
468 | 325 static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
326 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2756
diff
changeset
|
327 ByteIOContext *pb = s->pb; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
759
diff
changeset
|
328 AVCodecContext *enc = s->streams[pkt->stream_index]->codec; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
329 FLVContext *flv = s->priv_data; |
3363 | 330 unsigned ts; |
468 | 331 int size= pkt->size; |
4228
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
332 uint8_t *data= NULL; |
2302 | 333 int flags, flags_size; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
334 |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
335 // av_log(s, AV_LOG_DEBUG, "type:%d pts: %"PRId64" size:%d\n", enc->codec_type, timestamp, size); |
885 | 336 |
3363 | 337 if(enc->codec_id == CODEC_ID_VP6 || enc->codec_id == CODEC_ID_VP6F || |
338 enc->codec_id == CODEC_ID_AAC) | |
2302 | 339 flags_size= 2; |
3363 | 340 else if(enc->codec_id == CODEC_ID_H264) |
341 flags_size= 5; | |
2302 | 342 else |
343 flags_size= 1; | |
344 | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5622
diff
changeset
|
345 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) { |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
346 put_byte(pb, FLV_TAG_TYPE_VIDEO); |
1615 | 347 |
1683
8b062c65fe0d
remove now useless codec_tag setting code in muxers
michael
parents:
1679
diff
changeset
|
348 flags = enc->codec_tag; |
1615 | 349 if(flags == 0) { |
350 av_log(enc, AV_LOG_ERROR, "video codec %X not compatible with flv\n",enc->codec_id); | |
351 return -1; | |
352 } | |
353 | |
5913
11bb10c37225
Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents:
5910
diff
changeset
|
354 flags |= pkt->flags & AV_PKT_FLAG_KEY ? FLV_FRAME_KEY : FLV_FRAME_INTER; |
487 | 355 } else { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5622
diff
changeset
|
356 assert(enc->codec_type == AVMEDIA_TYPE_AUDIO); |
490 | 357 flags = get_audio_flags(enc); |
885 | 358 |
445 | 359 assert(size); |
360 | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
361 put_byte(pb, FLV_TAG_TYPE_AUDIO); |
487 | 362 } |
363 | |
4189
b545084af4b9
check for negative dts value even if bitstream is already formated,
bcoudurier
parents:
3997
diff
changeset
|
364 if (enc->codec_id == CODEC_ID_H264) { |
4228
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
365 /* check if extradata looks like mp4 formated */ |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
366 if (enc->extradata_size > 0 && *(uint8_t*)enc->extradata != 1) { |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
367 if (ff_avc_parse_nal_units_buf(pkt->data, &data, &size) < 0) |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
368 return -1; |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
369 } |
3801 | 370 if (!flv->delay && pkt->dts < 0) |
371 flv->delay = -pkt->dts; | |
3363 | 372 } |
373 | |
374 ts = pkt->dts + flv->delay; // add delay to force positive dts | |
2302 | 375 put_be24(pb,size + flags_size); |
3363 | 376 put_be24(pb,ts); |
3802
be10880770f1
timestamps in flv are 32bits _signed_ according to flash player, specs are wrong
bcoudurier
parents:
3801
diff
changeset
|
377 put_byte(pb,(ts >> 24) & 0x7F); // timestamps are 32bits _signed_ |
2756
8258fb5a6aa0
Honor the 8bit extension (now 32bit instaed 24bit) of the pts field introduced in FLV specification v9.
alex
parents:
2755
diff
changeset
|
378 put_be24(pb,flv->reserved); |
487 | 379 put_byte(pb,flags); |
1615 | 380 if (enc->codec_id == CODEC_ID_VP6) |
381 put_byte(pb,0); | |
382 if (enc->codec_id == CODEC_ID_VP6F) | |
383 put_byte(pb, enc->extradata_size ? enc->extradata[0] : 0); | |
3363 | 384 else if (enc->codec_id == CODEC_ID_AAC) |
385 put_byte(pb,1); // AAC raw | |
386 else if (enc->codec_id == CODEC_ID_H264) { | |
387 put_byte(pb,1); // AVC NALU | |
3801 | 388 put_be24(pb,pkt->pts - pkt->dts); |
3363 | 389 } |
4228
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
390 |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
391 put_buffer(pb, data ? data : pkt->data, size); |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
392 |
2302 | 393 put_be32(pb,size+flags_size+11); // previous tag size |
3363 | 394 flv->duration = FFMAX(flv->duration, pkt->pts + flv->delay + pkt->duration); |
885 | 395 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
396 put_flush_packet(pb); |
4228
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
397 |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
398 av_free(data); |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
399 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
400 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
401 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
402 |
1169 | 403 AVOutputFormat flv_muxer = { |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
404 "flv", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3394
diff
changeset
|
405 NULL_IF_CONFIG_SMALL("FLV format"), |
759 | 406 "video/x-flv", |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
407 "flv", |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
408 sizeof(FLVContext), |
4206 | 409 #if CONFIG_LIBMP3LAME |
232 | 410 CODEC_ID_MP3, |
1622 | 411 #else // CONFIG_LIBMP3LAME |
2755
bb9c77d499dd
Prefer ADPM_SWF instead NONE if no MP3 encoding is compiled in.
alex
parents:
2591
diff
changeset
|
412 CODEC_ID_ADPCM_SWF, |
1622 | 413 #endif // CONFIG_LIBMP3LAME |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
414 CODEC_ID_FLV1, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
415 flv_write_header, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
416 flv_write_packet, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
417 flv_write_trailer, |
3766
f062deeedb8d
Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents:
3424
diff
changeset
|
418 .codec_tag= (const AVCodecTag* const []){flv_video_codec_ids, flv_audio_codec_ids, 0}, |
5203 | 419 .flags= AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS, |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
420 }; |