* Style cleanup
* Check allocations and report error in case any fail. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31998 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+196
-166
@@ -1,174 +1,33 @@
|
|||||||
/*
|
/*
|
||||||
** Copyright 2004, the OpenBeOS project. All rights reserved.
|
* Copyright 2004-2009, Haiku, Inc. All rights reserved.
|
||||||
** Distributed under the terms of the OpenBeOS License.
|
* Distributed under the terms of the MIT license.
|
||||||
**
|
*
|
||||||
** Authors: Axel Dörfler, Marcus Overhagen
|
* Authors:
|
||||||
*/
|
* Axel Dörfler
|
||||||
|
* Marcus Overhagen
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "FormatManager.h"
|
#include "FormatManager.h"
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
#include <Autolock.h>
|
#include <new>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <Autolock.h>
|
||||||
|
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
#define TIMEOUT 5000000LL
|
#define TIMEOUT 5000000LL
|
||||||
// 5 seconds timeout for sending the reply
|
// 5 seconds timeout for sending the reply
|
||||||
// ToDo: do we really want to pause the server looper for this?
|
// TODO: do we really want to pause the server looper for this?
|
||||||
// would be better to offload this action to a second thread
|
// would be better to offload this action to a second thread
|
||||||
|
|
||||||
const char *family_to_string(media_format_family in_family);
|
|
||||||
const char *string_for_description(const media_format_description &in_description, char *string, size_t length);
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
FormatManager::FormatManager()
|
static const char*
|
||||||
:
|
|
||||||
fLock("format manager"),
|
|
||||||
fLastUpdate(0),
|
|
||||||
fNextCodecID(1000)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FormatManager::~FormatManager()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** This method is called when BMediaFormats asks for any updates
|
|
||||||
* made to our format list.
|
|
||||||
* If there were any changes since the last time, the whole
|
|
||||||
* list will be sent back.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
FormatManager::GetFormats(BMessage &message)
|
|
||||||
{
|
|
||||||
BAutolock locker(fLock);
|
|
||||||
|
|
||||||
bigtime_t lastUpdate;
|
|
||||||
if (message.FindInt64("last_timestamp", &lastUpdate) == B_OK
|
|
||||||
&& lastUpdate >= fLastUpdate) {
|
|
||||||
// there weren't any changes since last time
|
|
||||||
BMessage reply;
|
|
||||||
reply.AddBool("need_update", false);
|
|
||||||
|
|
||||||
message.SendReply(&reply, (BHandler *)NULL, TIMEOUT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// add all meta formats to the list
|
|
||||||
|
|
||||||
BMessage reply;
|
|
||||||
reply.AddBool("need_update", true);
|
|
||||||
reply.AddInt64("timestamp", system_time());
|
|
||||||
|
|
||||||
int32 count = fList.CountItems();
|
|
||||||
printf("FormatManager::GetFormats(): put %ld formats into message\n", count);
|
|
||||||
for (int32 i = 0; i < count; i++) {
|
|
||||||
meta_format *format = fList.ItemAt(i);
|
|
||||||
reply.AddData("formats", MEDIA_META_FORMAT_TYPE, format, sizeof(meta_format));
|
|
||||||
}
|
|
||||||
|
|
||||||
message.SendReply(&reply, (BHandler *)NULL, TIMEOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
FormatManager::MakeFormatFor(BMessage &message)
|
|
||||||
{
|
|
||||||
BAutolock locker(fLock);
|
|
||||||
|
|
||||||
media_format format;
|
|
||||||
const void * data;
|
|
||||||
ssize_t size;
|
|
||||||
if (message.FindData("format", B_RAW_TYPE, 0, &data, &size) != B_OK
|
|
||||||
|| size != sizeof(format)) {
|
|
||||||
// couldn't get the format
|
|
||||||
BMessage reply;
|
|
||||||
reply.AddInt32("result", B_ERROR);
|
|
||||||
message.SendReply(&reply, (BHandler *)NULL, TIMEOUT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// copy the BMessage's data into our format
|
|
||||||
format = *(media_format *)data;
|
|
||||||
|
|
||||||
int codec = fNextCodecID;
|
|
||||||
switch (format.type) {
|
|
||||||
case B_MEDIA_RAW_AUDIO:
|
|
||||||
case B_MEDIA_RAW_VIDEO:
|
|
||||||
// no marker
|
|
||||||
break;
|
|
||||||
case B_MEDIA_ENCODED_AUDIO:
|
|
||||||
if (format.u.encoded_audio.encoding == 0) {
|
|
||||||
format.u.encoded_audio.encoding = (media_encoded_audio_format::audio_encoding)fNextCodecID++;
|
|
||||||
} else {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
// TODO: check the encoding and the format passed in for compatibility
|
|
||||||
// return B_MISMATCHED_VALUES if incompatible - perhaps something else based on flags?
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case B_MEDIA_ENCODED_VIDEO:
|
|
||||||
if (format.u.encoded_video.encoding == 0) {
|
|
||||||
format.u.encoded_video.encoding = (media_encoded_video_format::video_encoding)fNextCodecID++;
|
|
||||||
} else {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
// TODO: check the encoding and the format passed in for compatibility
|
|
||||||
// return B_MISMATCHED_VALUES if incompatible - perhaps something else based on flags?
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case B_MEDIA_MULTISTREAM:
|
|
||||||
if (format.u.multistream.format == 0) {
|
|
||||||
format.u.multistream.format = fNextCodecID++;
|
|
||||||
} else {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
// TODO: check the encoding and the format passed in for compatibility
|
|
||||||
// return B_MISMATCHED_VALUES if incompatible - perhaps something else based on flags?
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// nothing to do
|
|
||||||
BMessage reply;
|
|
||||||
reply.AddInt32("result", B_OK);
|
|
||||||
reply.AddData("format", B_RAW_TYPE, &format, sizeof(format));
|
|
||||||
message.SendReply(&reply, (BHandler *)NULL, TIMEOUT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fLastUpdate = system_time();
|
|
||||||
|
|
||||||
// ToDo: support "flags" (B_SET_DEFAULT, B_EXCLUSIVE, B_NO_MERGE)!
|
|
||||||
int32 i = 0;
|
|
||||||
while (message.FindData("description", B_RAW_TYPE, i++, &data, &size) == B_OK
|
|
||||||
&& size == sizeof(media_format_description)) {
|
|
||||||
meta_format *metaFormat = new meta_format(*(media_format_description*)data, format, codec);
|
|
||||||
|
|
||||||
fList.BinaryInsert(metaFormat, meta_format::Compare);
|
|
||||||
}
|
|
||||||
|
|
||||||
BMessage reply;
|
|
||||||
reply.AddInt32("result", B_OK);
|
|
||||||
reply.AddData("format", B_RAW_TYPE, &format, sizeof(format));
|
|
||||||
message.SendReply(&reply, (BHandler *)NULL, TIMEOUT);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
FormatManager::LoadState()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
FormatManager::SaveState()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const char *
|
|
||||||
family_to_string(media_format_family family)
|
family_to_string(media_format_family family)
|
||||||
{
|
{
|
||||||
switch (family) {
|
switch (family) {
|
||||||
@@ -198,25 +57,30 @@ family_to_string(media_format_family family)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *
|
static const char*
|
||||||
string_for_description(const media_format_description &desc, char *string, size_t length)
|
string_for_description(const media_format_description& desc, char* string,
|
||||||
|
size_t length)
|
||||||
{
|
{
|
||||||
switch (desc.family) {
|
switch (desc.family) {
|
||||||
case B_ANY_FORMAT_FAMILY:
|
case B_ANY_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "any format");
|
snprintf(string, length, "any format");
|
||||||
break;
|
break;
|
||||||
case B_BEOS_FORMAT_FAMILY:
|
case B_BEOS_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "BeOS format, format id 0x%lx", desc.u.beos.format);
|
snprintf(string, length, "BeOS format, format id 0x%lx",
|
||||||
|
desc.u.beos.format);
|
||||||
break;
|
break;
|
||||||
case B_QUICKTIME_FORMAT_FAMILY:
|
case B_QUICKTIME_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "Quicktime format, vendor id 0x%lx, codec id 0x%lx", desc.u.quicktime.vendor, desc.u.quicktime.codec);
|
snprintf(string, length, "Quicktime format, vendor id 0x%lx, "
|
||||||
|
"codec id 0x%lx", desc.u.quicktime.vendor,
|
||||||
|
desc.u.quicktime.codec);
|
||||||
break;
|
break;
|
||||||
case B_AVI_FORMAT_FAMILY:
|
case B_AVI_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "AVI format, codec id 0x%lx", desc.u.avi.codec);
|
snprintf(string, length, "AVI format, codec id 0x%lx",
|
||||||
|
desc.u.avi.codec);
|
||||||
break;
|
break;
|
||||||
case B_ASF_FORMAT_FAMILY:
|
case B_ASF_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "ASF format, GUID %02x %02x %02x %02x %02x %02x "
|
snprintf(string, length, "ASF format, GUID %02x %02x %02x %02x "
|
||||||
"%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
|
"%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
|
||||||
desc.u.asf.guid.data[0], desc.u.asf.guid.data[1],
|
desc.u.asf.guid.data[0], desc.u.asf.guid.data[1],
|
||||||
desc.u.asf.guid.data[2], desc.u.asf.guid.data[3],
|
desc.u.asf.guid.data[2], desc.u.asf.guid.data[3],
|
||||||
desc.u.asf.guid.data[4], desc.u.asf.guid.data[5],
|
desc.u.asf.guid.data[4], desc.u.asf.guid.data[5],
|
||||||
@@ -230,16 +94,19 @@ string_for_description(const media_format_description &desc, char *string, size_
|
|||||||
snprintf(string, length, "MPEG format, id 0x%lx", desc.u.mpeg.id);
|
snprintf(string, length, "MPEG format, id 0x%lx", desc.u.mpeg.id);
|
||||||
break;
|
break;
|
||||||
case B_WAV_FORMAT_FAMILY:
|
case B_WAV_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "WAV format, codec id 0x%lx", desc.u.wav.codec);
|
snprintf(string, length, "WAV format, codec id 0x%lx",
|
||||||
|
desc.u.wav.codec);
|
||||||
break;
|
break;
|
||||||
case B_AIFF_FORMAT_FAMILY:
|
case B_AIFF_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "AIFF format, codec id 0x%lx", desc.u.aiff.codec);
|
snprintf(string, length, "AIFF format, codec id 0x%lx",
|
||||||
|
desc.u.aiff.codec);
|
||||||
break;
|
break;
|
||||||
case B_AVR_FORMAT_FAMILY:
|
case B_AVR_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "AVR format, id 0x%lx", desc.u.avr.id);
|
snprintf(string, length, "AVR format, id 0x%lx", desc.u.avr.id);
|
||||||
break;
|
break;
|
||||||
case B_MISC_FORMAT_FAMILY:
|
case B_MISC_FORMAT_FAMILY:
|
||||||
snprintf(string, length, "misc format, file-format id 0x%lx, codec id 0x%lx", desc.u.misc.file_format, desc.u.misc.codec);
|
snprintf(string, length, "misc format, file-format id 0x%lx, "
|
||||||
|
"codec id 0x%lx", desc.u.misc.file_format, desc.u.misc.codec);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
snprintf(string, length, "unknown format");
|
snprintf(string, length, "unknown format");
|
||||||
@@ -247,3 +114,166 @@ string_for_description(const media_format_description &desc, char *string, size_
|
|||||||
}
|
}
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
FormatManager::FormatManager()
|
||||||
|
:
|
||||||
|
fLock("format manager"),
|
||||||
|
fLastUpdate(0),
|
||||||
|
fNextCodecID(1000)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FormatManager::~FormatManager()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
FormatManager::LoadState()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
FormatManager::SaveState()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! This method is called when BMediaFormats asks for any updates
|
||||||
|
made to our format list.
|
||||||
|
If there were any changes since the last time, the whole
|
||||||
|
list will be sent back.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FormatManager::GetFormats(BMessage& message)
|
||||||
|
{
|
||||||
|
BAutolock locker(fLock);
|
||||||
|
|
||||||
|
bigtime_t lastUpdate;
|
||||||
|
if (message.FindInt64("last_timestamp", &lastUpdate) == B_OK
|
||||||
|
&& lastUpdate >= fLastUpdate) {
|
||||||
|
// There weren't any changes since last time.
|
||||||
|
BMessage reply;
|
||||||
|
reply.AddBool("need_update", false);
|
||||||
|
|
||||||
|
message.SendReply(&reply, (BHandler*)NULL, TIMEOUT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add all meta formats to the list
|
||||||
|
BMessage reply;
|
||||||
|
reply.AddBool("need_update", true);
|
||||||
|
reply.AddInt64("timestamp", system_time());
|
||||||
|
|
||||||
|
int32 count = fList.CountItems();
|
||||||
|
printf("FormatManager::GetFormats(): put %ld formats into message\n",
|
||||||
|
count);
|
||||||
|
for (int32 i = 0; i < count; i++) {
|
||||||
|
meta_format* format = fList.ItemAt(i);
|
||||||
|
reply.AddData("formats", MEDIA_META_FORMAT_TYPE, format,
|
||||||
|
sizeof(meta_format));
|
||||||
|
}
|
||||||
|
|
||||||
|
message.SendReply(&reply, (BHandler*)NULL, TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
FormatManager::MakeFormatFor(BMessage& message)
|
||||||
|
{
|
||||||
|
BAutolock locker(fLock);
|
||||||
|
|
||||||
|
media_format format;
|
||||||
|
const void* data;
|
||||||
|
ssize_t size;
|
||||||
|
if (message.FindData("format", B_RAW_TYPE, 0, &data, &size) != B_OK
|
||||||
|
|| size != sizeof(format)) {
|
||||||
|
// Couldn't get the format
|
||||||
|
BMessage reply;
|
||||||
|
reply.AddInt32("result", B_ERROR);
|
||||||
|
message.SendReply(&reply, (BHandler*)NULL, TIMEOUT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Copy the BMessage's data into our format
|
||||||
|
format = *(media_format*)data;
|
||||||
|
|
||||||
|
int codec = fNextCodecID;
|
||||||
|
switch (format.type) {
|
||||||
|
case B_MEDIA_RAW_AUDIO:
|
||||||
|
case B_MEDIA_RAW_VIDEO:
|
||||||
|
// no marker
|
||||||
|
break;
|
||||||
|
case B_MEDIA_ENCODED_AUDIO:
|
||||||
|
if (format.u.encoded_audio.encoding == 0) {
|
||||||
|
format.u.encoded_audio.encoding
|
||||||
|
= (media_encoded_audio_format::audio_encoding)
|
||||||
|
fNextCodecID++;
|
||||||
|
} else {
|
||||||
|
UNIMPLEMENTED();
|
||||||
|
// TODO: Check the encoding and the format passed in for
|
||||||
|
// compatibility and return B_MISMATCHED_VALUES if incompatible
|
||||||
|
// or perhaps something else based on flags?
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case B_MEDIA_ENCODED_VIDEO:
|
||||||
|
if (format.u.encoded_video.encoding == 0) {
|
||||||
|
format.u.encoded_video.encoding
|
||||||
|
= (media_encoded_video_format::video_encoding)
|
||||||
|
fNextCodecID++;
|
||||||
|
} else {
|
||||||
|
UNIMPLEMENTED();
|
||||||
|
// TODO: Check the encoding and the format passed in for
|
||||||
|
// compatibility and return B_MISMATCHED_VALUES if incompatible
|
||||||
|
// or perhaps something else based on flags?
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case B_MEDIA_MULTISTREAM:
|
||||||
|
if (format.u.multistream.format == 0) {
|
||||||
|
format.u.multistream.format = fNextCodecID++;
|
||||||
|
} else {
|
||||||
|
UNIMPLEMENTED();
|
||||||
|
// TODO: Check the encoding and the format passed in for
|
||||||
|
// compatibility and return B_MISMATCHED_VALUES if incompatible
|
||||||
|
// or perhaps something else based on flags?
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// nothing to do
|
||||||
|
BMessage reply;
|
||||||
|
reply.AddInt32("result", B_OK);
|
||||||
|
reply.AddData("format", B_RAW_TYPE, &format, sizeof(format));
|
||||||
|
message.SendReply(&reply, (BHandler*)NULL, TIMEOUT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fLastUpdate = system_time();
|
||||||
|
|
||||||
|
status_t result = B_OK;
|
||||||
|
// TODO: Support "flags" (B_SET_DEFAULT, B_EXCLUSIVE, B_NO_MERGE)!
|
||||||
|
int32 i = 0;
|
||||||
|
while (message.FindData("description", B_RAW_TYPE, i++, &data, &size)
|
||||||
|
== B_OK && size == sizeof(media_format_description)) {
|
||||||
|
meta_format* metaFormat
|
||||||
|
= new(std::nothrow) meta_format(*(media_format_description*)data,
|
||||||
|
format, codec);
|
||||||
|
if (metaFormat == NULL
|
||||||
|
|| !fList.BinaryInsert(metaFormat, meta_format::Compare)) {
|
||||||
|
delete metaFormat;
|
||||||
|
result = B_NO_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BMessage reply;
|
||||||
|
reply.AddInt32("result", result);
|
||||||
|
if (result == B_OK)
|
||||||
|
reply.AddData("format", B_RAW_TYPE, &format, sizeof(format));
|
||||||
|
message.SendReply(&reply, (BHandler*)NULL, TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,31 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2004-2009, Haiku, Inc. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT license.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Axel Dörfler
|
||||||
|
* Marcus Overhagen
|
||||||
|
*/
|
||||||
#ifndef _FORMAT_MANAGER_H
|
#ifndef _FORMAT_MANAGER_H
|
||||||
#define _FORMAT_MANAGER_H
|
#define _FORMAT_MANAGER_H
|
||||||
|
|
||||||
|
|
||||||
#include <ObjectList.h>
|
|
||||||
#include <Locker.h>
|
#include <Locker.h>
|
||||||
|
#include <ObjectList.h>
|
||||||
|
|
||||||
#include "MetaFormat.h"
|
#include "MetaFormat.h"
|
||||||
|
|
||||||
|
|
||||||
class FormatManager {
|
class FormatManager {
|
||||||
public:
|
public:
|
||||||
FormatManager();
|
FormatManager();
|
||||||
~FormatManager();
|
~FormatManager();
|
||||||
|
|
||||||
void LoadState();
|
void LoadState();
|
||||||
void SaveState();
|
void SaveState();
|
||||||
|
|
||||||
void GetFormats(BMessage &message);
|
void GetFormats(BMessage& message);
|
||||||
void MakeFormatFor(BMessage &message);
|
void MakeFormatFor(BMessage& message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef BPrivate::media::meta_format meta_format;
|
typedef BPrivate::media::meta_format meta_format;
|
||||||
|
|
||||||
BObjectList<meta_format> fList;
|
BObjectList<meta_format> fList;
|
||||||
BLocker fLock;
|
BLocker fLock;
|
||||||
bigtime_t fLastUpdate;
|
bigtime_t fLastUpdate;
|
||||||
int32 fNextCodecID;
|
int32 fNextCodecID;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _FORMAT_MANAGER_H
|
#endif // _FORMAT_MANAGER_H
|
||||||
|
|||||||
Reference in New Issue
Block a user