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

📄 image.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
 */static picture_t *ImageConvert( image_handler_t *p_image, picture_t *p_pic,                                video_format_t *p_fmt_in,                                video_format_t *p_fmt_out ){    picture_t *p_pif;    if( !p_fmt_out->i_width && !p_fmt_out->i_height &&        p_fmt_out->i_sar_num && p_fmt_out->i_sar_den &&        p_fmt_out->i_sar_num * p_fmt_in->i_sar_den !=        p_fmt_out->i_sar_den * p_fmt_in->i_sar_num )    {        p_fmt_out->i_width =            p_fmt_in->i_sar_num * (int64_t)p_fmt_out->i_sar_den *            p_fmt_in->i_width / p_fmt_in->i_sar_den / p_fmt_out->i_sar_num;        p_fmt_out->i_visible_width =            p_fmt_in->i_sar_num * (int64_t)p_fmt_out->i_sar_den *            p_fmt_in->i_visible_width / p_fmt_in->i_sar_den /            p_fmt_out->i_sar_num;    }    if( !p_fmt_out->i_chroma ) p_fmt_out->i_chroma = p_fmt_in->i_chroma;    if( !p_fmt_out->i_width )        p_fmt_out->i_width = p_fmt_out->i_visible_width = p_fmt_in->i_width;    if( !p_fmt_out->i_height )        p_fmt_out->i_height = p_fmt_out->i_visible_height = p_fmt_in->i_height;    if( !p_fmt_out->i_sar_num ) p_fmt_out->i_sar_num = p_fmt_in->i_sar_num;    if( !p_fmt_out->i_sar_den ) p_fmt_out->i_sar_den = p_fmt_in->i_sar_den;    if( !p_fmt_out->i_aspect ) p_fmt_out->i_aspect = p_fmt_in->i_aspect;    if( p_image->p_filter )    if( p_image->p_filter->fmt_in.video.i_chroma != p_fmt_in->i_chroma ||        p_image->p_filter->fmt_out.video.i_chroma != p_fmt_out->i_chroma )    {        /* We need to restart a new filter */        DeleteFilter( p_image->p_filter );        p_image->p_filter = NULL;    }    /* Start a filter */    if( !p_image->p_filter )    {        es_format_t fmt_in;        es_format_Init( &fmt_in, VIDEO_ES, p_fmt_in->i_chroma );        fmt_in.video = *p_fmt_in;        p_image->p_filter =            CreateFilter( p_image->p_parent, &fmt_in, p_fmt_out, NULL );        if( !p_image->p_filter )        {            return NULL;        }    }    else    {        /* Filters should handle on-the-fly size changes */        p_image->p_filter->fmt_in.video = *p_fmt_in;        p_image->p_filter->fmt_out.video = *p_fmt_out;    }    picture_Yield( p_pic );    p_pif = p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );    if( p_fmt_in->i_chroma == p_fmt_out->i_chroma &&        p_fmt_in->i_width == p_fmt_out->i_width &&        p_fmt_in->i_height == p_fmt_out->i_height )    {        /* Duplicate image */        picture_Release( p_pif ); /* XXX: Better fix must be possible */        p_pif = p_image->p_filter->pf_vout_buffer_new( p_image->p_filter );        if( p_pif ) vout_CopyPicture( p_image->p_parent, p_pif, p_pic );    }    return p_pif;}/** * Filter an image with a psz_module filter * */static picture_t *ImageFilter( image_handler_t *p_image, picture_t *p_pic,                               video_format_t *p_fmt, const char *psz_module ){    /* Start a filter */    if( !p_image->p_filter )    {        es_format_t fmt;        es_format_Init( &fmt, VIDEO_ES, p_fmt->i_chroma );        fmt.video = *p_fmt;        p_image->p_filter =            CreateFilter( p_image->p_parent, &fmt, &fmt.video, psz_module );        if( !p_image->p_filter )        {            return NULL;        }    }    else    {        /* Filters should handle on-the-fly size changes */        p_image->p_filter->fmt_in.video = *p_fmt;        p_image->p_filter->fmt_out.video = *p_fmt;    }    picture_Yield( p_pic );    return p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );}/** * Misc functions * */static const struct{    vlc_fourcc_t i_codec;    const char *psz_ext;} ext_table[] ={    { VLC_FOURCC('j','p','e','g'), "jpeg" },    { VLC_FOURCC('j','p','e','g'), "jpg"  },    { VLC_FOURCC('l','j','p','g'), "ljpg" },    { VLC_FOURCC('p','n','g',' '), "png" },    { VLC_FOURCC('p','g','m',' '), "pgm" },    { VLC_FOURCC('p','g','m','y'), "pgmyuv" },    { VLC_FOURCC('p','b','m',' '), "pbm" },    { VLC_FOURCC('p','a','m',' '), "pam" },    { VLC_FOURCC('t','g','a',' '), "tga" },    { VLC_FOURCC('b','m','p',' '), "bmp" },    { VLC_FOURCC('p','n','m',' '), "pnm" },    { VLC_FOURCC('x','p','m',' '), "xpm" },    { VLC_FOURCC('x','c','f',' '), "xcf" },    { VLC_FOURCC('p','c','x',' '), "pcx" },    { VLC_FOURCC('g','i','f',' '), "gif" },    { VLC_FOURCC('t','i','f','f'), "tif" },    { VLC_FOURCC('t','i','f','f'), "tiff" },    { VLC_FOURCC('l','b','m',' '), "lbm" },    { 0, NULL }};static vlc_fourcc_t Ext2Fourcc( const char *psz_name ){    int i;    psz_name = strrchr( psz_name, '.' );    if( !psz_name ) return 0;    psz_name++;    for( i = 0; ext_table[i].i_codec; i++ )    {        int j;        for( j = 0; toupper(ext_table[i].psz_ext[j]) == toupper(psz_name[j]);             j++ )        {            if( !ext_table[i].psz_ext[j] && !psz_name[j] )                return ext_table[i].i_codec;        }    }    return 0;}/*static const char *Fourcc2Ext( vlc_fourcc_t i_codec ){    int i;    for( i = 0; ext_table[i].i_codec != 0; i++ )    {        if( ext_table[i].i_codec == i_codec ) return ext_table[i].psz_ext;    }    return NULL;}*/static picture_t *video_new_buffer( decoder_t *p_dec ){    p_dec->fmt_out.video.i_chroma = p_dec->fmt_out.i_codec;    return picture_New( p_dec->fmt_out.video.i_chroma,                        p_dec->fmt_out.video.i_width,                        p_dec->fmt_out.video.i_height,                        p_dec->fmt_out.video.i_aspect );}static void video_del_buffer( decoder_t *p_dec, picture_t *p_pic ){    if( p_pic->i_refcount != 1 )        msg_Err( p_dec, "invalid picture reference count" );    p_pic->i_refcount = 0;    picture_Delete( p_pic );}static void video_link_picture( decoder_t *p_dec, picture_t *p_pic ){    (void)p_dec;    picture_Yield( p_pic );}static void video_unlink_picture( decoder_t *p_dec, picture_t *p_pic ){    (void)p_dec;    picture_Release( p_pic );}static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt ){    decoder_t *p_dec;    p_dec = vlc_object_create( p_this, VLC_OBJECT_DECODER );    if( p_dec == NULL )        return NULL;    p_dec->p_module = NULL;    es_format_Init( &p_dec->fmt_in, VIDEO_ES, fmt->i_chroma );    es_format_Init( &p_dec->fmt_out, VIDEO_ES, 0 );    p_dec->fmt_in.video = *fmt;    p_dec->b_pace_control = true;    p_dec->pf_vout_buffer_new = video_new_buffer;    p_dec->pf_vout_buffer_del = video_del_buffer;    p_dec->pf_picture_link    = video_link_picture;    p_dec->pf_picture_unlink  = video_unlink_picture;    vlc_object_attach( p_dec, p_this );    /* Find a suitable decoder module */    p_dec->p_module = module_Need( p_dec, "decoder", "$codec", 0 );    if( !p_dec->p_module )    {        msg_Err( p_dec, "no suitable decoder module for fourcc `%4.4s'.\n"                 "VLC probably does not support this image format.",                 (char*)&p_dec->fmt_in.i_codec );        DeleteDecoder( p_dec );        return NULL;    }    return p_dec;}static void DeleteDecoder( decoder_t * p_dec ){    vlc_object_detach( p_dec );    if( p_dec->p_module ) module_Unneed( p_dec, p_dec->p_module );    es_format_Clean( &p_dec->fmt_in );    es_format_Clean( &p_dec->fmt_out );    vlc_object_release( p_dec );    p_dec = NULL;}static encoder_t *CreateEncoder( vlc_object_t *p_this, video_format_t *fmt_in,                                 video_format_t *fmt_out ){    encoder_t *p_enc;    p_enc = vlc_object_create( p_this, VLC_OBJECT_ENCODER );    if( p_enc == NULL )        return NULL;    p_enc->p_module = NULL;    es_format_Init( &p_enc->fmt_in, VIDEO_ES, fmt_in->i_chroma );    p_enc->fmt_in.video = *fmt_in;    if( fmt_out->i_width > 0 && fmt_out->i_height > 0 )    {        p_enc->fmt_in.video.i_width = fmt_out->i_width;        p_enc->fmt_in.video.i_height = fmt_out->i_height;        if( fmt_out->i_visible_width > 0 &&            fmt_out->i_visible_height > 0 )        {            p_enc->fmt_in.video.i_visible_width = fmt_out->i_visible_width;            p_enc->fmt_in.video.i_visible_height = fmt_out->i_visible_height;        }        else        {            p_enc->fmt_in.video.i_visible_width = fmt_out->i_width;            p_enc->fmt_in.video.i_visible_height = fmt_out->i_height;        }    }    else if( fmt_out->i_sar_num && fmt_out->i_sar_den &&             fmt_out->i_sar_num * fmt_in->i_sar_den !=             fmt_out->i_sar_den * fmt_in->i_sar_num )    {        p_enc->fmt_in.video.i_width =            fmt_in->i_sar_num * (int64_t)fmt_out->i_sar_den * fmt_in->i_width /            fmt_in->i_sar_den / fmt_out->i_sar_num;        p_enc->fmt_in.video.i_visible_width =            fmt_in->i_sar_num * (int64_t)fmt_out->i_sar_den *            fmt_in->i_visible_width / fmt_in->i_sar_den / fmt_out->i_sar_num;    }    p_enc->fmt_in.video.i_frame_rate = 25;    p_enc->fmt_in.video.i_frame_rate_base = 1;    es_format_Init( &p_enc->fmt_out, VIDEO_ES, fmt_out->i_chroma );    p_enc->fmt_out.video = *fmt_out;    p_enc->fmt_out.video.i_width = p_enc->fmt_in.video.i_width;    p_enc->fmt_out.video.i_height = p_enc->fmt_in.video.i_height;    vlc_object_attach( p_enc, p_this );    /* Find a suitable decoder module */    p_enc->p_module = module_Need( p_enc, "encoder", 0, 0 );    if( !p_enc->p_module )    {        msg_Err( p_enc, "no suitable encoder module for fourcc `%4.4s'.\n"                 "VLC probably does not support this image format.",                 (char*)&p_enc->fmt_out.i_codec );        DeleteEncoder( p_enc );        return NULL;    }    p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;    return p_enc;}static void DeleteEncoder( encoder_t * p_enc ){    vlc_object_detach( p_enc );    if( p_enc->p_module ) module_Unneed( p_enc, p_enc->p_module );    es_format_Clean( &p_enc->fmt_in );    es_format_Clean( &p_enc->fmt_out );    vlc_object_release( p_enc );    p_enc = NULL;}static filter_t *CreateFilter( vlc_object_t *p_this, es_format_t *p_fmt_in,                               video_format_t *p_fmt_out,                               const char *psz_module ){    static const char typename[] = "filter";    filter_t *p_filter;    p_filter = vlc_custom_create( p_this, sizeof(filter_t),                                  VLC_OBJECT_GENERIC, typename );    vlc_object_attach( p_filter, p_this );    p_filter->pf_vout_buffer_new =        (picture_t *(*)(filter_t *))video_new_buffer;    p_filter->pf_vout_buffer_del =        (void (*)(filter_t *, picture_t *))video_del_buffer;    p_filter->fmt_in = *p_fmt_in;    p_filter->fmt_out = *p_fmt_in;    p_filter->fmt_out.i_codec = p_fmt_out->i_chroma;    p_filter->fmt_out.video = *p_fmt_out;    p_filter->p_module = module_Need( p_filter, "video filter2",                                      psz_module, 0 );    if( !p_filter->p_module )    {        msg_Dbg( p_filter, "no video filter found" );        DeleteFilter( p_filter );        return NULL;    }    return p_filter;}static void DeleteFilter( filter_t * p_filter ){    vlc_object_detach( p_filter );    if( p_filter->p_module ) module_Unneed( p_filter, p_filter->p_module );    es_format_Clean( &p_filter->fmt_in );    es_format_Clean( &p_filter->fmt_out );    vlc_object_release( p_filter );}

⌨️ 快捷键说明

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