1
// Copyright (c) 2006, Rodrigo Braz Monteiro
2
// All rights reserved.
4
// Redistribution and use in source and binary forms, with or without
5
// modification, are permitted provided that the following conditions are met:
7
// * Redistributions of source code must retain the above copyright notice,
8
// this list of conditions and the following disclaimer.
9
// * Redistributions in binary form must reproduce the above copyright notice,
10
// this list of conditions and the following disclaimer in the documentation
11
// and/or other materials provided with the distribution.
12
// * Neither the name of the Aegisub Group nor the names of its contributors
13
// may be used to endorse or promote products derived from this software
14
// without specific prior written permission.
16
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
// POSSIBILITY OF SUCH DAMAGE.
28
// -----------------------------------------------------------------------------
32
// Website: http://aegisub.cellosoft.com
33
// Contact: mailto:zeratul@cellosoft.com
41
#include "video_provider_manager.h"
42
#include "video_provider_dummy.h"
46
#include "video_provider_avs.h"
48
#ifdef WITH_DIRECTSHOW
49
#include "video_provider_dshow.h"
51
#ifdef WITH_FFMPEGSOURCE
52
#include "video_provider_ffmpegsource.h"
54
#include "video_provider_dummy.h"
55
#include "video_provider_cache.h"
60
VideoProvider *VideoProviderFactoryManager::GetProvider(wxString video) {
61
// First check special case of dummy video
62
if (video.StartsWith(_T("?dummy:"))) {
63
#if wxCHECK_VERSION(2,9,0)
64
return new DummyVideoProvider(video.wc_str());
66
return new DummyVideoProvider(video.c_str());
71
wxArrayString list = GetFactoryList(Options.AsText(_T("Video provider")));
74
if (list.Count() == 0) throw _T("No video providers are available.");
78
for (unsigned int i=0;i<list.Count();i++) {
81
#if wxCHECK_VERSION(2,9,0)
82
VideoProvider *provider = GetFactory(list[i])->CreateProvider(video.wc_str());
84
VideoProvider *provider = GetFactory(list[i])->CreateProvider(video.c_str());
88
if (provider->GetDesiredCacheSize()) {
89
provider = new VideoProviderCache(provider);
94
catch (VideoProvider::CancelVideoLoadException &) { throw; }
95
catch (wxString err) { error += list[i] + _T(" factory: ") + err + _T("\n"); }
96
catch (const wxChar *err) { error += list[i] + _T(" factory: ") + wxString(err) + _T("\n"); }
97
catch (...) { error += list[i] + _T(" factory: Unknown error\n"); }
105
//////////////////////////
106
// Register all providers
107
void VideoProviderFactoryManager::RegisterProviders() {
109
RegisterFactory(new AvisynthVideoProviderFactory(),_T("Avisynth"));
111
#ifdef WITH_DIRECTSHOW
112
RegisterFactory(new DirectShowVideoProviderFactory(),_T("DirectShow"));
114
#ifdef WITH_FFMPEGSOURCE
115
RegisterFactory(new FFmpegSourceVideoProviderFactory(),_T("FFmpegSource"));
120
///////////////////////
121
// Clear all providers
122
void VideoProviderFactoryManager::ClearProviders() {
129
template <class VideoProviderFactory> std::map<wxString,VideoProviderFactory*>* FactoryManager<VideoProviderFactory>::factories=NULL;