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:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user