Recognizes if input is ogg or not.
[xiph.git] / oggds / common.cpp
blob71bd5100213f442dd0fc419dfd49e36eaa2e95ca
1 /*******************************************************************************
2 * *
3 * This file is part of the Ogg Vorbis DirectShow filter collection *
4 * *
5 * Copyright (c) 2001, Tobias Waldvogel *
6 * All rights reserved. *
7 * *
8 * Redistribution and use in source and binary forms, with or without *
9 * modification, are permitted provided that the following conditions are met: *
10 * *
11 * - Redistributions of source code must retain the above copyright notice, *
12 * this list of conditions and the following disclaimer. *
13 * *
14 * - Redistributions in binary form must reproduce the above copyright notice, *
15 * this list of conditions and the following disclaimer in the documentation *
16 * and/or other materials provided with the distribution. *
17 * *
18 * - The names of the contributors may not be used to endorse or promote *
19 * products derived from this software without specific prior written *
20 * permission. *
21 * *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" *
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE *
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF *
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN *
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) *
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *
32 * POSSIBILITY OF SUCH DAMAGE. *
33 * *
34 *******************************************************************************/
36 #include "common.h"
38 static wchar_t wzCnvtBuf[256];
39 static char szCnvtBuf[256];
41 // Used to convert the time from the chapter comments
42 bool StringToReferenceTime(char* sTime, REFERENCE_TIME* rtTime)
44 int i = strlen(sTime);
45 REFERENCE_TIME mult = 1;
47 *rtTime = 0;
49 while (i > 0)
51 i--;
53 if (sTime[i] == '.')
55 if (*rtTime > 10000000 || mult > 10000000) // if already bigger than one second in reference time
56 return false; // the '.' is unexpected
57 *rtTime *= (REFERENCE_TIME)10000000;
58 *rtTime /= mult;
59 mult = 10000000;
61 else if (sTime[i] == ':')
63 if (mult < 10000000)
65 *rtTime *= 10000000;
66 mult = 600000000;
68 else if (mult == 1000000000)
69 mult = 600000000;
70 else if (mult == 60000000000)
71 mult = 36000000000;
72 else return false;
74 else
76 if (sTime[i] < '0' || sTime[i] > '9')
77 return false;
79 *rtTime += (sTime[i] - '0') * mult;
80 mult *= 10;
83 return true;
86 void CopyOggPacket(ogg_packet* dop, ogg_packet* sop)
88 dop->packetno = sop->packetno;
89 dop->granulepos = sop->granulepos;
90 dop->b_o_s = sop->b_o_s;
91 dop->e_o_s = sop->e_o_s;
92 dop->bytes = sop->bytes;
93 dop->packet = (BYTE*) malloc(sop->bytes);
94 memcpy(dop->packet, sop->packet, sop->bytes);
97 // Searches for the "LANGUAGE" tag and returns the corresponding CLSID
98 int GetLCIDFromComment(vorbis_comment* pvc)
100 char* pLang = vorbis_comment_query(pvc, "LANGUAGE", 0);
101 if (!pLang)
102 return 0;
104 if (strcmp(pLang, "off") == 0)
105 return 9; // Means English. If it would be 0 media player doesn't select the dummy stream
107 char sStr[128];
108 int iLen = strlen(pLang);
110 // Bring to standard form: First letter capital
111 strcpy(sStr, pLang);
112 if ((*sStr >= 'a') && (*sStr <= 'z'))
113 *sStr -= 'a' - 'A';
114 if (iLen>1) _strlwr(sStr+1);
116 for (int i=0; i<SIZEOF_ARRAY(aLCID); i++)
118 int iLCIDLen = strlen(aLCID[i].caption);
119 if (iLCIDLen <= iLen)
120 if (strncmp(aLCID[i].caption, sStr, iLCIDLen) == 0)
121 return aLCID[i].id;
124 return 0;