fix the lockup at end of ogg bug - return an error in GetPacket when GetNextPage or GetPageAt fails
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6270 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -284,7 +284,7 @@ OggReader::GetFileFormatInfo(media_file_format *mff)
|
|||||||
status_t
|
status_t
|
||||||
OggReader::AllocateCookie(int32 streamNumber, void **cookie)
|
OggReader::AllocateCookie(int32 streamNumber, void **cookie)
|
||||||
{
|
{
|
||||||
TRACE("OggReader::AllocateCookie\n");
|
TRACE("OggReader::AllocateCookie %ld\n", streamNumber);
|
||||||
if (streamNumber < 0 || streamNumber > (signed)fCookies.size()) {
|
if (streamNumber < 0 || streamNumber > (signed)fCookies.size()) {
|
||||||
TRACE("OggReader::AllocateCookie: invalid streamNumber: bail\n");
|
TRACE("OggReader::AllocateCookie: invalid streamNumber: bail\n");
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
@@ -321,7 +321,7 @@ OggReader::Seek(void *cookie,
|
|||||||
uint32 seekTo,
|
uint32 seekTo,
|
||||||
int64 *frame, bigtime_t *time)
|
int64 *frame, bigtime_t *time)
|
||||||
{
|
{
|
||||||
TRACE("OggReader::Seek\n");
|
TRACE("OggReader::Seek to %lld : %lld\n",*frame,*time);
|
||||||
OggStream * stream = static_cast<OggStream*>(cookie);
|
OggStream * stream = static_cast<OggStream*>(cookie);
|
||||||
return stream->Seek(seekTo,frame,time);
|
return stream->Seek(seekTo,frame,time);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ OggStream::GetSerial() const
|
|||||||
status_t
|
status_t
|
||||||
OggStream::AddPage(off_t position, ogg_page * page)
|
OggStream::AddPage(off_t position, ogg_page * page)
|
||||||
{
|
{
|
||||||
TRACE("OggStream::AddPage\n");
|
TRACE("OggStream::AddPage %llu\n",position);
|
||||||
if (position >= 0) {
|
if (position >= 0) {
|
||||||
fPagePositions.push_back(position);
|
fPagePositions.push_back(position);
|
||||||
}
|
}
|
||||||
@@ -210,7 +210,10 @@ OggStream::GetPacket(ogg_packet * packet)
|
|||||||
uint old_page = fCurrentPage;
|
uint old_page = fCurrentPage;
|
||||||
uint old_packet = fCurrentPacket;
|
uint old_packet = fCurrentPacket;
|
||||||
while (ogg_stream_packetpeek(&fStreamState, NULL) != 1) {
|
while (ogg_stream_packetpeek(&fStreamState, NULL) != 1) {
|
||||||
fReaderInterface->GetNextPage();
|
status_t result = fReaderInterface->GetNextPage();
|
||||||
|
if (result != B_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
fCurrentPage++;
|
fCurrentPage++;
|
||||||
}
|
}
|
||||||
if (ogg_stream_packetout(&fStreamState, packet) != 1) {
|
if (ogg_stream_packetout(&fStreamState, packet) != 1) {
|
||||||
@@ -228,7 +231,10 @@ OggStream::GetPacket(ogg_packet * packet)
|
|||||||
uint pageno = fOggFrameInfos[fCurrentFrame].GetPage();
|
uint pageno = fOggFrameInfos[fCurrentFrame].GetPage();
|
||||||
while (ogg_stream_packetpeek(&fSeekStreamState, NULL) != 1) {
|
while (ogg_stream_packetpeek(&fSeekStreamState, NULL) != 1) {
|
||||||
off_t position = fPagePositions[pageno++];
|
off_t position = fPagePositions[pageno++];
|
||||||
fReaderInterface->GetPageAt(position, &fSeekStreamState);
|
status_t result = fReaderInterface->GetPageAt(position, &fSeekStreamState);
|
||||||
|
if (result != B_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ogg_stream_packetout(&fSeekStreamState, packet) != 1) {
|
if (ogg_stream_packetout(&fSeekStreamState, packet) != 1) {
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ OggTobiasStream::IsValidHeader(const ogg_packet & packet)
|
|||||||
OggTobiasStream::OggTobiasStream(long serialno)
|
OggTobiasStream::OggTobiasStream(long serialno)
|
||||||
: OggStream(serialno)
|
: OggStream(serialno)
|
||||||
{
|
{
|
||||||
|
TRACE("OggTobiasStream::OggTobiasStream\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
OggTobiasStream::~OggTobiasStream()
|
OggTobiasStream::~OggTobiasStream()
|
||||||
|
|||||||
Reference in New Issue
Block a user