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
typedef struct speex_header
{
char speex_string[8];
char speex_version[20];
int32 speex_version_id;
int32 header_size;
int32 rate;
int32 mode;
int32 mode_bitstream_version;
int32 nb_channels;
int32 bitrate;
int32 frame_size;
int32 vbr;
int32 frames_per_packet;
int32 extra_headers;
int32 reserved1;
int32 reserved2;
} speex_header;
// libspeex/speex_header.h
typedef struct SpeexHeader {
char speex_string[8]; /**< Identifies a Speex bit-stream, always set to "Speex " */
char speex_version[20]; /**< Speex version */
int speex_version_id; /**< Version for Speex (for checking compatibility) */
int header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */
int rate; /**< Sampling rate used */
int mode; /**< Mode used (0 for narrowband, 1 for wideband) */
int mode_bitstream_version; /**< Version ID of the bit-stream */
int nb_channels; /**< Number of channels encoded */
int bitrate; /**< Bit-rate used */
int frame_size; /**< Size of frames */
int vbr; /**< 1 for a VBR encoding, 0 otherwise */
int frames_per_packet; /**< Number of frames stored per Ogg packet */
int extra_headers; /**< Number of additional headers after the comments */
int reserved1; /**< Reserved for future use, must be zero */
int reserved2; /**< Reserved for future use, must be zero */
} SpeexHeader;
static bool
isSpeexPacket(ogg_packet * packet)
@@ -175,7 +175,12 @@ isSpeexPacket(ogg_packet * packet)
static int
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
@@ -184,11 +189,11 @@ GetSpeexCodecStreamInfo(std::vector<ogg_packet> * packets,
media_format *format)
{
ogg_packet * packet = &((*packets)[0]);
if (packet->bytes < (signed)sizeof(speex_header)) {
if (packet->bytes < (signed)sizeof(SpeexHeader)) {
return B_ERROR;
}
void * data = &(packet->packet[0]);
speex_header * header = (speex_header *)data;
SpeexHeader * header = (SpeexHeader *)data;
format->type = B_MEDIA_ENCODED_AUDIO;
format->user_data_type = B_CODEC_TYPE_INFO;
@@ -200,7 +205,6 @@ GetSpeexCodecStreamInfo(std::vector<ogg_packet> * packets,
} else {
// TODO: manually compute it where possible
}
format->u.encoded_audio.frame_size = header->frame_size;
if (header->nb_channels == 1) {
format->u.encoded_audio.multi_info.channel_mask = B_CHANNEL_LEFT;
} else {