Skip to content

Commit 39d4c78

Browse files
committed
Fix major performance regression for premiere
For an 1 hour video, premeire export now takes from 20secs to 0.1sec
1 parent c9b0f63 commit 39d4c78

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

src/exports/fcp7.nim

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,11 @@ proc media_def(filedef: XmlNode, url: string, mi: MediaInfo, tl: v3, tb: int64,
119119
filedef.add mediadef
120120

121121
proc resolve_write_audio(audio: XmlNode, make_filedef: proc(clipitem: XmlNode,
122-
mi: MediaInfo), tl: v3) =
122+
mi: MediaInfo), tl: v3, ptrToMi: Table[ptr string, MediaInfo]) =
123123
for t, alayer in tl.a.pairs:
124124
let track = newElement("track")
125125
for j, aclip in alayer.c.pairs:
126-
let mi = initMediaInfo(aclip.src[])
126+
let mi = ptrToMi[aclip.src]
127127

128128
let start_val = $aclip.start
129129
let end_val = $(aclip.start + aclip.dur)
@@ -165,7 +165,7 @@ proc resolve_write_audio(audio: XmlNode, make_filedef: proc(clipitem: XmlNode,
165165
audio.add track
166166

167167
proc premiere_write_audio(audio: XmlNode, make_filedef: proc(clipitem: XmlNode,
168-
mi: MediaInfo), tl: v3) =
168+
mi: MediaInfo), tl: v3, ptrToMi: Table[ptr string, MediaInfo]) =
169169
audio.add elem("numOutputChannels", "2")
170170
let aformat = newElement("format")
171171
let aschar = newElement("samplecharacteristics")
@@ -190,7 +190,7 @@ proc premiere_write_audio(audio: XmlNode, make_filedef: proc(clipitem: XmlNode,
190190
track.add elem("outputchannelindex", $(channelcount + 1))
191191

192192
for j, aclip in alayer.c.pairs:
193-
let src = initMediaInfo(aclip.src[])
193+
let src = ptrToMi[aclip.src]
194194

195195
let start_val = $aclip.start
196196
let end_val = $(aclip.start + aclip.dur)
@@ -243,6 +243,7 @@ proc fcp7_write_xml*(name: string, output: string, resolve: bool, tl: v3) =
243243

244244
var miToUrl = initTable[MediaInfo, string]()
245245
var miToId = initTable[MediaInfo, string]()
246+
var ptrToMi = initTable[ptr string, MediaInfo]() # Cache ptr -> MediaInfo lookup
246247
var fileDefs = initHashSet[string]() # Contains urls
247248

248249
var id_counter = 0
@@ -253,6 +254,7 @@ proc fcp7_write_xml*(name: string, output: string, resolve: bool, tl: v3) =
253254
let mi = initMediaInfo(src)
254255
miToUrl[mi] = handlePath(src)
255256
miToId[mi] = the_id
257+
ptrToMi[ptrSrc] = mi # Store ptr -> MediaInfo mapping
256258

257259
proc make_filedef(clipitem: XmlNode, mi: MediaInfo) =
258260
let pathurl = miToUrl[mi]
@@ -307,7 +309,7 @@ proc fcp7_write_xml*(name: string, output: string, resolve: bool, tl: v3) =
307309
clipitem.add elem("in", in_val)
308310
clipitem.add elem("out", out_val)
309311

310-
let mi = initMediaInfo(clip.src[])
312+
let mi = ptrToMi[clip.src]
311313
make_filedef(clipitem, mi)
312314

313315
clipitem.add elem("compositemode", "normal")
@@ -340,9 +342,9 @@ proc fcp7_write_xml*(name: string, output: string, resolve: bool, tl: v3) =
340342
# Audio definitions and clips
341343
let audio = newElement("audio")
342344
if resolve:
343-
resolve_write_audio(audio, make_filedef, tl)
345+
resolve_write_audio(audio, make_filedef, tl, ptrToMi)
344346
else:
345-
premiere_write_audio(audio, make_filedef, tl)
347+
premiere_write_audio(audio, make_filedef, tl, ptrToMi)
346348

347349
media.add audio
348350
sequence.add media

0 commit comments

Comments
 (0)