media-server
media-server copied to clipboard
[what][draft][mov] 引入 mov_block_t 将部分内存管理控制权转给到调用方
https://github.com/ireader/media-server/issues/264
针对于 mov_sample_t
结构体积累导致的内存增长, 有一个特点即为单个 mov_sample_t
所占用的内存空间是固定的;所以我想一下,可能使用 std::vector
这种方式暴露内存分配的方式比 new
的方式合适一点;所以定义了 mov_blocks_t
:
struct mov_blocks_t
{
/// create a blocks
/// @param[in] param user-defined parameter
/// @param[in] id blocks identifier
/// @param[in] block_size single block size
/// @return 0-ok, <0-error
int (*create)(void* param, uint32_t id, uint32_t block_size);
/// destroy a blocks
/// @param[in] param user-defined parameter
/// @param[in] id blocks identifier
/// @return 0-ok, <0-error
int (*destroy)(void* param, uint32_t id);
/// set blocks capacity
/// @param[in] param user-defined parameter
/// @param[in] id blocks identifier
/// @param[in] capacity blocks capacity
int (*set_capacity)(void* param, uint32_t id, uint64_t capacity);
/// get block by index
/// @param[in] param user-defined parameter
/// @param[in] id blocks identifier
/// @param[in] index block index in blocks
/// @return memory pointer
void* (*at)(void* param, uint32_t id, uint64_t index);
};
原型上参考的大致是 STL vector arrary.
所以我将其命名成 block,体现单个
mov_sample_t
固定长度的含义; 不过还是感觉看起来怪怪的, 不知道有什么其他合适的命名.
然后再所有地方操作 mov_sample_t
的地方都使用 libmov/source/mov-blocks-util.h
的接口进行操作.
这个提交只是草案,不能运行;只适配了 mov write, mov read 、fmp4 write、 read 都还没有实现完整的替换, 而且其他替换部分逻辑没有严谨地检查,更多的是伪代码的方案设计.
使用 mov_sample_t
这种方式暴露内存分配的方式, 调用者如果使用双内存缓冲区作为 cache, 文件缓存作为 store; 应该是会比较好解决内存增长的问题.
我看了一下代码,
mov_sample_t
的空间连续性相当得高; 使用双内存缓冲区+文件缓存的方式应该是不会引起文件和内存的频繁交换的; 此外,mov_blocks_t
也可以使用realloc
这种现在 media-server 的方式进行实现.