#define OPTIONTYPE_TEXT 1\r
#define OPTIONTYPE_INT 2\r
\r
+#define BENCHMARK_FPS\r
+\r
//ULLONG htonll(ULLONG a);\r
//ULLONG ntohll(ULLONG a);\r
void MILLISLEEP(ULONG a);\r
+long long getTimeMS();\r
\r
#ifdef WIN32\r
\r
#endif\r
}\r
\r
+long long getTimeMS() {\r
+ struct timespec ts;\r
+ clock_gettime(CLOCK_MONOTONIC, &ts);\r
+ return ts.tv_sec*1000+ts.tv_nsec/1000000LL;\r
+}\r
+\r
int min(UINT a, int b)\r
{\r
if (a > b) return b;\r
\r
\r
\r
-long long getTimeMS() {\r
- struct timespec ts;\r
- clock_gettime(CLOCK_MONOTONIC, &ts);\r
- return ts.tv_sec*1000+ts.tv_nsec/1000000LL;\r
-}\r
+\r
\r
\r
\r
\r
\r
\r
+\r
//Now we will create the Screen\r
screen = (Surface*) new SurfaceOpenGL(Surface::SCREEN);\r
\r
glBindAttribLocation(osd_program,0,"vec_pos");\r
glBindAttribLocation(osd_program,1,"tex_coord");\r
\r
- osd_sampler_loc=glGetUniformLocation(osd_program,"texture");\r
+\r
\r
glLinkProgram(osd_program);\r
+\r
+\r
+\r
GLint link_status;\r
- glGetShaderiv(osd_program,GL_LINK_STATUS, &link_status);\r
+ glGetProgramiv(osd_program,GL_LINK_STATUS, &link_status);\r
\r
if (!link_status) {\r
char buffer[1024];\r
glDeleteProgram(osd_program);\r
return 0;\r
}\r
+\r
+ osd_sampler_loc=glGetUniformLocation(osd_program,"texture");\r
+ // Log::getInstance()->log("OSD", Log::WARN, "uniform location %x %x",osd_sampler_loc,glGetError());\r
+\r
// create the program for yuv frame rendering\r
frame_shader=CreateShader(frame_frag_shader, GL_FRAGMENT_SHADER);\r
\r
glBindAttribLocation(frame_program,0,"vec_pos");\r
glBindAttribLocation(frame_program,1,"tex_coord");\r
\r
- frame_sampler_locY=glGetUniformLocation(frame_program,"textureY");\r
- //frame_sampler_locU=glGetUniformLocation(frame_program,"textureU");\r
- // frame_sampler_locV=glGetUniformLocation(frame_program,"textureV");\r
+\r
\r
glLinkProgram(frame_program);\r
//GLint link_status;\r
- glGetShaderiv(frame_program,GL_LINK_STATUS, &link_status);\r
+ glGetProgramiv(frame_program,GL_LINK_STATUS, &link_status);\r
\r
if (!link_status) {\r
char buffer[1024];\r
return 0;\r
}\r
\r
+ frame_sampler_locY=glGetUniformLocation(frame_program,"textureY");\r
+ // Log::getInstance()->log("OSD", Log::WARN, "uniform location %x %x",frame_sampler_locY,glGetError());\r
+ frame_sampler_locU=glGetUniformLocation(frame_program,"textureU");\r
+ //Log::getInstance()->log("OSD", Log::WARN, "uniform location %x %x",frame_sampler_locU,glGetError());\r
+ frame_sampler_locV=glGetUniformLocation(frame_program,"textureV");\r
+\r
\r
\r
glClearColor(0.0f,0.0f,0.0f,1.f);\r
\r
\r
if (frame) {\r
+ //Log::getInstance()->log("OSD", Log::WARN, "mark1 glerror %x",glGetError());\r
glUseProgram(frame_program);\r
- // Log::getInstance()->log("OSD", Log::WARN, "mark1 glerror %x",glGetError());\r
+ //Log::getInstance()->log("OSD", Log::WARN, "mark1 glerror %x",glGetError());\r
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), osdvertices);\r
glEnableVertexAttribArray(0);\r
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), &(osdvertices[0].u));\r
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), &(osdvertices[0].u));\r
glEnableVertexAttribArray(1);\r
\r
- glActiveTexture(GL_TEXTURE0);\r
- glBindTexture(GL_TEXTURE_2D,frame->textures[0]);\r
+\r
//Log::getInstance()->log("OSD", Log::WARN, "mark2 glerror %x",glGetError());\r
- // glActiveTexture(GL_TEXTURE1);\r
- // Log::getInstance()->log("OSD", Log::WARN, "mark3 glerror %x",glGetError());\r
- // glBindTexture(GL_TEXTURE_2D,frame->textures[1]);\r
- // Log::getInstance()->log("OSD", Log::WARN, "mark4 glerror %x",glGetError());\r
- // glActiveTexture(GL_TEXTURE2);\r
- // Log::getInstance()->log("OSD", Log::WARN, "mark5 glerror %x",glGetError());\r
- // glBindTexture(GL_TEXTURE_2D,frame->textures[2]);\r
-\r
- // Log::getInstance()->log("OSD", Log::WARN, "mark6 glerror %x",glGetError());\r
+\r
+\r
+ glActiveTexture(GL_TEXTURE2);\r
+ glBindTexture(GL_TEXTURE_2D,frame->textures[2]);\r
+ glUniform1i(frame_sampler_locV,2);\r
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);\r
+\r
+\r
+ glActiveTexture(GL_TEXTURE1);\r
+ glBindTexture(GL_TEXTURE_2D,frame->textures[1]);\r
+ glUniform1i(frame_sampler_locU,1);\r
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);\r
+\r
+\r
+ glActiveTexture(GL_TEXTURE0);\r
+ glBindTexture(GL_TEXTURE_2D,frame->textures[0]);\r
+ glUniform1i(frame_sampler_locY,0);\r
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
- // Log::getInstance()->log("OSD", Log::WARN, "mark7 glerror %x",glGetError());\r
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);\r
- //Log::getInstance()->log("OSD", Log::WARN, "mark8 glerror %x",glGetError());\r
\r
- glUniform1i(frame_sampler_locY,0);\r
- //glUniform1i(frame_sampler_locU,1);\r
- //glUniform1i(frame_sampler_locV,2);\r
+\r
+\r
+ //Log::getInstance()->log("OSD", Log::WARN, "mark8 glerror %x %x",glGetError(),osd_sampler_loc);\r
+\r
\r
\r
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\r
#include "mutex.h"\r
#include "videovpeogl.h"\r
\r
-#define BENCHMARK_FPS\r
+\r
\r
\r
\r
--- /dev/null
+/*\r
+ Copyright 2012 Marten Richter\r
+\r
+ This file is part of VOMP.\r
+\r
+ VOMP is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ VOMP is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with VOMP; if not, write to the Free Software\r
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
+*/\r
+\r
+#ifndef FRAME_FRAG_SHADER_H\r
+#define FRAME_FRAG_SHADER_H\r
+\r
+const GLchar frame_frag_shader[] =\r
+ "precision mediump float;\n"\r
+ "uniform sampler2D textureU;\n"\r
+ "uniform sampler2D textureV;\n"\r
+ "uniform sampler2D textureY;\n"\r
+ "const float uv_corr=0.5;\n"\r
+ "const float y_corr=0.0625;\n"\r
+ "const mat3 yuvtransform= mat3( 1.164 ,0.0 ,1.596 ,\n"\r
+ " 1.164 ,-0.391,-0.813 ,\n"\r
+ " 1.164,2.018 , 0.0 );\n"\r
+// "const mat3 yuvtransform= mat3( 1. ,1. ,1. ,\n"\r
+// " 0.0 ,-0.3960,2.029 ,\n"\r
+// " 1.140,-0.581 , 0.0 );\n"\r
+// "const mat3 yuvtransform= mat3( 1. ,0 ,0. ,\n"\r
+// " 0.0 ,1.,0. ,\n"\r
+// " 0.,0. , 1.0 );\n"\r
+// "const mat3 yuvtransform= mat3( 1. ,1. ,1. ,\n"\r
+// " 0.0 ,-0.03960,0.2029 ,\n"\r
+// " 0.1140,-0.0581 , 0.0 );\n"\r
+ "varying vec2 out_texCoord;\n"\r
+ "void main()\n"\r
+ "{\n"\r
+ // " vec3 inputcoloryuv=vec3(texture2D(textureY,out_texCoord).r-y_corr,0,0);\n"\r
+ //" texture2D(textureU,out_texCoord)-uv_corr,"\r
+ //" texture2D(textureV,out_texCoord)-uv_corr);"\r
+ // " gl_FragColor.rgb=yuvtransform*inputcoloryuv;\n"\r
+ " vec3 help;\n"\r
+ "help.x=texture2D(textureY,out_texCoord).r-y_corr;\n"\r
+ "help.y=texture2D(textureU,out_texCoord).r-uv_corr;\n"\r
+ "help.z=texture2D(textureV,out_texCoord).r-uv_corr;\n" //-uv_corr;\n"\r
+ " gl_FragColor.rgb=help*yuvtransform;\n"\r
+ //" gl_FragColor.g=texture2D(textureU,out_texCoord).r;\n"\r
+ //" gl_FragColor.b=texture2D(textureV,out_texCoord).r;\n"\r
+ " gl_FragColor.a=1.;\n"\r
+// " gl_FragColor=texture2D(texture,out_texCoord);\n"\r
+ //" vec4 temp=vec4(0.3,0.4,0.5,0.5);\n"\r
+ //"gl_FragColor=temp;\n"\r
+ "}\n";\r
+#endif\r
+\r
\r
const GLchar osd_frag_shader[] =\r
"precision mediump float;\n"\r
- "uniform sampler2D texture;"\r
+ "uniform sampler2D texture;\n"\r
"varying vec2 out_texCoord;\n"\r
"void main()\n"\r
"{\n"\r
ffmpeg_running=false;
dec_frame_ff_uploading=NULL;
dec_frame_ff_decoding=NULL;
+ ogl_frame_outside=false;
#endif
+#ifdef BENCHMARK_FPS
+ time_in_decoder=0;
+ num_frames=0;
+#endif
+
}
VideoVPEOGL::~VideoVPEOGL()
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,
- dec_frame_ff_uploading->linesize[0],height,
+ out_frame->stride,out_frame->height,
GL_LUMINANCE,GL_UNSIGNED_BYTE,
dec_frame_ff_uploading->data[0]);
glBindTexture(GL_TEXTURE_2D, out_frame->textures[1]);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,
- dec_frame_ff_uploading->linesize[1],height>>1,
+ out_frame->stride>>1,out_frame->height>>1,
GL_LUMINANCE,GL_UNSIGNED_BYTE,
dec_frame_ff_uploading->data[1]);
glBindTexture(GL_TEXTURE_2D, out_frame->textures[2]);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,
- dec_frame_ff_uploading->linesize[2],height>>1,
+ out_frame->stride>>1,out_frame->height>>1,
GL_LUMINANCE,GL_UNSIGNED_BYTE,
dec_frame_ff_uploading->data[2]);
ogl_frame_mutex.Lock();
int frame_ready=0;
// Log::getInstance()->log("Video", Log::DEBUG, "Push data to decoder");
+
+#ifdef BENCHMARK_FPS
+ int cur_time=getTimeMS();
+#endif
+
dec_bytes=avcodec_decode_video(mpeg2codec_context_ff, dec_frame_ff_decoding,
&frame_ready, buffer+packet.pos_buffer+*samplepos, haveToCopy);
+#ifdef BENCHMARK_FPS
+ time_in_decoder+=getTimeMS()-cur_time;
+ if (frame_ready) num_frames++;
+ if ((num_frames%100)==0) {
+ float fps=1000./(float)(time_in_decoder);
+ fps*=((float)num_frames);
+ Log::getInstance()->log("OSD", Log::NOTICE, "Current Pure Decoding FPS %g", fps);
+ }
+#endif
if (dec_bytes<0) {
Log::getInstance()->log("Video", Log::DEBUG, "Decoding frame failed %x", dec_bytes);
return *samplepos;
EGLDisplay egl_display;\r
EGLSurface egl_surface;\r
EGLContext egl_context;\r
-\r
-\r
+#ifdef BENCHMARK_FPS\r
+ unsigned int time_in_decoder;\r
+ unsigned int num_frames;\r
+#endif\r
\r
\r
MediaPacket mediapacket;\r