1 /*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
2  *
3  *  Use of this source code is governed by a BSD-style license that can
4  *  be found in the License.html file in the root of the source tree.
5  */
6 
7 //---------------------------------------------------------------------------
8 #define NO_WIN32_LEAN_AND_MEAN
9 #include <vcl.h>                        // WideCharToString
10 #undef NO_WIN32_LEAN_AND_MEAN
11 #include <ZenLib/Conf.h>
12 #pragma hdrstop
13 #include <windows.h>
14 #include <shlobj.h>
15 #include <vfw.h>                        // ICINFO
16 #include "Utils.h"
17 #include "Preferences.h"
18 #include <ZenLib/Ztring.h>
19 #include <ZenLib/File.h>
20 using namespace ZenLib;
21 //---------------------------------------------------------------------------
22 
23 //---------------------------------------------------------------------------
24 ZtringListList *Audio_Temp;
25 //---------------------------------------------------------------------------
26 
27 //---------------------------------------------------------------------------
28 //Used to know audio
acmDriverEnumCallback(HACMDRIVERID hadid,DWORD dwInstance,DWORD fdwSupport)29 bool CALLBACK acmDriverEnumCallback (HACMDRIVERID hadid, DWORD dwInstance, DWORD fdwSupport)
30 {
31     Audio_Temp->Separator_Set(0, __T("\r\n"));
32     Audio_Temp->Separator_Set(1, __T("aaa"));
33     HACMDRIVER had;
34     ACMDRIVERDETAILS    add;
35     ACMFORMATTAGDETAILS aftd;
36 
37     memset (&add, 0, sizeof (ACMDRIVERDETAILS));
38     add.cbStruct = sizeof (ACMDRIVERDETAILS);
39     acmDriverDetails (hadid, &add, 0);
40 
41     if (acmDriverOpen (&had, hadid, 0))
42         return TRUE;                    // Error, but go to next
43 
44     for (DWORD i=0 ; i<add.cFormatTags ; i++)
45     {
46         memset (&aftd, 0, sizeof (ACMFORMATTAGDETAILS));
47         aftd.cbStruct = sizeof (ACMFORMATTAGDETAILS);
48         aftd.dwFormatTagIndex = i;
49         if (acmFormatTagDetails (had, &aftd, ACM_FORMATTAGDETAILSF_INDEX))                        // Error
50             break;
51 
52         _TCHAR C1[30]; _itot(aftd.dwFormatTag, C1, 16);
53         Ztring Codec=C1;
54         while (Codec.size()<4)
55             Codec=Ztring(__T("0"))+Codec;
56         Codec.MakeUpperCase();
57         if (Audio_Temp->Find(Codec)<0)
58         {
59             (*Audio_Temp)(Audio_Temp->size(), 0)=Codec;
60             (*Audio_Temp)(Audio_Temp->size()-1, 2)=aftd.szFormatTag;
61         }
62         (*Audio_Temp)(Codec, 4)=__T("Yes");
63     }
64     acmDriverClose (had, 0);
65     return TRUE;                        // Finished with this driver, go to next
66 }
67 
68 
69 //---------------------------------------------------------------------------
Codecs_Enumerate(ZenLib::ZtringListList & Video,ZenLib::ZtringListList & Audio)70 void Codecs_Enumerate(ZenLib::ZtringListList &Video, ZenLib::ZtringListList &Audio)
71 {
72     Audio_Temp=&Audio;
73 
74     //Enumerate VFW Video codecs
75     ICINFO  icinfo;
76     int     count=0;
77 
78      while (ICInfo (ICTYPE_VIDEO, count, &icinfo))
79     {
80         Ztring Codec;
81         Codec.From_Local((char *)&icinfo.fccHandler, 0, 4);
82         Codec.MakeUpperCase();
83         if (Video.Find(Codec)<0)
84         {
85             Video(Video.size(), 0).From_Local((char *)&icinfo.fccHandler, 0, 4);
86             Video(Video.size()-1, 2).From_Local((char *)&icinfo.fccType, 0, 4);
87             Video(Video.size()-1, 3).From_Unicode(icinfo.szDriver);
88             Video(Video.size()-1, 4)=__T("Yes");
89         }
90         else
91         {
92             Video(Codec, 4)=__T("Yes");
93         }
94         count++;
95     }
96 
97     //Enumerate VFW Audio codecs with a callback
98     acmDriverEnum ((ACMDRIVERENUMCB)&acmDriverEnumCallback, 0, 0);
99     Sleep (200); //We MUST wait for acmDriverEnum :(
100 
101 }
102 
103 //---------------------------------------------------------------------------
Debug_Header_Create(const ZenLib::Ztring & FileName,void * Handle)104 void Debug_Header_Create(const ZenLib::Ztring &FileName, void* Handle)
105 {
106     //Reading file
107     File FB1;
108     FB1.Open(FileName);
109     int8u* Tout=new int8u[524288];
110     int Capture=FB1.Read(Tout, 524288);
111 
112     //Writing file
113     File FB2;
114     FB2.Create(FileName+__T(".header"), true);
115     FB2.Write(Tout, Capture);
116 
117     //Purge
118     delete [] Tout;
119     Application->MessageBox(Prefs->Translate(__T("Send HeaderFile")).c_str(), Prefs->Translate(__T("Header file")).c_str());
120 }
121 
122