aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorAllan Hsu <allan@counterpop.net>2006-12-28 12:35:22 +0000
committerBenjamin Larsson <banan@ludd.ltu.se>2006-12-28 12:35:22 +0000
commit148c9bdbb8042c66d0ea0b6170be568000d2bf1e (patch)
tree95563ba0864aadce634405fda32bc8ab78794fcd /libavformat
parente311363245db963389dd62e8028641fbcdac35b5 (diff)
downloadffmpeg-148c9bdbb8042c66d0ea0b6170be568000d2bf1e.tar.gz
Patch for the FLV muxer to supply more complete metadata
in the onMetaData header. Patch by Allan Hsu <allan at counterpop dot net>. Originally committed as revision 7382 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/flvenc.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
index fc332e1a45..c83325f4bb 100644
--- a/libavformat/flvenc.c
+++ b/libavformat/flvenc.c
@@ -20,10 +20,27 @@
*/
#include "avformat.h"
#include "flv.h"
+#include "riff.h"
#undef NDEBUG
#include <assert.h>
+static const CodecTag flv_video_codec_ids[] = {
+ {CODEC_ID_FLV1, FLV_CODECID_H263 },
+ {CODEC_ID_FLASHSV, FLV_CODECID_SCREEN},
+ {CODEC_ID_VP6F, FLV_CODECID_VP6 },
+ {CODEC_ID_NONE, 0}
+};
+
+static const CodecTag flv_audio_codec_ids[] = {
+ {CODEC_ID_MP3, FLV_CODECID_MP3 >> FLV_AUDIO_CODECID_OFFSET},
+ {CODEC_ID_PCM_S8, FLV_CODECID_PCM_BE >> FLV_AUDIO_CODECID_OFFSET},
+ {CODEC_ID_PCM_S16BE, FLV_CODECID_PCM_BE >> FLV_AUDIO_CODECID_OFFSET},
+ {CODEC_ID_PCM_S16LE, FLV_CODECID_PCM_LE >> FLV_AUDIO_CODECID_OFFSET},
+ {CODEC_ID_ADPCM_SWF, FLV_CODECID_ADPCM >> FLV_AUDIO_CODECID_OFFSET},
+ {CODEC_ID_NONE, 0}
+};
+
typedef struct FLVContext {
int hasAudio;
int hasVideo;
@@ -99,11 +116,16 @@ static void put_amf_double(ByteIOContext *pb, double d)
put_be64(pb, av_dbl2int(d));
}
+static void put_amf_bool(ByteIOContext *pb, int b) {
+ put_byte(pb, AMF_DATA_TYPE_BOOL);
+ put_byte(pb, !!b);
+}
+
static int flv_write_header(AVFormatContext *s)
{
ByteIOContext *pb = &s->pb;
FLVContext *flv = s->priv_data;
- int i, width, height, samplerate;
+ int i, width, height, samplerate, samplesize, channels, audiocodecid, videocodecid;
double framerate = 0.0;
int metadata_size_pos, data_size;
@@ -121,9 +143,20 @@ static int flv_write_header(AVFormatContext *s)
framerate = 1/av_q2d(s->streams[i]->codec->time_base);
}
flv->hasVideo=1;
+
+ videocodecid = codec_get_tag(flv_video_codec_ids, enc->codec_id);
+ if(videocodecid == 0) {
+ av_log(enc, AV_LOG_ERROR, "video codec not compatible with flv\n");
+ return -1;
+ }
} else {
flv->hasAudio=1;
samplerate = enc->sample_rate;
+ channels = enc->channels;
+
+ audiocodecid = codec_get_tag(flv_audio_codec_ids, enc->codec_id);
+ samplesize = (enc->codec_id == CODEC_ID_PCM_S8) ? 8 : 16;
+
if(get_audio_flags(enc)<0)
return -1;
}
@@ -162,7 +195,7 @@ static int flv_write_header(AVFormatContext *s)
/* mixed array (hash) with size and string/type/data tuples */
put_byte(pb, AMF_DATA_TYPE_MIXEDARRAY);
- put_be32(pb, 4*flv->hasVideo + flv->hasAudio + 2); // +2 for duration and file size
+ put_be32(pb, 5*flv->hasVideo + 4*flv->hasAudio + 2); // +2 for duration and file size
put_amf_string(pb, "duration");
flv->duration_offset= url_ftell(pb);
@@ -180,11 +213,23 @@ static int flv_write_header(AVFormatContext *s)
put_amf_string(pb, "framerate");
put_amf_double(pb, framerate);
+
+ put_amf_string(pb, "videocodecid");
+ put_amf_double(pb, videocodecid);
}
if(flv->hasAudio){
put_amf_string(pb, "audiosamplerate");
put_amf_double(pb, samplerate);
+
+ put_amf_string(pb, "audiosamplesize");
+ put_amf_double(pb, samplesize);
+
+ put_amf_string(pb, "stereo");
+ put_amf_bool(pb, (channels == 2));
+
+ put_amf_string(pb, "audiocodecid");
+ put_amf_double(pb, audiocodecid);
}
put_amf_string(pb, "filesize");