Kdenlive   bug tracker Home page

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0002560KdenliveCapturepublic2012-04-03 17:412013-01-06 22:51
Reportermohanohi 
Assigned To 
PriorityhighSeverityfeatureReproducibilityN/A
StatusnewResolutionopen 
Platform64 bitOSUbuntuOS Version11.04
Product Version0.8.2.1 
Target VersionFixed in Version 
Summary0002560: EDL Feature
DescriptionEDL (Edit decision list) is the most and ancient form of getting footage from and to other Editing Applications. EDL import and export feature is available in all the editing application incl cinelerra(import & export), Blender (import). It would be very helpful if this feature be included in Kdenlive.
AVID editor can give his EDL so that i could do further color manipulation in kdenlive.
Or If i use kdenlive for editing, I could edit and deliver EDL for Autodeks Smoke/ Blender users for Advanced Color Grading / VFX works. Please consider this request. I think implementing EDL isn't that impossible to do.
Additional Informationhttp://en.wikipedia.org/wiki/Edit_decision_list [^]
TagsNo tags attached.
Build/Install MethodDistribution package
Attached Files

- Relationships

-  Notes
(0008675)
mohanohi (reporter)
2012-11-28 18:46

Any updates? Not possible?
(0008676)
eddrog (developer)
2012-11-29 09:33

No its not too difficult and its possible. And I think its an important feature but the problem is lack of time. I already took a closer look at this feature request. But at the moment I'm working on another feature (JACK - has a higher prio for me; bug fixing) and the other devs are hard working on refactoring or bug fixing ...

I hope Q1/Q2 next year I'll have the time. Perhaps someone else will/can contribute this feature sooner.
(0008677)
mohanohi (reporter)
2012-11-29 16:24

Thats a relief. But till then i can't use kdenlive for any serious film projects.. :(
(0009011)
farid (reporter)
2013-01-03 18:35

now blender has an edl import.
http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Import-Export/EDL_Import [^]

it would be great if kdenlive has this feature so that we can work better with blender.

how about kdenparse?

http://kdenlive.org/forum/announcing-kdenparse-python-kdenlive-project-file-parser-generates-edl-sort-and-other-stuff [^]
(0009018)
mohanohi (reporter)
2013-01-04 05:49

Oh, There's a kdenparse script? Now it will be nice if i could import projects edited in kdenlive and do further vfx works in Blender / any other color grading apps.
(0009019)
mohanohi (reporter)
2013-01-04 07:12

This is the script developed for eyeon fusion by http://peterbako.hangman.hu/edlimporter/ [^]

And its GPL license..

------------------------------------------------------
-- Simple EDL importer script, Revision: 1.0
--
-- This script creates loaders from EDL file generated
-- by Adobe Premiere. File name must be in the comment field.
--
-- place in Fusion:/Scripts/Comp
--
-- written by Peter Bako (bako.peter@hangman.hu)
-- created : Okt 23, 2010 by Peter Bako
-- website: http://www.peterbako.hangman.hu [^]
-- license: http://www.gnu.org/licenses/gpl.html [^]
-- If you think this script is useful consider upgrading to PRO.
------------------------------------------------------

function trim (s)
    return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end

--add backslash character at the end of the directory path
function addper(dirpath)
    if string.sub(dirpath, - 1, - 1) ~= "\\" then
        return(dirpath.. "\\")
    else
        return(dirpath)
    end
end

function parseClipLine(edlLine, fps)
    --EDL line from Adobe Premiere:
    -- 001 AX V C 00:00:05:04 00:00:11:18 00:00:00:00 00:00:06:14
    -- * FROM CLIP NAME: MVI_4166_gondolkodik_kozeli.MOV
    --non-drop frame timecode pattern: HH:MM:SS:FF
    -----------------------
    pattern = "[%d+:%d+:%d+:%d+]+"
    timecodes = {}
    counter = 1
    
    for i in string.gmatch(edlLine,"%S+") do
                        
        timecodes[counter] = i
        counter = counter + 1
        
    end
    
    numbers = {}
    numbers[1] = timecodes[1]
    numbers[2] = convertToFrameNumber(timecodes[5],fps)
    numbers[3] = convertToFrameNumber(timecodes[6],fps)
    numbers[4] = convertToFrameNumber(timecodes[7],fps)
    numbers[5] = convertToFrameNumber(timecodes[8],fps)
    numbers[6] = timecodes[3]
    
    return(numbers)
end

function parseCommentLine(edlLine)
    --EDL line from Adobe Premiere:
    -- 001 AX V C 00:00:05:04 00:00:11:18 00:00:00:00 00:00:06:14
    -- * FROM CLIP NAME: MVI_4166_gondolkodik_kozeli.MOV
    --non-drop frame timecode pattern: HH:MM:SS:FF
    -----------------------
    clipname = {}
    counter = 1
        
    clipname = split(edlLine, ":")
    
    return(trim(clipname[2]))
    
end

function convertToFrameNumber(timecode, fps)
    pattern = "%d+"
    timechunks = {}
    counter = 1
    
    for i in string.gmatch(timecode, pattern) do

        timechunks[counter] = i
        counter = counter + 1
        
    end
    
    frameNumber = fps * (timechunks[1] * 3600 + timechunks[2] * 60 + timechunks[3]) + timechunks[4]
    return(frameNumber)
    
end

function createLoader(framerate, timecodes, dirpath, filename, norm)
    if string.lower(timecodes[6]) == "v" then
        
        offset = 0
        
        --concatenate the filepath
        local filepath = addper(dirpath)..filename
        
        --create a new loader tool
        local loader = {}
        loader = composition:AddTool("Loader", timecodes[1] * 2, 1 )
        
        -- store the initial loader's parameters
        local oldSettings = loader:GetAttrs()
        
        -- flush the old parameters and use the new ones
        loader.Clip = ""
        loader.Clip = filepath
        loader.GlobalIn = oldSettings["TOOLNT_Clip_Start"][1]
        loader.ClipTimeStart = oldSettings["TOOLIT_Clip_TrimIn"][1]
        loader:SetAttrs({TOOLB_PassThrough = true})
        wait(0.2)
        loader:SetAttrs({TOOLB_PassThrough = false})

        --normalize the timecode based on metadata
        if norm ~= 0 then
            local clipfile = io.open(filepath, "r")
            if clipfile then
                abs_tc = loader.Output[0].Metadata.start_absolute_timecode
                edge_tc = loader.Output[0].Metadata.start_edge_timecode
                
                if abs_tc and edge_tc then
                    edge_tc = convertToFrameNumber(edge_tc,frate)
                    abs_tc = convertToFrameNumber(abs_tc,frate)
                    
                    if norm == 1 then
                        offset = offset + edge_tc
                    elseif norm == 2 then
                        offset = offset + abs_tc
                    end
                end
            end
        end
        
        -- set the ranges according to the timecodes
        loader.HoldFirstFrame = timecodes[4]
        loader.GlobalIn = timecodes[4]
        loader.ClipTimeStart = timecodes[2] - offset
        loader.ClipTimeEnd = timecodes[3] - offset
        loader.HoldFirstFrame = 0
        loader.HoldLastFrame = 0
        
        --if the file is missing change the node's color
        local fopentry = io.open(filepath, "r")
        if fopentry == nil then
            loader.TileColor = {R = 0.6, G = 0.0, B = 0.0}
            loader.TextColor = {R = 1, G = 1, B = 1}
            print(" - WARNING: Loader has been created but the footage is missing.\n")
            return(1)
        end
        
        print(" - DONE : Loader has been created succesfully!\n")
    else
        print(" - WARNING: Skipped Loader creation. This EDL line may refer to audio content.\n")
    end
    return(0)
end

function isEmptyLine(getLine)

    --skip the empty lines
    isLine = string.find(getLine,'%w');
    
    if isLine then
        return getLine
    else
        return(nil)
    end
end

-- Select EDL file dialog
composition_path = composition:GetAttrs().COMPS_FileName
d = {}
d[1] = {"File", Name = "Select A Source File", "FileBrowse", Default = composition_path}
d[2] = {"Fps", Name = "Select the framerate of the EDL file", "Text", Lines = 1, Default = "25"}
d[3] = {"Path", Name = "Select the footage directory", "PathBrowse", Default = composition_path }
d[4] = {"Normalize", Name = "Fix R3D TC", "Dropdown", Options = {"no", "Edgecode", "Absoulte"}, Default = 0}
d[5] = {"About", "Text", Lines = 7, Wrap=true, Default = "Simple EDL importer v1.1 \n\nCreated by Peter Bako \nbakopeti@gmail.com \n\nAll rights reserved - 2011"}


dialog = composition:AskUser("Simple EDL importer v1.1", d)
if dialog == nil then
    print("You cancelled the dialog!")
else
    --dump(dialog.File)
    --dump(dialog.Fps)
    --dump(dialog.Path)
    print("----------- Simple EDL importer v1.1\n")
    
    -- check valid inputs
    f = eyeon.parseFilename(dialog.File)
    if string.lower(f.Extension) ~= ".edl" then
        print(" - ERROR : Please select an EDL file!")
        return
    end
    
    frate = tonumber(dialog.Fps)
    if not frate then
        print(" - ERROR : Invalid framerate!")
        return
    end
        
    p = eyeon.direxists(dialog.Path)
    if not p then
        print(" - ERROR : Invalid footage directory!")
        return
    end
        
    --open the edl files and parse the lines
    local fh = io.open(f.FullPath, "r")
    
    -- skip the title and the next empty line
    local line = fh:read("*l")
    line = fh:read("*l")
    -- the third line is the first good one
    line = fh:read("*l")
    
    -- lock the composition
    composition:Lock()
    
    --MAIN LOOP
    while line ~= nil do
    
        -- remove empty lines
        cl = isEmptyLine(line)
        while not cl do
            line = fh:read("*l")
            cl = isEmptyLine(line)
        end
        
        --convert to integer
        frate = math.ceil(frate)
        --the first line of a pair contains the timecodes
        codes = parseClipLine(cl, frate)
        
        -- next line is the comment field which contains the filename
        line = fh:read("*l")
        filename = parseCommentLine(line)
        -- create a loader form the return values
        createLoader( frate, codes, dialog.Path, filename, dialog.Normalize)
        
        -- next line
        line = fh:read("*l")
    end
    
    -- unlock the project and let the work begin
    composition:Unlock()
    
    -- close the file
    io.close(fh)
    
    print("----------- FINISHED! Please save and re-open the composition!")
    return
    
end
(0009047)
farid (reporter)
2013-01-06 22:51
edited on: 2013-01-07 03:50

this should be in the ui somewhere.

really important feature :)

edit:
just saw this link in mlt's roadmap:
http://www.edlmax.com/EdlMaxHelp/Edl/maxguide.html [^]


- Issue History
Date Modified Username Field Change
2012-04-03 17:41 mohanohi New Issue
2012-11-28 18:46 mohanohi Note Added: 0008675
2012-11-29 09:33 eddrog Note Added: 0008676
2012-11-29 16:24 mohanohi Note Added: 0008677
2013-01-03 18:35 farid Note Added: 0009011
2013-01-04 05:49 mohanohi Note Added: 0009018
2013-01-04 07:12 mohanohi Note Added: 0009019
2013-01-06 22:51 farid Note Added: 0009047
2013-01-07 03:50 farid Note Edited: 0009047 View Revisions


Copyright © 2000 - 2014 MantisBT Team
Powered by Mantis Bugtracker