vout_pictures.c

来自「VLC Player Source Code」· C语言 代码 · 共 1,098 行 · 第 1/3 页

C
1,098
字号
            p_pic->p[ Y_PLANE ].i_visible_lines = i_height;            p_pic->p[ Y_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ Y_PLANE ].i_visible_pitch = i_width;            p_pic->p[ U_PLANE ].i_lines = i_height_aligned / 2;            p_pic->p[ U_PLANE ].i_visible_lines = i_height / 2;            p_pic->p[ U_PLANE ].i_pitch = i_width_aligned / 2;            p_pic->p[ U_PLANE ].i_visible_pitch = i_width / 2;            p_pic->p[ V_PLANE ].i_lines = i_height_aligned / 2;            p_pic->p[ V_PLANE ].i_visible_lines = i_height / 2;            p_pic->p[ V_PLANE ].i_pitch = i_width_aligned / 2;            p_pic->p[ V_PLANE ].i_visible_pitch = i_width / 2;            p_pic->i_planes = 3;            break;        case FOURCC_I422:        case FOURCC_J422:            p_pic->p[ Y_PLANE ].i_lines = i_height_aligned;            p_pic->p[ Y_PLANE ].i_visible_lines = i_height;            p_pic->p[ Y_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ Y_PLANE ].i_visible_pitch = i_width;            p_pic->p[ U_PLANE ].i_lines = i_height_aligned;            p_pic->p[ U_PLANE ].i_visible_lines = i_height;            p_pic->p[ U_PLANE ].i_pitch = i_width_aligned / 2;            p_pic->p[ U_PLANE ].i_visible_pitch = i_width / 2;            p_pic->p[ V_PLANE ].i_lines = i_height_aligned;            p_pic->p[ V_PLANE ].i_visible_lines = i_height;            p_pic->p[ V_PLANE ].i_pitch = i_width_aligned / 2;            p_pic->p[ V_PLANE ].i_visible_pitch = i_width / 2;            p_pic->i_planes = 3;            break;        case FOURCC_I440:        case FOURCC_J440:            p_pic->p[ Y_PLANE ].i_lines = i_height_aligned;            p_pic->p[ Y_PLANE ].i_visible_lines = i_height;            p_pic->p[ Y_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ Y_PLANE ].i_visible_pitch = i_width;            p_pic->p[ U_PLANE ].i_lines = i_height_aligned / 2;            p_pic->p[ U_PLANE ].i_visible_lines = i_height / 2;            p_pic->p[ U_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ U_PLANE ].i_visible_pitch = i_width;            p_pic->p[ V_PLANE ].i_lines = i_height_aligned / 2;            p_pic->p[ V_PLANE ].i_visible_lines = i_height / 2;            p_pic->p[ V_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ V_PLANE ].i_visible_pitch = i_width;            p_pic->i_planes = 3;            break;        case FOURCC_I444:        case FOURCC_J444:            p_pic->p[ Y_PLANE ].i_lines = i_height_aligned;            p_pic->p[ Y_PLANE ].i_visible_lines = i_height;            p_pic->p[ Y_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ Y_PLANE ].i_visible_pitch = i_width;            p_pic->p[ U_PLANE ].i_lines = i_height_aligned;            p_pic->p[ U_PLANE ].i_visible_lines = i_height;            p_pic->p[ U_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ U_PLANE ].i_visible_pitch = i_width;            p_pic->p[ V_PLANE ].i_lines = i_height_aligned;            p_pic->p[ V_PLANE ].i_visible_lines = i_height;            p_pic->p[ V_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ V_PLANE ].i_visible_pitch = i_width;            p_pic->i_planes = 3;            break;        case FOURCC_YUVA:            p_pic->p[ Y_PLANE ].i_lines = i_height_aligned;            p_pic->p[ Y_PLANE ].i_visible_lines = i_height;            p_pic->p[ Y_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ Y_PLANE ].i_visible_pitch = i_width;            p_pic->p[ U_PLANE ].i_lines = i_height_aligned;            p_pic->p[ U_PLANE ].i_visible_lines = i_height;            p_pic->p[ U_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ U_PLANE ].i_visible_pitch = i_width;            p_pic->p[ V_PLANE ].i_lines = i_height_aligned;            p_pic->p[ V_PLANE ].i_visible_lines = i_height;            p_pic->p[ V_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ V_PLANE ].i_visible_pitch = i_width;            p_pic->p[ A_PLANE ].i_lines = i_height_aligned;            p_pic->p[ A_PLANE ].i_visible_lines = i_height;            p_pic->p[ A_PLANE ].i_pitch = i_width_aligned;            p_pic->p[ A_PLANE ].i_visible_pitch = i_width;            p_pic->i_planes = 4;            break;        case FOURCC_YUVP:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned;            p_pic->p->i_visible_pitch = i_width;            p_pic->p->i_pixel_pitch = 8;            p_pic->i_planes = 1;            break;        case FOURCC_Y211:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned;            p_pic->p->i_visible_pitch = i_width;            p_pic->p->i_pixel_pitch = 4;            p_pic->i_planes = 1;            break;        case FOURCC_UYVY:        case FOURCC_YUY2:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned * 2;            p_pic->p->i_visible_pitch = i_width * 2;            p_pic->p->i_pixel_pitch = 4;            p_pic->i_planes = 1;            break;        case FOURCC_RGB2:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned;            p_pic->p->i_visible_pitch = i_width;            p_pic->p->i_pixel_pitch = 1;            p_pic->i_planes = 1;            break;        case FOURCC_RV15:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned * 2;            p_pic->p->i_visible_pitch = i_width * 2;            p_pic->p->i_pixel_pitch = 2;            p_pic->i_planes = 1;            break;        case FOURCC_RV16:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned * 2;            p_pic->p->i_visible_pitch = i_width * 2;            p_pic->p->i_pixel_pitch = 2;            p_pic->i_planes = 1;            break;        case FOURCC_RV24:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned * 3;            p_pic->p->i_visible_pitch = i_width * 3;            p_pic->p->i_pixel_pitch = 3;            p_pic->i_planes = 1;            break;        case FOURCC_RV32:        case FOURCC_RGBA:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned * 4;            p_pic->p->i_visible_pitch = i_width * 4;            p_pic->p->i_pixel_pitch = 4;            p_pic->i_planes = 1;            break;        case FOURCC_GREY:        case FOURCC_Y800:        case FOURCC_Y8:            p_pic->p->i_lines = i_height_aligned;            p_pic->p->i_visible_lines = i_height;            p_pic->p->i_pitch = i_width_aligned;            p_pic->p->i_visible_pitch = i_width;            p_pic->p->i_pixel_pitch = 1;            p_pic->i_planes = 1;            break;        default:            if( p_this )                msg_Err( p_this, "unknown chroma type 0x%.8x (%4.4s)",                                 i_chroma, (char*)&i_chroma );            p_pic->i_planes = 0;            return VLC_EGENERIC;    }    return VLC_SUCCESS;}/** * Compare two chroma values * * This function returns 1 if the two fourcc values given as argument are * the same format (eg. UYVY/UYNV) or almost the same format (eg. I420/YV12) */int vout_ChromaCmp( vlc_fourcc_t i_chroma, vlc_fourcc_t i_amorhc ){    /* If they are the same, they are the same ! */    if( i_chroma == i_amorhc )    {        return 1;    }    /* Check for equivalence classes */    switch( i_chroma )    {        case FOURCC_I420:        case FOURCC_IYUV:        case FOURCC_YV12:            switch( i_amorhc )            {                case FOURCC_I420:                case FOURCC_IYUV:                case FOURCC_YV12:                    return 1;                default:                    return 0;            }        case FOURCC_UYVY:        case FOURCC_UYNV:        case FOURCC_Y422:            switch( i_amorhc )            {                case FOURCC_UYVY:                case FOURCC_UYNV:                case FOURCC_Y422:                    return 1;                default:                    return 0;            }        case FOURCC_YUY2:        case FOURCC_YUNV:            switch( i_amorhc )            {                case FOURCC_YUY2:                case FOURCC_YUNV:                    return 1;                default:                    return 0;            }        case FOURCC_GREY:        case FOURCC_Y800:        case FOURCC_Y8:            switch( i_amorhc )            {                case FOURCC_GREY:                case FOURCC_Y800:                case FOURCC_Y8:                    return 1;                default:                    return 0;            }        default:            return 0;    }}/***************************************************************************** * vout_CopyPicture: copy a picture to another one ***************************************************************************** * This function takes advantage of the image format, and reduces the * number of calls to memcpy() to the minimum. Source and destination * images must have same width (hence i_visible_pitch), height, and chroma. *****************************************************************************/void __vout_CopyPicture( vlc_object_t *p_this,                         picture_t *p_dest, picture_t *p_src ){    VLC_UNUSED(p_this);    picture_Copy( p_dest, p_src );}/***************************************************************************** * *****************************************************************************/static void PictureReleaseCallback( picture_t *p_picture ){    if( --p_picture->i_refcount > 0 )        return;    picture_Delete( p_picture );}/***************************************************************************** * *****************************************************************************/picture_t *picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_aspect ){    picture_t *p_picture = malloc( sizeof(*p_picture) );    if( !p_picture )        return NULL;    memset( p_picture, 0, sizeof(*p_picture) );    if( __vout_AllocatePicture( NULL, p_picture,                                i_chroma, i_width, i_height, i_aspect ) )    {        free( p_picture );        return NULL;    }    p_picture->i_refcount = 1;    p_picture->pf_release = PictureReleaseCallback;    p_picture->i_status = RESERVED_PICTURE;    return p_picture;}/***************************************************************************** * *****************************************************************************/void picture_Delete( picture_t *p_picture ){    assert( p_picture && p_picture->i_refcount == 0 );    free( p_picture->p_data_orig );    free( p_picture->p_sys );    free( p_picture );}/***************************************************************************** * *****************************************************************************/void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src ){    int i;    for( i = 0; i < p_src->i_planes ; i++ )        plane_CopyPixels( p_dst->p+i, p_src->p+i );}void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src ){    const unsigned i_width  = __MIN( p_dst->i_visible_pitch,                                     p_src->i_visible_pitch );    const unsigned i_height = __MIN( p_dst->i_visible_lines,                                     p_src->i_visible_lines );    if( p_src->i_pitch == p_dst->i_pitch )    {        /* There are margins, but with the same width : perfect ! */        vlc_memcpy( p_dst->p_pixels, p_src->p_pixels,                    p_src->i_pitch * i_height );    }    else    {        /* We need to proceed line by line */        uint8_t *p_in = p_src->p_pixels;        uint8_t *p_out = p_dst->p_pixels;        int i_line;        assert( p_in );        assert( p_out );        for( i_line = i_height; i_line--; )        {            vlc_memcpy( p_out, p_in, i_width );            p_in += p_src->i_pitch;            p_out += p_dst->i_pitch;        }    }}/***************************************************************************** * *****************************************************************************/

⌨️ 快捷键说明

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