speex parsing tweaks including copy of SpeexHeader from speex_header.h

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6195 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
shatty
2004-01-20 09:58:35 +00:00
parent 8000f68ada
commit 59ad518ef7
@@ -147,24 +147,24 @@ GetVorbisCodecStreamInfo(std::vector<ogg_packet> * packets,
// http://www.speex.org/manual/node7.html#SECTION00073000000000000000 // http://www.speex.org/manual/node7.html#SECTION00073000000000000000
typedef struct speex_header // libspeex/speex_header.h
{ typedef struct SpeexHeader {
char speex_string[8]; char speex_string[8]; /**< Identifies a Speex bit-stream, always set to "Speex " */
char speex_version[20]; char speex_version[20]; /**< Speex version */
int32 speex_version_id; int speex_version_id; /**< Version for Speex (for checking compatibility) */
int32 header_size; int header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */
int32 rate; int rate; /**< Sampling rate used */
int32 mode; int mode; /**< Mode used (0 for narrowband, 1 for wideband) */
int32 mode_bitstream_version; int mode_bitstream_version; /**< Version ID of the bit-stream */
int32 nb_channels; int nb_channels; /**< Number of channels encoded */
int32 bitrate; int bitrate; /**< Bit-rate used */
int32 frame_size; int frame_size; /**< Size of frames */
int32 vbr; int vbr; /**< 1 for a VBR encoding, 0 otherwise */
int32 frames_per_packet; int frames_per_packet; /**< Number of frames stored per Ogg packet */
int32 extra_headers; int extra_headers; /**< Number of additional headers after the comments */
int32 reserved1; int reserved1; /**< Reserved for future use, must be zero */
int32 reserved2; int reserved2; /**< Reserved for future use, must be zero */
} speex_header; } SpeexHeader;
static bool static bool
isSpeexPacket(ogg_packet * packet) isSpeexPacket(ogg_packet * packet)
@@ -175,7 +175,12 @@ isSpeexPacket(ogg_packet * packet)
static int static int
GetSpeexExtraHeaderPacketCount(ogg_packet * packet) GetSpeexExtraHeaderPacketCount(ogg_packet * packet)
{ {
return 1; if (packet->bytes < (signed)sizeof(SpeexHeader)) {
return -1;
}
void * data = &(packet->packet[0]);
SpeexHeader * header = (SpeexHeader *)data;
return 1 + header->extra_headers;
} }
static status_t static status_t
@@ -184,11 +189,11 @@ GetSpeexCodecStreamInfo(std::vector<ogg_packet> * packets,
media_format *format) media_format *format)
{ {
ogg_packet * packet = &((*packets)[0]); ogg_packet * packet = &((*packets)[0]);
if (packet->bytes < (signed)sizeof(speex_header)) { if (packet->bytes < (signed)sizeof(SpeexHeader)) {
return B_ERROR; return B_ERROR;
} }
void * data = &(packet->packet[0]); void * data = &(packet->packet[0]);
speex_header * header = (speex_header *)data; SpeexHeader * header = (SpeexHeader *)data;
format->type = B_MEDIA_ENCODED_AUDIO; format->type = B_MEDIA_ENCODED_AUDIO;
format->user_data_type = B_CODEC_TYPE_INFO; format->user_data_type = B_CODEC_TYPE_INFO;
@@ -200,7 +205,6 @@ GetSpeexCodecStreamInfo(std::vector<ogg_packet> * packets,
} else { } else {
// TODO: manually compute it where possible // TODO: manually compute it where possible
} }
format->u.encoded_audio.frame_size = header->frame_size;
if (header->nb_channels == 1) { if (header->nb_channels == 1) {
format->u.encoded_audio.multi_info.channel_mask = B_CHANNEL_LEFT; format->u.encoded_audio.multi_info.channel_mask = B_CHANNEL_LEFT;
} else { } else {