Mercurial > libavformat.hg
annotate flvenc.c @ 4387:5c42816e12c6 libavformat
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This
allows these functions to peek back and retrieve values from the demuxer's
context (or RTSPState). The ASF/RTP payload parser will use this to be able
to parse SDP values (which occur even before the payload ID is given), store
them in the RTSPState and then retrieve them while parsing payload data. See
"[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet()
function pointer (was: transport context)" mailinglist thread.
author | rbultje |
---|---|
date | Fri, 06 Feb 2009 01:37:19 +0000 |
parents | 1ce2aaf9c918 |
children | 3769dc8df347 |
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" |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
23 #include "riff.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}, |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
32 {CODEC_ID_VP6F, FLV_CODECID_VP6 }, |
1615 | 33 {CODEC_ID_VP6, FLV_CODECID_VP6 }, |
3363 | 34 {CODEC_ID_H264, FLV_CODECID_H264 }, |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
35 {CODEC_ID_NONE, 0} |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
36 }; |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
37 |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1622
diff
changeset
|
38 static const AVCodecTag flv_audio_codec_ids[] = { |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
39 {CODEC_ID_MP3, FLV_CODECID_MP3 >> FLV_AUDIO_CODECID_OFFSET}, |
3061
8ae0431d7f43
flv/swf do not have a big endian codec id, they only support
michael
parents:
2771
diff
changeset
|
40 {CODEC_ID_PCM_S8, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET}, |
8ae0431d7f43
flv/swf do not have a big endian codec id, they only support
michael
parents:
2771
diff
changeset
|
41 {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
|
42 {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
|
43 {CODEC_ID_ADPCM_SWF, FLV_CODECID_ADPCM >> FLV_AUDIO_CODECID_OFFSET}, |
3363 | 44 {CODEC_ID_AAC, FLV_CODECID_AAC >> FLV_AUDIO_CODECID_OFFSET}, |
3273 | 45 {CODEC_ID_NELLYMOSER, FLV_CODECID_NELLYMOSER >> FLV_AUDIO_CODECID_OFFSET}, |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
46 {CODEC_ID_NONE, 0} |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
47 }; |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
48 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
49 typedef struct FLVContext { |
446 | 50 int reserved; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
51 int64_t duration_offset; |
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3908
diff
changeset
|
52 int64_t filesize_offset; |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
53 int64_t duration; |
3363 | 54 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
|
55 } FLVContext; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
56 |
490 | 57 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
|
58 int flags = (enc->bits_per_coded_sample == 16) ? FLV_SAMPLESSIZE_16BIT : FLV_SAMPLESSIZE_8BIT; |
490 | 59 |
3363 | 60 if (enc->codec_id == CODEC_ID_AAC) // specs force these parameters |
61 return FLV_CODECID_AAC | FLV_SAMPLERATE_44100HZ | FLV_SAMPLESSIZE_16BIT | FLV_STEREO; | |
62 else { | |
490 | 63 switch (enc->sample_rate) { |
64 case 44100: | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
65 flags |= FLV_SAMPLERATE_44100HZ; |
490 | 66 break; |
67 case 22050: | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
68 flags |= FLV_SAMPLERATE_22050HZ; |
490 | 69 break; |
70 case 11025: | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
71 flags |= FLV_SAMPLERATE_11025HZ; |
490 | 72 break; |
73 case 8000: //nellymoser only | |
74 case 5512: //not mp3 | |
2590 | 75 if(enc->codec_id != CODEC_ID_MP3){ |
2591 | 76 flags |= FLV_SAMPLERATE_SPECIAL; |
77 break; | |
2590 | 78 } |
490 | 79 default: |
2164 | 80 av_log(enc, AV_LOG_ERROR, "flv does not support that sample rate, choose from (44100, 22050, 11025).\n"); |
490 | 81 return -1; |
82 } | |
3363 | 83 } |
490 | 84 |
85 if (enc->channels > 1) { | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
86 flags |= FLV_STEREO; |
490 | 87 } |
885 | 88 |
490 | 89 switch(enc->codec_id){ |
90 case CODEC_ID_MP3: | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
91 flags |= FLV_CODECID_MP3 | FLV_SAMPLESSIZE_16BIT; |
490 | 92 break; |
679 | 93 case CODEC_ID_PCM_S8: |
3061
8ae0431d7f43
flv/swf do not have a big endian codec id, they only support
michael
parents:
2771
diff
changeset
|
94 flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_8BIT; |
887 | 95 break; |
679 | 96 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
|
97 flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_16BIT; |
887 | 98 break; |
679 | 99 case CODEC_ID_PCM_S16LE: |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
100 flags |= FLV_CODECID_PCM_LE | FLV_SAMPLESSIZE_16BIT; |
887 | 101 break; |
872 | 102 case CODEC_ID_ADPCM_SWF: |
1839 | 103 flags |= FLV_CODECID_ADPCM | FLV_SAMPLESSIZE_16BIT; |
887 | 104 break; |
3273 | 105 case CODEC_ID_NELLYMOSER: |
3997
637c51f793f1
Nellymoser 8KHZ flv muxing fix, patch by Alexander Wichers development at wichersdot nu
banan
parents:
3973
diff
changeset
|
106 if (enc->sample_rate == 8000) { |
637c51f793f1
Nellymoser 8KHZ flv muxing fix, patch by Alexander Wichers development at wichersdot nu
banan
parents:
3973
diff
changeset
|
107 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
|
108 } else { |
637c51f793f1
Nellymoser 8KHZ flv muxing fix, patch by Alexander Wichers development at wichersdot nu
banan
parents:
3973
diff
changeset
|
109 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
|
110 } |
3273 | 111 break; |
490 | 112 case 0: |
113 flags |= enc->codec_tag<<4; | |
114 break; | |
115 default: | |
822 | 116 av_log(enc, AV_LOG_ERROR, "codec not compatible with flv\n"); |
490 | 117 return -1; |
118 } | |
885 | 119 |
490 | 120 return flags; |
121 } | |
122 | |
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
|
123 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
|
124 { |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
125 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
|
126 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
|
127 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
|
128 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
129 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
130 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
|
131 { |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
132 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
|
133 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
|
134 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
135 |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
136 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
|
137 put_byte(pb, AMF_DATA_TYPE_BOOL); |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
138 put_byte(pb, !!b); |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
139 } |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
140 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
141 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
|
142 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2756
diff
changeset
|
143 ByteIOContext *pb = s->pb; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
144 FLVContext *flv = s->priv_data; |
3338 | 145 AVCodecContext *audio_enc = NULL, *video_enc = NULL; |
146 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
|
147 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
|
148 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
|
149 |
446 | 150 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
|
151 AVCodecContext *enc = s->streams[i]->codec; |
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
|
152 if (enc->codec_type == CODEC_TYPE_VIDEO) { |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
153 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
|
154 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
|
155 } 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
|
156 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
|
157 } |
3338 | 158 video_enc = enc; |
159 if(enc->codec_tag == 0) { | |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
160 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
|
161 return -1; |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
162 } |
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
|
163 } else { |
3338 | 164 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
|
165 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
|
166 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
|
167 } |
3250 | 168 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
|
169 } |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
170 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
|
171 put_byte(pb,1); |
3338 | 172 put_byte(pb, FLV_HEADER_FLAG_HASAUDIO * !!audio_enc |
173 + 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
|
174 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
|
175 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
|
176 |
24f6e902d77a
set flags correctly in write header instead of seeking back and fixing it in write_trailer()
michael
parents:
1553
diff
changeset
|
177 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
|
178 if(s->streams[i]->codec->codec_tag == 5){ |
446 | 179 put_byte(pb,8); // message type |
180 put_be24(pb,0); // include flags | |
181 put_be24(pb,0); // time stamp | |
182 put_be32(pb,0); // reserved | |
183 put_be32(pb,11); // size | |
184 flv->reserved=5; | |
185 } | |
186 } | |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
187 |
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
|
188 /* 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
|
189 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
|
190 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
|
191 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
|
192 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
|
193 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
|
194 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
195 /* 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
|
196 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
197 /* 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
|
198 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
|
199 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
|
200 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
201 /* 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
|
202 put_byte(pb, AMF_DATA_TYPE_MIXEDARRAY); |
3338 | 203 put_be32(pb, 5*!!video_enc + 4*!!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
|
204 |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
205 put_amf_string(pb, "duration"); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
206 flv->duration_offset= url_ftell(pb); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
207 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
|
208 |
3338 | 209 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
|
210 put_amf_string(pb, "width"); |
3338 | 211 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
|
212 |
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 put_amf_string(pb, "height"); |
3338 | 214 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
|
215 |
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, "videodatarate"); |
4348
1ce2aaf9c918
Splits the totalbitrate in a videodatarate and audiodatarate part.
benoit
parents:
4251
diff
changeset
|
217 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
|
218 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
219 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
|
220 put_amf_double(pb, framerate); |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
221 |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
222 put_amf_string(pb, "videocodecid"); |
3338 | 223 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
|
224 } |
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(audio_enc){ |
4348
1ce2aaf9c918
Splits the totalbitrate in a videodatarate and audiodatarate part.
benoit
parents:
4251
diff
changeset
|
227 put_amf_string(pb, "audiodatarate"); |
1ce2aaf9c918
Splits the totalbitrate in a videodatarate and audiodatarate part.
benoit
parents:
4251
diff
changeset
|
228 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
|
229 |
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
|
230 put_amf_string(pb, "audiosamplerate"); |
3338 | 231 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
|
232 |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
233 put_amf_string(pb, "audiosamplesize"); |
3338 | 234 put_amf_double(pb, audio_enc->codec_id == CODEC_ID_PCM_S8 ? 8 : 16); |
1606
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
235 |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
236 put_amf_string(pb, "stereo"); |
3338 | 237 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
|
238 |
8813741f7196
Patch for the FLV muxer to supply more complete metadata
banan
parents:
1558
diff
changeset
|
239 put_amf_string(pb, "audiocodecid"); |
3338 | 240 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
|
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 |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
243 put_amf_string(pb, "filesize"); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
244 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
|
245 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
|
246 |
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, ""); |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
248 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
|
249 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
250 /* 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
|
251 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
|
252 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
|
253 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
|
254 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
|
255 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
|
256 |
3363 | 257 for (i = 0; i < s->nb_streams; i++) { |
258 AVCodecContext *enc = s->streams[i]->codec; | |
259 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
|
260 int64_t pos; |
3363 | 261 put_byte(pb, enc->codec_type == CODEC_TYPE_VIDEO ? |
262 FLV_TAG_TYPE_VIDEO : FLV_TAG_TYPE_AUDIO); | |
263 put_be24(pb, 0); // size patched later | |
264 put_be24(pb, 0); // ts | |
265 put_byte(pb, 0); // ts ext | |
266 put_be24(pb, 0); // streamid | |
267 pos = url_ftell(pb); | |
268 if (enc->codec_id == CODEC_ID_AAC) { | |
269 put_byte(pb, get_audio_flags(enc)); | |
270 put_byte(pb, 0); // AAC sequence header | |
271 put_buffer(pb, enc->extradata, enc->extradata_size); | |
272 } else { | |
273 put_byte(pb, enc->codec_tag | FLV_FRAME_KEY); // flags | |
274 put_byte(pb, 0); // AVC sequence header | |
275 put_be24(pb, 0); // composition time | |
276 ff_isom_write_avcc(pb, enc->extradata, enc->extradata_size); | |
277 } | |
278 data_size = url_ftell(pb) - pos; | |
279 url_fseek(pb, -data_size - 10, SEEK_CUR); | |
280 put_be24(pb, data_size); | |
281 url_fseek(pb, data_size + 10 - 3, SEEK_CUR); | |
282 put_be32(pb, data_size + 11); // previous tag size | |
283 } | |
284 } | |
285 | |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
286 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
287 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
288 |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
289 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
|
290 { |
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
|
291 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
|
292 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2756
diff
changeset
|
293 ByteIOContext *pb = s->pb; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
294 FLVContext *flv = s->priv_data; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
295 |
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
|
296 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
|
297 |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
298 /* update informations */ |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
299 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
|
300 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
|
301 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
|
302 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
|
303 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
304 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
|
305 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
306 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
307 |
468 | 308 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
|
309 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2756
diff
changeset
|
310 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
|
311 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
|
312 FLVContext *flv = s->priv_data; |
3363 | 313 unsigned ts; |
468 | 314 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
|
315 uint8_t *data= NULL; |
2302 | 316 int flags, flags_size; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
317 |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
318 // av_log(s, AV_LOG_DEBUG, "type:%d pts: %"PRId64" size:%d\n", enc->codec_type, timestamp, size); |
885 | 319 |
3363 | 320 if(enc->codec_id == CODEC_ID_VP6 || enc->codec_id == CODEC_ID_VP6F || |
321 enc->codec_id == CODEC_ID_AAC) | |
2302 | 322 flags_size= 2; |
3363 | 323 else if(enc->codec_id == CODEC_ID_H264) |
324 flags_size= 5; | |
2302 | 325 else |
326 flags_size= 1; | |
327 | |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
328 if (enc->codec_type == CODEC_TYPE_VIDEO) { |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
329 put_byte(pb, FLV_TAG_TYPE_VIDEO); |
1615 | 330 |
1683
8b062c65fe0d
remove now useless codec_tag setting code in muxers
michael
parents:
1679
diff
changeset
|
331 flags = enc->codec_tag; |
1615 | 332 if(flags == 0) { |
333 av_log(enc, AV_LOG_ERROR, "video codec %X not compatible with flv\n",enc->codec_id); | |
334 return -1; | |
335 } | |
336 | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
337 flags |= pkt->flags & PKT_FLAG_KEY ? FLV_FRAME_KEY : FLV_FRAME_INTER; |
487 | 338 } else { |
339 assert(enc->codec_type == CODEC_TYPE_AUDIO); | |
490 | 340 flags = get_audio_flags(enc); |
885 | 341 |
445 | 342 assert(size); |
343 | |
1553
504ceaa50e31
Defines various common FLV format values between the FLV muxer and demuxer
aurel
parents:
1547
diff
changeset
|
344 put_byte(pb, FLV_TAG_TYPE_AUDIO); |
487 | 345 } |
346 | |
4189
b545084af4b9
check for negative dts value even if bitstream is already formated,
bcoudurier
parents:
3997
diff
changeset
|
347 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
|
348 /* 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
|
349 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
|
350 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
|
351 return -1; |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
352 } |
3801 | 353 if (!flv->delay && pkt->dts < 0) |
354 flv->delay = -pkt->dts; | |
3363 | 355 } |
356 | |
357 ts = pkt->dts + flv->delay; // add delay to force positive dts | |
2302 | 358 put_be24(pb,size + flags_size); |
3363 | 359 put_be24(pb,ts); |
3802
be10880770f1
timestamps in flv are 32bits _signed_ according to flash player, specs are wrong
bcoudurier
parents:
3801
diff
changeset
|
360 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
|
361 put_be24(pb,flv->reserved); |
487 | 362 put_byte(pb,flags); |
1615 | 363 if (enc->codec_id == CODEC_ID_VP6) |
364 put_byte(pb,0); | |
365 if (enc->codec_id == CODEC_ID_VP6F) | |
366 put_byte(pb, enc->extradata_size ? enc->extradata[0] : 0); | |
3363 | 367 else if (enc->codec_id == CODEC_ID_AAC) |
368 put_byte(pb,1); // AAC raw | |
369 else if (enc->codec_id == CODEC_ID_H264) { | |
370 put_byte(pb,1); // AVC NALU | |
3801 | 371 put_be24(pb,pkt->pts - pkt->dts); |
3363 | 372 } |
4228
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
373 |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
374 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
|
375 |
2302 | 376 put_be32(pb,size+flags_size+11); // previous tag size |
3363 | 377 flv->duration = FFMAX(flv->duration, pkt->pts + flv->delay + pkt->duration); |
885 | 378 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
379 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
|
380 |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
381 av_free(data); |
deddee77e4bc
use ff_avc_parse_nal_units_buf because output size might differ from input size
bcoudurier
parents:
4223
diff
changeset
|
382 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
383 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
384 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
385 |
1169 | 386 AVOutputFormat flv_muxer = { |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
387 "flv", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3394
diff
changeset
|
388 NULL_IF_CONFIG_SMALL("FLV format"), |
759 | 389 "video/x-flv", |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
390 "flv", |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
391 sizeof(FLVContext), |
4206 | 392 #if CONFIG_LIBMP3LAME |
232 | 393 CODEC_ID_MP3, |
1622 | 394 #else // CONFIG_LIBMP3LAME |
2755
bb9c77d499dd
Prefer ADPM_SWF instead NONE if no MP3 encoding is compiled in.
alex
parents:
2591
diff
changeset
|
395 CODEC_ID_ADPCM_SWF, |
1622 | 396 #endif // CONFIG_LIBMP3LAME |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
397 CODEC_ID_FLV1, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
398 flv_write_header, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
399 flv_write_packet, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
400 flv_write_trailer, |
3766
f062deeedb8d
Change codec_tag type from const struct AVCodecTag ** to const struct AVCodecTag * const *
reimar
parents:
3424
diff
changeset
|
401 .codec_tag= (const AVCodecTag* const []){flv_video_codec_ids, flv_audio_codec_ids, 0}, |
3363 | 402 .flags= AVFMT_GLOBALHEADER, |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
403 }; |