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

📄 vout.c

📁 VLC媒体播放程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************** * NewPicture: allocate a picture ***************************************************************************** * Returns 0 on success, -1 otherwise *****************************************************************************/static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic, int index ){    /* We know the chroma, allocate a buffer which will be used     * directly by the decoder */    p_pic->p_sys = malloc( sizeof( picture_sys_t ) );    if( p_pic->p_sys == NULL )    {        return -1;    }    switch( p_vout->p_sys->i_mode )    {    case MODE_NORMAL_MEM:    case MODE_SHARED_MEM:        /* create images for [shared] memory blit */        if( !( p_pic->p_sys->p_image = PhCreateImage( NULL,                    p_vout->p_sys->dim.w, p_vout->p_sys->dim.h,                    p_vout->p_sys->i_img_type, NULL, 0,                    p_vout->p_sys->i_mode == MODE_SHARED_MEM ) ) ) {            msg_Err( p_vout, "cannot create image" );            free( p_pic->p_sys );            return( -1 );        }        p_pic->p->p_pixels = p_pic->p_sys->p_image->image;        p_pic->p->i_lines = p_pic->p_sys->p_image->size.h;        p_pic->p->i_pitch = p_pic->p_sys->p_image->bpl;        p_pic->p->i_pixel_pitch = p_vout->p_sys->i_bytes_per_pixel;        p_pic->p->i_visible_pitch = p_vout->p_sys->i_bytes_per_pixel                                     * p_pic->p_sys->p_image->size.w;        p_pic->i_planes = 1;        break;    case MODE_VIDEO_MEM:        /* create offscreen contexts for video memory blit */        if( ( p_pic->p_sys->p_ctx[0] = PdCreateOffscreenContext( 0,                        p_vout->p_sys->dim.w, p_vout->p_sys->dim.h,                       Pg_OSC_MEM_PAGE_ALIGN) ) == NULL )        {            msg_Err( p_vout, "unable to create offscreen context" );            free( p_pic->p_sys );            return( -1 );        }        /* get context pointers */        if( (  p_pic->p_sys->p_buf[0] =            PdGetOffscreenContextPtr ( p_pic->p_sys->p_ctx[0] ) ) == NULL )        {            msg_Err( p_vout, "unable to get offscreen context ptr" );            PhDCRelease ( p_pic->p_sys->p_ctx[0] );            p_pic->p_sys->p_ctx[0] = NULL;            free( p_pic->p_sys );            return( -1 );        }        p_vout->p_sys->i_bytes_per_line = p_pic->p_sys->p_ctx[0]->pitch;        memset( p_pic->p_sys->p_buf[0], 0,            p_vout->p_sys->i_bytes_per_line * p_vout->p_sys->dim.h );        p_pic->p->p_pixels = p_pic->p_sys->p_buf[0];        p_pic->p->i_lines = p_pic->p_sys->p_ctx[0]->dim.h;        p_pic->p->i_pitch = p_pic->p_sys->p_ctx[0]->pitch;        p_pic->p->i_pixel_pitch = p_vout->p_sys->i_bytes_per_pixel;        p_pic->p->i_visible_pitch = p_vout->p_sys->i_bytes_per_pixel                                     * p_pic->p_sys->p_ctx[0]->dim.w;        p_pic->i_planes = 1;        break;    case MODE_VIDEO_OVERLAY:        if (index == 0)        {            p_pic->p_sys->p_ctx[Y_PLANE] = p_vout->p_sys->p_channel->yplane1;            p_pic->p_sys->p_ctx[U_PLANE] = p_vout->p_sys->p_channel->uplane1;            p_pic->p_sys->p_ctx[V_PLANE] = p_vout->p_sys->p_channel->vplane1;        }        else        {            p_pic->p_sys->p_ctx[Y_PLANE] = p_vout->p_sys->p_channel->yplane2;            p_pic->p_sys->p_ctx[U_PLANE] = p_vout->p_sys->p_channel->uplane2;            p_pic->p_sys->p_ctx[V_PLANE] = p_vout->p_sys->p_channel->vplane2;        }        p_pic->p_sys->p_buf[Y_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[Y_PLANE] );        if( p_pic->p_sys->p_buf[Y_PLANE] == NULL )        {            msg_Err( p_vout, "unable to get video channel ctx ptr" );            return( 1 );        }        switch (p_vout->p_sys->i_vc_format)        {            case Pg_VIDEO_FORMAT_YUV420:                p_vout->output.i_chroma = VLC_FOURCC('I','4','2','0');                p_pic->p_sys->p_buf[U_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[U_PLANE] );                p_pic->p_sys->p_buf[V_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[V_PLANE] );                if( p_pic->p_sys->p_buf[U_PLANE] == NULL ||                    p_pic->p_sys->p_buf[V_PLANE] == NULL )                {                    msg_Err( p_vout, "unable to get video channel ctx ptr" );                    return( 1 );                }                p_pic->Y_PIXELS = p_pic->p_sys->p_buf[Y_PLANE];                p_pic->p[Y_PLANE].i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h;                p_pic->p[Y_PLANE].i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch;                p_pic->p[Y_PLANE].i_pixel_pitch = 1;                p_pic->p[Y_PLANE].i_visible_pitch = p_pic->p[Y_PLANE].i_pitch;                p_pic->U_PIXELS = p_pic->p_sys->p_buf[U_PLANE];                p_pic->p[U_PLANE].i_lines = p_pic->p_sys->p_ctx[U_PLANE]->dim.h;                p_pic->p[U_PLANE].i_pitch = p_pic->p_sys->p_ctx[U_PLANE]->pitch;                p_pic->p[U_PLANE].i_pixel_pitch = 1;                p_pic->p[U_PLANE].i_visible_pitch = p_pic->p[U_PLANE].i_pitch;                p_pic->V_PIXELS = p_pic->p_sys->p_buf[V_PLANE];                p_pic->p[V_PLANE].i_lines = p_pic->p_sys->p_ctx[V_PLANE]->dim.h;                p_pic->p[V_PLANE].i_pitch = p_pic->p_sys->p_ctx[V_PLANE]->pitch;                p_pic->p[V_PLANE].i_pixel_pitch = 1;                p_pic->p[V_PLANE].i_visible_pitch = p_pic->p[V_PLANE].i_pitch;                p_pic->i_planes = 3;                break;            case Pg_VIDEO_FORMAT_YV12:                p_vout->output.i_chroma = VLC_FOURCC('Y','V','1','2');                p_pic->p_sys->p_buf[U_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[U_PLANE] );                p_pic->p_sys->p_buf[V_PLANE] = PdGetOffscreenContextPtr( p_pic->p_sys->p_ctx[V_PLANE] );                if( p_pic->p_sys->p_buf[U_PLANE] == NULL ||                    p_pic->p_sys->p_buf[V_PLANE] == NULL )                {                    msg_Err( p_vout, "unable to get video channel ctx ptr" );                    return( 1 );                }                p_pic->Y_PIXELS = p_pic->p_sys->p_buf[Y_PLANE];                p_pic->p[Y_PLANE].i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h;                p_pic->p[Y_PLANE].i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch;                p_pic->p[Y_PLANE].i_pixel_pitch = 1;                p_pic->p[Y_PLANE].i_visible_pitch = p_pic->p[Y_PLANE].i_pitch;                p_pic->U_PIXELS = p_pic->p_sys->p_buf[U_PLANE];                p_pic->p[U_PLANE].i_lines = p_pic->p_sys->p_ctx[U_PLANE]->dim.h;                p_pic->p[U_PLANE].i_pitch = p_pic->p_sys->p_ctx[U_PLANE]->pitch;                p_pic->p[U_PLANE].i_pixel_pitch = 1;                p_pic->p[U_PLANE].i_visible_pitch = p_pic->p[U_PLANE].i_pitch;                p_pic->V_PIXELS = p_pic->p_sys->p_buf[V_PLANE];                p_pic->p[V_PLANE].i_lines = p_pic->p_sys->p_ctx[V_PLANE]->dim.h;                p_pic->p[V_PLANE].i_pitch = p_pic->p_sys->p_ctx[V_PLANE]->pitch;                p_pic->p[V_PLANE].i_pixel_pitch = 1;                p_pic->p[V_PLANE].i_visible_pitch = p_pic->p[V_PLANE].i_pitch;                p_pic->i_planes = 3;                break;            case Pg_VIDEO_FORMAT_UYVY:            case Pg_VIDEO_FORMAT_YUY2:                if (p_vout->p_sys->i_vc_format == Pg_VIDEO_FORMAT_UYVY)                {                    p_vout->output.i_chroma = VLC_FOURCC('U','Y','V','Y');                }                else                {                    p_vout->output.i_chroma = VLC_FOURCC('Y','U','Y','2');                }                p_pic->p->p_pixels = p_pic->p_sys->p_buf[Y_PLANE];                p_pic->p->i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h;                p_pic->p->i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch;                p_pic->p->i_pixel_pitch = 4;                p_pic->p->i_visible_pitch = p_pic->p->i_pitch;                p_pic->i_planes = 1;                break;            case Pg_VIDEO_FORMAT_RGB555:                p_vout->output.i_chroma = VLC_FOURCC('R','V','1','5');                p_vout->output.i_rmask = 0x001f;                p_vout->output.i_gmask = 0x03e0;                p_vout->output.i_bmask = 0x7c00;                p_pic->p->p_pixels = p_pic->p_sys->p_buf[Y_PLANE];                p_pic->p->i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h;                p_pic->p->i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch;                p_pic->p->i_pixel_pitch = 2;                p_pic->p->i_visible_pitch = 2 * p_pic->p_sys->p_ctx[Y_PLANE]->dim.w;                p_pic->i_planes = 1;                break;            case Pg_VIDEO_FORMAT_RGB565:                p_vout->output.i_chroma = VLC_FOURCC('R','V','1','6');                p_vout->output.i_rmask = 0x001f;                p_vout->output.i_gmask = 0x07e0;                p_vout->output.i_bmask = 0xf800;                p_pic->p->p_pixels = p_pic->p_sys->p_buf[Y_PLANE];                p_pic->p->i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h;                p_pic->p->i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch;                p_pic->p->i_pixel_pitch = 4;                p_pic->p->i_visible_pitch = 4 * p_pic->p_sys->p_ctx[Y_PLANE]->dim.w;                p_pic->i_planes = 1;                break;            case Pg_VIDEO_FORMAT_RGB8888:                p_vout->output.i_chroma = VLC_FOURCC('R','V','3','2');                p_vout->output.i_rmask = 0x000000ff;                p_vout->output.i_gmask = 0x0000ff00;                p_vout->output.i_bmask = 0x00ff0000;                p_pic->p->p_pixels = p_pic->p_sys->p_buf[Y_PLANE];                p_pic->p->i_lines = p_pic->p_sys->p_ctx[Y_PLANE]->dim.h;                p_pic->p->i_pitch = p_pic->p_sys->p_ctx[Y_PLANE]->pitch;                p_pic->p->i_pixel_pitch = 4;                p_pic->p->i_visible_pitch = 4 * p_pic->p_sys->p_ctx[Y_PLANE]->dim.w;                p_pic->i_planes = 1;                break;        }#if 0    switch( p_vout->output.i_chroma )    {#ifdef MODULE_NAME_IS_xvideo        case VLC_FOURCC('Y','2','1','1'):            p_pic->p->p_pixels = p_pic->p_sys->p_image->data                                  + p_pic->p_sys->p_image->offsets[0];            p_pic->p->i_lines = p_vout->output.i_height;            /* XXX: this just looks so plain wrong... check it out ! */            p_pic->p->i_pitch = p_pic->p_sys->p_image->pitches[0] / 4;            p_pic->p->i_pixel_pitch = 4;            p_pic->p->i_visible_pitch = p_pic->p->i_pitch;            p_pic->i_planes = 1;            break;#endif#endif    default:        /* This shouldn't happen ! */        break;    }    return 0;}/***************************************************************************** * FreePicture: destroy a picture allocated with NewPicture ***************************************************************************** * Destroy XImage AND associated data. If using Shm, detach shared memory * segment from server and process, then free it. The XDestroyImage manpage * says that both the image structure _and_ the data pointed to by the * image structure are freed, so no need to free p_image->data. *****************************************************************************/static void FreePicture( 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 ) &&        p_pic->p_sys->p_image )    {        PhReleaseImage( p_pic->p_sys->p_image );        free( p_pic->p_sys->p_image );    }    else if( p_vout->p_sys->i_mode == MODE_VIDEO_MEM &&             p_pic->p_sys->p_ctx[0] )    {        PhDCRelease( p_pic->p_sys->p_ctx[0] );    }    free( p_pic->p_sys );}static int ResizeOverlayOutput(vout_thread_t *p_vout){    int i_width, i_height, i_x, i_y;    int i_ret;    PgScalerProps_t props;    props.size   = sizeof( props );    props.format = p_vout->p_sys->i_vc_format;    props.flags  = Pg_SCALER_PROP_SCALER_ENABLE |                          Pg_SCALER_PROP_DOUBLE_BUFFER;    /* enable chroma keying if available */    if( p_vout->p_sys->i_vc_flags & Pg_SCALER_CAP_DST_CHROMA_KEY )    {        props.flags |= Pg_SCALER_PROP_CHROMA_ENABLE;    }    /* set viewport position */    props.viewport.ul.x = p_vout->p_sys->pos.x;    props.viewport.ul.y = p_vout->p_sys->pos.y;    if( !p_vout->b_fullscreen )    {        props.viewport.ul.x += p_vout->p_sys->frame.ul.x;        props.viewport.ul.y += p_vout->p_sys->frame.ul.y;    }    /* set viewport dimension */    vout_PlacePicture( p_vout, p_vout->p_sys->dim.w,                           p_vout->p_sys->dim.h,                           &i_x, &i_y, &i_width, &i_height );    props.viewport.ul.x += i_x;    props.viewport.ul.y += i_y;    props.viewport.lr.x = i_width + props.viewport.ul.x;    props.viewport.lr.y = i_height + props.viewport.ul.y;    /* set source dimension */    props.src_dim.w = p_vout->output.i_width;    props.src_dim.h = p_vout->output.i_height;    /* configure scaler channel */    i_ret = PgConfigScalerChannel( p_vout->p_sys->p_channel, &props );    if( i_ret == -1 )    {        msg_Err( p_vout, "unable to configure video channel" );        return( 1 );    }    return ( 0 );}/***************************************************************************** * SetPalette: sets an 8 bpp palette ***************************************************************************** * This function sets the palette given as an argument. It does not return * anything, but could later send information on which colors it was unable * to set. *****************************************************************************/static void SetPalette( vout_thread_t *p_vout,                        uint16_t *red, uint16_t *green, uint16_t *blue ){    int i;    /* allocate palette */    for( i = 0; i < 255; i++ )    {        /* kludge: colors are indexed reversely because color 255 seems         * to be reserved for black even if we try to set it to white */        p_vout->p_sys->p_colors[ i ] = PgRGB( red[ i ] >> 8, green[ i ] >> 8, blue[ i ] >> 8 );    }}

⌨️ 快捷键说明

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