Mercurial > libavformat.hg
annotate flvenc.c @ 1426:3216308a69ee libavformat
Add base64 encoding and decoding routines
Patch Ryan Martell % rdm4 A martellventures P com %
Original thread:
Date: Oct 27, 2006 6:49 PM
Subject: [Ffmpeg-devel] [PATCH] Base64 code
author | gpoirier |
---|---|
date | Sat, 28 Oct 2006 00:12:31 +0000 |
parents | 3b00fb8ef8e4 |
children | 404048ea11bc |
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 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
3 * Copyright (c) 2003 The FFmpeg Project. |
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" |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
22 |
445 | 23 #undef NDEBUG |
24 #include <assert.h> | |
25 | |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
26 typedef struct FLVContext { |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
27 int hasAudio; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
28 int hasVideo; |
446 | 29 int reserved; |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
30 offset_t duration_offset; |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
31 offset_t filesize_offset; |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
32 int64_t duration; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
33 } FLVContext; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
34 |
490 | 35 static int get_audio_flags(AVCodecContext *enc){ |
684 | 36 int flags = (enc->bits_per_sample == 16) ? 0x2 : 0x0; |
490 | 37 |
38 switch (enc->sample_rate) { | |
39 case 44100: | |
40 flags |= 0x0C; | |
41 break; | |
42 case 22050: | |
43 flags |= 0x08; | |
44 break; | |
45 case 11025: | |
46 flags |= 0x04; | |
47 break; | |
48 case 8000: //nellymoser only | |
49 case 5512: //not mp3 | |
50 flags |= 0x00; | |
51 break; | |
52 default: | |
822 | 53 av_log(enc, AV_LOG_ERROR, "flv doesnt support that sample rate, choose from (44100, 22050, 11025)\n"); |
490 | 54 return -1; |
55 } | |
56 | |
57 if (enc->channels > 1) { | |
58 flags |= 0x01; | |
59 } | |
885 | 60 |
490 | 61 switch(enc->codec_id){ |
62 case CODEC_ID_MP3: | |
679 | 63 flags |= 0x20 | 0x2; |
490 | 64 break; |
679 | 65 case CODEC_ID_PCM_S8: |
887 | 66 break; |
679 | 67 case CODEC_ID_PCM_S16BE: |
887 | 68 flags |= 0x60 | 0x2; |
69 break; | |
679 | 70 case CODEC_ID_PCM_S16LE: |
887 | 71 flags |= 0x2; |
72 break; | |
872 | 73 case CODEC_ID_ADPCM_SWF: |
887 | 74 flags |= 0x10; |
75 break; | |
490 | 76 case 0: |
77 flags |= enc->codec_tag<<4; | |
78 break; | |
79 default: | |
822 | 80 av_log(enc, AV_LOG_ERROR, "codec not compatible with flv\n"); |
490 | 81 return -1; |
82 } | |
885 | 83 |
490 | 84 return flags; |
85 } | |
86 | |
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
|
87 #define AMF_DOUBLE 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
|
88 #define AMF_BOOLEAN 1 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
89 #define AMF_STRING 2 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
90 #define AMF_OBJECT 3 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
91 #define AMF_MIXED_ARRAY 8 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
92 #define AMF_ARRAY 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
|
93 #define AMF_DATE 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
|
94 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
95 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
|
96 { |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
97 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
|
98 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
|
99 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
|
100 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
101 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
102 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
|
103 { |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
104 put_byte(pb, AMF_DOUBLE); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
105 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
|
106 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
107 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
108 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
|
109 { |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
110 ByteIOContext *pb = &s->pb; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
111 FLVContext *flv = s->priv_data; |
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
|
112 int i, width, height, samplerate; |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
113 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
|
114 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
|
115 |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
116 flv->hasAudio = 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
117 flv->hasVideo = 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
118 |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
119 put_tag(pb,"FLV"); |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
120 put_byte(pb,1); |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
121 put_byte(pb,0); // delayed write |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
122 put_be32(pb,9); |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
123 put_be32(pb,0); |
885 | 124 |
446 | 125 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
|
126 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
|
127 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
|
128 width = enc->width; |
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 height = enc->height; |
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 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
|
131 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
|
132 } 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
|
133 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
|
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 flv->hasVideo=1; |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
136 } 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
|
137 flv->hasAudio=1; |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
138 samplerate = enc->sample_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
|
139 } |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
446
diff
changeset
|
140 av_set_pts_info(s->streams[i], 24, 1, 1000); /* 24 bit pts in ms */ |
446 | 141 if(enc->codec_tag == 5){ |
142 put_byte(pb,8); // message type | |
143 put_be24(pb,0); // include flags | |
144 put_be24(pb,0); // time stamp | |
145 put_be32(pb,0); // reserved | |
146 put_be32(pb,11); // size | |
147 flv->reserved=5; | |
148 } | |
490 | 149 if(enc->codec_type == CODEC_TYPE_AUDIO && get_audio_flags(enc)<0) |
150 return -1; | |
446 | 151 } |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
152 |
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
|
153 /* 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
|
154 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
|
155 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
|
156 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
|
157 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
|
158 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
|
159 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
160 /* 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
|
161 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
162 /* first event name as a string */ |
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 put_byte(pb, AMF_STRING); // 1 byte |
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 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
|
165 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
166 /* mixed array (hash) with size and string/type/data tuples */ |
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 put_byte(pb, AMF_MIXED_ARRAY); |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
168 put_be32(pb, 4*flv->hasVideo + flv->hasAudio + 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
|
169 |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
170 put_amf_string(pb, "duration"); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
171 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
|
172 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
|
173 |
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 if(flv->hasVideo){ |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
175 put_amf_string(pb, "width"); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
176 put_amf_double(pb, width); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
177 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
178 put_amf_string(pb, "height"); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
179 put_amf_double(pb, height); |
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 |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
181 put_amf_string(pb, "videodatarate"); |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
182 put_amf_double(pb, s->bit_rate / 1024.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
|
183 |
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 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
|
185 put_amf_double(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
|
186 } |
6b79be0860e3
add header info to flv format based on a patch by (Philipp Klaus >ffmpegdevel ad pylonsoft mot ch )
michael
parents:
1169
diff
changeset
|
187 |
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 if(flv->hasAudio){ |
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_amf_string(pb, "audiosamplerate"); |
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 put_amf_double(pb, samplerate); |
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 } |
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 |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
193 put_amf_string(pb, "filesize"); |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
194 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
|
195 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
|
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 put_amf_string(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
|
198 put_byte(pb, 9); // end marker 1 byte |
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 |
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 /* 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
|
201 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
|
202 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
|
203 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
|
204 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
|
205 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
|
206 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
207 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
208 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
209 |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
210 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
|
211 { |
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
|
212 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
|
213 int flags = 0; |
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
|
214 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
215 ByteIOContext *pb = &s->pb; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
216 FLVContext *flv = s->priv_data; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
217 |
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
|
218 file_size = url_ftell(pb); |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
219 flags |= flv->hasAudio ? 4 : 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
220 flags |= flv->hasVideo ? 1 : 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
221 url_fseek(pb, 4, SEEK_SET); |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
222 put_byte(pb,flags); |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
223 |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
224 /* update informations */ |
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
225 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
|
226 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
|
227 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
|
228 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
|
229 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
230 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
|
231 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
232 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
233 |
468 | 234 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
|
235 { |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
236 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
|
237 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
|
238 FLVContext *flv = s->priv_data; |
468 | 239 int size= pkt->size; |
487 | 240 int flags; |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
241 |
445 | 242 // av_log(s, AV_LOG_DEBUG, "type:%d pts: %lld size:%d\n", enc->codec_type, timestamp, size); |
885 | 243 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
244 if (enc->codec_type == CODEC_TYPE_VIDEO) { |
487 | 245 put_byte(pb, 9); |
246 flags = 2; // choose h263 | |
247 flags |= pkt->flags & PKT_FLAG_KEY ? 0x10 : 0x20; // add keyframe indicator | |
248 } else { | |
249 assert(enc->codec_type == CODEC_TYPE_AUDIO); | |
490 | 250 flags = get_audio_flags(enc); |
885 | 251 |
445 | 252 assert(size); |
253 | |
487 | 254 put_byte(pb, 8); |
255 } | |
256 | |
257 put_be24(pb,size+1); // include flags | |
258 put_be24(pb,pkt->pts); | |
259 put_be32(pb,flv->reserved); | |
260 put_byte(pb,flags); | |
261 put_buffer(pb, pkt->data, size); | |
679 | 262 put_be32(pb,size+1+11); // previous tag size |
1233
99a34915d15a
always write duration and file size, fix seeking, progress bar is now active
bcoudurier
parents:
1179
diff
changeset
|
263 flv->duration = pkt->pts + pkt->duration; |
885 | 264 |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
265 put_flush_packet(pb); |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
266 return 0; |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
267 } |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
268 |
1169 | 269 AVOutputFormat flv_muxer = { |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
270 "flv", |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
271 "flv format", |
759 | 272 "video/x-flv", |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
273 "flv", |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
274 sizeof(FLVContext), |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
275 #ifdef CONFIG_MP3LAME |
232 | 276 CODEC_ID_MP3, |
164
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
277 #else // CONFIG_MP3LAME |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
278 CODEC_ID_NONE, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
279 #endif // CONFIG_MP3LAME |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
280 CODEC_ID_FLV1, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
281 flv_write_header, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
282 flv_write_packet, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
283 flv_write_trailer, |
99fbacf0f764
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
diff
changeset
|
284 }; |