diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2004-03-09 20:14:34 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2004-03-09 20:14:34 +0000 |
commit | 92a267756f4294f3a026171fd9298b56aa3bf6ea (patch) | |
tree | c5dd16201ccbd16c4a5c1e672efb5892dcdd7bd4 /libavformat/flvenc.c | |
parent | c7516a000c4c6469543326779da87995d8d15dd3 (diff) | |
download | ffmpeg-92a267756f4294f3a026171fd9298b56aa3bf6ea.tar.gz |
flv fixes
Originally committed as revision 2863 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/flvenc.c')
-rw-r--r-- | libavformat/flvenc.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index d6973f697a..302fc7602c 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -37,7 +37,7 @@ typedef struct FLVContext { int audioInPos; int audioOutPos; int audioSize; - int audioRate; +// int audioRate; int initDelay; int soundDelay; uint8_t *audioFifo; @@ -98,31 +98,32 @@ static int mp3info(void *data, int *byteSize, int *samplesPerFrame, int *sampleR } if ( !isPadded ) { - printf("Fatal error: mp3 data is not padded!\n"); - exit(0); +// printf("Fatal error: mp3 data is not padded!\n"); +// exit(0); } *isMono = ((header >> 6) & 0x03) == 0x03; if ( (header >> 19 ) & 0x01 ) { + //MPEG1 *sampleRate = sSampleRates[0][sampleRateID]; bitRate = sBitRates[0][layerID][bitRateID] * 1000; *samplesPerFrame = sSamplesPerFrame[0][layerID]; - } else { if ( (header >> 20) & 0x01 ) { + //MPEG2 *sampleRate = sSampleRates[1][sampleRateID]; bitRate = sBitRates[1][layerID][bitRateID] * 1000; *samplesPerFrame = sSamplesPerFrame[1][layerID]; } else { + //MPEG2.5 *sampleRate = sSampleRates[2][sampleRateID]; bitRate = sBitRates[1][layerID][bitRateID] * 1000; *samplesPerFrame = sSamplesPerFrame[2][layerID]; } } - + *byteSize = ( ( ( ( *samplesPerFrame * (bitRate / bitsPerSlot) ) / *sampleRate ) + isPadded ) ); - return 1; } #endif // CONFIG_MP3LAME @@ -143,7 +144,7 @@ static int flv_write_header(AVFormatContext *s) flv->audioInPos = 0; flv->audioOutPos = 0; flv->audioSize = 0; - flv->audioRate = 44100; +// flv->audioRate = 44100; flv->initDelay = -1; flv->soundDelay = 0; #endif // CONFIG_MP3LAME @@ -270,6 +271,7 @@ static int flv_write_packet(AVFormatContext *s, int stream_index, #ifdef CONFIG_MP3LAME if (enc->codec_id == CODEC_ID_MP3 ) { int c=0; + for (;c<size;c++) { flv->audioFifo[(flv->audioOutPos+c)%AUDIO_FIFO_SIZE] = buf[c]; } @@ -281,13 +283,13 @@ static int flv_write_packet(AVFormatContext *s, int stream_index, flv->initDelay = timestamp; } - if ( flv->audioTime == -1 ) { +// if ( flv->audioTime == -1 ) { flv->audioTime = timestamp; // flv->audioTime = ( ( ( flv->sampleCount - enc->delay ) * 8000 ) / flv->audioRate ) - flv->initDelay - 250; // if ( flv->audioTime < 0 ) { // flv->audioTime = 0; // } - } +// } } for ( ; flv->audioSize >= 4 ; ) { @@ -310,7 +312,7 @@ static int flv_write_packet(AVFormatContext *s, int stream_index, int c=0; FLVFrame *frame = av_malloc(sizeof(FLVFrame)); - flv->audioRate = mp3SampleRate; +// flv->audioRate = mp3SampleRate; switch (mp3SampleRate) { case 44100: @@ -332,6 +334,7 @@ static int flv_write_packet(AVFormatContext *s, int stream_index, frame->type = 8; frame->flags = soundFormat; frame->timestamp = flv->audioTime; + frame->timestamp = (1000*flv->sampleCount + mp3SampleRate/2)/(mp3SampleRate); frame->size = mp3FrameSize; frame->data = av_malloc(mp3FrameSize); @@ -344,15 +347,18 @@ static int flv_write_packet(AVFormatContext *s, int stream_index, flv->audioInPos %= AUDIO_FIFO_SIZE; flv->sampleCount += mp3SamplesPerFrame; - // Reset audio for next round - flv->audioTime = -1; + flv->audioTime += 1000*mp3SamplesPerFrame/mp3SampleRate; // We got audio! Make sure we set this to the global flags on closure flv->hasAudio = 1; InsertSorted(flv,frame); +// av_log(NULL,AV_LOG_DEBUG, "insert sound\n"); + continue; } +// av_log(NULL,AV_LOG_DEBUG, "insuficent data\n"); break; } + av_log(NULL,AV_LOG_DEBUG, "head trashed\n"); flv->audioInPos ++; flv->audioSize --; flv->audioInPos %= AUDIO_FIFO_SIZE; |