I think I enabled _writing_ timecode info into rendered files (tested mxf)
if you set timecode for your timeline manually - it should be respected.
If you render selection of your timeline  - timecode will be set at start
timecode of your render position.
if you render selection with already altered (via clapping icon) timeline -
it also should work.

I found you (sometimes?) need to hit 'align timecodes' menu item for
refreshing asset timecode info.... but such action will mes up timeline if
some assets had no real timecode info....

Anyway, try to test those patches and told us how useful (or dangerous?)
they are...

In theory I think this is good idea to get embedded timecodes into rendered
files (rel. to your working timeline) , but may be you sometimes want
zeroed tc in output files?
From 1d27acc3a74a4c3aabf810018ef2c6599d7ad904 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <randrianas...@gmail.com>
Date: Sun, 20 Jun 2021 10:37:20 +0300
Subject: [PATCH 1/7] Try to fix exportedl.c

---
 cinelerra-5.1/cinelerra/exportedl.C | 45 +++++++++++++++++++++++++----
 1 file changed, 39 insertions(+), 6 deletions(-)

diff --git a/cinelerra-5.1/cinelerra/exportedl.C b/cinelerra-5.1/cinelerra/exportedl.C
index f4e3805c..88b740af 100644
--- a/cinelerra-5.1/cinelerra/exportedl.C
+++ b/cinelerra-5.1/cinelerra/exportedl.C
@@ -92,11 +92,12 @@ int ExportEDLAsset::edit_to_timecodes(Edit *edit,
 	double edit_sourceend;
 	double edit_deststart;
 	double edit_destend;
-
+	
+	if(!strcmp(reel_name,""))
 	strcpy(reel_name, "   BL   ");
-	edit_sourcestart = 0;
-	edit_sourceend = track->from_units(edit->length);
-
+	edit_sourcestart = track->from_units(edit->startsource);
+	edit_sourceend = track->from_units(edit->length + edit->startsource);
+	
 	edit_deststart = track->from_units(edit->startproject);
 	edit_destend = track->from_units(edit->startproject + edit->length);
 
@@ -138,8 +139,24 @@ void ExportEDLAsset::export_it()
 	{
 
 		// TODO: Find docs about exact header for CMX3600
-		fprintf(fh, "TITLE: Cinproj   FORMAT: CMX 3600 4-Ch\n");
-
+		// https://xmil.biz/EDL-X/CMX3600.pdf
+		double frame_rate = edl->session->frame_rate;
+		int frame_rate_int = (int)frame_rate;
+		char proj_title[BCTEXTLEN];
+		strcpy(proj_title,basename(mwindow->session->filename));
+		fprintf(fh, "TITLE: %s fps: %f\n", proj_title, frame_rate);
+		switch(frame_rate_int) {
+		case 24:
+		case 25:
+		case 50:
+		case 60:
+		if (frame_rate - frame_rate_int < 0.0001)
+		fprintf(fh, "FCM: NON-DROP FRAME\n"); // fixme: select depending on fps
+		break;
+		default:
+		if ((frame_rate - frame_rate_int > 0.0001) && (frame_rate == 29.97))
+		fprintf(fh, "FCM: DROP FRAME\n");
+		}
 		int colnum = 1;
 
 
@@ -147,6 +164,11 @@ void ExportEDLAsset::export_it()
 			edit;
 			edit = edit->next)
 		{
+		
+		// max number of entries in cmx3600
+		if (colnum > 999)
+		return;
+		
 			char reel_name[BCTEXTLEN];
 			char avselect[5];
 			char edittype[5] = "C   ";
@@ -155,6 +177,12 @@ void ExportEDLAsset::export_it()
 			char sourceoutpoint[12];
 			char destinpoint[12];
 			char destoutpoint[12];
+			
+			if(!edit->asset)
+			strcpy(reel_name,"BL  ");
+			else
+			strcpy(reel_name,"AX  ");
+			
 			if (track->data_type == TRACK_AUDIO)
 				strcpy(avselect, "A   ");
 			else
@@ -187,10 +215,15 @@ void ExportEDLAsset::export_it()
 			} else
 			{
 				edit_to_timecodes(edit, sourceinpoint, sourceoutpoint, destinpoint, destoutpoint, reel_name);
+				char filename[1024];
+				if (edit->asset)
+				strcpy(filename,basename(edit->asset->path));
 				fprintf(fh, "%03d %8s %s %4s %3s", colnum, reel_name, avselect, edittype, cutinfo);
 				fprintf(fh, " %s %s", sourceinpoint, sourceoutpoint);
 				fprintf(fh, " %s %s", destinpoint, destoutpoint);
 				fprintf(fh,"\n");
+				if(edit->asset)
+				fprintf(fh,"* FROM CLIP NAME: %s\n", filename);
 				last_dissolve = 0;
 			}
 
-- 
2.32.0

From c6e77cec54465b26e3f947e4137d93f155c8ee0c Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <randrianas...@gmail.com>
Date: Sun, 20 Jun 2021 13:13:43 +0300
Subject: [PATCH 5/7] Autodetect drop frame in exportedl.C ?

---
 cinelerra-5.1/cinelerra/exportedl.C | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/cinelerra-5.1/cinelerra/exportedl.C b/cinelerra-5.1/cinelerra/exportedl.C
index 88b740af..aef4d4af 100644
--- a/cinelerra-5.1/cinelerra/exportedl.C
+++ b/cinelerra-5.1/cinelerra/exportedl.C
@@ -150,13 +150,18 @@ void ExportEDLAsset::export_it()
 		case 25:
 		case 50:
 		case 60:
-		if (frame_rate - frame_rate_int < 0.0001)
+		case 30:
+		{
+		if (frame_rate - frame_rate_int < 0.001)
 		fprintf(fh, "FCM: NON-DROP FRAME\n"); // fixme: select depending on fps
 		break;
+		}
 		default:
-		if ((frame_rate - frame_rate_int > 0.0001) && (frame_rate == 29.97))
+		{
+		if ((frame_rate - frame_rate_int) > 0.001)
 		fprintf(fh, "FCM: DROP FRAME\n");
 		}
+		}
 		int colnum = 1;
 
 
-- 
2.32.0

From 651a060a30d637716af0bb94260329b8589b3947 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <randrianas...@gmail.com>
Date: Sun, 20 Jun 2021 11:24:17 +0300
Subject: [PATCH 4/7] re-enable 'export edl' for testing

---
 cinelerra-5.1/cinelerra/mainmenu.C | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cinelerra-5.1/cinelerra/mainmenu.C b/cinelerra-5.1/cinelerra/mainmenu.C
index 60d72d5a..e2902b3b 100644
--- a/cinelerra-5.1/cinelerra/mainmenu.C
+++ b/cinelerra-5.1/cinelerra/mainmenu.C
@@ -134,7 +134,7 @@ void MainMenu::create_objects()
 	filemenu->add_item(new SubttlSWin(mwindow));
 
 	filemenu->add_item(render = new RenderItem(mwindow));
-//	filemenu->add_item(new ExportEDLItem(mwindow));
+	filemenu->add_item(new ExportEDLItem(mwindow));
 	filemenu->add_item(new BatchRenderMenuItem(mwindow));
 	filemenu->add_item(new CreateBD_MenuItem(mwindow));
 	filemenu->add_item(new CreateDVD_MenuItem(mwindow));
-- 
2.32.0

From 7910ea2b3130260ecbafb92929710cf25b39d5ed Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <randrianas...@gmail.com>
Date: Sun, 20 Jun 2021 19:43:03 +0300
Subject: [PATCH 6/7] Hopefully fix timecode offset in exportedl

---
 cinelerra-5.1/cinelerra/exportedl.C | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/cinelerra-5.1/cinelerra/exportedl.C b/cinelerra-5.1/cinelerra/exportedl.C
index aef4d4af..d938a7be 100644
--- a/cinelerra-5.1/cinelerra/exportedl.C
+++ b/cinelerra-5.1/cinelerra/exportedl.C
@@ -65,7 +65,7 @@ void ExportEDLAsset::double_to_CMX3600(double seconds, double frame_rate, char *
 			TIME_HMSF,
 			0, // sample_rate ... unnecessary
 			frame_rate,
-			0);    // frames per foot
+			0); // frames per foot
 	if ((int)(seconds / 3600) <= 9)
 	{
 		str[0]='0';
@@ -92,6 +92,12 @@ int ExportEDLAsset::edit_to_timecodes(Edit *edit,
 	double edit_sourceend;
 	double edit_deststart;
 	double edit_destend;
+	double timecode_offset;
+	
+	// timecode_offset in seconds
+	timecode_offset = edit->track->edl->session->timecode_offset;
+	//printf("tc offset %f, \n", timecode_offset);
+	
 	
 	if(!strcmp(reel_name,""))
 	strcpy(reel_name, "   BL   ");
@@ -103,8 +109,8 @@ int ExportEDLAsset::edit_to_timecodes(Edit *edit,
 
 	double_to_CMX3600(edit_sourcestart, frame_rate, sourceinpoint);
 	double_to_CMX3600(edit_sourceend, frame_rate, sourceoutpoint);
-	double_to_CMX3600(edit_deststart, frame_rate, destinpoint);
-	double_to_CMX3600(edit_destend, frame_rate, destoutpoint);
+	double_to_CMX3600(edit_deststart + timecode_offset, frame_rate, destinpoint);
+	double_to_CMX3600(edit_destend + timecode_offset, frame_rate, destoutpoint);
 
 	return 0;
 }
-- 
2.32.0

From e8ae3343cc46aa7fabb562f86e20c1d49757fde0 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <randrianas...@gmail.com>
Date: Mon, 21 Jun 2021 02:22:08 +0300
Subject: [PATCH 7/7] Add timecode to output mov/mxf

---
 cinelerra-5.1/cinelerra/ffmpeg.C | 8 ++++++++
 cinelerra-5.1/cinelerra/render.C | 6 ++++++
 2 files changed, 14 insertions(+)

diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C
index b8f2d1af..ec0640a5 100644
--- a/cinelerra-5.1/cinelerra/ffmpeg.C
+++ b/cinelerra-5.1/cinelerra/ffmpeg.C
@@ -2886,6 +2886,14 @@ int FFMPEG::open_encoder(const char *type, const char *spec)
 			vid->width = asset->width;
 			vid->height = asset->height;
 			vid->frame_rate = asset->frame_rate;
+			
+			char tc_str[20] = "00:00:00:00";
+			double tc_offset;
+			if(asset->timecode > 0)
+			Units::totext(tc_str, asset->timecode, TIME_HMSF, 0, asset->frame_rate, 0);
+			//printf("tc: %s \n", tc_str);
+			av_dict_set(&st->metadata, "timecode", tc_str, 0);
+			
 			if( (vid->color_range = asset->ff_color_range) < 0 )
 				vid->color_range = file_base->file->preferences->yuv_color_range;
 			switch( vid->color_range ) {
diff --git a/cinelerra-5.1/cinelerra/render.C b/cinelerra-5.1/cinelerra/render.C
index a7456717..0ee987e8 100644
--- a/cinelerra-5.1/cinelerra/render.C
+++ b/cinelerra-5.1/cinelerra/render.C
@@ -419,6 +419,7 @@ int Render::check_asset(EDL *edl, Asset &asset)
 		File::renders_video(&asset) ) {
 		asset.video_data = 1;
 		asset.layers = 1;
+
 		asset.width = edl->session->output_w;
 		asset.height = edl->session->output_h;
 		asset.interlace_mode = edl->session->interlace_mode;
@@ -726,6 +727,11 @@ void RenderThread::render_single(int test_overwrite, Asset *asset, EDL *edl,
 	if( !render->result ) {
 // Get total range to render
 		render->total_start = command->start_position;
+		
+		render->default_asset->timecode = command->start_position;
+		printf("tc: %f \n", render->default_asset->timecode);
+		render->default_asset->timecode += edl->session->timecode_offset;
+		
 		render->total_end = command->end_position;
 		total_length = render->total_end - render->total_start;
 
-- 
2.32.0

-- 
Cin mailing list
Cin@lists.cinelerra-gg.org
https://lists.cinelerra-gg.org/mailman/listinfo/cin

Reply via email to