diff --git a/src/add-ons/media/plugins/ogg/OggFormats.h b/src/add-ons/media/plugins/ogg/OggFormats.h new file mode 100644 index 0000000000..f0d753169d --- /dev/null +++ b/src/add-ons/media/plugins/ogg/OggFormats.h @@ -0,0 +1,10 @@ +#ifndef _OGG_FORMATS_H +#define _OGG_FORMATS_H + +//! for use in media_misc_description.file_format +const uint32 OGG_FILE_FORMAT = 'OggS'; + +//! for use in media_header.user_data_type +const uint32 OGG_PACKET_DATA_TYPE = 'OggP'; + +#endif _OGG_FORMATS_H diff --git a/src/add-ons/media/plugins/ogg/OggSeekable.cpp b/src/add-ons/media/plugins/ogg/OggSeekable.cpp index ec69e6b9dd..a13dbe8318 100644 --- a/src/add-ons/media/plugins/ogg/OggSeekable.cpp +++ b/src/add-ons/media/plugins/ogg/OggSeekable.cpp @@ -2,6 +2,7 @@ #include "OggSpeexSeekable.h" #include "OggTobiasSeekable.h" #include "OggVorbisSeekable.h" +#include "OggFormats.h" #include #include @@ -247,7 +248,7 @@ OggSeekable::GetStreamInfo(int64 *frameCount, bigtime_t *duration, // get the format for the description media_format_description description; description.family = B_MISC_FORMAT_FAMILY; - description.u.misc.file_format = 'OggS'; + description.u.misc.file_format = OGG_FILE_FORMAT; description.u.misc.codec = four_bytes; BMediaFormats formats; result = formats.InitCheck(); @@ -448,21 +449,25 @@ OggSeekable::Seek(uint32 seekTo, int64 *frame, bigtime_t *time) return B_OK; }*/ - status_t OggSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize, media_header *mediaHeader) { + ogg_packet packet; BAutolock autolock(fPositionLock); - status_t result = GetPacket(&fChunkPacket); + status_t result = GetPacket(&packet); + *chunkBuffer = packet.packet; + *chunkSize = packet.bytes; + packet.packet = NULL; + assert(sizeof(ogg_packet) <= sizeof(mediaHeader->user_data)); + mediaHeader->user_data_type = OGG_PACKET_DATA_TYPE; + memcpy(mediaHeader->user_data, &packet, sizeof(ogg_packet)); if (result != B_OK) { TRACE("OggSeekable::GetNextChunk failed: GetPacket = %s\n", strerror(result)); return result; } - *chunkBuffer = &fChunkPacket; - *chunkSize = sizeof(fChunkPacket); - if (fChunkPacket.granulepos > 0) { - fCurrentFrame = fChunkPacket.granulepos - fFirstGranulepos; + if (packet.granulepos > 0) { + fCurrentFrame = packet.granulepos - fFirstGranulepos; fCurrentTime = (bigtime_t)((fCurrentFrame * 1000000LL) / fFrameRate); mediaHeader->start_time = fCurrentTime; } else { diff --git a/src/add-ons/media/plugins/ogg/OggSeekable.h b/src/add-ons/media/plugins/ogg/OggSeekable.h index af60365dc5..b3cc1cca7a 100644 --- a/src/add-ons/media/plugins/ogg/OggSeekable.h +++ b/src/add-ons/media/plugins/ogg/OggSeekable.h @@ -40,7 +40,6 @@ protected: // subclass pull input function status_t GetPacket(ogg_packet * packet); - ogg_packet fChunkPacket; protected: int64 fCurrentFrame; diff --git a/src/add-ons/media/plugins/ogg/OggSpeexFormats.h b/src/add-ons/media/plugins/ogg/OggSpeexFormats.h index 8b826ab4de..3a007edd6d 100644 --- a/src/add-ons/media/plugins/ogg/OggSpeexFormats.h +++ b/src/add-ons/media/plugins/ogg/OggSpeexFormats.h @@ -4,6 +4,7 @@ #include #include #include +#include /* * speex descriptions/formats @@ -15,7 +16,7 @@ speex_description() { media_format_description description; description.family = B_MISC_FORMAT_FAMILY; - description.u.misc.file_format = 'OggS'; + description.u.misc.file_format = OGG_FILE_FORMAT; description.u.misc.codec = 'Spee'; return description; } diff --git a/src/add-ons/media/plugins/ogg/OggSpeexSeekable.cpp b/src/add-ons/media/plugins/ogg/OggSpeexSeekable.cpp index c17c61bb1a..2d316fc4fd 100644 --- a/src/add-ons/media/plugins/ogg/OggSpeexSeekable.cpp +++ b/src/add-ons/media/plugins/ogg/OggSpeexSeekable.cpp @@ -179,18 +179,3 @@ OggSpeexSeekable::GetStreamInfo(int64 *frameCount, bigtime_t *duration, return B_OK; } - - -status_t -OggSpeexSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize, - media_header *mediaHeader) -{ - status_t result = inherited::GetNextChunk(chunkBuffer, chunkSize, mediaHeader); - if (result != B_OK) { - TRACE("OggSpeexSeekable::GetNextChunk failed: GetNextChunk = %s\n", strerror(result)); - return result; - } - *chunkSize = ((ogg_packet*)*chunkBuffer)->bytes; - *chunkBuffer = ((ogg_packet*)*chunkBuffer)->packet; - return B_OK; -} diff --git a/src/add-ons/media/plugins/ogg/OggSpeexSeekable.h b/src/add-ons/media/plugins/ogg/OggSpeexSeekable.h index a1a6065a1c..cbe42466c5 100644 --- a/src/add-ons/media/plugins/ogg/OggSpeexSeekable.h +++ b/src/add-ons/media/plugins/ogg/OggSpeexSeekable.h @@ -16,8 +16,6 @@ public: virtual status_t GetStreamInfo(int64 *frameCount, bigtime_t *duration, media_format *format); - virtual status_t GetNextChunk(void **chunkBuffer, int32 *chunkSize, - media_header *mediaHeader); }; diff --git a/src/add-ons/media/plugins/ogg/OggStream.cpp b/src/add-ons/media/plugins/ogg/OggStream.cpp index 76700fcf69..1456051d6b 100644 --- a/src/add-ons/media/plugins/ogg/OggStream.cpp +++ b/src/add-ons/media/plugins/ogg/OggStream.cpp @@ -3,6 +3,7 @@ #include "OggTheoraStream.h" #include "OggTobiasStream.h" #include "OggVorbisStream.h" +#include "OggFormats.h" #include #include @@ -107,7 +108,7 @@ OggStream::GetStreamInfo(int64 *frameCount, bigtime_t *duration, // get the format for the description media_format_description description; description.family = B_MISC_FORMAT_FAMILY; - description.u.misc.file_format = 'OggS'; + description.u.misc.file_format = OGG_FILE_FORMAT; description.u.misc.codec = four_bytes; BMediaFormats formats; result = formats.InitCheck(); diff --git a/src/add-ons/media/plugins/ogg/OggTheoraFormats.h b/src/add-ons/media/plugins/ogg/OggTheoraFormats.h index b6ad23238b..fc636ec4a9 100644 --- a/src/add-ons/media/plugins/ogg/OggTheoraFormats.h +++ b/src/add-ons/media/plugins/ogg/OggTheoraFormats.h @@ -4,6 +4,7 @@ #include #include #include +#include /* * theora descriptions/formats @@ -15,7 +16,7 @@ theora_description() { media_format_description description; description.family = B_MISC_FORMAT_FAMILY; - description.u.misc.file_format = 'OggS'; + description.u.misc.file_format = OGG_FILE_FORMAT; description.u.misc.codec = 'theo'; return description; } diff --git a/src/add-ons/media/plugins/ogg/OggTobiasFormats.h b/src/add-ons/media/plugins/ogg/OggTobiasFormats.h index 509ef59a09..e1801b8d51 100644 --- a/src/add-ons/media/plugins/ogg/OggTobiasFormats.h +++ b/src/add-ons/media/plugins/ogg/OggTobiasFormats.h @@ -4,6 +4,7 @@ #include #include #include +#include "OggFormats.h" /* * tobias descriptions/formats @@ -47,7 +48,7 @@ tobias_text_description() { media_format_description description; description.family = B_MISC_FORMAT_FAMILY; - description.u.misc.file_format = 'OggS'; + description.u.misc.file_format = OGG_FILE_FORMAT; description.u.misc.codec = 'text'; return description; } diff --git a/src/add-ons/media/plugins/ogg/OggTobiasSeekable.cpp b/src/add-ons/media/plugins/ogg/OggTobiasSeekable.cpp index cf40cec64b..2b5243b671 100644 --- a/src/add-ons/media/plugins/ogg/OggTobiasSeekable.cpp +++ b/src/add-ons/media/plugins/ogg/OggTobiasSeekable.cpp @@ -266,8 +266,6 @@ OggTobiasSeekable::GetNextChunk(void **chunkBuffer, int32 *chunkSize, TRACE("OggTobiasSeekable::GetNextChunk failed: GetNextChunk = %s\n", strerror(result)); return result; } - *chunkSize = ((ogg_packet*)*chunkBuffer)->bytes; - *chunkBuffer = ((ogg_packet*)*chunkBuffer)->packet; bool keyframe = ((uint*)chunkBuffer)[0] & (1 << 3); // ?? if (fMediaFormat.type == B_MEDIA_ENCODED_VIDEO) { mediaHeader->type = fMediaFormat.type; diff --git a/src/add-ons/media/plugins/ogg/OggVorbisFormats.h b/src/add-ons/media/plugins/ogg/OggVorbisFormats.h index 88d1747f56..ebe79dbdcf 100644 --- a/src/add-ons/media/plugins/ogg/OggVorbisFormats.h +++ b/src/add-ons/media/plugins/ogg/OggVorbisFormats.h @@ -4,6 +4,7 @@ #include #include #include +#include "OggFormats.h" /* * vorbis descriptions/formats @@ -15,7 +16,7 @@ vorbis_description() { media_format_description description; description.family = B_MISC_FORMAT_FAMILY; - description.u.misc.file_format = 'OggS'; + description.u.misc.file_format = OGG_FILE_FORMAT; description.u.misc.codec = 'vorb'; return description; } diff --git a/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp b/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp index f1e239007d..fac94834a7 100644 --- a/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp +++ b/src/add-ons/media/plugins/vorbis/vorbisCodecPlugin.cpp @@ -184,13 +184,13 @@ VorbisDecoder::Decode(void *buffer, int64 *frameCount, status_t status = GetNextChunk(&chunkBuffer, &chunkSize, &mh); if (status == B_LAST_BUFFER_ERROR) { goto done; - } + } if (status != B_OK) { TRACE("VorbisDecoder::Decode: GetNextChunk failed\n"); return status; } - if (chunkSize != sizeof(ogg_packet)) { - TRACE("VorbisDecoder::Decode: chunk not ogg_packet-sized\n"); + if (mh.user_data_type != OGG_PACKET_DATA_TYPE) { + TRACE("VorbisDecoder::Decode: chunk missing ogg_packet data"); return B_ERROR; } if (!synced) { @@ -199,8 +199,9 @@ VorbisDecoder::Decode(void *buffer, int64 *frameCount, synced = true; } } - ogg_packet * packet = static_cast(chunkBuffer); - if (vorbis_synthesis(&fBlock,packet)==0) { + ogg_packet * packet = reinterpret_cast(mh.user_data); + packet->packet = static_cast(chunkBuffer); + if (vorbis_synthesis(&fBlock, packet)==0) { vorbis_synthesis_blockin(&fDspState,&fBlock); } }