BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1594|回复: 7

VSE的代码研究

[复制链接]
发表于 2016-5-27 13:41:42 | 显示全部楼层 |阅读模式
额,几部手册都快完成了,vse的代码准备读一读,分析一下
 楼主| 发表于 2016-6-22 08:41:20 | 显示全部楼层
渲染的过程在
pipeline.c中,
通 do_render_all_options 调用 do_render_seq 开始序列的渲染。

通过界面塞入:
render_internal.c

        WM_jobs_callbacks(wm_job, render_startjob, NULL, NULL, render_endjob);

启动 renderjob 渲染。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-22 08:42:22 | 显示全部楼层
现在分析 do_render_seq

  1. static void do_render_seq(Render *re)
  2. {
  3.         static int recurs_depth = 0;
  4.         struct ImBuf *out;
  5.         RenderResult *rr; /* don't assign re->result here as it might change during give_ibuf_seq */
  6.         int cfra = re->r.cfra;
  7.         SeqRenderData context;
  8.         int view_id, tot_views;
  9.         struct ImBuf **ibuf_arr;
  10.         int re_x, re_y;

  11.         re->i.cfra = cfra;

  12.         if (recurs_depth == 0) {
  13.                 /* otherwise sequencer animation isn't updated */
  14.                 BKE_animsys_evaluate_all_animation(re->main, re->scene, (float)cfra); // XXX, was BKE_scene_frame_get(re->scene)
  15.         }

  16.         recurs_depth++;

  17.         if ((re->r.mode & R_BORDER) && (re->r.mode & R_CROP) == 0) {
  18.                 /* if border rendering is used and cropping is disabled, final buffer should
  19.                  * be as large as the whole frame */
  20.                 re_x = re->winx;
  21.                 re_y = re->winy;
  22.         }
  23.         else {
  24.                 re_x = re->result->rectx;
  25.                 re_y = re->result->recty;
  26.         }

  27.         tot_views = BKE_scene_multiview_num_views_get(&re->r);
  28.         ibuf_arr = MEM_mallocN(sizeof(ImBuf *) * tot_views, "Sequencer Views ImBufs");

  29.         BKE_sequencer_new_render_data(
  30.                 re->eval_ctx, re->main, re->scene,
  31.                 re_x, re_y, 100,
  32.                 &context);

  33.         /* the renderresult gets destroyed during the rendering, so we first collect all ibufs
  34.          * and then we populate the final renderesult */

  35.         for (view_id = 0; view_id < tot_views; view_id++) {
  36.                 context.view_id = view_id;
  37.                 out = BKE_sequencer_give_ibuf(&context, cfra, 0);

  38.                 if (out) {
  39.                         ibuf_arr[view_id] = IMB_dupImBuf(out);
  40.                         IMB_metadata_copy(ibuf_arr[view_id], out);
  41.                         IMB_freeImBuf(out);
  42.                         BKE_sequencer_imbuf_from_sequencer_space(re->scene, ibuf_arr[view_id]);
  43.                 }
  44.                 else {
  45.                         ibuf_arr[view_id] = NULL;
  46.                 }
  47.         }

  48.         rr = re->result;

  49.         BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
  50.         render_result_views_new(rr, &re->r);
  51.         BLI_rw_mutex_unlock(&re->resultmutex);

  52.         for (view_id = 0; view_id < tot_views; view_id++) {
  53.                 RenderView *rv = RE_RenderViewGetById(rr, view_id);
  54.                 BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);

  55.                 if (ibuf_arr[view_id]) {
  56.                         /* copy ibuf into combined pixel rect */
  57.                         RE_render_result_rect_from_ibuf(rr, &re->r, ibuf_arr[view_id], view_id);

  58.                         if (ibuf_arr[view_id]->metadata && (re->r.stamp & R_STAMP_STRIPMETA)) {
  59.                                 /* ensure render stamp info first */
  60.                                 BKE_render_result_stamp_info(NULL, NULL, rr, true);
  61.                                 BKE_stamp_info_from_imbuf(rr, ibuf_arr[view_id]);
  62.                         }

  63.                         if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
  64.                                 Editing *ed = re->scene->ed;
  65.                                 if (ed)
  66.                                         BKE_sequencer_free_imbuf(re->scene, &ed->seqbase, true);
  67.                         }
  68.                         IMB_freeImBuf(ibuf_arr[view_id]);
  69.                 }
  70.                 else {
  71.                         /* render result is delivered empty in most cases, nevertheless we handle all cases */
  72.                         render_result_rect_fill_zero(rr, view_id);
  73.                 }

  74.                 BLI_rw_mutex_unlock(&re->resultmutex);

  75.                 /* would mark display buffers as invalid */
  76.                 RE_SetActiveRenderView(re, rv->name);
  77.                 re->display_update(re->duh, re->result, NULL);
  78.         }

  79.         MEM_freeN(ibuf_arr);

  80.         recurs_depth--;

  81.         /* just in case this flag went missing at some point */
  82.         re->r.scemode |= R_DOSEQ;

  83.         /* set overall progress of sequence rendering */
  84.         if (re->r.efra != re->r.sfra)
  85.                 re->progress(re->prh, (float)(cfra - re->r.sfra) / (re->r.efra - re->r.sfra));
  86.         else
  87.                 re->progress(re->prh, 1.0f);
  88. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-22 08:49:19 | 显示全部楼层
大致的处理过程是,将所有东西塞入 imbuf,
通过设置项计算imbuf
将imbuf 导出到渲染结果。
期间附加 其他渲染,如metadata,和丢数据到UI界面上。
回复 支持 反对

使用道具 举报

发表于 2016-6-22 08:51:17 | 显示全部楼层
万分期待啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-4 11:45:11 | 显示全部楼层
我对Blender如何分配任务给后端的视频处理想知道更多。因为界面做好视频的编辑工作后,可以生产xml,然后通过视频处理引擎直接后台并行处理,然而blender里面发包任务的时候听说是被死锁了。这个机制出现了问题。具体的还得看代码。
回复 支持 反对

使用道具 举报

发表于 2016-11-13 14:24:44 来自手机 | 显示全部楼层
看完了整个代码得到的唯一结论:似乎是C++的结构体,然后没了,所以还是看效果吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-2 23:01:20 | 显示全部楼层
原理:多开Blender,充分利用 VSE,vse是单核运行,多开blender,分段渲染并合成。
https://github.com/jendabek/BlenderRenderController

鉴于vse的渲染内部优化无法,只能多开blender来做视频渲染。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-10-20 07:48 , Processed in 0.016144 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表