⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opengllayer.m

📁 VLC Player Source Code
💻 M
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * opengl.c: CAOpenGLLayer (Mac OS X) video output. Display a video output in * a layer. The layer will register itself to the drawable object stored in  * the "drawable" variable.  ***************************************************************************** * Copyright (C) 2004 the VideoLAN team * $Id$ * * Authors: Cyril Deguet <asmax@videolan.org> *          Gildas Bazin <gbazin@videolan.org> *          Eric Petit <titer@m0k.org> *          Cedric Cocquebert <cedric.cocquebert@supelec.fr> *          Pierre d'Herbemont <pdherbemont # videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <errno.h>                                                 /* ENOMEM */#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <vlc_plugin.h>#include <vlc_vout.h>#import <QuartzCore/QuartzCore.h>#import <Cocoa/Cocoa.h>#import <OpenGL/OpenGL.h>/* On OS X, use GL_TEXTURE_RECTANGLE_EXT instead of GL_TEXTURE_2D.   This allows sizes which are not powers of 2 */#define VLCGL_TARGET GL_TEXTURE_RECTANGLE_EXT/* OS X OpenGL supports YUV. Hehe. */#define VLCGL_FORMAT GL_YCBCR_422_APPLE#define VLCGL_TYPE   GL_UNSIGNED_SHORT_8_8_APPLE/* RV32 */#define VLCGL_RGB_FORMAT GL_RGBA#define VLCGL_RGB_TYPE GL_UNSIGNED_BYTE/* YUY2 */#ifndef YCBCR_MESA#define YCBCR_MESA 0x8757#endif#ifndef UNSIGNED_SHORT_8_8_MESA#define UNSIGNED_SHORT_8_8_MESA 0x85BA#endif#define VLCGL_YUV_FORMAT YCBCR_MESA#define VLCGL_YUV_TYPE UNSIGNED_SHORT_8_8_MESA#ifndef GL_CLAMP_TO_EDGE#   define GL_CLAMP_TO_EDGE 0x812F#endif@interface VLCVideoView : NSObject- (void)addVoutLayer:(CALayer *)layer;@end/***************************************************************************** * Vout interface *****************************************************************************/static int  CreateVout   ( vlc_object_t * );static void DestroyVout  ( vlc_object_t * );static int  Init         ( vout_thread_t * );static void End          ( vout_thread_t * );static int  Manage       ( vout_thread_t * );static void Render       ( vout_thread_t *, picture_t * );static void DisplayVideo ( vout_thread_t *, picture_t * );static int  Control      ( vout_thread_t *, int, va_list );static int InitTextures  ( vout_thread_t * );vlc_module_begin();    set_shortname( "OpenGLLayer" );    set_category( CAT_VIDEO );    set_subcategory( SUBCAT_VIDEO_VOUT );    set_description( N_("Core Animation OpenGL Layer (Mac OS X)") );    set_capability( "video output", 20 );    add_shortcut( "opengllayer" );    set_callbacks( CreateVout, DestroyVout );vlc_module_end();@interface VLCVoutLayer : CAOpenGLLayer {    vout_thread_t * p_vout;}+ (id)layerWithVout:(vout_thread_t*)_p_vout; @end/***************************************************************************** * vout_sys_t: video output method descriptor ***************************************************************************** * This structure is part of the video output thread descriptor. * It describes the OpenGL specific properties of the output thread. *****************************************************************************/struct vout_sys_t{    vout_thread_t * p_vout;    uint8_t    *pp_buffer[2]; /* one last rendered, one to be rendered */    int         i_index;    bool  b_frame_available;        CGLContextObj glContext;    int         i_tex_width;    int         i_tex_height;    GLuint      p_textures[2];    NSAutoreleasePool *autorealease_pool;    VLCVoutLayer * o_layer;    id          o_cocoa_container;};/***************************************************************************** * CreateVout: This function allocates and initializes the OpenGL vout method. *****************************************************************************/static int CreateVout( vlc_object_t *p_this ){    vout_thread_t *p_vout = (vout_thread_t *)p_this;    vout_sys_t *p_sys;    char * psz;    /* Allocate structure */    p_vout->p_sys = p_sys = calloc( sizeof( vout_sys_t ), 1 );    if( p_sys == NULL )    {        msg_Err( p_vout, "out of memory" );        return VLC_EGENERIC;    }    p_sys->i_tex_width  = p_vout->fmt_in.i_width;    p_sys->i_tex_height = p_vout->fmt_in.i_height;    msg_Dbg( p_vout, "Texture size: %dx%d", p_sys->i_tex_width,             p_sys->i_tex_height );    p_vout->pf_init = Init;    p_vout->pf_end = End;    p_vout->pf_manage = Manage;    p_vout->pf_render = Render;    p_vout->pf_display = DisplayVideo;    p_vout->pf_control = Control;    return VLC_SUCCESS;}/***************************************************************************** * Init: initialize the OpenGL video thread output method *****************************************************************************/static int Init( vout_thread_t *p_vout ){    vout_sys_t *p_sys = p_vout->p_sys;    int i_pixel_pitch;    vlc_value_t val;#if ( defined( WORDS_BIGENDIAN ) && VLCGL_FORMAT == GL_YCBCR_422_APPLE ) || (VLCGL_FORMAT == YCBCR_MESA)    p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');    i_pixel_pitch = 2;#elif (VLCGL_FORMAT == GL_YCBCR_422_APPLE)    p_vout->output.i_chroma = VLC_FOURCC('U','Y','V','Y');    i_pixel_pitch = 2;#endif    /* Since OpenGL can do rescaling for us, stick to the default     * coordinates and aspect. */    p_vout->output.i_width  = p_vout->render.i_width;    p_vout->output.i_height = p_vout->render.i_height;    p_vout->output.i_aspect = p_vout->render.i_aspect;    /* We do need a drawable to work properly */    vlc_value_t value_drawable;    var_Create( p_vout, "drawable", VLC_VAR_DOINHERIT );    var_Get( p_vout, "drawable", &value_drawable );    p_vout->p_sys->o_cocoa_container = (id) value_drawable.i_int;        p_vout->fmt_out = p_vout->fmt_in;    p_vout->fmt_out.i_chroma = p_vout->output.i_chroma;    /* We know the chroma, allocate two buffer which will be used     * directly by the decoder */    int i;    for( i = 0; i < 2; i++ )    {        p_sys->pp_buffer[i] =            malloc( p_sys->i_tex_width * p_sys->i_tex_height * i_pixel_pitch );        if( !p_sys->pp_buffer[i] )        {            msg_Err( p_vout, "out of memory" );            return VLC_EGENERIC;        }    }    p_sys->b_frame_available = false;    p_sys->i_index = 0;    p_vout->p_picture[0].i_planes = 1;    p_vout->p_picture[0].p->p_pixels = p_sys->pp_buffer[p_sys->i_index];    p_vout->p_picture[0].p->i_lines = p_vout->output.i_height;    p_vout->p_picture[0].p->i_visible_lines = p_vout->output.i_height;    p_vout->p_picture[0].p->i_pixel_pitch = i_pixel_pitch;    p_vout->p_picture[0].p->i_pitch = p_vout->output.i_width *        p_vout->p_picture[0].p->i_pixel_pitch;    p_vout->p_picture[0].p->i_visible_pitch = p_vout->output.i_width *        p_vout->p_picture[0].p->i_pixel_pitch;    p_vout->p_picture[0].i_status = DESTROYED_PICTURE;    p_vout->p_picture[0].i_type   = DIRECT_PICTURE;    PP_OUTPUTPICTURE[ 0 ] = &p_vout->p_picture[0];    I_OUTPUTPICTURES = 1;    p_sys->autorealease_pool = [[NSAutoreleasePool alloc] init];    [VLCVoutLayer performSelectorOnMainThread:@selector(autoinitInVout:)                             withObject:[NSValue valueWithPointer:p_vout]                             waitUntilDone:YES];    return 0;}/***************************************************************************** * End: terminate GLX video thread output method *****************************************************************************/static void End( vout_thread_t *p_vout ){    vout_sys_t *p_sys = p_vout->p_sys;    p_vout->p_sys->b_frame_available = false;    [p_vout->p_sys->o_cocoa_container performSelectorOnMainThread:@selector(removeVoutLayer:) withObject:p_vout->p_sys->o_layer waitUntilDone:YES];    // Should be done automatically    [p_sys->o_layer release];    [p_sys->autorealease_pool release];    /* Free the texture buffer*/    free( p_sys->pp_buffer[0] );    free( p_sys->pp_buffer[1] );}/*****************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -