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
This commit is contained in:
		
				
					committed by
					
						
						Benjamin Larsson
					
				
			
			
				
	
			
			
			
						parent
						
							e311363245
						
					
				
				
					commit
					148c9bdbb8
				
			@@ -20,10 +20,27 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
#include "avformat.h"
 | 
					#include "avformat.h"
 | 
				
			||||||
#include "flv.h"
 | 
					#include "flv.h"
 | 
				
			||||||
 | 
					#include "riff.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef NDEBUG
 | 
					#undef NDEBUG
 | 
				
			||||||
#include <assert.h>
 | 
					#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 {
 | 
					typedef struct FLVContext {
 | 
				
			||||||
    int hasAudio;
 | 
					    int hasAudio;
 | 
				
			||||||
    int hasVideo;
 | 
					    int hasVideo;
 | 
				
			||||||
@@ -99,11 +116,16 @@ static void put_amf_double(ByteIOContext *pb, double d)
 | 
				
			|||||||
    put_be64(pb, av_dbl2int(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)
 | 
					static int flv_write_header(AVFormatContext *s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ByteIOContext *pb = &s->pb;
 | 
					    ByteIOContext *pb = &s->pb;
 | 
				
			||||||
    FLVContext *flv = s->priv_data;
 | 
					    FLVContext *flv = s->priv_data;
 | 
				
			||||||
    int i, width, height, samplerate;
 | 
					    int i, width, height, samplerate, samplesize, channels, audiocodecid, videocodecid;
 | 
				
			||||||
    double framerate = 0.0;
 | 
					    double framerate = 0.0;
 | 
				
			||||||
    int metadata_size_pos, data_size;
 | 
					    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);
 | 
					                framerate = 1/av_q2d(s->streams[i]->codec->time_base);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            flv->hasVideo=1;
 | 
					            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 {
 | 
					        } else {
 | 
				
			||||||
            flv->hasAudio=1;
 | 
					            flv->hasAudio=1;
 | 
				
			||||||
            samplerate = enc->sample_rate;
 | 
					            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)
 | 
					            if(get_audio_flags(enc)<0)
 | 
				
			||||||
                return -1;
 | 
					                return -1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -162,7 +195,7 @@ static int flv_write_header(AVFormatContext *s)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* mixed array (hash) with size and string/type/data tuples */
 | 
					    /* mixed array (hash) with size and string/type/data tuples */
 | 
				
			||||||
    put_byte(pb, AMF_DATA_TYPE_MIXEDARRAY);
 | 
					    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");
 | 
					    put_amf_string(pb, "duration");
 | 
				
			||||||
    flv->duration_offset= url_ftell(pb);
 | 
					    flv->duration_offset= url_ftell(pb);
 | 
				
			||||||
@@ -180,11 +213,23 @@ static int flv_write_header(AVFormatContext *s)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        put_amf_string(pb, "framerate");
 | 
					        put_amf_string(pb, "framerate");
 | 
				
			||||||
        put_amf_double(pb, framerate);
 | 
					        put_amf_double(pb, framerate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        put_amf_string(pb, "videocodecid");
 | 
				
			||||||
 | 
					        put_amf_double(pb, videocodecid);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(flv->hasAudio){
 | 
					    if(flv->hasAudio){
 | 
				
			||||||
        put_amf_string(pb, "audiosamplerate");
 | 
					        put_amf_string(pb, "audiosamplerate");
 | 
				
			||||||
        put_amf_double(pb, samplerate);
 | 
					        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");
 | 
					    put_amf_string(pb, "filesize");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -133,8 +133,8 @@ stddev: 20.00 PSNR:22.10 bytes:7602176
 | 
				
			|||||||
1454536 ./data/a-asv2.avi
 | 
					1454536 ./data/a-asv2.avi
 | 
				
			||||||
0b310840a6d3970595983491687669df *./data/out.yuv
 | 
					0b310840a6d3970595983491687669df *./data/out.yuv
 | 
				
			||||||
stddev: 18.82 PSNR:22.63 bytes:7602176
 | 
					stddev: 18.82 PSNR:22.63 bytes:7602176
 | 
				
			||||||
4478bd22d09ae383b5cff05100437727 *./data/a-flv.flv
 | 
					cbdb25fe5bb6a895baf9799b8ccb3038 *./data/a-flv.flv
 | 
				
			||||||
649017 ./data/a-flv.flv
 | 
					649040 ./data/a-flv.flv
 | 
				
			||||||
40281942d6ee254f7d3027b8593b19be *./data/out.yuv
 | 
					40281942d6ee254f7d3027b8593b19be *./data/out.yuv
 | 
				
			||||||
stddev:  8.06 PSNR:29.99 bytes:7602176
 | 
					stddev:  8.06 PSNR:29.99 bytes:7602176
 | 
				
			||||||
f8f51fa737add17f7fecaefa118b57ed *./data/a-ffv1.avi
 | 
					f8f51fa737add17f7fecaefa118b57ed *./data/a-ffv1.avi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -133,8 +133,8 @@ stddev: 10.47 PSNR:27.72 bytes:7602176
 | 
				
			|||||||
789072 ./data/a-asv2.avi
 | 
					789072 ./data/a-asv2.avi
 | 
				
			||||||
74a78015b64b2cf8cb9da2e44f508a69 *./data/out.yuv
 | 
					74a78015b64b2cf8cb9da2e44f508a69 *./data/out.yuv
 | 
				
			||||||
stddev: 10.28 PSNR:27.88 bytes:7602176
 | 
					stddev: 10.28 PSNR:27.88 bytes:7602176
 | 
				
			||||||
bd76377d9e167caff10ebaf381f01a82 *./data/a-flv.flv
 | 
					7163b470e93feb36b3f01e82168a3d31 *./data/a-flv.flv
 | 
				
			||||||
131337 ./data/a-flv.flv
 | 
					131360 ./data/a-flv.flv
 | 
				
			||||||
8999c8264fb0941561f64c4a736e9d88 *./data/out.yuv
 | 
					8999c8264fb0941561f64c4a736e9d88 *./data/out.yuv
 | 
				
			||||||
stddev:  5.33 PSNR:33.58 bytes:7602176
 | 
					stddev:  5.33 PSNR:33.58 bytes:7602176
 | 
				
			||||||
d72b0960e162d4998b9acbabb07e99ab *./data/a-ffv1.avi
 | 
					d72b0960e162d4998b9acbabb07e99ab *./data/a-ffv1.avi
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user