[Bf-blender-cvs] [c0ef4e9] master: Fix T44122, rendering OpenGL preview movie with audio has wrong audio range and extra frames.

Antony Riakiotakis noreply at git.blender.org
Thu Mar 26 14:50:32 CET 2015


Commit: c0ef4e9b788b8db433bf3e92bd19ee00f86f9866
Author: Antony Riakiotakis
Date:   Thu Mar 26 14:49:59 2015 +0100
Branches: master
https://developer.blender.org/rBc0ef4e9b788b8db433bf3e92bd19ee00f86f9866

Fix T44122, rendering OpenGL preview movie with audio has wrong audio
range and extra frames.

Issue here is that the movie backend would unconditionally use the start
frame of the scene instead of the preview frame. Solved by passing an
explicit "preview" argument.

Strictly speaking, the preview argument is part of the renderdata
struct, that is also passed to the code, but when rendering the final
result we want to unconditionally render the full range regardless of
the preview setting of the render structure.

However, OpenGL rendering does use the preview range so we need to
account for that when making those exports.

This is also a nice chance to correct the filenames, which still used
the full range.

===================================================================

M	source/blender/blenkernel/BKE_writeavi.h
M	source/blender/blenkernel/BKE_writeffmpeg.h
M	source/blender/blenkernel/BKE_writeframeserver.h
M	source/blender/blenkernel/intern/writeavi.c
M	source/blender/blenkernel/intern/writeffmpeg.c
M	source/blender/blenkernel/intern/writeframeserver.c
M	source/blender/editors/render/render_opengl.c
M	source/blender/editors/screen/screendump.c
M	source/blender/quicktime/apple/qtkit_export.m
M	source/blender/quicktime/quicktime_export.h
M	source/blender/render/intern/source/pipeline.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_writeavi.h b/source/blender/blenkernel/BKE_writeavi.h
index 7887595..8206c36 100644
--- a/source/blender/blenkernel/BKE_writeavi.h
+++ b/source/blender/blenkernel/BKE_writeavi.h
@@ -43,12 +43,12 @@ struct ReportList;
 struct Scene;
 
 typedef struct bMovieHandle {
-	int (*start_movie)(struct Scene *scene, struct RenderData *rd, int rectx, int recty, struct ReportList *reports);
+	int (*start_movie)(struct Scene *scene, struct RenderData *rd, int rectx, int recty, struct ReportList *reports, bool preview);
 	int (*append_movie)(struct RenderData *rd, int start_frame, int frame, int *pixels,
 	                    int rectx, int recty, struct ReportList *reports);
 	void (*end_movie)(void);
 	int (*get_next_frame)(struct RenderData *rd, struct ReportList *reports); /* optional */
-	void (*get_movie_path)(char *string, struct RenderData *rd); /* optional */
+	void (*get_movie_path)(char *string, struct RenderData *rd, bool preview); /* optional */
 } bMovieHandle;
 
 bMovieHandle *BKE_movie_handle_get(const char imtype);
diff --git a/source/blender/blenkernel/BKE_writeffmpeg.h b/source/blender/blenkernel/BKE_writeffmpeg.h
index 703e84b..ba63609 100644
--- a/source/blender/blenkernel/BKE_writeffmpeg.h
+++ b/source/blender/blenkernel/BKE_writeffmpeg.h
@@ -69,11 +69,11 @@ struct RenderData;
 struct ReportList;
 struct Scene;
 
-int BKE_ffmpeg_start(struct Scene *scene, struct RenderData *rd, int rectx, int recty, struct ReportList *reports);
+int BKE_ffmpeg_start(struct Scene *scene, struct RenderData *rd, int rectx, int recty, struct ReportList *reports, bool preview);
 void BKE_ffmpeg_end(void);
 int BKE_ffmpeg_append(struct RenderData *rd, int start_frame, int frame, int *pixels,
                       int rectx, int recty, struct ReportList *reports);
-void BKE_ffmpeg_filepath_get(char *string, struct RenderData *rd);
+void BKE_ffmpeg_filepath_get(char *string, struct RenderData *rd, bool preview);
 
 void BKE_ffmpeg_preset_set(struct RenderData *rd, int preset);
 void BKE_ffmpeg_image_type_verify(struct RenderData *rd, struct ImageFormatData *imf);
diff --git a/source/blender/blenkernel/BKE_writeframeserver.h b/source/blender/blenkernel/BKE_writeframeserver.h
index bdce9ab..b7d601e 100644
--- a/source/blender/blenkernel/BKE_writeframeserver.h
+++ b/source/blender/blenkernel/BKE_writeframeserver.h
@@ -40,7 +40,7 @@ struct RenderData;
 struct ReportList;
 struct Scene;
 
-int BKE_frameserver_start(struct Scene *scene, struct RenderData *rd, int rectx, int recty, struct ReportList *reports);
+int BKE_frameserver_start(struct Scene *scene, struct RenderData *rd, int rectx, int recty, struct ReportList *reports, bool preview);
 void BKE_frameserver_end(void);
 int BKE_frameserver_append(struct RenderData *rd, int start_frame, int frame, int *pixels,
                            int rectx, int recty, struct ReportList *reports);
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index 85eac1f..b0e23b6 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -51,7 +51,7 @@
 /* ********************** general blender movie support ***************************** */
 
 static int start_stub(Scene *UNUSED(scene), RenderData *UNUSED(rd), int UNUSED(rectx), int UNUSED(recty),
-                      ReportList *UNUSED(reports))
+                      ReportList *UNUSED(reports), bool UNUSED(preview))
 { return 0; }
 
 static void end_stub(void)
@@ -65,11 +65,11 @@ static int append_stub(RenderData *UNUSED(rd), int UNUSED(start_frame), int UNUS
 #  include "AVI_avi.h"
 
 /* callbacks */
-static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports);
+static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports, bool preview);
 static void end_avi(void);
 static int append_avi(RenderData *rd, int start_frame, int frame, int *pixels,
                       int rectx, int recty, ReportList *reports);
-static void filepath_avi(char *string, RenderData *rd);
+static void filepath_avi(char *string, RenderData *rd, bool preview);
 #endif  /* WITH_AVI */
 
 #ifdef WITH_QUICKTIME
@@ -129,9 +129,7 @@ bMovieHandle *BKE_movie_handle_get(const char imtype)
 #endif
 
 	/* in case all above are disabled */
-	(void)imtype;
-
-	return &mh;
+	(void)imtype;return &mh;
 }
 
 /* ****************************************************************** */
@@ -141,10 +139,21 @@ bMovieHandle *BKE_movie_handle_get(const char imtype)
 
 static AviMovie *avi = NULL;
 
-static void filepath_avi(char *string, RenderData *rd)
+static void filepath_avi(char *string, RenderData *rd, bool preview)
 {
+	int sfra, efra;
+
 	if (string == NULL) return;
 
+	if (preview) {
+		sfra = rd->psfra;
+		efra = rd->pefra;
+	}
+	else {
+		sfra = rd->sfra;
+		efra = rd->efra;
+	}
+
 	strcpy(string, rd->pic);
 	BLI_path_abs(string, G.main->name);
 
@@ -152,18 +161,18 @@ static void filepath_avi(char *string, RenderData *rd)
 
 	if (rd->scemode & R_EXTENSION) {
 		if (!BLI_testextensie(string, ".avi")) {
-			BLI_path_frame_range(string, rd->sfra, rd->efra, 4);
+			BLI_path_frame_range(string, sfra, efra, 4);
 			strcat(string, ".avi");
 		}
 	}
 	else {
 		if (BLI_path_frame_check_chars(string)) {
-			BLI_path_frame_range(string, rd->sfra, rd->efra, 4);
+			BLI_path_frame_range(string, sfra, efra, 4);
 		}
 	}
 }
 
-static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports)
+static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports, bool preview)
 {
 	int x, y;
 	char name[256];
@@ -173,7 +182,7 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL
 	
 	(void)scene; /* unused */
 	
-	filepath_avi(name, rd);
+	filepath_avi(name, rd, preview);
 
 	x = rectx;
 	y = recty;
@@ -258,7 +267,7 @@ void BKE_movie_filepath_get(char *string, RenderData *rd)
 {
 	bMovieHandle *mh = BKE_movie_handle_get(rd->im_format.imtype);
 	if (mh->get_movie_path)
-		mh->get_movie_path(string, rd);
+		mh->get_movie_path(string, rd, false);
 	else
 		string[0] = '\0';
 }
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index 57a4927..0717369 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -69,6 +69,7 @@ static int ffmpeg_audio_bitrate = 128;
 static int ffmpeg_gop_size = 12;
 static int ffmpeg_autosplit = 0;
 static int ffmpeg_autosplit_count = 0;
+static bool ffmpeg_preview = false;
 
 static AVFormatContext *outfile = 0;
 static AVStream *video_stream = 0;
@@ -816,7 +817,7 @@ static int start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty, Report
 	ffmpeg_autosplit = rd->ffcodecdata.flags & FFMPEG_AUTOSPLIT_OUTPUT;
 	
 	/* Determine the correct filename */
-	BKE_ffmpeg_filepath_get(name, rd);
+	BKE_ffmpeg_filepath_get(name, rd, ffmpeg_preview);
 	PRINT("Starting output to %s(ffmpeg)...\n"
 	        "  Using type=%d, codec=%d, audio_codec=%d,\n"
 	        "  video_bitrate=%d, audio_bitrate=%d,\n"
@@ -1028,15 +1029,25 @@ static void flush_ffmpeg(void)
  * ********************************************************************** */
 
 /* Get the output filename-- similar to the other output formats */
-void BKE_ffmpeg_filepath_get(char *string, RenderData *rd)
+void BKE_ffmpeg_filepath_get(char *string, RenderData *rd, bool preview)
 {
 	char autosplit[20];
 
 	const char **exts = get_file_extensions(rd->ffcodecdata.type);
 	const char **fe = exts;
+	int sfra, efra;
 
 	if (!string || !exts) return;
 
+	if (preview) {
+		sfra = rd->psfra;
+		efra = rd->pefra;
+	}
+	else {
+		sfra = rd->sfra;
+		efra = rd->efra;
+	}
+
 	strcpy(string, rd->pic);
 	BLI_path_abs(string, G.main->name);
 
@@ -1059,7 +1070,7 @@ void BKE_ffmpeg_filepath_get(char *string, RenderData *rd)
 		if (*fe == NULL) {
 			strcat(string, autosplit);
 
-			BLI_path_frame_range(string, rd->sfra, rd->efra, 4);
+			BLI_path_frame_range(string, sfra, efra, 4);
 			strcat(string, *exts);
 		}
 		else {
@@ -1070,18 +1081,19 @@ void BKE_ffmpeg_filepath_get(char *string, RenderData *rd)
 	}
 	else {
 		if (BLI_path_frame_check_chars(string)) {
-			BLI_path_frame_range(string, rd->sfra, rd->efra, 4);
+			BLI_path_frame_range(string, sfra, efra, 4);
 		}
 
 		strcat(string, autosplit);
 	}
 }
 
-int BKE_ffmpeg_start(struct Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports)
+int BKE_ffmpeg_start(struct Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports, bool preview)
 {
 	int success;
 
 	ffmpeg_autosplit_count = 0;
+	ffmpeg_preview = preview;
 
 	success = start_ffmpeg_impl(rd, rectx, recty, reports);
 #ifdef WITH_AUDASPACE
@@ -1111,7 +1123,7 @@ int BKE_ffmpeg_start(struct Scene *scene, RenderData *rd, int rectx, int recty,
 		}
 
 		specs.rate = rd->ffcodecdata.audio_mixrate;
-		audio_mixdown_device = BKE_sound_mixdown(scene, specs, rd->sfra, rd->ffcodecdata.audio_volume);
+		audio_mixdown_device = BKE_sound_mixdown(scene, specs, preview ? rd->psfra : rd->sfra, rd->ffcodecdata.audio_volume);
 #ifdef FFMPEG_CODEC_TIME_BASE
 		c->time_base.den = specs.rate;
 		c->time_base.num = 1;
@@ -1162,7 +1174,7 @@ int BKE_ffmpeg_append(RenderData *rd, int start_frame, int frame, int *pixels, i
 	}
 
 #ifdef WITH_AUDASPACE
-	write_audio_frames((frame - rd->sfra) / (((double)rd->frs_sec) / (double)rd->frs_sec_base));
+	write_audio_frames((frame - start_frame) / (((double)rd->frs_sec) / (double)rd->frs_sec_base));
 #endif
 	return success;
 }
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index ae6b19f..9cac86d 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -110,7 +110,7 @@ static int closesocket(int fd)
 }
 #endif
 
-int BKE_frameserver_start(struct Scene *scene, RenderData *UNUSED(rd), int rectx, int recty, ReportList *reports)
+int BKE_frameserver_start(struct Scene *scene, RenderData *UNUSED(rd), int rectx, int recty, ReportList *reports, bool UNUSED(preview))
 {
 	struct socka

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list