]> git.vomp.tv Git - vompclient.git/commitdiff
FFMPEG decoding in color at 7 fps
authorMarten Richter <marten.richter@freenet.de>
Tue, 5 Jun 2012 06:48:12 +0000 (08:48 +0200)
committerMarten Richter <marten.richter@freenet.de>
Tue, 5 Jun 2012 06:48:12 +0000 (08:48 +0200)
defines.h
main.cc [changed mode: 0644->0755]
osdopengl.cc
osdopengl.h
shaders/frame__frag_shader.h [new file with mode: 0755]
shaders/osd__frag_shader.h [changed mode: 0644->0755]
videovpeogl.cc
videovpeogl.h

index c640c1b34fafb21ef925c4a5bfe88e22085c4b38..c04928eb3eaca87ab2e793ead90e10e04394a0dd 100755 (executable)
--- a/defines.h
+++ b/defines.h
@@ -30,9 +30,12 @@ typedef unsigned long long ULLONG;
 #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
diff --git a/main.cc b/main.cc
old mode 100644 (file)
new mode 100755 (executable)
index 226f3e2..b91b671
--- a/main.cc
+++ b/main.cc
@@ -565,6 +565,12 @@ void MILLISLEEP(ULONG a)
 #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
index 682a4e9e633536267cc95751f1409b43a303e551..fe19214debf7bb2a7964d3c3bced04d98b4d6914 100755 (executable)
 \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
@@ -205,6 +201,7 @@ int OsdOpenGL::init(void* device)
 \r
 \r
 \r
+\r
   //Now we will create the Screen\r
   screen = (Surface*) new SurfaceOpenGL(Surface::SCREEN);\r
 \r
@@ -231,11 +228,14 @@ int OsdOpenGL::init(void* device)
   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
@@ -245,6 +245,10 @@ int OsdOpenGL::init(void* device)
          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
@@ -258,13 +262,11 @@ int OsdOpenGL::init(void* device)
   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
@@ -275,6 +277,12 @@ int OsdOpenGL::init(void* device)
          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
@@ -569,8 +577,9 @@ void OsdOpenGL::InternalRendering(VPEOGLFrame* frame){
 \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
@@ -580,26 +589,34 @@ void OsdOpenGL::InternalRendering(VPEOGLFrame* frame){
                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
index f92cadc02db6e8d3493d6920b1bb5f58e6e64619..3bd5defde8cbedb0360c6cf021a2516163251ccd 100755 (executable)
@@ -36,7 +36,7 @@
 #include "mutex.h"\r
 #include "videovpeogl.h"\r
 \r
-#define BENCHMARK_FPS\r
+\r
 \r
 \r
 \r
diff --git a/shaders/frame__frag_shader.h b/shaders/frame__frag_shader.h
new file mode 100755 (executable)
index 0000000..4671f0e
--- /dev/null
@@ -0,0 +1,63 @@
+/*\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
old mode 100644 (file)
new mode 100755 (executable)
index 50421e8..d7fb2b8
@@ -23,7 +23,7 @@
 \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
index 1ef6d93ecf55aa969b53305ddc55e529be3232d1..1a0b03f3f553a02e5d962e5a9abd3824fc5d33d6 100755 (executable)
@@ -46,8 +46,14 @@ VideoVPEOGL::VideoVPEOGL()
   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()
@@ -338,7 +344,7 @@ void VideoVPEOGL::threadMethod()
                                        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]);
 
@@ -346,14 +352,14 @@ void VideoVPEOGL::threadMethod()
                                        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();
@@ -1879,8 +1885,22 @@ UINT VideoVPEOGL::DeliverMediaPacketFFMPEG(MediaPacket packet,
                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;
index aab1590bc2a4fa96ca01ebb07e3f4f0d6d98054f..3c722e63da77c06700479918532dd83461aadb08 100755 (executable)
@@ -271,8 +271,10 @@ class VideoVPEOGL : public Video, public Thread_TYPE
        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