From 987d5b5136ed324b492e6c585c823413b20d29b5 Mon Sep 17 00:00:00 2001 From: Dan Hastings Date: Mon, 28 Oct 2013 06:53:32 +0000 Subject: [PATCH] first commit --- Makefile | 7 + README.md | 4 + cube_texture_and_coords.h | 45 ++ hello_teapot.bin | Bin 0 -> 196949 bytes models.c | 515 ++++++++++++++++++++ models.h | 36 ++ state.h | 43 ++ teapot.obj.dat | Bin 0 -> 635016 bytes triangle.c | 443 ++++++++++++++++++ triangle.h | 30 ++ video.c | 955 ++++++++++++++++++++++++++++++++++++++ 11 files changed, 2078 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 cube_texture_and_coords.h create mode 100755 hello_teapot.bin create mode 100644 models.c create mode 100644 models.h create mode 100644 state.h create mode 100644 teapot.obj.dat create mode 100644 triangle.c create mode 100644 triangle.h create mode 100644 video.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0ebb234 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +OBJS=triangle.o video.o models.o +BIN=hello_teapot.bin +LDFLAGS+=-lilclient + +include ../Makefile.include + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..36fafcf --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +hello_videocube +=============== + +Sample for Raspberry Pi that uses egl_render to display video on an animated cube. \ No newline at end of file diff --git a/cube_texture_and_coords.h b/cube_texture_and_coords.h new file mode 100644 index 0000000..6f498a8 --- /dev/null +++ b/cube_texture_and_coords.h @@ -0,0 +1,45 @@ +/* +Copyright (c) 2012, Broadcom Europe Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +// Spatial coordinates for the cube + +static const GLbyte quadx[4*3] = { + /* FRONT */ + -1, -1, 0, + 1, -1, 0, + -1, 1, 0, + 1, 1, 0, +}; + +/** Texture coordinates for the quad. */ +static const GLfloat texCoords[4 * 2] = { + 0.f, 0.f, + 1.f, 0.f, + 0.f, 1.f, + 1.f, 1.f, +}; + diff --git a/hello_teapot.bin b/hello_teapot.bin new file mode 100755 index 0000000000000000000000000000000000000000..bbee43fcfda9e01df5778a26b305fc21ce84b268 GIT binary patch literal 196949 zcmeF4e|(o!`Ty_tHek#tZ*}T~g>QAr)S+*5>BOm1rVg2kf`v(KlMR@TZEgbxVoX@I zbm-EhQ&FZ;ps;r@eeV0clv zc|Dh)IF@ya8fb$~#YbwvbNEJjs3_#wy?#5gBKj24oM+3@F0VD(EuUm8T zDe3Ji9=^D0%#8&PWG()9)@dV`k@p?o%fMy8RX`1(zj{Ejehyd**uQUqoB*6*5?&%y z>$Skc!1cgwfc{#6i-Dzz@OM)XcvXbUfkNPRlcwNugFiu7YH;!YsKI9vUJaZKtN@M! zo&wT<`GEc|1SFI50Lh>j7y;P7kAi#!Xa=GtQS$l-aEytMCoBie=YUTFO~7D(b4Z*#ScXZPYr@B3 z%8Vi25|cJ6CVm(3o1L_~!M_e%3OoZm2z(x}f4K(vxJ@9;0w$Vx0bw$bZsK)>MZm{^ z2rvn-f0+hZO!#e^NLc3JLi0@g8-z0q9vjSZ5{7|)!ik^g;A6q>0oDLHPP)+RV&aOf z0;U3&DB}Fdp5lQBpmBLwOX81z&@pmZV?CqnrzN@d32`?Ug~MCo;*JkD=8s%@+udFD z$EUVs{P!a#mkm#NHsjjnv*wQcLhk*ayFdA)e>CMi*F3d0Qh!a;XQFS!{b=~qUyXT_Vjj>p}yOXrLfC``zr~+z%1%Q0d zB0#o#A0WR|4=e*3fX@P-1N5iy(*!&Wv;dC-PXPLRG6?*+=V^m0Xak-Fo�^F95RH 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 cj^$kk&+mj!Mq5Z{NfLYP&!ta{pEtVy3n^; +#include +#include + +#include "GLES/gl.h" +#include "EGL/egl.h" +#include "EGL/eglext.h" +#include "models.h" + +#define VMCS_RESOURCE(a,b) (b) + +/****************************************************************************** +Private typedefs, macros and constants +******************************************************************************/ + +enum {VBO_VERTEX, VBO_NORMAL, VBO_TEXTURE, VBO_MAX}; +#define MAX_MATERIALS 4 +#define MAX_MATERIAL_NAME 32 + +typedef struct wavefront_material_s { + GLuint vbo[VBO_MAX]; + int numverts; + char name[MAX_MATERIAL_NAME]; + GLuint texture; +} WAVEFRONT_MATERIAL_T; + +typedef struct wavefront_model_s { + WAVEFRONT_MATERIAL_T material[MAX_MATERIALS]; + int num_materials; + GLuint texture; +} WAVEFRONT_MODEL_T; + + +/****************************************************************************** +Static Data +******************************************************************************/ + +/****************************************************************************** +Static Function Declarations +******************************************************************************/ + +/****************************************************************************** +Static Function Definitions +******************************************************************************/ + +static void create_vbo(GLenum type, GLuint *vbo, int size, void *data) +{ + glGenBuffers(1, vbo); + vc_assert(*vbo); + glBindBuffer(type, *vbo); + glBufferData(type, size, data, GL_STATIC_DRAW); + glBindBuffer(type, 0); +} + + +static void destroy_vbo(GLuint *vbo) +{ + glDeleteBuffers(1, vbo); + *vbo = 0; +} + +#define MAX_VERTICES 100000 +static void *allocbuffer(int size) +{ + return malloc(size); +} + +static void freebuffer(void *p) +{ + free (p); +} + +static void centre_and_rescale(float *verts, int numvertices) +{ + float cx=0.0f, cy=0.0f, cz=0.0f, scale=0.0f; + float minx=0.0f, miny=0.0f, minz=0.0f; + float maxx=0.0f, maxy=0.0f, maxz=0.0f; + int i; + float *v = verts; + minx = maxx = verts[0]; + miny = maxy = verts[1]; + minz = maxz = verts[2]; + for (i=0; i= 3) *dst++ = src[ind + 2]; + indexes += 3; + } +} + +int draw_wavefront(MODEL_T m, GLuint texture) +{ + int i; + WAVEFRONT_MODEL_T *model = (WAVEFRONT_MODEL_T *)m; + + for (i=0; inum_materials; i++) { + WAVEFRONT_MATERIAL_T *mat = model->material + i; + if (mat->texture == -1) continue; + glBindTexture(GL_TEXTURE_2D, mat->texture ? mat->texture:texture); + if (mat->vbo[VBO_VERTEX]) { + glBindBuffer(GL_ARRAY_BUFFER, mat->vbo[VBO_VERTEX]); + glVertexPointer(3, GL_FLOAT, 0, NULL); + } + if (mat->vbo[VBO_NORMAL]) { + glEnableClientState(GL_NORMAL_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, mat->vbo[VBO_NORMAL]); + glNormalPointer(GL_FLOAT, 0, NULL); + } else { + glDisableClientState(GL_NORMAL_ARRAY); + } + if (mat->vbo[VBO_TEXTURE]) { + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, mat->vbo[VBO_TEXTURE]); + glTexCoordPointer(2, GL_FLOAT, 0, NULL); + } else { + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + glDrawArrays(GL_TRIANGLES, 0, mat->numverts); + } + glBindBuffer(GL_ARRAY_BUFFER, 0); + return 0; +} + +struct wavefront_model_loading_s { + unsigned short material_index[MAX_MATERIALS]; + int num_materials; + int numv, numt, numn, numf; + unsigned int data[0]; +}; + +static int load_wavefront_obj(const char *modelname, WAVEFRONT_MODEL_T *model, struct wavefront_model_loading_s *m) +{ + char line[256+1]; + unsigned short pp[54+1]; + FILE *fp; + int i, valid; + float *qv = (float *)m->data; + float *qt = (float *)m->data + 3 * MAX_VERTICES; + float *qn = (float *)m->data + (3+2) * MAX_VERTICES; + unsigned short *qf = (unsigned short *)((float *)m->data + (3+2+3) * MAX_VERTICES); + float *pv = qv, *pt = qt, *pn = qn; + unsigned short *pf = qf; + fp = fopen(modelname, "r"); + if (!fp) return -1; + + m->num_materials = 0; + m->material_index[0] = 0; + + valid = fread(line, 1, sizeof(line)-1, fp); + + while (valid > 0) { + char *s, *end = line; + + while((end-line < valid) && *end != '\n' && *end != '\r') + end++; + *end++ = 0; + + if((end-line < valid) && *end != '\n' && *end != '\r') + *end++ = 0; + + s = line; + + if (s[strlen(s)-1] == 10) s[strlen(s)-1]=0; + switch (s[0]) { + case '#': break; // comment + case '\r': case '\n': case '\0': break; // blank line + case 'm': vc_assert(strncmp(s, "mtllib", sizeof "mtllib"-1)==0); break; + case 'o': break; + case 'u': + if (sscanf(s, "usemtl %s", /*MAX_MATERIAL_NAME-1, */model->material[m->num_materials].name) == 1) { + if (m->num_materials < MAX_MATERIALS) { + if (m->num_materials > 0 && ((pf-qf)/3 == m->material_index[m->num_materials-1] || strcmp(model->material[m->num_materials-1].name, model->material[m->num_materials].name)==0)) { + strcpy(model->material[m->num_materials-1].name, model->material[m->num_materials].name); + m->num_materials--; + } else + m->material_index[m->num_materials] = (pf-qf)/3; + m->num_materials++; + } + } else { printf(s); vc_assert(0); } + break; + case 'g': vc_assert(strncmp(s, "g ", sizeof "g "-1)==0); break; + case 's': vc_assert(strncmp(s, "s ", sizeof "s "-1)==0); break; + case 'v': case 'f': + if (sscanf(s, "v %f %f %f", pv+0, pv+1, pv+2) == 3) { + pv += 3; + } else if (sscanf(s, "vt %f %f", pt+0, pt+1) == 2) { + pt += 2; + } else if (sscanf(s, "vn %f %f %f", pn+0, pn+1, pn+2) == 3) { + pn += 3; + } else if (i = sscanf(s, "f"" %hu//%hu %hu//%hu %hu//%hu %hu//%hu %hu//%hu %hu//%hu" + " %hu//%hu %hu//%hu %hu//%hu %hu//%hu %hu//%hu %hu//%hu" + " %hu//%hu %hu//%hu %hu//%hu %hu//%hu %hu//%hu %hu//%hu %hu", + pp+ 0, pp+ 1, pp+ 2, pp+ 3, pp+ 4, pp+ 5, pp+ 6, pp+ 7, pp+ 8, pp+ 9, pp+10, pp+11, + pp+12, pp+13, pp+14, pp+15, pp+16, pp+17, pp+18, pp+19, pp+20, pp+21, pp+22, pp+23, + pp+24, pp+25, pp+26, pp+27, pp+28, pp+29, pp+30, pp+32, pp+32, pp+33, pp+34, pp+35, pp+36), i >= 6) { + int poly = i/2; + //vc_assert(i < countof(pp)); // may need to increment poly count and pp array + for (i=1; i= 6) { + int poly = i/2; + //vc_assert(i < countof(pp); // may need to increment poly count and pp array + for (i=1; i= 9) { + int poly = i/3; + //vc_assert(i < countof(pp); // may need to increment poly count and pp array + for (i=1; i valid ? valid : end-line; + memmove(line, end, valid - i); + valid -= i; + valid += fread(line+valid, 1, sizeof(line)-1-valid, fp); + } + fclose(fp); + + if (m->num_materials==0) m->material_index[m->num_materials++] = 0; + + centre_and_rescale(qv, (pv-qv)/3); + renormalise(qn, (pn-qn)/3); + //centre_and_rescale2(qt, (pt-qt)/2); + + m->numv = pv-qv; + m->numt = pt-qt; + m->numn = pn-qn; + m->numf = pf-qf; + + // compress array + //memcpy((float *)m->data, (float *)m->data, m->numv * sizeof *qv); - nop + memcpy((float *)m->data + m->numv, (float *)m->data + 3 * MAX_VERTICES, m->numt * sizeof *qt); + memcpy((float *)m->data + m->numv + m->numt,(float *) m->data + (3 + 2) * MAX_VERTICES, m->numn * sizeof *qn); + memcpy((float *)m->data + m->numv + m->numt + m->numn, (float *)m->data + (3 + 2 + 3) * MAX_VERTICES, m->numf * sizeof *qf); + + return 0; +} + +static int load_wavefront_dat(const char *modelname, WAVEFRONT_MODEL_T *model, struct wavefront_model_loading_s *m) +{ + FILE *fp; + int s; + const int size = sizeof *m + + sizeof(float)*(3+2+3)*MAX_VERTICES + // 3 vertices + 2 textures + 3 normals + sizeof(unsigned short)*3*MAX_VERTICES; //each face has 9 vertices + + fp = fopen(modelname, "r"); + if (!fp) return -1; + s = fread(m, 1, size, fp); + if (s < 0) return -1; + fclose(fp); + return 0; +} + +MODEL_T load_wavefront(const char *modelname, const char *texturename) +{ + WAVEFRONT_MODEL_T *model; + float *temp, *qv, *qt, *qn; + unsigned short *qf; + int i; + int numverts = 0, offset = 0; + struct wavefront_model_loading_s *m; + int s=-1; + char modelname_obj[128]; + model = malloc(sizeof *model); + if (!model || !modelname) return NULL; + memset (model, 0, sizeof *model); + model->texture = 0; //load_texture(texturename); + m = allocbuffer(sizeof *m + + sizeof(float)*(3+2+3)*MAX_VERTICES + // 3 vertices + 2 textures + 3 normals + sizeof(unsigned short)*3*MAX_VERTICES); //each face has 9 vertices + if (!m) return 0; + + if (strlen(modelname) + 5 <= sizeof modelname_obj) { + strcpy(modelname_obj, modelname); + strcat(modelname_obj, ".dat"); + s = load_wavefront_dat(modelname_obj, model, m); + } + if (s==0) {} + else if (strncmp(modelname + strlen(modelname) - 4, ".obj", 4) == 0) { + #ifdef DUMP_OBJ_DAT + int size; + FILE *fp; + #endif + s = load_wavefront_obj(modelname, model, m); + #ifdef DUMP_OBJ_DAT + strcpy(modelname_obj, modelname); + strcat(modelname_obj, ".dat"); + size = sizeof *m + + sizeof(float)*(3*m->numv+2*m->numt+3*m->numn) + // 3 vertices + 2 textures + 3 normals + sizeof(unsigned short)*3*m->numf; //each face has 9 vertices + fp = host_file_open(modelname_obj, "w"); + fwrite(m, 1, size, fp); + fclose(fp); + #endif + } else if (strncmp(modelname + strlen(modelname) - 4, ".dat", 4) == 0) { + s = load_wavefront_dat(modelname, model, m); + } + if (s != 0) return 0; + + qv = (float *)(m->data); + qt = (float *)(m->data + m->numv); + qn = (float *)(m->data + m->numv + m->numt); + qf = (unsigned short *)(m->data + m->numv + m->numt + m->numn); + + numverts = m->numf/3; + vc_assert(numverts <= MAX_VERTICES); + + temp = allocbuffer(3*numverts*sizeof *temp); + for (i=0; inum_materials; i++) { + WAVEFRONT_MATERIAL_T *mat = model->material + i; + mat->numverts = i < m->num_materials-1 ? m->material_index[i+1]-m->material_index[i] : numverts - m->material_index[i]; + // vertex, texture, normal + deindex(temp, qv, qf+3*offset+0, 3, mat->numverts); + create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_VERTEX, 3 * mat->numverts * sizeof *qv, temp); // 3 + + deindex(temp, qt, qf+3*offset+1, 2, mat->numverts); + create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_TEXTURE, 2 * mat->numverts * sizeof *qt, temp); // 2 + + deindex(temp, qn, qf+3*offset+2, 3, mat->numverts); + create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_NORMAL, 3 * mat->numverts * sizeof *qn, temp); // 3 + offset += mat->numverts; + mat->texture = model->texture; + } + model->num_materials = m->num_materials; + vc_assert(offset == numverts); + freebuffer(temp); + freebuffer(m); + return (MODEL_T)model; +} + +void unload_wavefront(MODEL_T m) +{ + WAVEFRONT_MODEL_T *model = (WAVEFRONT_MODEL_T *)m; + int i; + for (i=0; inum_materials; i++) { + WAVEFRONT_MATERIAL_T *mat = model->material + i; + if (mat->vbo[VBO_VERTEX]) + destroy_vbo(mat->vbo+VBO_VERTEX); + if (mat->vbo[VBO_TEXTURE]) + destroy_vbo(mat->vbo+VBO_TEXTURE); + if (mat->vbo[VBO_NORMAL]) + destroy_vbo(mat->vbo+VBO_NORMAL); + } +} + +// create a cube model that looks like a wavefront model, +MODEL_T cube_wavefront(void) +{ + static const float qv[] = { + -0.5f, -0.5f, 0.5f, + -0.5f, -0.5f, -0.5f, + 0.5f, -0.5f, -0.5f, + 0.5f, -0.5f, 0.5f, + -0.5f, 0.5f, 0.5f, + 0.5f, 0.5f, 0.5f, + 0.5f, 0.5f, -0.5f, + -0.5f, 0.5f, -0.5f, + }; + + static const float qn[] = { + 0.0f, -1.0f, -0.0f, + 0.0f, 1.0f, -0.0f, + 0.0f, 0.0f, 1.0f, + 1.0f, 0.0f, -0.0f, + 0.0f, 0.0f, -1.0f, + -1.0f, 0.0f, -0.0f, + }; + + static const float qt[] = { + 1.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 1.0f, + 0.0f, 0.0f, + }; + + static const unsigned short qf[] = { + 1,1,1, 2,2,1, 3,3,1, + 3,3,1, 4,4,1, 1,1,1, + 5,4,2, 6,1,2, 7,2,2, + 7,2,2, 8,3,2, 5,4,2, + 1,4,3, 4,1,3, 6,2,3, + 6,2,3, 5,3,3, 1,4,3, + 4,4,4, 3,1,4, 7,2,4, + 7,2,4, 6,3,4, 4,4,4, + 3,4,5, 2,1,5, 8,2,5, + 8,2,5, 7,3,5, 3,4,5, + 2,4,6, 1,1,6, 5,2,6, + 5,2,6, 8,3,6, 2,4,6, + }; + WAVEFRONT_MODEL_T *model = malloc(sizeof *model); + if (model) { + WAVEFRONT_MATERIAL_T *mat = model->material; + float *temp; + const int offset = 0; + memset(model, 0, sizeof *model); + + temp = allocbuffer(3*MAX_VERTICES*sizeof *temp); + mat->numverts = countof(qf)/3; + // vertex, texture, normal + deindex(temp, qv, qf+3*offset+0, 3, mat->numverts); + create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_VERTEX, 3 * mat->numverts * sizeof *qv, temp); // 3 + + deindex(temp, qt, qf+3*offset+1, 2, mat->numverts); + create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_TEXTURE, 2 * mat->numverts * sizeof *qt, temp); // 2 + + deindex(temp, qn, qf+3*offset+2, 3, mat->numverts); + create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_NORMAL, 3 * mat->numverts * sizeof *qn, temp); // 3 + + freebuffer(temp); + model->num_materials = 1; + } + return (MODEL_T)model; +} + + diff --git a/models.h b/models.h new file mode 100644 index 0000000..4a6cbd0 --- /dev/null +++ b/models.h @@ -0,0 +1,36 @@ +/* +Copyright (c) 2012, Broadcom Europe Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef MODELS_T +#define MODELS_T +typedef struct opqaue_model_s * MODEL_T; + +MODEL_T load_wavefront(const char *modelname, const char *texturename); +MODEL_T cube_wavefront(void); +void unload_wavefront(MODEL_T m); +int draw_wavefront(MODEL_T m, GLuint texture); +#endif diff --git a/state.h b/state.h new file mode 100644 index 0000000..8696257 --- /dev/null +++ b/state.h @@ -0,0 +1,43 @@ +#ifndef __STATE_H +#define __STATE_H + +#include "GLES/gl.h" +#include "GLES2/gl2.h" +#include "EGL/egl.h" +#include "EGL/eglext.h" + +typedef struct +{ + uint32_t screen_width; + uint32_t screen_height; +// OpenGL|ES objects + EGLDisplay display; + EGLSurface surface; + EGLContext context; + GLuint tex; + GLuint programObject; +// model rotation vector and direction + GLfloat rot_angle_x_inc; + GLfloat rot_angle_y_inc; + GLfloat rot_angle_z_inc; +// current model rotation angles + GLfloat rot_angle_x; + GLfloat rot_angle_y; + GLfloat rot_angle_z; +// current distance from camera + GLfloat distance; + GLfloat distance_inc; +// pointers to texture buffers + char *tex_buf1; + char *tex_buf2; + char *tex_buf3; + + GLuint attr_vertex; + GLuint attr_tex; + GLuint unif_tex; + GLuint unif_thresh; + GLuint unif_color; + void *eglImage; +} CUBE_STATE_T; + +#endif diff --git a/teapot.obj.dat b/teapot.obj.dat new file mode 100644 index 0000000000000000000000000000000000000000..584ab3d87d93b8b18c486956cc9461ab6ceeebcd GIT binary patch literal 635016 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 z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} U0tzUgfC36Apnw7j{J# +#include +#include +#include +#include +#include + +#include "bcm_host.h" + +#include "GLES/gl.h" +#include "GLES2/gl2.h" +#include "EGL/egl.h" +#include "EGL/eglext.h" + +#include "cube_texture_and_coords.h" +#include "models.h" +#include "triangle.h" +#include + +#include "state.h" + +#define PATH "./" + +#ifndef M_PI + #define M_PI 3.141592654 +#endif + + +static void init_ogl(CUBE_STATE_T *state); +static void init_model_proj(CUBE_STATE_T *state); +static void redraw_scene(CUBE_STATE_T *state); +static void init_textures(CUBE_STATE_T *state); +static void exit_func(void); +static volatile int terminate; +static CUBE_STATE_T _state, *state=&_state; + +static pthread_t thread1; + +/*********************************************************** + * Name: init_ogl + * + * Arguments: + * CUBE_STATE_T *state - holds OGLES model info + * + * Description: Sets the display, OpenGL|ES context and screen stuff + * + * Returns: void + * + ***********************************************************/ +static void init_ogl(CUBE_STATE_T *state) +{ + int32_t success = 0; + EGLBoolean result; + EGLint num_config; + + static EGL_DISPMANX_WINDOW_T nativewindow; + + DISPMANX_ELEMENT_HANDLE_T dispman_element; + DISPMANX_DISPLAY_HANDLE_T dispman_display; + DISPMANX_UPDATE_HANDLE_T dispman_update; + VC_RECT_T dst_rect; + VC_RECT_T src_rect; + + static const EGLint attribute_list[] = + { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_NONE + }; + + static const EGLint context_attributes[] = + { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + + EGLConfig config; + + // get an EGL display connection + state->display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + assert(state->display!=EGL_NO_DISPLAY); + + // initialize the EGL display connection + result = eglInitialize(state->display, NULL, NULL); + assert(EGL_FALSE != result); + + // get an appropriate EGL frame buffer configuration + result = eglChooseConfig(state->display, attribute_list, &config, 1, &num_config); + assert(EGL_FALSE != result); + + // get an appropriate EGL frame buffer configuration + result = eglBindAPI(EGL_OPENGL_ES_API); + assert(EGL_FALSE != result); + + + // create an EGL rendering context + state->context = eglCreateContext(state->display, config, EGL_NO_CONTEXT, context_attributes); + assert(state->context!=EGL_NO_CONTEXT); + + // create an EGL window surface + success = graphics_get_display_size(0 /* LCD */, &state->screen_width, &state->screen_height); + assert( success >= 0 ); + + state->screen_width = 1920; + + state->screen_height = 1080; + + dst_rect.x = 0; + dst_rect.y = 0; + dst_rect.width = state->screen_width; + dst_rect.height = state->screen_height; + + src_rect.x = 0; + src_rect.y = 0; + src_rect.width = state->screen_width << 16; + src_rect.height = state->screen_height << 16; + + dispman_display = vc_dispmanx_display_open( 0 /* LCD */); + dispman_update = vc_dispmanx_update_start( 0 ); + + dispman_element = vc_dispmanx_element_add ( dispman_update, dispman_display, + 0/*layer*/, &dst_rect, 0/*src*/, + &src_rect, DISPMANX_PROTECTION_NONE, 0 /*alpha*/, 0/*clamp*/, 0/*transform*/); + + nativewindow.element = dispman_element; + nativewindow.width = state->screen_width; + nativewindow.height = state->screen_height; + vc_dispmanx_update_submit_sync( dispman_update ); + + state->surface = eglCreateWindowSurface( state->display, config, &nativewindow, NULL ); + assert(state->surface != EGL_NO_SURFACE); + + // connect the context to the surface + result = eglMakeCurrent(state->display, state->surface, state->surface, state->context); + assert(EGL_FALSE != result); + + // Set background color and clear buffers + glClearColor(0.15f, 0.25f, 0.35f, 1.0f); + + // Enable back face culling. + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + +// glMatrixMode(GL_MODELVIEW); +} + +/*********************************************************** + * Name: init_model_proj + * + * Arguments: + * CUBE_STATE_T *state - holds OGLES model info + * + * Description: Sets the OpenGL|ES model to default values + * + * Returns: void + * + ***********************************************************/ +static void init_model_proj(CUBE_STATE_T *state) +{ + float farp = 500.0f; + float hht; + float hwd; + glViewport(0, 0, (GLsizei)state->screen_width, (GLsizei)state->screen_height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + hht = 10;//nearp * (float)tan(45.0 / 2.0 / 180.0 * M_PI); + hwd = hht * (float)state->screen_width / (float)state->screen_height; + +// glFrustumf(-hwd, hwd, -hht, hht, nearp, farp); + + glOrthof(-hwd, hwd, -hht, hht, 0, farp); + glEnableClientState( GL_VERTEX_ARRAY ); + glVertexPointer( 3, GL_BYTE, 0, quadx ); +} + +/*********************************************************** + * Name: reset_model + * + * Arguments: + * CUBE_STATE_T *state - holds OGLES model info + * + * Description: Resets the Model projection and rotation direction + * + * Returns: void + * + ***********************************************************/ +static void init_shaders(CUBE_STATE_T *state) +{ + const GLchar *vShaderStr = +"attribute vec4 vPosition;" +"attribute vec2 TexCoordIn;" +"varying vec2 TexCoordOut;" +"void main() \n" +"{ \n" +" gl_Position = vPosition; \n" +"TexCoordOut = TexCoordIn;" +"} \n"; + + const GLchar *fShaderStr = + "precision mediump float; \n" +"varying vec2 TexCoordOut;\n" +"uniform sampler2D Texture;\n" + "void main() \n" + "{ \n" + " gl_FragColor = texture2D(Texture, TexCoordOut); \n" + "} \n"; + + GLuint vertexShader; + GLuint fragmentShader; + GLint compiled; + + vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vShaderStr, NULL); + + + glCompileShader(vertexShader); + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled); + + if (!compiled) printf("It didn't compile\n"); + + fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + + glShaderSource(fragmentShader, 1, &fShaderStr, NULL); + + glCompileShader(fragmentShader); + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compiled); + + if (!compiled) printf("It didn't compile\n"); + + state->programObject = glCreateProgram(); + + glAttachShader(state->programObject, vertexShader); + glAttachShader(state->programObject, fragmentShader); + + glBindAttribLocation(state->programObject, 0, "vPosition"); + glBindAttribLocation(state->programObject, 1, "TexCoordIn"); + + glLinkProgram(state->programObject); + + state->unif_tex = glGetUniformLocation(state->programObject, "Texture"); + + GLint linked; + + glGetProgramiv(state->programObject, GL_LINK_STATUS, &linked); + + if(!linked) + { + GLint infoLen = 0; + glGetProgramiv(state->programObject, GL_INFO_LOG_LENGTH, &infoLen); + + if(infoLen > 1) + { + char* infoLog = malloc(sizeof(char) * infoLen); + glGetProgramInfoLog(state->programObject, infoLen, NULL, infoLog); + + + free(infoLog); + } + glDeleteProgram(state->programObject); + } +} + +/*********************************************************** + * Name: redraw_scene + * + * Arguments: + * CUBE_STATE_T *state - holds OGLES model info + * + * Description: Draws the model and calls eglSwapBuffers + * to render to screen + * + * Returns: void + * + ***********************************************************/ +static void redraw_scene(CUBE_STATE_T *state) +{ + // Start with a clear screen + glClear( GL_COLOR_BUFFER_BIT ); + + glUseProgram(state->programObject); + // Draw first (front) face: + // Bind texture surface to current vertices + glBindTexture(GL_TEXTURE_2D, state->tex); + + glVertexAttribPointer( 0, 3, GL_BYTE, GL_FALSE, 0, quadx ); + glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, texCoords ); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + // draw first 4 vertices + + glUniform1i(state->unif_tex,0); + + glDrawArrays( GL_TRIANGLE_STRIP, 0, 4); + + eglSwapBuffers(state->display, state->surface); + + GLubyte arr[3]; + glReadPixels(state->screen_width / 2, state->screen_height / 2,1,1, + GL_RGB,GL_UNSIGNED_BYTE,arr); + + printf("%u, %u, %u\n", arr[0], arr[1], arr[2]); +} + +/*********************************************************** + * Name: init_textures + * + * Arguments: + * CUBE_STATE_T *state - holds OGLES model info + * + * Description: Initialise OGL|ES texture surfaces to use image + * buffers + * + * Returns: void + * + ***********************************************************/ +static void init_textures(CUBE_STATE_T *state) +{ + // the texture containing the video + glGenTextures(1, &state->tex); + + glBindTexture(GL_TEXTURE_2D, state->tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, state->screen_width, + state->screen_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + /* Create EGL Image */ + state->eglImage = eglCreateImageKHR( + state->display, + state->context, + EGL_GL_TEXTURE_2D_KHR, + (EGLClientBuffer)state->tex, + 0); + + if (state->eglImage == EGL_NO_IMAGE_KHR) + { + printf("eglCreateImageKHR failed.\n"); + exit(1); + } + + // Start rendering + pthread_create(&thread1, NULL, video_decode_test, state); + + // setup overall texture environment + glTexCoordPointer(4, GL_FLOAT, 0, texCoords); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + glEnable(GL_TEXTURE_2D); + + // Bind texture surface to current vertices + glBindTexture(GL_TEXTURE_2D, state->tex); +} + + +//------------------------------------------------------------------------------ + +static void exit_func(void) +// Function to be passed to atexit(). +{ + // clear screen + glClear( GL_COLOR_BUFFER_BIT ); + eglSwapBuffers(state->display, state->surface); + + // Release OpenGL resources + eglMakeCurrent( state->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT ); + eglDestroySurface( state->display, state->surface ); + eglDestroyContext( state->display, state->context ); + eglTerminate( state->display ); + + // release texture buffers + free(state->tex_buf1); + free(state->tex_buf2); + free(state->tex_buf3); + + printf("\ncube closed\n"); +} // exit_func() + +//============================================================================== + +int main () +{ + bcm_host_init(); + + // Clear application state + memset( state, 0, sizeof( *state ) ); + + // Start OGLES + init_ogl(state); + + init_shaders(state); + + // Setup the model world + init_model_proj(state); + + // initialise the OGLES texture(s) + init_textures(state); + + while (!terminate) + { + redraw_scene(state); + } + exit_func(); + return 0; +} + diff --git a/triangle.h b/triangle.h new file mode 100644 index 0000000..0f50e93 --- /dev/null +++ b/triangle.h @@ -0,0 +1,30 @@ +/* +Copyright (c) 2012, Broadcom Europe Ltd +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#pragma once + + +void* video_decode_test(void* arg); diff --git a/video.c b/video.c new file mode 100644 index 0000000..5222ecb --- /dev/null +++ b/video.c @@ -0,0 +1,955 @@ +/* + * Copyright © 2013 Tuomas Jormola + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Short intro about this program: + * + * `rpi-camera-playback` records video using the RaspiCam module and displays it + * on the Raspberry Pi frame buffer display device, i.e. it should be run on the + * Raspbian console. + * + * $ ./rpi-camera-playback + * + * `rpi-camera-playback` uses `camera`, `video_render` and `null_sink` components. + * `camera` video output port is tunneled to `video_render` input port and + * `camera` preview output port is tunneled to `null_sink` input port. + * `video_render` component uses a display region to show the video on local + * display. + * + * Please see README.mdwn for more detailed description of this + * OpenMAX IL demos for Raspberry Pi bundle. + * + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + +#include "state.h" + +// Hard coded parameters +#define VIDEO_FRAMERATE 35 +#define VIDEO_BITRATE 10000000 +#define CAM_DEVICE_NUMBER 0 +#define CAM_SHARPNESS -40 // -100 .. 100 +#define CAM_CONTRAST -10 // -100 .. 100 +#define CAM_BRIGHTNESS 50 // 0 .. 100 +#define CAM_SATURATION 0 // -100 .. 100 +#define CAM_EXPOSURE_VALUE_COMPENSTAION 100 +#define CAM_EXPOSURE_ISO_SENSITIVITY 0 +#define CAM_EXPOSURE_AUTO_SENSITIVITY OMX_TRUE +#define CAM_FRAME_STABILISATION OMX_FALSE +#define CAM_WHITE_BALANCE_CONTROL OMX_WhiteBalControlOff // OMX_WHITEBALCONTROLTYPE +#define CAM_IMAGE_FILTER OMX_ImageFilterNone // OMX_IMAGEFILTERTYPE +#define CAM_FLIP_HORIZONTAL OMX_FALSE +#define CAM_FLIP_VERTICAL OMX_TRUE +#define DISPLAY_DEVICE 0 + +// Dunno where this is originally stolen from... +#define OMX_INIT_STRUCTURE(a) \ + memset(&(a), 0, sizeof(a)); \ + (a).nSize = sizeof(a); \ + (a).nVersion.nVersion = OMX_VERSION; \ + (a).nVersion.s.nVersionMajor = OMX_VERSION_MAJOR; \ + (a).nVersion.s.nVersionMinor = OMX_VERSION_MINOR; \ + (a).nVersion.s.nRevision = OMX_VERSION_REVISION; \ + (a).nVersion.s.nStep = OMX_VERSION_STEP + +// Global variable used by the signal handler and capture/encoding loop +static int want_quit = 0; + +// Our application context passed around +// the main routine and callback handlers +typedef struct { + OMX_HANDLETYPE camera; + OMX_BUFFERHEADERTYPE *camera_ppBuffer_in; + int camera_ready; + OMX_HANDLETYPE render; + OMX_HANDLETYPE null_sink; + OMX_HANDLETYPE clock; + int flushed; + VCOS_SEMAPHORE_T handler_lock; + OMX_BUFFERHEADERTYPE* eglBuffer; + void* eglImage; +} appctx; + +// Ugly, stupid utility functions +static void say(const char* message, ...) { +/* va_list args; + char str[1024]; + memset(str, 0, sizeof(str)); + va_start(args, message); + vsnprintf(str, sizeof(str) - 1, message, args); + va_end(args); + size_t str_len = strnlen(str, sizeof(str)); + if(str[str_len - 1] != '\n') { + str[str_len] = '\n'; + } + fprintf(stderr, str);*/ +} + +static void die(const char* message, ...) { + va_list args; + char str[1024]; + memset(str, 0, sizeof(str)); + va_start(args, message); + vsnprintf(str, sizeof(str), message, args); + va_end(args); + say(str); + exit(1); +} + +static void omx_die(OMX_ERRORTYPE error, const char* message, ...) { + va_list args; + char str[1024]; + char *e; + memset(str, 0, sizeof(str)); + va_start(args, message); + vsnprintf(str, sizeof(str), message, args); + va_end(args); + switch(error) { + case OMX_ErrorNone: e = "no error"; break; + case OMX_ErrorBadParameter: e = "bad parameter"; break; + case OMX_ErrorIncorrectStateOperation: e = "invalid state while trying to perform command"; break; + case OMX_ErrorIncorrectStateTransition: e = "unallowed state transition"; break; + case OMX_ErrorInsufficientResources: e = "insufficient resource"; break; + case OMX_ErrorBadPortIndex: e = "bad port index, i.e. incorrect port"; break; + case OMX_ErrorHardware: e = "hardware error"; break; + /* That's all I've encountered during hacking so let's not bother with the rest... */ + default: e = "(no description)"; + } + die("OMX error: %s: 0x%08x %s", str, error, e); +} + +static void dump_event(OMX_HANDLETYPE hComponent, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2) { + char *e; + switch(eEvent) { + case OMX_EventCmdComplete: e = "command complete"; break; + case OMX_EventError: e = "error"; break; + case OMX_EventParamOrConfigChanged: e = "parameter or configuration changed"; break; + case OMX_EventPortSettingsChanged: e = "port settings changed"; break; + /* That's all I've encountered during hacking so let's not bother with the rest... */ + default: + e = "(no description)"; + } + say("Received event 0x%08x %s, hComponent:0x%08x, nData1:0x%08x, nData2:0x%08x", + eEvent, e, hComponent, nData1, nData2); +} + +static const char* dump_compression_format(OMX_VIDEO_CODINGTYPE c) { + char *f; + switch(c) { + case OMX_VIDEO_CodingUnused: return "not used"; + case OMX_VIDEO_CodingAutoDetect: return "autodetect"; + case OMX_VIDEO_CodingMPEG2: return "MPEG2"; + case OMX_VIDEO_CodingH263: return "H.263"; + case OMX_VIDEO_CodingMPEG4: return "MPEG4"; + case OMX_VIDEO_CodingWMV: return "Windows Media Video"; + case OMX_VIDEO_CodingRV: return "RealVideo"; + case OMX_VIDEO_CodingAVC: return "H.264/AVC"; + case OMX_VIDEO_CodingMJPEG: return "Motion JPEG"; + case OMX_VIDEO_CodingVP6: return "VP6"; + case OMX_VIDEO_CodingVP7: return "VP7"; + case OMX_VIDEO_CodingVP8: return "VP8"; + case OMX_VIDEO_CodingYUV: return "Raw YUV video"; + case OMX_VIDEO_CodingSorenson: return "Sorenson"; + case OMX_VIDEO_CodingTheora: return "OGG Theora"; + case OMX_VIDEO_CodingMVC: return "H.264/MVC"; + + default: + f = calloc(23, sizeof(char)); + if(f == NULL) { + die("Failed to allocate memory"); + } + snprintf(f, 23 * sizeof(char) - 1, "format type 0x%08x", c); + return f; + } +} +static const char* dump_color_format(OMX_COLOR_FORMATTYPE c) { + char *f; + switch(c) { + case OMX_COLOR_FormatUnused: return "OMX_COLOR_FormatUnused: not used"; + case OMX_COLOR_FormatMonochrome: return "OMX_COLOR_FormatMonochrome"; + case OMX_COLOR_Format8bitRGB332: return "OMX_COLOR_Format8bitRGB332"; + case OMX_COLOR_Format12bitRGB444: return "OMX_COLOR_Format12bitRGB444"; + case OMX_COLOR_Format16bitARGB4444: return "OMX_COLOR_Format16bitARGB4444"; + case OMX_COLOR_Format16bitARGB1555: return "OMX_COLOR_Format16bitARGB1555"; + case OMX_COLOR_Format16bitRGB565: return "OMX_COLOR_Format16bitRGB565"; + case OMX_COLOR_Format16bitBGR565: return "OMX_COLOR_Format16bitBGR565"; + case OMX_COLOR_Format18bitRGB666: return "OMX_COLOR_Format18bitRGB666"; + case OMX_COLOR_Format18bitARGB1665: return "OMX_COLOR_Format18bitARGB1665"; + case OMX_COLOR_Format19bitARGB1666: return "OMX_COLOR_Format19bitARGB1666"; + case OMX_COLOR_Format24bitRGB888: return "OMX_COLOR_Format24bitRGB888"; + case OMX_COLOR_Format24bitBGR888: return "OMX_COLOR_Format24bitBGR888"; + case OMX_COLOR_Format24bitARGB1887: return "OMX_COLOR_Format24bitARGB1887"; + case OMX_COLOR_Format25bitARGB1888: return "OMX_COLOR_Format25bitARGB1888"; + case OMX_COLOR_Format32bitBGRA8888: return "OMX_COLOR_Format32bitBGRA8888"; + case OMX_COLOR_Format32bitARGB8888: return "OMX_COLOR_Format32bitARGB8888"; + case OMX_COLOR_FormatYUV411Planar: return "OMX_COLOR_FormatYUV411Planar"; + case OMX_COLOR_FormatYUV411PackedPlanar: return "OMX_COLOR_FormatYUV411PackedPlanar: Planes fragmented when a frame is split in multiple buffers"; + case OMX_COLOR_FormatYUV420Planar: return "OMX_COLOR_FormatYUV420Planar: Planar YUV, 4:2:0 (I420)"; + case OMX_COLOR_FormatYUV420PackedPlanar: return "OMX_COLOR_FormatYUV420PackedPlanar: Planar YUV, 4:2:0 (I420), planes fragmented when a frame is split in multiple buffers"; + case OMX_COLOR_FormatYUV420SemiPlanar: return "OMX_COLOR_FormatYUV420SemiPlanar, Planar YUV, 4:2:0 (NV12), U and V planes interleaved with first U value"; + case OMX_COLOR_FormatYUV422Planar: return "OMX_COLOR_FormatYUV422Planar"; + case OMX_COLOR_FormatYUV422PackedPlanar: return "OMX_COLOR_FormatYUV422PackedPlanar: Planes fragmented when a frame is split in multiple buffers"; + case OMX_COLOR_FormatYUV422SemiPlanar: return "OMX_COLOR_FormatYUV422SemiPlanar"; + case OMX_COLOR_FormatYCbYCr: return "OMX_COLOR_FormatYCbYCr"; + case OMX_COLOR_FormatYCrYCb: return "OMX_COLOR_FormatYCrYCb"; + case OMX_COLOR_FormatCbYCrY: return "OMX_COLOR_FormatCbYCrY"; + case OMX_COLOR_FormatCrYCbY: return "OMX_COLOR_FormatCrYCbY"; + case OMX_COLOR_FormatYUV444Interleaved: return "OMX_COLOR_FormatYUV444Interleaved"; + case OMX_COLOR_FormatRawBayer8bit: return "OMX_COLOR_FormatRawBayer8bit"; + case OMX_COLOR_FormatRawBayer10bit: return "OMX_COLOR_FormatRawBayer10bit"; + case OMX_COLOR_FormatRawBayer8bitcompressed: return "OMX_COLOR_FormatRawBayer8bitcompressed"; + case OMX_COLOR_FormatL2: return "OMX_COLOR_FormatL2"; + case OMX_COLOR_FormatL4: return "OMX_COLOR_FormatL4"; + case OMX_COLOR_FormatL8: return "OMX_COLOR_FormatL8"; + case OMX_COLOR_FormatL16: return "OMX_COLOR_FormatL16"; + case OMX_COLOR_FormatL24: return "OMX_COLOR_FormatL24"; + case OMX_COLOR_FormatL32: return "OMX_COLOR_FormatL32"; + case OMX_COLOR_FormatYUV420PackedSemiPlanar: return "OMX_COLOR_FormatYUV420PackedSemiPlanar: Planar YUV, 4:2:0 (NV12), planes fragmented when a frame is split in multiple buffers, U and V planes interleaved with first U value"; + case OMX_COLOR_FormatYUV422PackedSemiPlanar: return "OMX_COLOR_FormatYUV422PackedSemiPlanar: Planes fragmented when a frame is split in multiple buffers"; + case OMX_COLOR_Format18BitBGR666: return "OMX_COLOR_Format18BitBGR666"; + case OMX_COLOR_Format24BitARGB6666: return "OMX_COLOR_Format24BitARGB6666"; + case OMX_COLOR_Format24BitABGR6666: return "OMX_COLOR_Format24BitABGR6666"; + case OMX_COLOR_Format32bitABGR8888: return "OMX_COLOR_Format32bitABGR8888"; + case OMX_COLOR_Format8bitPalette: return "OMX_COLOR_Format8bitPalette"; + case OMX_COLOR_FormatYUVUV128: return "OMX_COLOR_FormatYUVUV128"; + case OMX_COLOR_FormatRawBayer12bit: return "OMX_COLOR_FormatRawBayer12bit"; + case OMX_COLOR_FormatBRCMEGL: return "OMX_COLOR_FormatBRCMEGL"; + case OMX_COLOR_FormatBRCMOpaque: return "OMX_COLOR_FormatBRCMOpaque"; + case OMX_COLOR_FormatYVU420PackedPlanar: return "OMX_COLOR_FormatYVU420PackedPlanar"; + case OMX_COLOR_FormatYVU420PackedSemiPlanar: return "OMX_COLOR_FormatYVU420PackedSemiPlanar"; + default: + f = calloc(23, sizeof(char)); + if(f == NULL) { + die("Failed to allocate memory"); + } + snprintf(f, 23 * sizeof(char) - 1, "format type 0x%08x", c); + return f; + } +} + +static void dump_portdef(OMX_PARAM_PORTDEFINITIONTYPE* portdef) { + say("Port %d is %s, %s, buffers wants:%d needs:%d, size:%d, pop:%d, aligned:%d", + portdef->nPortIndex, + (portdef->eDir == OMX_DirInput ? "input" : "output"), + (portdef->bEnabled == OMX_TRUE ? "enabled" : "disabled"), + portdef->nBufferCountActual, + portdef->nBufferCountMin, + portdef->nBufferSize, + portdef->bPopulated, + portdef->nBufferAlignment); + + OMX_VIDEO_PORTDEFINITIONTYPE *viddef = &portdef->format.video; + OMX_IMAGE_PORTDEFINITIONTYPE *imgdef = &portdef->format.image; + switch(portdef->eDomain) { + case OMX_PortDomainVideo: + say("Video type:\n" + "\tWidth:\t\t%d\n" + "\tHeight:\t\t%d\n" + "\tStride:\t\t%d\n" + "\tSliceHeight:\t%d\n" + "\tBitrate:\t%d\n" + "\tFramerate:\t%.02f\n" + "\tError hiding:\t%s\n" + "\tCodec:\t\t%s\n" + "\tColor:\t\t%s\n", + viddef->nFrameWidth, + viddef->nFrameHeight, + viddef->nStride, + viddef->nSliceHeight, + viddef->nBitrate, + ((float)viddef->xFramerate / (float)65536), + (viddef->bFlagErrorConcealment == OMX_TRUE ? "yes" : "no"), + dump_compression_format(viddef->eCompressionFormat), + dump_color_format(viddef->eColorFormat)); + break; + case OMX_PortDomainImage: + say("Image type:\n" + "\tWidth:\t\t%d\n" + "\tHeight:\t\t%d\n" + "\tStride:\t\t%d\n" + "\tSliceHeight:\t%d\n" + "\tError hiding:\t%s\n" + "\tCodec:\t\t%s\n" + "\tColor:\t\t%s\n", + imgdef->nFrameWidth, + imgdef->nFrameHeight, + imgdef->nStride, + imgdef->nSliceHeight, + (imgdef->bFlagErrorConcealment == OMX_TRUE ? "yes" : "no"), + dump_compression_format(imgdef->eCompressionFormat), + dump_color_format(imgdef->eColorFormat)); + break; + default: + break; + } +} + +static void dump_port(OMX_HANDLETYPE hComponent, OMX_U32 nPortIndex, OMX_BOOL dumpformats) { + OMX_ERRORTYPE r; + OMX_PARAM_PORTDEFINITIONTYPE portdef; + OMX_INIT_STRUCTURE(portdef); + portdef.nPortIndex = nPortIndex; + if((r = OMX_GetParameter(hComponent, OMX_IndexParamPortDefinition, &portdef)) != OMX_ErrorNone) { + omx_die(r, "Failed to get port definition for port %d", nPortIndex); + } + dump_portdef(&portdef); + if(dumpformats) { + OMX_VIDEO_PARAM_PORTFORMATTYPE portformat; + OMX_INIT_STRUCTURE(portformat); + portformat.nPortIndex = nPortIndex; + portformat.nIndex = 0; + r = OMX_ErrorNone; + say("Port %d supports these video formats:", nPortIndex); + while(r == OMX_ErrorNone) { + if((r = OMX_GetParameter(hComponent, OMX_IndexParamVideoPortFormat, &portformat)) == OMX_ErrorNone) { + say("\t%s, compression: %s", dump_color_format(portformat.eColorFormat), dump_compression_format(portformat.eCompressionFormat)); + portformat.nIndex++; + } + } + } +} + +// Some busy loops to verify we're running in order +static void block_until_state_changed(OMX_HANDLETYPE hComponent, OMX_STATETYPE wanted_eState) { + OMX_STATETYPE eState; + int i = 0; + while(i++ == 0 || eState != wanted_eState) { + OMX_GetState(hComponent, &eState); + if(eState != wanted_eState) { + usleep(10000); + } + } +} + +static void block_until_port_changed(OMX_HANDLETYPE hComponent, OMX_U32 nPortIndex, OMX_BOOL bEnabled) { + OMX_ERRORTYPE r; + OMX_PARAM_PORTDEFINITIONTYPE portdef; + OMX_INIT_STRUCTURE(portdef); + portdef.nPortIndex = nPortIndex; + OMX_U32 i = 0; + while(i++ == 0 || portdef.bEnabled != bEnabled) { + if((r = OMX_GetParameter(hComponent, OMX_IndexParamPortDefinition, &portdef)) != OMX_ErrorNone) { + omx_die(r, "Failed to get port definition"); + } + if(portdef.bEnabled != bEnabled) { + usleep(10000); + } + } +} + +static void block_until_flushed(appctx *ctx) { + int quit; + while(!quit) { + vcos_semaphore_wait(&ctx->handler_lock); + if(ctx->flushed) { + ctx->flushed = 0; + quit = 1; + } + vcos_semaphore_post(&ctx->handler_lock); + if(!quit) { + usleep(10000); + } + } +} + +static void init_component_handle( + const char *name, + OMX_HANDLETYPE* hComponent, + OMX_PTR pAppData, + OMX_CALLBACKTYPE* callbacks) { + OMX_ERRORTYPE r; + char fullname[32]; + + // Get handle + memset(fullname, 0, sizeof(fullname)); + strcat(fullname, "OMX.broadcom."); + strncat(fullname, name, strlen(fullname) - 1); + say("Initializing component %s", fullname); + if((r = OMX_GetHandle(hComponent, fullname, pAppData, callbacks)) != OMX_ErrorNone) { + omx_die(r, "Failed to get handle for component %s", fullname); + } + + // Disable ports + OMX_INDEXTYPE types[] = { + OMX_IndexParamAudioInit, + OMX_IndexParamVideoInit, + OMX_IndexParamImageInit, + OMX_IndexParamOtherInit + }; + OMX_PORT_PARAM_TYPE ports; + OMX_INIT_STRUCTURE(ports); + OMX_GetParameter(*hComponent, OMX_IndexParamVideoInit, &ports); + + int i; + for(i = 0; i < 4; i++) { + if(OMX_GetParameter(*hComponent, types[i], &ports) == OMX_ErrorNone) { + OMX_U32 nPortIndex; + for(nPortIndex = ports.nStartPortNumber; nPortIndex < ports.nStartPortNumber + ports.nPorts; nPortIndex++) { + say("Disabling port %d of component %s", nPortIndex, fullname); + if((r = OMX_SendCommand(*hComponent, OMX_CommandPortDisable, nPortIndex, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to disable port %d of component %s", nPortIndex, fullname); + } + block_until_port_changed(*hComponent, nPortIndex, OMX_FALSE); + } + } + } +} + +// Global signal handler for trapping SIGINT, SIGTERM, and SIGQUIT +static void signal_handler(int signal) { + want_quit = 1; +} + +OMX_ERRORTYPE my_fill_buffer_done(OMX_HANDLETYPE hComponent, + OMX_PTR pAppData, OMX_BUFFERHEADERTYPE* pBuffer) +{ + appctx *ctx = (appctx *) pAppData; + + if (OMX_FillThisBuffer(ctx->render, ctx->eglBuffer) != OMX_ErrorNone) + { + printf("OMX_FillThisBuffer failed in callback\n"); + exit(1); + } + return OMX_ErrorNone; +} + +// OMX calls this handler for all the events it emits +static OMX_ERRORTYPE event_handler( + OMX_HANDLETYPE hComponent, + OMX_PTR pAppData, + OMX_EVENTTYPE eEvent, + OMX_U32 nData1, + OMX_U32 nData2, + OMX_PTR pEventData) { + + dump_event(hComponent, eEvent, nData1, nData2); + + appctx *ctx = (appctx *)pAppData; + + switch(eEvent) { + case OMX_EventCmdComplete: + vcos_semaphore_wait(&ctx->handler_lock); + if(nData1 == OMX_CommandFlush) { + ctx->flushed = 1; + } + vcos_semaphore_post(&ctx->handler_lock); + break; + case OMX_EventParamOrConfigChanged: + vcos_semaphore_wait(&ctx->handler_lock); + if(nData2 == OMX_IndexParamCameraDeviceNumber) { + ctx->camera_ready = 1; + } + vcos_semaphore_post(&ctx->handler_lock); + break; + case OMX_EventError: + omx_die(nData1, "error event received"); + break; + default: + break; + } + + return OMX_ErrorNone; +} + +void *video_decode_test(void* arg) { + bcm_host_init(); + + CUBE_STATE_T *state = (CUBE_STATE_T *)arg; + + OMX_ERRORTYPE r; + + if((r = OMX_Init()) != OMX_ErrorNone) { + omx_die(r, "OMX initalization failed"); + } + + // Init context + appctx ctx; + memset(&ctx, 0, sizeof(ctx)); + if(vcos_semaphore_create(&ctx.handler_lock, "handler_lock", 1) != VCOS_SUCCESS) { + die("Failed to create handler lock semaphore"); + } + + ctx.eglImage = state->eglImage; + + // Init component handles + OMX_CALLBACKTYPE callbacks; + memset(&ctx, 0, sizeof(callbacks)); + callbacks.EventHandler = event_handler; + callbacks.FillBufferDone = my_fill_buffer_done; + + init_component_handle("camera", &ctx.camera , &ctx, &callbacks); + init_component_handle("egl_render", &ctx.render, &ctx, &callbacks); + init_component_handle("null_sink", &ctx.null_sink, &ctx, &callbacks); + init_component_handle("clock", &ctx.clock, &ctx, &callbacks); + + OMX_U32 screen_width = state->screen_width, screen_height = state->screen_height; + if(graphics_get_display_size(DISPLAY_DEVICE, &screen_width, &screen_height) < 0) { + die("Failed to get display size"); + } + + say("Configuring camera..."); + + dump_port(ctx.clock, 80, OMX_TRUE); + say("Default port definition for camera input port 73"); + dump_port(ctx.camera, 73, OMX_TRUE); + say("Default port definition for camera preview output port 70"); + dump_port(ctx.camera, 70, OMX_TRUE); + say("Default port definition for camera video output port 71"); + dump_port(ctx.camera, 71, OMX_TRUE); + + OMX_TIME_CONFIG_CLOCKSTATETYPE cstate; + OMX_INIT_STRUCTURE(cstate); + cstate.eState = OMX_TIME_ClockStateRunning; + cstate.nWaitMask = 1; + if((r = OMX_SetConfig(ctx.clock, OMX_IndexConfigTimeClockState, &cstate)) != OMX_ErrorNone) { + omx_die(r, "Failed to request camera device number parameter change callback for camera"); + } + + // Request a callback to be made when OMX_IndexParamCameraDeviceNumber is + // changed signaling that the camera device is ready for use. + OMX_CONFIG_REQUESTCALLBACKTYPE cbtype; + OMX_INIT_STRUCTURE(cbtype); + cbtype.nPortIndex = OMX_ALL; + cbtype.nIndex = OMX_IndexParamCameraDeviceNumber; + cbtype.bEnable = OMX_TRUE; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigRequestCallback, &cbtype)) != OMX_ErrorNone) { + omx_die(r, "Failed to request camera device number parameter change callback for camera"); + } + // Set device number, this triggers the callback configured just above + OMX_PARAM_U32TYPE device; + OMX_INIT_STRUCTURE(device); + device.nPortIndex = OMX_ALL; + device.nU32 = CAM_DEVICE_NUMBER; + if((r = OMX_SetParameter(ctx.camera, OMX_IndexParamCameraDeviceNumber, &device)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera parameter device number"); + } + // Configure video format emitted by camera preview output port + OMX_PARAM_PORTDEFINITIONTYPE camera_portdef; + OMX_INIT_STRUCTURE(camera_portdef); + camera_portdef.nPortIndex = 70; + if((r = OMX_GetParameter(ctx.camera, OMX_IndexParamPortDefinition, &camera_portdef)) != OMX_ErrorNone) { + omx_die(r, "Failed to get port definition for camera preview output port 70"); + } + camera_portdef.format.video.nFrameWidth = state->screen_width; + camera_portdef.format.video.nFrameHeight = state->screen_height; + camera_portdef.format.video.xFramerate = VIDEO_FRAMERATE << 16; + // Stolen from gstomxvideodec.c of gst-omx + camera_portdef.format.video.nStride = (camera_portdef.format.video.nFrameWidth + camera_portdef.nBufferAlignment - 1) & (~(camera_portdef.nBufferAlignment - 1)); + camera_portdef.format.video.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar; + if((r = OMX_SetParameter(ctx.camera, OMX_IndexParamPortDefinition, &camera_portdef)) != OMX_ErrorNone) { + omx_die(r, "Failed to set port definition for camera preview output port 70"); + } + // Configure video format emitted by camera video output port + // Use configuration from camera preview output as basis for + // camera video output configuration + OMX_INIT_STRUCTURE(camera_portdef); + camera_portdef.nPortIndex = 70; + if((r = OMX_GetParameter(ctx.camera, OMX_IndexParamPortDefinition, &camera_portdef)) != OMX_ErrorNone) { + omx_die(r, "Failed to get port definition for camera preview output port 70"); + } + camera_portdef.nPortIndex = 71; + if((r = OMX_SetParameter(ctx.camera, OMX_IndexParamPortDefinition, &camera_portdef)) != OMX_ErrorNone) { + omx_die(r, "Failed to set port definition for camera video output port 71"); + } + // Configure frame rate + OMX_CONFIG_FRAMERATETYPE framerate; + OMX_INIT_STRUCTURE(framerate); + framerate.nPortIndex = 70; + framerate.xEncodeFramerate = camera_portdef.format.video.xFramerate; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigVideoFramerate, &framerate)) != OMX_ErrorNone) { + omx_die(r, "Failed to set framerate configuration for camera preview output port 70"); + } + framerate.nPortIndex = 71; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigVideoFramerate, &framerate)) != OMX_ErrorNone) { + omx_die(r, "Failed to set framerate configuration for camera video output port 71"); + } + // Configure sharpness + OMX_CONFIG_SHARPNESSTYPE sharpness; + OMX_INIT_STRUCTURE(sharpness); + sharpness.nPortIndex = OMX_ALL; + sharpness.nSharpness = CAM_SHARPNESS; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonSharpness, &sharpness)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera sharpness configuration"); + } + // Configure contrast + OMX_CONFIG_CONTRASTTYPE contrast; + OMX_INIT_STRUCTURE(contrast); + contrast.nPortIndex = OMX_ALL; + contrast.nContrast = CAM_CONTRAST; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonContrast, &contrast)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera contrast configuration"); + } + // Configure saturation + OMX_CONFIG_SATURATIONTYPE saturation; + OMX_INIT_STRUCTURE(saturation); + saturation.nPortIndex = OMX_ALL; + saturation.nSaturation = CAM_SATURATION; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonSaturation, &saturation)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera saturation configuration"); + } + // Configure brightness + OMX_CONFIG_BRIGHTNESSTYPE brightness; + OMX_INIT_STRUCTURE(brightness); + brightness.nPortIndex = OMX_ALL; + brightness.nBrightness = CAM_BRIGHTNESS; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonBrightness, &brightness)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera brightness configuration"); + } + // Configure exposure value + OMX_CONFIG_EXPOSUREVALUETYPE exposure_value; + OMX_INIT_STRUCTURE(exposure_value); + exposure_value.nPortIndex = OMX_ALL; + exposure_value.xEVCompensation = CAM_EXPOSURE_VALUE_COMPENSTAION; + exposure_value.bAutoSensitivity = CAM_EXPOSURE_AUTO_SENSITIVITY; + exposure_value.bAutoShutterSpeed = OMX_TRUE; + exposure_value.nSensitivity = CAM_EXPOSURE_ISO_SENSITIVITY; + exposure_value.eMetering = OMX_MeteringModeAverage; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonExposureValue, &exposure_value)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera exposure value configuration"); + } + OMX_CONFIG_EXPOSURECONTROLTYPE exposure; + OMX_INIT_STRUCTURE(exposure); + exposure.nPortIndex = OMX_ALL; + exposure.eExposureControl = OMX_ExposureControlAuto; + OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonExposure, &exposure); + // Configure frame frame stabilisation + OMX_CONFIG_FRAMESTABTYPE frame_stabilisation_control; + OMX_INIT_STRUCTURE(frame_stabilisation_control); + frame_stabilisation_control.nPortIndex = OMX_ALL; + frame_stabilisation_control.bStab = CAM_FRAME_STABILISATION; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonFrameStabilisation, &frame_stabilisation_control)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera frame frame stabilisation control configuration"); + } + // Configure frame white balance control + OMX_CONFIG_WHITEBALCONTROLTYPE white_balance_control; + OMX_INIT_STRUCTURE(white_balance_control); + white_balance_control.nPortIndex = OMX_ALL; + white_balance_control.eWhiteBalControl = CAM_WHITE_BALANCE_CONTROL; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonWhiteBalance, &white_balance_control)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera frame white balance control configuration"); + } + // Configure image filter + OMX_CONFIG_IMAGEFILTERTYPE image_filter; + OMX_INIT_STRUCTURE(image_filter); + image_filter.nPortIndex = OMX_ALL; + image_filter.eImageFilter = CAM_IMAGE_FILTER; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonImageFilter, &image_filter)) != OMX_ErrorNone) { + omx_die(r, "Failed to set camera image filter configuration"); + } + /* Set colour effect */ + OMX_CONFIG_COLORENHANCEMENTTYPE colour; + OMX_INIT_STRUCTURE(colour); + colour.nPortIndex = OMX_ALL; + colour.bColorEnhancement = OMX_FALSE; + colour.nCustomizedU = 128; + colour.nCustomizedV = 128; + OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonColorEnhancement, &colour); + + // Configure mirror + OMX_MIRRORTYPE eMirror = OMX_MirrorNone; + if(CAM_FLIP_HORIZONTAL && !CAM_FLIP_VERTICAL) { + eMirror = OMX_MirrorHorizontal; + } else if(!CAM_FLIP_HORIZONTAL && CAM_FLIP_VERTICAL) { + eMirror = OMX_MirrorVertical; + } else if(CAM_FLIP_HORIZONTAL && CAM_FLIP_VERTICAL) { + eMirror = OMX_MirrorBoth; + } + OMX_CONFIG_MIRRORTYPE mirror; + OMX_INIT_STRUCTURE(mirror); + mirror.nPortIndex = 71; + mirror.eMirror = eMirror; + if((r = OMX_SetConfig(ctx.camera, OMX_IndexConfigCommonMirror, &mirror)) != OMX_ErrorNone) { + omx_die(r, "Failed to set mirror configuration for camera video output port 71"); + } + + // Ensure camera is ready + while(!ctx.camera_ready) { + usleep(10000); + } + + say("Configuring render..."); + + say("Default port definition for render input port 90"); + dump_port(ctx.render, 220, OMX_TRUE); + + // Render input port definition is done automatically upon tunneling + + + say("Configuring null sink..."); + + say("Default port definition for null sink input port 240"); + dump_port(ctx.null_sink, 240, OMX_TRUE); + + // Null sink input port definition is done automatically upon tunneling + + // Tunnel camera preview output port and null sink input port + say("Setting up tunnel from camera preview output port 70 to null sink input port 240..."); + if((r = OMX_SetupTunnel(ctx.clock, 80, ctx.camera, 73)) != OMX_ErrorNone) { + omx_die(r, "Failed to setup tunnel between camera preview output port 70 and null sink input port 240"); + } + // Tunnel camera preview output port and null sink input port + say("Setting up tunnel from camera preview output port 70 to null sink input port 240..."); + if((r = OMX_SetupTunnel(ctx.camera, 70, ctx.null_sink, 240)) != OMX_ErrorNone) { + omx_die(r, "Failed to setup tunnel between camera preview output port 70 and null sink input port 240"); + } + + // Tunnel camera video output port and render input port + say("Setting up tunnel from camera video output port 71 to render input port 220..."); + if((r = OMX_SetupTunnel(ctx.camera, 71, ctx.render, 220)) != OMX_ErrorNone) { + omx_die(r, "Failed to setup tunnel between camera video output port 71 and render input port 90"); + } + + // Switch components to idle state + say("Switching state of the camera component to idle..."); + if((r = OMX_SendCommand(ctx.clock, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the camera component to idle"); + } + block_until_state_changed(ctx.clock, OMX_StateIdle); say("Switching state of the camera component to idle..."); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the camera component to idle"); + } + block_until_state_changed(ctx.camera, OMX_StateIdle); + say("Switching state of the render component to idle..."); + if((r = OMX_SendCommand(ctx.render, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the render component to idle"); + } + block_until_state_changed(ctx.render, OMX_StateIdle); + say("Switching state of the null sink component to idle..."); + if((r = OMX_SendCommand(ctx.null_sink, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the null sink component to idle"); + } + block_until_state_changed(ctx.null_sink, OMX_StateIdle); + + // Enable ports + say("Enabling ports..."); + if((r = OMX_SendCommand(ctx.clock, OMX_CommandPortEnable, 80, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to enable camera input port 73"); + } + block_until_port_changed(ctx.clock, 80, OMX_TRUE); if((r = OMX_SendCommand(ctx.camera, OMX_CommandPortEnable, 73, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to enable camera input port 73"); + } + block_until_port_changed(ctx.camera, 73, OMX_TRUE); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandPortEnable, 70, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to enable camera preview output port 70"); + } + block_until_port_changed(ctx.camera, 70, OMX_TRUE); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandPortEnable, 71, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to enable camera video output port 71"); + } + block_until_port_changed(ctx.camera, 71, OMX_TRUE); + if((r = OMX_SendCommand(ctx.render, OMX_CommandPortEnable, 220, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to enable render input port 220"); + } + block_until_port_changed(ctx.render, 220, OMX_TRUE); + if((r = OMX_SendCommand(ctx.render, OMX_CommandPortEnable, 221, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to enable render input port 221"); + } + block_until_port_changed(ctx.render, 220, OMX_TRUE); + if((r = OMX_SendCommand(ctx.null_sink, OMX_CommandPortEnable, 240, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to enable null sink input port 240"); + } + block_until_port_changed(ctx.null_sink, 240, OMX_TRUE); + + // Allocate camera input buffer, buffers for tunneled + // ports are allocated internally by OMX + + if((r = OMX_UseEGLImage(ctx.render, &ctx.eglBuffer, 221, NULL, ctx.eglImage)) != OMX_ErrorNone) + { + omx_die(r, "Failed to use eglimage"); + } + + // Switch state of the components prior to starting + // the video capture and encoding loop + say("Switching state of the camera component to executing..."); + if((r = OMX_SendCommand(ctx.clock, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the camera component to executing"); + } say("Switching state of the camera component to executing..."); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the camera component to executing"); + } + block_until_state_changed(ctx.camera, OMX_StateExecuting); + say("Switching state of the render component to executing..."); + if((r = OMX_SendCommand(ctx.render, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the render component to executing"); + } + block_until_state_changed(ctx.render, OMX_StateExecuting); + say("Switching state of the null sink component to executing..."); + if((r = OMX_SendCommand(ctx.null_sink, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the null sink component to executing"); + } + block_until_state_changed(ctx.null_sink, OMX_StateExecuting); + + // Start capturing video with the camera + say("Switching on capture on camera video output port 71..."); + OMX_CONFIG_PORTBOOLEANTYPE capture; + OMX_INIT_STRUCTURE(capture); + capture.nPortIndex = 71; + capture.bEnabled = OMX_TRUE; + if((r = OMX_SetParameter(ctx.camera, OMX_IndexConfigPortCapturing, &capture)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch on capture on camera video output port 71"); + } + + say("Configured port definition for camera input port 73"); + dump_port(ctx.camera, 73, OMX_FALSE); + say("Configured port definition for camera preview output port 70"); + dump_port(ctx.camera, 70, OMX_FALSE); + say("Configured port definition for camera video output port 71"); + dump_port(ctx.camera, 71, OMX_FALSE); + say("Configured port definition for render input port 90"); + dump_port(ctx.render, 220, OMX_FALSE); + say("Configured port definition for null sink input port 240"); + dump_port(ctx.null_sink, 240, OMX_FALSE); + + say("Enter capture and playback loop, press Ctrl-C to quit..."); + + if((r = OMX_FillThisBuffer(ctx.render, ctx.eglBuffer)) != OMX_ErrorNone) + { + omx_die(r, "Failed to fill buffer"); + } + + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + signal(SIGQUIT, signal_handler); + + while(!want_quit) { + // Would be better to use signaling here but hey this works too + usleep(1000); + } + say("Cleaning up..."); + + // Restore signal handlers + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + + // Stop capturing video with the camera + OMX_INIT_STRUCTURE(capture); + capture.nPortIndex = 71; + capture.bEnabled = OMX_FALSE; + if((r = OMX_SetParameter(ctx.camera, OMX_IndexConfigPortCapturing, &capture)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch off capture on camera video output port 71"); + } + + // Flush the buffers on each component + if((r = OMX_SendCommand(ctx.camera, OMX_CommandFlush, 73, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to flush buffers of camera input port 73"); + } + block_until_flushed(&ctx); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandFlush, 70, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to flush buffers of camera preview output port 70"); + } + block_until_flushed(&ctx); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandFlush, 71, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to flush buffers of camera video output port 71"); + } + block_until_flushed(&ctx); + if((r = OMX_SendCommand(ctx.render, OMX_CommandFlush, 220, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to flush buffers of render input port 220"); + } + block_until_flushed(&ctx); + if((r = OMX_SendCommand(ctx.null_sink, OMX_CommandFlush, 240, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to flush buffers of null sink input port 240"); + } + block_until_flushed(&ctx); + + // Disable all the ports + if((r = OMX_SendCommand(ctx.camera, OMX_CommandPortDisable, 73, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to disable camera input port 73"); + } + block_until_port_changed(ctx.camera, 73, OMX_FALSE); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandPortDisable, 70, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to disable camera preview output port 70"); + } + block_until_port_changed(ctx.camera, 70, OMX_FALSE); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandPortDisable, 71, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to disable camera video output port 71"); + } + block_until_port_changed(ctx.camera, 71, OMX_FALSE); + if((r = OMX_SendCommand(ctx.render, OMX_CommandPortDisable, 220, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to disable render input port 90"); + } + if((r = OMX_SendCommand(ctx.null_sink, OMX_CommandPortDisable, 240, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to disable null sink input port 240"); + } + block_until_port_changed(ctx.null_sink, 240, OMX_FALSE); + + // Free all the buffers + if((r = OMX_FreeBuffer(ctx.camera, 73, ctx.camera_ppBuffer_in)) != OMX_ErrorNone) { + omx_die(r, "Failed to free buffer for camera input port 73"); + } + + // Transition all the components to idle and then to loaded states + if((r = OMX_SendCommand(ctx.camera, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the camera component to idle"); + } + block_until_state_changed(ctx.camera, OMX_StateIdle); + if((r = OMX_SendCommand(ctx.render, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the render component to idle"); + } + block_until_state_changed(ctx.render, OMX_StateIdle); + if((r = OMX_SendCommand(ctx.null_sink, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the null sink component to idle"); + } + block_until_state_changed(ctx.null_sink, OMX_StateIdle); + if((r = OMX_SendCommand(ctx.camera, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the camera component to loaded"); + } + block_until_state_changed(ctx.camera, OMX_StateLoaded); + if((r = OMX_SendCommand(ctx.render, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the render component to loaded"); + } + block_until_state_changed(ctx.render, OMX_StateLoaded); + if((r = OMX_SendCommand(ctx.null_sink, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) { + omx_die(r, "Failed to switch state of the null sink component to loaded"); + } + block_until_state_changed(ctx.null_sink, OMX_StateLoaded); + + // Free the component handles + if((r = OMX_FreeHandle(ctx.camera)) != OMX_ErrorNone) { + omx_die(r, "Failed to free camera component handle"); + } + if((r = OMX_FreeHandle(ctx.render)) != OMX_ErrorNone) { + omx_die(r, "Failed to free render component handle"); + } + if((r = OMX_FreeHandle(ctx.null_sink)) != OMX_ErrorNone) { + omx_die(r, "Failed to free null sink component handle"); + } + + // Exit + vcos_semaphore_delete(&ctx.handler_lock); + if((r = OMX_Deinit()) != OMX_ErrorNone) { + omx_die(r, "OMX de-initalization failed"); + } + + say("Exit!"); + + return 0; +} +