Moved YV12->RGB32 conversion to video provider, before caching.

Originally committed to SVN as r1031.
This commit is contained in:
Rodrigo Braz Monteiro 2007-04-08 18:12:51 +00:00
parent ebc0e37a2d
commit 5d3442f567
5 changed files with 32 additions and 26 deletions

View file

@ -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;
} }

View file

@ -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;

View file

@ -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
}; };

View file

@ -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;
} }

View file

@ -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();