tolerate more badness from BMediaFormats, added theora formats, cleaned up theora header parsing
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6272 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -93,14 +93,9 @@ OggSpeexStream::GetStreamInfo(int64 *frameCount, bigtime_t *duration,
|
|||||||
media_format_description description = speex_description();
|
media_format_description description = speex_description();
|
||||||
BMediaFormats formats;
|
BMediaFormats formats;
|
||||||
result = formats.InitCheck();
|
result = formats.InitCheck();
|
||||||
if (result != B_OK) {
|
if (result == B_OK) {
|
||||||
return result;
|
result = formats.GetFormatFor(description, format);
|
||||||
}
|
}
|
||||||
if (!formats.Lock()) {
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
result = formats.GetFormatFor(description, format);
|
|
||||||
formats.Unlock();
|
|
||||||
if (result != B_OK) {
|
if (result != B_OK) {
|
||||||
*format = speex_encoded_media_format();
|
*format = speex_encoded_media_format();
|
||||||
// ignore error, allow user to use ReadChunk interface
|
// ignore error, allow user to use ReadChunk interface
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#ifndef _OGG_THEORA_FORMATS_H
|
||||||
|
#define _OGG_THEORA_FORMATS_H
|
||||||
|
|
||||||
|
#include <MediaFormats.h>
|
||||||
|
#include <ogg/ogg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* theora descriptions/formats
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static media_format_description
|
||||||
|
theora_description()
|
||||||
|
{
|
||||||
|
media_format_description description;
|
||||||
|
description.family = B_MISC_FORMAT_FAMILY;
|
||||||
|
description.u.misc.file_format = 'OggS';
|
||||||
|
description.u.misc.codec = 'theo';
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_theora_media_raw_video_format(media_raw_video_format * output)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static media_format
|
||||||
|
theora_encoded_media_format()
|
||||||
|
{
|
||||||
|
media_format format;
|
||||||
|
format.type = B_MEDIA_ENCODED_AUDIO;
|
||||||
|
format.user_data_type = B_CODEC_TYPE_INFO;
|
||||||
|
strncpy((char*)format.user_data, "theo", 4);
|
||||||
|
init_theora_media_raw_video_format(&format.u.encoded_video.output);
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif _OGG_THEORA_FORMATS_H
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include "OggTheoraFormats.h"
|
||||||
#include "OggTheoraStream.h"
|
#include "OggTheoraStream.h"
|
||||||
#include <ogg/ogg.h>
|
#include <ogg/ogg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -134,7 +135,7 @@ OggTheoraStream::IsValidHeader(const ogg_packet & packet)
|
|||||||
OggTheoraStream::OggTheoraStream(long serialno)
|
OggTheoraStream::OggTheoraStream(long serialno)
|
||||||
: OggStream(serialno)
|
: OggStream(serialno)
|
||||||
{
|
{
|
||||||
|
TRACE("OggTheoraStream::OggTheoraStream\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
OggTheoraStream::~OggTheoraStream()
|
OggTheoraStream::~OggTheoraStream()
|
||||||
@@ -181,28 +182,18 @@ OggTheoraStream::GetStreamInfo(int64 *frameCount, bigtime_t *duration,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// get the format for the description
|
// get the format for the description
|
||||||
media_format_description description;
|
media_format_description description = theora_description();
|
||||||
description.family = B_MISC_FORMAT_FAMILY;
|
|
||||||
description.u.misc.file_format = 'OggS';
|
|
||||||
description.u.misc.codec = 'theo';
|
|
||||||
BMediaFormats formats;
|
BMediaFormats formats;
|
||||||
result = formats.InitCheck();
|
result = formats.InitCheck();
|
||||||
if (result != B_OK) {
|
if (result == B_OK) {
|
||||||
return result;
|
result = formats.GetFormatFor(description, format);
|
||||||
}
|
}
|
||||||
if (!formats.Lock()) {
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
result = formats.GetFormatFor(description, format);
|
|
||||||
formats.Unlock();
|
|
||||||
if (result != B_OK) {
|
if (result != B_OK) {
|
||||||
return result;
|
*format = theora_encoded_media_format();
|
||||||
|
// ignore error, allow user to use ReadChunk interface
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill out format from header packet
|
// fill out format from header packet
|
||||||
format->type = B_MEDIA_ENCODED_VIDEO;
|
|
||||||
format->user_data_type = B_CODEC_TYPE_INFO;
|
|
||||||
strncpy((char*)format->user_data, "theo", 4);
|
|
||||||
format->u.encoded_video.frame_size = info.frame_width * info.frame_height ;
|
format->u.encoded_video.frame_size = info.frame_width * info.frame_height ;
|
||||||
format->u.encoded_video.output.display.line_width = info.frame_width;
|
format->u.encoded_video.output.display.line_width = info.frame_width;
|
||||||
format->u.encoded_video.output.display.line_count = info.frame_height;
|
format->u.encoded_video.output.display.line_count = info.frame_height;
|
||||||
|
|||||||
@@ -110,14 +110,9 @@ OggTobiasStream::GetStreamInfo(int64 *frameCount, bigtime_t *duration,
|
|||||||
| header->subtype[2] << 8 | header->subtype[3];
|
| header->subtype[2] << 8 | header->subtype[3];
|
||||||
BMediaFormats formats;
|
BMediaFormats formats;
|
||||||
result = formats.InitCheck();
|
result = formats.InitCheck();
|
||||||
if (result != B_OK) {
|
if (result == B_OK) {
|
||||||
return result;
|
result = formats.GetFormatFor(description, format);
|
||||||
}
|
}
|
||||||
if (!formats.Lock()) {
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
result = formats.GetFormatFor(description, format);
|
|
||||||
formats.Unlock();
|
|
||||||
if (result != B_OK) {
|
if (result != B_OK) {
|
||||||
*format = tobias_encoded_media_format();
|
*format = tobias_encoded_media_format();
|
||||||
// ignore error, allow user to use ReadChunk interface
|
// ignore error, allow user to use ReadChunk interface
|
||||||
|
|||||||
@@ -136,14 +136,9 @@ OggVorbisStream::GetStreamInfo(int64 *frameCount, bigtime_t *duration,
|
|||||||
media_format_description description = vorbis_description();
|
media_format_description description = vorbis_description();
|
||||||
BMediaFormats formats;
|
BMediaFormats formats;
|
||||||
result = formats.InitCheck();
|
result = formats.InitCheck();
|
||||||
if (result != B_OK) {
|
if (result == B_OK) {
|
||||||
return result;
|
result = formats.GetFormatFor(description, format);
|
||||||
}
|
}
|
||||||
if (!formats.Lock()) {
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
result = formats.GetFormatFor(description, format);
|
|
||||||
formats.Unlock();
|
|
||||||
if (result != B_OK) {
|
if (result != B_OK) {
|
||||||
*format = vorbis_encoded_media_format();
|
*format = vorbis_encoded_media_format();
|
||||||
// ignore error, allow user to use ReadChunk interface
|
// ignore error, allow user to use ReadChunk interface
|
||||||
|
|||||||
Reference in New Issue
Block a user