From 73ff0e8f0231ffd1c5df9122d3aaf5684110443f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 20 Jan 2004 14:25:08 +0000 Subject: [PATCH] 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 --- src/tests/kits/media/Jamfile | 11 +- src/tests/kits/media/mediaFormats.cpp | 214 ++++++++++++++++++++++++++ 2 files changed, 221 insertions(+), 4 deletions(-) create mode 100644 src/tests/kits/media/mediaFormats.cpp diff --git a/src/tests/kits/media/Jamfile b/src/tests/kits/media/Jamfile index 6bc7137bbf..8a85d17e3a 100644 --- a/src/tests/kits/media/Jamfile +++ b/src/tests/kits/media/Jamfile @@ -1,14 +1,17 @@ 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 - : 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 notificationtest ; diff --git a/src/tests/kits/media/mediaFormats.cpp b/src/tests/kits/media/mediaFormats.cpp new file mode 100644 index 0000000000..39883e8f1d --- /dev/null +++ b/src/tests/kits/media/mediaFormats.cpp @@ -0,0 +1,214 @@ +/* +** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +*/ + + +#include + +#include +#include + + +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; +}