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

📄 dynamicoverlay_commands.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
        {            msg_Err( p_filter, "Unable to attach to shared memory" );            free( p_ovl->data.p_text );            p_ovl->data.p_text = NULL;            return VLC_ENOMEM;        }        memcpy( p_ovl->data.p_text, p_data, p_params->i_width );        shmdt( p_data );    }    else    {        uint8_t *p_data, *p_in;        size_t i_neededsize = 0;        p_ovl->data.p_pic = malloc( sizeof( picture_t ) );        if( p_ovl->data.p_pic == NULL )            return VLC_ENOMEM;        vout_InitFormat( &p_ovl->format, p_params->fourcc,                         p_params->i_width, p_params->i_height,                         VOUT_ASPECT_FACTOR );        if( vout_AllocatePicture( p_filter, p_ovl->data.p_pic,                                  p_ovl->format.i_chroma, p_params->i_width,                                  p_params->i_height, p_ovl->format.i_aspect ) )        {            msg_Err( p_filter, "Unable to allocate picture" );            free( p_ovl->data.p_pic );            p_ovl->data.p_pic = NULL;            return VLC_ENOMEM;        }        for( size_t i_plane = 0; i_plane < (size_t)p_ovl->data.p_pic->i_planes;             ++i_plane )        {            i_neededsize += p_ovl->data.p_pic->p[i_plane].i_visible_lines *                            p_ovl->data.p_pic->p[i_plane].i_visible_pitch;        }        if( i_neededsize > i_size )        {            msg_Err( p_filter,                     "Insufficient data in shared memory. need %zu, got %zu",                     i_neededsize, i_size );            picture_Release( p_ovl->data.p_pic );            free( p_ovl->data.p_pic );            p_ovl->data.p_pic = NULL;            return VLC_EGENERIC;        }        p_data = shmat( p_params->i_shmid, NULL, SHM_RDONLY );        if( p_data == NULL )        {            msg_Err( p_filter, "Unable to attach to shared memory" );            picture_Release( p_ovl->data.p_pic );            free( p_ovl->data.p_pic );            p_ovl->data.p_pic = NULL;            return VLC_ENOMEM;        }        p_in = p_data;        for( size_t i_plane = 0; i_plane < (size_t)p_ovl->data.p_pic->i_planes;             ++i_plane )        {            uint8_t *p_out = p_ovl->data.p_pic->p[i_plane].p_pixels;            for( size_t i_line = 0;                 i_line < (size_t)p_ovl->data.p_pic->p[i_plane].i_visible_lines;                 ++i_line )            {                vlc_memcpy( p_out, p_in,                            p_ovl->data.p_pic->p[i_plane].i_visible_pitch );                p_out += p_ovl->data.p_pic->p[i_plane].i_pitch;                p_in += p_ovl->data.p_pic->p[i_plane].i_visible_pitch;            }        }        shmdt( p_data );    }    p_sys->b_updated = p_ovl->b_active;    return VLC_SUCCESS;#else    VLC_UNUSED(p_params);    VLC_UNUSED(p_results);    msg_Err( p_filter, "system doesn't support shared memory" );    return VLC_EGENERIC;#endif}static int exec_DeleteImage( filter_t *p_filter,                             const commandparams_t *p_params,                             commandparams_t *p_results ){    VLC_UNUSED(p_results);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    p_sys->b_updated = true;    return ListRemove( &p_sys->overlays, p_params->i_id );}static int exec_EndAtomic( filter_t *p_filter,                           const commandparams_t *p_params,                           commandparams_t *p_results ){    VLC_UNUSED(p_params);    VLC_UNUSED(p_results);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    QueueTransfer( &p_sys->pending, &p_sys->atomic );    p_sys->b_atomic = false;    return VLC_SUCCESS;}static int exec_GenImage( filter_t *p_filter,                          const commandparams_t *p_params,                          commandparams_t *p_results ){    VLC_UNUSED(p_params);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = OverlayCreate();    if( p_ovl == NULL )        return VLC_ENOMEM;    ssize_t i_idx = ListAdd( &p_sys->overlays, p_ovl );    if( i_idx < 0 )        return i_idx;    p_results->i_id = i_idx;    return VLC_SUCCESS;}static int exec_GetAlpha( filter_t *p_filter,                          const commandparams_t *p_params,                          commandparams_t *p_results ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_results->i_alpha = p_ovl->i_alpha;    return VLC_SUCCESS;}static int exec_GetPosition( filter_t *p_filter,                             const commandparams_t *p_params,                             commandparams_t *p_results ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_results->i_x = p_ovl->i_x;    p_results->i_y = p_ovl->i_y;    return VLC_SUCCESS;}static int exec_GetTextAlpha( filter_t *p_filter,                              const commandparams_t *p_params,                              commandparams_t *p_results ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_results->fontstyle.i_font_alpha = p_ovl->fontstyle.i_font_alpha;    return VLC_SUCCESS;}static int exec_GetTextColor( filter_t *p_filter,                              const commandparams_t *p_params,                              commandparams_t *p_results ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_results->fontstyle.i_font_color = p_ovl->fontstyle.i_font_color;    return VLC_SUCCESS;}static int exec_GetTextSize( filter_t *p_filter,                             const commandparams_t *p_params,                             commandparams_t *p_results ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_results->fontstyle.i_font_size = p_ovl->fontstyle.i_font_size;    return VLC_SUCCESS;}static int exec_GetVisibility( filter_t *p_filter,                               const commandparams_t *p_params,                               commandparams_t *p_results ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_results->b_visible = ( p_ovl->b_active == true ) ? 1 : 0;    return VLC_SUCCESS;}static int exec_SetAlpha( filter_t *p_filter,                          const commandparams_t *p_params,                          commandparams_t *p_results ){    VLC_UNUSED(p_results);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_ovl->i_alpha = p_params->i_alpha;    p_sys->b_updated = p_ovl->b_active;    return VLC_SUCCESS;}static int exec_SetPosition( filter_t *p_filter,                             const commandparams_t *p_params,                             commandparams_t *p_results ){    VLC_UNUSED(p_results);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_ovl->i_x = p_params->i_x;    p_ovl->i_y = p_params->i_y;    p_sys->b_updated = p_ovl->b_active;    return VLC_SUCCESS;}static int exec_SetTextAlpha( filter_t *p_filter,                              const commandparams_t *p_params,                              commandparams_t *p_results ){    VLC_UNUSED(p_results);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_ovl->fontstyle.i_font_alpha = p_params->fontstyle.i_font_alpha;    p_sys->b_updated = p_ovl->b_active;    return VLC_SUCCESS;}static int exec_SetTextColor( filter_t *p_filter,                              const commandparams_t *p_params,                              commandparams_t *p_results ){    VLC_UNUSED(p_results);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_ovl->fontstyle.i_font_color = p_params->fontstyle.i_font_color;    p_sys->b_updated = p_ovl->b_active;    return VLC_SUCCESS;}static int exec_SetTextSize( filter_t *p_filter,                              const commandparams_t *p_params,                              commandparams_t *p_results ){    VLC_UNUSED(p_results);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_ovl->fontstyle.i_font_size = p_params->fontstyle.i_font_size;    p_sys->b_updated = p_ovl->b_active;    return VLC_SUCCESS;}static int exec_SetVisibility( filter_t *p_filter,                               const commandparams_t *p_params,                               commandparams_t *p_results ){    VLC_UNUSED(p_results);    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    overlay_t *p_ovl = ListGet( &p_sys->overlays, p_params->i_id );    if( p_ovl == NULL )        return VLC_EGENERIC;    p_ovl->b_active = p_params->b_visible;// ? false : true;    p_sys->b_updated = true;    return VLC_SUCCESS;}static int exec_StartAtomic( filter_t *p_filter,                             const commandparams_t *p_params,                             commandparams_t *p_results ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    VLC_UNUSED(p_params);    VLC_UNUSED(p_results);    p_sys->b_atomic = true;    return VLC_SUCCESS;}/***************************************************************************** * Command functions *****************************************************************************/static const commanddesc_t p_commands[] ={    {   .psz_command = "DataSharedMem",        .b_atomic = true,        .pf_parser = parser_DataSharedMem,        .pf_execute = exec_DataSharedMem,        .pf_unparse = unparse_default,    },    {   .psz_command = "DeleteImage",        .b_atomic = true,        .pf_parser = parser_Id,        .pf_execute = exec_DeleteImage,        .pf_unparse = unparse_default,    },    {   .psz_command = "EndAtomic",        .b_atomic = false,        .pf_parser = parser_None,        .pf_execute = exec_EndAtomic,        .pf_unparse = unparse_default,    },    {   .psz_command = "GenImage",        .b_atomic = false,        .pf_parser = parser_None,        .pf_execute = exec_GenImage,        .pf_unparse = unparse_GenImage,    },    {   .psz_command = "GetAlpha",        .b_atomic = false,        .pf_parser = parser_Id,        .pf_execute = exec_GetAlpha,        .pf_unparse = unparse_GetAlpha,    },    {   .psz_command = "GetPosition",        .b_atomic = false,        .pf_parser = parser_Id,        .pf_execute = exec_GetPosition,        .pf_unparse = unparse_GetPosition,    },    {   .psz_command = "GetTextAlpha",        .b_atomic = false,        .pf_parser = parser_Id,        .pf_execute = exec_GetTextAlpha,        .pf_unparse = unparse_GetTextAlpha,    },    {   .psz_command = "GetTextColor",        .b_atomic = false,        .pf_parser = parser_Id,        .pf_execute = exec_GetTextColor,        .pf_unparse = unparse_GetTextColor,    },    {   .psz_command = "GetTextSize",        .b_atomic = true,        .pf_parser = parser_Id,        .pf_execute = exec_GetTextSize,        .pf_unparse = unparse_GetTextSize,    },    {   .psz_command = "GetVisibility",        .b_atomic = false,        .pf_parser = parser_Id,        .pf_execute = exec_GetVisibility,        .pf_unparse = unparse_GetVisibility,    },    {   .psz_command = "SetAlpha",        .b_atomic = true,        .pf_parser = parser_SetAlpha,        .pf_execute = exec_SetAlpha,        .pf_unparse = unparse_default,    },    {   .psz_command = "SetPosition",        .b_atomic = true,        .pf_parser = parser_SetPosition,        .pf_execute = exec_SetPosition,        .pf_unparse = unparse_default,    },    {   .psz_command = "SetTextAlpha",        .b_atomic = true,        .pf_parser = parser_SetTextAlpha,        .pf_execute = exec_SetTextAlpha,        .pf_unparse = unparse_default,    },    {   .psz_command = "SetTextColor",        .b_atomic = true,        .pf_parser = parser_SetTextColor,        .pf_execute = exec_SetTextColor,        .pf_unparse = unparse_default,    },    {   .psz_command = "SetTextSize",        .b_atomic = true,        .pf_parser = parser_SetTextSize,        .pf_execute = exec_SetTextSize,        .pf_unparse = unparse_default,    },    {   .psz_command = "SetVisibility",        .b_atomic = true,        .pf_parser = parser_SetVisibility,        .pf_execute = exec_SetVisibility,        .pf_unparse = unparse_default,    },    {   .psz_command = "StartAtomic",        .b_atomic = true,        .pf_parser = parser_None,        .pf_execute = exec_StartAtomic,        .pf_unparse = unparse_default,    }};void RegisterCommand( filter_t *p_filter ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    size_t i_index = 0;    p_sys->i_commands = ARRAY_SIZE(p_commands);    p_sys->pp_commands = (commanddesc_t **) calloc( p_sys->i_commands, sizeof(commanddesc_t*) );    if( !p_sys->pp_commands ) return;    for( i_index = 0; i_index < p_sys->i_commands; i_index ++ )    {        p_sys->pp_commands[i_index] = (commanddesc_t *) malloc( sizeof(commanddesc_t) );        if( !p_sys->pp_commands[i_index] ) return;        p_sys->pp_commands[i_index]->psz_command = strdup( p_commands[i_index].psz_command );        p_sys->pp_commands[i_index]->b_atomic = p_commands[i_index].b_atomic;        p_sys->pp_commands[i_index]->pf_parser = p_commands[i_index].pf_parser;        p_sys->pp_commands[i_index]->pf_execute = p_commands[i_index].pf_execute;        p_sys->pp_commands[i_index]->pf_unparse = p_commands[i_index].pf_unparse;    }    msg_Dbg( p_filter, "%zu commands are available", p_sys->i_commands );    for( size_t i_index = 0; i_index < p_sys->i_commands; i_index++ )        msg_Dbg( p_filter, "    %s", p_sys->pp_commands[i_index]->psz_command );}void UnregisterCommand( filter_t *p_filter ){    filter_sys_t *p_sys = (filter_sys_t*) p_filter->p_sys;    size_t i_index = 0;    for( i_index = 0; i_index < p_sys->i_commands; i_index++ )    {        free( p_sys->pp_commands[i_index]->psz_command );        free( p_sys->pp_commands[i_index] );    }    free( p_sys->pp_commands );    p_sys->pp_commands = NULL;    p_sys->i_commands = 0;}

⌨️ 快捷键说明

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