Added a small test app that prints out all BMediaFormats supported media_formats,
and some other tiny things. Will print out a meaningful error in case there is one - tests locking behaviour of BMediaFormats::GetNextFormat() and if GetCodeFor() works correctly. Added to the build. Removed "root" library from the rules - that one doesn't have to be included manually. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6200 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,14 +1,17 @@
|
|||||||
SubDir OBOS_TOP src tests kits media ;
|
SubDir OBOS_TOP src tests kits media ;
|
||||||
|
|
||||||
SimpleTest AreaTest : AreaTest.cpp : be root ;
|
SimpleTest AreaTest : AreaTest.cpp : be ;
|
||||||
|
|
||||||
SimpleTest BufferTest : BufferTest.cpp : libmedia.so be root ;
|
SimpleTest BufferTest : BufferTest.cpp : libmedia.so be ;
|
||||||
|
|
||||||
SimpleTest SizeofTest : SizeofTest.cpp : be root ;
|
SimpleTest SizeofTest : SizeofTest.cpp : be ;
|
||||||
|
|
||||||
SimpleTest TimedEventQueueTest : TimedEventQueueTest.cpp
|
SimpleTest TimedEventQueueTest : TimedEventQueueTest.cpp
|
||||||
: libmedia.so be root ;
|
: libmedia.so be ;
|
||||||
|
|
||||||
|
SimpleTest mediaFormats :
|
||||||
|
mediaFormats.cpp
|
||||||
|
: media ;
|
||||||
|
|
||||||
SubInclude OBOS_TOP src tests kits media media_decoder ;
|
SubInclude OBOS_TOP src tests kits media media_decoder ;
|
||||||
SubInclude OBOS_TOP src tests kits media notificationtest ;
|
SubInclude OBOS_TOP src tests kits media notificationtest ;
|
||||||
|
|||||||
@@ -0,0 +1,214 @@
|
|||||||
|
/*
|
||||||
|
** Copyright 2004, Axel Dörfler, [email protected]. All rights reserved.
|
||||||
|
** Distributed under the terms of the OpenBeOS License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <MediaFormats.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_family_string(media_format_family family)
|
||||||
|
{
|
||||||
|
switch (family) {
|
||||||
|
case B_BEOS_FORMAT_FAMILY:
|
||||||
|
return "BeOS";
|
||||||
|
case B_ANY_FORMAT_FAMILY:
|
||||||
|
return "any";
|
||||||
|
case B_QUICKTIME_FORMAT_FAMILY:
|
||||||
|
return "QuickTime";
|
||||||
|
case B_AVI_FORMAT_FAMILY:
|
||||||
|
return "AVI";
|
||||||
|
case B_ASF_FORMAT_FAMILY:
|
||||||
|
return "ASF";
|
||||||
|
case B_MPEG_FORMAT_FAMILY:
|
||||||
|
return "MPEG";
|
||||||
|
case B_WAV_FORMAT_FAMILY:
|
||||||
|
return "WAV";
|
||||||
|
case B_AIFF_FORMAT_FAMILY:
|
||||||
|
return "AIFF";
|
||||||
|
case B_AVR_FORMAT_FAMILY:
|
||||||
|
return "AVR";
|
||||||
|
case B_MISC_FORMAT_FAMILY:
|
||||||
|
return "misc";
|
||||||
|
// these are OpenBeOS specific:
|
||||||
|
// case B_OGG_FORMAT_FAMILY:
|
||||||
|
// return "OGG";
|
||||||
|
// case B_META_FORMAT_FAMILY:
|
||||||
|
// return "meta";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_mpeg_string(int32 id)
|
||||||
|
{
|
||||||
|
switch (id) {
|
||||||
|
case B_MPEG_ANY:
|
||||||
|
return "any";
|
||||||
|
case B_MPEG_1_AUDIO_LAYER_1:
|
||||||
|
return "mpeg 1 audio layer 1";
|
||||||
|
case B_MPEG_1_AUDIO_LAYER_2:
|
||||||
|
return "mpeg 1 audio layer 2";
|
||||||
|
case B_MPEG_1_AUDIO_LAYER_3:
|
||||||
|
return "mpeg 1 audio layer 3 (mp3)";
|
||||||
|
case B_MPEG_1_VIDEO:
|
||||||
|
return "mpeg 1 video";
|
||||||
|
// these are OpenBeOS specific:
|
||||||
|
/* case B_MPEG_2_AUDIO_LAYER_1:
|
||||||
|
return "mpeg 2 audio layer 1";
|
||||||
|
case B_MPEG_2_AUDIO_LAYER_2:
|
||||||
|
return "mpeg 2 audio layer 2";
|
||||||
|
case B_MPEG_2_AUDIO_LAYER_3:
|
||||||
|
return "mpeg 2 audio layer 3";
|
||||||
|
case B_MPEG_2_VIDEO:
|
||||||
|
return "mpeg 2 video";
|
||||||
|
case B_MPEG_2_5_AUDIO_LAYER_1:
|
||||||
|
return "mpeg 2.5 audio layer 1";
|
||||||
|
case B_MPEG_2_5_AUDIO_LAYER_2:
|
||||||
|
return "mpeg 2.5 audio layer 2";
|
||||||
|
case B_MPEG_2_5_AUDIO_LAYER_3:
|
||||||
|
return "mpeg 2.5 audio layer 3";
|
||||||
|
*/ default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_fourcc(uint32 id)
|
||||||
|
{
|
||||||
|
char string[5];
|
||||||
|
for (int32 i = 0; i < 4; i++) {
|
||||||
|
uint8 c = uint8((id >> (24 - i * 8)) & 0xff);
|
||||||
|
if (c < ' ' || c > 0x7f)
|
||||||
|
string[i] = '.';
|
||||||
|
else
|
||||||
|
string[i] = (char)c;
|
||||||
|
}
|
||||||
|
string[4] = '\0';
|
||||||
|
printf("%s (0x%lx)\n", string, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
dump_media_format_description(media_format_description &description)
|
||||||
|
{
|
||||||
|
printf("media_format_description:\n");
|
||||||
|
printf("\tfamily:\t%s\n", get_family_string(description.family));
|
||||||
|
|
||||||
|
switch (description.family) {
|
||||||
|
case B_BEOS_FORMAT_FAMILY:
|
||||||
|
printf("\tformat:\t");
|
||||||
|
print_fourcc(description.u.beos.format);
|
||||||
|
break;
|
||||||
|
case B_AVI_FORMAT_FAMILY:
|
||||||
|
case B_AIFF_FORMAT_FAMILY:
|
||||||
|
case B_WAV_FORMAT_FAMILY:
|
||||||
|
printf("\tcodec:\t");
|
||||||
|
print_fourcc(description.u.avi.codec);
|
||||||
|
break;
|
||||||
|
case B_AVR_FORMAT_FAMILY:
|
||||||
|
printf("\tid:\t");
|
||||||
|
print_fourcc(description.u.avr.id);
|
||||||
|
break;
|
||||||
|
case B_QUICKTIME_FORMAT_FAMILY:
|
||||||
|
printf("\tcodec:\t");
|
||||||
|
print_fourcc(description.u.quicktime.codec);
|
||||||
|
printf("\tvendor:\t");
|
||||||
|
print_fourcc(description.u.quicktime.vendor);
|
||||||
|
break;
|
||||||
|
case B_MISC_FORMAT_FAMILY:
|
||||||
|
printf("\tcodec:\t\t");
|
||||||
|
print_fourcc(description.u.misc.file_format);
|
||||||
|
printf("\tfile format:\t");
|
||||||
|
print_fourcc(description.u.misc.codec);
|
||||||
|
break;
|
||||||
|
case B_MPEG_FORMAT_FAMILY:
|
||||||
|
printf("\ttype:\t%s\n", get_mpeg_string(description.u.mpeg.id));
|
||||||
|
break;
|
||||||
|
case B_ASF_FORMAT_FAMILY:
|
||||||
|
// note, this is endian depended - you shouldn't do it this way for real...
|
||||||
|
printf("\tguid:\t0x%Lx%Lx\n", *(uint64 *)&description.u.asf.guid.data[0], *(uint64 *)&description.u.asf.guid.data[8]);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
BMediaFormats formats;
|
||||||
|
|
||||||
|
status_t status = formats.InitCheck();
|
||||||
|
if (status != B_OK) {
|
||||||
|
fprintf(stderr, "BMediaFormats::InitCheck() failed: %s\n", strerror(status));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
media_format format;
|
||||||
|
status = formats.GetAVIFormatFor('DIVX', &format, B_MEDIA_ENCODED_VIDEO);
|
||||||
|
if (status != B_OK) {
|
||||||
|
fprintf(stderr, "BMediaFormats::GetAVIFormatFor() failed: %s\n", strerror(status));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
media_format_description description;
|
||||||
|
status = formats.GetCodeFor(format, B_AVI_FORMAT_FAMILY, &description);
|
||||||
|
if (status != B_OK) {
|
||||||
|
fprintf(stderr, "BMediaFormats::GetCodeFor() failed: %s\n", strerror(status));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
dump_media_format_description(description);
|
||||||
|
|
||||||
|
char desc[256];
|
||||||
|
string_for_format(format, desc, sizeof(desc));
|
||||||
|
printf("\tformat:\t%s\n", desc);
|
||||||
|
|
||||||
|
status = formats.GetCodeFor(format, B_MPEG_FORMAT_FAMILY, &description);
|
||||||
|
if (status == B_OK) {
|
||||||
|
fprintf(stderr, "BMediaFormats::GetCodeFor() succeded with wrong family!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
puts("\n***** all supported formats *****");
|
||||||
|
|
||||||
|
// Rewind() should only work when the formats object is locked
|
||||||
|
status = formats.RewindFormats();
|
||||||
|
if (status == B_OK) {
|
||||||
|
fprintf(stderr, "BMediaFormats::RewindFormats() succeded unlocked!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!formats.Lock()) {
|
||||||
|
fprintf(stderr, "BMediaFormats::Lock() failed!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = formats.RewindFormats();
|
||||||
|
if (status != B_OK) {
|
||||||
|
fprintf(stderr, "BMediaFormats::RewindFormats() failed: %s\n", strerror(status));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 count = 0;
|
||||||
|
while ((status = formats.GetNextFormat(&format, &description)) == B_OK) {
|
||||||
|
dump_media_format_description(description);
|
||||||
|
string_for_format(format, desc, sizeof(desc));
|
||||||
|
printf("\tformat:\t%s\n", desc);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
if (status != B_BAD_INDEX)
|
||||||
|
fprintf(stderr, "BMediaFormats::GetNextFormat() failed: %s\n", strerror(status));
|
||||||
|
|
||||||
|
printf("***** %ld supported formats *****\n", count);
|
||||||
|
|
||||||
|
formats.Unlock();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user