00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <mxcpcBufferedMxPEGVideoRenderer.h>
00021 #include <mxcpcVideoDisplay.h>
00022
00023
00024
00025 mxcpcBufferedMxPEGVideoRenderer
00026 ::mxcpcBufferedMxPEGVideoRenderer(mxcpcVideoDisplay *viewer) {
00027
00028 Viewer = viewer;
00029
00030 CenterX = CenterY = 0;
00031 OffsetX = OffsetY = 0;
00032
00033 FrameCount = 0;
00034
00035 FramerateMeasureInterval = -1;
00036 FramerateMeasureTime.start();
00037 FramerateFrameCount = 0;
00038 }
00039
00040
00041 mxcpcBufferedMxPEGVideoRenderer::~mxcpcBufferedMxPEGVideoRenderer() {
00042
00043 }
00044
00045
00046
00047
00048
00049 void mxcpcBufferedMxPEGVideoRenderer
00050 ::setFramerateMeasureModeEnabled(bool enabled, int measure_interval_ms) {
00051
00052 if(!enabled) FramerateMeasureInterval = -1;
00053 else {
00054 FramerateMeasureInterval = measure_interval_ms;
00055 if(FramerateMeasureInterval < 0) FramerateMeasureInterval = 10000;
00056 FramerateMeasureTime.start();
00057 FramerateFrameCount = 0;
00058 }
00059 }
00060
00061
00062 int mxcpcBufferedMxPEGVideoRenderer::getFrameCount(void) {
00063
00064 return(FrameCount);
00065 }
00066
00067
00068 void mxcpcBufferedMxPEGVideoRenderer::videoResolutionChanged(int width,
00069 int height) {
00070
00071 mxcpcBufferedMxPEGDecoderBackEnd::videoResolutionChanged(width, height);
00072
00073 if(PixelBuffer) {
00074 CenterX = Width/2; OffsetX = Width - CenterX;
00075 CenterY = Height/2; OffsetY = Height - CenterY;
00076 }
00077 else {
00078 CenterX = CenterY = 0;
00079 OffsetX = OffsetY = 0;
00080 }
00081
00082 Viewer->updateGL();
00083 }
00084
00085
00086 void mxcpcBufferedMxPEGVideoRenderer::errorEncountered(void) {
00087
00088 }
00089
00090
00091 void mxcpcBufferedMxPEGVideoRenderer::frameComplete(void) {
00092
00093 int WinWidth, WinHeight;
00094 int elapsed;
00095 float fps;
00096
00097
00098 fps = -1.0f;
00099 if(FramerateMeasureInterval >= 0) {
00100
00101 FramerateFrameCount++;
00102
00103 if((elapsed = FramerateMeasureTime.elapsed()) >= FramerateMeasureInterval) {
00104
00105 fps = (float)FramerateFrameCount * 1000.0f / (float)elapsed;
00106
00107 FramerateMeasureTime.start();
00108 FramerateFrameCount = 0;
00109 }
00110 }
00111
00112 if(!PixelBuffer) {
00113
00114 if(fps >= 0.0f) emit framerateMeasured(fps);
00115
00116 return;
00117 }
00118
00119 WinWidth = Viewer->width();
00120 WinHeight = Viewer->height();
00121
00122 Viewer->makeCurrent();
00123
00124 if( false
00125 && ( ((WinWidth > Width ? WinWidth - Width : Width - WinWidth) > 2)
00126 || ((WinHeight > Height ? WinHeight - Height : Height - WinHeight) > 2)
00127 )
00128 ) {
00129
00130 glRasterPos2i(WinWidth/2, WinHeight/2);
00131 glBitmap(0, 0,
00132 0.0f, 0.0f,
00133 (GLfloat)(-(WinWidth/2)), (GLfloat)(-(WinHeight/2 + 1)),
00134 0);
00135 glPixelZoom((GLfloat)WinWidth / (GLfloat)Width,
00136 (GLfloat)WinHeight / (GLfloat)Height);
00137 glDrawPixels(Width, Height,
00138 GL_RGB, GL_UNSIGNED_BYTE,
00139 PixelBuffer + PixelBufferOffset);
00140 glPixelZoom(1.0f, 1.0f);
00141 }
00142
00143 else {
00144
00145 glRasterPos2i(WinWidth/2, WinHeight/2);
00146 glBitmap(0, 0,
00147 0.0f, 0.0f,
00148 (GLfloat)-CenterX, (GLfloat)-CenterY,
00149 0);
00150 glDrawPixels(Width, Height,
00151 GL_RGB, GL_UNSIGNED_BYTE,
00152 PixelBuffer + PixelBufferOffset);
00153 }
00154
00155 glFlush();
00156
00157 FrameCount++;
00158 if(FrameCount < 0) FrameCount = 0;
00159
00160 if(fps >= 0.0f) emit framerateMeasured(fps);
00161 }
00162
00163
00164 void mxcpcBufferedMxPEGVideoRenderer::videoTileReceived(void) {
00165
00166 }
00167