@ -24,6 +24,7 @@
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
*/
# include "libavcodec/bytestream.h"
# include "libavcodec/mpeg4audio.h"
# include "libavcodec/mpeg4audio.h"
# include "avformat.h"
# include "avformat.h"
# include "flv.h"
# include "flv.h"
@ -43,6 +44,32 @@ static int flv_probe(AVProbeData *p)
return 0 ;
return 0 ;
}
}
/**
* Builds a Speex header .
* This is not needed for the libavcodec libspeex decoder , but is needed for
* stream copy and for decoders which require a header .
*/
static void flv_build_speex_header ( uint8_t * extradata )
{
memset ( extradata , 0 , 80 ) ;
bytestream_put_buffer ( & extradata , " Speex " , 8 ) ; // speex_string
bytestream_put_buffer ( & extradata , " 1.2rc1 " , 6 ) ; // speex_version
extradata + = 14 ; // speex_version padding
bytestream_put_le32 ( & extradata , 1 ) ; // speex_version_id
bytestream_put_le32 ( & extradata , 80 ) ; // header_size
bytestream_put_le32 ( & extradata , 16000 ) ; // rate
bytestream_put_le32 ( & extradata , 1 ) ; // mode
bytestream_put_le32 ( & extradata , 4 ) ; // mode_bitstream_version
bytestream_put_le32 ( & extradata , 1 ) ; // nb_channels
bytestream_put_le32 ( & extradata , - 1 ) ; // bitrate
bytestream_put_le32 ( & extradata , 320 ) ; // frame_size
// vbr = 0
// frames_per_packet = 0
// extra_headers = 0
// reserved1 = 0
// reserved2 = 0
}
static void flv_set_audio_codec ( AVFormatContext * s , AVStream * astream , int flv_codecid ) {
static void flv_set_audio_codec ( AVFormatContext * s , AVStream * astream , int flv_codecid ) {
AVCodecContext * acodec = astream - > codec ;
AVCodecContext * acodec = astream - > codec ;
switch ( flv_codecid ) {
switch ( flv_codecid ) {
@ -62,6 +89,13 @@ static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, int flv_c
case FLV_CODECID_SPEEX :
case FLV_CODECID_SPEEX :
acodec - > codec_id = CODEC_ID_SPEEX ;
acodec - > codec_id = CODEC_ID_SPEEX ;
acodec - > sample_rate = 16000 ;
acodec - > sample_rate = 16000 ;
acodec - > extradata = av_mallocz ( 80 + FF_INPUT_BUFFER_PADDING_SIZE ) ;
if ( acodec - > extradata ) {
acodec - > extradata_size = 80 ;
flv_build_speex_header ( acodec - > extradata ) ;
} else {
av_log ( s , AV_LOG_WARNING , " Unable to create Speex extradata \n " ) ;
}
break ;
break ;
case FLV_CODECID_MP3 : acodec - > codec_id = CODEC_ID_MP3 ; astream - > need_parsing = AVSTREAM_PARSE_FULL ; break ;
case FLV_CODECID_MP3 : acodec - > codec_id = CODEC_ID_MP3 ; astream - > need_parsing = AVSTREAM_PARSE_FULL ; break ;
case FLV_CODECID_NELLYMOSER_8KHZ_MONO :
case FLV_CODECID_NELLYMOSER_8KHZ_MONO :