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 + -
显示快捷键?