forked from mia/Aegisub
Moved YV12->RGB32 conversion to video provider, before caching.
Originally committed to SVN as r1031.
This commit is contained in:
parent
ebc0e37a2d
commit
5d3442f567
|
@ -428,31 +428,22 @@ AegiVideoFrame VideoContext::GetFrame(int n,bool raw) {
|
||||||
// Current frame if -1
|
// Current frame if -1
|
||||||
if (n == -1) n = frame_n;
|
if (n == -1) n = frame_n;
|
||||||
|
|
||||||
// Get frame
|
// Get available formats
|
||||||
AegiVideoFrame frame = provider->GetFrame(n);
|
int formats = FORMAT_RGB32;
|
||||||
AegiVideoFrame *srcFrame = &frame;
|
if (yv12shader != 0 || OpenGLWrapper::UseShaders()) formats |= FORMAT_YV12;
|
||||||
|
|
||||||
// Convert to YV12 if it can't be handled
|
// Get frame
|
||||||
if (frame.format == FORMAT_YV12 && yv12shader == 0) {
|
AegiVideoFrame frame = provider->GetFrame(n,formats);
|
||||||
if (!OpenGLWrapper::UseShaders()) {
|
|
||||||
tempRGBFrame.w = frame.w;
|
|
||||||
tempRGBFrame.h = frame.h;
|
|
||||||
tempRGBFrame.pitch[0] = frame.w * 4;
|
|
||||||
tempRGBFrame.format = FORMAT_RGB32;
|
|
||||||
tempRGBFrame.ConvertFrom(frame);
|
|
||||||
srcFrame = &tempRGBFrame;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Raster subtitles if available/necessary
|
// Raster subtitles if available/necessary
|
||||||
if (!raw && subsProvider && subsProvider->CanRaster()) {
|
if (!raw && subsProvider && subsProvider->CanRaster()) {
|
||||||
tempFrame.CopyFrom(*srcFrame);
|
tempFrame.CopyFrom(frame);
|
||||||
subsProvider->DrawSubtitles(tempFrame,VFR_Input.GetTimeAtFrame(n,true,true)/1000.0);
|
subsProvider->DrawSubtitles(tempFrame,VFR_Input.GetTimeAtFrame(n,true,true)/1000.0);
|
||||||
return tempFrame;
|
return tempFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return pure frame
|
// Return pure frame
|
||||||
else return *srcFrame;
|
else return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,6 @@ private:
|
||||||
wxGLContext *glContext;
|
wxGLContext *glContext;
|
||||||
VideoFrameFormat vidFormat;
|
VideoFrameFormat vidFormat;
|
||||||
AegiVideoFrame tempFrame;
|
AegiVideoFrame tempFrame;
|
||||||
AegiVideoFrame tempRGBFrame;
|
|
||||||
|
|
||||||
wxString tempfile;
|
wxString tempfile;
|
||||||
VideoProvider *provider;
|
VideoProvider *provider;
|
||||||
|
|
|
@ -40,11 +40,11 @@
|
||||||
//////////////////////
|
//////////////////////
|
||||||
// Video Frame format
|
// Video Frame format
|
||||||
enum VideoFrameFormat {
|
enum VideoFrameFormat {
|
||||||
FORMAT_NONE,
|
FORMAT_NONE = 0,
|
||||||
FORMAT_RGB24,
|
FORMAT_RGB24 = 1,
|
||||||
FORMAT_RGB32,
|
FORMAT_RGB32 = 2,
|
||||||
FORMAT_YUY2,
|
FORMAT_YUY2 = 4,
|
||||||
FORMAT_YV12
|
FORMAT_YV12 = 8
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,12 +54,13 @@ VideoProvider::VideoProvider() {
|
||||||
// Destructor
|
// Destructor
|
||||||
VideoProvider::~VideoProvider() {
|
VideoProvider::~VideoProvider() {
|
||||||
ClearCache();
|
ClearCache();
|
||||||
|
tempRGBFrame.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/////////////
|
/////////////
|
||||||
// Get frame
|
// Get frame
|
||||||
const AegiVideoFrame VideoProvider::GetFrame(int n) {
|
const AegiVideoFrame VideoProvider::GetFrame(int n,int format) {
|
||||||
// See if frame is cached
|
// See if frame is cached
|
||||||
CachedFrame cached;
|
CachedFrame cached;
|
||||||
for (std::list<CachedFrame>::iterator cur=cache.begin();cur!=cache.end();cur++) {
|
for (std::list<CachedFrame>::iterator cur=cache.begin();cur!=cache.end();cur++) {
|
||||||
|
@ -73,8 +74,22 @@ const AegiVideoFrame VideoProvider::GetFrame(int n) {
|
||||||
|
|
||||||
// Not cached, retrieve it
|
// Not cached, retrieve it
|
||||||
const AegiVideoFrame frame = DoGetFrame(n);
|
const AegiVideoFrame frame = DoGetFrame(n);
|
||||||
Cache(n,frame);
|
const AegiVideoFrame *srcFrame = &frame;
|
||||||
return frame;
|
|
||||||
|
// Convert to compatible format
|
||||||
|
if (!(frame.format & format)) {
|
||||||
|
if (format & FORMAT_RGB32) tempRGBFrame.format = FORMAT_RGB32;
|
||||||
|
else throw _T("Unable to negotiate formats.");
|
||||||
|
tempRGBFrame.w = frame.w;
|
||||||
|
tempRGBFrame.h = frame.h;
|
||||||
|
tempRGBFrame.pitch[0] = frame.w * 4;
|
||||||
|
tempRGBFrame.ConvertFrom(frame);
|
||||||
|
srcFrame = &tempRGBFrame;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache frame
|
||||||
|
Cache(n,*srcFrame);
|
||||||
|
return *srcFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ class VideoProvider {
|
||||||
private:
|
private:
|
||||||
unsigned int cacheMax;
|
unsigned int cacheMax;
|
||||||
std::list<CachedFrame> cache;
|
std::list<CachedFrame> cache;
|
||||||
|
AegiVideoFrame tempRGBFrame;
|
||||||
|
|
||||||
void Cache(int n,const AegiVideoFrame frame);
|
void Cache(int n,const AegiVideoFrame frame);
|
||||||
AegiVideoFrame GetCachedFrame(int n);
|
AegiVideoFrame GetCachedFrame(int n);
|
||||||
|
@ -78,7 +79,7 @@ protected:
|
||||||
public:
|
public:
|
||||||
// Base methods
|
// Base methods
|
||||||
void GetFloatFrame(float* Buffer, int n); // Get frame as float
|
void GetFloatFrame(float* Buffer, int n); // Get frame as float
|
||||||
const AegiVideoFrame GetFrame(int n);
|
const AegiVideoFrame GetFrame(int n, int formatMask=FORMAT_RGB32);
|
||||||
VideoProvider();
|
VideoProvider();
|
||||||
virtual ~VideoProvider();
|
virtual ~VideoProvider();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue