forked from mia/Aegisub
Pick the CSRI renderer when the provider is created rather than every time subtitles are loaded
Originally committed to SVN as r6688.
This commit is contained in:
parent
9f87a2bacb
commit
30565530eb
2 changed files with 54 additions and 45 deletions
|
@ -49,9 +49,40 @@
|
|||
#include "video_context.h"
|
||||
#include "video_frame.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#define CSRIAPI
|
||||
#include "../../contrib/csri/include/csri/csri.h"
|
||||
#else
|
||||
#include <csri/csri.h>
|
||||
#endif
|
||||
|
||||
static wxMutex csri_mutex;
|
||||
|
||||
CSRISubtitlesProvider::CSRISubtitlesProvider(std::string type) : subType(type) {
|
||||
CSRISubtitlesProvider::CSRISubtitlesProvider(std::string type)
|
||||
: can_open_mem(true)
|
||||
, instance(0, csri_close)
|
||||
{
|
||||
wxMutexLocker lock(csri_mutex);
|
||||
|
||||
csri_rend *cur = NULL;
|
||||
|
||||
// Select renderer
|
||||
for (cur = csri_renderer_default(); cur; cur = csri_renderer_next(cur)) {
|
||||
std::string name(csri_renderer_info(cur)->name);
|
||||
if (name == type) {
|
||||
renderer = cur;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Matching renderer not found, fallback to default
|
||||
if (!renderer)
|
||||
renderer = csri_renderer_default();
|
||||
if (!renderer)
|
||||
throw "No CSRI renderer available, cannot show subtitles. Try installing one or switch to another subtitle provider.";
|
||||
|
||||
std::string name(csri_renderer_info(renderer)->name);
|
||||
can_open_mem = (name.find("vsfilter") == name.npos);
|
||||
}
|
||||
|
||||
CSRISubtitlesProvider::~CSRISubtitlesProvider() {
|
||||
|
@ -61,35 +92,12 @@ CSRISubtitlesProvider::~CSRISubtitlesProvider() {
|
|||
void CSRISubtitlesProvider::LoadSubtitles(AssFile *subs) {
|
||||
wxMutexLocker lock(csri_mutex);
|
||||
|
||||
// CSRI variables
|
||||
csri_rend *cur,*renderer=NULL;
|
||||
|
||||
// Select renderer
|
||||
bool canOpenMem = true;
|
||||
for (cur = csri_renderer_default();cur;cur=csri_renderer_next(cur)) {
|
||||
std::string name(csri_renderer_info(cur)->name);
|
||||
if (name == subType) {
|
||||
renderer = cur;
|
||||
if (name.find("vsfilter") != name.npos) canOpenMem = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Matching renderer not found, fallback to default
|
||||
if (!renderer) {
|
||||
renderer = csri_renderer_default();
|
||||
if (!renderer) {
|
||||
throw "No CSRI renderer available, cannot show subtitles. Try installing one or switch to another subtitle provider.";
|
||||
}
|
||||
}
|
||||
|
||||
// Open from memory
|
||||
if (canOpenMem) {
|
||||
if (can_open_mem) {
|
||||
std::vector<char> data;
|
||||
subs->SaveMemory(data);
|
||||
instance.reset(csri_open_mem(renderer,&data[0],data.size(),NULL), &csri_close);
|
||||
instance = csri_open_mem(renderer, &data[0], data.size(), NULL);
|
||||
}
|
||||
|
||||
// Open from disk
|
||||
else {
|
||||
if (tempfile.empty()) {
|
||||
|
@ -97,16 +105,14 @@ void CSRISubtitlesProvider::LoadSubtitles(AssFile *subs) {
|
|||
wxRemoveFile(tempfile);
|
||||
tempfile += ".ass";
|
||||
}
|
||||
subs->Save(tempfile,false,false,wxSTRING_ENCODING);
|
||||
instance.reset(csri_open_file(renderer,tempfile.utf8_str(),NULL), &csri_close);
|
||||
subs->Save(tempfile, false, false, wxSTRING_ENCODING);
|
||||
instance = csri_open_file(renderer, tempfile.utf8_str(), NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void CSRISubtitlesProvider::DrawSubtitles(AegiVideoFrame &dst,double time) {
|
||||
// Check if CSRI loaded properly
|
||||
if (!instance.get()) return;
|
||||
|
||||
wxMutexLocker lock(csri_mutex);
|
||||
if (!instance) return;
|
||||
|
||||
// Load data into frame
|
||||
csri_frame frame;
|
||||
|
@ -125,11 +131,13 @@ void CSRISubtitlesProvider::DrawSubtitles(AegiVideoFrame &dst,double time) {
|
|||
format.width = dst.w;
|
||||
format.height = dst.h;
|
||||
format.pixfmt = frame.pixfmt;
|
||||
int error = csri_request_fmt(instance.get(),&format);
|
||||
|
||||
wxMutexLocker lock(csri_mutex);
|
||||
int error = csri_request_fmt(instance, &format);
|
||||
if (error) return;
|
||||
|
||||
// Render
|
||||
csri_render(instance.get(),&frame,time);
|
||||
csri_render(instance, &frame, time);
|
||||
}
|
||||
|
||||
std::vector<std::string> CSRISubtitlesProvider::GetSubTypes() {
|
||||
|
|
|
@ -36,18 +36,16 @@
|
|||
|
||||
#ifdef WITH_CSRI
|
||||
|
||||
#include "include/aegisub/subtitles_provider.h"
|
||||
|
||||
#ifndef AGI_PRE
|
||||
#include <tr1/memory>
|
||||
#include <vector>
|
||||
#endif
|
||||
|
||||
#include "include/aegisub/subtitles_provider.h"
|
||||
#ifdef WIN32
|
||||
#define CSRIAPI
|
||||
#include "../../contrib/csri/include/csri/csri.h"
|
||||
#else
|
||||
#include <csri/csri.h>
|
||||
#endif
|
||||
#include <libaegisub/scoped_ptr.h>
|
||||
|
||||
typedef void csri_rend;
|
||||
typedef void csri_inst;
|
||||
|
||||
/// DOCME
|
||||
/// @class CSRISubtitlesProvider
|
||||
|
@ -55,12 +53,15 @@
|
|||
///
|
||||
/// DOCME
|
||||
class CSRISubtitlesProvider : public SubtitlesProvider {
|
||||
/// DOCME
|
||||
std::string subType;
|
||||
agi::scoped_holder<csri_inst*> instance;
|
||||
csri_rend *renderer;
|
||||
|
||||
/// DOCME
|
||||
std::tr1::shared_ptr<csri_inst> instance;
|
||||
/// VSFilter's implementation of csri_open_mem writes the file to disk then
|
||||
/// opens it with the standard file reader, and by writing the file ourselves
|
||||
/// we can skip a few pointless charset conversions
|
||||
bool can_open_mem;
|
||||
|
||||
/// Name of the file passed to renderers with can_open_mem false
|
||||
wxString tempfile;
|
||||
public:
|
||||
CSRISubtitlesProvider(std::string subType);
|
||||
|
|
Loading…
Reference in a new issue