From 148c9bdbb8042c66d0ea0b6170be568000d2bf1e Mon Sep 17 00:00:00 2001 From: Allan Hsu Date: Thu, 28 Dec 2006 12:35:22 +0000 Subject: [PATCH] Patch for the FLV muxer to supply more complete metadata in the onMetaData header. Patch by Allan Hsu . Originally committed as revision 7382 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/flvenc.c | 49 +++++++++++++++++++++++++++++++++++++++++-- tests/ffmpeg.regression.ref | 4 ++-- tests/rotozoom.regression.ref | 4 ++-- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index fc332e1..c83325f 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 +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"); diff --git a/tests/ffmpeg.regression.ref b/tests/ffmpeg.regression.ref index 8ff4c5e..fb5dee7 100644 --- a/tests/ffmpeg.regression.ref +++ b/tests/ffmpeg.regression.ref @@ -133,8 +133,8 @@ stddev: 20.00 PSNR:22.10 bytes:7602176 1454536 ./data/a-asv2.avi 0b310840a6d3970595983491687669df *./data/out.yuv stddev: 18.82 PSNR:22.63 bytes:7602176 -4478bd22d09ae383b5cff05100437727 *./data/a-flv.flv -649017 ./data/a-flv.flv +cbdb25fe5bb6a895baf9799b8ccb3038 *./data/a-flv.flv +649040 ./data/a-flv.flv 40281942d6ee254f7d3027b8593b19be *./data/out.yuv stddev: 8.06 PSNR:29.99 bytes:7602176 f8f51fa737add17f7fecaefa118b57ed *./data/a-ffv1.avi diff --git a/tests/rotozoom.regression.ref b/tests/rotozoom.regression.ref index 643ec3c..58c3fed 100644 --- a/tests/rotozoom.regression.ref +++ b/tests/rotozoom.regression.ref @@ -133,8 +133,8 @@ stddev: 10.47 PSNR:27.72 bytes:7602176 789072 ./data/a-asv2.avi 74a78015b64b2cf8cb9da2e44f508a69 *./data/out.yuv stddev: 10.28 PSNR:27.88 bytes:7602176 -bd76377d9e167caff10ebaf381f01a82 *./data/a-flv.flv -131337 ./data/a-flv.flv +7163b470e93feb36b3f01e82168a3d31 *./data/a-flv.flv +131360 ./data/a-flv.flv 8999c8264fb0941561f64c4a736e9d88 *./data/out.yuv stddev: 5.33 PSNR:33.58 bytes:7602176 d72b0960e162d4998b9acbabb07e99ab *./data/a-ffv1.avi -- 2.7.4