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

📄 vout.c

📁 VLC媒体播放程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                if( ( p_ev->key_flags & Pk_KF_Key_Down ) &&                    ( p_ev->key_flags & Pk_KF_Sym_Valid ) )                {                    switch( i_key )                    {                    case Pk_q:                    case Pk_Q:                        p_vout->p_vlc->b_die = 1;                        break;                    case Pk_f:                    case Pk_F:                        p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;                        break;                    case Pk_c:                    case Pk_C:                        p_vout->b_grayscale = ! p_vout->b_grayscale;                        p_vout->i_changes |= VOUT_GRAYSCALE_CHANGE;                        break;                    default:                        break;                    }                }            }        }    } while( i_ev != -1 && i_ev != 0 );    free( p_event );    /*     * fullscreen     */    if( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE )    {        PhDim_t dim;        p_vout->b_fullscreen = !p_vout->b_fullscreen;        p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;        if( p_vout->b_fullscreen )        {            p_vout->p_sys->old_pos.x = p_vout->p_sys->pos.x;            p_vout->p_sys->old_pos.y = p_vout->p_sys->pos.y;            p_vout->p_sys->pos.x = p_vout->p_sys->pos.y = 0;            dim.w = p_vout->p_sys->screen_dim.w + 1;            dim.h = p_vout->p_sys->screen_dim.h + 1;        }        else        {            p_vout->p_sys->pos.x = p_vout->p_sys->old_pos.x;            p_vout->p_sys->pos.y = p_vout->p_sys->old_pos.y;            dim.w = p_vout->p_sys->old_dim.w + 1;            dim.h = p_vout->p_sys->old_dim.h + 1;        }        /* modify render flags, border */        PtSetResource( p_vout->p_sys->p_window,            Pt_ARG_WINDOW_RENDER_FLAGS,            p_vout->b_fullscreen ? Pt_FALSE : Pt_TRUE,            Ph_WM_RENDER_BORDER | Ph_WM_RENDER_TITLE );        /* set position and dimension */        PtSetResource( p_vout->p_sys->p_window,                       Pt_ARG_POS, &p_vout->p_sys->pos, 0 );        PtSetResource( p_vout->p_sys->p_window,                       Pt_ARG_DIM, &dim, 0 );        /* mark as damaged to force redraw */        PtDamageWidget( p_vout->p_sys->p_window );    }    /*     * size change     */    if( p_vout->i_changes & VOUT_SIZE_CHANGE )    {        p_vout->i_changes &= ~VOUT_SIZE_CHANGE;        if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY )        {            ResizeOverlayOutput(p_vout);        }#if 0        else        {            p_vout->output.i_width = p_vout->p_sys->dim.w;            p_vout->output.i_height = p_vout->p_sys->dim.h;            p_vout->i_changes |= VOUT_YUV_CHANGE;            QNXEnd( p_vout );            if( QNXInit( p_vout ) )            {                msg_Err( p_vout, "cannot resize display" );                return( 1 );            }        }#endif        msg_Dbg( p_vout, "video display resized (%dx%d)",                         p_vout->p_sys->dim.w, p_vout->p_sys->dim.h );    }    /*     * position change, move video channel     */    if( b_repos && p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY )    {        ResizeOverlayOutput(p_vout);    }    return( i_ev == -1 );}/***************************************************************************** * QNXDisplay: displays previously rendered output ***************************************************************************** * This function send the currently rendered image to QNX server, wait until * it is displayed and switch the two rendering buffer, preparing next frame. *****************************************************************************/static void QNXDisplay( vout_thread_t *p_vout, picture_t *p_pic ){    if( p_vout->p_sys->i_mode == MODE_NORMAL_MEM ||        p_vout->p_sys->i_mode == MODE_SHARED_MEM )    {        PhPoint_t pos = { 0, 0 };        PgSetRegion( PtWidgetRid( p_vout->p_sys->p_window ) );        if (p_vout->p_sys->i_screen_depth == 8)        {            PgSetPalette( p_vout->p_sys->p_colors, 0, 0, 255, Pg_PALSET_SOFT, 0);        }        PgDrawPhImagemx( &pos, p_pic->p_sys->p_image, 0 );        PgFlush();    }    else if( p_vout->p_sys->i_mode == MODE_VIDEO_MEM )    {        PhRect_t rc = { { 0, 0 }, { p_vout->output.i_width, p_vout->output.i_height } };//        PgSetRegion( PtWidgetRid ( p_vout->p_sys->p_window ) );        PgContextBlit( p_pic->p_sys->p_ctx[0], &rc, NULL, &rc );        PgFlush();    }}/***************************************************************************** * QNXInitDisplay: check screen resolution, depth, amount of video ram, etc *****************************************************************************/static int QNXInitDisplay( vout_thread_t * p_vout ){    PgHWCaps_t hwcaps;    PgDisplaySettings_t cfg;    PgVideoModeInfo_t minfo;    /* get graphics card hw capabilities */    if( PgGetGraphicsHWCaps( &hwcaps ) != 0 )    {        msg_Err( p_vout, "unable to get gfx card capabilities" );        return( 1 );    }    /* get current video mode */    if( PgGetVideoMode( &cfg ) != 0 )    {        msg_Err( p_vout, "unable to get current video mode" );        return( 1 );    }    /* get video mode info */    if( PgGetVideoModeInfo( cfg.mode, &minfo ) != 0 )    {        msg_Err( p_vout, "unable to get info for video mode" );        return( 1 );    }    if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY )    {        int i = 0;        PgScalerCaps_t vcaps;        if( ( p_vout->p_sys->p_channel =            PgCreateVideoChannel( Pg_VIDEO_CHANNEL_SCALER, 0 ) ) == NULL )        {            msg_Err( p_vout, "unable to create video channel" );            printf("errno = %d\n", errno);            p_vout->p_sys->i_mode = MODE_NORMAL_MEM;        }        else        {            vcaps.size = sizeof( vcaps );            while( PgGetScalerCapabilities( p_vout->p_sys->p_channel,                                            i++, &vcaps ) == 0 )            {                printf("vcaps.format = 0x%x\n", vcaps.format);                if( vcaps.format == Pg_VIDEO_FORMAT_YV12 ||                    vcaps.format == Pg_VIDEO_FORMAT_YUV420 ||                    vcaps.format == Pg_VIDEO_FORMAT_YUY2 ||                    vcaps.format == Pg_VIDEO_FORMAT_UYVY ||                    vcaps.format == Pg_VIDEO_FORMAT_RGB555 ||                    vcaps.format == Pg_VIDEO_FORMAT_RGB565 ||                    vcaps.format == Pg_VIDEO_FORMAT_RGB8888 )                {                    p_vout->p_sys->i_vc_flags  = vcaps.flags;                    p_vout->p_sys->i_vc_format = vcaps.format;                }                vcaps.size = sizeof( vcaps );            }            if( p_vout->p_sys->i_vc_format == 0 )            {                msg_Warn( p_vout, "need YV12, YUY2 or RGB8888 overlay" );                p_vout->p_sys->i_mode = MODE_NORMAL_MEM;            }        }    }    /* use video ram if we have enough available */    if( p_vout->p_sys->i_mode == MODE_NORMAL_MEM &&        (minfo.bits_per_pixel != 8) &&        hwcaps.currently_available_video_ram >=        ( ( minfo.width * minfo.height * minfo.bits_per_pixel * MAX_DIRECTBUFFERS) / 8 ) )    {        p_vout->p_sys->i_mode = MODE_VIDEO_MEM;        printf("Using video memory...\n");    }    p_vout->p_sys->i_img_type = minfo.type;    p_vout->p_sys->screen_dim.w = minfo.width;    p_vout->p_sys->screen_dim.h = minfo.height;    p_vout->p_sys->i_screen_depth = minfo.bits_per_pixel;    switch( p_vout->p_sys->i_screen_depth )    {        case 8:            p_vout->output.i_chroma = VLC_FOURCC('R','G','B','2');            p_vout->p_sys->i_bytes_per_pixel = 1;            p_vout->output.pf_setpalette = SetPalette;            break;        case 15:            p_vout->output.i_chroma = VLC_FOURCC('R','V','1','5');            p_vout->p_sys->i_bytes_per_pixel = 2;            p_vout->output.i_rmask = 0x7c00;            p_vout->output.i_gmask = 0x03e0;            p_vout->output.i_bmask = 0x001f;            break;        case 16:            p_vout->output.i_chroma = VLC_FOURCC('R','V','1','6');            p_vout->p_sys->i_bytes_per_pixel = 2;            p_vout->output.i_rmask = 0xf800;            p_vout->output.i_gmask = 0x07e0;            p_vout->output.i_bmask = 0x001f;            break;        case 24:            p_vout->output.i_chroma = VLC_FOURCC('R','V','2','4');            p_vout->p_sys->i_bytes_per_pixel = 3;            p_vout->output.i_rmask = 0xff0000;            p_vout->output.i_gmask = 0x00ff00;            p_vout->output.i_bmask = 0x0000ff;            break;        case 32:        default:            p_vout->output.i_chroma = VLC_FOURCC('R','V','3','2');            p_vout->p_sys->i_bytes_per_pixel = 4;            p_vout->output.i_rmask = 0xff0000;            p_vout->output.i_gmask = 0x00ff00;            p_vout->output.i_bmask = 0x0000ff;            break;    }    return( 0 );}/***************************************************************************** * QNXCreateWnd: create and realize the main window *****************************************************************************/static int QNXCreateWnd( vout_thread_t * p_vout ){    PtArg_t args[8];    PhPoint_t pos = { 0, 0 };    PgColor_t color = Pg_BLACK;    if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY )    {        if( p_vout->p_sys->i_vc_flags & Pg_SCALER_CAP_DST_CHROMA_KEY )        {            color = PgGetOverlayChromaColor();        }    }    /* fullscreen, set dimension */    if( p_vout->b_fullscreen )    {        p_vout->p_sys->old_dim.w = p_vout->p_sys->dim.w;        p_vout->p_sys->old_dim.h = p_vout->p_sys->dim.h;        p_vout->output.i_width = p_vout->p_sys->dim.w = p_vout->p_sys->screen_dim.w;        p_vout->output.i_height = p_vout->p_sys->dim.h = p_vout->p_sys->screen_dim.h;    }    /* set window parameters */    PtSetArg( &args[0], Pt_ARG_POS, &pos, 0 );    PtSetArg( &args[1], Pt_ARG_DIM, &p_vout->p_sys->dim, 0 );    PtSetArg( &args[2], Pt_ARG_FILL_COLOR, color, 0 );    PtSetArg( &args[3], Pt_ARG_WINDOW_TITLE, "VideoLan Client", 0 );    PtSetArg( &args[4], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_CLOSE );    PtSetArg( &args[5], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE,              Ph_WM_MOVE | Ph_WM_RESIZE | Ph_WM_CLOSE );    PtSetArg( &args[6], Pt_ARG_WINDOW_RENDER_FLAGS,              p_vout->b_fullscreen ? Pt_FALSE : Pt_TRUE,              Ph_WM_RENDER_BORDER | Ph_WM_RENDER_TITLE );    /* create window */    p_vout->p_sys->p_window = PtCreateWidget( PtWindow, Pt_NO_PARENT, 7, args);    if( p_vout->p_sys->p_window == NULL )    {        msg_Err( p_vout, "unable to create window" );        return( 1 );    }    /* realize the window widget */    if( PtRealizeWidget( p_vout->p_sys->p_window ) != 0 )    {        msg_Err( p_vout, "unable to realize window widget" );        PtDestroyWidget( p_vout->p_sys->p_window );        return( 1 );    }    /* get window frame size */    if( PtWindowFrameSize( NULL, p_vout->p_sys->p_window,                           &p_vout->p_sys->frame ) != 0 )    {        msg_Err( p_vout, "unable to get window frame size" );        PtDestroyWidget( p_vout->p_sys->p_window );        return( 1 );    }    return( 0 );}/***************************************************************************** * QNXDestroyWnd: unrealize and destroy the main window *****************************************************************************/static int QNXDestroyWnd( vout_thread_t * p_vout ){    /* destroy the window widget */    PtUnrealizeWidget( p_vout->p_sys->p_window );//    PtDestroyWidget( p_vout->p_sys->p_window );    /* destroy video channel */    if( p_vout->p_sys->i_mode == MODE_VIDEO_OVERLAY )    {        PgDestroyVideoChannel( p_vout->p_sys->p_channel );    }    return( 0 );}

⌨️ 快捷键说明

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