forked from bartvdbraak/blender
Fix T46565: Movie render crash w/o permissions
Rendering to a path that didn't have write permissions would crash. Also fix error where `G.is_rendering` was left set when rendering failed.
This commit is contained in:
parent
85072eb4e9
commit
c6d98fa841
@ -1063,6 +1063,11 @@ AviError AVI_close_compress(AviMovie *movie)
|
||||
{
|
||||
int temp, movi_size, i;
|
||||
|
||||
if (movie->fp == NULL) {
|
||||
/* none of the allocations below were done if the file failed to open */
|
||||
return AVI_ERROR_FOUND;
|
||||
}
|
||||
|
||||
fseek(movie->fp, 0L, SEEK_END);
|
||||
movi_size = (int)ftell(movie->fp);
|
||||
|
||||
|
@ -215,8 +215,6 @@ static int start_avi(void *context_v, Scene *UNUSED(scene), RenderData *rd, int
|
||||
|
||||
if (AVI_open_compress(name, avi, 1, format) != AVI_ERROR_NONE) {
|
||||
BKE_report(reports, RPT_ERROR, "Cannot open or start AVI movie file");
|
||||
MEM_freeN(avi);
|
||||
avi = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3486,6 +3486,18 @@ static void get_videos_dimensions(Render *re, RenderData *rd, size_t *r_width, s
|
||||
BKE_scene_multiview_videos_dimensions_get(rd, width, height, r_width, r_height);
|
||||
}
|
||||
|
||||
static void re_movie_free_all(Render *re, bMovieHandle *mh, size_t totvideos)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < totvideos; i++) {
|
||||
mh->end_movie(re->movie_ctx_arr[i]);
|
||||
mh->context_free(re->movie_ctx_arr[i]);
|
||||
}
|
||||
|
||||
MEM_SAFE_FREE(re->movie_ctx_arr);
|
||||
}
|
||||
|
||||
/* saves images to disk */
|
||||
void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_override,
|
||||
unsigned int lay_override, int sfra, int efra, int tfra)
|
||||
@ -3510,15 +3522,10 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
|
||||
BKE_report(re->reports, RPT_ERROR, "Frame Server only support stereo output for multiview rendering");
|
||||
return;
|
||||
}
|
||||
|
||||
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
|
||||
/* is also set by caller renderwin.c */
|
||||
G.is_rendering = true;
|
||||
|
||||
re->flag |= R_ANIMATION;
|
||||
|
||||
if (is_movie) {
|
||||
size_t i, width, height;
|
||||
bool is_error = false;
|
||||
|
||||
get_videos_dimensions(re, &rd, &width, &height);
|
||||
|
||||
@ -3535,11 +3542,25 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
|
||||
|
||||
re->movie_ctx_arr[i] = mh->context_create();
|
||||
|
||||
if (!mh->start_movie(re->movie_ctx_arr[i], scene, &re->r, width, height, re->reports, false, suffix))
|
||||
G.is_break = true;
|
||||
if (!mh->start_movie(re->movie_ctx_arr[i], scene, &re->r, width, height, re->reports, false, suffix)) {
|
||||
is_error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_error) {
|
||||
/* report is handled above */
|
||||
re_movie_free_all(re, mh, i + 1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
|
||||
/* is also set by caller renderwin.c */
|
||||
G.is_rendering = true;
|
||||
|
||||
re->flag |= R_ANIMATION;
|
||||
|
||||
if (mh && mh->get_next_frame) {
|
||||
/* MULTIVIEW_TODO:
|
||||
* in case a new video format is added that implements get_next_frame multiview has to be addressed
|
||||
@ -3723,15 +3744,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
|
||||
|
||||
/* end movie */
|
||||
if (is_movie) {
|
||||
size_t i;
|
||||
for (i = 0; i < totvideos; i++) {
|
||||
mh->end_movie(re->movie_ctx_arr[i]);
|
||||
mh->context_free(re->movie_ctx_arr[i]);
|
||||
}
|
||||
|
||||
if (re->movie_ctx_arr) {
|
||||
MEM_freeN(re->movie_ctx_arr);
|
||||
}
|
||||
re_movie_free_all(re, mh, totvideos);
|
||||
}
|
||||
|
||||
if (totskipped && totrendered == 0)
|
||||
|
Loading…
Reference in New Issue
Block a user