Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * code stolen from openGL-RPi-tutorial-master/encode_OGL/
- cc -g -D_GNU_SOURCE -DUSE_OPENGL -DUSE_EGL -DIS_RPI -DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -g -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -pipe -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -Wno-psabi -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I./ -I/opt/vc/src/hello_pi/libs/ilclient -I/opt/vc/src/hello_pi/libs/vgfont -g -c rectangle.c -o rectangle.o -Wno-deprecated-declarations && cc -o rectangle -Wl,--whole-archive rectangle.o -L/opt/vc/lib/ -lGLESv2 -lEGL -lbcm_host -lvcos -lvchiq_arm -lpthread -lrt -Wl,-rpath=./libs -lmpv -L/opt/vc/src/hello_pi/libs/vgfont -ldl -lm -Wl,--no-whole-archive -rdynamic && ./rectangle
- */
- #include <stdio.h>
- #include <assert.h>
- #include <math.h>
- #include <EGL/egl.h>
- #include <EGL/eglext.h>
- #include <GLES2/gl2.h>
- #include <GLES2/gl2ext.h>
- #include <mpv/client.h>
- #include <mpv/opengl_cb.h>
- static void die (int line_number, const char * format, ...)
- {
- va_list vargs;
- va_start (vargs, format);
- fprintf (stderr, "%d: ", line_number);
- vfprintf (stderr, format, vargs);
- fprintf (stderr, ".\n");
- exit (1);
- }
- static void *get_proc_address(const GLubyte *name)
- {
- void *p = eglGetProcAddress(name);
- // EGL 1.4 (supported by the RPI firmware) does not necessarily return
- // function pointers for core functions.
- if (!p)
- p = dlsym(RTLD_DEFAULT, name);
- return p;
- }
- static void *get_proc_address_mpv(void *fn_ctx, const char *name)
- {
- return get_proc_address(name);
- }
- typedef struct
- {
- uint32_t screen_width;
- uint32_t screen_height;
- EGLDisplay display;
- EGLSurface surface;
- EGLContext context;
- } CUBE_STATE_T;
- CUBE_STATE_T state, *p_state = &state;
- void init_ogl(CUBE_STATE_T *state)
- {
- int32_t success = 0;
- EGLBoolean result;
- EGLint num_config;
- bcm_host_init();
- 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);
- // initialize the EGL display connection
- result = eglInitialize(state->display, NULL, NULL);
- // 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 = 1024;
- state->screen_height = 1024;
- 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);
- }
- int
- main(int argc, char *argv[])
- {
- bcm_host_init();
- init_ogl(p_state);
- // MPV
- mpv_handle *mpv = mpv_create();
- if (!mpv) die(143, "context init failed");
- if (mpv_initialize(mpv) < 0) die(144, "mpv init failed");
- // The OpenGL API is somewhat separate from the normal mpv API. This only
- // returns NULL if no OpenGL support is compiled.
- mpv_opengl_cb_context *mpv_gl = mpv_get_sub_api(mpv, MPV_SUB_API_OPENGL_CB);
- if (!mpv_gl) die(149, "failed to create mpv GL API handle");
- // This makes mpv use the currently set GL context. It will use the callback
- // to resolve GL builtin functions, as well as extensions.
- int err = mpv_opengl_cb_init_gl(mpv_gl, NULL, get_proc_address_mpv, NULL);
- if (err < 0) die(err, "failed to initialize mpv GL context ");
- if (mpv_set_option_string(mpv, "vo", "opengl-cb") < 0) die(162, "failed to set VO");
- const char *cmd[] = {"loadfile", "/home/pi/media/bbb.mp4", NULL};
- mpv_command(mpv, cmd);
- glClearColor(1.0, 0.0, 0.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glFlush();
- eglSwapBuffers(p_state->display, p_state->surface);
- while (1) {
- //glClearColor(1.0, 0.0, 0.0, 1.0);
- //glClear(GL_COLOR_BUFFER_BIT);
- mpv_opengl_cb_draw(mpv_gl, 0, 800, -600);
- //glFlush();
- eglSwapBuffers(p_state->display, p_state->surface);
- //sleep(1);
- /*
- glClearColor(0.0, 1.0, 0.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glFlush();
- mpv_opengl_cb_draw(mpv_gl, 0, 800, -600);
- eglSwapBuffers(p_state->display, p_state->surface);
- sleep(1);
- */
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement