1*73ff0e8fSAxel Dörfler /* 2*73ff0e8fSAxel Dörfler ** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 3*73ff0e8fSAxel Dörfler ** Distributed under the terms of the OpenBeOS License. 4*73ff0e8fSAxel Dörfler */ 5*73ff0e8fSAxel Dörfler 6*73ff0e8fSAxel Dörfler 7*73ff0e8fSAxel Dörfler #include <MediaFormats.h> 8*73ff0e8fSAxel Dörfler 9*73ff0e8fSAxel Dörfler #include <stdio.h> 10*73ff0e8fSAxel Dörfler #include <string.h> 11*73ff0e8fSAxel Dörfler 12*73ff0e8fSAxel Dörfler 13*73ff0e8fSAxel Dörfler static const char * 14*73ff0e8fSAxel Dörfler get_family_string(media_format_family family) 15*73ff0e8fSAxel Dörfler { 16*73ff0e8fSAxel Dörfler switch (family) { 17*73ff0e8fSAxel Dörfler case B_BEOS_FORMAT_FAMILY: 18*73ff0e8fSAxel Dörfler return "BeOS"; 19*73ff0e8fSAxel Dörfler case B_ANY_FORMAT_FAMILY: 20*73ff0e8fSAxel Dörfler return "any"; 21*73ff0e8fSAxel Dörfler case B_QUICKTIME_FORMAT_FAMILY: 22*73ff0e8fSAxel Dörfler return "QuickTime"; 23*73ff0e8fSAxel Dörfler case B_AVI_FORMAT_FAMILY: 24*73ff0e8fSAxel Dörfler return "AVI"; 25*73ff0e8fSAxel Dörfler case B_ASF_FORMAT_FAMILY: 26*73ff0e8fSAxel Dörfler return "ASF"; 27*73ff0e8fSAxel Dörfler case B_MPEG_FORMAT_FAMILY: 28*73ff0e8fSAxel Dörfler return "MPEG"; 29*73ff0e8fSAxel Dörfler case B_WAV_FORMAT_FAMILY: 30*73ff0e8fSAxel Dörfler return "WAV"; 31*73ff0e8fSAxel Dörfler case B_AIFF_FORMAT_FAMILY: 32*73ff0e8fSAxel Dörfler return "AIFF"; 33*73ff0e8fSAxel Dörfler case B_AVR_FORMAT_FAMILY: 34*73ff0e8fSAxel Dörfler return "AVR"; 35*73ff0e8fSAxel Dörfler case B_MISC_FORMAT_FAMILY: 36*73ff0e8fSAxel Dörfler return "misc"; 37*73ff0e8fSAxel Dörfler // these are OpenBeOS specific: 38*73ff0e8fSAxel Dörfler // case B_OGG_FORMAT_FAMILY: 39*73ff0e8fSAxel Dörfler // return "OGG"; 40*73ff0e8fSAxel Dörfler // case B_META_FORMAT_FAMILY: 41*73ff0e8fSAxel Dörfler // return "meta"; 42*73ff0e8fSAxel Dörfler default: 43*73ff0e8fSAxel Dörfler return "unknown"; 44*73ff0e8fSAxel Dörfler } 45*73ff0e8fSAxel Dörfler } 46*73ff0e8fSAxel Dörfler 47*73ff0e8fSAxel Dörfler 48*73ff0e8fSAxel Dörfler static const char * 49*73ff0e8fSAxel Dörfler get_mpeg_string(int32 id) 50*73ff0e8fSAxel Dörfler { 51*73ff0e8fSAxel Dörfler switch (id) { 52*73ff0e8fSAxel Dörfler case B_MPEG_ANY: 53*73ff0e8fSAxel Dörfler return "any"; 54*73ff0e8fSAxel Dörfler case B_MPEG_1_AUDIO_LAYER_1: 55*73ff0e8fSAxel Dörfler return "mpeg 1 audio layer 1"; 56*73ff0e8fSAxel Dörfler case B_MPEG_1_AUDIO_LAYER_2: 57*73ff0e8fSAxel Dörfler return "mpeg 1 audio layer 2"; 58*73ff0e8fSAxel Dörfler case B_MPEG_1_AUDIO_LAYER_3: 59*73ff0e8fSAxel Dörfler return "mpeg 1 audio layer 3 (mp3)"; 60*73ff0e8fSAxel Dörfler case B_MPEG_1_VIDEO: 61*73ff0e8fSAxel Dörfler return "mpeg 1 video"; 62*73ff0e8fSAxel Dörfler // these are OpenBeOS specific: 63*73ff0e8fSAxel Dörfler /* case B_MPEG_2_AUDIO_LAYER_1: 64*73ff0e8fSAxel Dörfler return "mpeg 2 audio layer 1"; 65*73ff0e8fSAxel Dörfler case B_MPEG_2_AUDIO_LAYER_2: 66*73ff0e8fSAxel Dörfler return "mpeg 2 audio layer 2"; 67*73ff0e8fSAxel Dörfler case B_MPEG_2_AUDIO_LAYER_3: 68*73ff0e8fSAxel Dörfler return "mpeg 2 audio layer 3"; 69*73ff0e8fSAxel Dörfler case B_MPEG_2_VIDEO: 70*73ff0e8fSAxel Dörfler return "mpeg 2 video"; 71*73ff0e8fSAxel Dörfler case B_MPEG_2_5_AUDIO_LAYER_1: 72*73ff0e8fSAxel Dörfler return "mpeg 2.5 audio layer 1"; 73*73ff0e8fSAxel Dörfler case B_MPEG_2_5_AUDIO_LAYER_2: 74*73ff0e8fSAxel Dörfler return "mpeg 2.5 audio layer 2"; 75*73ff0e8fSAxel Dörfler case B_MPEG_2_5_AUDIO_LAYER_3: 76*73ff0e8fSAxel Dörfler return "mpeg 2.5 audio layer 3"; 77*73ff0e8fSAxel Dörfler */ default: 78*73ff0e8fSAxel Dörfler return "unknown"; 79*73ff0e8fSAxel Dörfler } 80*73ff0e8fSAxel Dörfler } 81*73ff0e8fSAxel Dörfler 82*73ff0e8fSAxel Dörfler 83*73ff0e8fSAxel Dörfler static void 84*73ff0e8fSAxel Dörfler print_fourcc(uint32 id) 85*73ff0e8fSAxel Dörfler { 86*73ff0e8fSAxel Dörfler char string[5]; 87*73ff0e8fSAxel Dörfler for (int32 i = 0; i < 4; i++) { 88*73ff0e8fSAxel Dörfler uint8 c = uint8((id >> (24 - i * 8)) & 0xff); 89*73ff0e8fSAxel Dörfler if (c < ' ' || c > 0x7f) 90*73ff0e8fSAxel Dörfler string[i] = '.'; 91*73ff0e8fSAxel Dörfler else 92*73ff0e8fSAxel Dörfler string[i] = (char)c; 93*73ff0e8fSAxel Dörfler } 94*73ff0e8fSAxel Dörfler string[4] = '\0'; 95*73ff0e8fSAxel Dörfler printf("%s (0x%lx)\n", string, id); 96*73ff0e8fSAxel Dörfler } 97*73ff0e8fSAxel Dörfler 98*73ff0e8fSAxel Dörfler 99*73ff0e8fSAxel Dörfler void 100*73ff0e8fSAxel Dörfler dump_media_format_description(media_format_description &description) 101*73ff0e8fSAxel Dörfler { 102*73ff0e8fSAxel Dörfler printf("media_format_description:\n"); 103*73ff0e8fSAxel Dörfler printf("\tfamily:\t%s\n", get_family_string(description.family)); 104*73ff0e8fSAxel Dörfler 105*73ff0e8fSAxel Dörfler switch (description.family) { 106*73ff0e8fSAxel Dörfler case B_BEOS_FORMAT_FAMILY: 107*73ff0e8fSAxel Dörfler printf("\tformat:\t"); 108*73ff0e8fSAxel Dörfler print_fourcc(description.u.beos.format); 109*73ff0e8fSAxel Dörfler break; 110*73ff0e8fSAxel Dörfler case B_AVI_FORMAT_FAMILY: 111*73ff0e8fSAxel Dörfler case B_AIFF_FORMAT_FAMILY: 112*73ff0e8fSAxel Dörfler case B_WAV_FORMAT_FAMILY: 113*73ff0e8fSAxel Dörfler printf("\tcodec:\t"); 114*73ff0e8fSAxel Dörfler print_fourcc(description.u.avi.codec); 115*73ff0e8fSAxel Dörfler break; 116*73ff0e8fSAxel Dörfler case B_AVR_FORMAT_FAMILY: 117*73ff0e8fSAxel Dörfler printf("\tid:\t"); 118*73ff0e8fSAxel Dörfler print_fourcc(description.u.avr.id); 119*73ff0e8fSAxel Dörfler break; 120*73ff0e8fSAxel Dörfler case B_QUICKTIME_FORMAT_FAMILY: 121*73ff0e8fSAxel Dörfler printf("\tcodec:\t"); 122*73ff0e8fSAxel Dörfler print_fourcc(description.u.quicktime.codec); 123*73ff0e8fSAxel Dörfler printf("\tvendor:\t"); 124*73ff0e8fSAxel Dörfler print_fourcc(description.u.quicktime.vendor); 125*73ff0e8fSAxel Dörfler break; 126*73ff0e8fSAxel Dörfler case B_MISC_FORMAT_FAMILY: 127*73ff0e8fSAxel Dörfler printf("\tcodec:\t\t"); 128*73ff0e8fSAxel Dörfler print_fourcc(description.u.misc.file_format); 129*73ff0e8fSAxel Dörfler printf("\tfile format:\t"); 130*73ff0e8fSAxel Dörfler print_fourcc(description.u.misc.codec); 131*73ff0e8fSAxel Dörfler break; 132*73ff0e8fSAxel Dörfler case B_MPEG_FORMAT_FAMILY: 133*73ff0e8fSAxel Dörfler printf("\ttype:\t%s\n", get_mpeg_string(description.u.mpeg.id)); 134*73ff0e8fSAxel Dörfler break; 135*73ff0e8fSAxel Dörfler case B_ASF_FORMAT_FAMILY: 136*73ff0e8fSAxel Dörfler // note, this is endian depended - you shouldn't do it this way for real... 137*73ff0e8fSAxel Dörfler printf("\tguid:\t0x%Lx%Lx\n", *(uint64 *)&description.u.asf.guid.data[0], *(uint64 *)&description.u.asf.guid.data[8]); 138*73ff0e8fSAxel Dörfler default: 139*73ff0e8fSAxel Dörfler break; 140*73ff0e8fSAxel Dörfler } 141*73ff0e8fSAxel Dörfler } 142*73ff0e8fSAxel Dörfler 143*73ff0e8fSAxel Dörfler 144*73ff0e8fSAxel Dörfler int 145*73ff0e8fSAxel Dörfler main(int argc, char **argv) 146*73ff0e8fSAxel Dörfler { 147*73ff0e8fSAxel Dörfler BMediaFormats formats; 148*73ff0e8fSAxel Dörfler 149*73ff0e8fSAxel Dörfler status_t status = formats.InitCheck(); 150*73ff0e8fSAxel Dörfler if (status != B_OK) { 151*73ff0e8fSAxel Dörfler fprintf(stderr, "BMediaFormats::InitCheck() failed: %s\n", strerror(status)); 152*73ff0e8fSAxel Dörfler return -1; 153*73ff0e8fSAxel Dörfler } 154*73ff0e8fSAxel Dörfler 155*73ff0e8fSAxel Dörfler media_format format; 156*73ff0e8fSAxel Dörfler status = formats.GetAVIFormatFor('DIVX', &format, B_MEDIA_ENCODED_VIDEO); 157*73ff0e8fSAxel Dörfler if (status != B_OK) { 158*73ff0e8fSAxel Dörfler fprintf(stderr, "BMediaFormats::GetAVIFormatFor() failed: %s\n", strerror(status)); 159*73ff0e8fSAxel Dörfler return -1; 160*73ff0e8fSAxel Dörfler } 161*73ff0e8fSAxel Dörfler 162*73ff0e8fSAxel Dörfler media_format_description description; 163*73ff0e8fSAxel Dörfler status = formats.GetCodeFor(format, B_AVI_FORMAT_FAMILY, &description); 164*73ff0e8fSAxel Dörfler if (status != B_OK) { 165*73ff0e8fSAxel Dörfler fprintf(stderr, "BMediaFormats::GetCodeFor() failed: %s\n", strerror(status)); 166*73ff0e8fSAxel Dörfler return -1; 167*73ff0e8fSAxel Dörfler } 168*73ff0e8fSAxel Dörfler dump_media_format_description(description); 169*73ff0e8fSAxel Dörfler 170*73ff0e8fSAxel Dörfler char desc[256]; 171*73ff0e8fSAxel Dörfler string_for_format(format, desc, sizeof(desc)); 172*73ff0e8fSAxel Dörfler printf("\tformat:\t%s\n", desc); 173*73ff0e8fSAxel Dörfler 174*73ff0e8fSAxel Dörfler status = formats.GetCodeFor(format, B_MPEG_FORMAT_FAMILY, &description); 175*73ff0e8fSAxel Dörfler if (status == B_OK) { 176*73ff0e8fSAxel Dörfler fprintf(stderr, "BMediaFormats::GetCodeFor() succeded with wrong family!\n"); 177*73ff0e8fSAxel Dörfler return -1; 178*73ff0e8fSAxel Dörfler } 179*73ff0e8fSAxel Dörfler 180*73ff0e8fSAxel Dörfler puts("\n***** all supported formats *****"); 181*73ff0e8fSAxel Dörfler 182*73ff0e8fSAxel Dörfler // Rewind() should only work when the formats object is locked 183*73ff0e8fSAxel Dörfler status = formats.RewindFormats(); 184*73ff0e8fSAxel Dörfler if (status == B_OK) { 185*73ff0e8fSAxel Dörfler fprintf(stderr, "BMediaFormats::RewindFormats() succeded unlocked!\n"); 186*73ff0e8fSAxel Dörfler return -1; 187*73ff0e8fSAxel Dörfler } 188*73ff0e8fSAxel Dörfler 189*73ff0e8fSAxel Dörfler if (!formats.Lock()) { 190*73ff0e8fSAxel Dörfler fprintf(stderr, "BMediaFormats::Lock() failed!\n"); 191*73ff0e8fSAxel Dörfler return -1; 192*73ff0e8fSAxel Dörfler } 193*73ff0e8fSAxel Dörfler 194*73ff0e8fSAxel Dörfler status = formats.RewindFormats(); 195*73ff0e8fSAxel Dörfler if (status != B_OK) { 196*73ff0e8fSAxel Dörfler fprintf(stderr, "BMediaFormats::RewindFormats() failed: %s\n", strerror(status)); 197*73ff0e8fSAxel Dörfler return -1; 198*73ff0e8fSAxel Dörfler } 199*73ff0e8fSAxel Dörfler 200*73ff0e8fSAxel Dörfler int32 count = 0; 201*73ff0e8fSAxel Dörfler while ((status = formats.GetNextFormat(&format, &description)) == B_OK) { 202*73ff0e8fSAxel Dörfler dump_media_format_description(description); 203*73ff0e8fSAxel Dörfler string_for_format(format, desc, sizeof(desc)); 204*73ff0e8fSAxel Dörfler printf("\tformat:\t%s\n", desc); 205*73ff0e8fSAxel Dörfler count++; 206*73ff0e8fSAxel Dörfler } 207*73ff0e8fSAxel Dörfler if (status != B_BAD_INDEX) 208*73ff0e8fSAxel Dörfler fprintf(stderr, "BMediaFormats::GetNextFormat() failed: %s\n", strerror(status)); 209*73ff0e8fSAxel Dörfler 210*73ff0e8fSAxel Dörfler printf("***** %ld supported formats *****\n", count); 211*73ff0e8fSAxel Dörfler 212*73ff0e8fSAxel Dörfler formats.Unlock(); 213*73ff0e8fSAxel Dörfler return 0; 214*73ff0e8fSAxel Dörfler } 215