Copy disabled (too large)
Download .txt
Showing preview only (28,544K chars total). Download the full file to get everything.
Repository: olive-editor/olive
Branch: master
Commit: 7e0e94abf661
Files: 1145
Total size: 27.0 MB
Directory structure:
gitextract_2jek1uqd/
├── .clang-format
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 00-olive_unsupported.md
│ │ ├── 01-crash_issue.md
│ │ ├── 50-build_issue.md
│ │ ├── 50-cache_issue.md
│ │ ├── 50-codec_issue.md
│ │ ├── 50-color_issue.md
│ │ ├── 50-editing_issue.md
│ │ ├── 50-export_issue.md
│ │ ├── 50-node_issue.md
│ │ ├── 50-playback_issue.md
│ │ ├── 50-project_issue.md
│ │ ├── 50-renderer_issue.md
│ │ ├── 50-ui_issue.md
│ │ └── config.yml
│ ├── ISSUE_TEMPLATE.md
│ └── workflows/
│ └── ci.yml
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── app/
│ ├── CMakeLists.txt
│ ├── audio/
│ │ ├── CMakeLists.txt
│ │ ├── audiomanager.cpp
│ │ ├── audiomanager.h
│ │ ├── audioprocessor.cpp
│ │ ├── audioprocessor.h
│ │ ├── audiovisualwaveform.cpp
│ │ └── audiovisualwaveform.h
│ ├── cli/
│ │ ├── CMakeLists.txt
│ │ ├── cliexport/
│ │ │ ├── cliexportmanager.cpp
│ │ │ └── cliexportmanager.h
│ │ ├── cliprogress/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── cliprogressdialog.cpp
│ │ │ └── cliprogressdialog.h
│ │ └── clitask/
│ │ ├── CMakeLists.txt
│ │ ├── clitaskdialog.cpp
│ │ └── clitaskdialog.h
│ ├── codec/
│ │ ├── CMakeLists.txt
│ │ ├── conformmanager.cpp
│ │ ├── conformmanager.h
│ │ ├── decoder.cpp
│ │ ├── decoder.h
│ │ ├── encoder.cpp
│ │ ├── encoder.h
│ │ ├── exportcodec.cpp
│ │ ├── exportcodec.h
│ │ ├── exportformat.cpp
│ │ ├── exportformat.h
│ │ ├── ffmpeg/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── ffmpegdecoder.cpp
│ │ │ ├── ffmpegdecoder.h
│ │ │ ├── ffmpegencoder.cpp
│ │ │ └── ffmpegencoder.h
│ │ ├── frame.cpp
│ │ ├── frame.h
│ │ ├── oiio/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── oiiodecoder.cpp
│ │ │ ├── oiiodecoder.h
│ │ │ ├── oiioencoder.cpp
│ │ │ └── oiioencoder.h
│ │ ├── planarfiledevice.cpp
│ │ └── planarfiledevice.h
│ ├── common/
│ │ ├── CMakeLists.txt
│ │ ├── autoscroll.h
│ │ ├── cancelableobject.h
│ │ ├── channellayout.h
│ │ ├── commandlineparser.cpp
│ │ ├── commandlineparser.h
│ │ ├── crashpadinterface.cpp
│ │ ├── crashpadinterface.h
│ │ ├── crashpadutils.h
│ │ ├── debug.cpp
│ │ ├── debug.h
│ │ ├── decibel.h
│ │ ├── define.h
│ │ ├── digit.h
│ │ ├── ffmpegutils.cpp
│ │ ├── ffmpegutils.h
│ │ ├── filefunctions.cpp
│ │ ├── filefunctions.h
│ │ ├── html.cpp
│ │ ├── html.h
│ │ ├── jobtime.cpp
│ │ ├── jobtime.h
│ │ ├── lerp.h
│ │ ├── memorypool.h
│ │ ├── ocioutils.cpp
│ │ ├── ocioutils.h
│ │ ├── oiioutils.cpp
│ │ ├── oiioutils.h
│ │ ├── otioutils.h
│ │ ├── power.h
│ │ ├── qtutils.cpp
│ │ ├── qtutils.h
│ │ ├── range.h
│ │ ├── ratiodialog.cpp
│ │ ├── ratiodialog.h
│ │ ├── threadsafemap.h
│ │ ├── tohex.h
│ │ ├── util.h
│ │ ├── xmlutils.cpp
│ │ └── xmlutils.h
│ ├── config/
│ │ ├── CMakeLists.txt
│ │ ├── config.cpp
│ │ └── config.h
│ ├── core.cpp
│ ├── core.h
│ ├── crashhandler/
│ │ ├── CMakeLists.txt
│ │ ├── crashhandler.cpp
│ │ └── crashhandler.h
│ ├── dialog/
│ │ ├── CMakeLists.txt
│ │ ├── about/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── about.cpp
│ │ │ ├── about.h
│ │ │ ├── patreon.h
│ │ │ ├── patreon.py
│ │ │ ├── scrollinglabel.cpp
│ │ │ └── scrollinglabel.h
│ │ ├── actionsearch/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── actionsearch.cpp
│ │ │ └── actionsearch.h
│ │ ├── autorecovery/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── autorecoverydialog.cpp
│ │ │ └── autorecoverydialog.h
│ │ ├── color/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── colordialog.cpp
│ │ │ └── colordialog.h
│ │ ├── configbase/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── configdialogbase.cpp
│ │ │ ├── configdialogbase.h
│ │ │ ├── configdialogbasetab.cpp
│ │ │ └── configdialogbasetab.h
│ │ ├── diskcache/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── diskcachedialog.cpp
│ │ │ └── diskcachedialog.h
│ │ ├── export/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── codec/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── av1section.cpp
│ │ │ │ ├── av1section.h
│ │ │ │ ├── cineformsection.cpp
│ │ │ │ ├── cineformsection.h
│ │ │ │ ├── codecsection.cpp
│ │ │ │ ├── codecsection.h
│ │ │ │ ├── codecstack.cpp
│ │ │ │ ├── codecstack.h
│ │ │ │ ├── h264section.cpp
│ │ │ │ ├── h264section.h
│ │ │ │ ├── imagesection.cpp
│ │ │ │ └── imagesection.h
│ │ │ ├── export.cpp
│ │ │ ├── export.h
│ │ │ ├── exportadvancedvideodialog.cpp
│ │ │ ├── exportadvancedvideodialog.h
│ │ │ ├── exportaudiotab.cpp
│ │ │ ├── exportaudiotab.h
│ │ │ ├── exportformatcombobox.cpp
│ │ │ ├── exportformatcombobox.h
│ │ │ ├── exportsavepresetdialog.cpp
│ │ │ ├── exportsavepresetdialog.h
│ │ │ ├── exportsubtitlestab.cpp
│ │ │ ├── exportsubtitlestab.h
│ │ │ ├── exportvideotab.cpp
│ │ │ └── exportvideotab.h
│ │ ├── footageproperties/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── footageproperties.cpp
│ │ │ ├── footageproperties.h
│ │ │ └── streamproperties/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── audiostreamproperties.cpp
│ │ │ ├── audiostreamproperties.h
│ │ │ ├── streamproperties.cpp
│ │ │ ├── streamproperties.h
│ │ │ ├── videostreamproperties.cpp
│ │ │ └── videostreamproperties.h
│ │ ├── footagerelink/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── footagerelinkdialog.cpp
│ │ │ └── footagerelinkdialog.h
│ │ ├── keyframeproperties/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── keyframeproperties.cpp
│ │ │ └── keyframeproperties.h
│ │ ├── markerproperties/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── markerpropertiesdialog.cpp
│ │ │ └── markerpropertiesdialog.h
│ │ ├── otioproperties/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── otiopropertiesdialog.cpp
│ │ │ └── otiopropertiesdialog.h
│ │ ├── preferences/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── keysequenceeditor.cpp
│ │ │ ├── keysequenceeditor.h
│ │ │ ├── preferences.cpp
│ │ │ ├── preferences.h
│ │ │ └── tabs/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── preferencesappearancetab.cpp
│ │ │ ├── preferencesappearancetab.h
│ │ │ ├── preferencesaudiotab.cpp
│ │ │ ├── preferencesaudiotab.h
│ │ │ ├── preferencesbehaviortab.cpp
│ │ │ ├── preferencesbehaviortab.h
│ │ │ ├── preferencesdisktab.cpp
│ │ │ ├── preferencesdisktab.h
│ │ │ ├── preferencesgeneraltab.cpp
│ │ │ ├── preferencesgeneraltab.h
│ │ │ ├── preferenceskeyboardtab.cpp
│ │ │ └── preferenceskeyboardtab.h
│ │ ├── progress/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── progress.cpp
│ │ │ └── progress.h
│ │ ├── projectproperties/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── projectproperties.cpp
│ │ │ └── projectproperties.h
│ │ ├── rendercancel/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── rendercancel.cpp
│ │ │ └── rendercancel.h
│ │ ├── sequence/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── presetmanager.h
│ │ │ ├── sequence.cpp
│ │ │ ├── sequence.h
│ │ │ ├── sequencedialogparametertab.cpp
│ │ │ ├── sequencedialogparametertab.h
│ │ │ ├── sequencedialogpresettab.cpp
│ │ │ ├── sequencedialogpresettab.h
│ │ │ └── sequencepreset.h
│ │ ├── speedduration/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── speeddurationdialog.cpp
│ │ │ └── speeddurationdialog.h
│ │ ├── task/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── task.cpp
│ │ │ └── task.h
│ │ └── text/
│ │ ├── CMakeLists.txt
│ │ ├── text.cpp
│ │ └── text.h
│ ├── main.cpp
│ ├── node/
│ │ ├── CMakeLists.txt
│ │ ├── audio/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── pan/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── pan.cpp
│ │ │ │ └── pan.h
│ │ │ └── volume/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── volume.cpp
│ │ │ └── volume.h
│ │ ├── block/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── block.cpp
│ │ │ ├── block.h
│ │ │ ├── clip/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── clip.cpp
│ │ │ │ └── clip.h
│ │ │ ├── gap/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── gap.cpp
│ │ │ │ └── gap.h
│ │ │ ├── subtitle/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── subtitle.cpp
│ │ │ │ └── subtitle.h
│ │ │ └── transition/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── crossdissolve/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── crossdissolvetransition.cpp
│ │ │ │ └── crossdissolvetransition.h
│ │ │ ├── diptocolor/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── diptocolortransition.cpp
│ │ │ │ └── diptocolortransition.h
│ │ │ ├── transition.cpp
│ │ │ └── transition.h
│ │ ├── color/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── colormanager/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── colormanager.cpp
│ │ │ │ └── colormanager.h
│ │ │ ├── displaytransform/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── displaytransform.cpp
│ │ │ │ └── displaytransform.h
│ │ │ ├── ociobase/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── ociobase.cpp
│ │ │ │ └── ociobase.h
│ │ │ └── ociogradingtransformlinear/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── ociogradingtransformlinear.cpp
│ │ │ └── ociogradingtransformlinear.h
│ │ ├── distort/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── cornerpin/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── cornerpindistortnode.cpp
│ │ │ │ └── cornerpindistortnode.h
│ │ │ ├── crop/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── cropdistortnode.cpp
│ │ │ │ └── cropdistortnode.h
│ │ │ ├── flip/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── flipdistortnode.cpp
│ │ │ │ └── flipdistortnode.h
│ │ │ ├── mask/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── mask.cpp
│ │ │ │ └── mask.h
│ │ │ ├── ripple/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── rippledistortnode.cpp
│ │ │ │ └── rippledistortnode.h
│ │ │ ├── swirl/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── swirldistortnode.cpp
│ │ │ │ └── swirldistortnode.h
│ │ │ ├── tile/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── tiledistortnode.cpp
│ │ │ │ └── tiledistortnode.h
│ │ │ ├── transform/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── transformdistortnode.cpp
│ │ │ │ └── transformdistortnode.h
│ │ │ └── wave/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── wavedistortnode.cpp
│ │ │ └── wavedistortnode.h
│ │ ├── effect/
│ │ │ ├── CMakeLists.txt
│ │ │ └── opacity/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── opacityeffect.cpp
│ │ │ └── opacityeffect.h
│ │ ├── factory.cpp
│ │ ├── factory.h
│ │ ├── filter/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── blur/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── blur.cpp
│ │ │ │ └── blur.h
│ │ │ ├── dropshadow/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── dropshadowfilter.cpp
│ │ │ │ └── dropshadowfilter.h
│ │ │ ├── mosaic/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── mosaicfilternode.cpp
│ │ │ │ └── mosaicfilternode.h
│ │ │ └── stroke/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── stroke.cpp
│ │ │ └── stroke.h
│ │ ├── generator/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── matrix/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── matrix.cpp
│ │ │ │ └── matrix.h
│ │ │ ├── noise/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── noise.cpp
│ │ │ │ └── noise.h
│ │ │ ├── polygon/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── polygon.cpp
│ │ │ │ └── polygon.h
│ │ │ ├── shape/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── generatorwithmerge.cpp
│ │ │ │ ├── generatorwithmerge.h
│ │ │ │ ├── shapenode.cpp
│ │ │ │ ├── shapenode.h
│ │ │ │ ├── shapenodebase.cpp
│ │ │ │ └── shapenodebase.h
│ │ │ ├── solid/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── solid.cpp
│ │ │ │ └── solid.h
│ │ │ └── text/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── textv1.cpp
│ │ │ ├── textv1.h
│ │ │ ├── textv2.cpp
│ │ │ ├── textv2.h
│ │ │ ├── textv3.cpp
│ │ │ └── textv3.h
│ │ ├── gizmo/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── draggable.cpp
│ │ │ ├── draggable.h
│ │ │ ├── gizmo.cpp
│ │ │ ├── gizmo.h
│ │ │ ├── line.cpp
│ │ │ ├── line.h
│ │ │ ├── path.cpp
│ │ │ ├── path.h
│ │ │ ├── point.cpp
│ │ │ ├── point.h
│ │ │ ├── polygon.cpp
│ │ │ ├── polygon.h
│ │ │ ├── screen.cpp
│ │ │ ├── screen.h
│ │ │ ├── text.cpp
│ │ │ └── text.h
│ │ ├── globals.cpp
│ │ ├── globals.h
│ │ ├── group/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── group.cpp
│ │ │ └── group.h
│ │ ├── input/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── multicam/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── multicamnode.cpp
│ │ │ │ └── multicamnode.h
│ │ │ ├── time/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── timeinput.cpp
│ │ │ │ └── timeinput.h
│ │ │ └── value/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── valuenode.cpp
│ │ │ └── valuenode.h
│ │ ├── inputdragger.cpp
│ │ ├── inputdragger.h
│ │ ├── inputimmediate.cpp
│ │ ├── inputimmediate.h
│ │ ├── keyframe.cpp
│ │ ├── keyframe.h
│ │ ├── keying/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── chromakey/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── chromakey.cpp
│ │ │ │ └── chromakey.h
│ │ │ ├── colordifferencekey/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── colordifferencekey.cpp
│ │ │ │ └── colordifferencekey.h
│ │ │ └── despill/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── despill.cpp
│ │ │ └── despill.h
│ │ ├── math/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── math/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── math.cpp
│ │ │ │ ├── math.h
│ │ │ │ ├── mathbase.cpp
│ │ │ │ └── mathbase.h
│ │ │ ├── merge/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── merge.cpp
│ │ │ │ └── merge.h
│ │ │ └── trigonometry/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── trigonometry.cpp
│ │ │ └── trigonometry.h
│ │ ├── node.cpp
│ │ ├── node.h
│ │ ├── nodeundo.cpp
│ │ ├── nodeundo.h
│ │ ├── output/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── track/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── track.cpp
│ │ │ │ ├── track.h
│ │ │ │ ├── tracklist.cpp
│ │ │ │ └── tracklist.h
│ │ │ └── viewer/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── viewer.cpp
│ │ │ └── viewer.h
│ │ ├── param.cpp
│ │ ├── param.h
│ │ ├── project/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── folder/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── folder.cpp
│ │ │ │ └── folder.h
│ │ │ ├── footage/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── footage.cpp
│ │ │ │ ├── footage.h
│ │ │ │ ├── footagedescription.cpp
│ │ │ │ └── footagedescription.h
│ │ │ ├── sequence/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── sequence.cpp
│ │ │ │ └── sequence.h
│ │ │ └── serializer/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── serializer.cpp
│ │ │ ├── serializer.h
│ │ │ ├── serializer190219.cpp
│ │ │ ├── serializer190219.h
│ │ │ ├── serializer210528.cpp
│ │ │ ├── serializer210528.h
│ │ │ ├── serializer210907.cpp
│ │ │ ├── serializer210907.h
│ │ │ ├── serializer211228.cpp
│ │ │ ├── serializer211228.h
│ │ │ ├── serializer220403.cpp
│ │ │ ├── serializer220403.h
│ │ │ ├── serializer230220.cpp
│ │ │ ├── serializer230220.h
│ │ │ ├── typeserializer.cpp
│ │ │ └── typeserializer.h
│ │ ├── project.cpp
│ │ ├── project.h
│ │ ├── serializeddata.cpp
│ │ ├── serializeddata.h
│ │ ├── splitvalue.h
│ │ ├── time/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── timeformat/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── timeformat.cpp
│ │ │ │ └── timeformat.h
│ │ │ ├── timeoffset/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── timeoffsetnode.cpp
│ │ │ │ └── timeoffsetnode.h
│ │ │ └── timeremap/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── timeremap.cpp
│ │ │ └── timeremap.h
│ │ ├── traverser.cpp
│ │ ├── traverser.h
│ │ ├── value.cpp
│ │ ├── value.h
│ │ ├── valuedatabase.cpp
│ │ └── valuedatabase.h
│ ├── packaging/
│ │ ├── CMakeLists.txt
│ │ ├── linux/
│ │ │ ├── AppRun
│ │ │ ├── CMakeLists.txt
│ │ │ ├── org.olivevideoeditor.Olive.appdata.xml.in
│ │ │ ├── org.olivevideoeditor.Olive.desktop
│ │ │ └── org.olivevideoeditor.Olive.xml
│ │ ├── macos/
│ │ │ ├── MacOSXBundleInfo.plist.in
│ │ │ └── olive.icns
│ │ └── windows/
│ │ ├── nsis/
│ │ │ └── olive.nsi
│ │ ├── resources.rc
│ │ └── version.h
│ ├── panel/
│ │ ├── CMakeLists.txt
│ │ ├── audiomonitor/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── audiomonitor.cpp
│ │ │ └── audiomonitor.h
│ │ ├── curve/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── curve.cpp
│ │ │ └── curve.h
│ │ ├── footageviewer/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── footageviewer.cpp
│ │ │ └── footageviewer.h
│ │ ├── history/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── historypanel.cpp
│ │ │ └── historypanel.h
│ │ ├── multicam/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── multicampanel.cpp
│ │ │ └── multicampanel.h
│ │ ├── node/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── node.cpp
│ │ │ └── node.h
│ │ ├── panel.cpp
│ │ ├── panel.h
│ │ ├── panelmanager.cpp
│ │ ├── panelmanager.h
│ │ ├── param/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── param.cpp
│ │ │ └── param.h
│ │ ├── pixelsampler/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── pixelsamplerpanel.cpp
│ │ │ └── pixelsamplerpanel.h
│ │ ├── project/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── footagemanagementpanel.h
│ │ │ ├── project.cpp
│ │ │ └── project.h
│ │ ├── scope/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── scope.cpp
│ │ │ └── scope.h
│ │ ├── sequenceviewer/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── sequenceviewer.cpp
│ │ │ └── sequenceviewer.h
│ │ ├── table/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── table.cpp
│ │ │ └── table.h
│ │ ├── taskmanager/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── taskmanager.cpp
│ │ │ └── taskmanager.h
│ │ ├── timebased/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── timebased.cpp
│ │ │ └── timebased.h
│ │ ├── timeline/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── timeline.cpp
│ │ │ └── timeline.h
│ │ ├── tool/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── tool.cpp
│ │ │ └── tool.h
│ │ └── viewer/
│ │ ├── CMakeLists.txt
│ │ ├── viewer.cpp
│ │ ├── viewer.h
│ │ ├── viewerbase.cpp
│ │ └── viewerbase.h
│ ├── render/
│ │ ├── CMakeLists.txt
│ │ ├── alphaassoc.h
│ │ ├── audioplaybackcache.cpp
│ │ ├── audioplaybackcache.h
│ │ ├── audiowaveformcache.cpp
│ │ ├── audiowaveformcache.h
│ │ ├── cancelatom.h
│ │ ├── colorprocessor.cpp
│ │ ├── colorprocessor.h
│ │ ├── colorprocessorcache.h
│ │ ├── colortransform.h
│ │ ├── diskmanager.cpp
│ │ ├── diskmanager.h
│ │ ├── framehashcache.cpp
│ │ ├── framehashcache.h
│ │ ├── framemanager.cpp
│ │ ├── framemanager.h
│ │ ├── job/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── acceleratedjob.cpp
│ │ │ ├── acceleratedjob.h
│ │ │ ├── cachejob.h
│ │ │ ├── colortransformjob.h
│ │ │ ├── footagejob.h
│ │ │ ├── generatejob.h
│ │ │ ├── samplejob.h
│ │ │ └── shaderjob.h
│ │ ├── loopmode.h
│ │ ├── managedcolor.cpp
│ │ ├── managedcolor.h
│ │ ├── ocioconf/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── config.ocio
│ │ │ ├── looks/
│ │ │ │ ├── Filmic_False_Colour.spi3d
│ │ │ │ ├── Filmic_to_0-35_1-30.spi1d
│ │ │ │ ├── Filmic_to_0-48_1-09.spi1d
│ │ │ │ ├── Filmic_to_0-60_1-04.spi1d
│ │ │ │ ├── Filmic_to_0-70_1-03.spi1d
│ │ │ │ ├── Filmic_to_0-85_1-011.spi1d
│ │ │ │ ├── Filmic_to_0.99_1-0075.spi1d
│ │ │ │ └── Filmic_to_1.20_1-00.spi1d
│ │ │ ├── luts/
│ │ │ │ ├── Blackmagic_FilmWideGamut_Gen5_to_linear.spi1d
│ │ │ │ ├── F-Log_to_Linear.spi1d
│ │ │ │ ├── V-Log_to_linear.spi1d
│ │ │ │ ├── V3_LogC_400_to_linear.spi1d
│ │ │ │ ├── V3_LogC_800_to_linear.spi1d
│ │ │ │ ├── desat65cube.spi3d
│ │ │ │ ├── rec709_to_linear.spi1d
│ │ │ │ └── sRGB_OETF_to_Linear.spi1d
│ │ │ └── ocioconf.qrc.in
│ │ ├── opengl/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── openglrenderer.cpp
│ │ │ └── openglrenderer.h
│ │ ├── playbackcache.cpp
│ │ ├── playbackcache.h
│ │ ├── previewaudiodevice.cpp
│ │ ├── previewaudiodevice.h
│ │ ├── previewautocacher.cpp
│ │ ├── previewautocacher.h
│ │ ├── projectcopier.cpp
│ │ ├── projectcopier.h
│ │ ├── rendercache.h
│ │ ├── renderer.cpp
│ │ ├── renderer.h
│ │ ├── renderjobtracker.cpp
│ │ ├── renderjobtracker.h
│ │ ├── rendermanager.cpp
│ │ ├── rendermanager.h
│ │ ├── rendermodes.h
│ │ ├── renderprocessor.cpp
│ │ ├── renderprocessor.h
│ │ ├── renderticket.cpp
│ │ ├── renderticket.h
│ │ ├── shadercode.h
│ │ ├── subtitleparams.cpp
│ │ ├── subtitleparams.h
│ │ ├── texture.cpp
│ │ ├── texture.h
│ │ ├── videoparams.cpp
│ │ └── videoparams.h
│ ├── shaders/
│ │ ├── CMakeLists.txt
│ │ ├── alphaover.frag
│ │ ├── blur.frag
│ │ ├── chromakey.frag
│ │ ├── colordifferencekey.frag
│ │ ├── colormanage.frag
│ │ ├── cornerpin.frag
│ │ ├── cornerpin.vert
│ │ ├── crop.frag
│ │ ├── crossdissolve.frag
│ │ ├── default.frag
│ │ ├── default.vert
│ │ ├── deinterlace.frag
│ │ ├── deinterlace2.frag
│ │ ├── despill.frag
│ │ ├── diptoblack.frag
│ │ ├── dropshadow.frag
│ │ ├── flip.frag
│ │ ├── interlace.frag
│ │ ├── invertrgb.frag
│ │ ├── invertrgba.frag
│ │ ├── mosaic.frag
│ │ ├── multiply.frag
│ │ ├── noise.frag
│ │ ├── opacity.frag
│ │ ├── opacity_rgb.frag
│ │ ├── rgb.frag
│ │ ├── rgbhistogram.frag
│ │ ├── rgbhistogram.vert
│ │ ├── rgbhistogram_secondary.frag
│ │ ├── rgbwaveform.frag
│ │ ├── rgbwaveform.vert
│ │ ├── ripple.frag
│ │ ├── shaders.qrc.in
│ │ ├── shape.frag
│ │ ├── solid.frag
│ │ ├── stroke.frag
│ │ ├── swirl.frag
│ │ ├── tile.frag
│ │ ├── wave.frag
│ │ └── yuv2rgb.frag
│ ├── task/
│ │ ├── CMakeLists.txt
│ │ ├── conform/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── conform.cpp
│ │ │ └── conform.h
│ │ ├── customcache/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── customcachetask.cpp
│ │ │ └── customcachetask.h
│ │ ├── export/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── export.cpp
│ │ │ └── export.h
│ │ ├── precache/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── precachetask.cpp
│ │ │ └── precachetask.h
│ │ ├── project/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── import/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── import.cpp
│ │ │ │ ├── import.h
│ │ │ │ ├── importerrordialog.cpp
│ │ │ │ └── importerrordialog.h
│ │ │ ├── load/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── load.cpp
│ │ │ │ ├── load.h
│ │ │ │ ├── loadbasetask.cpp
│ │ │ │ └── loadbasetask.h
│ │ │ ├── loadotio/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── loadotio.cpp
│ │ │ │ └── loadotio.h
│ │ │ ├── save/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── save.cpp
│ │ │ │ └── save.h
│ │ │ └── saveotio/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── saveotio.cpp
│ │ │ └── saveotio.h
│ │ ├── render/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── render.cpp
│ │ │ └── render.h
│ │ ├── task.h
│ │ ├── taskmanager.cpp
│ │ └── taskmanager.h
│ ├── timeline/
│ │ ├── CMakeLists.txt
│ │ ├── timelinecommon.h
│ │ ├── timelinecoordinate.cpp
│ │ ├── timelinecoordinate.h
│ │ ├── timelinemarker.cpp
│ │ ├── timelinemarker.h
│ │ ├── timelineundocommon.h
│ │ ├── timelineundogeneral.cpp
│ │ ├── timelineundogeneral.h
│ │ ├── timelineundopointer.cpp
│ │ ├── timelineundopointer.h
│ │ ├── timelineundoripple.cpp
│ │ ├── timelineundoripple.h
│ │ ├── timelineundosplit.cpp
│ │ ├── timelineundosplit.h
│ │ ├── timelineundotrack.cpp
│ │ ├── timelineundotrack.h
│ │ ├── timelineundoworkarea.cpp
│ │ ├── timelineundoworkarea.h
│ │ ├── timelineworkarea.cpp
│ │ └── timelineworkarea.h
│ ├── tool/
│ │ ├── CMakeLists.txt
│ │ └── tool.h
│ ├── ts/
│ │ ├── CMakeLists.txt
│ │ ├── ar_AR.ts
│ │ ├── bs_BA.ts
│ │ ├── cs_CZ.ts
│ │ ├── de_DE.ts
│ │ ├── en_US.ts
│ │ ├── es_ES.ts
│ │ ├── fr_FR.ts
│ │ ├── hr_HR.ts
│ │ ├── id_ID.ts
│ │ ├── it_IT.ts
│ │ ├── ja_JP.ts
│ │ ├── pt_BR.ts
│ │ ├── ru_RU.ts
│ │ ├── sr_RS.ts
│ │ ├── tr_TR.ts
│ │ ├── translations.qrc.in
│ │ ├── uk_UK.ts
│ │ ├── zh_CN.ts
│ │ └── zh_TW.ts
│ ├── ui/
│ │ ├── CMakeLists.txt
│ │ ├── colorcoding.cpp
│ │ ├── colorcoding.h
│ │ ├── cursors/
│ │ │ ├── CMakeLists.txt
│ │ │ └── cursors.qrc
│ │ ├── graphics/
│ │ │ ├── CMakeLists.txt
│ │ │ └── graphics.qrc
│ │ ├── humanstrings.cpp
│ │ ├── humanstrings.h
│ │ ├── icons/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── icons.cpp
│ │ │ └── icons.h
│ │ └── style/
│ │ ├── CMakeLists.txt
│ │ ├── HOWTO.md
│ │ ├── generate-style.sh
│ │ ├── olive-dark/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── palette.ini
│ │ │ ├── res.qrc.in
│ │ │ └── style.css
│ │ ├── olive-light/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── palette.ini
│ │ │ ├── res.qrc.in
│ │ │ ├── style.css
│ │ │ └── svg/
│ │ │ └── convert-to-dark.sh
│ │ ├── style.cpp
│ │ └── style.h
│ ├── undo/
│ │ ├── CMakeLists.txt
│ │ ├── undocommand.cpp
│ │ ├── undocommand.h
│ │ ├── undostack.cpp
│ │ └── undostack.h
│ ├── version.cpp
│ ├── version.h
│ ├── widget/
│ │ ├── CMakeLists.txt
│ │ ├── audiomonitor/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── audiomonitor.cpp
│ │ │ └── audiomonitor.h
│ │ ├── bezier/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── bezierwidget.cpp
│ │ │ └── bezierwidget.h
│ │ ├── clickablelabel/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── clickablelabel.cpp
│ │ │ └── clickablelabel.h
│ │ ├── collapsebutton/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── collapsebutton.cpp
│ │ │ └── collapsebutton.h
│ │ ├── colorbutton/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── colorbutton.cpp
│ │ │ └── colorbutton.h
│ │ ├── colorlabelmenu/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── colorcodingcombobox.cpp
│ │ │ ├── colorcodingcombobox.h
│ │ │ ├── colorlabelmenu.cpp
│ │ │ └── colorlabelmenu.h
│ │ ├── colorwheel/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── colorgradientwidget.cpp
│ │ │ ├── colorgradientwidget.h
│ │ │ ├── colorpreviewbox.cpp
│ │ │ ├── colorpreviewbox.h
│ │ │ ├── colorspacechooser.cpp
│ │ │ ├── colorspacechooser.h
│ │ │ ├── colorswatchchooser.cpp
│ │ │ ├── colorswatchchooser.h
│ │ │ ├── colorswatchwidget.cpp
│ │ │ ├── colorswatchwidget.h
│ │ │ ├── colorvalueswidget.cpp
│ │ │ ├── colorvalueswidget.h
│ │ │ ├── colorwheelwidget.cpp
│ │ │ └── colorwheelwidget.h
│ │ ├── columnedgridlayout/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── columnedgridlayout.cpp
│ │ │ └── columnedgridlayout.h
│ │ ├── curvewidget/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── curveview.cpp
│ │ │ ├── curveview.h
│ │ │ ├── curvewidget.cpp
│ │ │ └── curvewidget.h
│ │ ├── filefield/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── filefield.cpp
│ │ │ └── filefield.h
│ │ ├── flowlayout/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── flowlayout.cpp
│ │ │ └── flowlayout.h
│ │ ├── focusablelineedit/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── focusablelineedit.cpp
│ │ │ └── focusablelineedit.h
│ │ ├── handmovableview/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── handmovableview.cpp
│ │ │ └── handmovableview.h
│ │ ├── history/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── historywidget.cpp
│ │ │ └── historywidget.h
│ │ ├── keyframeview/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── keyframeview.cpp
│ │ │ ├── keyframeview.h
│ │ │ ├── keyframeviewinputconnection.cpp
│ │ │ ├── keyframeviewinputconnection.h
│ │ │ ├── keyframeviewundo.cpp
│ │ │ └── keyframeviewundo.h
│ │ ├── manageddisplay/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── manageddisplay.cpp
│ │ │ └── manageddisplay.h
│ │ ├── menu/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── menu.cpp
│ │ │ ├── menu.h
│ │ │ ├── menushared.cpp
│ │ │ └── menushared.h
│ │ ├── multicam/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── multicamdisplay.cpp
│ │ │ ├── multicamdisplay.h
│ │ │ ├── multicamwidget.cpp
│ │ │ └── multicamwidget.h
│ │ ├── nodecombobox/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── nodecombobox.cpp
│ │ │ └── nodecombobox.h
│ │ ├── nodeparamview/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── nodeparamview.cpp
│ │ │ ├── nodeparamview.h
│ │ │ ├── nodeparamviewarraywidget.cpp
│ │ │ ├── nodeparamviewarraywidget.h
│ │ │ ├── nodeparamviewconnectedlabel.cpp
│ │ │ ├── nodeparamviewconnectedlabel.h
│ │ │ ├── nodeparamviewcontext.cpp
│ │ │ ├── nodeparamviewcontext.h
│ │ │ ├── nodeparamviewdockarea.cpp
│ │ │ ├── nodeparamviewdockarea.h
│ │ │ ├── nodeparamviewitem.cpp
│ │ │ ├── nodeparamviewitem.h
│ │ │ ├── nodeparamviewitembase.cpp
│ │ │ ├── nodeparamviewitembase.h
│ │ │ ├── nodeparamviewitemtitlebar.cpp
│ │ │ ├── nodeparamviewitemtitlebar.h
│ │ │ ├── nodeparamviewkeyframecontrol.cpp
│ │ │ ├── nodeparamviewkeyframecontrol.h
│ │ │ ├── nodeparamviewtextedit.cpp
│ │ │ ├── nodeparamviewtextedit.h
│ │ │ ├── nodeparamviewwidgetbridge.cpp
│ │ │ └── nodeparamviewwidgetbridge.h
│ │ ├── nodetableview/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── nodetableview.cpp
│ │ │ ├── nodetableview.h
│ │ │ ├── nodetablewidget.cpp
│ │ │ └── nodetablewidget.h
│ │ ├── nodetreeview/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── nodetreeview.cpp
│ │ │ └── nodetreeview.h
│ │ ├── nodevaluetree/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── nodevaluetree.cpp
│ │ │ └── nodevaluetree.h
│ │ ├── nodeview/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── nodeview.cpp
│ │ │ ├── nodeview.h
│ │ │ ├── nodeviewcommon.h
│ │ │ ├── nodeviewcontext.cpp
│ │ │ ├── nodeviewcontext.h
│ │ │ ├── nodeviewedge.cpp
│ │ │ ├── nodeviewedge.h
│ │ │ ├── nodeviewitem.cpp
│ │ │ ├── nodeviewitem.h
│ │ │ ├── nodeviewitemconnector.cpp
│ │ │ ├── nodeviewitemconnector.h
│ │ │ ├── nodeviewminimap.cpp
│ │ │ ├── nodeviewminimap.h
│ │ │ ├── nodeviewscene.cpp
│ │ │ ├── nodeviewscene.h
│ │ │ ├── nodeviewtoolbar.cpp
│ │ │ ├── nodeviewtoolbar.h
│ │ │ ├── nodewidget.cpp
│ │ │ └── nodewidget.h
│ │ ├── path/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── pathwidget.cpp
│ │ │ └── pathwidget.h
│ │ ├── pixelsampler/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── pixelsampler.cpp
│ │ │ └── pixelsampler.h
│ │ ├── playbackcontrols/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── dragbutton.cpp
│ │ │ ├── dragbutton.h
│ │ │ ├── playbackcontrols.cpp
│ │ │ └── playbackcontrols.h
│ │ ├── projectexplorer/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── projectexplorer.cpp
│ │ │ ├── projectexplorer.h
│ │ │ ├── projectexplorericonview.cpp
│ │ │ ├── projectexplorericonview.h
│ │ │ ├── projectexplorericonviewitemdelegate.cpp
│ │ │ ├── projectexplorericonviewitemdelegate.h
│ │ │ ├── projectexplorerlistview.cpp
│ │ │ ├── projectexplorerlistview.h
│ │ │ ├── projectexplorerlistviewbase.cpp
│ │ │ ├── projectexplorerlistviewbase.h
│ │ │ ├── projectexplorerlistviewitemdelegate.cpp
│ │ │ ├── projectexplorerlistviewitemdelegate.h
│ │ │ ├── projectexplorernavigation.cpp
│ │ │ ├── projectexplorernavigation.h
│ │ │ ├── projectexplorertreeview.cpp
│ │ │ ├── projectexplorertreeview.h
│ │ │ ├── projectexplorerundo.h
│ │ │ ├── projectviewmodel.cpp
│ │ │ └── projectviewmodel.h
│ │ ├── projecttoolbar/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── projecttoolbar.cpp
│ │ │ └── projecttoolbar.h
│ │ ├── resizablescrollbar/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── resizablescrollbar.cpp
│ │ │ ├── resizablescrollbar.h
│ │ │ ├── resizabletimelinescrollbar.cpp
│ │ │ └── resizabletimelinescrollbar.h
│ │ ├── scope/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── histogram/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── histogram.cpp
│ │ │ │ └── histogram.h
│ │ │ ├── scopebase/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── scopebase.cpp
│ │ │ │ └── scopebase.h
│ │ │ └── waveform/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── waveform.cpp
│ │ │ └── waveform.h
│ │ ├── slider/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── base/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── decimalsliderbase.cpp
│ │ │ │ ├── decimalsliderbase.h
│ │ │ │ ├── numericsliderbase.cpp
│ │ │ │ ├── numericsliderbase.h
│ │ │ │ ├── sliderbase.cpp
│ │ │ │ ├── sliderbase.h
│ │ │ │ ├── sliderlabel.cpp
│ │ │ │ ├── sliderlabel.h
│ │ │ │ ├── sliderladder.cpp
│ │ │ │ └── sliderladder.h
│ │ │ ├── floatslider.cpp
│ │ │ ├── floatslider.h
│ │ │ ├── integerslider.cpp
│ │ │ ├── integerslider.h
│ │ │ ├── rationalslider.cpp
│ │ │ ├── rationalslider.h
│ │ │ ├── stringslider.cpp
│ │ │ └── stringslider.h
│ │ ├── standardcombos/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── channellayoutcombobox.h
│ │ │ ├── frameratecombobox.h
│ │ │ ├── interlacedcombobox.h
│ │ │ ├── pixelaspectratiocombobox.h
│ │ │ ├── pixelformatcombobox.h
│ │ │ ├── sampleformatcombobox.h
│ │ │ ├── sampleratecombobox.h
│ │ │ ├── standardcombos.h
│ │ │ └── videodividercombobox.h
│ │ ├── taskview/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── elapsedcounterwidget.cpp
│ │ │ ├── elapsedcounterwidget.h
│ │ │ ├── taskview.cpp
│ │ │ ├── taskview.h
│ │ │ ├── taskviewitem.cpp
│ │ │ └── taskviewitem.h
│ │ ├── timebased/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── timebasedview.cpp
│ │ │ ├── timebasedview.h
│ │ │ ├── timebasedviewselectionmanager.cpp
│ │ │ ├── timebasedviewselectionmanager.h
│ │ │ ├── timebasedwidget.cpp
│ │ │ ├── timebasedwidget.h
│ │ │ ├── timescaledobject.cpp
│ │ │ └── timescaledobject.h
│ │ ├── timelinewidget/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── timelineandtrackview.cpp
│ │ │ ├── timelineandtrackview.h
│ │ │ ├── timelinewidget.cpp
│ │ │ ├── timelinewidget.h
│ │ │ ├── timelinewidgetselections.cpp
│ │ │ ├── timelinewidgetselections.h
│ │ │ ├── tool/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── add.cpp
│ │ │ │ ├── add.h
│ │ │ │ ├── beam.cpp
│ │ │ │ ├── beam.h
│ │ │ │ ├── edit.cpp
│ │ │ │ ├── edit.h
│ │ │ │ ├── import.cpp
│ │ │ │ ├── import.h
│ │ │ │ ├── pointer.cpp
│ │ │ │ ├── pointer.h
│ │ │ │ ├── razor.cpp
│ │ │ │ ├── razor.h
│ │ │ │ ├── record.cpp
│ │ │ │ ├── record.h
│ │ │ │ ├── ripple.cpp
│ │ │ │ ├── ripple.h
│ │ │ │ ├── rolling.cpp
│ │ │ │ ├── rolling.h
│ │ │ │ ├── slide.cpp
│ │ │ │ ├── slide.h
│ │ │ │ ├── slip.cpp
│ │ │ │ ├── slip.h
│ │ │ │ ├── tool.cpp
│ │ │ │ ├── tool.h
│ │ │ │ ├── trackselect.cpp
│ │ │ │ ├── trackselect.h
│ │ │ │ ├── transition.cpp
│ │ │ │ ├── transition.h
│ │ │ │ ├── zoom.cpp
│ │ │ │ └── zoom.h
│ │ │ ├── trackview/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── trackview.cpp
│ │ │ │ ├── trackview.h
│ │ │ │ ├── trackviewitem.cpp
│ │ │ │ ├── trackviewitem.h
│ │ │ │ ├── trackviewsplitter.cpp
│ │ │ │ └── trackviewsplitter.h
│ │ │ └── view/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── timelineview.cpp
│ │ │ ├── timelineview.h
│ │ │ ├── timelineviewghostitem.h
│ │ │ └── timelineviewmouseevent.h
│ │ ├── timeruler/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── seekablewidget.cpp
│ │ │ ├── seekablewidget.h
│ │ │ ├── timeruler.cpp
│ │ │ └── timeruler.h
│ │ ├── timetarget/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── timetarget.cpp
│ │ │ └── timetarget.h
│ │ ├── toolbar/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── toolbar.cpp
│ │ │ ├── toolbar.h
│ │ │ ├── toolbarbutton.cpp
│ │ │ └── toolbarbutton.h
│ │ └── viewer/
│ │ ├── CMakeLists.txt
│ │ ├── audiowaveformview.cpp
│ │ ├── audiowaveformview.h
│ │ ├── footageviewer.cpp
│ │ ├── footageviewer.h
│ │ ├── viewer.cpp
│ │ ├── viewer.h
│ │ ├── viewerdisplay.cpp
│ │ ├── viewerdisplay.h
│ │ ├── viewerplaybacktimer.cpp
│ │ ├── viewerplaybacktimer.h
│ │ ├── viewerpreventsleep.cpp
│ │ ├── viewerpreventsleep.h
│ │ ├── viewerqueue.h
│ │ ├── viewersafemargininfo.h
│ │ ├── viewersizer.cpp
│ │ ├── viewersizer.h
│ │ ├── viewertexteditor.cpp
│ │ ├── viewertexteditor.h
│ │ ├── viewerwindow.cpp
│ │ └── viewerwindow.h
│ └── window/
│ ├── CMakeLists.txt
│ └── mainwindow/
│ ├── CMakeLists.txt
│ ├── mainmenu.cpp
│ ├── mainmenu.h
│ ├── mainstatusbar.cpp
│ ├── mainstatusbar.h
│ ├── mainwindow.cpp
│ ├── mainwindow.h
│ ├── mainwindowlayoutinfo.cpp
│ ├── mainwindowlayoutinfo.h
│ ├── mainwindowundo.cpp
│ └── mainwindowundo.h
├── cmake/
│ ├── FindFFMPEG.cmake
│ ├── FindGoogleCrashpad.cmake
│ ├── FindOlive.cmake
│ ├── FindOpenColorIO.cmake
│ ├── FindOpenEXR.cmake
│ ├── FindOpenImageIO.cmake
│ ├── FindOpenTimelineIO.cmake
│ ├── FindPortAudio.cmake
│ └── Sanitizers.cmake
├── docker/
│ ├── README.md
│ ├── ci-common/
│ │ └── Dockerfile
│ ├── ci-crashpad/
│ │ └── Dockerfile
│ ├── ci-ffmpeg/
│ │ └── Dockerfile
│ ├── ci-ocio/
│ │ └── Dockerfile
│ ├── ci-oiio/
│ │ └── Dockerfile
│ ├── ci-olive/
│ │ └── Dockerfile
│ ├── ci-otio/
│ │ └── Dockerfile
│ └── scripts/
│ ├── base/
│ │ └── install_cmake.sh
│ ├── build_crashpad.sh
│ ├── build_ffmpeg.sh
│ ├── build_ocio.sh
│ ├── build_oiio.sh
│ ├── build_olive.sh
│ ├── build_otio.sh
│ └── common/
│ ├── before_build.sh
│ ├── copy_new_files.sh
│ └── install_yumpackages.sh
├── ext/
│ └── CMakeLists.txt
├── tests/
│ ├── CMakeLists.txt
│ ├── compositing/
│ │ ├── CMakeLists.txt
│ │ └── compositing-tests.cpp
│ ├── general/
│ │ ├── CMakeLists.txt
│ │ └── common-tests.cpp
│ ├── testutil.h
│ └── timeline/
│ ├── CMakeLists.txt
│ └── timeline-tests.cpp
└── update-copyright.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
---
Language: Cpp
# BasedOnStyle: Google
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 120
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: true
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
- Regex: '^<.*\.h>'
Priority: 1
- Regex: '^<.*'
Priority: 2
- Regex: '.*'
Priority: 3
IncludeIsMainRegex: '([-_](test|unittest))?$'
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 2
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Never
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: ''
BasedOnStyle: google
- Language: TextProto
Delimiters:
- pb
- PB
- proto
- PROTO
EnclosingFunctions:
- EqualsProto
- EquivToProto
- PARSE_PARTIAL_TEXT_PROTO
- PARSE_TEST_PROTO
- PARSE_TEXT_PROTO
- ParseTextOrDie
- ParseTextProtoOrDie
CanonicalDelimiter: ''
BasedOnStyle: google
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
TabWidth: 8
UseTab: Never
...
================================================
FILE: .gitattributes
================================================
# Default behavior
* text=auto
# Enforce LF line endings on source files
*.h text eol=lf
*.cpp text eol=lf
*.sh text eol=lf
*.desktop text eol=lf
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: olivevideoeditor
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/ISSUE_TEMPLATE/00-olive_unsupported.md
================================================
---
name: Legacy Olive 0.1.x issue ⛔
about: >-
Olive 0.1 is no longer supported and issues made about it will be
automatically closed.
title: '[UNSUPPORTED] '
labels: 'Legacy (Unsupported)'
assignees: ''
---
# Olive 0.1 is unsupported
Unfortunately no one is supporting Olive 0.1 at this time. Any reports
pertaining to it will be closed to keep the issue tracker focused on supported
versions.
================================================
FILE: .github/ISSUE_TEMPLATE/01-crash_issue.md
================================================
---
name: Crash
about: Report a fatal crash that resulted in Olive unexpectedly closing.
title: '[CRASH] '
labels: 'Crash, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Steps to Reproduce**
1.
2.
3.
<details><summary><strong>Crash Report</strong></summary><pre><code>
<!-- You should have received a crash report from Olive to paste here. -->
</code></pre></details>
**Additional Information**
================================================
FILE: .github/ISSUE_TEMPLATE/50-build_issue.md
================================================
---
name: Build/Packaging
about: >-
Report an issue related to compiling or packaging.
Note that we do not officially support custom build
configurations and may not address issues involving them.
title: '[BUILD] '
labels: 'Building/Packaging, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-cache_issue.md
================================================
---
name: Disk Cache
about: >-
Report an issue related to the disk cache system, including failure to cache,
frames being set to appear at the wrong time, disk space or memory usage
issues, etc.
title: '[CACHE] '
labels: 'Disk Cache, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-codec_issue.md
================================================
---
name: Codec
about: >-
Report an issue related to codec handling, including importing footage or any
footage usage issues while editing.
title: '[CODEC] '
labels: 'Codec, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-color_issue.md
================================================
---
name: Color Management
about: >-
Report an issue related to the management of pixels and color, including
inaccurate results, color inconsistencies, etc.
title: '[COLOR] '
labels: 'Color Management, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-editing_issue.md
================================================
---
name: Timeline/Editing
about: >-
Report an issue related to the overall editing experience, including usage of
the timeline, interchange, synchronization, multi-camera support, etc.
title: '[EDIT] '
labels: 'Timeline/Editing, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-export_issue.md
================================================
---
name: Export
about: >-
Report an issue related to exporting videos from Olive, including errors
while exporting, issues with the resulting video, etc.
title: '[EXPORT] '
labels: 'Export, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-node_issue.md
================================================
---
name: Node/Compositing
about: >-
Report an issue related to the node-based compositing system, including node graph
usability issues, issues working with node effects, issues with composited output, etc.
title: '[NODES] '
labels: 'Nodes/Compositing, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-playback_issue.md
================================================
---
name: Playback
about: >-
Report an issue related to the playback of video or audio, including laggy or
inconsistent playback, failure to playback, etc.
title: '[PLAYBACK] '
labels: 'Playback, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-project_issue.md
================================================
---
name: Project Management
about: >-
Report an issue related to project management, including working with and
organizing imported files.
title: '[PROJECT] '
labels: 'Project, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-renderer_issue.md
================================================
---
name: Renderer
about: >-
Report an issue related to rendering, including corrupted frames, incorrect
render results, unexpected black or white frames, etc.
title: '[RENDER] '
labels: 'Renderer, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/50-ui_issue.md
================================================
---
name: User Interface
about: >-
Report an issue related to general user interface usability, including
behavior issues, usability issues, look and feel, etc.
title: '[UI] '
labels: 'User Interface, Triage'
assignees: ''
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Community Support
url: https://discordapp.com/invite/4Ae9KZn
about: Join the Olive Discord server
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
---
name: Default issue template
labels: 'Triage'
---
<!-- ⚠ Do not delete this issue template! ⚠ -->
**Commit Hash** <!-- 8 character string of letters/numbers in title bar or Help > About dialog (e.g. 3ea173c9) -->
**Platform** <!-- e.g. Windows 10, Ubuntu 20.04 or macOS 10.15 -->
**Summary**
**Additional Information / Output**
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
branches:
- master
paths-ignore:
- '.github/ISSUE_TEMPLATE/**'
- '.github/FUNDING.yml'
- 'docker/**'
- 'CONTRIBUTING.md'
- 'README.md'
pull_request:
paths-ignore:
- '.github/ISSUE_TEMPLATE/**'
- '.github/FUNDING.yml'
- 'app/ts/*.ts'
- 'docker/**'
- 'CONTRIBUTING.md'
- 'README.md'
env:
DOWNLOAD_TOOL: curl -fLOSs --retry 2 --retry-delay 60
UPLOAD_TOOL: curl -X POST --retry 2 --retry-delay 60
CMAKE_ARGS: -DUSE_WERROR=ON -DBUILD_TESTS=ON
jobs:
linux:
strategy:
fail-fast: false
matrix:
include:
# Clang should catch any issues that GCC would also report
#- build-type: RelWithDebInfo
# cc-compiler: gcc
# cxx-compiler: g++
# compiler-name: GCC 9.3.1
# cmake-gen: Ninja
# os-name: Linux (CentOS 7)
- build-type: RelWithDebInfo
cc-compiler: clang
cxx-compiler: clang++
compiler-name: Clang 10.0.0
cmake-gen: Ninja
os-name: Linux (CentOS 7)
name: |
${{ matrix.os-name }}
<${{ matrix.compiler-name }},
${{ matrix.build-type }},
${{ matrix.cmake-gen }}>
runs-on: ubuntu-20.04
container:
image: olivevideoeditor/ci-olive:2022.3
steps:
- name: Install Node.js 16
run: |
$DOWNLOAD_TOOL https://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.xz
tar -xf node-v16.20.2-linux-x64.tar.xz
mkdir -p ${{ github.workspace }}
cp -a ./node-v16.20.2-linux-x64/bin/node ${{ github.workspace }}/node16
${{ github.workspace }}/node16 --version
- name: Checkout Source Code
env:
INPUT_SUBMODULES: 'true'
INPUT_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
mkdir checkout-v3
cd checkout-v3
$DOWNLOAD_TOOL https://raw.githubusercontent.com/actions/checkout/refs/tags/v3/dist/index.js
$DOWNLOAD_TOOL https://raw.githubusercontent.com/actions/checkout/refs/tags/v3/dist/problem-matcher.json
cd ..
${{ github.workspace }}/node16 ./checkout-v3/index.js
#uses: actions/checkout@v3
#with:
# submodules: true
- name: Generate Patreon List
env:
PATREON_KEY: ${{ secrets.PATREON_KEY }}
run: |
pip3 install requests
cd $GITHUB_WORKSPACE/app/dialog/about
python3 patreon.py
if: github.event_name == 'push'
continue-on-error: true
- name: Configure CMake
run: |
mkdir build
cd build
cmake .. -G "${{ matrix.cmake-gen }}" \
-DCMAKE_BUILD_TYPE="${{ matrix.build-type }}" \
-DCMAKE_C_COMPILER="${{ matrix.cc-compiler }}" \
-DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" \
$CMAKE_ARGS
- name: Build
working-directory: build
run: |
cmake --build .
- name: Test
working-directory: build
run: |
ctest -C ${{ matrix.build-type }} -V
- name: Create Package
id: package
working-directory: build
env:
ARCH: x86_64
run: |
# Create install tree
cmake --install app --prefix appdir/usr
# Inject custom AppRun (linuxdeployqt won't replace if it already exists)
cp $GITHUB_WORKSPACE/app/packaging/linux/AppRun appdir
# Process AppDir
/usr/local/linuxdeployqt-x86_64.AppImage \
appdir/usr/share/applications/org.olivevideoeditor.Olive.desktop \
-exclude-libs=libQt5Pdf.so,libQt5Qml.so,libQt5QmlModels.so,libQt5Quick.so,libQt5VirtualKeyboard.so \
-bundle-non-qt-libs \
-executable=appdir/usr/bin/crashpad_handler \
-executable=appdir/usr/bin/minidump_stackwalk \
-executable=appdir/usr/bin/olive-crashhandler \
--appimage-extract-and-run
# Dump Crashpad symbols
dump_syms appdir/usr/bin/olive-editor > olive-editor.sym
# HACK: For some reason, minidump_stackwalk reads identifier as all 0s
SYM_DIR=appdir/usr/share/olive-editor/symbols/olive-editor/000000000000000000000000000000000
mkdir -p "$SYM_DIR"
mv olive-editor.sym "$SYM_DIR"
# Package AppImage
$DOWNLOAD_TOOL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage
chmod +x appimagetool-x86_64.AppImage
VERSION=${GITHUB_SHA::8} ./appimagetool-x86_64.AppImage appdir --appimage-extract-and-run
# Set env variables
filename=$(echo Olive*.AppImage)
pkgname="${filename/x86_64/Linux-x86_64}"
mv "${filename}" "${pkgname}"
basename="${filename%.*}"
echo "pkgname=${pkgname}" >> $GITHUB_OUTPUT
echo "artifact=${basename/x86_64/Linux-x86_64-${{ matrix.cc-compiler }}}" >> $GITHUB_OUTPUT
- uses: Simran-B/actions-export-envs@v1.2.0
id: envs
- name: Upload Artifact to GitHub
env:
INPUT_NAME: '${{ steps.package.outputs.artifact }}'
INPUT_PATH: 'build/Olive*.AppImage'
INPUT_INCLUDE-HIDDEN-FILES: 'true'
INPUT_IF-NO-FILES-FOUND: error
INPUT_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ACTIONS_RUNTIME_TOKEN: ${{ steps.envs.outputs.ACTIONS_RUNTIME_TOKEN }}
ACTIONS_RUNTIME_URL: ${{ steps.envs.outputs.ACTIONS_RUNTIME_URL }}
run: |
mkdir upload-artifact-v3
cd upload-artifact-v3
$DOWNLOAD_TOOL https://raw.githubusercontent.com/actions/upload-artifact/refs/tags/v3/dist/index.js
cd ..
${{ github.workspace }}/node16 ./upload-artifact-v3/index.js
continue-on-error: true
#uses: actions/upload-artifact@v3
#with:
# name: ${{ steps.package.outputs.artifact }}
# path: build/Olive*.AppImage
windows:
strategy:
matrix:
include:
- build-type: RelWithDebInfo
compiler-name: MSVC 16.x
os-name: Windows
os-arch: x86_64
os: windows-2019
cmake-gen: Ninja
name: |
${{ matrix.os-name }}
<${{ matrix.compiler-name }},
${{ matrix.build-type }},
${{ matrix.cmake-gen }}>
runs-on: ${{ matrix.os }}
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
with:
submodules: true
show-progress: false
# HACK: Override CMake version to avoid an FFmpeg discovery problem
- name: Setup CMake
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.27.x'
- name: CMake version
run: cmake --version
- name: Automatically Generate Package Name
shell: bash
env:
PLATFORM: ${{ matrix.os-name }}
ARCH: ${{ matrix.os-arch }}
run: |
echo "PKGNAME=$(echo Olive-${GITHUB_SHA::8}-${PLATFORM}-${ARCH})" >> $GITHUB_ENV
- name: Create Build Folder
run: |
cmake -E make_directory ${{ runner.workspace }}/build
- name: Enable Developer Command Prompt (Windows)
uses: ilammy/msvc-dev-cmd@v1
- name: Acquire Dependencies
shell: bash
working-directory: ${{ runner.workspace }}
run: |
$DOWNLOAD_TOOL https://github.com/olive-editor/dependencies/releases/download/continuous/olive-dep-win32-Release.tar.gz
tar xzf olive-dep-win32-Release.tar.gz
echo "$(pwd -W)/install" >> $GITHUB_PATH
echo "$(pwd -W)/install/bin" >> $GITHUB_PATH
- name: Acquire Google Crashpad
shell: bash
working-directory: ${{ runner.workspace }}
run: |
$DOWNLOAD_TOOL https://github.com/olive-editor/crashpad/releases/download/continuous/crashpad-win32-RelWithDebInfo.tar.gz
tar xzf crashpad-win32-RelWithDebInfo.tar.gz
echo "$(pwd -W)/install" >> $GITHUB_PATH
echo "$(pwd -W)/install/bin" >> $GITHUB_PATH
echo "$(pwd -W)/install/crashpad" >> $GITHUB_PATH
- name: Generate Patreon List
shell: bash
env:
PATREON_KEY: ${{ secrets.PATREON_KEY }}
run: |
pip3 install requests
cd $GITHUB_WORKSPACE/app/dialog/about
python3 patreon.py
if: github.event_name == 'push'
continue-on-error: true
- name: Configure CMake
shell: bash
working-directory: ${{ runner.workspace }}/build
run: |
cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -G "${{ matrix.cmake-gen }}" \
$CMAKE_ARGS
- name: Build
working-directory: ${{ runner.workspace }}/build
shell: bash
run: |
cmake --build .
#- name: Test
# working-directory: ${{ runner.workspace }}/build
# shell: bash
# run: |
# ctest -C ${{ matrix.build-type }} -V
- name: Create Package
working-directory: ${{ runner.workspace }}/build
shell: bash
env:
ORIGINAL_WORKSPACE: ${{ runner.workspace }}
run: |
mkdir olive-editor
cp app/olive-editor.exe olive-editor
cp app/crashhandler/olive-crashhandler.exe olive-editor
cp app/olive-editor.pdb olive-editor
windeployqt --no-angle olive-editor/olive-crashhandler.exe
windeployqt --no-angle olive-editor/olive-editor.exe
cp $(cygpath $ORIGINAL_WORKSPACE)/install/bin/*.dll olive-editor
cp $(cygpath $ORIGINAL_WORKSPACE)/install/crashpad/out/Default/crashpad_handler.exe olive-editor
cp $(cygpath $ORIGINAL_WORKSPACE)/install/bin/minidump_stackwalk.exe olive-editor
- name: Export Crashpad symbols
working-directory: ${{ runner.workspace }}/build
shell: bash
run: |
curl -fLSs https://github.com/google/breakpad/blob/master/src/tools/windows/binaries/dump_syms.exe?raw=true > dump_syms.exe
./dump_syms app/olive-editor.pdb > olive-editor.sym
SYM_HEADER=($(head -n 1 olive-editor.sym)) # Read first line of symbol file
SYM_DIR=olive-editor/symbols/olive-editor.pdb/${SYM_HEADER[3]}
mkdir -p "$SYM_DIR"
mv olive-editor.sym "$SYM_DIR"
- name: Deploy Packages
working-directory: ${{ runner.workspace }}/build
shell: bash
run: |
# Create Installer Executable
#$DOWNLOAD_TOOL http://web.archive.org/web/20210226132532/http://download.microsoft.com/download/3/2/2/3224B87F-CFA0-4E70-BDA3-3DE650EFEBA5/vcredist_x64.exe
cp $(cygpath $GITHUB_WORKSPACE)/app/packaging/windows/nsis/* .
cp $(cygpath $GITHUB_WORKSPACE)/LICENSE .
$DOWNLOAD_TOOL https://nsis.sourceforge.io/mediawiki/images/6/68/ShellExecAsUser_amd64-Unicode.7z
7z e ShellExecAsUser_amd64-Unicode.7z Plugins/x86-unicode/ShellExecAsUser.dll
makensis -V4 -DX64 "-XOutFile $PKGNAME.exe" "-X!AddPluginDir /x86-unicode $(pwd -W)" olive.nsi
# Create Portable ZIP
echo -n > olive-editor/portable
mkdir deploy
mv olive-editor deploy
- name: Upload Installer Artifact to GitHub
uses: actions/upload-artifact@v3
with:
name: ${{ env.PKGNAME }}-Installer
path: ${{ runner.workspace }}/build/${{ env.PKGNAME }}.exe
- name: Upload Portable Artifact to GitHub
uses: actions/upload-artifact@v3
with:
name: ${{ env.PKGNAME }}-Portable
path: ${{ runner.workspace }}/build/deploy
macos:
strategy:
fail-fast: false
matrix:
include:
- build-type: RelWithDebInfo
compiler-name: Clang LLVM
os-name: macOS
os-arch: x86_64
os: macos-13
cmake-gen: Ninja
min-deploy: 10.13
- build-type: RelWithDebInfo
compiler-name: Clang LLVM
os-name: macOS
os-arch: arm64
os: macos-13
cmake-gen: Ninja
min-deploy: 11.0
env:
DEP_LOCATION: /opt/olive-editor
name: |
${{ matrix.os-name }}
<${{ matrix.os-arch }},
${{ matrix.compiler-name }},
${{ matrix.build-type }},
${{ matrix.cmake-gen }}>
runs-on: ${{ matrix.os }}
steps:
- name: Checkout Source Code
uses: actions/checkout@v4
with:
submodules: true
show-progress: false
- name: Automatically Generate Package Name
shell: bash
env:
PLATFORM: ${{ matrix.os-name }}
ARCH: ${{ matrix.os-arch }}
run: |
echo "PKGNAME=$(echo Olive-${GITHUB_SHA::8}-${PLATFORM}-${ARCH})" >> $GITHUB_ENV
- name: Create Build Folder
run: |
cmake -E make_directory ${{ runner.workspace }}/build
- name: Acquire Dependencies
shell: bash
working-directory: ${{ runner.workspace }}
run: |
$DOWNLOAD_TOOL https://github.com/olive-editor/dependencies/releases/download/continuous/olive-dep-mac-${{ matrix.os-arch }}.tar.gz
sudo tar xzf olive-dep-mac-${{ matrix.os-arch }}.tar.gz -C /
- name: Acquire Google Crashpad
shell: bash
working-directory: ${{ runner.workspace }}
run: |
$DOWNLOAD_TOOL https://github.com/olive-editor/crashpad/releases/download/continuous/crashpad-mac-${{ matrix.os-arch }}.tar.gz
sudo tar xzf crashpad-mac-${{ matrix.os-arch }}.tar.gz -C /
- name: Generate Patreon List
env:
PATREON_KEY: ${{ secrets.PATREON_KEY }}
run: |
pip3 install requests
cd $GITHUB_WORKSPACE/app/dialog/about
python3 patreon.py
if: github.event_name == 'push'
continue-on-error: true
- name: Install Ninja
shell: bash
run: |
brew update
brew install ninja
- name: Configure CMake
shell: bash
working-directory: ${{ runner.workspace }}/build
run: |
PATH=$DEP_LOCATION:$DEP_LOCATION/bin:$DEP_LOCATION/include:$DEP_LOCATION/lib:$DEP_LOCATION/crashpad:$PATH \
cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${{ matrix.min-deploy }} -G "${{ matrix.cmake-gen }}" \
-DCMAKE_OSX_ARCHITECTURES="${{ matrix.os-arch }}" \
$CMAKE_ARGS
- name: Build
working-directory: ${{ runner.workspace }}/build
shell: bash
run: |
cmake --build .
- name: Test
working-directory: ${{ runner.workspace }}/build
shell: bash
run: |
ctest -C ${{ matrix.build-type }} -V
if: matrix.os-arch == 'x86_64' # ARM64 tests naturally won't be able to run on x86_64 runners
- name: Bundle Application
working-directory: ${{ runner.workspace }}/build
shell: bash
run: |
BUNDLE_NAME="Olive.app"
brew install dylibbundler
mkdir deploy-${{ matrix.os-arch }}
cd deploy-${{ matrix.os-arch }}
mv ../app/$BUNDLE_NAME .
mkdir $BUNDLE_NAME/Contents/Frameworks
# Copy Qt frameworks and plugins
cp -Ra $DEP_LOCATION/lib/Qt*.framework $BUNDLE_NAME/Contents/Frameworks
cp -Ra $DEP_LOCATION/plugins $BUNDLE_NAME/Contents
dylibbundler -b -ns -x "$BUNDLE_NAME/Contents/MacOS/Olive" -s "$DEP_LOCATION/lib" -d "$BUNDLE_NAME/Contents/Frameworks" -p "@executable_path/../Frameworks" \
-x $BUNDLE_NAME/Contents/MacOS/olive-crashhandler -x $BUNDLE_NAME/Contents/Frameworks/QtNetwork.framework/Versions/5/QtNetwork
# HACK: On x86_64, dylibbundler doesn't resolve this symlink. Weirdly it does on ARM64,
# but perhaps I'll bring it up with them soon.
cp -a $BUNDLE_NAME/Contents/Frameworks/libpng16.16.37.0.dylib $BUNDLE_NAME/Contents/Frameworks/libpng16.16.dylib
# Crashpad symbols
$DEP_LOCATION/bin/dump_syms $BUNDLE_NAME/Contents/MacOS/Olive > Olive.sym
SYM_HEADER=($(head -n 1 Olive.sym)) # Read first line of symbol file
SYM_DIR=$BUNDLE_NAME/Contents/Resources/symbols/Olive/${SYM_HEADER[3]}
mkdir -p "$SYM_DIR"
mv Olive.sym "$SYM_DIR"
- name: Sign Application
working-directory: ${{ runner.workspace }}/build/deploy-${{ matrix.os-arch }}
shell: bash
if: github.event_name == 'push'
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
BUNDLE_NAME="Olive.app"
# Install certificate
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
# import certificate from secrets
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode > $CERTIFICATE_PATH
# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
# import certificate to keychain
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
# HACK: Remove unsignable frameworks
rm -r $BUNDLE_NAME/Contents/Frameworks/QtUiPlugin.framework
if [ "${{ matrix.os-arch }}" == "arm64" ]
then
rm -r $BUNDLE_NAME/Contents/Frameworks/QtZlib.framework
fi
# Sign application
codesign --deep --sign "Developer ID Application: Olive Studios LLC" $BUNDLE_NAME
- name: Deploy
shell: bash
working-directory: ${{ runner.workspace }}/build/deploy-${{ matrix.os-arch }}
run: |
ln -s /Applications Applications
cd ..
hdiutil create img-${{ matrix.os-arch }}.dmg -volname Olive -fs HFS+ -srcfolder deploy-${{ matrix.os-arch }}
hdiutil convert img-${{ matrix.os-arch }}.dmg -format UDZO -o $PKGNAME.dmg
- name: Upload Artifact to GitHub
uses: actions/upload-artifact@v3
continue-on-error: true
with:
name: ${{ env.PKGNAME }}
path: ${{ runner.workspace }}/build/${{ env.PKGNAME }}.dmg
================================================
FILE: .gitignore
================================================
# CMake artifacts
/build*/
# Doxygen
/docs/
# Visual Studio (Code)
.localhistory/
.history/
.vscode/
.vs/
/out/
CmakeSettings.json
*.code-workspace
# clangd's index and likely other things that need not be in the repository
.cache/
# macOS General
.DS_Store
.AppleDouble
.LSOverride
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Windows folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares (Windows)
$RECYCLE.BIN/
# Windows shortcuts
*.lnk
#
# Qt ignores taken from https://github.com/github/gitignore/blob/master/Qt.gitignore
#
# C++ objects and libs
*.slo
*.lo
*.o
*.a
*.la
*.lai
*.so
*.so.*
*.dll
*.dylib
# Qt-es
object_script.*.Release
object_script.*.Debug
*_plugin_import.cpp
/.qmake.cache
/.qmake.stash
*.pro.user
*.pro.user.*
*.qbs.user
*.qbs.user.*
*.moc
moc_*.cpp
moc_*.h
qrc_*.cpp
ui_*.h
*.qmlc
*.jsc
Makefile*
*build-*
*.qm
*.prl
# Qt unit tests
target_wrapper.*
# QtCreator
*.autosave
# QtCreator Qml
*.qmlproject.user
*.qmlproject.user.*
# QtCreator CMake
CMakeLists.txt.user*
# QtCreator 4.8< compilation database
compile_commands.json
# Hand-written compilation database listing compilation flags for clangd to use when parsing the code, similarly to the compilation database above
# https://clangd.llvm.org/design/compile-commands#where-do-compile-commands-come-from
compile_flags.txt
# QtCreator local machine specific files for imported projects
*creator.user*
*_qmlcache.qrc
================================================
FILE: .gitmodules
================================================
[submodule "ext/core"]
path = ext/core
url = https://github.com/olive-editor/core
[submodule "ext/KDDockWidgets"]
path = ext/KDDockWidgets
url = https://github.com/olive-editor/KDDockWidgets.git
================================================
FILE: CMakeLists.txt
================================================
# Olive - Non-Linear Video Editor
# Copyright (C) 2023 Olive Studios LLC
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(olive-editor VERSION 0.2.0 LANGUAGES CXX)
option(BUILD_QT6 "Build with Qt 6 over 5 (experimental)" OFF)
option(BUILD_DOXYGEN "Build Doxygen documentation" OFF)
option(BUILD_TESTS "Build unit tests" OFF)
option(USE_WERROR "Error on compile warning" OFF)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
# Generates a compile_commands.json in the build dir, link that to the repo
# root to enrich your IDE with clangd language server protocol functionalities
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Sanitizers
add_library(olive-sanitizers INTERFACE)
include(cmake/Sanitizers.cmake)
enable_sanitizers(olive-sanitizers)
list(APPEND OLIVE_LIBRARIES olive-sanitizers)
# Set compiler options
if(MSVC)
set(OLIVE_COMPILE_OPTIONS
/wd4267
/wd4244
/experimental:external
/external:anglebrackets
/external:W0
"$<$<CONFIG:RELEASE>:/O2>"
"$<$<COMPILE_LANGUAGE:CXX>:/MP>"
)
if (USE_WERROR)
list(APPEND OLIVE_COMPILE_OPTIONS "/WX")
endif()
else()
set(OLIVE_COMPILE_OPTIONS
"$<$<CONFIG:RELEASE>:-O2>"
-Wuninitialized
-pedantic-errors
-Wall
-Wextra
-Wno-unused-parameter
-Wshadow
)
if (USE_WERROR)
list(APPEND OLIVE_COMPILE_OPTIONS "-Werror")
endif()
endif()
set(OLIVE_DEFINITIONS -DQT_DEPRECATED_WARNINGS)
if (WIN32)
list(APPEND OLIVE_DEFINITIONS -DUNICODE -D_UNICODE)
endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
# Link OpenGL
if(UNIX AND NOT APPLE AND NOT DEFINED OpenGL_GL_PREFERENCE)
set(OpenGL_GL_PREFERENCE LEGACY)
endif()
find_package(OpenGL REQUIRED)
list(APPEND OLIVE_LIBRARIES OpenGL::GL)
# Link OpenColorIO
find_package(OpenColorIO 2.1.1 REQUIRED)
list(APPEND OLIVE_LIBRARIES ${OCIO_LIBRARIES})
list(APPEND OLIVE_INCLUDE_DIRS ${OCIO_INCLUDE_DIRS})
# Link OpenImageIO
find_package(OpenImageIO 2.1.12 REQUIRED)
list(APPEND OLIVE_LIBRARIES ${OIIO_LIBRARIES})
list(APPEND OLIVE_INCLUDE_DIRS ${OIIO_INCLUDE_DIRS})
# Link OpenEXR
find_package(OpenEXR REQUIRED)
list(APPEND OLIVE_LIBRARIES ${OPENEXR_LIBRARIES})
list(APPEND OLIVE_INCLUDE_DIRS ${OPENEXR_INCLUDES})
# Link Olive
list(APPEND OLIVE_LIBRARIES olivecore)
list(APPEND OLIVE_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/ext/core/include)
# Link Qt
set(QT_LIBRARIES
Core
Gui
Widgets
OpenGL
LinguistTools
Concurrent
)
if (UNIX AND NOT APPLE)
list(APPEND QT_LIBRARIES DBus)
endif()
if (BUILD_QT6)
set(QT_NAME Qt6)
else()
set(QT_NAME Qt5)
endif()
find_package(QT
NAMES
${QT_NAME}
REQUIRED
COMPONENTS
${QT_LIBRARIES}
OPTIONAL_COMPONENTS
Network
)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED
COMPONENTS
${QT_LIBRARIES}
OPTIONAL_COMPONENTS
Network
)
if (NOT Qt${QT_VERSION_MAJOR}Network_FOUND)
message(" Qt${QT_VERSION_MAJOR}::Network module not found, crash reporting will be disabled.")
endif()
list(APPEND OLIVE_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::OpenGL
Qt${QT_VERSION_MAJOR}::Concurrent
)
if (${QT_VERSION_MAJOR} EQUAL "6")
find_package(Qt${QT_VERSION_MAJOR}
REQUIRED
OpenGLWidgets
)
list(APPEND OLIVE_LIBRARIES
Qt${QT_VERSION_MAJOR}::OpenGLWidgets
)
# Link KDDockWidgets
#find_package(KDDockWidgets-qt6 CONFIG REQUIRED)
else()
# Link KDDockWidgets
#find_package(KDDockWidgets CONFIG REQUIRED)
endif()
list(APPEND OLIVE_LIBRARIES
KDAB::kddockwidgets
)
# Link FFmpeg
find_package(FFMPEG 3.0 REQUIRED
COMPONENTS
avutil
avcodec
avformat
avfilter
swscale
swresample
)
list(APPEND OLIVE_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS})
list(APPEND OLIVE_LIBRARIES
FFMPEG::avutil
FFMPEG::avcodec
FFMPEG::avformat
FFMPEG::avfilter
FFMPEG::swscale
FFMPEG::swresample
)
# Link PortAudio
find_package(PortAudio REQUIRED)
set(CMAKE_REQUIRED_INCLUDES ${PORTAUDIO_INCLUDE_DIRS})
include(CheckIncludeFileCXX)
check_include_file_cxx( "pa_jack.h" PA_HAS_JACK)
if (PA_HAS_JACK)
list(APPEND OLIVE_DEFINITIONS PA_HAS_JACK)
endif()
list(APPEND OLIVE_INCLUDE_DIRS ${PORTAUDIO_INCLUDE_DIRS})
list(APPEND OLIVE_LIBRARIES ${PORTAUDIO_LIBRARIES})
# Optional: Link OpenTimelineIO
find_package(OpenTimelineIO)
if (OpenTimelineIO_FOUND)
list(APPEND OLIVE_DEFINITIONS USE_OTIO)
list(APPEND OLIVE_INCLUDE_DIRS ${OTIO_INCLUDE_DIRS})
list(APPEND OLIVE_LIBRARIES ${OTIO_LIBRARIES})
else()
message(" OpenTimelineIO interchange will be disabled.")
endif()
# Optional: Link Google Crashpad
find_package(GoogleCrashpad)
if (GoogleCrashpad_FOUND)
list(APPEND OLIVE_DEFINITIONS USE_CRASHPAD)
list(APPEND OLIVE_INCLUDE_DIRS ${CRASHPAD_INCLUDE_DIRS})
list(APPEND OLIVE_LIBRARIES ${CRASHPAD_LIBRARIES})
else()
message(" Automatic crash reporting will be disabled.")
if (APPLE)
# Enables use of special functions for slider dragging, only linked if Crashpad isn't found
# because Crashpad links it itself and will cause duplicate references if we also link it
list(APPEND OLIVE_LIBRARIES "-framework ApplicationServices")
endif()
endif()
if (WIN32)
list(APPEND OLIVE_DEFINITIONS "-DUNICODE -D_UNICODE")
elseif (APPLE)
list(APPEND OLIVE_LIBRARIES "-framework IOKit")
elseif(UNIX)
list(APPEND OLIVE_LIBRARIES Qt${QT_VERSION_MAJOR}::DBus)
endif()
# Generate Git hash
set(PROJECT_LONG_VERSION ${PROJECT_VERSION})
if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
find_package(Git)
if(GIT_FOUND)
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short=8 HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(PROJECT_LONG_VERSION ${PROJECT_VERSION}-${GIT_HASH})
endif()
endif()
# Optional: Find Doxygen if requested
if(BUILD_DOXYGEN)
find_package(Doxygen)
endif()
set(CMAKE_INCLUDE_CURRENT_DIR ON)
list(APPEND OLIVE_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/ext)
add_subdirectory(ext)
add_subdirectory(app)
if (BUILD_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Olive
Thank you for your interest in contributing to Olive!
## Reporting issues
Bug reports help to make the software more stable and usable.
Please read the pinned [issue #1175](https://github.com/olive-editor/olive/issues/1175)
for guidelines before you create a new issue.
## Writing code
Code contributions are welcome. Note that the code base is rapidly changing in
the current stage of development however. There is some documentation in the form
of code comments, including Javadoc in header files. Feel free to reach out via
an issue or pull request if you have questions about the architecture or
implementation details.
### Code Standards
In order to keep the code as readable and maintainable as possible, code
submitted should abide by the following standards:
* The code style generally follows the
[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)
including, but not limited to:
* Indentation is 2 spaces wide, spaces only (no tabs)
* `lowercase_underscored_variable_names`
* `lowercase_underscored_functions()` or `SentenceCaseFunctions()`
* `class SentenceCaseClassesAndStructs {}`
* `kSentenceCaseConstants` prepended with a lowercase `k`
* `UPPERCASE_UNDERSCORED_MACROS` for variables or same style as functions for macro functions
* `class_member_variables_` end with a `_`
* 100 column limit (where it doesn't impair readability)
* Unix line endings (only LF no CRLF)
* Javadoc documentation where appropriate
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# Olive Video Editor [](https://github.com/olive-editor/olive/actions?query=branch%3Amaster)
Olive is a free non-linear video editor for Windows, macOS, and Linux.

**Discover more:** [Website](https://www.olivevideoeditor.org/) | [Binaries](https://olivevideoeditor.org/download) | [Patreon](https://www.patreon.com/olivevideoeditor) | [Wiki](https://github.com/olive-editor/olive/wiki/Overview-Guide) | [Community Discord (Unofficial)](https://discord.gg/4Ae9KZn)
**NOTE: Olive is alpha software and is considered highly unstable. While we highly appreciate users testing and providing usage information, please use at your own risk.**
## Binaries
- [0.1.0 alpha](https://github.com/olive-editor/olive/releases/tag/0.1.0)
- [0.2.0 unstable development build](https://github.com/olive-editor/olive/releases/tag/0.2.0-nightly)
## Support Olive
Please consider supporting Olive:
<a href="https://www.patreon.com/olivevideoeditor" title="Become a Patron">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/f6fda794-a64f-46a7-86bd-9631207bf071" width="200" height="63">
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/646de54d-1451-4873-b6b2-c63790a4671a" width="200" height="63">
<img alt="The Patreon logo" src="https://github.com/user-attachments/assets/2bcca96f-8462-4904-b879-f64b42e07567" width="200" height="63">
</picture>
</a>
## Compiling from Source:
Compiling instructions for Windows, macOS, and Linux can be found [on the main site](https://olivevideoeditor.org/compile).
================================================
FILE: app/CMakeLists.txt
================================================
# Olive - Non-Linear Video Editor
# Copyright (C) 2022 Olive Team
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Set Olive sources and resources
set(OLIVE_SOURCES
core.h
core.cpp
)
#set(OLIVE_RESOURCES)
# Add subdirectories, which will populate the above variables
add_subdirectory(audio)
add_subdirectory(cli)
add_subdirectory(codec)
add_subdirectory(common)
add_subdirectory(config)
add_subdirectory(dialog)
add_subdirectory(node)
add_subdirectory(packaging)
add_subdirectory(panel)
add_subdirectory(render)
add_subdirectory(shaders)
add_subdirectory(task)
add_subdirectory(timeline)
add_subdirectory(ts)
add_subdirectory(tool)
add_subdirectory(ui)
add_subdirectory(undo)
add_subdirectory(widget)
add_subdirectory(window)
# Add translations
qt_add_translation(OLIVE_QM_FILES ${OLIVE_TS_FILES})
set(QRC_BODY "")
foreach(QM_FILE ${OLIVE_QM_FILES})
get_filename_component(QM_FILENAME_COMPONENT ${QM_FILE} NAME_WE)
string(APPEND QRC_BODY "<file alias=\"${QM_FILENAME_COMPONENT}\">${QM_FILE}</file>\n")
endforeach()
configure_file(ts/translations.qrc.in ts/translations.qrc @ONLY)
set(OLIVE_RESOURCES
${OLIVE_RESOURCES}
${CMAKE_CURRENT_BINARY_DIR}/ts/translations.qrc
)
# Add version object
add_library(olive-version-obj
OBJECT
version.cpp
version.h
)
target_link_libraries(olive-version-obj PRIVATE Qt${QT_VERSION_MAJOR}::Core)
target_compile_options(olive-version-obj PRIVATE -DAPPVERSION="${PROJECT_VERSION}" -DAPPVERSIONLONG="${PROJECT_LONG_VERSION}" )
# Add main library
add_library(libolive-editor
OBJECT
${OLIVE_SOURCES}
${OLIVE_RESOURCES}
)
# Remove prefix - prevents CMake calling it "liblibolive-editor"
set_target_properties(libolive-editor PROPERTIES PREFIX "")
# Add application
add_executable(olive-editor
main.cpp
$<TARGET_OBJECTS:libolive-editor>
$<TARGET_OBJECTS:olive-version-obj>
)
# Create docs if doxygen was found
if(DOXYGEN_FOUND)
set(DOXYGEN_PROJECT_NAME "Olive")
set(DOXYGEN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/docs")
set(DOXYGEN_EXTRACT_ALL "YES")
set(DOXYGEN_EXTRACT_PRIVATE "YES")
doxygen_add_docs(docs ALL ${OLIVE_SOURCES})
endif()
# Platform-specific deployment preferences
if (WIN32)
# Set Windows application icon
target_sources(olive-editor PRIVATE packaging/windows/resources.rc)
# Preserve folder structure in visual studio
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${OLIVE_SOURCES})
elseif(APPLE)
# Set Mac application icon
set(OLIVE_ICON packaging/macos/olive.icns)
target_sources(olive-editor PRIVATE ${OLIVE_ICON})
# Set Mac bundle properties
set_target_properties(olive-editor PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/packaging/macos/MacOSXBundleInfo.plist.in
MACOSX_BUNDLE_GUI_IDENTIFIER org.olivevideoeditor.Olive
MACOSX_BUNDLE_ICON_FILE olive.icns
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION}
MACOSX_BUNDLE_BUNDLE_NAME "Olive"
MACOSX_BUNDLE_INFO_STRING "Olive ${PROJECT_LONG_VERSION}"
MACOSX_BUNDLE_COPYRIGHT "©2018-2021 Olive Studios LLC and others. Published under the GNU General Public License version 3.0."
RESOURCE "${OLIVE_ICON}"
OUTPUT_NAME "Olive"
)
elseif(UNIX)
# Set Linux-specific properties for application
install(TARGETS olive-editor RUNTIME DESTINATION bin)
endif()
# Set link libraries
target_link_libraries(olive-editor PRIVATE ${OLIVE_LIBRARIES})
target_link_libraries(libolive-editor PRIVATE ${OLIVE_LIBRARIES})
# Set compile options
target_compile_options(olive-editor PRIVATE ${OLIVE_COMPILE_OPTIONS})
target_compile_options(libolive-editor PRIVATE ${OLIVE_COMPILE_OPTIONS})
# Set global definitions
target_compile_definitions(olive-editor PRIVATE ${OLIVE_DEFINITIONS})
target_compile_definitions(libolive-editor PRIVATE ${OLIVE_DEFINITIONS})
# Set include dirs
target_include_directories(olive-editor PRIVATE ${OLIVE_INCLUDE_DIRS})
target_include_directories(libolive-editor PRIVATE ${OLIVE_INCLUDE_DIRS})
# Add crash handler
if (GoogleCrashpad_FOUND AND Qt${QT_VERSION_MAJOR}Network_FOUND)
add_subdirectory(crashhandler)
endif()
================================================
FILE: app/audio/CMakeLists.txt
================================================
# Olive - Non-Linear Video Editor
# Copyright (C) 2022 Olive Team
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set(OLIVE_SOURCES
${OLIVE_SOURCES}
audio/audiomanager.cpp
audio/audiomanager.h
audio/audioprocessor.cpp
audio/audioprocessor.h
audio/audiovisualwaveform.cpp
audio/audiovisualwaveform.h
PARENT_SCOPE
)
================================================
FILE: app/audio/audiomanager.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "audiomanager.h"
#ifdef PA_HAS_JACK
#include <pa_jack.h>
#endif
#include <QApplication>
#include "config/config.h"
namespace olive {
AudioManager* AudioManager::instance_ = nullptr;
void AudioManager::CreateInstance()
{
if (instance_ == nullptr) {
instance_ = new AudioManager();
}
}
void AudioManager::DestroyInstance()
{
delete instance_;
instance_ = nullptr;
}
AudioManager *AudioManager::instance()
{
return instance_;
}
void AudioManager::SetOutputNotifyInterval(int n)
{
output_buffer_->set_notify_interval(n);
}
int OutputCallback(const void *input, void *output, unsigned long frameCount, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
{
PreviewAudioDevice *device = static_cast<PreviewAudioDevice*>(userData);
qint64 max_read = frameCount * device->bytes_per_frame();
qint64 read_count = device->read(reinterpret_cast<char*>(output), max_read);
if (read_count < max_read) {
memset(reinterpret_cast<uint8_t*>(output) + read_count, 0, max_read - read_count);
}
return paContinue;
}
int InputCallback(const void *input, void *output, unsigned long frameCount, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
{
FFmpegEncoder *f = static_cast<FFmpegEncoder*>(userData);
AudioParams our_params = f->params().audio_params();
our_params.set_format(f->params().audio_params().format().to_packed_equivalent());
f->WriteAudioData(our_params, reinterpret_cast<const uint8_t**>(&input), frameCount);
return paContinue;
}
bool AudioManager::PushToOutput(const AudioParams ¶ms, const QByteArray &samples, QString *error)
{
if (output_device_ == paNoDevice) {
if (error) *error = tr("No output device is set");
return false;
}
if (output_params_ != params || output_stream_ == nullptr) {
output_params_ = params;
CloseOutputStream();
PaStreamParameters p = GetPortAudioParams(params, output_device_);
PaError r = Pa_OpenStream(&output_stream_, nullptr, &p, output_params_.sample_rate(), paFramesPerBufferUnspecified, paNoFlag, OutputCallback, output_buffer_);
if (r != paNoError) {
// Unhandled error
//qCritical() << "Failed to open output stream:" << Pa_GetErrorText(r);
if (error) *error = Pa_GetErrorText(r);
return false;
}
output_buffer_->set_bytes_per_frame(output_params_.samples_to_bytes(1));
}
output_buffer_->write(samples);
if (!Pa_IsStreamActive(output_stream_)) {
Pa_StartStream(output_stream_);
}
return true;
}
void AudioManager::ClearBufferedOutput()
{
output_buffer_->clear();
}
PaSampleFormat AudioManager::GetPortAudioSampleFormat(SampleFormat fmt)
{
switch (fmt) {
case SampleFormat::U8:
case SampleFormat::U8P:
return paUInt8;
case SampleFormat::S16:
case SampleFormat::S16P:
return paInt16;
case SampleFormat::S32:
case SampleFormat::S32P:
return paInt32;
case SampleFormat::F32:
case SampleFormat::F32P:
return paFloat32;
case SampleFormat::S64:
case SampleFormat::S64P:
case SampleFormat::F64:
case SampleFormat::F64P:
case SampleFormat::INVALID:
case SampleFormat::COUNT:
break;
}
return 0;
}
void AudioManager::CloseOutputStream()
{
if (output_stream_) {
if (Pa_IsStreamActive(output_stream_)) {
StopOutput();
}
Pa_CloseStream(output_stream_);
output_stream_ = nullptr;
}
}
void AudioManager::StopOutput()
{
// Abort the stream so playback stops immediately
if (output_stream_) {
Pa_AbortStream(output_stream_);
ClearBufferedOutput();
}
}
void AudioManager::SetOutputDevice(PaDeviceIndex device)
{
if (device == paNoDevice) {
qInfo() << "No output device found";
} else {
qInfo() << "Setting output audio device to" << Pa_GetDeviceInfo(device)->name;
}
output_device_ = device;
CloseOutputStream();
}
void AudioManager::SetInputDevice(PaDeviceIndex device)
{
if (device == paNoDevice) {
qInfo() << "No input device found";
} else {
qInfo() << "Setting input audio device to" << Pa_GetDeviceInfo(device)->name;
}
input_device_ = device;
}
void AudioManager::HardReset()
{
CloseOutputStream();
Pa_Terminate();
Pa_Initialize();
}
bool AudioManager::StartRecording(const EncodingParams ¶ms, QString *error_str)
{
if (input_device_ == paNoDevice) {
return false;
}
input_encoder_ = new FFmpegEncoder(params);
if (!input_encoder_->Open()) {
qCritical() << "Failed to open encoder for recording";
return false;
}
PaStreamParameters p = GetPortAudioParams(params.audio_params(), input_device_);
PaError r = Pa_OpenStream(&input_stream_, &p, nullptr, params.audio_params().sample_rate(), paFramesPerBufferUnspecified, paNoFlag, InputCallback, input_encoder_);
if (r == paNoError) {
//const PaStreamInfo* info = Pa_GetStreamInfo(input_stream_);
r = Pa_StartStream(input_stream_);
if (r == paNoError) {
return true;
}
}
if (error_str) {
*error_str = Pa_GetErrorText(r);
}
StopRecording();
return false;
}
void AudioManager::StopRecording()
{
if (input_stream_) {
if (Pa_IsStreamActive(input_stream_)) {
Pa_StopStream(input_stream_);
}
Pa_CloseStream(input_stream_);
input_stream_ = nullptr;
}
if (input_encoder_) {
input_encoder_->Close();
delete input_encoder_;
input_encoder_ = nullptr;
}
}
PaDeviceIndex AudioManager::FindConfigDeviceByName(bool is_output_device)
{
QString entry = is_output_device ? QStringLiteral("AudioOutput") : QStringLiteral("AudioInput");
return FindDeviceByName(OLIVE_CONFIG_STR(entry).toString(), is_output_device);
}
PaDeviceIndex AudioManager::FindDeviceByName(const QString &s, bool is_output_device)
{
if (!s.isEmpty()) {
for (PaDeviceIndex i=0, end=Pa_GetDeviceCount(); i<end; i++) {
const PaDeviceInfo *device = Pa_GetDeviceInfo(i);
if (((is_output_device && device->maxOutputChannels) || (!is_output_device && device->maxInputChannels))
&& !s.compare(device->name)) {
return i;
}
}
}
return is_output_device ? Pa_GetDefaultOutputDevice() : Pa_GetDefaultInputDevice();
}
PaStreamParameters AudioManager::GetPortAudioParams(const AudioParams ¶ms, PaDeviceIndex device)
{
PaStreamParameters p;
p.channelCount = params.channel_count();
p.device = device;
p.hostApiSpecificStreamInfo = nullptr;
p.sampleFormat = GetPortAudioSampleFormat(params.format());
p.suggestedLatency = Pa_GetDeviceInfo(device)->defaultLowOutputLatency;
return p;
}
AudioManager::AudioManager() :
output_stream_(nullptr),
input_stream_(nullptr),
input_encoder_(nullptr)
{
#ifdef PA_HAS_JACK
// PortAudio doesn't do a strcpy, so we need a const char that's readily accessible (i.e. not
// a QString converted to UTF-8)
PaJack_SetClientName("Olive");
#endif
Pa_Initialize();
// Get device from config
PaDeviceIndex output_device = FindConfigDeviceByName(true);
PaDeviceIndex input_device = FindConfigDeviceByName(false);
SetOutputDevice(output_device);
SetInputDevice(input_device);
output_buffer_ = new PreviewAudioDevice(this);
output_buffer_->open(PreviewAudioDevice::ReadWrite);
connect(output_buffer_, &PreviewAudioDevice::Notify, this, &AudioManager::OutputNotify);
}
AudioManager::~AudioManager()
{
CloseOutputStream();
Pa_Terminate();
}
}
================================================
FILE: app/audio/audiomanager.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef AUDIOMANAGER_H
#define AUDIOMANAGER_H
#include <memory>
#include <QtConcurrent/QtConcurrent>
#include <QThread>
#include <portaudio.h>
#include "audiovisualwaveform.h"
#include "audio/audioprocessor.h"
#include "common/define.h"
#include "codec/ffmpeg/ffmpegencoder.h"
#include "render/audioplaybackcache.h"
#include "render/previewaudiodevice.h"
namespace olive {
/**
* @brief Audio input and output management class
*
* Wraps around a QAudioOutput and AudioHybridDevice, connecting them together and exposing audio functionality to
* the rest of the system.
*/
class AudioManager : public QObject
{
Q_OBJECT
public:
static void CreateInstance();
static void DestroyInstance();
static AudioManager* instance();
void SetOutputNotifyInterval(int n);
bool PushToOutput(const AudioParams ¶ms, const QByteArray& samples, QString *error = nullptr);
void ClearBufferedOutput();
void StopOutput();
PaDeviceIndex GetOutputDevice() const
{
return output_device_;
}
PaDeviceIndex GetInputDevice() const
{
return input_device_;
}
void SetOutputDevice(PaDeviceIndex device);
void SetInputDevice(PaDeviceIndex device);
void HardReset();
bool StartRecording(const EncodingParams ¶ms, QString *error_str = nullptr);
void StopRecording();
static PaDeviceIndex FindConfigDeviceByName(bool is_output_device);
static PaDeviceIndex FindDeviceByName(const QString &s, bool is_output_device);
static PaStreamParameters GetPortAudioParams(const AudioParams &p, PaDeviceIndex device);
signals:
void OutputNotify();
void OutputParamsChanged();
private:
AudioManager();
virtual ~AudioManager() override;
static PaSampleFormat GetPortAudioSampleFormat(SampleFormat fmt);
void CloseOutputStream();
static AudioManager* instance_;
PaDeviceIndex output_device_;
PaStream *output_stream_;
AudioParams output_params_;
PreviewAudioDevice *output_buffer_;
PaDeviceIndex input_device_;
PaStream *input_stream_;
FFmpegEncoder *input_encoder_;
};
}
#endif // AUDIOMANAGER_H
================================================
FILE: app/audio/audioprocessor.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "audioprocessor.h"
extern "C" {
#include <libavfilter/buffersrc.h>
#include <libavfilter/buffersink.h>
}
#include <QDebug>
#include "common/ffmpegutils.h"
namespace olive {
AudioProcessor::AudioProcessor()
{
filter_graph_ = nullptr;
in_frame_ = nullptr;
out_frame_ = nullptr;
}
AudioProcessor::~AudioProcessor()
{
Close();
}
bool AudioProcessor::Open(const AudioParams &from, const AudioParams &to, double tempo)
{
if (filter_graph_) {
qWarning() << "Tried to open a processor that was already open";
return false;
}
filter_graph_ = avfilter_graph_alloc();
if (!filter_graph_) {
qCritical() << "Failed to allocate filter graph";
return false;
}
from_fmt_ = FFmpegUtils::GetFFmpegSampleFormat(from.format());
to_fmt_ = FFmpegUtils::GetFFmpegSampleFormat(to.format());
// Set up audio buffer args
char filter_args[200];
snprintf(filter_args, 200, "time_base=%d/%d:sample_rate=%d:sample_fmt=%d:channel_layout=0x%" PRIx64,
1,
from.sample_rate(),
from.sample_rate(),
from_fmt_,
from.channel_layout());
int r;
// Create buffersrc (input)
r = avfilter_graph_create_filter(&buffersrc_ctx_, avfilter_get_by_name("abuffer"), "in", filter_args, nullptr, filter_graph_);
if (r < 0) {
qCritical() << "Failed to create buffersrc:" << r;
Close();
return false;
}
// Store "previous" filter for linking
AVFilterContext *previous_filter = buffersrc_ctx_;
// Create tempo
bool create_tempo;
if ((create_tempo = !qFuzzyCompare(tempo, 1.0))) {
// Create audio tempo filters: FFmpeg's atempo can only be set between 0.5 and 2.0. If the requested speed is outside
// those boundaries, we need to daisychain more than one together.
double base = (tempo > 1.0) ? 2.0 : 0.5;
double speed_log = log(tempo) / log(base);
// This is the number of how many 0.5 or 2.0 tempos we need to daisychain
int whole = std::floor(speed_log);
// Set speed_log to the remainder
speed_log -= whole;
for (int i=0;i<=whole;i++) {
double filter_tempo = (i == whole) ? std::pow(base, speed_log) : base;
if (qFuzzyCompare(filter_tempo, 1.0)) {
// This filter would do nothing
continue;
}
previous_filter = CreateTempoFilter(filter_graph_,
previous_filter,
filter_tempo);
if (!previous_filter) {
qCritical() << "Failed to create audio tempo filter";
Close();
return false;
}
}
}
// Create conversion filter
if (from.sample_rate() != to.sample_rate() || from.channel_layout() != to.channel_layout() || from.format() != to.format()
|| (to.format().is_planar() && create_tempo)) { // Tempo processor automatically converts to packed,
// so if the desired output is planar, it'll need
// to be converted
snprintf(filter_args, 200, "sample_fmts=%s:sample_rates=%d:channel_layouts=0x%" PRIx64,
av_get_sample_fmt_name(to_fmt_),
to.sample_rate(),
to.channel_layout());
AVFilterContext *c;
r = avfilter_graph_create_filter(&c, avfilter_get_by_name("aformat"), "fmt", filter_args, nullptr, filter_graph_);
if (r < 0) {
qCritical() << "Failed to create format conversion filter:" << r << filter_args;
Close();
return false;
}
r = avfilter_link(previous_filter, 0, c, 0);
if (r < 0) {
qCritical() << "Failed to link filters:" << r;
Close();
return false;
}
previous_filter = c;
}
// Create buffersink (output)
r = avfilter_graph_create_filter(&buffersink_ctx_, avfilter_get_by_name("abuffersink"), "out", nullptr, nullptr, filter_graph_);
if (r < 0) {
qCritical() << "Failed to create buffersink:" << r;
Close();
return false;
}
r = avfilter_link(previous_filter, 0, buffersink_ctx_, 0);
if (r < 0) {
qCritical() << "Failed to link filters:" << r;
Close();
return false;
}
r = avfilter_graph_config(filter_graph_, nullptr);
if (r < 0) {
qCritical() << "Failed to configure graph:" << r;
Close();
return false;
}
in_frame_ = av_frame_alloc();
if (in_frame_) {
in_frame_->sample_rate = from.sample_rate();
in_frame_->format = from_fmt_;
in_frame_->channel_layout = from.channel_layout();
in_frame_->channels = from.channel_count();
in_frame_->pts = 0;
} else {
qCritical() << "Failed to allocate input frame";
Close();
return false;
}
out_frame_ = av_frame_alloc();
if (!out_frame_) {
qCritical() << "Failed to allocate output frame";
Close();
return false;
}
from_ = from;
to_ = to;
return true;
}
void AudioProcessor::Close()
{
if (filter_graph_) {
avfilter_graph_free(&filter_graph_);
filter_graph_ = nullptr;
buffersrc_ctx_ = nullptr;
buffersink_ctx_ = nullptr;
}
if (in_frame_) {
av_frame_free(&in_frame_);
in_frame_ = nullptr;
}
if (out_frame_) {
av_frame_free(&out_frame_);
out_frame_ = nullptr;
}
}
int AudioProcessor::Convert(float **in, int nb_in_samples, AudioProcessor::Buffer *output)
{
if (!IsOpen()) {
qCritical() << "Tried to convert on closed processor";
return -1;
}
int r = 0;
if (in && nb_in_samples) {
// Set frame parameters
in_frame_->nb_samples = nb_in_samples;
for (int i=0; i<from_.channel_count(); i++) {
in_frame_->data[i] = reinterpret_cast<uint8_t*>(in[i]);
in_frame_->linesize[i] = from_.samples_to_bytes(nb_in_samples);
}
r = av_buffersrc_add_frame_flags(buffersrc_ctx_, in_frame_, AV_BUFFERSRC_FLAG_KEEP_REF);
if (r < 0) {
qCritical() << "Failed to add frame to buffersrc:" << r;
return r;
}
}
if (output) {
int nb_channels = to_.channel_count();
if (to_.format().is_packed()) {
nb_channels = 1;
}
AudioProcessor::Buffer &result = *output;
result.resize(nb_channels);
int byte_offset = 0;
while (true) {
av_frame_unref(out_frame_);
r = av_buffersink_get_frame(buffersink_ctx_, out_frame_);
if (r < 0) {
if (r == AVERROR(EAGAIN)) {
r = 0;
} else {
// Handle unexpected error
qCritical() << "Failed to pull from buffersink:" << r;
}
break;
}
int nb_bytes = out_frame_->nb_samples * to_.bytes_per_sample_per_channel();
if (to_.format().is_packed()) {
nb_bytes *= to_.channel_count();
}
for (int i=0; i<nb_channels; i++) {
result[i].resize(byte_offset + nb_bytes);
memcpy(result[i].data() + byte_offset, out_frame_->data[i], nb_bytes);
}
byte_offset += nb_bytes;
}
av_frame_unref(out_frame_);
}
return r;
}
void AudioProcessor::Flush()
{
int r = av_buffersrc_add_frame_flags(buffersrc_ctx_, nullptr, AV_BUFFERSRC_FLAG_KEEP_REF);
if (r < 0) {
qCritical() << "Failed to flush:" << r;
}
}
AVFilterContext *AudioProcessor::CreateTempoFilter(AVFilterGraph* graph, AVFilterContext* link, const double &tempo)
{
// Set up tempo param, which is taken as a C string
char speed_param[20];
snprintf(speed_param, 20, "%f", tempo);
AVFilterContext* tempo_ctx = nullptr;
if (avfilter_graph_create_filter(&tempo_ctx, avfilter_get_by_name("atempo"), "atempo", speed_param, nullptr, graph) >= 0
&& avfilter_link(link, 0, tempo_ctx, 0) == 0) {
return tempo_ctx;
}
return nullptr;
}
}
================================================
FILE: app/audio/audioprocessor.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef AUDIOPROCESSOR_H
#define AUDIOPROCESSOR_H
#include <inttypes.h>
#include <olive/core/core.h>
#include <QByteArray>
extern "C" {
#include <libavfilter/avfilter.h>
}
#include "common/define.h"
namespace olive {
using namespace core;
class AudioProcessor
{
public:
AudioProcessor();
~AudioProcessor();
DISABLE_COPY_MOVE(AudioProcessor)
bool Open(const AudioParams &from, const AudioParams &to, double tempo = 1.0);
void Close();
bool IsOpen() const { return filter_graph_; }
using Buffer = QVector<QByteArray>;
int Convert(float **in, int nb_in_samples, AudioProcessor::Buffer *output);
void Flush();
const AudioParams &from() const { return from_; }
const AudioParams &to() const { return to_; }
private:
static AVFilterContext* CreateTempoFilter(AVFilterGraph *graph, AVFilterContext *link, const double& tempo);
AVFilterGraph* filter_graph_;
AVFilterContext* buffersrc_ctx_;
AVFilterContext* buffersink_ctx_;
AudioParams from_;
AVSampleFormat from_fmt_;
AudioParams to_;
AVSampleFormat to_fmt_;
AVFrame *in_frame_;
AVFrame *out_frame_;
};
}
#endif // AUDIOPROCESSOR_H
================================================
FILE: app/audio/audiovisualwaveform.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "audiovisualwaveform.h"
#include <QDebug>
#include <QtGlobal>
#include "config/config.h"
namespace olive {
const rational AudioVisualWaveform::kMinimumSampleRate = rational(1, 8);
const rational AudioVisualWaveform::kMaximumSampleRate = 1024;
AudioVisualWaveform::AudioVisualWaveform() :
channels_(0)
{
for (rational i=kMinimumSampleRate; i<=kMaximumSampleRate; i*=2) {
mipmapped_data_.insert({i, Sample()});
}
}
void AudioVisualWaveform::OverwriteSamplesFromBuffer(const SampleBuffer &samples, int sample_rate, const rational &start, double target_rate, Sample& data, size_t &start_index, size_t &samples_length)
{
start_index = time_to_samples(start, target_rate);
samples_length = time_to_samples(static_cast<double>(samples.sample_count()) / static_cast<double>(sample_rate), target_rate);
size_t end_index = start_index + samples_length;
if (data.size() < end_index) {
data.resize(end_index);
}
double chunk_size = double(sample_rate) / double(target_rate);
for (size_t i=0; i<samples_length; i+=channels_) {
size_t src_start = qRound((double(i) * chunk_size)) / channels_;
size_t src_end = qMin(size_t(qRound64((double(i + channels_) * chunk_size))) / channels_, samples.sample_count());
Sample summary = SumSamples(samples,
src_start,
src_end - src_start);
memcpy(&data.data()[i + start_index],
summary.data(),
summary.size() * sizeof(SamplePerChannel));
}
}
void AudioVisualWaveform::OverwriteSamplesFromMipmap(const AudioVisualWaveform::Sample &input, double input_sample_rate, size_t &input_start, size_t &input_length, const rational &start, double output_rate, AudioVisualWaveform::Sample &output_data)
{
size_t start_index = time_to_samples(start, output_rate);
size_t samples_length = time_to_samples(static_cast<double>(input_length / channels_) / input_sample_rate, output_rate);
size_t end_index = start_index + samples_length;
if (output_data.size() < end_index) {
output_data.resize(end_index);
}
// We guarantee mipmaps are powers of two so integer division should be perfectly accurate here
size_t chunk_size = input_sample_rate / output_rate;
for (size_t i=0; i<samples_length; i+=channels_) {
Sample summary = ReSumSamples(&input.data()[input_start + (i*chunk_size)], chunk_size * channels_, channels_);
memcpy(&output_data.data()[i + start_index],
summary.data(),
summary.size() * sizeof(SamplePerChannel));
}
input_start = start_index;
input_length = samples_length;
}
void AudioVisualWaveform::ValidateVirtualStart(const rational &new_start)
{
if (length_ == 0) {
virtual_start_ = new_start;
} else if (virtual_start_ > new_start) {
TrimIn(new_start - virtual_start_);
}
}
void AudioVisualWaveform::OverwriteSamples(const SampleBuffer &samples, int sample_rate, const rational &start)
{
if (!channels_) {
qWarning() << "Failed to write samples - channel count is zero";
return;
}
ValidateVirtualStart(start);
// Process the largest mipmap directly for the samples
auto current_mipmap = mipmapped_data_.rbegin();
size_t input_start, input_length;
OverwriteSamplesFromBuffer(samples, sample_rate, start - virtual_start_, current_mipmap->first.toDouble(), current_mipmap->second, input_start, input_length);
while (true) {
// For each smaller mipmap, we just process from the mipmap before it, making each one
// exponentially faster to create
auto previous_mipmap = current_mipmap;
current_mipmap++;
if (current_mipmap == mipmapped_data_.rend()) {
break;
}
OverwriteSamplesFromMipmap(previous_mipmap->second, previous_mipmap->first.toDouble(),
input_start, input_length, start - virtual_start_, current_mipmap->first.toDouble(),
current_mipmap->second);
}
rational sample_length(samples.sample_count(), sample_rate);
length_ = qMax(length_, start + sample_length);
}
void AudioVisualWaveform::OverwriteSums(const AudioVisualWaveform &sums, const rational &dest, const rational& offset, const rational& length)
{
ValidateVirtualStart(dest);
for (auto it=mipmapped_data_.begin(); it!=mipmapped_data_.end(); it++) {
rational rate = it->first;
Sample& our_arr = it->second;
const Sample& their_arr = sums.mipmapped_data_.at(rate);
double rate_dbl = rate.toDouble();
// Get our destination sample
size_t our_start_index = time_to_samples(dest - virtual_start_, rate_dbl);
// Get our source sample
size_t their_start_index = time_to_samples(offset, rate_dbl);
if (their_start_index >= their_arr.size()) {
continue;
}
// Determine how much we're copying
size_t copy_len = their_arr.size() - their_start_index;
if (!length.isNull()) {
copy_len = qMin(copy_len, time_to_samples(length, rate_dbl));
if (copy_len == 0) {
continue;
}
}
// Determine end index of our array
size_t end_index = our_start_index + copy_len;
if (our_arr.size() < end_index) {
our_arr.resize(end_index);
}
memcpy(reinterpret_cast<char*>(our_arr.data()) + our_start_index * sizeof(SamplePerChannel),
reinterpret_cast<const char*>(their_arr.data()) + their_start_index * sizeof(SamplePerChannel),
copy_len * sizeof(SamplePerChannel));
}
length_ = qMax(length_, dest + ((length.isNull()) ? sums.length() - offset : length));
}
void AudioVisualWaveform::OverwriteSilence(const rational &start, const rational &length)
{
ValidateVirtualStart(start);
for (auto it=mipmapped_data_.begin(); it!=mipmapped_data_.end(); it++) {
rational rate = it->first;
Sample& our_arr = it->second;
double rate_dbl = rate.toDouble();
// Get our destination sample
size_t our_start_index = time_to_samples(start - virtual_start_, rate_dbl);
size_t our_length_index = time_to_samples(length, rate_dbl);
size_t our_end_index = our_start_index + our_length_index;
if (our_arr.size() < our_end_index) {
our_arr.resize(our_end_index);
}
memset(reinterpret_cast<char*>(our_arr.data()) + our_start_index * sizeof(SamplePerChannel), 0, our_length_index * sizeof(SamplePerChannel));
}
length_ = qMax(length_, start + length);
}
void AudioVisualWaveform::TrimIn(rational length)
{
if (length == 0) {
return;
}
virtual_start_ += length;
bool negative = (length < 0);
if (negative) {
length = -length;
}
for (auto it=mipmapped_data_.begin(); it!=mipmapped_data_.end(); it++) {
rational rate = it->first;
double rate_dbl = rate.toDouble();
Sample& data = it->second;
size_t chop_length = time_to_samples(length, rate_dbl);
if (chop_length == 0) {
continue;
}
if (!negative) {
data = Sample(data.begin() + chop_length, data.end());
} else {
data.insert(data.begin(), chop_length, SamplePerChannel());
}
}
length_ = qMax(rational(0), length_ - length);
}
AudioVisualWaveform AudioVisualWaveform::Mid(const rational &offset) const
{
AudioVisualWaveform mid = *this;
mid.TrimIn(offset - virtual_start_);
return mid;
}
AudioVisualWaveform AudioVisualWaveform::Mid(const rational &offset, const rational &length) const
{
AudioVisualWaveform mid = *this;
mid.TrimRange(offset - virtual_start_, length);
return mid;
}
void AudioVisualWaveform::Resize(const rational &length)
{
if (length_ == length) {
return;
}
for (auto it=mipmapped_data_.begin(); it!=mipmapped_data_.end(); it++) {
rational rate = it->first;
double rate_dbl = rate.toDouble();
Sample& data = it->second;
size_t chop_length = time_to_samples(length, rate_dbl);
data.resize(chop_length);
}
length_ = length;
}
void AudioVisualWaveform::TrimRange(const rational &in, const rational &length)
{
TrimIn(in);
Resize(length);
}
AudioVisualWaveform::Sample AudioVisualWaveform::GetSummaryFromTime(const rational &start, const rational &length) const
{
// Find mipmap that requires
auto using_mipmap = GetMipmapForScale(length.flipped().toDouble());
double rate_dbl = using_mipmap->first.toDouble();
size_t start_sample = time_to_samples(start - virtual_start_, rate_dbl);
size_t sample_length = time_to_samples(length, rate_dbl);
const Sample &mipmap_data = using_mipmap->second;
// Determine if the array actually has this sample
sample_length = qMin(sample_length, mipmap_data.size() - start_sample);
// Based on the above `min`, if sample length <= 0, that means start_sample >= the size of the
// array and nothing can be returned.
if (sample_length > 0) {
return ReSumSamples(&mipmap_data.data()[start_sample], sample_length, channels_);
}
// Return null samples
return AudioVisualWaveform::Sample(channel_count(), {0, 0});
}
void ExpandMinMaxChannel(const float *a, size_t length, float &min_val, float &max_val)
{
#if defined(Q_PROCESSOR_X86) || defined(Q_PROCESSOR_ARM)
// SSE optimized
// load the first 4 elements of 'a' into min and max (they are 4 * 32 = 128 bits)
__m128 max = _mm_loadu_ps(a);
__m128 min = _mm_loadu_ps(a);
// loop over 'a' and compare current elements with min and max 4 by 4.
// we need to make sure we don't read out of boundaries should 'a' length be not mod. 4
for(size_t i = 4; i < length-4; i+=4) {
__m128 cur = _mm_loadu_ps(a + i);
max = _mm_max_ps(max, cur);
min = _mm_min_ps(min, cur);
}
// so we read the last 4 (or less) elements in a safe manner.
__m128 cur = _mm_loadu_ps(a + length - 4);
max = _mm_max_ps(max, cur);
min = _mm_min_ps(min, cur);
// this potentially overlaps up to the last 3 elements but it's not an issue.
// min and max will contain 4 min and max. To get the absolute min and max
// we need to compare the 4 values over themselves by shuffling each time.
for (size_t i = 0; i < 3; i++) {
max = _mm_max_ps(max, _mm_shuffle_ps(max, max, 0x93));
min = _mm_min_ps(min, _mm_shuffle_ps(min, min, 0x93));
}
// now min and max contain 4 identical items each representing min and max value respectively.
// and we store the first one into a float variable.
_mm_store_ss(&max_val, max);
_mm_store_ss(&min_val, min);
// I bet you don't find annotated low level code very often.
#else
// Standard unoptimized function
for (size_t i=0; i<length; i++) {
min_val = std::min(min_val, a[i]);
max_val = std::max(max_val, a[i]);
}
#endif
}
AudioVisualWaveform::Sample AudioVisualWaveform::SumSamples(const SampleBuffer &samples, size_t start_index, size_t length)
{
int channels = samples.audio_params().channel_count();
AudioVisualWaveform::Sample summed_samples(channels);
for (int channel=0; channel<samples.audio_params().channel_count(); channel++) {
ExpandMinMaxChannel(samples.data(channel) + start_index, length, summed_samples[channel].min, summed_samples[channel].max);
}
// for reference: this approximation is n x faster (and less accurate) for a n-tracks clip
// for (size_t i=start_index; i<end_index; i++) {
// ExpandMinMax(summed_samples[i%channels], samples->data(i%channels)[i]);
// }
return summed_samples;
}
AudioVisualWaveform::Sample AudioVisualWaveform::ReSumSamples(const SamplePerChannel* samples,
size_t nb_samples,
int nb_channels)
{
AudioVisualWaveform::Sample summed_samples(nb_channels);
for (size_t i=0;i<nb_samples;i+=nb_channels) {
for (int j=0;j<nb_channels;j++) {
const AudioVisualWaveform::SamplePerChannel& sample = samples[i + j];
if (sample.min < summed_samples[j].min) {
summed_samples[j].min = sample.min;
}
if (sample.max > summed_samples[j].max) {
summed_samples[j].max = sample.max;
}
}
}
return summed_samples;
}
template <typename T>
inline int round_away_from_zero(T t)
{
return (t < 0) ? std::floor(t) : std::ceil(t);
}
void AudioVisualWaveform::DrawSample(QPainter *painter, const Sample& sample, int x, int y, int height, bool rectified)
{
if (sample.empty()) {
return;
}
int channel_height = height / sample.size();
int channel_half_height = channel_height / 2;
for (size_t i=0;i<sample.size();i++) {
float max = qMin(sample.at(i).max, 1.0f);
float min = qMax(sample.at(i).min, -1.0f);
if (rectified) {
int channel_bottom = y + channel_height * (i + 1);
int diff = round_away_from_zero((max - min) * channel_half_height);
painter->drawLine(x,
channel_bottom - diff,
x,
channel_bottom);
} else {
int channel_mid = y + channel_height * i + channel_half_height;
// We subtract the sample so that positive Y values go up on the screen rather than down,
// which is how waveforms are usually rendered
painter->drawLine(x,
channel_mid - round_away_from_zero(min * static_cast<float>(channel_half_height)),
x,
channel_mid - round_away_from_zero(max * static_cast<float>(channel_half_height)));
}
}
}
void AudioVisualWaveform::DrawWaveform(QPainter *painter, const QRect& rect, const double& scale, const AudioVisualWaveform &samples, const rational& start_time)
{
if (samples.mipmapped_data_.empty()) {
return;
}
auto using_mipmap = samples.GetMipmapForScale(scale);
rational rate = using_mipmap->first;
double rate_dbl = rate.toDouble();
const Sample& arr = using_mipmap->second;
size_t start_sample_index = samples.time_to_samples(start_time - samples.virtual_start_, rate_dbl);
if (start_sample_index >= arr.size()) {
return;
}
size_t next_sample_index = start_sample_index;
size_t sample_index;
Sample summary;
size_t summary_index = -1;
const QRect& viewport = painter->viewport();
QPoint top_left = painter->transform().map(viewport.topLeft());
size_t start = qMax(rect.x(), -top_left.x());
size_t end = qMin(rect.right(), -top_left.x() + viewport.width());
bool rectified = OLIVE_CONFIG("RectifiedWaveforms").toBool();
for (size_t i=start;i<end;i++) {
sample_index = next_sample_index;
if (sample_index == arr.size()) {
break;
}
next_sample_index = std::min(arr.size(),
size_t(start_sample_index + std::floor(rate_dbl * static_cast<double>(i - rect.x() + 1) / scale) * samples.channel_count()));
if (summary_index != sample_index) {
summary = AudioVisualWaveform::ReSumSamples(&arr.at(sample_index),
qMax(size_t(samples.channel_count()), next_sample_index - sample_index),
samples.channel_count());
summary_index = sample_index;
}
DrawSample(painter, summary, i, rect.y(), rect.height(), rectified);
}
}
size_t AudioVisualWaveform::time_to_samples(const rational &time, double sample_rate) const
{
return time_to_samples(time.toDouble(), sample_rate);
}
size_t AudioVisualWaveform::time_to_samples(const double &time, double sample_rate) const
{
return std::floor(time * sample_rate) * channels_;
}
std::map<rational, AudioVisualWaveform::Sample>::const_iterator AudioVisualWaveform::GetMipmapForScale(double scale) const
{
// Find largest mipmap for this scale (or the largest if we don't find one sufficient)
for (auto it=mipmapped_data_.cbegin(); it!=mipmapped_data_.cend(); it++) {
if (it->first.toDouble() >= scale) {
return it;
}
}
// We don't have a mipmap large enough for this scale, so just return the largest we have
return std::prev(mipmapped_data_.cend());
}
}
================================================
FILE: app/audio/audiovisualwaveform.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef SUMSAMPLES_H
#define SUMSAMPLES_H
#include <olive/core/core.h>
#include <QPainter>
#include <QVector>
namespace olive {
using namespace core;
/**
* @brief A buffer of data used to store a visual representation of audio
*
* This differs from a SampleBuffer as the data in an AudioVisualWaveform has been reduced
* significantly and optimized for visual display.
*/
class AudioVisualWaveform {
public:
AudioVisualWaveform();
struct SamplePerChannel {
float min;
float max;
};
using Sample = std::vector<SamplePerChannel>;
int channel_count() const
{
return channels_;
}
void set_channel_count(int channels)
{
channels_ = channels;
}
const rational& length() const
{
return length_;
}
/**
* @brief Writes samples into the visual waveform buffer
*
* Starting at `start`, writes samples over anything in the buffer, expanding it if necessary.
*/
void OverwriteSamples(const SampleBuffer &samples, int sample_rate, const rational& start = 0);
/**
* @brief Replaces sums at a certain range in this visual waveform
*
* @param sums
*
* The sums to write over our current ones with.
*
* @param dest
*
* Where in this visual waveform these sums should START being written to.
*
* @param offset
*
* Where in the `sums` parameter this should start reading from. Defaults to 0.
*
* @param length
*
* Maximum length of `sums` to overwrite with.
*/
void OverwriteSums(const AudioVisualWaveform& sums, const rational& dest, const rational& offset = 0, const rational &length = 0);
void OverwriteSilence(const rational &start, const rational &length);
void TrimIn(rational length);
AudioVisualWaveform Mid(const rational &offset) const;
AudioVisualWaveform Mid(const rational &offset, const rational &length) const;
void Resize(const rational &length);
void TrimRange(const rational &in, const rational &length);
Sample GetSummaryFromTime(const rational& start, const rational& length) const;
static Sample SumSamples(const SampleBuffer &samples, size_t start_index, size_t length);
static Sample ReSumSamples(const SamplePerChannel *samples, size_t nb_samples, int nb_channels);
static void DrawSample(QPainter* painter, const Sample &sample, int x, int y, int height, bool rectified);
static void DrawWaveform(QPainter* painter, const QRect &rect, const double &scale, const AudioVisualWaveform& samples, const rational &start_time);
// Must be a power of 2
static const rational kMinimumSampleRate;
static const rational kMaximumSampleRate;
private:
void OverwriteSamplesFromBuffer(const SampleBuffer &samples, int sample_rate, const rational& start, double target_rate, Sample &data, size_t &start_index, size_t &samples_length);
void OverwriteSamplesFromMipmap(const Sample& input, double input_sample_rate, size_t &input_start, size_t &input_length, const rational& start, double output_rate, Sample &output_data);
size_t time_to_samples(const rational& time, double sample_rate) const;
size_t time_to_samples(const double& time, double sample_rate) const;
std::map<rational, Sample>::const_iterator GetMipmapForScale(double scale) const;
void ValidateVirtualStart(const rational &new_start);
rational virtual_start_;
int channels_;
std::map<rational, Sample> mipmapped_data_;
rational length_;
};
}
Q_DECLARE_METATYPE(olive::AudioVisualWaveform)
#endif // SUMSAMPLES_H
================================================
FILE: app/cli/CMakeLists.txt
================================================
# Olive - Non-Linear Video Editor
# Copyright (C) 2022 Olive Team
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
add_subdirectory(cliprogress)
add_subdirectory(clitask)
set(OLIVE_SOURCES
${OLIVE_SOURCES}
PARENT_SCOPE
)
================================================
FILE: app/cli/cliexport/cliexportmanager.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "cliexportmanager.h"
namespace olive {
CLIExportManager::CLIExportManager()
{
}
}
================================================
FILE: app/cli/cliexport/cliexportmanager.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef CLIEXPORTMANAGER_H
#define CLIEXPORTMANAGER_H
#include "task/export/export.h"
namespace olive {
class CLIExportManager : public QObject
{
public:
CLIExportManager();
};
}
#endif // CLIEXPORTMANAGER_H
================================================
FILE: app/cli/cliprogress/CMakeLists.txt
================================================
# Olive - Non-Linear Video Editor
# Copyright (C) 2022 Olive Team
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set(OLIVE_SOURCES
${OLIVE_SOURCES}
cli/cliprogress/cliprogressdialog.h
cli/cliprogress/cliprogressdialog.cpp
PARENT_SCOPE
)
================================================
FILE: app/cli/cliprogress/cliprogressdialog.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "cliprogressdialog.h"
#include <iostream>
namespace olive {
CLIProgressDialog::CLIProgressDialog(const QString& title, QObject *parent) :
QObject(parent),
title_(title),
progress_(-1),
drawn_(false)
{
SetProgress(0);
}
void CLIProgressDialog::Update()
{
if (drawn_) {
// We've been here before, do a carriage return back to the start of the terminal line
std::cout << "\r";
} else {
drawn_ = true;
}
// FIXME: Get real column count
int columns = 80;
int title_columns = columns / 2 - 1;
// Print "title" text
QString sized_title = title_;
if (title_.size() > title_columns) {
sized_title = title_.left(title_columns - 3).append(QStringLiteral("..."));
} else {
sized_title = title_;
}
std::cout << sized_title.toUtf8().constData();
// Pad out the rest of the title area if necessary
for (int i=sized_title.size(); i<title_columns; i++) {
std::cout << " ";
}
// Percentage counter " 100% " is 5 characters + the enclosing brackets [] are 2 characters
int progress_bar_columns = columns / 2 - 7;
std::cout << "[";
// Get UI bar progress
int bar_prog = qRound(progress_ * progress_bar_columns);
// Draw filled in bar
for (int i=0;i<bar_prog;i++) {
std::cout << "=";
}
// Draw empty space
for (int i=bar_prog;i<progress_bar_columns;i++) {
std::cout << " ";
}
std::cout << "] ";
if (progress_ < 100) {
std::cout << " ";
}
if (progress_ < 10) {
std::cout << " ";
}
std::cout << qRound(progress_ * 100.0) << "% " << std::endl << std::flush;
}
void CLIProgressDialog::SetProgress(double p)
{
if (progress_ != p) {
progress_ = p;
Update();
}
}
}
================================================
FILE: app/cli/cliprogress/cliprogressdialog.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef CLIPROGRESSDIALOG_H
#define CLIPROGRESSDIALOG_H
#include <QObject>
#include <QTimer>
#include "common/define.h"
namespace olive {
class CLIProgressDialog : public QObject
{
public:
CLIProgressDialog(const QString &title, QObject* parent = nullptr);
public slots:
void SetProgress(double p);
private:
void Update();
QString title_;
double progress_;
bool drawn_;
};
}
#endif // CLIPROGRESSDIALOG_H
================================================
FILE: app/cli/clitask/CMakeLists.txt
================================================
# Olive - Non-Linear Video Editor
# Copyright (C) 2022 Olive Team
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set(OLIVE_SOURCES
${OLIVE_SOURCES}
cli/clitask/clitaskdialog.h
cli/clitask/clitaskdialog.cpp
PARENT_SCOPE
)
================================================
FILE: app/cli/clitask/clitaskdialog.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "clitaskdialog.h"
namespace olive {
CLITaskDialog::CLITaskDialog(Task *task, QObject* parent) :
CLIProgressDialog(task->GetTitle(), parent),
task_(task)
{
connect(task_, &Task::ProgressChanged, this, &CLITaskDialog::SetProgress);
}
bool CLITaskDialog::Run()
{
return task_->Start();
}
}
================================================
FILE: app/cli/clitask/clitaskdialog.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef CLITASKDIALOG_H
#define CLITASKDIALOG_H
#include "cli/cliprogress/cliprogressdialog.h"
#include "task/task.h"
namespace olive {
class CLITaskDialog : public CLIProgressDialog
{
Q_OBJECT
public:
CLITaskDialog(Task *task, QObject* parent = nullptr);
bool Run();
private:
Task* task_;
};
}
#endif // CLITASKDIALOG_H
================================================
FILE: app/codec/CMakeLists.txt
================================================
# Olive - Non-Linear Video Editor
# Copyright (C) 2022 Olive Team
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
add_subdirectory(ffmpeg)
add_subdirectory(oiio)
set(OLIVE_SOURCES
${OLIVE_SOURCES}
codec/conformmanager.cpp
codec/conformmanager.h
codec/decoder.cpp
codec/decoder.h
codec/encoder.cpp
codec/encoder.h
codec/exportcodec.cpp
codec/exportcodec.h
codec/exportformat.cpp
codec/exportformat.h
codec/frame.cpp
codec/frame.h
codec/planarfiledevice.cpp
codec/planarfiledevice.h
PARENT_SCOPE
)
================================================
FILE: app/codec/conformmanager.cpp
================================================
#include "conformmanager.h"
#include <QDir>
#include "task/taskmanager.h"
namespace olive {
ConformManager *ConformManager::instance_ = nullptr;
ConformManager::Conform ConformManager::GetConformState(const QString &decoder_id, const QString &cache_path, const Decoder::CodecStream &stream, const AudioParams ¶ms, bool wait)
{
// Mutex because we'll need to check the status of a conform task
QMutexLocker locker(&mutex_);
// Return existing conform if exists
QVector<QString> filenames = GetConformedFilename(cache_path, stream, params);
if (AllConformsExist(filenames)) {
return {kConformExists, filenames, nullptr};
}
ConformTask *conforming_task = nullptr;
foreach (const ConformData &data, conforming_) {
if (data.stream == stream && data.params == params) {
// Already creating conform in a task
conforming_task = data.task;
break;
}
}
if (!conforming_task) {
// Not conforming yet, create a task to do so
// We conform to a different filename until it's done to make it clear even across sessions
// whether this conform is ready or not
QVector<QString> working_filenames = filenames;
for (int i=0; i<working_filenames.size(); i++) {
working_filenames[i].append(QStringLiteral(".working"));
}
conforming_task = new ConformTask(decoder_id, stream, params, working_filenames);
connect(conforming_task, &ConformTask::Finished, this, &ConformManager::ConformTaskFinished);
conforming_task->moveToThread(TaskManager::instance()->thread());
QMetaObject::invokeMethod(TaskManager::instance(), "AddTask", Qt::QueuedConnection, Q_ARG(Task *, conforming_task));
conforming_.append({stream, params, conforming_task, working_filenames, filenames});
}
if (wait) {
do {
conform_done_condition_.wait(&mutex_);
} while (!AllConformsExist(filenames));
return {kConformExists, filenames, nullptr};
}
return {kConformGenerating, QVector<QString>(), conforming_task};
}
QVector<QString> ConformManager::GetConformedFilename(const QString &cache_path, const Decoder::CodecStream &stream, const AudioParams ¶ms)
{
QVector<QString> filenames(params.channel_count());
for (int i=0; i<filenames.size(); i++) {
QString index_fn = QStringLiteral("%1-%2.%3.%4.%5.%6.pcm").arg(FileFunctions::GetUniqueFileIdentifier(stream.filename()),
QString::number(stream.stream()),
QString::number(params.sample_rate()),
QString::number(params.format()),
QString::number(params.channel_layout()),
QString::number(i));
filenames[i] = QDir(cache_path).filePath(index_fn);
}
return filenames;
}
bool ConformManager::AllConformsExist(const QVector<QString> &filenames)
{
foreach (const QString &fn, filenames) {
if (!QFileInfo::exists(fn)) {
return false;
}
}
return true;
}
void ConformManager::ConformTaskFinished(Task *task, bool succeeded)
{
QMutexLocker locker(&mutex_);
ConformData data;
// Remove conform data from list
for (int i=0; i<conforming_.size(); i++) {
const ConformData &c = conforming_.at(i);
if (c.task == task) {
data = c;
conforming_.removeAt(i);
break;
}
}
if (succeeded) {
// Move file to standard conform name, making it clear this conform is ready for use
for (int i=0; i<data.finished_filename.size(); i++) {
const QString &finished = data.finished_filename.at(i);
const QString &working = data.working_filename.at(i);
QFile::remove(finished);
QFile::rename(working, finished);
}
conform_done_condition_.wakeAll();
locker.unlock();
emit ConformReady();
} else {
// Failed, just delete the working filename if exists
for (int i=0; i<data.working_filename.size(); i++) {
QFile::remove(data.working_filename.at(i));
}
}
}
}
================================================
FILE: app/codec/conformmanager.h
================================================
#ifndef CONFORMMANAGER_H
#define CONFORMMANAGER_H
#include <QMutex>
#include <QObject>
#include "decoder.h"
#include "task/conform/conform.h"
namespace olive {
class ConformManager : public QObject
{
Q_OBJECT
public:
static void CreateInstance()
{
if (!instance_) {
instance_ = new ConformManager();
}
}
static void DestroyInstance()
{
delete instance_;
instance_ = nullptr;
}
static ConformManager *instance()
{
return instance_;
}
enum ConformState {
kConformExists,
kConformGenerating
};
struct Conform {
ConformState state;
QVector<QString> filenames;
ConformTask *task;
};
/**
* @brief Get conform state, and start conforming if no conform exists
*
* Thread-safe.
*/
Conform GetConformState(const QString &decoder_id, const QString &cache_path, const Decoder::CodecStream &stream, const AudioParams ¶ms, bool wait);
signals:
void ConformReady();
private:
ConformManager() = default;
static ConformManager *instance_;
QMutex mutex_;
QWaitCondition conform_done_condition_;
struct ConformData {
Decoder::CodecStream stream;
AudioParams params;
ConformTask *task;
QVector<QString> working_filename;
QVector<QString> finished_filename;
};
QVector<ConformData> conforming_;
/**
* @brief Get the destination filename of an audio stream conformed to a set of parameters
*/
static QVector<QString> GetConformedFilename(const QString &cache_path, const Decoder::CodecStream &stream, const AudioParams ¶ms);
static bool AllConformsExist(const QVector<QString> &filenames);
private slots:
void ConformTaskFinished(Task *task, bool succeeded);
};
}
#endif // CONFORMMANAGER_H
================================================
FILE: app/codec/decoder.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "decoder.h"
#include <QCoreApplication>
#include <QDebug>
#include <QHash>
#include "codec/ffmpeg/ffmpegdecoder.h"
#include "codec/planarfiledevice.h"
#include "codec/oiio/oiiodecoder.h"
#include "common/ffmpegutils.h"
#include "common/filefunctions.h"
#include "conformmanager.h"
#include "node/project.h"
#include "task/taskmanager.h"
namespace olive {
const rational Decoder::kAnyTimecode = RATIONAL_MIN;
Decoder::Decoder() :
cached_texture_(nullptr)
{
UpdateLastAccessed();
}
void Decoder::IncrementAccessTime(qint64 t)
{
last_accessed_ += t;
}
bool Decoder::Open(const CodecStream &stream)
{
QMutexLocker locker(&mutex_);
UpdateLastAccessed();
if (stream_.IsValid()) {
// Decoder is already open. Return TRUE if the stream is the stream we have, or FALSE if not.
if (stream_ == stream) {
return true;
} else {
qWarning() << "Tried to open a decoder that was already open with another stream";
return false;
}
} else {
// Stream was not open, try opening it now
if (!stream.IsValid()) {
// Cannot open null stream
qCritical() << "Decoder attempted to open null stream";
return false;
}
if (!stream.Exists()) {
// Cannot open file that doesn't exist
qCritical() << "Decoder attempted to open file that doesn't exist";
return false;
}
// Set stream
stream_ = stream;
// Try open internal
if (OpenInternal()) {
return true;
} else {
// Unset stream
qCritical() << "Failed to open" << stream_.filename() << "stream" << stream_.stream();
CloseInternal();
stream_.Reset();
return false;
}
}
}
TexturePtr Decoder::RetrieveVideo(const RetrieveVideoParams &p)
{
QMutexLocker locker(&mutex_);
UpdateLastAccessed();
if (!stream_.IsValid()) {
qCritical() << "Can't retrieve video on a closed decoder";
return nullptr;
}
if (!SupportsVideo()) {
qCritical() << "Decoder doesn't support video";
return nullptr;
}
if (p.cancelled && p.cancelled->IsCancelled()) {
return nullptr;
}
if (cached_texture_ && cached_time_ == p.time && cached_divider_ == p.divider) {
return cached_texture_;
}
cached_texture_ = RetrieveVideoInternal(p);
cached_time_ = p.time;
cached_divider_ = p.divider;
return cached_texture_;
}
Decoder::RetrieveAudioStatus Decoder::RetrieveAudio(SampleBuffer &dest, const TimeRange &range, const AudioParams ¶ms, const QString& cache_path, LoopMode loop_mode, RenderMode::Mode mode)
{
QMutexLocker locker(&mutex_);
UpdateLastAccessed();
if (!stream_.IsValid()) {
qCritical() << "Can't retrieve audio on a closed decoder";
return kInvalid;
}
if (!SupportsAudio()) {
qCritical() << "Decoder doesn't support audio";
return kInvalid;
}
// Get conform state from ConformManager
ConformManager::Conform conform = ConformManager::instance()->GetConformState(id(), cache_path, stream_, params, (mode == RenderMode::kOnline));
if (conform.state == ConformManager::kConformGenerating) {
// If we need the task, it's available in `conform.task`
return kWaitingForConform;
}
// See if we got the conform
if (RetrieveAudioFromConform(dest, conform.filenames, range, loop_mode, params)) {
return kOK;
} else {
return kUnknownError;
}
}
qint64 Decoder::GetLastAccessedTime()
{
return last_accessed_;
}
void Decoder::Close()
{
QMutexLocker locker(&mutex_);
UpdateLastAccessed();
cached_texture_ = nullptr;
if (stream_.IsValid()) {
CloseInternal();
stream_.Reset();
} else {
qWarning() << "Tried to close a decoder that wasn't open";
}
}
bool Decoder::ConformAudio(const QVector<QString> &output_filenames, const AudioParams ¶ms, CancelAtom *cancelled)
{
return ConformAudioInternal(output_filenames, params, cancelled);
}
/*
* DECODER STATIC PUBLIC MEMBERS
*/
QVector<DecoderPtr> Decoder::ReceiveListOfAllDecoders()
{
QVector<DecoderPtr> decoders;
// The order in which these decoders are added is their priority when probing. Hence FFmpeg should usually be last,
// since it supports so many formats and we presumably want to override those formats with a more specific decoder.
decoders.append(std::make_shared<OIIODecoder>());
decoders.append(std::make_shared<FFmpegDecoder>());
return decoders;
}
DecoderPtr Decoder::CreateFromID(const QString &id)
{
if (id.isEmpty()) {
return nullptr;
}
// Create list to iterate through
QVector<DecoderPtr> decoder_list = ReceiveListOfAllDecoders();
foreach (DecoderPtr d, decoder_list) {
if (d->id() == id) {
return d;
}
}
return nullptr;
}
void Decoder::SignalProcessingProgress(int64_t ts, int64_t duration)
{
if (duration != AV_NOPTS_VALUE && duration != 0) {
emit IndexProgress(static_cast<double>(ts) / static_cast<double>(duration));
}
}
QString Decoder::TransformImageSequenceFileName(const QString &filename, const int64_t& number)
{
int digit_count = GetImageSequenceDigitCount(filename);
QFileInfo file_info(filename);
QString original_basename = file_info.completeBaseName();
QString new_basename = original_basename.left(original_basename.size() - digit_count)
.append(QStringLiteral("%1").arg(number, digit_count, 10, QChar('0')));
return file_info.dir().filePath(file_info.fileName().replace(original_basename, new_basename));
}
int Decoder::GetImageSequenceDigitCount(const QString &filename)
{
QString basename = QFileInfo(filename).completeBaseName();
// See if basename contains a number at the end
int digit_count = 0;
for (int i=basename.size()-1;i>=0;i--) {
if (basename.at(i).isDigit()) {
digit_count++;
} else {
break;
}
}
return digit_count;
}
int64_t Decoder::GetImageSequenceIndex(const QString &filename)
{
int digit_count = GetImageSequenceDigitCount(filename);
QFileInfo file_info(filename);
QString original_basename = file_info.completeBaseName();
QString number_only = original_basename.mid(original_basename.size() - digit_count);
return number_only.toLongLong();
}
TexturePtr Decoder::RetrieveVideoInternal(const RetrieveVideoParams &p)
{
Q_UNUSED(p)
return nullptr;
}
bool Decoder::ConformAudioInternal(const QVector<QString> &filenames, const AudioParams ¶ms, CancelAtom *cancelled)
{
Q_UNUSED(filenames)
Q_UNUSED(cancelled)
Q_UNUSED(params)
return false;
}
bool Decoder::RetrieveAudioFromConform(SampleBuffer &sample_buffer, const QVector<QString> &conform_filenames, TimeRange range, LoopMode loop_mode, const AudioParams &input_params)
{
PlanarFileDevice input;
if (input.open(conform_filenames, QFile::ReadOnly)) {
// Offset range by audio start offset
range -= GetAudioStartOffset();
qint64 read_index = input_params.time_to_bytes(range.in()) / input_params.channel_count();
qint64 write_index = 0;
const qint64 buffer_length_in_bytes = sample_buffer.sample_count() * input_params.bytes_per_sample_per_channel();
while (write_index < buffer_length_in_bytes) {
if (loop_mode == LoopMode::kLoopModeLoop) {
while (read_index >= input.size()) {
read_index -= input.size();
}
while (read_index < 0) {
read_index += input.size();
}
}
qint64 write_count = 0;
if (read_index < 0) {
// Reading before 0, write silence here until audio data would actually start
write_count = qMin(-read_index, buffer_length_in_bytes);
sample_buffer.silence_bytes(write_index, write_index + write_count);
} else if (read_index >= input.size()) {
// Reading after data length, write silence until the end of the buffer
write_count = buffer_length_in_bytes - write_index;
sample_buffer.silence_bytes(write_index, write_index + write_count);
} else {
write_count = qMin(input.size() - read_index, buffer_length_in_bytes - write_index);
input.seek(read_index);
input.read(reinterpret_cast<char**>(sample_buffer.to_raw_ptrs().data()), write_count, write_index);
}
read_index += write_count;
write_index += write_count;
}
input.close();
return true;
}
return false;
}
void Decoder::UpdateLastAccessed()
{
last_accessed_ = QDateTime::currentMSecsSinceEpoch();
}
uint qHash(Decoder::CodecStream stream, uint seed)
{
return qHash(stream.filename(), seed) ^ ::qHash(stream.stream(), seed) ^ qHash(stream.block(), seed);
}
}
================================================
FILE: app/codec/decoder.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef DECODER_H
#define DECODER_H
extern "C" {
#include <libswresample/swresample.h>
}
#include <QFileInfo>
#include <QMutex>
#include <QObject>
#include <QWaitCondition>
#include <stdint.h>
#include "node/block/block.h"
#include "node/project/footage/footagedescription.h"
#include "render/cancelatom.h"
#include "render/rendermodes.h"
namespace olive {
class Decoder;
using DecoderPtr = std::shared_ptr<Decoder>;
#define DECODER_DEFAULT_DESTRUCTOR(x) virtual ~x() override {CloseInternal();}
/**
* @brief A decoder's is the main class for bringing external media into Olive
*
* Its responsibilities are to serve as
* abstraction from codecs/decoders and provide complete frames. These frames can be video or audio data and are
* provided as Frame objects in shared pointers to alleviate the responsibility of memory handling.
*
* The main function in a decoder is Retrieve() which should return complete image/audio data. A decoder should
* alleviate all the complexities of codec compression from the rest of the application (i.e. a decoder should never
* return a partial frame or require other parts of the system to interface directly with the codec). Often this will
* necessitate pre-emptively caching, indexing, or even fully transcoding media before using it which can be implemented
* through the Analyze() function.
*
* A decoder does NOT perform any pixel/sample format conversion. Frames should pass through the PixelService
* to be utilized in the rest of the rendering pipeline.
*/
class Decoder : public QObject
{
Q_OBJECT
public:
enum RetrieveState {
kReady,
kFailedToOpen,
kIndexUnavailable
};
Decoder();
/**
* @brief Unique decoder ID
*/
virtual QString id() const = 0;
virtual bool SupportsVideo(){return false;}
virtual bool SupportsAudio(){return false;}
void IncrementAccessTime(qint64 t);
class CodecStream
{
public:
CodecStream() :
stream_(-1),
block_(nullptr)
{
}
CodecStream(const QString& filename, int stream, Block *block) :
filename_(filename),
stream_(stream),
block_(block)
{
}
bool IsValid() const
{
return !filename_.isEmpty() && stream_ >= 0;
}
bool Exists() const
{
return QFileInfo::exists(filename_);
}
void Reset()
{
*this = CodecStream();
}
bool operator==(const CodecStream& rhs) const
{
return filename_ == rhs.filename_ && stream_ == rhs.stream_;
}
const QString& filename() const
{
return filename_;
}
int stream() const
{
return stream_;
}
Block *block() const
{
return block_;
}
private:
QString filename_;
int stream_;
Block *block_;
};
/**
* @brief Open stream for decoding
*
* This function is thread safe.
*
* Returns TRUE if stream could be opened successfully. Also returns TRUE if the decoder is
* already open and the stream == the stream provided. Returns FALSE if the stream couldn't
* be opened OR if already open and the stream is NOT the same.
*/
bool Open(const CodecStream& stream);
static const rational kAnyTimecode;
struct RetrieveVideoParams
{
Renderer *renderer = nullptr;
rational time;
int divider = 1;
PixelFormat maximum_format = PixelFormat::INVALID;
CancelAtom *cancelled = nullptr;
VideoParams::ColorRange force_range = VideoParams::kColorRangeDefault;
VideoParams::Interlacing src_interlacing = VideoParams::kInterlaceNone;
};
/**
* @brief Retrieves a video frame from footage
*
* This function will always return a valid frame unless a fatal error occurs (in such case,
* nullptr will return). If the timecode is before the start of the footage, this function should
* return the first frame. Likewise, if it is after the timecode, this function should return the
* last frame.
*
* This function is thread safe and can only run while the decoder is open. \see Open()
*/
TexturePtr RetrieveVideo(const RetrieveVideoParams& p);
enum RetrieveAudioStatus {
kInvalid = -1,
kOK,
kWaitingForConform,
kUnknownError
};
/**
* @brief Retrieve audio data from footage
*
* This function will always return a sample buffer unless a fatal error occurs (in such case,
* nullptr will return). The SampleBuffer should always have enough audio for the range provided.
*
* This function is thread safe and can only run while the decoder is open. \see Open()
*/
RetrieveAudioStatus RetrieveAudio(SampleBuffer &dest, const TimeRange& range, const AudioParams& params, const QString &cache_path, LoopMode loop_mode, RenderMode::Mode mode);
/**
* @brief Determine the last time this decoder instance was used in any way
*/
qint64 GetLastAccessedTime();
/**
* @brief Generate a Footage object from a file
*
* If this decoder is able to parse this file, it will return a valid FootagePtr. Otherwise, it
* will return nullptr.
*
* For sub-classes, this function should be effectively static. We can't do virtual static
* functions in C++, but it should hold and access no state during its run.
*
* This function is re-entrant.
*/
virtual FootageDescription Probe(const QString& filename, CancelAtom *cancelled) const = 0;
/**
* @brief Closes media/deallocates memory
*
* This function is thread safe and can only run while the decoder is open. \see Open()
*/
void Close();
/**
* @brief Conform audio stream
*/
bool ConformAudio(const QVector<QString> &output_filenames, const AudioParams ¶ms, CancelAtom *cancelled = nullptr);
/**
* @brief Create a Decoder instance using a Decoder ID
*
* @return
*
* A Decoder instance or nullptr if a Decoder with this ID does not exist
*/
static DecoderPtr CreateFromID(const QString& id);
static QString TransformImageSequenceFileName(const QString& filename, const int64_t& number);
static int GetImageSequenceDigitCount(const QString& filename);
static int64_t GetImageSequenceIndex(const QString& filename);
static QVector<DecoderPtr> ReceiveListOfAllDecoders();
protected:
/**
* @brief Internal open function
*
* Sub-classes must override this function. Function will already be mutexed, so there is no need
* to worry about thread safety. Also many other sanity checks will be done before this, so
* sub-classes only need to worry about their own opening functions. It is guaranteed that the
* decoder is not open yet and that the footage stream was from that sub-classes probe function.
*
* Return TRUE if everything opened successfully and the decoder is ready to work. Otherwise,
* return FALSE. If this function returns false, Decoder will call CloseInternal to clean any
* memory allocated during OpenInternal.
*/
virtual bool OpenInternal() = 0;
/**
* @brief Internal close function
*
* Sub-classes must override this function. Function should be able to safely clear all allocated
* memory. It may be called even if Open() didn't complete or RetrieveVideo() was never called.
*/
virtual void CloseInternal() = 0;
/**
* @brief Internal frame retrieval function
*
* Sub-classes must override this function IF they support video. Function is already mutexed
* so sub-classes don't need to worry about thread safety.
*/
virtual TexturePtr RetrieveVideoInternal(const RetrieveVideoParams& p);
virtual bool ConformAudioInternal(const QVector<QString>& filenames, const AudioParams ¶ms, CancelAtom *cancelled);
void SignalProcessingProgress(int64_t ts, int64_t duration);
/**
* @brief Return currently open stream
*
* This function is NOT thread safe and should therefore only be called by thread safe functions.
*/
const CodecStream& stream() const
{
return stream_;
}
virtual rational GetAudioStartOffset() const { return 0; }
signals:
/**
* @brief While indexing, this signal will provide progress as a percentage (0-100 inclusive) if
* available
*/
void IndexProgress(double);
private:
void UpdateLastAccessed();
bool RetrieveAudioFromConform(SampleBuffer &sample_buffer, const QVector<QString> &conform_filenames, TimeRange range, LoopMode loop_mode, const AudioParams ¶ms);
CodecStream stream_;
QMutex mutex_;
std::atomic_int64_t last_accessed_;
TexturePtr cached_texture_;
rational cached_time_;
int cached_divider_;
};
uint qHash(Decoder::CodecStream stream, uint seed = 0);
}
Q_DECLARE_METATYPE(olive::Decoder::RetrieveState)
#endif // DECODER_H
================================================
FILE: app/codec/encoder.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "encoder.h"
#include <QFile>
#include "common/xmlutils.h"
#include "ffmpeg/ffmpegencoder.h"
#include "oiio/oiioencoder.h"
namespace olive {
const QRegularExpression Encoder::kImageSequenceContainsDigits = QRegularExpression(QStringLiteral("\\[[#]+\\]"));
const QRegularExpression Encoder::kImageSequenceRemoveDigits = QRegularExpression(QStringLiteral("[\\-\\.\\ \\_]?\\[[#]+\\]"));
Encoder::Encoder(const EncodingParams ¶ms) :
params_(params)
{
}
const EncodingParams &Encoder::params() const
{
return params_;
}
QString Encoder::GetFilenameForFrame(const rational &frame)
{
if (params().video_is_image_sequence()) {
// Transform!
int64_t frame_index = Timecode::time_to_timestamp(frame, params().video_params().frame_rate_as_time_base());
int digits = GetImageSequencePlaceholderDigitCount(params().filename());
QString frame_index_str = QStringLiteral("%1").arg(frame_index, digits, 10, QChar('0'));
QString f = params_.filename();
f.replace(kImageSequenceContainsDigits, frame_index_str);
return f;
} else {
// Keep filename
return params_.filename();
}
}
int Encoder::GetImageSequencePlaceholderDigitCount(const QString &filename)
{
int start = filename.indexOf(kImageSequenceContainsDigits);
int digit_count = 0;
for (int i=start+1; i<filename.size(); i++) {
if (filename.at(i) == '#') {
digit_count++;
} else {
break;
}
}
return digit_count;
}
bool Encoder::FilenameContainsDigitPlaceholder(const QString& filename)
{
return filename.contains(kImageSequenceContainsDigits);
}
QString Encoder::FilenameRemoveDigitPlaceholder(QString filename)
{
return filename.remove(kImageSequenceRemoveDigits);
}
EncodingParams::EncodingParams() :
video_enabled_(false),
video_bit_rate_(0),
video_min_bit_rate_(0),
video_max_bit_rate_(0),
video_buffer_size_(0),
video_threads_(0),
video_is_image_sequence_(false),
audio_enabled_(false),
audio_bit_rate_(0),
subtitles_enabled_(false),
subtitles_are_sidecar_(false),
video_scaling_method_(kStretch),
has_custom_range_(false)
{
}
QDir EncodingParams::GetPresetPath()
{
return QDir(FileFunctions::GetConfigurationLocation()).filePath(QStringLiteral("exportpresets"));
}
QStringList EncodingParams::GetListOfPresets()
{
QDir d = EncodingParams::GetPresetPath();
return d.entryList(QDir::Files);
}
void EncodingParams::EnableVideo(const VideoParams &video_params, const ExportCodec::Codec &vcodec)
{
video_enabled_ = true;
video_params_ = video_params;
video_codec_ = vcodec;
}
void EncodingParams::EnableAudio(const AudioParams &audio_params, const ExportCodec::Codec &acodec)
{
audio_enabled_ = true;
audio_params_ = audio_params;
audio_codec_ = acodec;
}
void EncodingParams::EnableSubtitles(const ExportCodec::Codec &scodec)
{
subtitles_enabled_ = true;
subtitles_codec_ = scodec;
}
void EncodingParams::EnableSidecarSubtitles(const ExportFormat::Format &sfmt, const ExportCodec::Codec &scodec)
{
subtitles_enabled_ = true;
subtitles_are_sidecar_ = true;
subtitle_sidecar_fmt_ = sfmt;
subtitles_codec_ = scodec;
}
void EncodingParams::DisableVideo()
{
video_enabled_ = false;
}
void EncodingParams::DisableAudio()
{
audio_enabled_ = false;
}
void EncodingParams::DisableSubtitles()
{
subtitles_enabled_ = false;
}
bool EncodingParams::Load(QXmlStreamReader *reader)
{
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("export")) {
int version = 0;
XMLAttributeLoop(reader, attr) {
if (attr.name() == QStringLiteral("version")) {
version = attr.value().toInt();
}
}
switch (version) {
case 1:
return LoadV1(reader);
}
} else {
reader->skipCurrentElement();
}
}
return false;
}
bool EncodingParams::Load(QIODevice *device)
{
QXmlStreamReader reader(device);
return Load(&reader);
}
void EncodingParams::Save(QIODevice *device) const
{
QXmlStreamWriter writer(device);
Save(&writer);
}
void EncodingParams::Save(QXmlStreamWriter *writer) const
{
writer->writeStartDocument();
writer->writeStartElement(QStringLiteral("export"));
writer->writeAttribute(QStringLiteral("version"), QString::number(kEncoderParamsVersion));
writer->writeTextElement(QStringLiteral("filename"), filename_);
writer->writeTextElement(QStringLiteral("format"), QString::number(format_));
writer->writeTextElement(QStringLiteral("range"), QString::number(has_custom_range_));
writer->writeTextElement(QStringLiteral("customrangein"), QString::fromStdString(custom_range_.in().toString()));
writer->writeTextElement(QStringLiteral("customrangeout"), QString::fromStdString(custom_range_.out().toString()));
writer->writeStartElement(QStringLiteral("video"));
writer->writeAttribute(QStringLiteral("enabled"), QString::number(video_enabled_));
if (video_enabled_) {
writer->writeTextElement(QStringLiteral("codec"), QString::number(video_codec_));
writer->writeTextElement(QStringLiteral("width"), QString::number(video_params_.width()));
writer->writeTextElement(QStringLiteral("height"), QString::number(video_params_.height()));
writer->writeTextElement(QStringLiteral("format"), QString::number(video_params_.format()));
writer->writeTextElement(QStringLiteral("pixelaspect"), QString::fromStdString(video_params_.pixel_aspect_ratio().toString()));
writer->writeTextElement(QStringLiteral("timebase"), QString::fromStdString(video_params_.time_base().toString()));
writer->writeTextElement(QStringLiteral("divider"), QString::number(video_params_.divider()));
writer->writeTextElement(QStringLiteral("bitrate"), QString::number(video_bit_rate_));
writer->writeTextElement(QStringLiteral("minbitrate"), QString::number(video_min_bit_rate_));
writer->writeTextElement(QStringLiteral("maxbitrate"), QString::number(video_max_bit_rate_));
writer->writeTextElement(QStringLiteral("bufsize"), QString::number(video_buffer_size_));
writer->writeTextElement(QStringLiteral("threads"), QString::number(video_threads_));
writer->writeTextElement(QStringLiteral("pixfmt"), video_pix_fmt_);
writer->writeTextElement(QStringLiteral("imgseq"), QString::number(video_is_image_sequence_));
writer->writeStartElement(QStringLiteral("color"));
writer->writeTextElement(QStringLiteral("output"), color_transform_.output());
writer->writeEndElement(); // colortransform
writer->writeTextElement(QStringLiteral("vscale"), QString::number(video_scaling_method_));
if (!video_opts_.isEmpty()) {
writer->writeStartElement(QStringLiteral("opts"));
QHash<QString, QString>::const_iterator i;
for (i=video_opts_.constBegin(); i!=video_opts_.constEnd(); i++) {
writer->writeStartElement(QStringLiteral("entry"));
writer->writeTextElement(QStringLiteral("key"), i.key());
writer->writeTextElement(QStringLiteral("value"), i.value());
writer->writeEndElement(); // entry
}
writer->writeEndElement(); // opts
}
}
writer->writeEndElement(); // video
writer->writeStartElement(QStringLiteral("audio"));
writer->writeAttribute(QStringLiteral("enabled"), QString::number(audio_enabled_));
if (audio_enabled_) {
writer->writeTextElement(QStringLiteral("codec"), QString::number(audio_codec_));
writer->writeTextElement(QStringLiteral("samplerate"), QString::number(audio_params_.sample_rate()));
writer->writeTextElement(QStringLiteral("channellayout"), QString::number(audio_params_.channel_layout()));
writer->writeTextElement(QStringLiteral("format"), QString::fromStdString(audio_params_.format().to_string()));
writer->writeTextElement(QStringLiteral("bitrate"), QString::number(audio_bit_rate_));
}
writer->writeStartElement(QStringLiteral("subtitles"));
writer->writeAttribute(QStringLiteral("enabled"), QString::number(subtitles_enabled_));
if (subtitles_enabled_) {
writer->writeTextElement(QStringLiteral("sidecar"), QString::number(subtitles_are_sidecar_));
writer->writeTextElement(QStringLiteral("sidecarformat"), QString::number(subtitle_sidecar_fmt_));
writer->writeTextElement(QStringLiteral("codec"), QString::number(subtitles_codec_));
}
writer->writeEndElement(); // subtitles
writer->writeEndElement(); // audio
writer->writeEndElement(); // export
writer->writeEndDocument();
}
Encoder* Encoder::CreateFromID(Type id, const EncodingParams& params)
{
switch (id) {
case kEncoderTypeNone:
break;
case kEncoderTypeFFmpeg:
return new FFmpegEncoder(params);
case kEncoderTypeOIIO:
return new OIIOEncoder(params);
}
return nullptr;
}
Encoder::Type Encoder::GetTypeFromFormat(ExportFormat::Format f)
{
switch (f) {
case ExportFormat::kFormatDNxHD:
case ExportFormat::kFormatMatroska:
case ExportFormat::kFormatQuickTime:
case ExportFormat::kFormatMPEG4Video:
case ExportFormat::kFormatMPEG4Audio:
case ExportFormat::kFormatWAV:
case ExportFormat::kFormatAIFF:
case ExportFormat::kFormatMP3:
case ExportFormat::kFormatFLAC:
case ExportFormat::kFormatOgg:
case ExportFormat::kFormatWebM:
case ExportFormat::kFormatSRT:
return kEncoderTypeFFmpeg;
case ExportFormat::kFormatOpenEXR:
case ExportFormat::kFormatPNG:
case ExportFormat::kFormatTIFF:
return kEncoderTypeOIIO;
case ExportFormat::kFormatCount:
break;
}
return kEncoderTypeNone;
}
Encoder *Encoder::CreateFromFormat(ExportFormat::Format f, const EncodingParams ¶ms)
{
return CreateFromID(GetTypeFromFormat(f), params);
}
Encoder *Encoder::CreateFromParams(const EncodingParams ¶ms)
{
return CreateFromFormat(params.format(), params);
}
QStringList Encoder::GetPixelFormatsForCodec(ExportCodec::Codec c) const
{
return QStringList();
}
std::vector<SampleFormat> Encoder::GetSampleFormatsForCodec(ExportCodec::Codec c) const
{
return std::vector<SampleFormat>();
}
QMatrix4x4 EncodingParams::GenerateMatrix(EncodingParams::VideoScalingMethod method,
int source_width, int source_height,
int dest_width, int dest_height)
{
QMatrix4x4 preview_matrix;
if (method == EncodingParams::kStretch) {
return preview_matrix;
}
float export_ar = static_cast<float>(dest_width) / static_cast<float>(dest_height);
float source_ar = static_cast<float>(source_width) / static_cast<float>(source_height);
if (qFuzzyCompare(export_ar, source_ar)) {
return preview_matrix;
}
if ((export_ar > source_ar) == (method == EncodingParams::kFit)) {
preview_matrix.scale(source_ar / export_ar, 1.0F);
} else {
preview_matrix.scale(1.0F, export_ar / source_ar);
}
return preview_matrix;
}
bool EncodingParams::LoadV1(QXmlStreamReader *reader)
{
rational custom_range_in, custom_range_out;
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("filename")) {
filename_ = reader->readElementText();
} else if (reader->name() == QStringLiteral("format")) {
format_ = static_cast<ExportFormat::Format>(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("range")) {
has_custom_range_ = reader->readElementText().toInt();
} else if (reader->name() == QStringLiteral("customrangein")) {
custom_range_in = rational::fromString(reader->readElementText().toStdString());
} else if (reader->name() == QStringLiteral("customrangeout")) {
custom_range_out = rational::fromString(reader->readElementText().toStdString());
} else if (reader->name() == QStringLiteral("video")) {
XMLAttributeLoop(reader, attr) {
if (attr.name() == QStringLiteral("enabled")) {
video_enabled_ = attr.value().toInt();
}
}
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("codec")) {
video_codec_ = static_cast<ExportCodec::Codec>(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("width")) {
video_params_.set_width(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("height")) {
video_params_.set_height(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("format")) {
video_params_.set_format(static_cast<PixelFormat::Format>(reader->readElementText().toInt()));
} else if (reader->name() == QStringLiteral("pixelaspect")) {
video_params_.set_pixel_aspect_ratio(rational::fromString(reader->readElementText().toStdString()));
} else if (reader->name() == QStringLiteral("timebase")) {
video_params_.set_time_base(rational::fromString(reader->readElementText().toStdString()));
} else if (reader->name() == QStringLiteral("divider")) {
video_params_.set_divider(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("bitrate")) {
video_bit_rate_ = reader->readElementText().toLongLong();
} else if (reader->name() == QStringLiteral("minbitrate")) {
video_min_bit_rate_ = reader->readElementText().toLongLong();
} else if (reader->name() == QStringLiteral("maxbitrate")) {
video_max_bit_rate_ = reader->readElementText().toLongLong();
} else if (reader->name() == QStringLiteral("bufsize")) {
video_buffer_size_ = reader->readElementText().toLongLong();
} else if (reader->name() == QStringLiteral("threads")) {
video_threads_ = reader->readElementText().toInt();
} else if (reader->name() == QStringLiteral("pixfmt")) {
video_pix_fmt_ = reader->readElementText();
} else if (reader->name() == QStringLiteral("imgseq")) {
video_is_image_sequence_ = reader->readElementText().toInt();
} else if (reader->name() == QStringLiteral("color")) {
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("output")) {
color_transform_ = reader->readElementText();
} else {
reader->skipCurrentElement();
}
}
} else if (reader->name() == QStringLiteral("vscale")) {
video_scaling_method_ = static_cast<VideoScalingMethod>(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("opts")) {
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("entry")) {
QString key, value;
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("key")) {
key = reader->readElementText();
} else if (reader->name() == QStringLiteral("value")) {
value = reader->readElementText();
} else {
reader->skipCurrentElement();
}
}
set_video_option(key, value);
} else {
reader->skipCurrentElement();
}
}
} else {
reader->skipCurrentElement();
}
}
// HACK: Resolve bug where I forgot to serialize pixel aspect ratio
if (video_params_.pixel_aspect_ratio().isNull()) {
video_params_.set_pixel_aspect_ratio(1);
}
} else if (reader->name() == QStringLiteral("audio")) {
XMLAttributeLoop(reader, attr) {
if (attr.name() == QStringLiteral("enabled")) {
audio_enabled_ = attr.value().toInt();
}
}
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("codec")) {
audio_codec_ = static_cast<ExportCodec::Codec>(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("samplerate")) {
audio_params_.set_sample_rate(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("channellayout")) {
audio_params_.set_channel_layout(reader->readElementText().toULongLong());
} else if (reader->name() == QStringLiteral("format")) {
audio_params_.set_format(SampleFormat::from_string(reader->readElementText().toStdString()));
} else if (reader->name() == QStringLiteral("bitrate")) {
audio_bit_rate_ = reader->readElementText().toLongLong();
} else {
reader->skipCurrentElement();
}
}
// HACK: Resolve bug where I forgot to serialize the audio bit rate
if (!audio_bit_rate_) {
audio_bit_rate_ = 320000;
}
} else if (reader->name() == QStringLiteral("subtitles")) {
XMLAttributeLoop(reader, attr) {
if (attr.name() == QStringLiteral("enabled")) {
subtitles_enabled_ = attr.value().toInt();
}
}
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("sidecar")) {
subtitles_are_sidecar_ = reader->readElementText().toInt();
} else if (reader->name() == QStringLiteral("sidecarformat")) {
subtitle_sidecar_fmt_ = static_cast<ExportFormat::Format>(reader->readElementText().toInt());
} else if (reader->name() == QStringLiteral("codec")) {
subtitles_codec_ = static_cast<ExportCodec::Codec>(reader->readElementText().toInt());
} else {
reader->skipCurrentElement();
}
}
} else {
reader->skipCurrentElement();
}
}
return true;
}
}
================================================
FILE: app/codec/encoder.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef ENCODER_H
#define ENCODER_H
#include <memory>
#include <QRegularExpression>
#include <QString>
#include <QXmlStreamWriter>
#include "codec/exportcodec.h"
#include "codec/exportformat.h"
#include "codec/frame.h"
#include "node/block/subtitle/subtitle.h"
#include "render/colortransform.h"
#include "render/subtitleparams.h"
#include "render/videoparams.h"
namespace olive {
class Encoder;
using EncoderPtr = std::shared_ptr<Encoder>;
class EncodingParams
{
public:
enum VideoScalingMethod {
kFit,
kStretch,
kCrop
};
EncodingParams();
static QDir GetPresetPath();
static QStringList GetListOfPresets();
bool IsValid() const
{
return video_enabled_ || audio_enabled_ || subtitles_enabled_;
}
void SetFilename(const QString& filename) { filename_ = filename; }
void EnableVideo(const VideoParams& video_params, const ExportCodec::Codec& vcodec);
void EnableAudio(const AudioParams& audio_params, const ExportCodec::Codec &acodec);
void EnableSubtitles(const ExportCodec::Codec &scodec);
void EnableSidecarSubtitles(const ExportFormat::Format &sfmt, const ExportCodec::Codec &scodec);
void DisableVideo();
void DisableAudio();
void DisableSubtitles();
const ExportFormat::Format &format() const { return format_; }
void set_format(const ExportFormat::Format &format) { format_ = format; }
void set_video_option(const QString& key, const QString& value) { video_opts_.insert(key, value); }
void set_video_bit_rate(const int64_t& rate) { video_bit_rate_ = rate; }
void set_video_min_bit_rate(const int64_t& rate) { video_min_bit_rate_ = rate; }
void set_video_max_bit_rate(const int64_t& rate) { video_max_bit_rate_ = rate; }
void set_video_buffer_size(const int64_t& sz) { video_buffer_size_ = sz; }
void set_video_threads(const int& threads) { video_threads_ = threads; }
void set_video_pix_fmt(const QString& s) { video_pix_fmt_ = s; }
void set_video_is_image_sequence(bool s) { video_is_image_sequence_ = s; }
void set_color_transform(const ColorTransform& color_transform) { color_transform_ = color_transform; }
const QString& filename() const { return filename_; }
bool video_enabled() const { return video_enabled_; }
const ExportCodec::Codec& video_codec() const { return video_codec_; }
const VideoParams& video_params() const { return video_params_; }
const QHash<QString, QString>& video_opts() const { return video_opts_; }
QString video_option(const QString &key) const { return video_opts_.value(key); }
bool has_video_opt(const QString &key) const { return video_opts_.contains(key); }
const int64_t& video_bit_rate() const { return video_bit_rate_; }
const int64_t& video_min_bit_rate() const { return video_min_bit_rate_; }
const int64_t& video_max_bit_rate() const { return video_max_bit_rate_; }
const int64_t& video_buffer_size() const { return video_buffer_size_; }
const int& video_threads() const { return video_threads_; }
const QString& video_pix_fmt() const { return video_pix_fmt_; }
bool video_is_image_sequence() const { return video_is_image_sequence_; }
const ColorTransform& color_transform() const { return color_transform_; }
bool audio_enabled() const { return audio_enabled_; }
const ExportCodec::Codec &audio_codec() const { return audio_codec_; }
const AudioParams& audio_params() const { return audio_params_; }
const int64_t& audio_bit_rate() const { return audio_bit_rate_; }
void set_audio_bit_rate(const int64_t& b) { audio_bit_rate_ = b; }
bool subtitles_enabled() const { return subtitles_enabled_; }
bool subtitles_are_sidecar() const { return subtitles_are_sidecar_; }
ExportFormat::Format subtitle_sidecar_fmt() const { return subtitle_sidecar_fmt_; }
ExportCodec::Codec subtitles_codec() const { return subtitles_codec_; }
const rational& GetExportLength() const { return export_length_; }
void SetExportLength(const rational& export_length) { export_length_ = export_length; }
bool Load(QIODevice *device);
bool Load(QXmlStreamReader *reader);
void Save(QIODevice *device) const;
void Save(QXmlStreamWriter* writer) const;
bool has_custom_range() const { return has_custom_range_; }
const TimeRange& custom_range() const { return custom_range_; }
void set_custom_range(const TimeRange& custom_range)
{
has_custom_range_ = true;
custom_range_ = custom_range;
}
const VideoScalingMethod& video_scaling_method() const { return video_scaling_method_; }
void set_video_scaling_method(const VideoScalingMethod& video_scaling_method) { video_scaling_method_ = video_scaling_method; }
static QMatrix4x4 GenerateMatrix(VideoScalingMethod method,
int source_width, int source_height,
int dest_width, int dest_height);
private:
static const int kEncoderParamsVersion = 1;
bool LoadV1(QXmlStreamReader *reader);
QString filename_;
ExportFormat::Format format_;
bool video_enabled_;
ExportCodec::Codec video_codec_;
VideoParams video_params_;
QHash<QString, QString> video_opts_;
int64_t video_bit_rate_;
int64_t video_min_bit_rate_;
int64_t video_max_bit_rate_;
int64_t video_buffer_size_;
int video_threads_;
QString video_pix_fmt_;
bool video_is_image_sequence_;
ColorTransform color_transform_;
bool audio_enabled_;
ExportCodec::Codec audio_codec_;
AudioParams audio_params_;
int64_t audio_bit_rate_;
bool subtitles_enabled_;
bool subtitles_are_sidecar_;
ExportFormat::Format subtitle_sidecar_fmt_;
ExportCodec::Codec subtitles_codec_;
rational export_length_;
VideoScalingMethod video_scaling_method_;
bool has_custom_range_;
TimeRange custom_range_;
};
class Encoder : public QObject
{
Q_OBJECT
public:
Encoder(const EncodingParams& params);
enum Type {
kEncoderTypeNone = -1,
kEncoderTypeFFmpeg,
kEncoderTypeOIIO
};
/**
* @brief Create a Encoder instance using a Encoder ID
*
* @return
*
* A Encoder instance or nullptr if a Decoder with this ID does not exist
*/
static Encoder *CreateFromID(Type id, const EncodingParams ¶ms);
static Type GetTypeFromFormat(ExportFormat::Format f);
static Encoder *CreateFromFormat(ExportFormat::Format f, const EncodingParams ¶ms);
static Encoder *CreateFromParams(const EncodingParams ¶ms);
virtual QStringList GetPixelFormatsForCodec(ExportCodec::Codec c) const;
virtual std::vector<SampleFormat> GetSampleFormatsForCodec(ExportCodec::Codec c) const;
const EncodingParams& params() const;
virtual PixelFormat GetDesiredPixelFormat() const
{
return PixelFormat::INVALID;
}
const QString& GetError() const
{
return error_;
}
QString GetFilenameForFrame(const rational& frame);
static int GetImageSequencePlaceholderDigitCount(const QString& filename);
static bool FilenameContainsDigitPlaceholder(const QString &filename);
static QString FilenameRemoveDigitPlaceholder(QString filename);
static const QRegularExpression kImageSequenceContainsDigits;
static const QRegularExpression kImageSequenceRemoveDigits;
public slots:
virtual bool Open() = 0;
virtual bool WriteFrame(olive::FramePtr frame, olive::core::rational time) = 0;
virtual bool WriteAudio(const olive::SampleBuffer &audio) = 0;
virtual bool WriteSubtitle(const SubtitleBlock *sub_block) = 0;
virtual void Close() = 0;
protected:
void SetError(const QString& err)
{
error_ = err;
}
private:
EncodingParams params_;
QString error_;
};
}
#endif // ENCODER_H
================================================
FILE: app/codec/exportcodec.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "exportcodec.h"
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavutil/pixdesc.h>
}
namespace olive {
QString ExportCodec::GetCodecName(ExportCodec::Codec c)
{
switch (c) {
case kCodecDNxHD:
return tr("DNxHD");
case kCodecH264:
return tr("H.264");
case kCodecH264rgb:
return tr("H.264 RGB");
case kCodecH265:
return tr("H.265");
case kCodecOpenEXR:
return tr("OpenEXR");
case kCodecPNG:
return tr("PNG");
case kCodecProRes:
return tr("ProRes");
case kCodecCineform:
return tr("Cineform");
case kCodecTIFF:
return tr("TIFF");
case kCodecMP2:
return tr("MP2");
case kCodecMP3:
return tr("MP3");
case kCodecAAC:
return tr("AAC");
case kCodecPCM:
return tr("PCM (Uncompressed)");
case kCodecFLAC:
return tr("FLAC");
case kCodecOpus:
return tr("Opus");
case kCodecVorbis:
return tr("Vorbis");
case kCodecVP9:
return tr("VP9");
case kCodecAV1:
return tr("AV1");
case kCodecSRT:
return tr("SubRip SRT");
case kCodecCount:
break;
}
return tr("Unknown");
}
bool ExportCodec::IsCodecAStillImage(ExportCodec::Codec c)
{
switch (c) {
case kCodecDNxHD:
case kCodecH264:
case kCodecH264rgb:
case kCodecH265:
case kCodecProRes:
case kCodecCineform:
case kCodecMP2:
case kCodecMP3:
case kCodecAAC:
case kCodecPCM:
case kCodecVorbis:
case kCodecOpus:
case kCodecFLAC:
case kCodecVP9:
case kCodecAV1:
case kCodecSRT:
return false;
case kCodecOpenEXR:
case kCodecPNG:
case kCodecTIFF:
return true;
case kCodecCount:
break;
}
return false;
}
bool ExportCodec::IsCodecLossless(Codec c)
{
switch (c) {
case kCodecPCM:
case kCodecFLAC:
return true;
case kCodecDNxHD:
case kCodecH264:
case kCodecH264rgb:
case kCodecH265:
case kCodecProRes:
case kCodecCineform:
case kCodecMP2:
case kCodecMP3:
case kCodecAAC:
case kCodecVorbis:
case kCodecOpus:
case kCodecVP9:
case kCodecAV1:
case kCodecSRT:
case kCodecOpenEXR:
case kCodecPNG:
case kCodecTIFF:
case kCodecCount:
break;
}
return false;
}
}
================================================
FILE: app/codec/exportcodec.h
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef EXPORTCODEC_H
#define EXPORTCODEC_H
#include <QObject>
#include <QString>
#include "common/define.h"
#include "render/subtitleparams.h"
namespace olive {
class ExportCodec : public QObject
{
Q_OBJECT
public:
// Only append to this list (never insert) because indexes are used in serialized files
enum Codec {
kCodecDNxHD,
kCodecH264,
kCodecH264rgb,
kCodecH265,
kCodecOpenEXR,
kCodecPNG,
kCodecProRes,
kCodecCineform,
kCodecTIFF,
kCodecVP9,
kCodecMP2,
kCodecMP3,
kCodecAAC,
kCodecPCM,
kCodecOpus,
kCodecVorbis,
kCodecFLAC,
kCodecSRT,
kCodecAV1,
kCodecCount
};
static QString GetCodecName(Codec c);
static bool IsCodecAStillImage(Codec c);
static bool IsCodecLossless(Codec c);
};
}
#endif // EXPORTCODEC_H
================================================
FILE: app/codec/exportformat.cpp
================================================
/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "exportformat.h"
#include "encoder.h"
namespace olive {
QString ExportFormat::GetName(olive::ExportFormat::Format f)
{
switch (f) {
case kFormatDNxHD:
return tr("DNxHD");
case kFormatMatroska:
return tr("Matroska Video");
case kFormatMPEG4Video:
return tr("MPEG-4 Video");
case kFormatMPEG4Audio:
return tr("MPEG-4 Audio");
case kFormatOpenEXR:
return tr("OpenEXR");
case kFormatPNG:
return tr("PNG");
case kFormatTIFF:
return tr("TIFF");
case kFormatQuickTime:
return tr("QuickTime");
case kFormatWAV:
return tr("Wave Audio");
case kFormatAIFF:
return tr("AIFF");
case kFormatMP3:
ret
gitextract_2jek1uqd/ ├── .clang-format ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── 00-olive_unsupported.md │ │ ├── 01-crash_issue.md │ │ ├── 50-build_issue.md │ │ ├── 50-cache_issue.md │ │ ├── 50-codec_issue.md │ │ ├── 50-color_issue.md │ │ ├── 50-editing_issue.md │ │ ├── 50-export_issue.md │ │ ├── 50-node_issue.md │ │ ├── 50-playback_issue.md │ │ ├── 50-project_issue.md │ │ ├── 50-renderer_issue.md │ │ ├── 50-ui_issue.md │ │ └── config.yml │ ├── ISSUE_TEMPLATE.md │ └── workflows/ │ └── ci.yml ├── .gitignore ├── .gitmodules ├── CMakeLists.txt ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app/ │ ├── CMakeLists.txt │ ├── audio/ │ │ ├── CMakeLists.txt │ │ ├── audiomanager.cpp │ │ ├── audiomanager.h │ │ ├── audioprocessor.cpp │ │ ├── audioprocessor.h │ │ ├── audiovisualwaveform.cpp │ │ └── audiovisualwaveform.h │ ├── cli/ │ │ ├── CMakeLists.txt │ │ ├── cliexport/ │ │ │ ├── cliexportmanager.cpp │ │ │ └── cliexportmanager.h │ │ ├── cliprogress/ │ │ │ ├── CMakeLists.txt │ │ │ ├── cliprogressdialog.cpp │ │ │ └── cliprogressdialog.h │ │ └── clitask/ │ │ ├── CMakeLists.txt │ │ ├── clitaskdialog.cpp │ │ └── clitaskdialog.h │ ├── codec/ │ │ ├── CMakeLists.txt │ │ ├── conformmanager.cpp │ │ ├── conformmanager.h │ │ ├── decoder.cpp │ │ ├── decoder.h │ │ ├── encoder.cpp │ │ ├── encoder.h │ │ ├── exportcodec.cpp │ │ ├── exportcodec.h │ │ ├── exportformat.cpp │ │ ├── exportformat.h │ │ ├── ffmpeg/ │ │ │ ├── CMakeLists.txt │ │ │ ├── ffmpegdecoder.cpp │ │ │ ├── ffmpegdecoder.h │ │ │ ├── ffmpegencoder.cpp │ │ │ └── ffmpegencoder.h │ │ ├── frame.cpp │ │ ├── frame.h │ │ ├── oiio/ │ │ │ ├── CMakeLists.txt │ │ │ ├── oiiodecoder.cpp │ │ │ ├── oiiodecoder.h │ │ │ ├── oiioencoder.cpp │ │ │ └── oiioencoder.h │ │ ├── planarfiledevice.cpp │ │ └── planarfiledevice.h │ ├── common/ │ │ ├── CMakeLists.txt │ │ ├── autoscroll.h │ │ ├── cancelableobject.h │ │ ├── channellayout.h │ │ ├── commandlineparser.cpp │ │ ├── commandlineparser.h │ │ ├── crashpadinterface.cpp │ │ ├── crashpadinterface.h │ │ ├── crashpadutils.h │ │ ├── debug.cpp │ │ ├── debug.h │ │ ├── decibel.h │ │ ├── define.h │ │ ├── digit.h │ │ ├── ffmpegutils.cpp │ │ ├── ffmpegutils.h │ │ ├── filefunctions.cpp │ │ ├── filefunctions.h │ │ ├── html.cpp │ │ ├── html.h │ │ ├── jobtime.cpp │ │ ├── jobtime.h │ │ ├── lerp.h │ │ ├── memorypool.h │ │ ├── ocioutils.cpp │ │ ├── ocioutils.h │ │ ├── oiioutils.cpp │ │ ├── oiioutils.h │ │ ├── otioutils.h │ │ ├── power.h │ │ ├── qtutils.cpp │ │ ├── qtutils.h │ │ ├── range.h │ │ ├── ratiodialog.cpp │ │ ├── ratiodialog.h │ │ ├── threadsafemap.h │ │ ├── tohex.h │ │ ├── util.h │ │ ├── xmlutils.cpp │ │ └── xmlutils.h │ ├── config/ │ │ ├── CMakeLists.txt │ │ ├── config.cpp │ │ └── config.h │ ├── core.cpp │ ├── core.h │ ├── crashhandler/ │ │ ├── CMakeLists.txt │ │ ├── crashhandler.cpp │ │ └── crashhandler.h │ ├── dialog/ │ │ ├── CMakeLists.txt │ │ ├── about/ │ │ │ ├── CMakeLists.txt │ │ │ ├── about.cpp │ │ │ ├── about.h │ │ │ ├── patreon.h │ │ │ ├── patreon.py │ │ │ ├── scrollinglabel.cpp │ │ │ └── scrollinglabel.h │ │ ├── actionsearch/ │ │ │ ├── CMakeLists.txt │ │ │ ├── actionsearch.cpp │ │ │ └── actionsearch.h │ │ ├── autorecovery/ │ │ │ ├── CMakeLists.txt │ │ │ ├── autorecoverydialog.cpp │ │ │ └── autorecoverydialog.h │ │ ├── color/ │ │ │ ├── CMakeLists.txt │ │ │ ├── colordialog.cpp │ │ │ └── colordialog.h │ │ ├── configbase/ │ │ │ ├── CMakeLists.txt │ │ │ ├── configdialogbase.cpp │ │ │ ├── configdialogbase.h │ │ │ ├── configdialogbasetab.cpp │ │ │ └── configdialogbasetab.h │ │ ├── diskcache/ │ │ │ ├── CMakeLists.txt │ │ │ ├── diskcachedialog.cpp │ │ │ └── diskcachedialog.h │ │ ├── export/ │ │ │ ├── CMakeLists.txt │ │ │ ├── codec/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── av1section.cpp │ │ │ │ ├── av1section.h │ │ │ │ ├── cineformsection.cpp │ │ │ │ ├── cineformsection.h │ │ │ │ ├── codecsection.cpp │ │ │ │ ├── codecsection.h │ │ │ │ ├── codecstack.cpp │ │ │ │ ├── codecstack.h │ │ │ │ ├── h264section.cpp │ │ │ │ ├── h264section.h │ │ │ │ ├── imagesection.cpp │ │ │ │ └── imagesection.h │ │ │ ├── export.cpp │ │ │ ├── export.h │ │ │ ├── exportadvancedvideodialog.cpp │ │ │ ├── exportadvancedvideodialog.h │ │ │ ├── exportaudiotab.cpp │ │ │ ├── exportaudiotab.h │ │ │ ├── exportformatcombobox.cpp │ │ │ ├── exportformatcombobox.h │ │ │ ├── exportsavepresetdialog.cpp │ │ │ ├── exportsavepresetdialog.h │ │ │ ├── exportsubtitlestab.cpp │ │ │ ├── exportsubtitlestab.h │ │ │ ├── exportvideotab.cpp │ │ │ └── exportvideotab.h │ │ ├── footageproperties/ │ │ │ ├── CMakeLists.txt │ │ │ ├── footageproperties.cpp │ │ │ ├── footageproperties.h │ │ │ └── streamproperties/ │ │ │ ├── CMakeLists.txt │ │ │ ├── audiostreamproperties.cpp │ │ │ ├── audiostreamproperties.h │ │ │ ├── streamproperties.cpp │ │ │ ├── streamproperties.h │ │ │ ├── videostreamproperties.cpp │ │ │ └── videostreamproperties.h │ │ ├── footagerelink/ │ │ │ ├── CMakeLists.txt │ │ │ ├── footagerelinkdialog.cpp │ │ │ └── footagerelinkdialog.h │ │ ├── keyframeproperties/ │ │ │ ├── CMakeLists.txt │ │ │ ├── keyframeproperties.cpp │ │ │ └── keyframeproperties.h │ │ ├── markerproperties/ │ │ │ ├── CMakeLists.txt │ │ │ ├── markerpropertiesdialog.cpp │ │ │ └── markerpropertiesdialog.h │ │ ├── otioproperties/ │ │ │ ├── CMakeLists.txt │ │ │ ├── otiopropertiesdialog.cpp │ │ │ └── otiopropertiesdialog.h │ │ ├── preferences/ │ │ │ ├── CMakeLists.txt │ │ │ ├── keysequenceeditor.cpp │ │ │ ├── keysequenceeditor.h │ │ │ ├── preferences.cpp │ │ │ ├── preferences.h │ │ │ └── tabs/ │ │ │ ├── CMakeLists.txt │ │ │ ├── preferencesappearancetab.cpp │ │ │ ├── preferencesappearancetab.h │ │ │ ├── preferencesaudiotab.cpp │ │ │ ├── preferencesaudiotab.h │ │ │ ├── preferencesbehaviortab.cpp │ │ │ ├── preferencesbehaviortab.h │ │ │ ├── preferencesdisktab.cpp │ │ │ ├── preferencesdisktab.h │ │ │ ├── preferencesgeneraltab.cpp │ │ │ ├── preferencesgeneraltab.h │ │ │ ├── preferenceskeyboardtab.cpp │ │ │ └── preferenceskeyboardtab.h │ │ ├── progress/ │ │ │ ├── CMakeLists.txt │ │ │ ├── progress.cpp │ │ │ └── progress.h │ │ ├── projectproperties/ │ │ │ ├── CMakeLists.txt │ │ │ ├── projectproperties.cpp │ │ │ └── projectproperties.h │ │ ├── rendercancel/ │ │ │ ├── CMakeLists.txt │ │ │ ├── rendercancel.cpp │ │ │ └── rendercancel.h │ │ ├── sequence/ │ │ │ ├── CMakeLists.txt │ │ │ ├── presetmanager.h │ │ │ ├── sequence.cpp │ │ │ ├── sequence.h │ │ │ ├── sequencedialogparametertab.cpp │ │ │ ├── sequencedialogparametertab.h │ │ │ ├── sequencedialogpresettab.cpp │ │ │ ├── sequencedialogpresettab.h │ │ │ └── sequencepreset.h │ │ ├── speedduration/ │ │ │ ├── CMakeLists.txt │ │ │ ├── speeddurationdialog.cpp │ │ │ └── speeddurationdialog.h │ │ ├── task/ │ │ │ ├── CMakeLists.txt │ │ │ ├── task.cpp │ │ │ └── task.h │ │ └── text/ │ │ ├── CMakeLists.txt │ │ ├── text.cpp │ │ └── text.h │ ├── main.cpp │ ├── node/ │ │ ├── CMakeLists.txt │ │ ├── audio/ │ │ │ ├── CMakeLists.txt │ │ │ ├── pan/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── pan.cpp │ │ │ │ └── pan.h │ │ │ └── volume/ │ │ │ ├── CMakeLists.txt │ │ │ ├── volume.cpp │ │ │ └── volume.h │ │ ├── block/ │ │ │ ├── CMakeLists.txt │ │ │ ├── block.cpp │ │ │ ├── block.h │ │ │ ├── clip/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── clip.cpp │ │ │ │ └── clip.h │ │ │ ├── gap/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── gap.cpp │ │ │ │ └── gap.h │ │ │ ├── subtitle/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── subtitle.cpp │ │ │ │ └── subtitle.h │ │ │ └── transition/ │ │ │ ├── CMakeLists.txt │ │ │ ├── crossdissolve/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── crossdissolvetransition.cpp │ │ │ │ └── crossdissolvetransition.h │ │ │ ├── diptocolor/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── diptocolortransition.cpp │ │ │ │ └── diptocolortransition.h │ │ │ ├── transition.cpp │ │ │ └── transition.h │ │ ├── color/ │ │ │ ├── CMakeLists.txt │ │ │ ├── colormanager/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── colormanager.cpp │ │ │ │ └── colormanager.h │ │ │ ├── displaytransform/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── displaytransform.cpp │ │ │ │ └── displaytransform.h │ │ │ ├── ociobase/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── ociobase.cpp │ │ │ │ └── ociobase.h │ │ │ └── ociogradingtransformlinear/ │ │ │ ├── CMakeLists.txt │ │ │ ├── ociogradingtransformlinear.cpp │ │ │ └── ociogradingtransformlinear.h │ │ ├── distort/ │ │ │ ├── CMakeLists.txt │ │ │ ├── cornerpin/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── cornerpindistortnode.cpp │ │ │ │ └── cornerpindistortnode.h │ │ │ ├── crop/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── cropdistortnode.cpp │ │ │ │ └── cropdistortnode.h │ │ │ ├── flip/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── flipdistortnode.cpp │ │ │ │ └── flipdistortnode.h │ │ │ ├── mask/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── mask.cpp │ │ │ │ └── mask.h │ │ │ ├── ripple/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── rippledistortnode.cpp │ │ │ │ └── rippledistortnode.h │ │ │ ├── swirl/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── swirldistortnode.cpp │ │ │ │ └── swirldistortnode.h │ │ │ ├── tile/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── tiledistortnode.cpp │ │ │ │ └── tiledistortnode.h │ │ │ ├── transform/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── transformdistortnode.cpp │ │ │ │ └── transformdistortnode.h │ │ │ └── wave/ │ │ │ ├── CMakeLists.txt │ │ │ ├── wavedistortnode.cpp │ │ │ └── wavedistortnode.h │ │ ├── effect/ │ │ │ ├── CMakeLists.txt │ │ │ └── opacity/ │ │ │ ├── CMakeLists.txt │ │ │ ├── opacityeffect.cpp │ │ │ └── opacityeffect.h │ │ ├── factory.cpp │ │ ├── factory.h │ │ ├── filter/ │ │ │ ├── CMakeLists.txt │ │ │ ├── blur/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── blur.cpp │ │ │ │ └── blur.h │ │ │ ├── dropshadow/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── dropshadowfilter.cpp │ │ │ │ └── dropshadowfilter.h │ │ │ ├── mosaic/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── mosaicfilternode.cpp │ │ │ │ └── mosaicfilternode.h │ │ │ └── stroke/ │ │ │ ├── CMakeLists.txt │ │ │ ├── stroke.cpp │ │ │ └── stroke.h │ │ ├── generator/ │ │ │ ├── CMakeLists.txt │ │ │ ├── matrix/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── matrix.cpp │ │ │ │ └── matrix.h │ │ │ ├── noise/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── noise.cpp │ │ │ │ └── noise.h │ │ │ ├── polygon/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── polygon.cpp │ │ │ │ └── polygon.h │ │ │ ├── shape/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── generatorwithmerge.cpp │ │ │ │ ├── generatorwithmerge.h │ │ │ │ ├── shapenode.cpp │ │ │ │ ├── shapenode.h │ │ │ │ ├── shapenodebase.cpp │ │ │ │ └── shapenodebase.h │ │ │ ├── solid/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── solid.cpp │ │ │ │ └── solid.h │ │ │ └── text/ │ │ │ ├── CMakeLists.txt │ │ │ ├── textv1.cpp │ │ │ ├── textv1.h │ │ │ ├── textv2.cpp │ │ │ ├── textv2.h │ │ │ ├── textv3.cpp │ │ │ └── textv3.h │ │ ├── gizmo/ │ │ │ ├── CMakeLists.txt │ │ │ ├── draggable.cpp │ │ │ ├── draggable.h │ │ │ ├── gizmo.cpp │ │ │ ├── gizmo.h │ │ │ ├── line.cpp │ │ │ ├── line.h │ │ │ ├── path.cpp │ │ │ ├── path.h │ │ │ ├── point.cpp │ │ │ ├── point.h │ │ │ ├── polygon.cpp │ │ │ ├── polygon.h │ │ │ ├── screen.cpp │ │ │ ├── screen.h │ │ │ ├── text.cpp │ │ │ └── text.h │ │ ├── globals.cpp │ │ ├── globals.h │ │ ├── group/ │ │ │ ├── CMakeLists.txt │ │ │ ├── group.cpp │ │ │ └── group.h │ │ ├── input/ │ │ │ ├── CMakeLists.txt │ │ │ ├── multicam/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── multicamnode.cpp │ │ │ │ └── multicamnode.h │ │ │ ├── time/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── timeinput.cpp │ │ │ │ └── timeinput.h │ │ │ └── value/ │ │ │ ├── CMakeLists.txt │ │ │ ├── valuenode.cpp │ │ │ └── valuenode.h │ │ ├── inputdragger.cpp │ │ ├── inputdragger.h │ │ ├── inputimmediate.cpp │ │ ├── inputimmediate.h │ │ ├── keyframe.cpp │ │ ├── keyframe.h │ │ ├── keying/ │ │ │ ├── CMakeLists.txt │ │ │ ├── chromakey/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── chromakey.cpp │ │ │ │ └── chromakey.h │ │ │ ├── colordifferencekey/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── colordifferencekey.cpp │ │ │ │ └── colordifferencekey.h │ │ │ └── despill/ │ │ │ ├── CMakeLists.txt │ │ │ ├── despill.cpp │ │ │ └── despill.h │ │ ├── math/ │ │ │ ├── CMakeLists.txt │ │ │ ├── math/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── math.cpp │ │ │ │ ├── math.h │ │ │ │ ├── mathbase.cpp │ │ │ │ └── mathbase.h │ │ │ ├── merge/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── merge.cpp │ │ │ │ └── merge.h │ │ │ └── trigonometry/ │ │ │ ├── CMakeLists.txt │ │ │ ├── trigonometry.cpp │ │ │ └── trigonometry.h │ │ ├── node.cpp │ │ ├── node.h │ │ ├── nodeundo.cpp │ │ ├── nodeundo.h │ │ ├── output/ │ │ │ ├── CMakeLists.txt │ │ │ ├── track/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── track.cpp │ │ │ │ ├── track.h │ │ │ │ ├── tracklist.cpp │ │ │ │ └── tracklist.h │ │ │ └── viewer/ │ │ │ ├── CMakeLists.txt │ │ │ ├── viewer.cpp │ │ │ └── viewer.h │ │ ├── param.cpp │ │ ├── param.h │ │ ├── project/ │ │ │ ├── CMakeLists.txt │ │ │ ├── folder/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── folder.cpp │ │ │ │ └── folder.h │ │ │ ├── footage/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── footage.cpp │ │ │ │ ├── footage.h │ │ │ │ ├── footagedescription.cpp │ │ │ │ └── footagedescription.h │ │ │ ├── sequence/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── sequence.cpp │ │ │ │ └── sequence.h │ │ │ └── serializer/ │ │ │ ├── CMakeLists.txt │ │ │ ├── serializer.cpp │ │ │ ├── serializer.h │ │ │ ├── serializer190219.cpp │ │ │ ├── serializer190219.h │ │ │ ├── serializer210528.cpp │ │ │ ├── serializer210528.h │ │ │ ├── serializer210907.cpp │ │ │ ├── serializer210907.h │ │ │ ├── serializer211228.cpp │ │ │ ├── serializer211228.h │ │ │ ├── serializer220403.cpp │ │ │ ├── serializer220403.h │ │ │ ├── serializer230220.cpp │ │ │ ├── serializer230220.h │ │ │ ├── typeserializer.cpp │ │ │ └── typeserializer.h │ │ ├── project.cpp │ │ ├── project.h │ │ ├── serializeddata.cpp │ │ ├── serializeddata.h │ │ ├── splitvalue.h │ │ ├── time/ │ │ │ ├── CMakeLists.txt │ │ │ ├── timeformat/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── timeformat.cpp │ │ │ │ └── timeformat.h │ │ │ ├── timeoffset/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── timeoffsetnode.cpp │ │ │ │ └── timeoffsetnode.h │ │ │ └── timeremap/ │ │ │ ├── CMakeLists.txt │ │ │ ├── timeremap.cpp │ │ │ └── timeremap.h │ │ ├── traverser.cpp │ │ ├── traverser.h │ │ ├── value.cpp │ │ ├── value.h │ │ ├── valuedatabase.cpp │ │ └── valuedatabase.h │ ├── packaging/ │ │ ├── CMakeLists.txt │ │ ├── linux/ │ │ │ ├── AppRun │ │ │ ├── CMakeLists.txt │ │ │ ├── org.olivevideoeditor.Olive.appdata.xml.in │ │ │ ├── org.olivevideoeditor.Olive.desktop │ │ │ └── org.olivevideoeditor.Olive.xml │ │ ├── macos/ │ │ │ ├── MacOSXBundleInfo.plist.in │ │ │ └── olive.icns │ │ └── windows/ │ │ ├── nsis/ │ │ │ └── olive.nsi │ │ ├── resources.rc │ │ └── version.h │ ├── panel/ │ │ ├── CMakeLists.txt │ │ ├── audiomonitor/ │ │ │ ├── CMakeLists.txt │ │ │ ├── audiomonitor.cpp │ │ │ └── audiomonitor.h │ │ ├── curve/ │ │ │ ├── CMakeLists.txt │ │ │ ├── curve.cpp │ │ │ └── curve.h │ │ ├── footageviewer/ │ │ │ ├── CMakeLists.txt │ │ │ ├── footageviewer.cpp │ │ │ └── footageviewer.h │ │ ├── history/ │ │ │ ├── CMakeLists.txt │ │ │ ├── historypanel.cpp │ │ │ └── historypanel.h │ │ ├── multicam/ │ │ │ ├── CMakeLists.txt │ │ │ ├── multicampanel.cpp │ │ │ └── multicampanel.h │ │ ├── node/ │ │ │ ├── CMakeLists.txt │ │ │ ├── node.cpp │ │ │ └── node.h │ │ ├── panel.cpp │ │ ├── panel.h │ │ ├── panelmanager.cpp │ │ ├── panelmanager.h │ │ ├── param/ │ │ │ ├── CMakeLists.txt │ │ │ ├── param.cpp │ │ │ └── param.h │ │ ├── pixelsampler/ │ │ │ ├── CMakeLists.txt │ │ │ ├── pixelsamplerpanel.cpp │ │ │ └── pixelsamplerpanel.h │ │ ├── project/ │ │ │ ├── CMakeLists.txt │ │ │ ├── footagemanagementpanel.h │ │ │ ├── project.cpp │ │ │ └── project.h │ │ ├── scope/ │ │ │ ├── CMakeLists.txt │ │ │ ├── scope.cpp │ │ │ └── scope.h │ │ ├── sequenceviewer/ │ │ │ ├── CMakeLists.txt │ │ │ ├── sequenceviewer.cpp │ │ │ └── sequenceviewer.h │ │ ├── table/ │ │ │ ├── CMakeLists.txt │ │ │ ├── table.cpp │ │ │ └── table.h │ │ ├── taskmanager/ │ │ │ ├── CMakeLists.txt │ │ │ ├── taskmanager.cpp │ │ │ └── taskmanager.h │ │ ├── timebased/ │ │ │ ├── CMakeLists.txt │ │ │ ├── timebased.cpp │ │ │ └── timebased.h │ │ ├── timeline/ │ │ │ ├── CMakeLists.txt │ │ │ ├── timeline.cpp │ │ │ └── timeline.h │ │ ├── tool/ │ │ │ ├── CMakeLists.txt │ │ │ ├── tool.cpp │ │ │ └── tool.h │ │ └── viewer/ │ │ ├── CMakeLists.txt │ │ ├── viewer.cpp │ │ ├── viewer.h │ │ ├── viewerbase.cpp │ │ └── viewerbase.h │ ├── render/ │ │ ├── CMakeLists.txt │ │ ├── alphaassoc.h │ │ ├── audioplaybackcache.cpp │ │ ├── audioplaybackcache.h │ │ ├── audiowaveformcache.cpp │ │ ├── audiowaveformcache.h │ │ ├── cancelatom.h │ │ ├── colorprocessor.cpp │ │ ├── colorprocessor.h │ │ ├── colorprocessorcache.h │ │ ├── colortransform.h │ │ ├── diskmanager.cpp │ │ ├── diskmanager.h │ │ ├── framehashcache.cpp │ │ ├── framehashcache.h │ │ ├── framemanager.cpp │ │ ├── framemanager.h │ │ ├── job/ │ │ │ ├── CMakeLists.txt │ │ │ ├── acceleratedjob.cpp │ │ │ ├── acceleratedjob.h │ │ │ ├── cachejob.h │ │ │ ├── colortransformjob.h │ │ │ ├── footagejob.h │ │ │ ├── generatejob.h │ │ │ ├── samplejob.h │ │ │ └── shaderjob.h │ │ ├── loopmode.h │ │ ├── managedcolor.cpp │ │ ├── managedcolor.h │ │ ├── ocioconf/ │ │ │ ├── CMakeLists.txt │ │ │ ├── config.ocio │ │ │ ├── looks/ │ │ │ │ ├── Filmic_False_Colour.spi3d │ │ │ │ ├── Filmic_to_0-35_1-30.spi1d │ │ │ │ ├── Filmic_to_0-48_1-09.spi1d │ │ │ │ ├── Filmic_to_0-60_1-04.spi1d │ │ │ │ ├── Filmic_to_0-70_1-03.spi1d │ │ │ │ ├── Filmic_to_0-85_1-011.spi1d │ │ │ │ ├── Filmic_to_0.99_1-0075.spi1d │ │ │ │ └── Filmic_to_1.20_1-00.spi1d │ │ │ ├── luts/ │ │ │ │ ├── Blackmagic_FilmWideGamut_Gen5_to_linear.spi1d │ │ │ │ ├── F-Log_to_Linear.spi1d │ │ │ │ ├── V-Log_to_linear.spi1d │ │ │ │ ├── V3_LogC_400_to_linear.spi1d │ │ │ │ ├── V3_LogC_800_to_linear.spi1d │ │ │ │ ├── desat65cube.spi3d │ │ │ │ ├── rec709_to_linear.spi1d │ │ │ │ └── sRGB_OETF_to_Linear.spi1d │ │ │ └── ocioconf.qrc.in │ │ ├── opengl/ │ │ │ ├── CMakeLists.txt │ │ │ ├── openglrenderer.cpp │ │ │ └── openglrenderer.h │ │ ├── playbackcache.cpp │ │ ├── playbackcache.h │ │ ├── previewaudiodevice.cpp │ │ ├── previewaudiodevice.h │ │ ├── previewautocacher.cpp │ │ ├── previewautocacher.h │ │ ├── projectcopier.cpp │ │ ├── projectcopier.h │ │ ├── rendercache.h │ │ ├── renderer.cpp │ │ ├── renderer.h │ │ ├── renderjobtracker.cpp │ │ ├── renderjobtracker.h │ │ ├── rendermanager.cpp │ │ ├── rendermanager.h │ │ ├── rendermodes.h │ │ ├── renderprocessor.cpp │ │ ├── renderprocessor.h │ │ ├── renderticket.cpp │ │ ├── renderticket.h │ │ ├── shadercode.h │ │ ├── subtitleparams.cpp │ │ ├── subtitleparams.h │ │ ├── texture.cpp │ │ ├── texture.h │ │ ├── videoparams.cpp │ │ └── videoparams.h │ ├── shaders/ │ │ ├── CMakeLists.txt │ │ ├── alphaover.frag │ │ ├── blur.frag │ │ ├── chromakey.frag │ │ ├── colordifferencekey.frag │ │ ├── colormanage.frag │ │ ├── cornerpin.frag │ │ ├── cornerpin.vert │ │ ├── crop.frag │ │ ├── crossdissolve.frag │ │ ├── default.frag │ │ ├── default.vert │ │ ├── deinterlace.frag │ │ ├── deinterlace2.frag │ │ ├── despill.frag │ │ ├── diptoblack.frag │ │ ├── dropshadow.frag │ │ ├── flip.frag │ │ ├── interlace.frag │ │ ├── invertrgb.frag │ │ ├── invertrgba.frag │ │ ├── mosaic.frag │ │ ├── multiply.frag │ │ ├── noise.frag │ │ ├── opacity.frag │ │ ├── opacity_rgb.frag │ │ ├── rgb.frag │ │ ├── rgbhistogram.frag │ │ ├── rgbhistogram.vert │ │ ├── rgbhistogram_secondary.frag │ │ ├── rgbwaveform.frag │ │ ├── rgbwaveform.vert │ │ ├── ripple.frag │ │ ├── shaders.qrc.in │ │ ├── shape.frag │ │ ├── solid.frag │ │ ├── stroke.frag │ │ ├── swirl.frag │ │ ├── tile.frag │ │ ├── wave.frag │ │ └── yuv2rgb.frag │ ├── task/ │ │ ├── CMakeLists.txt │ │ ├── conform/ │ │ │ ├── CMakeLists.txt │ │ │ ├── conform.cpp │ │ │ └── conform.h │ │ ├── customcache/ │ │ │ ├── CMakeLists.txt │ │ │ ├── customcachetask.cpp │ │ │ └── customcachetask.h │ │ ├── export/ │ │ │ ├── CMakeLists.txt │ │ │ ├── export.cpp │ │ │ └── export.h │ │ ├── precache/ │ │ │ ├── CMakeLists.txt │ │ │ ├── precachetask.cpp │ │ │ └── precachetask.h │ │ ├── project/ │ │ │ ├── CMakeLists.txt │ │ │ ├── import/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── import.cpp │ │ │ │ ├── import.h │ │ │ │ ├── importerrordialog.cpp │ │ │ │ └── importerrordialog.h │ │ │ ├── load/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── load.cpp │ │ │ │ ├── load.h │ │ │ │ ├── loadbasetask.cpp │ │ │ │ └── loadbasetask.h │ │ │ ├── loadotio/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── loadotio.cpp │ │ │ │ └── loadotio.h │ │ │ ├── save/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── save.cpp │ │ │ │ └── save.h │ │ │ └── saveotio/ │ │ │ ├── CMakeLists.txt │ │ │ ├── saveotio.cpp │ │ │ └── saveotio.h │ │ ├── render/ │ │ │ ├── CMakeLists.txt │ │ │ ├── render.cpp │ │ │ └── render.h │ │ ├── task.h │ │ ├── taskmanager.cpp │ │ └── taskmanager.h │ ├── timeline/ │ │ ├── CMakeLists.txt │ │ ├── timelinecommon.h │ │ ├── timelinecoordinate.cpp │ │ ├── timelinecoordinate.h │ │ ├── timelinemarker.cpp │ │ ├── timelinemarker.h │ │ ├── timelineundocommon.h │ │ ├── timelineundogeneral.cpp │ │ ├── timelineundogeneral.h │ │ ├── timelineundopointer.cpp │ │ ├── timelineundopointer.h │ │ ├── timelineundoripple.cpp │ │ ├── timelineundoripple.h │ │ ├── timelineundosplit.cpp │ │ ├── timelineundosplit.h │ │ ├── timelineundotrack.cpp │ │ ├── timelineundotrack.h │ │ ├── timelineundoworkarea.cpp │ │ ├── timelineundoworkarea.h │ │ ├── timelineworkarea.cpp │ │ └── timelineworkarea.h │ ├── tool/ │ │ ├── CMakeLists.txt │ │ └── tool.h │ ├── ts/ │ │ ├── CMakeLists.txt │ │ ├── ar_AR.ts │ │ ├── bs_BA.ts │ │ ├── cs_CZ.ts │ │ ├── de_DE.ts │ │ ├── en_US.ts │ │ ├── es_ES.ts │ │ ├── fr_FR.ts │ │ ├── hr_HR.ts │ │ ├── id_ID.ts │ │ ├── it_IT.ts │ │ ├── ja_JP.ts │ │ ├── pt_BR.ts │ │ ├── ru_RU.ts │ │ ├── sr_RS.ts │ │ ├── tr_TR.ts │ │ ├── translations.qrc.in │ │ ├── uk_UK.ts │ │ ├── zh_CN.ts │ │ └── zh_TW.ts │ ├── ui/ │ │ ├── CMakeLists.txt │ │ ├── colorcoding.cpp │ │ ├── colorcoding.h │ │ ├── cursors/ │ │ │ ├── CMakeLists.txt │ │ │ └── cursors.qrc │ │ ├── graphics/ │ │ │ ├── CMakeLists.txt │ │ │ └── graphics.qrc │ │ ├── humanstrings.cpp │ │ ├── humanstrings.h │ │ ├── icons/ │ │ │ ├── CMakeLists.txt │ │ │ ├── icons.cpp │ │ │ └── icons.h │ │ └── style/ │ │ ├── CMakeLists.txt │ │ ├── HOWTO.md │ │ ├── generate-style.sh │ │ ├── olive-dark/ │ │ │ ├── CMakeLists.txt │ │ │ ├── palette.ini │ │ │ ├── res.qrc.in │ │ │ └── style.css │ │ ├── olive-light/ │ │ │ ├── CMakeLists.txt │ │ │ ├── palette.ini │ │ │ ├── res.qrc.in │ │ │ ├── style.css │ │ │ └── svg/ │ │ │ └── convert-to-dark.sh │ │ ├── style.cpp │ │ └── style.h │ ├── undo/ │ │ ├── CMakeLists.txt │ │ ├── undocommand.cpp │ │ ├── undocommand.h │ │ ├── undostack.cpp │ │ └── undostack.h │ ├── version.cpp │ ├── version.h │ ├── widget/ │ │ ├── CMakeLists.txt │ │ ├── audiomonitor/ │ │ │ ├── CMakeLists.txt │ │ │ ├── audiomonitor.cpp │ │ │ └── audiomonitor.h │ │ ├── bezier/ │ │ │ ├── CMakeLists.txt │ │ │ ├── bezierwidget.cpp │ │ │ └── bezierwidget.h │ │ ├── clickablelabel/ │ │ │ ├── CMakeLists.txt │ │ │ ├── clickablelabel.cpp │ │ │ └── clickablelabel.h │ │ ├── collapsebutton/ │ │ │ ├── CMakeLists.txt │ │ │ ├── collapsebutton.cpp │ │ │ └── collapsebutton.h │ │ ├── colorbutton/ │ │ │ ├── CMakeLists.txt │ │ │ ├── colorbutton.cpp │ │ │ └── colorbutton.h │ │ ├── colorlabelmenu/ │ │ │ ├── CMakeLists.txt │ │ │ ├── colorcodingcombobox.cpp │ │ │ ├── colorcodingcombobox.h │ │ │ ├── colorlabelmenu.cpp │ │ │ └── colorlabelmenu.h │ │ ├── colorwheel/ │ │ │ ├── CMakeLists.txt │ │ │ ├── colorgradientwidget.cpp │ │ │ ├── colorgradientwidget.h │ │ │ ├── colorpreviewbox.cpp │ │ │ ├── colorpreviewbox.h │ │ │ ├── colorspacechooser.cpp │ │ │ ├── colorspacechooser.h │ │ │ ├── colorswatchchooser.cpp │ │ │ ├── colorswatchchooser.h │ │ │ ├── colorswatchwidget.cpp │ │ │ ├── colorswatchwidget.h │ │ │ ├── colorvalueswidget.cpp │ │ │ ├── colorvalueswidget.h │ │ │ ├── colorwheelwidget.cpp │ │ │ └── colorwheelwidget.h │ │ ├── columnedgridlayout/ │ │ │ ├── CMakeLists.txt │ │ │ ├── columnedgridlayout.cpp │ │ │ └── columnedgridlayout.h │ │ ├── curvewidget/ │ │ │ ├── CMakeLists.txt │ │ │ ├── curveview.cpp │ │ │ ├── curveview.h │ │ │ ├── curvewidget.cpp │ │ │ └── curvewidget.h │ │ ├── filefield/ │ │ │ ├── CMakeLists.txt │ │ │ ├── filefield.cpp │ │ │ └── filefield.h │ │ ├── flowlayout/ │ │ │ ├── CMakeLists.txt │ │ │ ├── flowlayout.cpp │ │ │ └── flowlayout.h │ │ ├── focusablelineedit/ │ │ │ ├── CMakeLists.txt │ │ │ ├── focusablelineedit.cpp │ │ │ └── focusablelineedit.h │ │ ├── handmovableview/ │ │ │ ├── CMakeLists.txt │ │ │ ├── handmovableview.cpp │ │ │ └── handmovableview.h │ │ ├── history/ │ │ │ ├── CMakeLists.txt │ │ │ ├── historywidget.cpp │ │ │ └── historywidget.h │ │ ├── keyframeview/ │ │ │ ├── CMakeLists.txt │ │ │ ├── keyframeview.cpp │ │ │ ├── keyframeview.h │ │ │ ├── keyframeviewinputconnection.cpp │ │ │ ├── keyframeviewinputconnection.h │ │ │ ├── keyframeviewundo.cpp │ │ │ └── keyframeviewundo.h │ │ ├── manageddisplay/ │ │ │ ├── CMakeLists.txt │ │ │ ├── manageddisplay.cpp │ │ │ └── manageddisplay.h │ │ ├── menu/ │ │ │ ├── CMakeLists.txt │ │ │ ├── menu.cpp │ │ │ ├── menu.h │ │ │ ├── menushared.cpp │ │ │ └── menushared.h │ │ ├── multicam/ │ │ │ ├── CMakeLists.txt │ │ │ ├── multicamdisplay.cpp │ │ │ ├── multicamdisplay.h │ │ │ ├── multicamwidget.cpp │ │ │ └── multicamwidget.h │ │ ├── nodecombobox/ │ │ │ ├── CMakeLists.txt │ │ │ ├── nodecombobox.cpp │ │ │ └── nodecombobox.h │ │ ├── nodeparamview/ │ │ │ ├── CMakeLists.txt │ │ │ ├── nodeparamview.cpp │ │ │ ├── nodeparamview.h │ │ │ ├── nodeparamviewarraywidget.cpp │ │ │ ├── nodeparamviewarraywidget.h │ │ │ ├── nodeparamviewconnectedlabel.cpp │ │ │ ├── nodeparamviewconnectedlabel.h │ │ │ ├── nodeparamviewcontext.cpp │ │ │ ├── nodeparamviewcontext.h │ │ │ ├── nodeparamviewdockarea.cpp │ │ │ ├── nodeparamviewdockarea.h │ │ │ ├── nodeparamviewitem.cpp │ │ │ ├── nodeparamviewitem.h │ │ │ ├── nodeparamviewitembase.cpp │ │ │ ├── nodeparamviewitembase.h │ │ │ ├── nodeparamviewitemtitlebar.cpp │ │ │ ├── nodeparamviewitemtitlebar.h │ │ │ ├── nodeparamviewkeyframecontrol.cpp │ │ │ ├── nodeparamviewkeyframecontrol.h │ │ │ ├── nodeparamviewtextedit.cpp │ │ │ ├── nodeparamviewtextedit.h │ │ │ ├── nodeparamviewwidgetbridge.cpp │ │ │ └── nodeparamviewwidgetbridge.h │ │ ├── nodetableview/ │ │ │ ├── CMakeLists.txt │ │ │ ├── nodetableview.cpp │ │ │ ├── nodetableview.h │ │ │ ├── nodetablewidget.cpp │ │ │ └── nodetablewidget.h │ │ ├── nodetreeview/ │ │ │ ├── CMakeLists.txt │ │ │ ├── nodetreeview.cpp │ │ │ └── nodetreeview.h │ │ ├── nodevaluetree/ │ │ │ ├── CMakeLists.txt │ │ │ ├── nodevaluetree.cpp │ │ │ └── nodevaluetree.h │ │ ├── nodeview/ │ │ │ ├── CMakeLists.txt │ │ │ ├── nodeview.cpp │ │ │ ├── nodeview.h │ │ │ ├── nodeviewcommon.h │ │ │ ├── nodeviewcontext.cpp │ │ │ ├── nodeviewcontext.h │ │ │ ├── nodeviewedge.cpp │ │ │ ├── nodeviewedge.h │ │ │ ├── nodeviewitem.cpp │ │ │ ├── nodeviewitem.h │ │ │ ├── nodeviewitemconnector.cpp │ │ │ ├── nodeviewitemconnector.h │ │ │ ├── nodeviewminimap.cpp │ │ │ ├── nodeviewminimap.h │ │ │ ├── nodeviewscene.cpp │ │ │ ├── nodeviewscene.h │ │ │ ├── nodeviewtoolbar.cpp │ │ │ ├── nodeviewtoolbar.h │ │ │ ├── nodewidget.cpp │ │ │ └── nodewidget.h │ │ ├── path/ │ │ │ ├── CMakeLists.txt │ │ │ ├── pathwidget.cpp │ │ │ └── pathwidget.h │ │ ├── pixelsampler/ │ │ │ ├── CMakeLists.txt │ │ │ ├── pixelsampler.cpp │ │ │ └── pixelsampler.h │ │ ├── playbackcontrols/ │ │ │ ├── CMakeLists.txt │ │ │ ├── dragbutton.cpp │ │ │ ├── dragbutton.h │ │ │ ├── playbackcontrols.cpp │ │ │ └── playbackcontrols.h │ │ ├── projectexplorer/ │ │ │ ├── CMakeLists.txt │ │ │ ├── projectexplorer.cpp │ │ │ ├── projectexplorer.h │ │ │ ├── projectexplorericonview.cpp │ │ │ ├── projectexplorericonview.h │ │ │ ├── projectexplorericonviewitemdelegate.cpp │ │ │ ├── projectexplorericonviewitemdelegate.h │ │ │ ├── projectexplorerlistview.cpp │ │ │ ├── projectexplorerlistview.h │ │ │ ├── projectexplorerlistviewbase.cpp │ │ │ ├── projectexplorerlistviewbase.h │ │ │ ├── projectexplorerlistviewitemdelegate.cpp │ │ │ ├── projectexplorerlistviewitemdelegate.h │ │ │ ├── projectexplorernavigation.cpp │ │ │ ├── projectexplorernavigation.h │ │ │ ├── projectexplorertreeview.cpp │ │ │ ├── projectexplorertreeview.h │ │ │ ├── projectexplorerundo.h │ │ │ ├── projectviewmodel.cpp │ │ │ └── projectviewmodel.h │ │ ├── projecttoolbar/ │ │ │ ├── CMakeLists.txt │ │ │ ├── projecttoolbar.cpp │ │ │ └── projecttoolbar.h │ │ ├── resizablescrollbar/ │ │ │ ├── CMakeLists.txt │ │ │ ├── resizablescrollbar.cpp │ │ │ ├── resizablescrollbar.h │ │ │ ├── resizabletimelinescrollbar.cpp │ │ │ └── resizabletimelinescrollbar.h │ │ ├── scope/ │ │ │ ├── CMakeLists.txt │ │ │ ├── histogram/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── histogram.cpp │ │ │ │ └── histogram.h │ │ │ ├── scopebase/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── scopebase.cpp │ │ │ │ └── scopebase.h │ │ │ └── waveform/ │ │ │ ├── CMakeLists.txt │ │ │ ├── waveform.cpp │ │ │ └── waveform.h │ │ ├── slider/ │ │ │ ├── CMakeLists.txt │ │ │ ├── base/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── decimalsliderbase.cpp │ │ │ │ ├── decimalsliderbase.h │ │ │ │ ├── numericsliderbase.cpp │ │ │ │ ├── numericsliderbase.h │ │ │ │ ├── sliderbase.cpp │ │ │ │ ├── sliderbase.h │ │ │ │ ├── sliderlabel.cpp │ │ │ │ ├── sliderlabel.h │ │ │ │ ├── sliderladder.cpp │ │ │ │ └── sliderladder.h │ │ │ ├── floatslider.cpp │ │ │ ├── floatslider.h │ │ │ ├── integerslider.cpp │ │ │ ├── integerslider.h │ │ │ ├── rationalslider.cpp │ │ │ ├── rationalslider.h │ │ │ ├── stringslider.cpp │ │ │ └── stringslider.h │ │ ├── standardcombos/ │ │ │ ├── CMakeLists.txt │ │ │ ├── channellayoutcombobox.h │ │ │ ├── frameratecombobox.h │ │ │ ├── interlacedcombobox.h │ │ │ ├── pixelaspectratiocombobox.h │ │ │ ├── pixelformatcombobox.h │ │ │ ├── sampleformatcombobox.h │ │ │ ├── sampleratecombobox.h │ │ │ ├── standardcombos.h │ │ │ └── videodividercombobox.h │ │ ├── taskview/ │ │ │ ├── CMakeLists.txt │ │ │ ├── elapsedcounterwidget.cpp │ │ │ ├── elapsedcounterwidget.h │ │ │ ├── taskview.cpp │ │ │ ├── taskview.h │ │ │ ├── taskviewitem.cpp │ │ │ └── taskviewitem.h │ │ ├── timebased/ │ │ │ ├── CMakeLists.txt │ │ │ ├── timebasedview.cpp │ │ │ ├── timebasedview.h │ │ │ ├── timebasedviewselectionmanager.cpp │ │ │ ├── timebasedviewselectionmanager.h │ │ │ ├── timebasedwidget.cpp │ │ │ ├── timebasedwidget.h │ │ │ ├── timescaledobject.cpp │ │ │ └── timescaledobject.h │ │ ├── timelinewidget/ │ │ │ ├── CMakeLists.txt │ │ │ ├── timelineandtrackview.cpp │ │ │ ├── timelineandtrackview.h │ │ │ ├── timelinewidget.cpp │ │ │ ├── timelinewidget.h │ │ │ ├── timelinewidgetselections.cpp │ │ │ ├── timelinewidgetselections.h │ │ │ ├── tool/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── add.cpp │ │ │ │ ├── add.h │ │ │ │ ├── beam.cpp │ │ │ │ ├── beam.h │ │ │ │ ├── edit.cpp │ │ │ │ ├── edit.h │ │ │ │ ├── import.cpp │ │ │ │ ├── import.h │ │ │ │ ├── pointer.cpp │ │ │ │ ├── pointer.h │ │ │ │ ├── razor.cpp │ │ │ │ ├── razor.h │ │ │ │ ├── record.cpp │ │ │ │ ├── record.h │ │ │ │ ├── ripple.cpp │ │ │ │ ├── ripple.h │ │ │ │ ├── rolling.cpp │ │ │ │ ├── rolling.h │ │ │ │ ├── slide.cpp │ │ │ │ ├── slide.h │ │ │ │ ├── slip.cpp │ │ │ │ ├── slip.h │ │ │ │ ├── tool.cpp │ │ │ │ ├── tool.h │ │ │ │ ├── trackselect.cpp │ │ │ │ ├── trackselect.h │ │ │ │ ├── transition.cpp │ │ │ │ ├── transition.h │ │ │ │ ├── zoom.cpp │ │ │ │ └── zoom.h │ │ │ ├── trackview/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── trackview.cpp │ │ │ │ ├── trackview.h │ │ │ │ ├── trackviewitem.cpp │ │ │ │ ├── trackviewitem.h │ │ │ │ ├── trackviewsplitter.cpp │ │ │ │ └── trackviewsplitter.h │ │ │ └── view/ │ │ │ ├── CMakeLists.txt │ │ │ ├── timelineview.cpp │ │ │ ├── timelineview.h │ │ │ ├── timelineviewghostitem.h │ │ │ └── timelineviewmouseevent.h │ │ ├── timeruler/ │ │ │ ├── CMakeLists.txt │ │ │ ├── seekablewidget.cpp │ │ │ ├── seekablewidget.h │ │ │ ├── timeruler.cpp │ │ │ └── timeruler.h │ │ ├── timetarget/ │ │ │ ├── CMakeLists.txt │ │ │ ├── timetarget.cpp │ │ │ └── timetarget.h │ │ ├── toolbar/ │ │ │ ├── CMakeLists.txt │ │ │ ├── toolbar.cpp │ │ │ ├── toolbar.h │ │ │ ├── toolbarbutton.cpp │ │ │ └── toolbarbutton.h │ │ └── viewer/ │ │ ├── CMakeLists.txt │ │ ├── audiowaveformview.cpp │ │ ├── audiowaveformview.h │ │ ├── footageviewer.cpp │ │ ├── footageviewer.h │ │ ├── viewer.cpp │ │ ├── viewer.h │ │ ├── viewerdisplay.cpp │ │ ├── viewerdisplay.h │ │ ├── viewerplaybacktimer.cpp │ │ ├── viewerplaybacktimer.h │ │ ├── viewerpreventsleep.cpp │ │ ├── viewerpreventsleep.h │ │ ├── viewerqueue.h │ │ ├── viewersafemargininfo.h │ │ ├── viewersizer.cpp │ │ ├── viewersizer.h │ │ ├── viewertexteditor.cpp │ │ ├── viewertexteditor.h │ │ ├── viewerwindow.cpp │ │ └── viewerwindow.h │ └── window/ │ ├── CMakeLists.txt │ └── mainwindow/ │ ├── CMakeLists.txt │ ├── mainmenu.cpp │ ├── mainmenu.h │ ├── mainstatusbar.cpp │ ├── mainstatusbar.h │ ├── mainwindow.cpp │ ├── mainwindow.h │ ├── mainwindowlayoutinfo.cpp │ ├── mainwindowlayoutinfo.h │ ├── mainwindowundo.cpp │ └── mainwindowundo.h ├── cmake/ │ ├── FindFFMPEG.cmake │ ├── FindGoogleCrashpad.cmake │ ├── FindOlive.cmake │ ├── FindOpenColorIO.cmake │ ├── FindOpenEXR.cmake │ ├── FindOpenImageIO.cmake │ ├── FindOpenTimelineIO.cmake │ ├── FindPortAudio.cmake │ └── Sanitizers.cmake ├── docker/ │ ├── README.md │ ├── ci-common/ │ │ └── Dockerfile │ ├── ci-crashpad/ │ │ └── Dockerfile │ ├── ci-ffmpeg/ │ │ └── Dockerfile │ ├── ci-ocio/ │ │ └── Dockerfile │ ├── ci-oiio/ │ │ └── Dockerfile │ ├── ci-olive/ │ │ └── Dockerfile │ ├── ci-otio/ │ │ └── Dockerfile │ └── scripts/ │ ├── base/ │ │ └── install_cmake.sh │ ├── build_crashpad.sh │ ├── build_ffmpeg.sh │ ├── build_ocio.sh │ ├── build_oiio.sh │ ├── build_olive.sh │ ├── build_otio.sh │ └── common/ │ ├── before_build.sh │ ├── copy_new_files.sh │ └── install_yumpackages.sh ├── ext/ │ └── CMakeLists.txt ├── tests/ │ ├── CMakeLists.txt │ ├── compositing/ │ │ ├── CMakeLists.txt │ │ └── compositing-tests.cpp │ ├── general/ │ │ ├── CMakeLists.txt │ │ └── common-tests.cpp │ ├── testutil.h │ └── timeline/ │ ├── CMakeLists.txt │ └── timeline-tests.cpp └── update-copyright.sh
SYMBOL INDEX (2150 symbols across 780 files)
FILE: app/audio/audiomanager.cpp
type olive (line 31) | namespace olive {
function AudioManager (line 48) | AudioManager *AudioManager::instance()
function OutputCallback (line 58) | int OutputCallback(const void *input, void *output, unsigned long fram...
function InputCallback (line 71) | int InputCallback(const void *input, void *output, unsigned long frame...
function PaSampleFormat (line 122) | PaSampleFormat AudioManager::GetPortAudioSampleFormat(SampleFormat fmt)
function PaDeviceIndex (line 249) | PaDeviceIndex AudioManager::FindConfigDeviceByName(bool is_output_device)
function PaDeviceIndex (line 256) | PaDeviceIndex AudioManager::FindDeviceByName(const QString &s, bool is...
function PaStreamParameters (line 272) | PaStreamParameters AudioManager::GetPortAudioParams(const AudioParams ...
FILE: app/audio/audiomanager.h
function namespace (line 36) | namespace olive {
FILE: app/audio/audioprocessor.cpp
type olive (line 32) | namespace olive {
function AVFilterContext (line 288) | AVFilterContext *AudioProcessor::CreateTempoFilter(AVFilterGraph* grap...
FILE: app/audio/audioprocessor.h
function namespace (line 34) | namespace olive {
FILE: app/audio/audiovisualwaveform.cpp
type olive (line 28) | namespace olive {
function AudioVisualWaveform (line 236) | AudioVisualWaveform AudioVisualWaveform::Mid(const rational &offset) c...
function AudioVisualWaveform (line 245) | AudioVisualWaveform AudioVisualWaveform::Mid(const rational &offset, c...
function ExpandMinMaxChannel (line 304) | void ExpandMinMaxChannel(const float *a, size_t length, float &min_val...
function round_away_from_zero (line 388) | inline int round_away_from_zero(T t)
FILE: app/audio/audiovisualwaveform.h
function namespace (line 28) | namespace olive {
FILE: app/cli/cliexport/cliexportmanager.cpp
type olive (line 23) | namespace olive {
FILE: app/cli/cliexport/cliexportmanager.h
function namespace (line 26) | namespace olive {
FILE: app/cli/cliprogress/cliprogressdialog.cpp
type olive (line 25) | namespace olive {
FILE: app/cli/cliprogress/cliprogressdialog.h
function namespace (line 29) | namespace olive {
FILE: app/cli/clitask/clitaskdialog.cpp
type olive (line 23) | namespace olive {
FILE: app/cli/clitask/clitaskdialog.h
function namespace (line 27) | namespace olive {
FILE: app/codec/conformmanager.cpp
type olive (line 7) | namespace olive {
function foreach (line 24) | foreach (const ConformData &data, conforming_) {
function foreach (line 80) | foreach (const QString &fn, filenames) {
FILE: app/codec/conformmanager.h
function namespace (line 10) | namespace olive {
FILE: app/codec/decoder.cpp
type olive (line 36) | namespace olive {
function TexturePtr (line 95) | TexturePtr Decoder::RetrieveVideo(const RetrieveVideoParams &p)
function qint64 (line 157) | qint64 Decoder::GetLastAccessedTime()
function DecoderPtr (line 199) | DecoderPtr Decoder::CreateFromID(const QString &id)
function QString (line 224) | QString Decoder::TransformImageSequenceFileName(const QString &filenam...
function TexturePtr (line 269) | TexturePtr Decoder::RetrieveVideoInternal(const RetrieveVideoParams &p)
function uint (line 339) | uint qHash(Decoder::CodecStream stream, uint seed)
FILE: app/codec/decoder.h
function namespace (line 39) | namespace olive {
FILE: app/codec/encoder.cpp
type olive (line 29) | namespace olive {
function EncodingParams (line 39) | const EncodingParams &Encoder::params() const
function QString (line 44) | QString Encoder::GetFilenameForFrame(const rational &frame)
function QString (line 80) | QString Encoder::FilenameRemoveDigitPlaceholder(QString filename)
function QDir (line 102) | QDir EncodingParams::GetPresetPath()
function QStringList (line 107) | QStringList EncodingParams::GetListOfPresets()
function XMLAttributeLoop (line 162) | XMLAttributeLoop(reader, attr) {
function Encoder (line 284) | Encoder* Encoder::CreateFromID(Type id, const EncodingParams& params)
function Encoder (line 325) | Encoder *Encoder::CreateFromFormat(ExportFormat::Format f, const Encod...
function Encoder (line 330) | Encoder *Encoder::CreateFromParams(const EncodingParams ¶ms)
function QStringList (line 335) | QStringList Encoder::GetPixelFormatsForCodec(ExportCodec::Codec c) const
function QMatrix4x4 (line 345) | QMatrix4x4 EncodingParams::GenerateMatrix(EncodingParams::VideoScaling...
function XMLAttributeLoop (line 387) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 460) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 487) | XMLAttributeLoop(reader, attr) {
FILE: app/codec/encoder.h
function namespace (line 37) | namespace olive {
function class (line 177) | class Encoder : public QObject
FILE: app/codec/exportcodec.cpp
type olive (line 28) | namespace olive {
function QString (line 30) | QString ExportCodec::GetCodecName(ExportCodec::Codec c)
FILE: app/codec/exportcodec.h
function namespace (line 30) | namespace olive {
FILE: app/codec/exportformat.cpp
type olive (line 25) | namespace olive {
function QString (line 27) | QString ExportFormat::GetName(olive::ExportFormat::Format f)
function QString (line 68) | QString ExportFormat::GetExtension(ExportFormat::Format f)
function QStringList (line 208) | QStringList ExportFormat::GetPixelFormatsForCodec(ExportFormat::Format...
FILE: app/codec/exportformat.h
function namespace (line 30) | namespace olive {
FILE: app/codec/ffmpeg/ffmpegdecoder.cpp
type olive (line 48) | namespace olive {
function TexturePtr (line 76) | TexturePtr FFmpegDecoder::ProcessFrameIntoTexture(AVFramePtr f, const ...
function TexturePtr (line 234) | TexturePtr FFmpegDecoder::RetrieveVideoInternal(const RetrieveVideoPar...
function rational (line 276) | rational FFmpegDecoder::GetAudioStartOffset() const
function QString (line 288) | QString FFmpegDecoder::id() const
function FootageDescription (line 293) | FootageDescription FFmpegDecoder::Probe(const QString &filename, Cance...
function QString (line 539) | QString FFmpegDecoder::FFmpegError(int error_code)
function PixelFormat (line 664) | PixelFormat FFmpegDecoder::GetNativePixelFormat(AVPixelFormat pix_fmt)
function AVFramePtr (line 741) | AVFramePtr FFmpegDecoder::PreProcessFrame(AVFramePtr f, const Retrieve...
function AVFramePtr (line 829) | AVFramePtr FFmpegDecoder::RetrieveFrame(const rational& time, CancelAt...
function AVFramePtr (line 970) | AVFramePtr FFmpegDecoder::GetFrameFromCache(const int64_t &t) const
FILE: app/codec/ffmpeg/ffmpegdecoder.h
function namespace (line 42) | namespace olive {
FILE: app/codec/ffmpeg/ffmpegencoder.cpp
type olive (line 33) | namespace olive {
function QStringList (line 51) | QStringList FFmpegEncoder::GetPixelFormatsForCodec(ExportCodec::Codec ...
function QString (line 386) | QString GetAssTime(const rational &time)
function AVCodec (line 884) | const AVCodec *FFmpegEncoder::GetEncoder(ExportCodec::Codec c, SampleF...
FILE: app/codec/ffmpeg/ffmpegencoder.h
function namespace (line 34) | namespace olive {
FILE: app/codec/frame.cpp
type olive (line 31) | namespace olive {
function FramePtr (line 45) | FramePtr Frame::Create()
function VideoParams (line 50) | const VideoParams &Frame::video_params() const
function FramePtr (line 63) | FramePtr Frame::Interlace(FramePtr top, FramePtr bottom)
function Color (line 93) | Color Frame::get_pixel(int x, int y) const
function FramePtr (line 149) | FramePtr Frame::convert(PixelFormat format) const
FILE: app/codec/frame.h
function namespace (line 31) | namespace olive {
FILE: app/codec/oiio/oiiodecoder.cpp
type olive (line 34) | namespace olive {
function QString (line 43) | QString OIIODecoder::id() const
function FootageDescription (line 48) | FootageDescription OIIODecoder::Probe(const QString &filename, CancelA...
function TexturePtr (line 122) | TexturePtr OIIODecoder::RetrieveVideoInternal(const RetrieveVideoParam...
function foreach (line 176) | foreach (const QString& ext, extension_list) {
function VideoParams (line 233) | VideoParams OIIODecoder::GetVideoParamsFromImageSpec(const OIIO::Image...
FILE: app/codec/oiio/oiiodecoder.h
function namespace (line 29) | namespace olive {
FILE: app/codec/oiio/oiioencoder.cpp
type olive (line 25) | namespace olive {
FILE: app/codec/oiio/oiioencoder.h
function namespace (line 26) | namespace olive {
FILE: app/codec/planarfiledevice.cpp
type olive (line 23) | namespace olive {
function qint64 (line 57) | qint64 PlanarFileDevice::read(char **data, qint64 bytes_per_channel, q...
function qint64 (line 71) | qint64 PlanarFileDevice::write(const char **data, qint64 bytes_per_cha...
function qint64 (line 85) | qint64 PlanarFileDevice::size() const
FILE: app/codec/planarfiledevice.h
function namespace (line 28) | namespace olive {
FILE: app/common/autoscroll.h
function namespace (line 26) | namespace olive {
FILE: app/common/cancelableobject.h
function namespace (line 27) | namespace olive {
FILE: app/common/commandlineparser.cpp
function foreach (line 28) | foreach (const KnownOption& o, options_) {
function foreach (line 32) | foreach (const KnownPositionalArgument& a, positional_args_) {
function foreach (line 71) | foreach (const QString& s, o.args) {
function foreach (line 142) | foreach (const KnownOption& o, options_) {
FILE: app/common/commandlineparser.h
function class (line 39) | class CommandLineParser
FILE: app/common/crashpadinterface.cpp
function InitializeCrashpad (line 41) | bool InitializeCrashpad()
FILE: app/common/debug.cpp
type olive (line 23) | namespace olive {
function DebugHandler (line 25) | void DebugHandler(QtMsgType type, const QMessageLogContext &context, c...
FILE: app/common/debug.h
function namespace (line 28) | namespace olive {
FILE: app/common/decibel.h
function namespace (line 29) | namespace olive {
FILE: app/common/define.h
function namespace (line 24) | namespace olive {
FILE: app/common/digit.h
function namespace (line 26) | namespace olive {
FILE: app/common/ffmpegutils.cpp
type olive (line 23) | namespace olive {
function AVPixelFormat (line 25) | AVPixelFormat FFmpegUtils::GetCompatiblePixelFormat(const AVPixelForma...
function SampleFormat (line 44) | SampleFormat FFmpegUtils::GetNativeSampleFormat(const AVSampleFormat &...
function AVSampleFormat (line 79) | AVSampleFormat FFmpegUtils::GetFFmpegSampleFormat(const SampleFormat &...
function AVPixelFormat (line 136) | AVPixelFormat FFmpegUtils::ConvertJPEGSpaceToRegularSpace(AVPixelForma...
function AVPixelFormat (line 151) | AVPixelFormat FFmpegUtils::GetFFmpegPixelFormat(const PixelFormat &pix...
function PixelFormat (line 182) | PixelFormat FFmpegUtils::GetCompatiblePixelFormat(const PixelFormat &p...
FILE: app/common/ffmpegutils.h
function namespace (line 34) | namespace olive {
FILE: app/common/filefunctions.cpp
type olive (line 32) | namespace olive {
function QString (line 34) | QString FileFunctions::GetUniqueFileIdentifier(const QString &filename)
function QString (line 53) | QString FileFunctions::GetConfigurationLocation()
function QString (line 69) | QString FileFunctions::GetApplicationPath()
function QString (line 74) | QString FileFunctions::GetTempFilePath()
function foreach (line 90) | foreach (const QFileInfo& info, info_list) {
function foreach (line 128) | foreach (const QFileInfo& info, l) {
function QString (line 159) | QString FileFunctions::EnsureFilenameExtension(QString fn, const QStri...
function QString (line 176) | QString FileFunctions::ReadFileAsString(const QString &filename)
function QString (line 188) | QString FileFunctions::GetSafeTemporaryFilename(const QString &original)
function QString (line 229) | QString FileFunctions::GetAutoRecoveryRoot()
FILE: app/common/filefunctions.h
function namespace (line 29) | namespace olive {
FILE: app/common/html.cpp
type olive (line 8) | namespace olive {
function StrEquals (line 15) | inline bool StrEquals(const QStringView &a, const QStringView &b)
function QString (line 20) | QString Html::DocToHtml(const QTextDocument *doc)
type HtmlNode (line 34) | struct HtmlNode {
function QTextCharFormat (line 39) | QTextCharFormat MergeHtmlFormats(const QVector<HtmlNode> &stack)
function foreach (line 183) | foreach (const QString &l, lines) {
function foreach (line 198) | foreach (QString v, values) {
function QTextCharFormat (line 279) | QTextCharFormat Html::ReadCharFormat(const QXmlStreamAttributes &attri...
function QTextBlockFormat (line 349) | QTextBlockFormat Html::ReadBlockFormat(const QXmlStreamAttributes &att...
function foreach (line 398) | foreach (const QString &a, list) {
FILE: app/common/html.h
function namespace (line 9) | namespace olive {
FILE: app/common/jobtime.cpp
type olive (line 5) | namespace olive {
function QDebug (line 27) | QDebug operator<<(QDebug debug, const olive::JobTime& r)
FILE: app/common/jobtime.h
function namespace (line 7) | namespace olive {
FILE: app/common/memorypool.h
function namespace (line 34) | namespace olive {
FILE: app/common/ocioutils.cpp
type olive (line 23) | namespace olive {
FILE: app/common/ocioutils.h
function namespace (line 29) | namespace olive {
FILE: app/common/oiioutils.cpp
type olive (line 25) | namespace olive {
function rational (line 45) | rational OIIOUtils::GetPixelAspectRatioFromOIIO(const OIIO::ImageSpec ...
function PixelFormat (line 50) | PixelFormat OIIOUtils::GetFormatFromOIIOBasetype(OIIO::TypeDesc::BASET...
FILE: app/common/oiioutils.h
function namespace (line 30) | namespace olive {
FILE: app/common/power.h
function namespace (line 28) | namespace olive {
FILE: app/common/qtutils.cpp
type olive (line 25) | namespace olive {
function QFrame (line 35) | QFrame *QtUtils::CreateHorizontalLine()
function QFrame (line 43) | QFrame *QtUtils::CreateVerticalLine()
function QDateTime (line 70) | QDateTime QtUtils::GetCreationDate(const QFileInfo &info)
function QString (line 83) | QString QtUtils::GetFormattedDateTime(const QDateTime &dt)
function QStringList (line 88) | QStringList QtUtils::WordWrapString(const QString &s, const QFontMetri...
function QColor (line 185) | QColor QtUtils::toQColor(const core::Color &i)
type core (line 198) | namespace core {
function uint (line 200) | uint qHash(const core::rational &r, uint seed)
function uint (line 205) | uint qHash(const core::TimeRange &r, uint seed)
FILE: app/common/qtutils.h
function namespace (line 32) | namespace olive {
FILE: app/common/ratiodialog.cpp
type olive (line 27) | namespace olive {
function GetFloatRatioFromUser (line 29) | double GetFloatRatioFromUser(QWidget* parent,
FILE: app/common/ratiodialog.h
function namespace (line 26) | namespace olive {
FILE: app/common/threadsafemap.h
function insert (line 13) | void insert(K key, V value)
FILE: app/common/tohex.h
function namespace (line 9) | namespace olive {
FILE: app/common/util.h
function T (line 25) | T mid(T a, T b)
FILE: app/common/xmlutils.cpp
type olive (line 26) | namespace olive {
function XMLReadNextStartElement (line 28) | bool XMLReadNextStartElement(QXmlStreamReader *reader, CancelAtom *can...
FILE: app/common/xmlutils.h
function namespace (line 30) | namespace olive {
FILE: app/config/config.cpp
type olive (line 40) | namespace olive {
function QString (line 54) | QString Config::GetConfigFilePath()
function Config (line 59) | Config &Config::Current()
function QVariant (line 299) | QVariant Config::operator[](const QString &key) const
function QVariant (line 304) | QVariant &Config::operator[](const QString &key)
FILE: app/config/config.h
function namespace (line 30) | namespace olive {
FILE: app/core.cpp
type olive (line 81) | namespace olive {
function Core (line 103) | Core *Core::instance()
function MainWindow (line 228) | MainWindow *Core::main_window()
function UndoStack (line 233) | UndoStack *Core::undo_stack()
function QString (line 270) | const QString &Core::GetSelectedTransition() const
function QStringList (line 308) | const QStringList &Core::GetRecentProjects() const
function ViewerOutput (line 844) | ViewerOutput *Core::GetSequenceToExport()
function QString (line 874) | QString Core::GetAutoRecoveryIndexFilename()
function foreach (line 893) | foreach (const QUuid& uuid, autorecovered_projects_) {
function Project (line 1035) | Project* Core::GetActiveProject() const
function Folder (line 1040) | Folder *Core::GetSelectedFolderInActiveProject() const
function QString (line 1074) | QString Core::PasteStringFromClipboard()
function QString (line 1079) | QString Core::GetProjectFilter(bool include_any_filter)
function QString (line 1112) | QString Core::GetRecentProjectsFilePath()
function foreach (line 1364) | foreach (const QFileInfo& f, filenames) {
function foreach (line 1408) | foreach (Node* n, nodes) {
function Sequence (line 1424) | Sequence *Core::CreateNewSequenceForProject(const QString &format, Pro...
function foreach (line 1517) | foreach (ViewerPanel* viewer, all_viewers) {
function QString (line 1539) | QString StripWindowsDriveLetter(QString s)
FILE: app/core.h
function namespace (line 38) | namespace olive {
FILE: app/crashhandler/crashhandler.cpp
type olive (line 43) | namespace olive {
function QString (line 111) | QString CrashHandlerDialog::GetSymbolPath()
function main (line 346) | int main(int argc, char *argv[])
FILE: app/crashhandler/crashhandler.h
function namespace (line 33) | namespace olive {
FILE: app/dialog/about/about.cpp
type olive (line 33) | namespace olive {
FILE: app/dialog/about/about.h
function namespace (line 29) | namespace olive {
FILE: app/dialog/about/scrollinglabel.cpp
type olive (line 27) | namespace olive {
function foreach (line 53) | foreach (const QString& s, text_) {
FILE: app/dialog/about/scrollinglabel.h
function namespace (line 27) | namespace olive {
FILE: app/dialog/actionsearch/actionsearch.cpp
type olive (line 28) | namespace olive {
FILE: app/dialog/actionsearch/actionsearch.h
function namespace (line 32) | namespace olive {
FILE: app/dialog/autorecovery/autorecoverydialog.cpp
type olive (line 32) | namespace olive {
function foreach (line 46) | foreach (QTreeWidgetItem* checkable, checkable_items_) {
function foreach (line 80) | foreach (const QString& recovery_folder, recoveries) {
FILE: app/dialog/autorecovery/autorecoverydialog.h
function namespace (line 29) | namespace olive {
FILE: app/dialog/color/colordialog.cpp
type olive (line 29) | namespace olive {
function ManagedColor (line 142) | ManagedColor ColorDialog::GetSelectedColor() const
function QString (line 157) | QString ColorDialog::GetColorSpaceInput() const
function ColorTransform (line 162) | ColorTransform ColorDialog::GetColorSpaceOutput() const
FILE: app/dialog/color/colordialog.h
function namespace (line 34) | namespace olive {
FILE: app/dialog/configbase/configdialogbase.cpp
type olive (line 29) | namespace olive {
function foreach (line 64) | foreach (ConfigDialogBaseTab* tab, tabs_) {
function foreach (line 72) | foreach (ConfigDialogBaseTab* tab, tabs_) {
FILE: app/dialog/configbase/configdialogbase.h
function namespace (line 30) | namespace olive {
FILE: app/dialog/configbase/configdialogbasetab.cpp
type olive (line 23) | namespace olive {
FILE: app/dialog/configbase/configdialogbasetab.h
function namespace (line 29) | namespace olive {
FILE: app/dialog/diskcache/diskcachedialog.cpp
type olive (line 31) | namespace olive {
FILE: app/dialog/diskcache/diskcachedialog.h
function namespace (line 31) | namespace olive {
FILE: app/dialog/export/codec/av1section.cpp
type olive (line 31) | namespace olive {
FILE: app/dialog/export/codec/av1section.h
function class (line 33) | class AV1CRFSection : public QWidget
FILE: app/dialog/export/codec/cineformsection.cpp
type olive (line 26) | namespace olive {
FILE: app/dialog/export/codec/cineformsection.h
function namespace (line 28) | namespace olive {
FILE: app/dialog/export/codec/codecsection.cpp
type olive (line 23) | namespace olive {
FILE: app/dialog/export/codec/codecsection.h
function namespace (line 28) | namespace olive {
FILE: app/dialog/export/codec/codecstack.cpp
type olive (line 23) | namespace olive {
FILE: app/dialog/export/codec/codecstack.h
function namespace (line 26) | namespace olive {
FILE: app/dialog/export/codec/h264section.cpp
type olive (line 31) | namespace olive {
FILE: app/dialog/export/codec/h264section.h
function GetTargetBitRate (line 62) | int64_t GetTargetBitRate() const;
FILE: app/dialog/export/codec/imagesection.cpp
type olive (line 26) | namespace olive {
FILE: app/dialog/export/codec/imagesection.h
function namespace (line 29) | namespace olive {
FILE: app/dialog/export/export.cpp
type olive (line 43) | namespace olive {
function rational (line 287) | rational ExportDialog::GetSelectedTimebase() const
function EncodingParams (line 638) | EncodingParams ExportDialog::GenerateParams() const
function rational (line 799) | rational ExportDialog::GetExportLength() const
FILE: app/dialog/export/export.h
function namespace (line 40) | namespace olive {
FILE: app/dialog/export/exportadvancedvideodialog.cpp
type olive (line 8) | namespace olive {
FILE: app/dialog/export/exportadvancedvideodialog.h
function namespace (line 10) | namespace olive {
FILE: app/dialog/export/exportaudiotab.cpp
type olive (line 28) | namespace olive {
function foreach (line 90) | foreach (ExportCodec::Codec acodec, acodecs) {
FILE: app/dialog/export/exportaudiotab.h
function namespace (line 32) | namespace olive {
FILE: app/dialog/export/exportformatcombobox.cpp
type olive (line 28) | namespace olive {
function QWidgetAction (line 112) | QWidgetAction *ExportFormatComboBox::CreateHeader(const QIcon &icon, c...
FILE: app/dialog/export/exportformatcombobox.h
function namespace (line 31) | namespace olive {
FILE: app/dialog/export/exportsavepresetdialog.cpp
type olive (line 28) | namespace olive {
FILE: app/dialog/export/exportsavepresetdialog.h
function namespace (line 30) | namespace olive {
FILE: app/dialog/export/exportsubtitlestab.cpp
type olive (line 5) | namespace olive {
function foreach (line 63) | foreach (ExportCodec::Codec scodec, scodecs) {
FILE: app/dialog/export/exportsubtitlestab.h
function namespace (line 32) | namespace olive {
FILE: app/dialog/export/exportvideotab.cpp
type olive (line 33) | namespace olive {
function foreach (line 59) | foreach (ExportCodec::Codec vcodec, vcodecs) {
function QWidget (line 79) | QWidget* ExportVideoTab::SetupResolutionSection()
function QWidget (line 156) | QWidget* ExportVideoTab::SetupColorSection()
function QWidget (line 163) | QWidget *ExportVideoTab::SetupCodecSection()
FILE: app/dialog/export/exportvideotab.h
function namespace (line 39) | namespace olive {
FILE: app/dialog/footageproperties/footageproperties.cpp
type olive (line 39) | namespace olive {
function Project (line 208) | Project *FootagePropertiesDialog::StreamEnableChangeCommand::GetReleva...
FILE: app/dialog/footageproperties/footageproperties.h
function namespace (line 35) | namespace olive {
FILE: app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp
type olive (line 23) | namespace olive {
FILE: app/dialog/footageproperties/streamproperties/audiostreamproperties.h
function namespace (line 27) | namespace olive {
FILE: app/dialog/footageproperties/streamproperties/streamproperties.cpp
type olive (line 23) | namespace olive {
FILE: app/dialog/footageproperties/streamproperties/streamproperties.h
function namespace (line 29) | namespace olive {
FILE: app/dialog/footageproperties/streamproperties/videostreamproperties.cpp
type olive (line 33) | namespace olive {
function Project (line 208) | Project *VideoStreamProperties::VideoStreamChangeCommand::GetRelevantP...
function Project (line 254) | Project *VideoStreamProperties::ImageSequenceChangeCommand::GetRelevan...
FILE: app/dialog/footageproperties/streamproperties/videostreamproperties.h
function namespace (line 32) | namespace olive {
FILE: app/dialog/footagerelink/footagerelinkdialog.cpp
type olive (line 32) | namespace olive {
FILE: app/dialog/footagerelink/footagerelinkdialog.h
function namespace (line 29) | namespace olive {
FILE: app/dialog/keyframeproperties/keyframeproperties.cpp
type olive (line 30) | namespace olive {
function foreach (line 202) | foreach (NodeKeyframe* key, keys_) {
FILE: app/dialog/keyframeproperties/keyframeproperties.h
function namespace (line 32) | namespace olive {
FILE: app/dialog/markerproperties/markerpropertiesdialog.cpp
type olive (line 31) | namespace olive {
function foreach (line 136) | foreach (TimelineMarker *m, markers_) {
FILE: app/dialog/markerproperties/markerpropertiesdialog.h
function namespace (line 31) | namespace olive {
FILE: app/dialog/otioproperties/otiopropertiesdialog.cpp
type olive (line 29) | namespace olive {
FILE: app/dialog/otioproperties/otiopropertiesdialog.h
function namespace (line 13) | namespace olive {
FILE: app/dialog/preferences/keysequenceeditor.cpp
type olive (line 26) | namespace olive {
function QString (line 43) | QString KeySequenceEditor::action_name() {
function QString (line 47) | QString KeySequenceEditor::export_shortcut() {
FILE: app/dialog/preferences/keysequenceeditor.h
function namespace (line 28) | namespace olive {
FILE: app/dialog/preferences/preferences.cpp
type olive (line 37) | namespace olive {
FILE: app/dialog/preferences/preferences.h
function namespace (line 33) | namespace olive {
FILE: app/dialog/preferences/tabs/preferencesappearancetab.cpp
type olive (line 34) | namespace olive {
FILE: app/dialog/preferences/tabs/preferencesappearancetab.h
function namespace (line 32) | namespace olive {
FILE: app/dialog/preferences/tabs/preferencesaudiotab.cpp
type olive (line 30) | namespace olive {
FILE: app/dialog/preferences/tabs/preferencesaudiotab.h
function namespace (line 31) | namespace olive {
FILE: app/dialog/preferences/tabs/preferencesbehaviortab.cpp
type olive (line 28) | namespace olive {
function QTreeWidgetItem (line 126) | QTreeWidgetItem* PreferencesBehaviorTab::AddItem(const QString &text, ...
function QTreeWidgetItem (line 143) | QTreeWidgetItem *PreferencesBehaviorTab::AddItem(const QString &text, ...
function QTreeWidgetItem (line 148) | QTreeWidgetItem *PreferencesBehaviorTab::AddParent(const QString &text...
function QTreeWidgetItem (line 162) | QTreeWidgetItem *PreferencesBehaviorTab::AddParent(const QString &text...
FILE: app/dialog/preferences/tabs/preferencesbehaviortab.h
function namespace (line 28) | namespace olive {
FILE: app/dialog/preferences/tabs/preferencesdisktab.cpp
type olive (line 32) | namespace olive {
FILE: app/dialog/preferences/tabs/preferencesdisktab.h
function namespace (line 33) | namespace olive {
FILE: app/dialog/preferences/tabs/preferencesgeneraltab.cpp
type olive (line 33) | namespace olive {
function foreach (line 54) | foreach (const QString& l, languages) {
FILE: app/dialog/preferences/tabs/preferencesgeneraltab.h
function namespace (line 33) | namespace olive {
FILE: app/dialog/preferences/tabs/preferenceskeyboardtab.cpp
type olive (line 32) | namespace olive {
FILE: app/dialog/preferences/tabs/preferenceskeyboardtab.h
function namespace (line 30) | namespace olive {
FILE: app/dialog/progress/progress.cpp
type olive (line 30) | namespace olive {
FILE: app/dialog/progress/progress.h
function namespace (line 30) | namespace olive {
FILE: app/dialog/projectproperties/projectproperties.cpp
type olive (line 35) | namespace olive {
function foreach (line 240) | foreach (QString cs, input_cs) {
FILE: app/dialog/projectproperties/projectproperties.h
function namespace (line 34) | namespace olive {
FILE: app/dialog/rendercancel/rendercancel.cpp
type olive (line 23) | namespace olive {
FILE: app/dialog/rendercancel/rendercancel.h
function namespace (line 26) | namespace olive {
FILE: app/dialog/sequence/presetmanager.h
function namespace (line 38) | namespace olive {
function QString (line 210) | QString GetCustomPresetFilename() const
function DeletePreset (line 220) | void DeletePreset(int index)
FILE: app/dialog/sequence/sequence.cpp
type olive (line 38) | namespace olive {
function Project (line 199) | Project *SequenceDialog::SequenceParamCommand::GetRelevantProject() const
FILE: app/dialog/sequence/sequence.h
function namespace (line 33) | namespace olive {
FILE: app/dialog/sequence/sequencedialogparametertab.cpp
type olive (line 10) | namespace olive {
FILE: app/dialog/sequence/sequencedialogparametertab.h
function namespace (line 14) | namespace olive {
FILE: app/dialog/sequence/sequencedialogpresettab.cpp
type olive (line 38) | namespace olive {
function QTreeWidgetItem (line 92) | QTreeWidgetItem* SequenceDialogPresetTab::CreateFolder(const QString &...
function QTreeWidgetItem (line 100) | QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const Q...
function QTreeWidgetItem (line 163) | QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const Q...
function QTreeWidgetItem (line 194) | QTreeWidgetItem *SequenceDialogPresetTab::GetSelectedItem()
function QTreeWidgetItem (line 205) | QTreeWidgetItem *SequenceDialogPresetTab::GetSelectedCustomPreset()
FILE: app/dialog/sequence/sequencedialogpresettab.h
function namespace (line 31) | namespace olive {
FILE: app/dialog/sequence/sequencepreset.h
function namespace (line 31) | namespace olive {
FILE: app/dialog/speedduration/speeddurationdialog.cpp
type olive (line 32) | namespace olive {
function foreach (line 187) | foreach (ClipBlock *c, clips_) {
function foreach (line 223) | foreach (ClipBlock *c, clips_) {
function foreach (line 229) | foreach (ClipBlock *c, clips_) {
function foreach (line 236) | foreach (ClipBlock *c, clips_) {
function foreach (line 243) | foreach (ClipBlock *c, clips_) {
function foreach (line 249) | foreach (ClipBlock *c, clips_) {
function rational (line 260) | rational SpeedDurationDialog::GetLengthAdjustment(const rational &orig...
FILE: app/dialog/speedduration/speeddurationdialog.h
function namespace (line 34) | namespace olive {
FILE: app/dialog/task/task.cpp
type olive (line 25) | namespace olive {
FILE: app/dialog/task/task.h
function namespace (line 27) | namespace olive {
FILE: app/dialog/text/text.cpp
type olive (line 31) | namespace olive {
FILE: app/dialog/text/text.h
function namespace (line 31) | namespace olive {
FILE: app/main.cpp
function decompress_project (line 58) | int decompress_project(const QString &project)
function main (line 115) | int main(int argc, char *argv[])
FILE: app/node/audio/pan/pan.cpp
type olive (line 25) | namespace olive {
function QString (line 45) | QString PanNode::Name() const
function QString (line 50) | QString PanNode::id() const
function QString (line 60) | QString PanNode::Description() const
FILE: app/node/audio/pan/pan.h
function namespace (line 26) | namespace olive {
FILE: app/node/audio/volume/volume.cpp
type olive (line 25) | namespace olive {
function QString (line 44) | QString VolumeNode::Name() const
function QString (line 49) | QString VolumeNode::id() const
function QString (line 59) | QString VolumeNode::Description() const
FILE: app/node/audio/volume/volume.h
function namespace (line 26) | namespace olive {
FILE: app/node/block/block.cpp
type olive (line 30) | namespace olive {
function rational (line 57) | rational Block::length() const
FILE: app/node/block/block.h
function namespace (line 27) | namespace olive {
FILE: app/node/block/clip/clip.cpp
type olive (line 31) | namespace olive {
function QString (line 70) | QString ClipBlock::Name() const
function QString (line 85) | QString ClipBlock::id() const
function QString (line 90) | QString ClipBlock::Description() const
function rational (line 126) | rational ClipBlock::media_in() const
function rational (line 155) | rational ClipBlock::SequenceToMediaTime(const rational &sequence_time,...
function rational (line 201) | rational ClipBlock::MediaToSequenceTime(const rational &media_time) const
function foreach (line 401) | foreach (Node* n, links()) {
function TimeRange (line 465) | TimeRange ClipBlock::InputTimeAdjustment(const QString& input, int ele...
function TimeRange (line 476) | TimeRange ClipBlock::OutputTimeAdjustment(const QString& input, int el...
function TimeRange (line 545) | TimeRange ClipBlock::media_range() const
function MultiCamNode (line 550) | MultiCamNode *ClipBlock::FindMulticam()
FILE: app/node/block/clip/clip.h
function namespace (line 30) | namespace olive {
FILE: app/node/block/gap/gap.cpp
type olive (line 23) | namespace olive {
function QString (line 29) | QString GapBlock::Name() const
function QString (line 34) | QString GapBlock::id() const
function QString (line 39) | QString GapBlock::Description() const
FILE: app/node/block/gap/gap.h
function namespace (line 26) | namespace olive {
FILE: app/node/block/subtitle/subtitle.cpp
type olive (line 23) | namespace olive {
function QString (line 44) | QString SubtitleBlock::Name() const
function QString (line 53) | QString SubtitleBlock::id() const
function QString (line 58) | QString SubtitleBlock::Description() const
FILE: app/node/block/subtitle/subtitle.h
function namespace (line 26) | namespace olive {
FILE: app/node/block/transition/crossdissolve/crossdissolvetransition.cpp
type olive (line 23) | namespace olive {
function QString (line 29) | QString CrossDissolveTransition::Name() const
function QString (line 34) | QString CrossDissolveTransition::id() const
function QString (line 44) | QString CrossDissolveTransition::Description() const
function ShaderCode (line 49) | ShaderCode CrossDissolveTransition::GetShaderCode(const ShaderRequest ...
FILE: app/node/block/transition/crossdissolve/crossdissolvetransition.h
function namespace (line 26) | namespace olive {
FILE: app/node/block/transition/diptocolor/diptocolortransition.cpp
type olive (line 23) | namespace olive {
function QString (line 34) | QString DipToColorTransition::Name() const
function QString (line 39) | QString DipToColorTransition::id() const
function QString (line 49) | QString DipToColorTransition::Description() const
function ShaderCode (line 54) | ShaderCode DipToColorTransition::GetShaderCode(const ShaderRequest &re...
FILE: app/node/block/transition/diptocolor/diptocolortransition.h
function namespace (line 26) | namespace olive {
FILE: app/node/block/transition/transition.cpp
type olive (line 27) | namespace olive {
function rational (line 66) | rational TransitionBlock::in_offset() const
function rational (line 77) | rational TransitionBlock::out_offset() const
function rational (line 88) | rational TransitionBlock::offset_center() const
function Block (line 107) | Block *TransitionBlock::connected_out_block() const
function Block (line 112) | Block *TransitionBlock::connected_in_block() const
function TimeRange (line 289) | TimeRange TransitionBlock::InputTimeAdjustment(const QString &input, i...
function TimeRange (line 302) | TimeRange TransitionBlock::OutputTimeAdjustment(const QString &input, ...
FILE: app/node/block/transition/transition.h
function namespace (line 26) | namespace olive {
FILE: app/node/color/colormanager/colormanager.cpp
type olive (line 31) | namespace olive {
function QString (line 61) | QString ColorManager::GetConfigFilename() const
function QStringList (line 101) | QStringList ColorManager::ListAvailableDisplays()
function QString (line 114) | QString ColorManager::GetDefaultDisplay()
function QStringList (line 119) | QStringList ColorManager::ListAvailableViews(QString display)
function QString (line 132) | QString ColorManager::GetDefaultView(const QString &display)
function QStringList (line 137) | QStringList ColorManager::ListAvailableLooks()
function QStringList (line 150) | QStringList ColorManager::ListAvailableColorspaces() const
function QString (line 155) | QString ColorManager::GetDefaultInputColorSpace() const
function QString (line 165) | QString ColorManager::GetReferenceColorSpace() const
function QString (line 170) | QString ColorManager::GetCompliantColorSpace(const QString &s)
function ColorTransform (line 179) | ColorTransform ColorManager::GetCompliantColorSpace(const ColorTransfo...
function QStringList (line 217) | QStringList ColorManager::ListAvailableColorspaces(OCIO::ConstConfigRc...
function Project (line 237) | Project *ColorManager::project() const
FILE: app/node/color/colormanager/colormanager.h
function namespace (line 31) | namespace olive {
FILE: app/node/color/displaytransform/displaytransform.cpp
type olive (line 25) | namespace olive {
function QString (line 42) | QString DisplayTransformNode::Name() const
function QString (line 47) | QString DisplayTransformNode::id() const
function QString (line 57) | QString DisplayTransformNode::Description() const
function QString (line 84) | QString DisplayTransformNode::GetDisplay() const
function QString (line 95) | QString DisplayTransformNode::GetView() const
FILE: app/node/color/displaytransform/displaytransform.h
function namespace (line 27) | namespace olive {
FILE: app/node/color/ociobase/ociobase.cpp
type olive (line 26) | namespace olive {
FILE: app/node/color/ociobase/ociobase.h
function namespace (line 27) | namespace olive {
FILE: app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp
type olive (line 30) | namespace olive {
function QString (line 85) | QString OCIOGradingTransformLinearNode::Name() const
function QString (line 90) | QString OCIOGradingTransformLinearNode::id() const
function QString (line 100) | QString OCIOGradingTransformLinearNode::Description() const
FILE: app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.h
function namespace (line 27) | namespace olive {
FILE: app/node/distort/cornerpin/cornerpindistortnode.cpp
type olive (line 27) | namespace olive {
function ShaderCode (line 109) | ShaderCode CornerPinDistortNode::GetShaderCode(const ShaderRequest &re...
function QPointF (line 117) | QPointF CornerPinDistortNode::ValueToPixel(int value, const NodeValueR...
FILE: app/node/distort/cornerpin/cornerpindistortnode.h
function namespace (line 31) | namespace olive {
FILE: app/node/distort/crop/cropdistortnode.cpp
type olive (line 27) | namespace olive {
function ShaderCode (line 97) | ShaderCode CropDistortNode::GetShaderCode(const ShaderRequest &request...
FILE: app/node/distort/crop/cropdistortnode.h
function namespace (line 31) | namespace olive {
FILE: app/node/distort/flip/flipdistortnode.cpp
type olive (line 23) | namespace olive {
function QString (line 43) | QString FlipDistortNode::Name() const
function QString (line 48) | QString FlipDistortNode::id() const
function QString (line 58) | QString FlipDistortNode::Description() const
function ShaderCode (line 72) | ShaderCode FlipDistortNode::GetShaderCode(const ShaderRequest &request...
FILE: app/node/distort/flip/flipdistortnode.h
function namespace (line 26) | namespace olive {
FILE: app/node/distort/mask/mask.cpp
type olive (line 25) | namespace olive {
function ShaderCode (line 43) | ShaderCode MaskDistortNode::GetShaderCode(const ShaderRequest &request...
FILE: app/node/distort/mask/mask.h
function namespace (line 26) | namespace olive {
FILE: app/node/distort/ripple/rippledistortnode.cpp
type olive (line 23) | namespace olive {
function QString (line 57) | QString RippleDistortNode::Name() const
function QString (line 62) | QString RippleDistortNode::id() const
function QString (line 72) | QString RippleDistortNode::Description() const
function ShaderCode (line 89) | ShaderCode RippleDistortNode::GetShaderCode(const ShaderRequest &reque...
FILE: app/node/distort/ripple/rippledistortnode.h
function namespace (line 27) | namespace olive {
FILE: app/node/distort/swirl/swirldistortnode.cpp
type olive (line 23) | namespace olive {
function QString (line 54) | QString SwirlDistortNode::Name() const
function QString (line 59) | QString SwirlDistortNode::id() const
function QString (line 69) | QString SwirlDistortNode::Description() const
function ShaderCode (line 84) | ShaderCode SwirlDistortNode::GetShaderCode(const ShaderRequest &reques...
FILE: app/node/distort/swirl/swirldistortnode.h
function namespace (line 27) | namespace olive {
FILE: app/node/distort/tile/tiledistortnode.cpp
type olive (line 25) | namespace olive {
function QString (line 61) | QString TileDistortNode::Name() const
function QString (line 66) | QString TileDistortNode::id() const
function QString (line 76) | QString TileDistortNode::Description() const
function ShaderCode (line 105) | ShaderCode TileDistortNode::GetShaderCode(const ShaderRequest &request...
FILE: app/node/distort/tile/tiledistortnode.h
function namespace (line 27) | namespace olive {
FILE: app/node/distort/transform/transformdistortnode.cpp
type olive (line 25) | namespace olive {
function ShaderCode (line 121) | ShaderCode TransformDistortNode::GetShaderCode(const ShaderRequest &re...
function QMatrix4x4 (line 291) | QMatrix4x4 TransformDistortNode::AdjustMatrixByResolutions(const QMatr...
function QTransform (line 405) | QTransform TransformDistortNode::GizmoTransformation(const NodeValueRo...
function QPointF (line 415) | QPointF TransformDistortNode::CreateScalePoint(double x, double y, con...
function QMatrix4x4 (line 420) | QMatrix4x4 TransformDistortNode::GenerateAutoScaledMatrix(const QMatri...
FILE: app/node/distort/transform/transformdistortnode.h
function namespace (line 29) | namespace olive {
FILE: app/node/distort/wave/wavedistortnode.cpp
type olive (line 23) | namespace olive {
function QString (line 47) | QString WaveDistortNode::Name() const
function QString (line 52) | QString WaveDistortNode::id() const
function QString (line 62) | QString WaveDistortNode::Description() const
function ShaderCode (line 79) | ShaderCode WaveDistortNode::GetShaderCode(const ShaderRequest &request...
FILE: app/node/distort/wave/wavedistortnode.h
function namespace (line 26) | namespace olive {
FILE: app/node/effect/opacity/opacityeffect.cpp
type olive (line 6) | namespace olive {
function ShaderCode (line 40) | ShaderCode OpacityEffect::GetShaderCode(const ShaderRequest &request) ...
FILE: app/node/effect/opacity/opacityeffect.h
function namespace (line 6) | namespace olive {
FILE: app/node/factory.cpp
type olive (line 74) | namespace olive {
function Menu (line 96) | Menu *NodeFactory::CreateMenu(QWidget* parent, bool create_none_item, ...
function Node (line 165) | Node* NodeFactory::CreateFromMenuAction(QAction *action)
function QString (line 176) | QString NodeFactory::GetIDFromMenuAction(QAction *action)
function QString (line 187) | QString NodeFactory::GetNameFromID(const QString &id)
function Node (line 200) | Node *NodeFactory::CreateFromID(const QString &id)
function Node (line 211) | Node *NodeFactory::CreateFromFactoryIndex(const NodeFactory::InternalI...
FILE: app/node/factory.h
function namespace (line 29) | namespace olive {
FILE: app/node/filter/blur/blur.cpp
type olive (line 23) | namespace olive {
function QString (line 78) | QString BlurFilterNode::Name() const
function QString (line 83) | QString BlurFilterNode::id() const
function QString (line 93) | QString BlurFilterNode::Description() const
function ShaderCode (line 114) | ShaderCode BlurFilterNode::GetShaderCode(const ShaderRequest &request)...
FILE: app/node/filter/blur/blur.h
function namespace (line 27) | namespace olive {
FILE: app/node/filter/dropshadow/dropshadowfilter.cpp
type olive (line 25) | namespace olive {
function ShaderCode (line 73) | ShaderCode DropShadowFilter::GetShaderCode(const ShaderRequest &reques...
FILE: app/node/filter/dropshadow/dropshadowfilter.h
function namespace (line 26) | namespace olive {
FILE: app/node/filter/mosaic/mosaicfilternode.cpp
type olive (line 23) | namespace olive {
function ShaderCode (line 72) | ShaderCode MosaicFilterNode::GetShaderCode(const ShaderRequest &reques...
FILE: app/node/filter/mosaic/mosaicfilternode.h
function namespace (line 26) | namespace olive {
FILE: app/node/filter/stroke/stroke.cpp
type olive (line 25) | namespace olive {
function QString (line 55) | QString StrokeFilterNode::Name() const
function QString (line 60) | QString StrokeFilterNode::id() const
function QString (line 70) | QString StrokeFilterNode::Description() const
function ShaderCode (line 100) | ShaderCode StrokeFilterNode::GetShaderCode(const ShaderRequest &reques...
FILE: app/node/filter/stroke/stroke.h
function namespace (line 26) | namespace olive {
FILE: app/node/generator/matrix/matrix.cpp
type olive (line 28) | namespace olive {
function QString (line 54) | QString MatrixGenerator::Name() const
function QString (line 59) | QString MatrixGenerator::ShortName() const
function QString (line 64) | QString MatrixGenerator::id() const
function QString (line 74) | QString MatrixGenerator::Description() const
function QMatrix4x4 (line 97) | QMatrix4x4 MatrixGenerator::GenerateMatrix(const NodeValueRow &value, ...
function QMatrix4x4 (line 123) | QMatrix4x4 MatrixGenerator::GenerateMatrix(const QVector2D& pos,
FILE: app/node/generator/matrix/matrix.h
function namespace (line 29) | namespace olive {
FILE: app/node/generator/noise/noise.cpp
type olive (line 25) | namespace olive {
function QString (line 47) | QString NoiseGeneratorNode::Name() const
function QString (line 52) | QString NoiseGeneratorNode::id() const
function QString (line 62) | QString NoiseGeneratorNode::Description() const
function ShaderCode (line 76) | ShaderCode NoiseGeneratorNode::GetShaderCode(const ShaderRequest &requ...
FILE: app/node/generator/noise/noise.h
function namespace (line 26) | namespace olive {
FILE: app/node/generator/polygon/polygon.cpp
type olive (line 26) | namespace olive {
function QString (line 62) | QString PolygonGenerator::Name() const
function QString (line 67) | QString PolygonGenerator::id() const
function QString (line 77) | QString PolygonGenerator::Description() const
function ShaderJob (line 90) | ShaderJob PolygonGenerator::GetGenerateJob(const NodeValueRow &value, ...
function NodeGizmo (line 134) | NodeGizmo *PolygonGenerator::CreateAppropriateGizmo()
function NodeGizmo (line 140) | NodeGizmo *PolygonGenerator::CreateAppropriateGizmo<PointGizmo>()
function ShaderCode (line 224) | ShaderCode PolygonGenerator::GetShaderCode(const ShaderRequest &reques...
function QPainterPath (line 256) | QPainterPath PolygonGenerator::GeneratePath(const NodeValueArray &poin...
FILE: app/node/generator/polygon/polygon.h
function namespace (line 33) | namespace olive {
FILE: app/node/generator/shape/generatorwithmerge.cpp
type olive (line 25) | namespace olive {
function ShaderCode (line 45) | ShaderCode GeneratorWithMerge::GetShaderCode(const ShaderRequest &requ...
FILE: app/node/generator/shape/generatorwithmerge.h
function namespace (line 26) | namespace olive {
FILE: app/node/generator/shape/shapenode.cpp
type olive (line 23) | namespace olive {
function QString (line 38) | QString ShapeNode::Name() const
function QString (line 43) | QString ShapeNode::id() const
function QString (line 53) | QString ShapeNode::Description() const
function ShaderCode (line 69) | ShaderCode ShapeNode::GetShaderCode(const ShaderRequest &request) const
FILE: app/node/generator/shape/shapenode.h
function namespace (line 26) | namespace olive {
FILE: app/node/generator/shape/shapenodebase.cpp
type olive (line 30) | namespace olive {
function QVector2D (line 251) | QVector2D ShapeNodeBase::GenerateGizmoAnchor(const QVector2D &pos, con...
FILE: app/node/generator/shape/shapenodebase.h
function namespace (line 30) | namespace olive {
FILE: app/node/generator/solid/solid.cpp
type olive (line 23) | namespace olive {
function QString (line 35) | QString SolidGenerator::Name() const
function QString (line 40) | QString SolidGenerator::id() const
function QString (line 50) | QString SolidGenerator::Description() const
function ShaderCode (line 67) | ShaderCode SolidGenerator::GetShaderCode(const ShaderRequest &request)...
FILE: app/node/generator/solid/solid.h
function namespace (line 26) | namespace olive {
FILE: app/node/generator/text/textv1.cpp
type olive (line 26) | namespace olive {
type TextVerticalAlign (line 28) | enum TextVerticalAlign {
function QString (line 60) | QString TextGeneratorV1::Name() const
function QString (line 65) | QString TextGeneratorV1::id() const
function QString (line 75) | QString TextGeneratorV1::Description() const
FILE: app/node/generator/text/textv1.h
function namespace (line 26) | namespace olive {
FILE: app/node/generator/text/textv2.cpp
type olive (line 28) | namespace olive {
type TextVerticalAlign (line 32) | enum TextVerticalAlign {
function QString (line 62) | QString TextGeneratorV2::Name() const
function QString (line 67) | QString TextGeneratorV2::id() const
function QString (line 77) | QString TextGeneratorV2::Description() const
FILE: app/node/generator/text/textv2.h
function namespace (line 26) | namespace olive {
FILE: app/node/generator/text/textv3.cpp
type olive (line 32) | namespace olive {
type TextVerticalAlign (line 36) | enum TextVerticalAlign {
function QString (line 69) | QString TextGeneratorV3::Name() const
function QString (line 74) | QString TextGeneratorV3::id() const
function QString (line 84) | QString TextGeneratorV3::Description() const
function QString (line 215) | QString TextGeneratorV3::FormatString(const QString &input, const QStr...
FILE: app/node/generator/text/textv3.h
function namespace (line 27) | namespace olive {
FILE: app/node/gizmo/draggable.cpp
type olive (line 23) | namespace olive {
FILE: app/node/gizmo/draggable.h
function namespace (line 28) | namespace olive {
FILE: app/node/gizmo/gizmo.cpp
type olive (line 23) | namespace olive {
FILE: app/node/gizmo/gizmo.h
function namespace (line 29) | namespace olive {
FILE: app/node/gizmo/line.cpp
type olive (line 23) | namespace olive {
FILE: app/node/gizmo/line.h
function namespace (line 28) | namespace olive {
FILE: app/node/gizmo/path.cpp
type olive (line 23) | namespace olive {
FILE: app/node/gizmo/path.h
function namespace (line 28) | namespace olive {
FILE: app/node/gizmo/point.cpp
type olive (line 25) | namespace olive {
function QRectF (line 73) | QRectF PointGizmo::GetClickingRect(const QTransform &t) const
function QRectF (line 83) | QRectF PointGizmo::GetDrawingRect(const QTransform &transform, double ...
FILE: app/node/gizmo/point.h
function namespace (line 28) | namespace olive {
FILE: app/node/gizmo/polygon.cpp
type olive (line 23) | namespace olive {
FILE: app/node/gizmo/polygon.h
function namespace (line 28) | namespace olive {
FILE: app/node/gizmo/screen.cpp
type olive (line 23) | namespace olive {
FILE: app/node/gizmo/screen.h
function namespace (line 26) | namespace olive {
FILE: app/node/gizmo/text.cpp
type olive (line 26) | namespace olive {
FILE: app/node/gizmo/text.h
function namespace (line 27) | namespace olive {
FILE: app/node/globals.cpp
type olive (line 23) | namespace olive {
FILE: app/node/globals.h
function namespace (line 29) | namespace olive {
FILE: app/node/group/group.cpp
type olive (line 25) | namespace olive {
function QString (line 35) | QString NodeGroup::Name() const
function QString (line 40) | QString NodeGroup::id() const
function QString (line 50) | QString NodeGroup::Description() const
function foreach (line 138) | foreach (const NodeGroup::InputPassthrough &ip, this->GetInputPassthro...
function foreach (line 182) | foreach (const SerializedData::GroupLink &l, data->group_input_links) {
function QString (line 211) | QString NodeGroup::AddInputPassthrough(const NodeInput &input, const Q...
function QString (line 286) | QString NodeGroup::GetInputName(const QString &id) const
function NodeInput (line 299) | NodeInput NodeGroup::ResolveInput(NodeInput input)
FILE: app/node/group/group.h
function namespace (line 26) | namespace olive {
FILE: app/node/input/multicam/multicamnode.cpp
type olive (line 5) | namespace olive {
function QString (line 27) | QString MultiCamNode::Name() const
function QString (line 32) | QString MultiCamNode::id() const
function QString (line 42) | QString MultiCamNode::Description() const
function Node (line 79) | Node *MultiCamNode::GetConnectedRenderOutput(const QString &input, int...
function TrackList (line 120) | TrackList *MultiCamNode::GetTrackList() const
FILE: app/node/input/multicam/multicamnode.h
function namespace (line 7) | namespace olive {
FILE: app/node/input/time/timeinput.cpp
type olive (line 23) | namespace olive {
function QString (line 31) | QString TimeInput::Name() const
function QString (line 36) | QString TimeInput::id() const
function QString (line 46) | QString TimeInput::Description() const
FILE: app/node/input/time/timeinput.h
function namespace (line 26) | namespace olive {
FILE: app/node/input/value/valuenode.cpp
type olive (line 23) | namespace olive {
function foreach (line 59) | foreach (NodeValue::Type type, kSupportedTypes) {
FILE: app/node/input/value/valuenode.h
function namespace (line 26) | namespace olive {
FILE: app/node/inputdragger.cpp
type olive (line 27) | namespace olive {
FILE: app/node/inputdragger.h
function namespace (line 28) | namespace olive {
FILE: app/node/inputimmediate.cpp
type olive (line 26) | namespace olive {
function NodeKeyframe (line 62) | NodeKeyframe* NodeInputImmediate::get_keyframe_at_time_on_track(const ...
function NodeKeyframe (line 75) | NodeKeyframe* NodeInputImmediate::get_closest_keyframe_to_time_on_trac...
function NodeKeyframe (line 111) | NodeKeyframe *NodeInputImmediate::get_closest_keyframe_before_time(con...
function NodeKeyframe (line 128) | NodeKeyframe* NodeInputImmediate::get_closest_keyframe_after_time(cons...
function foreach (line 165) | foreach (const NodeKeyframeTrack& track, keyframe_tracks_) {
function NodeKeyframe (line 187) | NodeKeyframe *NodeInputImmediate::get_earliest_keyframe() const
function NodeKeyframe (line 205) | NodeKeyframe *NodeInputImmediate::get_latest_keyframe() const
FILE: app/node/inputimmediate.h
function namespace (line 29) | namespace olive {
FILE: app/node/keyframe.cpp
type olive (line 25) | namespace olive {
function NodeKeyframe (line 54) | NodeKeyframe *NodeKeyframe::copy(int element, QObject *parent) const
function NodeKeyframe (line 62) | NodeKeyframe *NodeKeyframe::copy(QObject* parent) const
function Node (line 67) | Node *NodeKeyframe::parent() const
function rational (line 72) | const rational &NodeKeyframe::time() const
function QVariant (line 83) | const QVariant &NodeKeyframe::value() const
function QPointF (line 132) | const QPointF &NodeKeyframe::bezier_control_in() const
function QPointF (line 143) | const QPointF &NodeKeyframe::bezier_control_out() const
function QPointF (line 154) | QPointF NodeKeyframe::valid_bezier_control_in() const
function QPointF (line 167) | QPointF NodeKeyframe::valid_bezier_control_out() const
function QPointF (line 180) | const QPointF &NodeKeyframe::bezier_control(NodeKeyframe::BezierType t...
function XMLAttributeLoop (line 219) | XMLAttributeLoop(reader, attr) {
FILE: app/node/keyframe.h
function namespace (line 30) | namespace olive {
FILE: app/node/keying/chromakey/chromakey.cpp
type olive (line 21) | namespace olive {
function QString (line 68) | QString ChromaKeyNode::Name() const
function QString (line 73) | QString ChromaKeyNode::id() const
function QString (line 83) | QString ChromaKeyNode::Description() const
function ShaderCode (line 116) | ShaderCode ChromaKeyNode::GetShaderCode(const ShaderRequest &request) ...
FILE: app/node/keying/chromakey/chromakey.h
function namespace (line 21) | namespace olive {
FILE: app/node/keying/colordifferencekey/colordifferencekey.cpp
type olive (line 18) | namespace olive {
function QString (line 54) | QString ColorDifferenceKeyNode::Name() const
function QString (line 59) | QString ColorDifferenceKeyNode::id() const
function QString (line 69) | QString ColorDifferenceKeyNode::Description() const
function ShaderCode (line 88) | ShaderCode ColorDifferenceKeyNode::GetShaderCode(const ShaderRequest &...
FILE: app/node/keying/colordifferencekey/colordifferencekey.h
function namespace (line 21) | namespace olive {
FILE: app/node/keying/despill/despill.cpp
type olive (line 20) | namespace olive {
function QString (line 43) | QString DespillNode::Name() const
function QString (line 48) | QString DespillNode::id() const
function QString (line 58) | QString DespillNode::Description() const
function ShaderCode (line 78) | ShaderCode DespillNode::GetShaderCode(const ShaderRequest &request) co...
FILE: app/node/keying/despill/despill.h
function namespace (line 22) | namespace olive {
FILE: app/node/math/math/math.cpp
type olive (line 23) | namespace olive {
function QString (line 45) | QString MathNode::Name() const
function QString (line 58) | QString MathNode::id() const
function QString (line 68) | QString MathNode::Description() const
function ShaderCode (line 91) | ShaderCode MathNode::GetShaderCode(const ShaderRequest &request) const
FILE: app/node/math/math/math.h
function namespace (line 26) | namespace olive {
FILE: app/node/math/math/mathbase.cpp
type olive (line 29) | namespace olive {
function ShaderCode (line 31) | ShaderCode MathNodeBase::GetShaderCodeInternal(const QString &shader_i...
function QString (line 114) | QString MathNodeBase::GetShaderUniformType(const olive::NodeValue::Typ...
function QString (line 128) | QString MathNodeBase::GetShaderVariableCall(const QString &input_id, c...
function QVector4D (line 137) | QVector4D MathNodeBase::RetrieveVector(const NodeValue &val)
function QString (line 168) | QString MathNodeBase::GetOperationName(Operation o)
function NodeValue (line 574) | const NodeValue &MathNodeBase::PairingCalculator::GetMostLikelyValueA(...
function NodeValue (line 579) | const NodeValue &MathNodeBase::PairingCalculator::GetMostLikelyValueB(...
function T (line 585) | T MathNodeBase::PerformAll(Operation operation, T a, U b)
function T (line 604) | T MathNodeBase::PerformMultDiv(Operation operation, T a, U b)
function T (line 621) | T MathNodeBase::PerformAddSub(Operation operation, T a, U b)
function T (line 638) | T MathNodeBase::PerformMult(Operation operation, T a, U b)
function T (line 654) | T MathNodeBase::PerformAddSubMult(Operation operation, T a, U b)
function T (line 672) | T MathNodeBase::PerformAddSubMultDiv(Operation operation, T a, U b)
FILE: app/node/math/math/mathbase.h
type Operation (line 33) | enum Operation {
type Pairing (line 44) | enum Pairing {
FILE: app/node/math/merge/merge.cpp
type olive (line 25) | namespace olive {
function QString (line 41) | QString MergeNode::Name() const
function QString (line 46) | QString MergeNode::id() const
function QString (line 56) | QString MergeNode::Description() const
function ShaderCode (line 70) | ShaderCode MergeNode::GetShaderCode(const ShaderRequest &request) const
FILE: app/node/math/merge/merge.h
function namespace (line 26) | namespace olive {
FILE: app/node/math/trigonometry/trigonometry.cpp
type olive (line 23) | namespace olive {
function QString (line 37) | QString TrigonometryNode::Name() const
function QString (line 42) | QString TrigonometryNode::id() const
function QString (line 52) | QString TrigonometryNode::Description() const
FILE: app/node/math/trigonometry/trigonometry.h
function namespace (line 26) | namespace olive {
FILE: app/node/node.cpp
type olive (line 39) | namespace olive {
function foreach (line 70) | foreach (NodeInputImmediate* i, standard_immediates_) {
function Project (line 80) | Project *Node::parent() const
function Project (line 85) | Project *Node::project() const
function QString (line 90) | QString Node::ShortName() const
function QString (line 95) | QString Node::Description() const
function QVariant (line 106) | QVariant Node::data(const DataType &d) const
function Color (line 150) | Color Node::color() const
function QLinearGradient (line 163) | QLinearGradient Node::gradient_color(qreal top, qreal bottom) const
function QBrush (line 178) | QBrush Node::brush(qreal top, qreal bottom) const
function QString (line 248) | QString Node::GetInputName(const QString &id) const
function Node (line 310) | Node *Node::GetConnectedOutput(const QString &input, int element) const
function QVariant (line 387) | QVariant Node::GetInputProperty(const QString &id, const QString &name...
function SplitValue (line 412) | SplitValue Node::GetSplitValueAtTime(const QString &input, const ratio...
function QVariant (line 425) | QVariant Node::GetSplitValueAtTimeOnTrack(const QString &input, const ...
function QVariant (line 536) | QVariant Node::GetDefaultValue(const QString &input) const
function SplitValue (line 543) | SplitValue Node::GetSplitDefaultValue(const QString &input) const
function QVariant (line 555) | QVariant Node::GetSplitDefaultValueOnTrack(const QString &input, int t...
function NodeKeyframe (line 613) | NodeKeyframe *Node::GetKeyframeAtTimeOnTrack(const QString &input, con...
function NodeKeyframe (line 642) | NodeKeyframe *Node::GetEarliestKeyframe(const QString &id, int element...
function NodeKeyframe (line 654) | NodeKeyframe *Node::GetLatestKeyframe(const QString &id, int element) ...
function NodeKeyframe (line 666) | NodeKeyframe *Node::GetClosestKeyframeBeforeTime(const QString &id, co...
function NodeKeyframe (line 678) | NodeKeyframe *Node::GetClosestKeyframeAfterTime(const QString &id, con...
function QStringList (line 702) | QStringList Node::GetComboBoxStrings(const QString &id) const
function QVariant (line 707) | QVariant Node::GetStandardValue(const QString &id, int element) const
function SplitValue (line 714) | SplitValue Node::GetSplitStandardValue(const QString &id, int element)...
function QVariant (line 726) | QVariant Node::GetSplitStandardValueOnTrack(const QString &input, int ...
function NodeKeyframeTrack (line 876) | const NodeKeyframeTrack &Node::GetTrackFromKeyframe(NodeKeyframe *key)...
function NodeInputImmediate (line 881) | NodeInputImmediate *Node::GetImmediate(const QString &input, int eleme...
function InputFlags (line 896) | InputFlags Node::GetInputFlags(const QString &input) const
function TimeRange (line 955) | TimeRange Node::InputTimeAdjustment(const QString &, int, const TimeRa...
function TimeRange (line 961) | TimeRange Node::OutputTimeAdjustment(const QString &, int, const TimeR...
function Node (line 1024) | Node *Node::CopyNodeAndDependencyGraphMinusItemsInternal(QMap<Node*, N...
function Node (line 1096) | Node *Node::CopyNodeAndDependencyGraphMinusItems(Node *node, MultiUndo...
function Node (line 1103) | Node *Node::CopyNodeInGraph(Node *node, MultiUndoCommand *command)
function XMLAttributeLoop (line 1190) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 1227) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 1256) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 1278) | XMLAttributeLoop(reader, attr) {
function foreach (line 1335) | foreach (const QString& input, this->inputs()) {
function XMLAttributeLoop (line 1441) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 1469) | XMLAttributeLoop(reader, attr) {
function foreach (line 1626) | foreach (const QVariant& v, this->GetSplitStandardValue(input, element...
function NodeInputImmediate (line 1722) | NodeInputImmediate *Node::CreateImmediate(const QString &input)
function QString (line 1764) | QString Node::GetConnectCommandString(Node *output, const NodeInput &i...
function QString (line 1769) | QString Node::GetDisconnectCommandString(Node *output, const NodeInput...
function FindWaysNodeArrivesHereRecursively (line 1779) | void FindWaysNodeArrivesHereRecursively(const Node *output, const Node...
function QString (line 1812) | const QString &Node::GetLabel() const
function QString (line 1826) | QString Node::GetLabelAndName() const
function QString (line 1835) | QString Node::GetLabelOrName() const
function foreach (line 1847) | foreach (const QString& input, source->inputs()) {
function GetDependenciesRecursively (line 1968) | void GetDependenciesRecursively(QVector<Node*>& list, const Node* node...
function ShaderCode (line 2017) | ShaderCode Node::GetShaderCode(const ShaderRequest &request) const
function QString (line 2076) | QString Node::GetCategoryName(const CategoryID &c)
function TimeRange (line 2109) | TimeRange Node::TransformTimeTo(TimeRange time, Node *target, Transfor...
function TimeRange (line 2151) | TimeRange Node::GetRangeAffectedByKeyframe(NodeKeyframe *key) const
function TimeRange (line 2168) | TimeRange Node::GetRangeAroundIndex(const QString &input, int index, i...
function foreach (line 2325) | foreach (const TimeRange& r, invalidate_range) {
function FindPathInternal (line 2394) | bool FindPathInternal(std::list<NodeInput> &vec, Node *from, Node *to,...
function XMLAttributeLoop (line 2434) | XMLAttributeLoop(reader, attr) {
FILE: app/node/node.h
function namespace (line 47) | namespace olive {
function IsNodeExpandedInContext (line 325) | bool IsNodeExpandedInContext(Node *node) const
function ContextContainsNode (line 330) | bool ContextContainsNode(Node *node) const
function Position (line 335) | Position GetNodePositionDataInContext(Node *node)
function QPointF (line 340) | QPointF GetNodePositionInContext(Node *node)
function SetNodeExpandedInContext (line 349) | void SetNodeExpandedInContext(Node *node, bool e)
function Color (line 359) | Color color() const;
function SetCachesEnabled (line 394) | void SetCachesEnabled(bool e) { caches_enabled_ = e; }
function IsInputKeyframing (line 405) | bool IsInputKeyframing(const NodeInput& input) const
function SetInputIsKeyframing (line 411) | void SetInputIsKeyframing(const NodeInput& input, bool e)
function IsInputConnected (line 417) | bool IsInputConnected(const NodeInput& input) const
function virtual (line 422) | virtual bool IsInputConnectedForRender(const QString& input, int element...
function IsInputStatic (line 436) | bool IsInputStatic(const NodeInput& input) const
function Node (line 443) | Node *GetConnectedOutput(const NodeInput& input) const
function virtual (line 448) | virtual Node *GetConnectedRenderOutput(const QString& input, int element...
function QVariant (line 475) | QVariant GetValueAtTime(const NodeInput& input, const rational& time)
function SplitValue (line 482) | SplitValue GetSplitValueAtTime(const NodeInput& input, const rational& t...
function QVariant (line 488) | QVariant GetSplitValueAtTimeOnTrack(const NodeInput& input, const ration...
function QVariant (line 493) | QVariant GetSplitValueAtTimeOnTrack(const NodeKeyframeTrackReference& in...
function QVector (line 506) | const QVector<NodeKeyframeTrack>& GetKeyframeTracks(const QString& input...
function NodeKeyframe (line 519) | NodeKeyframe* GetKeyframeAtTimeOnTrack(const NodeInput& input, const rat...
function NodeKeyframe (line 524) | NodeKeyframe* GetKeyframeAtTimeOnTrack(const NodeKeyframeTrackReference&...
function GetNumberOfKeyframeTracks (line 542) | int GetNumberOfKeyframeTracks(const NodeInput& id) const
function NodeKeyframe (line 548) | NodeKeyframe* GetEarliestKeyframe(const NodeInput& id) const
function NodeKeyframe (line 554) | NodeKeyframe* GetLatestKeyframe(const NodeInput& id) const
function NodeKeyframe (line 560) | NodeKeyframe* GetClosestKeyframeBeforeTime(const NodeInput& id, const ra...
function NodeKeyframe (line 566) | NodeKeyframe* GetClosestKeyframeAfterTime(const NodeInput& id, const rat...
function HasKeyframeAtTime (line 572) | bool HasKeyframeAtTime(const NodeInput& id, const rational& time) const
function QVariant (line 580) | QVariant GetStandardValue(const NodeInput& id) const
function SplitValue (line 586) | SplitValue GetSplitStandardValue(const NodeInput& id) const
function QVariant (line 592) | QVariant GetSplitStandardValueOnTrack(const NodeKeyframeTrackReference& ...
function SetStandardValue (line 598) | void SetStandardValue(const NodeInput& id, const QVariant& value)
function SetSplitStandardValue (line 604) | void SetSplitStandardValue(const NodeInput& id, const SplitValue& value)
function SetSplitStandardValueOnTrack (line 610) | void SetSplitStandardValueOnTrack(const NodeKeyframeTrackReference& id, ...
function InputArrayAppend (line 621) | void InputArrayAppend(const QString& id)
function InputArrayPrepend (line 626) | void InputArrayPrepend(const QString& id)
function InputArrayRemoveLast (line 631) | void InputArrayRemoveLast(const QString& id)
function NodeInput (line 640) | NodeInput GetEffectInput()
function class (line 650) | class ValueHint {
function set_type (line 681) | void set_type(const QVector<NodeValue::Type> &type) { type_ = type; }
function set_index (line 682) | void set_index(const int &index) { index_ = index; }
function set_tag (line 683) | void set_tag(const QString &tag) { tag_ = tag; }
function ShaderRequest (line 754) | struct ShaderRequest
type TransformTimeDirection (line 818) | enum TransformTimeDirection {
function InvalidateCache (line 853) | void InvalidateCache(const TimeRange& range, const NodeInput& from, cons...
function virtual (line 921) | virtual QTransform GizmoTransformation(const NodeValueRow &row, const No...
function virtual (line 923) | virtual void UpdateGizmoPositions(const NodeValueRow &row, const NodeGlo...
function QString (line 925) | const QString& GetLabel() const;
function virtual (line 951) | virtual void SaveCustom(QXmlStreamWriter *writer) const {}
function SetFolder (line 960) | void SetFolder(Folder* folder)
function virtual (line 968) | virtual void LoadFinishedEvent(){}
function virtual (line 969) | virtual void ConnectedToPreviewEvent(){}
function virtual (line 980) | virtual void AddedToGraphEvent(Project *p){}
function virtual (line 981) | virtual void RemovedFromGraphEvent(Project *p){}
function PrependInput (line 991) | void PrependInput(const QString& id, NodeValue::Type type, const QVarian...
function PrependInput (line 996) | void PrependInput(const QString& id, NodeValue::Type type, InputFlags fl...
function AddInput (line 1001) | void AddInput(const QString& id, NodeValue::Type type, const QVariant& d...
function AddInput (line 1006) | void AddInput(const QString& id, NodeValue::Type type, InputFlags flags ...
function SetComboBoxStrings (line 1013) | void SetComboBoxStrings(const QString& id, const QStringList& strings)
type GizmoScaleHandles (line 1020) | enum GizmoScaleHandles {
function virtual (line 1032) | virtual void LinkChangeEvent(){}
function SetEffectInput (line 1046) | void SetEffectInput(const QString &input)
function protected (line 1083) | protected slots:
function virtual (line 1086) | virtual void GizmoDragMove(double x, double y, const Qt::KeyboardModifie...
type Input (line 1147) | struct Input {
function GetInternalInputIndex (line 1158) | int GetInternalInputIndex(const QString& input) const
function Input (line 1163) | Input* GetInternalInputData(const QString& input)
function Input (line 1174) | const Input* GetInternalInputData(const QString& input) const
function ParameterValueChanged (line 1206) | void ParameterValueChanged(const NodeInput& input, const olive::core::Ti...
FILE: app/node/nodeundo.cpp
type olive (line 23) | namespace olive {
function Project (line 150) | Project *NodeEdgeAddCommand::GetRelevantProject() const
function Project (line 171) | Project *NodeEdgeRemoveCommand::GetRelevantProject() const
function Project (line 199) | Project *NodeAddCommand::GetRelevantProject() const
function Project (line 246) | Project *NodeRenameCommand::GetRelevantProject() const
function Project (line 257) | Project *NodeOverrideColorCommand::GetRelevantProject() const
function foreach (line 301) | foreach (const Node::OutputConnection &edge, edges_) {
function foreach (line 312) | foreach (const Node::ContextPair &pair, nodes_) {
function Project (line 321) | Project *NodeViewDeleteCommand::GetRelevantProject() const
function foreach (line 336) | foreach (const Node::OutputConnection &edge, edges_) {
function foreach (line 340) | foreach (const Node::ContextPair &pair, nodes_) {
function Project (line 385) | Project *NodeParamSetKeyframingCommand::GetRelevantProject() const
function Project (line 416) | Project *NodeParamSetKeyframeValueCommand::GetRelevantProject() const
function Project (line 439) | Project *NodeParamInsertKeyframeCommand::GetRelevantProject() const
function Project (line 460) | Project *NodeParamRemoveKeyframeCommand::GetRelevantProject() const
function Project (line 490) | Project *NodeParamSetKeyframeTimeCommand::GetRelevantProject() const
function Project (line 519) | Project *NodeParamSetStandardValueCommand::GetRelevantProject() const
function Project (line 540) | Project *NodeParamArrayAppendCommand::GetRelevantProject() const
function Project (line 566) | Project *NodeArrayInsertCommand::GetRelevantProject() const
function Project (line 571) | Project *NodeArrayRemoveCommand::GetRelevantProject() const
function Project (line 576) | Project *NodeArrayResizeCommand::GetRelevantProject() const
FILE: app/node/nodeundo.h
function namespace (line 28) | namespace olive {
function class (line 529) | class NodeLinkManyCommand : public MultiUndoCommand {
function virtual (line 543) | virtual Project* GetRelevantProject() const override
function class (line 553) | class NodeRenameCommand : public UndoCommand
function class (line 579) | class NodeOverrideColorCommand : public UndoCommand
function class (line 600) | class NodeViewDeleteCommand : public UndoCommand
function class (line 636) | class NodeParamSetKeyframingCommand : public UndoCommand
function class (line 654) | class NodeParamInsertKeyframeCommand : public UndoCommand
function class (line 674) | class NodeParamRemoveKeyframeCommand : public UndoCommand
function class (line 694) | class NodeParamSetKeyframeTimeCommand : public UndoCommand
function class (line 714) | class NodeParamSetKeyframeValueCommand : public UndoCommand
function class (line 734) | class NodeParamSetStandardValueCommand : public UndoCommand
function class (line 754) | class NodeParamSetSplitStandardValueCommand : public UndoCommand
function class (line 791) | class NodeParamArrayAppendCommand : public UndoCommand
function class (line 810) | class NodeSetValueHintCommand : public UndoCommand
function class (line 842) | class NodeImmediateRemoveAllKeyframesCommand : public UndoCommand
FILE: app/node/output/track/track.cpp
type olive (line 32) | namespace olive {
function QString (line 73) | QString Track::Name() const
function QString (line 86) | QString Track::id() const
function QString (line 96) | QString Track::Description() const
function TimeRange (line 155) | TimeRange Track::InputTimeAdjustment(const QString& input, int element...
function TimeRange (line 175) | TimeRange Track::OutputTimeAdjustment(const QString& input, int elemen...
function Block (line 257) | Block *Track::BlockContainingTime(const rational &time) const
function Block (line 270) | Block *Track::NearestBlockBefore(const rational &time) const
function Block (line 286) | Block *Track::NearestBlockBeforeOrAt(const rational &time) const
function Block (line 298) | Block *Track::NearestBlockAfterOrAt(const rational &time) const
function Block (line 310) | Block *Track::NearestBlockAfter(const rational &time) const
function rational (line 530) | rational Track::track_length() const
function uint (line 803) | uint qHash(const Track::Reference &r, uint seed)
function QDataStream (line 811) | QDataStream &operator<<(QDataStream &out, const Track::Reference &ref)
function QDataStream (line 818) | QDataStream &operator>>(QDataStream &in, Track::Reference &ref)
FILE: app/node/output/track/track.h
function namespace (line 26) | namespace olive {
FILE: app/node/output/track/tracklist.cpp
type olive (line 29) | namespace olive {
function Track (line 39) | Track *TrackList::GetTrackAt(int index) const
function Project (line 145) | Project *TrackList::GetParentGraph() const
function QString (line 150) | const QString& TrackList::track_input() const
function NodeInput (line 155) | NodeInput TrackList::track_input(int element) const
function Sequence (line 160) | Sequence *TrackList::parent() const
function foreach (line 184) | foreach (Track* track, track_cache_) {
FILE: app/node/output/track/tracklist.h
function namespace (line 29) | namespace olive {
FILE: app/node/output/viewer/viewer.cpp
type olive (line 27) | namespace olive {
function QString (line 70) | QString ViewerOutput::Name() const
function QString (line 75) | QString ViewerOutput::id() const
function QString (line 85) | QString ViewerOutput::Description() const
function QVariant (line 90) | QVariant ViewerOutput::data(const DataType &d) const
function VideoParams (line 162) | VideoParams ViewerOutput::GetFirstEnabledVideoStream() const
function AudioParams (line 177) | AudioParams ViewerOutput::GetFirstEnabledAudioStream() const
function SubtitleParams (line 192) | SubtitleParams ViewerOutput::GetFirstEnabledSubtitleStream() const
function rational (line 354) | rational ViewerOutput::VerifyLengthInternal(Track::Type type) const
function Node (line 386) | Node *ViewerOutput::GetConnectedTextureOutput()
function Node (line 396) | Node *ViewerOutput::GetConnectedSampleOutput()
function foreach (line 517) | foreach (ViewerOutput* f, footage) {
FILE: app/node/param.cpp
type olive (line 25) | namespace olive {
function QString (line 27) | QString NodeInput::name() const
function InputFlags (line 72) | InputFlags NodeInput::GetFlags() const
function QString (line 81) | QString NodeInput::GetInputName() const
function Node (line 90) | Node *NodeInput::GetConnectedOutput() const
function QVariant (line 108) | QVariant NodeInput::GetDefaultValue() const
function QStringList (line 117) | QStringList NodeInput::GetComboBoxStrings() const
function QVariant (line 126) | QVariant NodeInput::GetProperty(const QString &key) const
function QVariant (line 144) | QVariant NodeInput::GetValueAtTime(const rational &time) const
function NodeKeyframe (line 153) | NodeKeyframe* NodeInput::GetKeyframeAtTimeOnTrack(const rational &time...
function QVariant (line 162) | QVariant NodeInput::GetSplitDefaultValueForTrack(int track) const
function uint (line 180) | uint qHash(const NodeInput &i)
function uint (line 185) | uint qHash(const NodeKeyframeTrackReference &i)
function uint (line 190) | uint qHash(const NodeInputPair &i)
FILE: app/node/param.h
function namespace (line 28) | namespace olive {
function class (line 170) | class NodeInput
type InputElementPair (line 294) | struct InputElementPair {
function class (line 318) | class NodeKeyframeTrackReference {
FILE: app/node/project.cpp
type olive (line 36) | namespace olive {
function SerializedData (line 90) | SerializedData Project::Load(QXmlStreamReader *reader)
function foreach (line 199) | foreach (Node *ctx, node_children_) {
function foreach (line 270) | foreach (Node *context, node_children_) {
function QString (line 277) | QString Project::name() const
function QString (line 286) | const QString &Project::filename() const
function QString (line 291) | QString Project::pretty_filename() const
function QString (line 337) | QString Project::get_cache_alongside_project_path() const
function QString (line 346) | QString Project::cache_path() const
function Project (line 379) | Project *Project::GetProjectFromObject(const QObject *o)
FILE: app/node/project.h
function namespace (line 33) | namespace olive {
FILE: app/node/project/folder/folder.cpp
type olive (line 29) | namespace olive {
function QVariant (line 42) | QVariant Folder::data(const DataType &d) const
function Node (line 58) | Node *GetChildWithNameInternal(const Folder* n, const QString& s)
function Node (line 75) | Node *Folder::GetChildWithName(const QString &s) const
function Project (line 141) | Project *FolderAddChild::GetRelevantProject() const
FILE: app/node/project/folder/folder.h
function namespace (line 26) | namespace olive {
FILE: app/node/project/footage/footage.cpp
type olive (line 36) | namespace olive {
function rational (line 86) | rational Footage::VerifyLengthInternal(Track::Type type) const
function QString (line 111) | QString Footage::GetColorspaceToUse(const VideoParams ¶ms) const
function QString (line 142) | QString Footage::filename() const
function qint64 (line 152) | const qint64 &Footage::timestamp() const
function QString (line 203) | const QString &Footage::decoder() const
function QString (line 208) | QString Footage::DescribeVideoStream(const VideoParams ¶ms)
function QString (line 221) | QString Footage::DescribeAudioStream(const AudioParams ¶ms)
function QString (line 228) | QString Footage::DescribeSubtitleStream(const SubtitleParams ¶ms)
function QString (line 281) | QString Footage::GetStreamTypeName(Track::Type type)
function Node (line 298) | Node *Footage::GetConnectedTextureOutput()
function Node (line 307) | Node *Footage::GetConnectedSampleOutput()
function TimeIsOutOfBounds (line 316) | bool TimeIsOutOfBounds(const rational& time, const rational& length)
function rational (line 321) | rational Footage::AdjustTimeByLoopMode(rational time, LoopMode loop_mo...
function QVariant (line 353) | QVariant Footage::data(const DataType &d) const
function foreach (line 505) | foreach (DecoderPtr decoder, decoder_list) {
function VideoParams (line 557) | VideoParams Footage::MergeVideoStream(const VideoParams &base, const V...
FILE: app/node/project/footage/footage.h
function namespace (line 34) | namespace olive {
FILE: app/node/project/footage/footagedescription.cpp
type olive (line 30) | namespace olive {
function foreach (line 131) | foreach (const VideoParams& vp, video_streams_) {
function foreach (line 137) | foreach (const AudioParams& ap, audio_streams_) {
function foreach (line 143) | foreach (const SubtitleParams& sp, subtitle_streams_) {
FILE: app/node/project/footage/footagedescription.h
function namespace (line 28) | namespace olive {
FILE: app/node/project/sequence/sequence.cpp
type olive (line 29) | namespace olive {
function QVariant (line 74) | QVariant Sequence::data(const DataType &d) const
function rational (line 134) | rational Sequence::VerifyLengthInternal(Track::Type type) const
function foreach (line 155) | foreach (TrackList* list, track_lists_) {
function foreach (line 168) | foreach (TrackList* list, track_lists_) {
function foreach (line 183) | foreach (TrackList* list, track_lists_) {
FILE: app/node/project/sequence/sequence.h
function namespace (line 27) | namespace olive {
FILE: app/node/project/serializer/serializer.cpp
type olive (line 37) | namespace olive {
function XMLAttributeLoop (line 109) | XMLAttributeLoop(reader, attr) {
function foreach (line 264) | foreach (ProjectSerializer *s, instances_) {
FILE: app/node/project/serializer/serializer.h
function namespace (line 30) | namespace olive {
FILE: app/node/project/serializer/serializer190219.cpp
type olive (line 23) | namespace olive {
FILE: app/node/project/serializer/serializer190219.h
function namespace (line 26) | namespace olive {
FILE: app/node/project/serializer/serializer210528.cpp
type olive (line 27) | namespace olive {
function XMLAttributeLoop (line 48) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 103) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 207) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 239) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 267) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 348) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 395) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 425) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 513) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 570) | XMLAttributeLoop(reader, attr) {
function foreach (line 597) | foreach (const XMLNodeData::SerializedConnection& con, xml_node_data.d...
function foreach (line 608) | foreach (const XMLNodeData::BlockLink& l, xml_node_data.block_links) {
function foreach (line 615) | foreach (const XMLNodeData::GroupLink &l, xml_node_data.group_input_li...
function XMLAttributeLoop (line 714) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 740) | XMLAttributeLoop(reader, attr) {
FILE: app/node/project/serializer/serializer210528.h
function namespace (line 26) | namespace olive {
FILE: app/node/project/serializer/serializer210907.cpp
type olive (line 27) | namespace olive {
function XMLAttributeLoop (line 48) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 103) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 207) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 236) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 264) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 345) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 392) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 422) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 510) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 567) | XMLAttributeLoop(reader, attr) {
function foreach (line 594) | foreach (const XMLNodeData::SerializedConnection& con, xml_node_data.d...
function foreach (line 600) | foreach (const XMLNodeData::BlockLink& l, xml_node_data.block_links) {
function foreach (line 607) | foreach (const XMLNodeData::GroupLink &l, xml_node_data.group_input_li...
function XMLAttributeLoop (line 706) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 732) | XMLAttributeLoop(reader, attr) {
FILE: app/node/project/serializer/serializer210907.h
function namespace (line 26) | namespace olive {
FILE: app/node/project/serializer/serializer211228.cpp
type olive (line 27) | namespace olive {
function XMLAttributeLoop (line 50) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 105) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 150) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 257) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 286) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 314) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 395) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 442) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 472) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 560) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 617) | XMLAttributeLoop(reader, attr) {
function foreach (line 644) | foreach (const XMLNodeData::SerializedConnection& con, xml_node_data.d...
function foreach (line 650) | foreach (const XMLNodeData::BlockLink& l, xml_node_data.block_links) {
function foreach (line 657) | foreach (const XMLNodeData::GroupLink &l, xml_node_data.group_input_li...
function XMLAttributeLoop (line 756) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 782) | XMLAttributeLoop(reader, attr) {
FILE: app/node/project/serializer/serializer211228.h
function namespace (line 26) | namespace olive {
FILE: app/node/project/serializer/serializer220403.cpp
type olive (line 27) | namespace olive {
function XMLAttributeLoop (line 69) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 126) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 144) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 157) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 170) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 236) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 281) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 395) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 424) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 466) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 546) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 599) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 629) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 755) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 789) | XMLAttributeLoop(reader, attr) {
function foreach (line 816) | foreach (const XMLNodeData::SerializedConnection& con, xml_node_data.d...
function foreach (line 822) | foreach (const XMLNodeData::BlockLink& l, xml_node_data.block_links) {
function foreach (line 829) | foreach (const XMLNodeData::GroupLink &l, xml_node_data.group_input_li...
function XMLAttributeLoop (line 974) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 997) | XMLAttributeLoop(reader, attr) {
FILE: app/node/project/serializer/serializer220403.h
function namespace (line 26) | namespace olive {
FILE: app/node/project/serializer/serializer230220.cpp
type olive (line 28) | namespace olive {
function XMLAttributeLoop (line 80) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 98) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 111) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 124) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 187) | XMLAttributeLoop(reader, attr) {
function XMLAttributeLoop (line 255) | XMLAttributeLoop(reader, attr) {
function WriteNodeMap (line 314) | void WriteNodeMap(QXmlStreamWriter *writer, Node *node, const QVector<...
function foreach (line 460) | foreach (const SerializedData::SerializedConnection& con, project_data...
function foreach (line 466) | foreach (const SerializedData::BlockLink& l, project_data->block_links) {
FILE: app/node/project/serializer/serializer230220.h
function namespace (line 26) | namespace olive {
FILE: app/node/project/serializer/typeserializer.cpp
type olive (line 23) | namespace olive {
function AudioParams (line 25) | AudioParams TypeSerializer::LoadAudioParams(QXmlStreamReader *reader)
FILE: app/node/project/serializer/typeserializer.h
function namespace (line 30) | namespace olive {
FILE: app/node/serializeddata.cpp
type olive (line 23) | namespace olive {
FILE: app/node/serializeddata.h
function namespace (line 29) | namespace olive {
FILE: app/node/splitvalue.h
function namespace (line 27) | namespace olive {
FILE: app/node/time/timeformat/timeformat.cpp
type olive (line 25) | namespace olive {
function QString (line 40) | QString TimeFormatNode::Name() const
function QString (line 45) | QString TimeFormatNode::id() const
function QString (line 55) | QString TimeFormatNode::Description() const
FILE: app/node/time/timeformat/timeformat.h
function namespace (line 26) | namespace olive {
FILE: app/node/time/timeoffset/timeoffsetnode.cpp
type olive (line 25) | namespace olive {
function TimeRange (line 49) | TimeRange TimeOffsetNode::InputTimeAdjustment(const QString &input, in...
function TimeRange (line 58) | TimeRange TimeOffsetNode::OutputTimeAdjustment(const QString &input, i...
function rational (line 75) | rational TimeOffsetNode::GetRemappedTime(const rational &input) const
FILE: app/node/time/timeoffset/timeoffsetnode.h
function namespace (line 26) | namespace olive {
FILE: app/node/time/timeremap/timeremap.cpp
type olive (line 25) | namespace olive {
function QString (line 41) | QString TimeRemapNode::Name() const
function QString (line 46) | QString TimeRemapNode::id() const
function QString (line 56) | QString TimeRemapNode::Description() const
function TimeRange (line 61) | TimeRange TimeRemapNode::InputTimeAdjustment(const QString &input, int...
function TimeRange (line 70) | TimeRange TimeRemapNode::OutputTimeAdjustment(const QString &input, in...
function rational (line 95) | rational TimeRemapNode::GetRemappedTime(const rational &input) const
FILE: app/node/time/timeremap/timeremap.h
function namespace (line 26) | namespace olive {
FILE: app/node/traverser.cpp
type olive (line 28) | namespace olive {
function NodeValueDatabase (line 30) | NodeValueDatabase NodeTraverser::GenerateDatabase(const Node* node, co...
function NodeValueRow (line 59) | NodeValueRow NodeTraverser::GenerateRow(NodeValueDatabase *database, c...
function NodeValueRow (line 82) | NodeValueRow NodeTraverser::GenerateRow(const Node *node, const TimeRa...
function NodeValue (line 90) | NodeValue NodeTraverser::GenerateRowValue(const Node *node, const QStr...
function NodeValue (line 109) | NodeValue NodeTraverser::GenerateRowValueElement(const Node *node, con...
function NodeValueTable (line 187) | NodeValueTable NodeTraverser::ProcessInput(const Node* node, const QSt...
class GTTTime (line 261) | class GTTTime
method GTTTime (line 264) | GTTTime(const Node *n) { t = QDateTime::currentMSecsSinceEpoch(); no...
function NodeValueTable (line 273) | NodeValueTable NodeTraverser::GenerateTable(const Node *n, const TimeR...
function TexturePtr (line 341) | TexturePtr NodeTraverser::ProcessVideoCacheJob(const CacheJob *val)
function QVector2D (line 346) | QVector2D NodeTraverser::GenerateResolution() const
function TexturePtr (line 474) | TexturePtr NodeTraverser::CreateDummyTexture(const VideoParams &p)
FILE: app/node/traverser.h
function namespace (line 36) | namespace olive {
FILE: app/node/value.cpp
type olive (line 33) | namespace olive {
function QString (line 35) | QString NodeValue::ValueToString(Type data_type, const QVariant &value...
function QVariant (line 151) | QVariant NodeValue::combine_track_values_into_normal_value(Type type, ...
function QVariant (line 212) | QVariant NodeValue::StringToValue(Type data_type, const QString &strin...
function QString (line 262) | QString NodeValue::GetPrettyDataTypeName(Type type)
function QString (line 314) | QString NodeValue::GetDataTypeName(Type type)
function NodeValue (line 379) | NodeValue NodeValueTable::Get(const QVector<NodeValue::Type> &type, co...
function NodeValue (line 390) | NodeValue NodeValueTable::Take(const QVector<NodeValue::Type> &type, c...
function NodeValueTable (line 426) | NodeValueTable NodeValueTable::Merge(QList<NodeValueTable> tables)
FILE: app/node/value.h
function namespace (line 33) | namespace olive {
function set_tag (line 254) | void set_tag(const QString& tag)
function Node (line 259) | const Node* source() const
function QString (line 285) | static QString ValueToString(const NodeValue &v, bool value_is_a_key_track)
function type_can_be_interpolated (line 304) | static bool type_can_be_interpolated(NodeValue::Type type)
function type_is_numeric (line 315) | static bool type_is_numeric(NodeValue::Type type)
function type_is_vector (line 322) | static bool type_is_vector(NodeValue::Type type)
function type_is_buffer (line 329) | static bool type_is_buffer(NodeValue::Type type)
function class (line 365) | class NodeValueTable
function Prepend (line 408) | void Prepend(const NodeValue& value)
function NodeValue (line 425) | const NodeValue& at(int index) const
function NodeValue (line 429) | NodeValue TakeAt(int index)
function Clear (line 442) | void Clear()
FILE: app/node/valuedatabase.cpp
type olive (line 23) | namespace olive {
function NodeValueTable (line 25) | NodeValueTable NodeValueDatabase::Merge() const
FILE: app/node/valuedatabase.h
function namespace (line 27) | namespace olive {
FILE: app/panel/audiomonitor/audiomonitor.cpp
type olive (line 25) | namespace olive {
FILE: app/panel/audiomonitor/audiomonitor.h
function namespace (line 27) | namespace olive {
FILE: app/panel/curve/curve.cpp
type olive (line 23) | namespace olive {
FILE: app/panel/curve/curve.h
function namespace (line 27) | namespace olive {
FILE: app/panel/footageviewer/footageviewer.cpp
type olive (line 23) | namespace olive {
FILE: app/panel/footageviewer/footageviewer.h
function namespace (line 30) | namespace olive {
FILE: app/panel/history/historypanel.cpp
type olive (line 25) | namespace olive {
FILE: app/panel/history/historypanel.h
function namespace (line 26) | namespace olive {
FILE: app/panel/multicam/multicampanel.cpp
type olive (line 3) | namespace olive {
FILE: app/panel/multicam/multicampanel.h
function namespace (line 7) | namespace olive {
FILE: app/panel/node/node.cpp
type olive (line 23) | namespace olive {
FILE: app/panel/node/node.h
function namespace (line 27) | namespace olive {
FILE: app/panel/panel.cpp
type olive (line 33) | namespace olive {
FILE: app/panel/panel.h
function namespace (line 29) | namespace olive {
FILE: app/panel/panelmanager.cpp
type olive (line 25) | namespace olive {
function PanelWidget (line 48) | PanelWidget *PanelManager::CurrentlyFocused(bool enable_hover) const
function PanelWidget (line 67) | PanelWidget *PanelManager::CurrentlyHovered() const
function PanelWidget (line 80) | PanelWidget *PanelManager::GetPanelWithName(const QString &name) const
function PanelManager (line 101) | PanelManager *PanelManager::instance()
FILE: app/panel/panelmanager.h
function namespace (line 29) | namespace olive {
FILE: app/panel/param/param.cpp
type olive (line 25) | namespace olive {
FILE: app/panel/param/param.h
function namespace (line 28) | namespace olive {
FILE: app/panel/pixelsampler/pixelsamplerpanel.cpp
type olive (line 25) | namespace olive {
FILE: app/panel/pixelsampler/pixelsamplerpanel.h
function namespace (line 27) | namespace olive {
FILE: app/panel/project/footagemanagementpanel.h
function namespace (line 28) | namespace olive {
FILE: app/panel/project/project.cpp
type olive (line 35) | namespace olive {
function Project (line 76) | Project* ProjectPanel::project() const
function Folder (line 100) | Folder *ProjectPanel::get_root() const
function Folder (line 117) | Folder *ProjectPanel::GetSelectedFolder() const
function ProjectViewModel (line 122) | ProjectViewModel *ProjectPanel::model() const
function foreach (line 224) | foreach (Node* i, items) {
FILE: app/panel/project/project.h
function namespace (line 29) | namespace olive {
FILE: app/panel/scope/scope.cpp
type olive (line 27) | namespace olive {
function QString (line 74) | QString ScopePanel::TypeToName(ScopePanel::Type t)
FILE: app/panel/scope/scope.h
function namespace (line 32) | namespace olive {
FILE: app/panel/sequenceviewer/sequenceviewer.cpp
type olive (line 24) | namespace olive {
FILE: app/panel/sequenceviewer/sequenceviewer.h
function namespace (line 26) | namespace olive {
FILE: app/panel/table/table.cpp
type olive (line 23) | namespace olive {
FILE: app/panel/table/table.h
function namespace (line 27) | namespace olive {
FILE: app/panel/taskmanager/taskmanager.cpp
type olive (line 25) | namespace olive {
FILE: app/panel/taskmanager/taskmanager.h
function namespace (line 27) | namespace olive {
FILE: app/panel/timebased/timebased.cpp
type olive (line 23) | namespace olive {
function rational (line 37) | const rational& TimeBasedPanel::timebase()
FILE: app/panel/timebased/timebased.h
function namespace (line 27) | namespace olive {
FILE: app/panel/timeline/timeline.cpp
type olive (line 26) | namespace olive {
FILE: app/panel/timeline/timeline.h
function namespace (line 27) | namespace olive {
FILE: app/panel/tool/tool.cpp
type olive (line 26) | namespace olive {
FILE: app/panel/tool/tool.h
function namespace (line 26) | namespace olive {
FILE: app/panel/viewer/viewer.cpp
type olive (line 23) | namespace olive {
FILE: app/panel/viewer/viewer.h
function namespace (line 28) | namespace olive {
FILE: app/panel/viewer/viewerbase.cpp
type olive (line 25) | namespace olive {
FILE: app/panel/viewer/viewerbase.h
function namespace (line 28) | namespace olive {
FILE: app/render/alphaassoc.h
function namespace (line 24) | namespace olive {
FILE: app/render/audioplaybackcache.cpp
type olive (line 31) | namespace olive {
function QString (line 130) | QString AudioPlaybackCache::GetSegmentFilename(qint64 segment_index, i...
FILE: app/render/audioplaybackcache.h
function namespace (line 27) | namespace olive {
FILE: app/render/audiowaveformcache.cpp
type olive (line 23) | namespace olive {
function foreach (line 36) | foreach (const TimeRange& r, valid_ranges) {
function DrawSubRect (line 45) | void DrawSubRect(QPainter *painter, const QRect &rect, const double &s...
function rational (line 88) | rational AudioWaveformCache::length() const
FILE: app/render/audiowaveformcache.h
function namespace (line 27) | namespace olive {
FILE: app/render/cancelatom.h
function namespace (line 6) | namespace olive {
FILE: app/render/colorprocessor.cpp
type olive (line 27) | namespace olive {
function Color (line 110) | Color ColorProcessor::ConvertColor(const Color& in)
function ColorProcessorPtr (line 120) | ColorProcessorPtr ColorProcessor::Create(ColorManager *config, const Q...
function ColorProcessorPtr (line 125) | ColorProcessorPtr ColorProcessor::Create(OCIO::ConstProcessorRcPtr pro...
FILE: app/render/colorprocessor.h
function namespace (line 28) | namespace olive {
FILE: app/render/colorprocessorcache.h
function namespace (line 26) | namespace olive {
FILE: app/render/colortransform.h
function namespace (line 29) | namespace olive {
FILE: app/render/diskmanager.cpp
type olive (line 35) | namespace olive {
function DiskManager (line 101) | DiskManager *DiskManager::instance()
function foreach (line 122) | foreach (DiskCacheFolder* f, open_folders_) {
function DiskCacheFolder (line 134) | DiskCacheFolder *DiskManager::GetOpenFolder(const QString &path)
function QString (line 165) | QString DiskManager::GetDefaultDiskCacheConfigFile()
function QString (line 170) | QString DiskManager::GetDefaultDiskCachePath()
FILE: app/render/diskmanager.h
function namespace (line 32) | namespace olive {
FILE: app/render/framehashcache.cpp
type olive (line 38) | namespace olive {
function QString (line 67) | QString FrameHashCache::GetValidCacheFilename(const rational &time) const
function FramePtr (line 125) | FramePtr FrameHashCache::LoadCacheFrame(const QString &cache_path, con...
function FramePtr (line 140) | FramePtr FrameHashCache::LoadCacheFrame(const int64_t &hash) const
function FramePtr (line 145) | FramePtr FrameHashCache::LoadCacheFrame(const QString &fn)
function rational (line 277) | rational FrameHashCache::ToTime(const int64_t &ts) const
function QString (line 310) | QString FrameHashCache::CachePathName(const int64_t &time) const
function QString (line 315) | QString FrameHashCache::CachePathName(const rational &time) const
function QString (line 320) | QString FrameHashCache::CachePathName(const QString &cache_path, const...
function QString (line 332) | QString FrameHashCache::CachePathName(const QString &cache_path, const...
FILE: app/render/framehashcache.h
function namespace (line 28) | namespace olive {
FILE: app/render/framemanager.cpp
type olive (line 26) | namespace olive {
function FrameManager (line 42) | FrameManager *FrameManager::instance()
FILE: app/render/framemanager.h
function namespace (line 28) | namespace olive {
FILE: app/render/job/acceleratedjob.cpp
type olive (line 23) | namespace olive {
FILE: app/render/job/acceleratedjob.h
function namespace (line 27) | namespace olive {
FILE: app/render/job/cachejob.h
function namespace (line 30) | namespace olive {
FILE: app/render/job/colortransformjob.h
function namespace (line 32) | namespace olive {
FILE: app/render/job/footagejob.h
function namespace (line 26) | namespace olive {
FILE: app/render/job/generatejob.h
function namespace (line 27) | namespace olive {
FILE: app/render/job/samplejob.h
function namespace (line 26) | namespace olive {
FILE: app/render/job/shaderjob.h
function namespace (line 30) | namespace olive {
FILE: app/render/loopmode.h
function namespace (line 4) | namespace olive {
FILE: app/render/managedcolor.cpp
type olive (line 23) | namespace olive {
function QString (line 44) | const QString &ManagedColor::color_input() const
function ColorTransform (line 54) | const ColorTransform &ManagedColor::color_output() const
FILE: app/render/managedcolor.h
function namespace (line 28) | namespace olive {
FILE: app/render/opengl/openglrenderer.cpp
type olive (line 30) | namespace olive {
class ErrorPrinter (line 54) | class ErrorPrinter {
method ErrorPrinter (line 56) | ErrorPrinter(const char* name, QOpenGLFunctions* f)
function QVariant (line 192) | QVariant OpenGLRenderer::CreateNativeTexture(int width, int height, in...
function QVariant (line 256) | QVariant OpenGLRenderer::CreateNativeShader(ShaderCode code)
function Color (line 376) | Color OpenGLRenderer::GetPixelFromTexture(Texture *texture, const QPoi...
type TextureToBind (line 396) | struct TextureToBind {
function GLint (line 677) | GLint OpenGLRenderer::GetInternalFormat(PixelFormat format, int channe...
function GLenum (line 736) | GLenum OpenGLRenderer::GetPixelType(PixelFormat format)
function GLenum (line 756) | GLenum OpenGLRenderer::GetPixelFormat(int channel_count)
function GLuint (line 802) | GLuint OpenGLRenderer::CompileShader(GLenum type, const QString &code)
FILE: app/render/opengl/openglrenderer.h
function namespace (line 34) | namespace olive {
FILE: app/render/playbackcache.cpp
type olive (line 28) | namespace olive {
function Node (line 52) | Node *PlaybackCache::parent() const
function QDir (line 57) | QDir PlaybackCache::GetThisCacheDirectory() const
function QDir (line 62) | QDir PlaybackCache::GetThisCacheDirectory(const QString &cache_path, c...
function foreach (line 186) | foreach (const TimeRange& range, GetValidatedRanges()) {
function Project (line 253) | Project *PlaybackCache::GetProject() const
function TimeRangeList (line 273) | TimeRangeList PlaybackCache::GetInvalidatedRanges(TimeRange intersecti...
function QString (line 300) | QString PlaybackCache::GetCacheDirectory() const
FILE: app/render/playbackcache.h
function namespace (line 35) | namespace olive {
FILE: app/render/previewaudiodevice.cpp
type olive (line 23) | namespace olive {
function qint64 (line 41) | qint64 PreviewAudioDevice::readData(char *data, qint64 maxSize)
function qint64 (line 65) | qint64 PreviewAudioDevice::writeData(const char *data, qint64 length)
FILE: app/render/previewaudiodevice.h
function namespace (line 26) | namespace olive {
FILE: app/render/previewautocacher.cpp
type olive (line 33) | namespace olive {
function RenderTicketPtr (line 68) | RenderTicketPtr PreviewAutoCacher::GetSingleFrame(ViewerOutput *viewer...
function RenderTicketPtr (line 73) | RenderTicketPtr PreviewAutoCacher::GetSingleFrame(Node *n, ViewerOutpu...
function RenderTicketPtr (line 93) | RenderTicketPtr PreviewAutoCacher::GetRangeOfAudio(ViewerOutput *viewe...
function foreach (line 236) | foreach (RenderTicketPtr t, tickets) {
function CancelTasks (line 433) | void CancelTasks(const T &task_list, bool and_wait)
function RenderTicketWatcher (line 587) | RenderTicketWatcher* PreviewAutoCacher::RenderFrame(Node *node, Viewer...
function RenderTicketPtr (line 630) | RenderTicketPtr PreviewAutoCacher::RenderAudio(Node *node, ViewerOutpu...
FILE: app/render/previewautocacher.h
function namespace (line 36) | namespace olive {
FILE: app/render/projectcopier.cpp
type olive (line 25) | namespace olive {
FILE: app/render/projectcopier.h
function namespace (line 26) | namespace olive {
FILE: app/render/rendercache.h
function namespace (line 26) | namespace olive {
FILE: app/render/renderer.cpp
type olive (line 28) | namespace olive {
function TexturePtr (line 35) | TexturePtr Renderer::CreateTexture(const VideoParams ¶ms, const vo...
function TexturePtr (line 102) | TexturePtr Renderer::InterlaceTexture(TexturePtr top, TexturePtr botto...
function QVariant (line 122) | QVariant Renderer::GetDefaultShader()
function TexturePtr (line 155) | TexturePtr Renderer::CreateTextureFromNativeHandle(const QVariant &v, ...
function foreach (line 302) | foreach (const ColorContext::LUT& l, color_ctx.lut3d_textures) {
function foreach (line 306) | foreach (const ColorContext::LUT& l, color_ctx.lut1d_textures) {
FILE: app/render/renderer.h
function namespace (line 35) | namespace olive {
function BlitColorManaged (line 68) | void BlitColorManaged(const ColorTransformJob &job, Texture* destination)
function BlitColorManaged (line 72) | void BlitColorManaged(const ColorTransformJob &job, const VideoParams &p...
type ColorContext (line 115) | struct ColorContext {
type CachedTexture (line 136) | struct CachedTexture
FILE: app/render/renderjobtracker.cpp
type olive (line 23) | namespace olive {
function foreach (line 37) | foreach (const TimeRange &r, ranges) {
function TimeRangeList (line 58) | TimeRangeList RenderJobTracker::getCurrentSubRanges(const TimeRange &r...
FILE: app/render/renderjobtracker.h
function namespace (line 28) | namespace olive {
FILE: app/render/rendermanager.cpp
type olive (line 35) | namespace olive {
function RenderThread (line 89) | RenderThread *RenderManager::CreateThread(Renderer *renderer)
function RenderTicketPtr (line 97) | RenderTicketPtr RenderManager::RenderFrame(const RenderVideoParams &pa...
function RenderTicketPtr (line 131) | RenderTicketPtr RenderManager::RenderAudio(const RenderAudioParams &pa...
FILE: app/render/rendermanager.h
function namespace (line 37) | namespace olive {
type TicketType (line 194) | enum TicketType {
function PreviewAutoCacher (line 204) | PreviewAutoCacher *GetCacher() const
function SetProject (line 209) | void SetProject(Project *p)
FILE: app/render/rendermodes.h
function namespace (line 26) | namespace olive {
FILE: app/render/renderprocessor.cpp
type olive (line 34) | namespace olive {
function TexturePtr (line 46) | TexturePtr RenderProcessor::GenerateTexture(const rational &time, cons...
function FramePtr (line 62) | FramePtr RenderProcessor::GenerateFrame(TexturePtr texture, const rati...
function DecoderPtr (line 258) | DecoderPtr RenderProcessor::ResolveDecoderFromInput(const QString& dec...
function NodeValueDatabase (line 297) | NodeValueDatabase RenderProcessor::GenerateDatabase(const Node *node, ...
function TexturePtr (line 527) | TexturePtr RenderProcessor::ProcessVideoCacheJob(const CacheJob *val)
function TexturePtr (line 545) | TexturePtr RenderProcessor::CreateTexture(const VideoParams &p)
FILE: app/render/renderprocessor.h
function namespace (line 30) | namespace olive {
FILE: app/render/renderticket.cpp
type olive (line 23) | namespace olive {
function QVariant (line 58) | QVariant RenderTicket::Get()
function QVariant (line 179) | QVariant RenderTicketWatcher::Get()
FILE: app/render/renderticket.h
function namespace (line 32) | namespace olive {
FILE: app/render/shadercode.h
function namespace (line 26) | namespace olive {
FILE: app/render/subtitleparams.cpp
type olive (line 27) | namespace olive {
function QString (line 29) | QString SubtitleParams::GenerateASSHeader()
function XMLAttributeLoop (line 126) | XMLAttributeLoop(reader, attr) {
FILE: app/render/subtitleparams.h
function namespace (line 32) | namespace olive {
FILE: app/render/texture.cpp
type olive (line 25) | namespace olive {
FILE: app/render/texture.h
function namespace (line 29) | namespace olive {
FILE: app/render/videoparams.cpp
type olive (line 32) | namespace olive {
function QString (line 204) | QString VideoParams::GetNameForDivider(int div)
function QString (line 213) | QString VideoParams::GetFormatName(PixelFormat format)
function QString (line 294) | QString VideoParams::FrameRateToString(const rational &frame_rate)
function QStringList (line 299) | QStringList VideoParams::GetStandardPixelAspectRatioNames()
function QString (line 318) | QString VideoParams::FormatPixelAspectRatioString(const QString &forma...
FILE: app/render/videoparams.h
function namespace (line 29) | namespace olive {
FILE: app/task/conform/conform.cpp
type olive (line 23) | namespace olive {
FILE: app/task/conform/conform.h
function namespace (line 28) | namespace olive {
FILE: app/task/customcache/customcachetask.cpp
type olive (line 23) | namespace olive {
FILE: app/task/customcache/customcachetask.h
function namespace (line 29) | namespace olive {
FILE: app/task/export/export.cpp
type olive (line 25) | namespace olive {
FILE: app/task/export/export.h
function namespace (line 31) | namespace olive {
FILE: app/task/precache/precachetask.cpp
type olive (line 25) | namespace olive {
FILE: app/task/precache/precachetask.h
function namespace (line 28) | namespace olive {
FILE: app/task/project/import/import.cpp
type olive (line 31) | namespace olive {
function foreach (line 37) | foreach (const QString& f, filenames) {
FILE: app/task/project/import/import.h
function namespace (line 31) | namespace olive {
FILE: app/task/project/import/importerrordialog.cpp
type olive (line 28) | namespace olive {
function foreach (line 41) | foreach (const QString& s, filenames) {
FILE: app/task/project/import/importerrordialog.h
function namespace (line 28) | namespace olive {
FILE: app/task/project/load/load.cpp
type olive (line 27) | namespace olive {
FILE: app/task/project/load/load.h
function namespace (line 27) | namespace olive {
FILE: app/task/project/load/loadbasetask.cpp
type olive (line 23) | namespace olive {
FILE: app/task/project/load/loadbasetask.h
function namespace (line 27) | namespace olive {
FILE: app/task/project/loadotio/loadotio.cpp
type olive (line 50) | namespace olive {
function foreach (line 103) | foreach (auto timeline, timelines) {
function foreach (line 139) | foreach (auto timeline, timeline_sequnce_map.keys()) {
FILE: app/task/project/loadotio/loadotio.h
function namespace (line 30) | namespace olive {
FILE: app/task/project/save/save.cpp
type olive (line 31) | namespace olive {
FILE: app/task/project/save/save.h
function namespace (line 27) | namespace olive {
FILE: app/task/project/saveotio/saveotio.cpp
type olive (line 37) | namespace olive {
function foreach (line 56) | foreach (Sequence* seq, sequences) {
function foreach (line 89) | foreach (auto s, serialized) {
FILE: app/task/project/saveotio/saveotio.h
function namespace (line 33) | namespace olive {
FILE: app/task/render/render.cpp
type olive (line 26) | namespace olive {
function foreach (line 57) | foreach (const TimeRange& range, audio_range) {
function foreach (line 226) | foreach (RenderTicketWatcher* watcher, running_watchers_) {
function foreach (line 232) | foreach (RenderTicketWatcher* watcher, running_watchers_) {
FILE: app/task/render/render.h
function namespace (line 32) | namespace olive {
FILE: app/task/task.h
function namespace (line 31) | namespace olive {
FILE: app/task/taskmanager.cpp
type olive (line 26) | namespace olive {
function foreach (line 39) | foreach (Task* t, tasks_) {
function foreach (line 45) | foreach (Task* t, tasks_) {
function TaskManager (line 61) | TaskManager *TaskManager::instance()
function Task (line 71) | Task *TaskManager::GetFirstTask() const
FILE: app/task/taskmanager.h
function namespace (line 30) | namespace olive {
FILE: app/timeline/timelinecommon.h
function namespace (line 30) | namespace olive {
FILE: app/timeline/timelinecoordinate.cpp
type olive (line 23) | namespace olive {
function rational (line 42) | const rational &TimelineCoordinate::GetFrame() const
FILE: app/timeline/timelinecoordinate.h
function namespace (line 26) | namespace olive {
FILE: app/timeline/timelinemarker.cpp
type olive (line 31) | namespace olive {
function QRect (line 81) | QRect TimelineMarker::Draw(QPainter *p, const QPoint &pt, int max_righ...
function XMLAttributeLoop (line 151) | XMLAttributeLoop(reader, attr) {
function Project (line 301) | Project* MarkerAddCommand::GetRelevantProject() const
function Project (line 321) | Project* MarkerRemoveCommand::GetRelevantProject() const
function Project (line 343) | Project* MarkerChangeColorCommand::GetRelevantProject() const
function Project (line 365) | Project* MarkerChangeNameCommand::GetRelevantProject() const
function Project (line 388) | Project* MarkerChangeTimeCommand::GetRelevantProject() const
FILE: app/timeline/timelinemarker.h
function namespace (line 34) | namespace olive {
FILE: app/timeline/timelineundocommon.h
function namespace (line 27) | namespace olive {
FILE: app/timeline/timelineundogeneral.cpp
type olive (line 31) | namespace olive {
function foreach (line 339) | foreach (Block* gap, gaps_to_extend_) {
function foreach (line 347) | foreach (auto add_gap, gaps_added_) {
function foreach (line 356) | foreach (auto add_gap, gaps_added_) {
function foreach (line 367) | foreach (Block* gap, gaps_to_extend_) {
FILE: app/timeline/timelineundogeneral.h
function class (line 35) | class BlockResizeCommand : public UndoCommand {
function class (line 59) | class BlockResizeWithMediaInCommand : public UndoCommand {
function class (line 83) | class BlockSetMediaInCommand : public UndoCommand {
function class (line 107) | class TimelineAddTrackCommand : public UndoCommand {
function virtual (line 174) | virtual ~TimelineRemoveTrackCommand()
function virtual (line 179) | virtual Project* GetRelevantProject() const override
function virtual (line 187) | virtual void redo() override;
function class (line 234) | class TrackReplaceBlockWithGapCommand : public UndoCommand {
function class (line 275) | class BlockEnableDisableCommand : public UndoCommand {
function class (line 309) | class TrackListInsertGaps : public UndoCommand {
FILE: app/timeline/timelineundopointer.cpp
type olive (line 28) | namespace olive {
FILE: app/timeline/timelineundopointer.h
function class (line 43) | class BlockTrimCommand : public UndoCommand {
FILE: app/timeline/timelineundoripple.cpp
type olive (line 25) | namespace olive {
function foreach (line 135) | foreach (auto op, removals_) {
function foreach (line 142) | foreach (auto op, removals_) {
function foreach (line 149) | foreach (UndoCommand* c, remove_block_commands_) {
function foreach (line 174) | foreach (auto op, removals_) {
function foreach (line 198) | foreach (TrackRippleRemoveAreaCommand* c, commands_) {
function foreach (line 205) | foreach (TrackRippleRemoveAreaCommand* c, commands_) {
function foreach (line 427) | foreach (const QVector<RemovalRequest> &gaps_on_track, requested_gaps) {
function foreach (line 495) | foreach (GapBlock *gap, gaps) {
FILE: app/timeline/timelineundoripple.h
function namespace (line 32) | namespace olive {
FILE: app/timeline/timelineundosplit.cpp
type olive (line 27) | namespace olive {
function Block (line 100) | Block *BlockSplitPreservingLinksCommand::GetSplit(Block *original, int...
function foreach (line 156) | foreach (const QVector<Block*>& split_list, splits_) {
FILE: app/timeline/timelineundosplit.h
function class (line 28) | class BlockSplitCommand : public UndoCommand {
FILE: app/timeline/timelineundotrack.cpp
type olive (line 23) | namespace olive {
FILE: app/timeline/timelineundotrack.h
function namespace (line 26) | namespace olive {
function class (line 63) | class TrackPrependBlockCommand : public UndoCommand
function class (line 93) | class TrackInsertBlockAfterCommand : public UndoCommand
function class (line 132) | class TrackReplaceBlockCommand : public UndoCommand
FILE: app/timeline/timelineundoworkarea.cpp
type olive (line 23) | namespace olive {
FILE: app/timeline/timelineundoworkarea.h
function namespace (line 26) | namespace olive {
FILE: app/timeline/timelineworkarea.cpp
type olive (line 25) | namespace olive {
function TimeRange (line 47) | const TimeRange &TimelineWorkArea::range() const
function XMLAttributeLoop (line 64) | XMLAttributeLoop(reader, attr) {
function rational (line 101) | const rational &TimelineWorkArea::in() const
function rational (line 106) | const rational &TimelineWorkArea::out() const
function rational (line 111) | const rational &TimelineWorkArea::length() const
FILE: app/timeline/timelineworkarea.h
function namespace (line 29) | namespace olive {
FILE: app/tool/tool.h
function namespace (line 29) | namespace olive {
FILE: app/ui/colorcoding.cpp
type olive (line 23) | namespace olive {
function QString (line 44) | QString ColorCoding::GetColorName(int c)
function Color (line 85) | Color ColorCoding::GetColor(int c)
FILE: app/ui/colorcoding.h
function namespace (line 27) | namespace olive {
FILE: app/ui/humanstrings.cpp
type olive (line 5) | namespace olive {
function QString (line 7) | QString HumanStrings::SampleRateToString(const int &sample_rate)
function QString (line 12) | QString HumanStrings::ChannelLayoutToString(const uint64_t &layout)
function QString (line 30) | QString HumanStrings::FormatToString(const SampleFormat &f)
FILE: app/ui/humanstrings.h
function namespace (line 7) | namespace olive {
FILE: app/ui/icons/icons.cpp
type olive (line 23) | namespace olive {
function QIcon (line 179) | QIcon icon::Create(const QString& theme, const QString &name)
FILE: app/ui/icons/icons.h
function namespace (line 28) | namespace olive {
FILE: app/ui/style/style.cpp
type olive (line 34) | namespace olive {
function QPalette (line 40) | QPalette StyleManager::ParsePalette(const QString& ini_path)
function foreach (line 77) | foreach (QString k, keys) {
function QString (line 143) | const QString &StyleManager::GetStyle()
FILE: app/ui/style/style.h
function namespace (line 29) | namespace olive {
FILE: app/undo/undocommand.cpp
type olive (line 25) | namespace olive {
FILE: app/undo/undocommand.h
function namespace (line 30) | namespace olive {
FILE: app/undo/undostack.cpp
type olive (line 25) | namespace olive {
class EmptyCommand (line 29) | class EmptyCommand : public UndoCommand
method EmptyCommand (line 32) | EmptyCommand(){}
method Project (line 34) | virtual Project* GetRelevantProject() const override {return nullptr;}
method redo (line 37) | virtual void redo() override {}
method undo (line 38) | virtual void undo() override {}
function QVariant (line 183) | QVariant UndoStack::data(const QModelIndex &index, int role) const
function QModelIndex (line 215) | QModelIndex UndoStack::index(int row, int column, const QModelIndex &p...
function QModelIndex (line 220) | QModelIndex UndoStack::parent(const QModelIndex &index) const
function QVariant (line 234) | QVariant UndoStack::headerData(int section, Qt::Orientation orientatio...
FILE: app/undo/undostack.h
function namespace (line 30) | namespace olive {
FILE: app/version.cpp
type olive (line 23) | namespace olive {
FILE: app/version.h
function namespace (line 26) | namespace olive {
FILE: app/widget/audiomonitor/audiomonitor.cpp
type olive (line 31) | namespace olive {
FILE: app/widget/audiomonitor/audiomonitor.h
function namespace (line 32) | namespace olive {
FILE: app/widget/bezier/bezierwidget.cpp
type olive (line 26) | namespace olive {
function Bezier (line 77) | Bezier BezierWidget::GetValue() const
FILE: app/widget/bezier/bezierwidget.h
function namespace (line 30) | namespace olive {
FILE: app/widget/clickablelabel/clickablelabel.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/clickablelabel/clickablelabel.h
function namespace (line 28) | namespace olive {
FILE: app/widget/collapsebutton/collapsebutton.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/collapsebutton/collapsebutton.h
function namespace (line 28) | namespace olive {
FILE: app/widget/colorbutton/colorbutton.cpp
type olive (line 25) | namespace olive {
function ManagedColor (line 42) | const ManagedColor &ColorButton::GetColor() const
FILE: app/widget/colorbutton/colorbutton.h
function namespace (line 29) | namespace olive {
FILE: app/widget/colorlabelmenu/colorcodingcombobox.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/colorlabelmenu/colorcodingcombobox.h
function namespace (line 28) | namespace olive {
FILE: app/widget/colorlabelmenu/colorlabelmenu.cpp
type olive (line 30) | namespace olive {
FILE: app/widget/colorlabelmenu/colorlabelmenu.h
function namespace (line 26) | namespace olive {
FILE: app/widget/colorwheel/colorgradientwidget.cpp
type olive (line 28) | namespace olive {
function Color (line 37) | Color ColorGradientWidget::GetColorFromScreenPos(const QPoint &p) const
function Color (line 99) | Color ColorGradientWidget::LerpColor(const Color &a, const Color &b, i...
FILE: app/widget/colorwheel/colorgradientwidget.h
function namespace (line 26) | namespace olive {
FILE: app/widget/colorwheel/colorpreviewbox.cpp
type olive (line 27) | namespace olive {
FILE: app/widget/colorwheel/colorpreviewbox.h
function namespace (line 28) | namespace olive {
FILE: app/widget/colorwheel/colorspacechooser.cpp
type olive (line 26) | namespace olive {
function foreach (line 57) | foreach (const QString& s, input_spaces) {
function foreach (line 81) | foreach (const QString& s, display_spaces) {
function foreach (line 115) | foreach (const QString& s, looks) {
function QString (line 128) | QString ColorSpaceChooser::input() const
function ColorTransform (line 137) | ColorTransform ColorSpaceChooser::output() const
function foreach (line 171) | foreach (const QString& s, views) {
FILE: app/widget/colorwheel/colorspacechooser.h
function namespace (line 29) | namespace olive {
FILE: app/widget/colorwheel/colorswatchchooser.cpp
type olive (line 28) | namespace olive {
function QString (line 130) | QString ColorSwatchChooser::GetSwatchFilename()
FILE: app/widget/colorwheel/colorswatchchooser.h
function namespace (line 27) | namespace olive {
FILE: app/widget/colorwheel/colorswatchwidget.cpp
type olive (line 27) | namespace olive {
function Color (line 36) | const Color &ColorSwatchWidget::GetSelectedColor() const
function Color (line 83) | Color ColorSwatchWidget::GetManagedColor(const Color &input) const
FILE: app/widget/colorwheel/colorswatchwidget.h
function namespace (line 28) | namespace olive {
FILE: app/widget/colorwheel/colorvalueswidget.cpp
type olive (line 31) | namespace olive {
function Color (line 91) | Color ColorValuesWidget::GetColor() const
function foreach (line 114) | foreach (QWidget *w, ignore_pick_from_) {
function Color (line 285) | Color ColorValuesTab::GetColor() const
function FloatSlider (line 348) | FloatSlider *ColorValuesTab::CreateColorSlider()
function foreach (line 370) | foreach (FloatSlider *s, sliders_) {
function QString (line 379) | QString RGBValToString(double d)
function ParseRGBString (line 409) | bool ParseRGBString(QString s, double *r, double *g, double *b)
FILE: app/widget/colorwheel/colorvalueswidget.h
function class (line 35) | class ColorValuesTab : public QWidget
FILE: app/widget/colorwheel/colorwheelwidget.cpp
type olive (line 28) | namespace olive {
function Color (line 40) | Color ColorWheelWidget::GetColorFromScreenPos(const QPoint &p) const
function qreal (line 132) | qreal ColorWheelWidget::GetRadius() const
function Color (line 151) | Color ColorWheelWidget::GetColorFromTriangle(const ColorWheelWidget::T...
function QPoint (line 159) | QPoint ColorWheelWidget::GetCoordsFromColor(const Color &c) const
FILE: app/widget/colorwheel/colorwheelwidget.h
function namespace (line 28) | namespace olive {
FILE: app/widget/columnedgridlayout/columnedgridlayout.cpp
type olive (line 23) | namespace olive {
FILE: app/widget/columnedgridlayout/columnedgridlayout.h
function namespace (line 28) | namespace olive {
FILE: app/widget/curvewidget/curveview.cpp
type olive (line 35) | namespace olive {
function foreach (line 89) | foreach (KeyframeViewInputConnection *con, track_connections_) {
function foreach (line 158) | foreach (const NodeKeyframeTrackReference& ref, connected_inputs_) {
function foreach (line 267) | foreach (KeyframeViewInputConnection *con, track_connections_) {
function qreal (line 288) | qreal CurveView::GetKeyframeSceneY(KeyframeViewInputConnection *track,...
function foreach (line 324) | foreach (const BezierPoint &b, bezier_pts_) {
function QPointF (line 484) | QPointF CurveView::GenerateBezierControlPosition(const NodeKeyframe::B...
function QPointF (line 504) | QPointF CurveView::GetScaledCursorPos(const QPointF &cursor_pos)
function foreach (line 517) | foreach (KeyframeViewInputConnection *con, track_connections_) {
function qreal (line 578) | qreal CurveView::GetItemYFromKeyframeValue(NodeKeyframe *key)
function qreal (line 583) | qreal CurveView::GetUnscaledItemYFromKeyframeValue(NodeKeyframe *key)
function QPointF (line 594) | QPointF CurveView::ScalePoint(const QPointF &point)
function QPointF (line 629) | QPointF CurveView::GetKeyframePosition(NodeKeyframe *key)
FILE: app/widget/curvewidget/curveview.h
function namespace (line 28) | namespace olive {
FILE: app/widget/curvewidget/curvewidget.cpp
type olive (line 35) | namespace olive {
function Node (line 128) | Node *CurveWidget::GetSelectedNodeWithID(const QString &id)
function foreach (line 166) | foreach (Node *node, nodes_) {
function foreach (line 329) | foreach (NodeKeyframe* item, selected) {
function foreach (line 340) | foreach (const NodeKeyframeTrackReference &c, selected_tracks_) {
function foreach (line 355) | foreach (const QString &input, node->inputs()) {
FILE: app/widget/curvewidget/curvewidget.h
function namespace (line 35) | namespace olive {
FILE: app/widget/filefield/filefield.cpp
type olive (line 29) | namespace olive {
FILE: app/widget/filefield/filefield.h
function namespace (line 27) | namespace olive {
FILE: app/widget/flowlayout/flowlayout.cpp
function QLayoutItem (line 102) | QLayoutItem *FlowLayout::itemAt(int index) const
function QLayoutItem (line 107) | QLayoutItem *FlowLayout::takeAt(int index)
function QSize (line 137) | QSize FlowLayout::sizeHint() const
function QSize (line 142) | QSize FlowLayout::minimumSize() const
function foreach (line 163) | foreach (item, itemList) {
FILE: app/widget/flowlayout/flowlayout.h
function class (line 58) | class FlowLayout : public QLayout
FILE: app/widget/focusablelineedit/focusablelineedit.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/focusablelineedit/focusablelineedit.h
function namespace (line 28) | namespace olive {
FILE: app/widget/handmovableview/handmovableview.cpp
type olive (line 28) | namespace olive {
function qreal (line 158) | qreal HandMovableView::GetScrollZoomMultiplier(QWheelEvent *event)
FILE: app/widget/handmovableview/handmovableview.h
function namespace (line 29) | namespace olive {
FILE: app/widget/history/historywidget.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/history/historywidget.h
function namespace (line 28) | namespace olive {
FILE: app/widget/keyframeview/keyframeview.cpp
type olive (line 37) | namespace olive {
function foreach (line 60) | foreach (NodeKeyframe *key, GetSelectedKeyframes()) {
function foreach (line 72) | foreach (const QString& i, n->inputs()) {
function KeyframeViewInputConnection (line 110) | KeyframeViewInputConnection *KeyframeView::AddKeyframesOfTrack(const N...
function foreach (line 133) | foreach (KeyframeViewInputConnection *track, tracks_) {
function foreach (line 163) | foreach (NodeKeyframe* k, keys) {
function foreach (line 178) | foreach (NodeKeyframe* k, keys) {
function BinarySearchFirstKeyframeAfterOrAt (line 332) | int BinarySearchFirstKeyframeAfterOrAt(const QVector<NodeKeyframe*> &k...
function foreach (line 362) | foreach (KeyframeViewInputConnection *track, tracks_) {
function rational (line 505) | rational KeyframeView::GetUnadjustedKeyframeTime(NodeKeyframe *key, co...
function rational (line 510) | rational KeyframeView::GetAdjustedKeyframeTime(NodeKeyframe *key)
function qreal (line 520) | qreal KeyframeView::GetKeyframeSceneY(KeyframeViewInputConnection *tra...
function rational (line 531) | rational KeyframeView::CalculateNewTimeFromScreen(const rational &old_...
function foreach (line 612) | foreach (NodeKeyframe* item, GetSelectedKeyframes()) {
FILE: app/widget/keyframeview/keyframeview.h
function namespace (line 33) | namespace olive {
FILE: app/widget/keyframeview/keyframeviewinputconnection.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/keyframeview/keyframeviewinputconnection.h
function namespace (line 29) | namespace olive {
FILE: app/widget/keyframeview/keyframeviewundo.cpp
type olive (line 26) | namespace olive {
function Project (line 35) | Project *KeyframeSetTypeCommand::GetRelevantProject() const
function Project (line 66) | Project *KeyframeSetBezierControlPoint::GetRelevantProject() const
FILE: app/widget/keyframeview/keyframeviewundo.h
function namespace (line 27) | namespace olive {
FILE: app/widget/manageddisplay/manageddisplay.cpp
type olive (line 30) | namespace olive {
function ColorManager (line 111) | ColorManager *ManagedDisplayWidget::color_manager() const
function ColorTransform (line 121) | const ColorTransform &ManagedDisplayWidget::GetColorTransform() const
function Menu (line 126) | Menu *ManagedDisplayWidget::GetColorSpaceMenu(QMenu *parent, bool auto...
function ColorProcessorPtr (line 156) | ColorProcessorPtr ManagedDisplayWidget::color_service()
function QPaintDevice (line 265) | QPaintDevice *ManagedDisplayWidget::paint_device() const
function VideoParams (line 281) | VideoParams ManagedDisplayWidget::GetViewportParams() const
function Menu (line 332) | Menu* ManagedDisplayWidget::GetDisplayMenu(QMenu* parent, bool auto_co...
function Menu (line 352) | Menu* ManagedDisplayWidget::GetViewMenu(QMenu* parent, bool auto_connect)
function Menu (line 372) | Menu* ManagedDisplayWidget::GetLookMenu(QMenu* parent, bool auto_connect)
FILE: app/widget/manageddisplay/manageddisplay.h
function namespace (line 38) | namespace olive {
function virtual (line 104) | virtual ~ManagedDisplayWidget() override;
FILE: app/widget/menu/menu.cpp
type olive (line 25) | namespace olive {
function QAction (line 53) | QAction *Menu::AddActionWithData(const QString &text, const QVariant &...
function QAction (line 64) | QAction* Menu::InsertAlphabetically(const QString &s)
function foreach (line 75) | foreach (QAction* action, actions) {
FILE: app/widget/menu/menu.h
function namespace (line 30) | namespace olive {
FILE: app/widget/menu/menushared.cpp
type olive (line 30) | namespace olive {
function foreach (line 214) | foreach (QAction* a, timecode_display_actions) {
function MenuShared (line 222) | MenuShared *MenuShared::instance()
FILE: app/widget/menu/menushared.h
function namespace (line 28) | namespace olive {
FILE: app/widget/multicam/multicamdisplay.cpp
type olive (line 23) | namespace olive {
function TexturePtr (line 65) | TexturePtr MulticamDisplay::LoadCustomTextureFromFrame(const QVariant &v)
function QString (line 102) | QString dblToGlsl(double d)
function QString (line 107) | QString MulticamDisplay::GenerateShaderCode(int rows, int cols)
FILE: app/widget/multicam/multicamdisplay.h
function namespace (line 27) | namespace olive {
FILE: app/widget/multicam/multicamwidget.cpp
type olive (line 29) | namespace olive {
FILE: app/widget/multicam/multicamwidget.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodecombobox/nodecombobox.cpp
type olive (line 31) | namespace olive {
function QString (line 53) | const QString &NodeComboBox::GetSelectedNode() const
FILE: app/widget/nodecombobox/nodecombobox.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamview.cpp
type olive (line 33) | namespace olive {
function foreach (line 239) | foreach (Node *ctx, current_contexts_) {
function foreach (line 247) | foreach (Node *ctx, contexts_) {
function foreach (line 269) | foreach (NodeParamViewContext *ctx, context_items_) {
function foreach (line 349) | foreach (NodeParamViewContext* ctx, context_items_) {
function foreach (line 361) | foreach (NodeParamViewContext* item, context_items_) {
function ReconnectOutputsIfNotDeletingNode (line 366) | void ReconnectOutputsIfNotDeletingNode(MultiUndoCommand *c, NodeViewDe...
function foreach (line 392) | foreach (NodeParamViewItem *item, selected_nodes_) {
function foreach (line 398) | foreach (NodeParamViewItem *item, selected_nodes_) {
function foreach (line 433) | foreach (NodeParamViewItem *n, selected_nodes_) {
function foreach (line 456) | foreach (NodeParamViewItem *n, selected_nodes_) {
function foreach (line 476) | foreach (const Node::ContextPair &n, nodes) {
function Node (line 500) | Node *NodeParamView::GetNodeWithID(const QString &id)
function Node (line 505) | Node *NodeParamView::GetNodeWithIDAndIgnoreList(const QString &id, con...
function foreach (line 688) | foreach (NodeParamViewContext *item, context_items_) {
function GetDistanceBetweenNodes (line 734) | int GetDistanceBetweenNodes(Node *start, Node *end)
function foreach (line 782) | foreach (auto info, distances) {
function NodeParamViewContext (line 787) | NodeParamViewContext *NodeParamView::GetContextItemFromContext(Node *ctx)
function foreach (line 956) | foreach (NodeParamViewContext *ctx_item, context_items_) {
function foreach (line 978) | foreach (NodeParamViewContext *pvctx, context_items_) {
function foreach (line 985) | foreach (NodeParamViewContext *pvctx, context_items_) {
FILE: app/widget/nodeparamview/nodeparamview.h
function namespace (line 36) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewarraywidget.cpp
type olive (line 28) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewarraywidget.h
function namespace (line 30) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewconnectedlabel.cpp
type olive (line 32) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewconnectedlabel.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewcontext.cpp
type olive (line 29) | namespace olive {
function NodeParamViewItem (line 51) | NodeParamViewItem *NodeParamViewContext::GetItem(Node *node, Node *ctx)
function foreach (line 102) | foreach (NodeParamViewItem *item, items_) {
function foreach (line 111) | foreach (NodeParamViewItem* item, items_) {
function foreach (line 118) | foreach (NodeParamViewItem* item, items_) {
function foreach (line 162) | foreach (Node *ctx, contexts_) {
FILE: app/widget/nodeparamview/nodeparamviewcontext.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewdockarea.cpp
type olive (line 25) | namespace olive {
function QMenu (line 37) | QMenu *NodeParamViewDockArea::createPopupMenu()
FILE: app/widget/nodeparamview/nodeparamviewdockarea.h
function namespace (line 26) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewitem.cpp
type olive (line 33) | namespace olive {
function foreach (line 133) | foreach (QString input, node->inputs()) {
function foreach (line 281) | foreach (const InputUI& ui_obj, input_ui_map_) {
function foreach (line 511) | foreach (const InputUI& ui_obj, input_ui_map_) {
FILE: app/widget/nodeparamview/nodeparamviewitem.h
function namespace (line 41) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewitembase.cpp
type olive (line 26) | namespace olive {
function QString (line 63) | QString NodeParamViewItemBase::GetTitleBarTextFromNode(Node *n)
FILE: app/widget/nodeparamview/nodeparamviewitembase.h
function namespace (line 29) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewitemtitlebar.cpp
type olive (line 28) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewitemtitlebar.h
function namespace (line 30) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewkeyframecontrol.cpp
type olive (line 30) | namespace olive {
function QPushButton (line 110) | QPushButton *NodeParamViewKeyframeControl::CreateNewToolButton(const Q...
function rational (line 127) | rational NodeParamViewKeyframeControl::GetCurrentTimeAsNodeTime() const
function rational (line 132) | rational NodeParamViewKeyframeControl::ConvertToViewerTime(const ratio...
function foreach (line 168) | foreach (NodeKeyframe* key, keys) {
function foreach (line 263) | foreach (const NodeKeyframeTrack& track, input_.node()->GetKeyframeTra...
FILE: app/widget/nodeparamview/nodeparamviewkeyframecontrol.h
function namespace (line 30) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewtextedit.cpp
type olive (line 28) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewtextedit.h
function namespace (line 30) | namespace olive {
FILE: app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp
type olive (line 45) | namespace olive {
function GetSliderCount (line 61) | int GetSliderCount(NodeValue::Type type)
function foreach (line 115) | foreach (const QString& s, items) {
function foreach (line 180) | foreach (QWidget* w, widgets_) {
function rational (line 526) | rational NodeParamViewWidgetBridge::GetCurrentTimeAsNodeTime() const
function QString (line 535) | QString NodeParamViewWidgetBridge::GetCommandName() const
function foreach (line 737) | foreach (const QString& s, items) {
function foreach (line 764) | foreach (QWidget* w, widgets_) {
function foreach (line 770) | foreach (QWidget* w, widgets_) {
function foreach (line 776) | foreach (QWidget* w, widgets_) {
function foreach (line 786) | foreach (QWidget* w, widgets_) {
function foreach (line 792) | foreach (QWidget* w, widgets_) {
FILE: app/widget/nodeparamview/nodeparamviewwidgetbridge.h
function namespace (line 30) | namespace olive {
FILE: app/widget/nodetableview/nodetableview.cpp
type olive (line 28) | namespace olive {
function foreach (line 44) | foreach (Node* n, nodes) {
function foreach (line 57) | foreach (Node* n, nodes) {
FILE: app/widget/nodetableview/nodetableview.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodetableview/nodetablewidget.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/nodetableview/nodetablewidget.h
function namespace (line 27) | namespace olive {
FILE: app/widget/nodetreeview/nodetreeview.cpp
type olive (line 25) | namespace olive {
function foreach (line 68) | foreach (Node* n, nodes_) {
function NodeKeyframeTrackReference (line 149) | NodeKeyframeTrackReference NodeTreeView::GetSelectedInput()
function QTreeWidgetItem (line 168) | QTreeWidgetItem* NodeTreeView::CreateItem(QTreeWidgetItem *parent, con...
FILE: app/widget/nodetreeview/nodetreeview.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodevaluetree/nodevaluetree.cpp
type olive (line 7) | namespace olive {
FILE: app/widget/nodevaluetree/nodevaluetree.h
function namespace (line 9) | namespace olive {
FILE: app/widget/nodeview/nodeview.cpp
type olive (line 44) | namespace olive {
function foreach (line 98) | foreach (Node *n, contexts_) {
function foreach (line 105) | foreach (Node *n, nodes) {
function foreach (line 198) | foreach (const Node::ContextPair &p, nodes) {
function foreach (line 525) | foreach (NodeViewItem *i, selected_items) {
function foreach (line 741) | foreach (Node* n, selected_nodes_) {
function foreach (line 885) | foreach (Node *n, selected_nodes_) {
function foreach (line 965) | foreach (const AttachedItem &ai, attached_items_) {
function foreach (line 1094) | foreach (const AttachedItem &ai, attached) {
function foreach (line 1124) | foreach (const AttachedItem &ai, attached) {
function Node (line 1155) | Node *NodeView::GetContextAtMousePos(const QPoint &p)
function QPointF (line 1243) | QPointF NodeView::GetEstimatedPositionForContext(NodeViewItem *item, N...
function NodeViewItem (line 1248) | NodeViewItem *NodeView::GetAssumedItemForSelectedNode(Node *node)
function Menu (line 1272) | Menu *NodeView::CreateAddMenu(Menu *parent)
function foreach (line 1403) | foreach (Node *n, nodes_to_group) {
function foreach (line 1449) | foreach (NodeViewItem *i, items) {
function foreach (line 1576) | foreach (const AttachedItem &ai, attached_items_) {
function NodeViewContext (line 1740) | NodeViewContext *NodeView::GetContextItemFromNodeItem(NodeViewItem *item)
FILE: app/widget/nodeview/nodeview.h
function namespace (line 36) | namespace olive {
FILE: app/widget/nodeview/nodeviewcommon.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodeview/nodeviewcontext.cpp
type olive (line 19) | namespace olive {
function foreach (line 106) | foreach (NodeViewEdge *edge, edges_to_remove) {
function qreal (line 156) | qreal GetTextOffset(const QFontMetricsF &fm)
function foreach (line 180) | foreach (NodeViewItem *item, item_map_) {
function foreach (line 189) | foreach (NodeViewEdge *edge, edges_) {
function foreach (line 199) | foreach (NodeViewEdge *edge, edges_) {
function foreach (line 206) | foreach (NodeViewItem *node, item_map_) {
function foreach (line 218) | foreach (Node *n, nodes) {
function QPointF (line 240) | QPointF NodeViewContext::MapScenePosToNodePosInContext(const QPointF &...
function QVariant (line 286) | QVariant NodeViewContext::itemChange(GraphicsItemChange change, const ...
FILE: app/widget/nodeview/nodeviewcontext.h
function namespace (line 12) | namespace olive {
FILE: app/widget/nodeview/nodeviewedge.cpp
type olive (line 33) | namespace olive {
FILE: app/widget/nodeview/nodeviewedge.h
function namespace (line 30) | namespace olive {
FILE: app/widget/nodeview/nodeviewitem.cpp
type olive (line 39) | namespace olive {
function QPointF (line 104) | QPointF NodeViewItem::GetNodePosition() const
function foreach (line 126) | foreach (NodeViewItem *item, children_) {
function QPointF (line 153) | QPointF NodeViewItem::NodeToScreenPoint(QPointF p, NodeViewCommon::Flo...
function QPointF (line 182) | QPointF NodeViewItem::ScreenToNodePoint(QPointF p, NodeViewCommon::Flo...
function qreal (line 211) | qreal NodeViewItem::DefaultItemHorizontalPadding(NodeViewCommon::FlowD...
function qreal (line 220) | qreal NodeViewItem::DefaultItemVerticalPadding(NodeViewCommon::FlowDir...
function qreal (line 229) | qreal NodeViewItem::DefaultItemHorizontalPadding() const
function qreal (line 234) | qreal NodeViewItem::DefaultItemVerticalPadding() const
function foreach (line 271) | foreach (const QString &input, node_->inputs()) {
function foreach (line 301) | foreach (NodeViewItem *child, children_) {
function QVariant (line 462) | QVariant NodeViewItem::itemChange(QGraphicsItem::GraphicsItemChange ch...
function foreach (line 481) | foreach (NodeViewEdge* edge, edges_) {
function foreach (line 488) | foreach (NodeViewItem *child, children_) {
function QPointF (line 573) | QPointF NodeViewItem::GetInputPoint() const
function QPointF (line 578) | QPointF NodeViewItem::GetOutputPoint() const
function foreach (line 707) | foreach (NodeViewItem *c, children_) {
function foreach (line 724) | foreach (NodeViewItem *c, children_) {
function foreach (line 751) | foreach (const QString& input, node_->inputs()) {
function NodeViewItem (line 787) | NodeViewItem *NodeViewItem::GetItemForInput(NodeInput input)
FILE: app/widget/nodeview/nodeviewitem.h
function namespace (line 33) | namespace olive {
FILE: app/widget/nodeview/nodeviewitemconnector.cpp
type olive (line 30) | namespace olive {
function QPainterPath (line 84) | QPainterPath NodeViewItemConnector::shape() const
function QRectF (line 91) | QRectF NodeViewItemConnector::boundingRect() const
FILE: app/widget/nodeview/nodeviewitemconnector.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodeview/nodeviewminimap.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/nodeview/nodeviewminimap.h
function namespace (line 28) | namespace olive {
FILE: app/widget/nodeview/nodeviewscene.cpp
type olive (line 28) | namespace olive {
function foreach (line 41) | foreach (NodeViewContext *ctx, context_map_) {
function foreach (line 48) | foreach (QGraphicsItem* i, items()) {
function foreach (line 55) | foreach (QGraphicsItem* i, items()) {
function foreach (line 64) | foreach (NodeViewContext *ctx, context_map_) {
function NodeViewContext (line 71) | NodeViewContext *NodeViewScene::AddContext(Node *node)
function foreach (line 112) | foreach (NodeViewContext *ctx, context_map_) {
FILE: app/widget/nodeview/nodeviewscene.h
function namespace (line 33) | namespace olive {
FILE: app/widget/nodeview/nodeviewtoolbar.cpp
type olive (line 8) | namespace olive {
FILE: app/widget/nodeview/nodeviewtoolbar.h
function namespace (line 7) | namespace olive {
FILE: app/widget/nodeview/nodewidget.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/nodeview/nodewidget.h
function namespace (line 29) | namespace olive {
FILE: app/widget/path/pathwidget.cpp
type olive (line 29) | namespace olive {
FILE: app/widget/path/pathwidget.h
function namespace (line 29) | namespace olive {
FILE: app/widget/pixelsampler/pixelsampler.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/pixelsampler/pixelsampler.h
function namespace (line 30) | namespace olive {
FILE: app/widget/playbackcontrols/dragbutton.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/playbackcontrols/dragbutton.h
function namespace (line 28) | namespace olive {
FILE: app/widget/playbackcontrols/playbackcontrols.cpp
type olive (line 31) | namespace olive {
FILE: app/widget/playbackcontrols/playbackcontrols.h
function namespace (line 32) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorer.cpp
type olive (line 46) | namespace olive {
function foreach (line 163) | foreach (const Node::OutputConnection& connected, item->output_connect...
function foreach (line 193) | foreach (const Node::OutputConnection& oc, node->output_connections()) {
function QString (line 230) | QString ProjectExplorer::GetHumanReadableNodeName(Node *node)
function QAbstractItemView (line 254) | QAbstractItemView *ProjectExplorer::CurrentView() const
function foreach (line 368) | foreach (Node* i, context_menu_items_) {
function foreach (line 395) | foreach (Sequence* i, sequences) {
function foreach (line 509) | foreach (Node* item, context_menu_items_) {
function foreach (line 534) | foreach (const QModelIndex &index, selection) {
function Project (line 548) | Project *ProjectExplorer::project() const
function Folder (line 558) | Folder *ProjectExplorer::get_root() const
function Folder (line 596) | Folder *ProjectExplorer::GetSelectedFolder() const
function ProjectViewModel (line 641) | ProjectViewModel *ProjectExplorer::model()
FILE: app/widget/projectexplorer/projectexplorer.h
function namespace (line 37) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorericonview.cpp
type olive (line 23) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorericonview.h
function namespace (line 27) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorericonviewitemdelegate.cpp
type olive (line 27) | namespace olive {
function QSize (line 34) | QSize ProjectExplorerIconViewItemDelegate::sizeHint(const QStyleOption...
FILE: app/widget/projectexplorer/projectexplorericonviewitemdelegate.h
function namespace (line 28) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorerlistview.cpp
type olive (line 23) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorerlistview.h
function namespace (line 27) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorerlistviewbase.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorerlistviewbase.h
function namespace (line 28) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorerlistviewitemdelegate.cpp
type olive (line 25) | namespace olive {
function QSize (line 33) | QSize ProjectExplorerListViewItemDelegate::sizeHint(const QStyleOption...
FILE: app/widget/projectexplorer/projectexplorerlistviewitemdelegate.h
function namespace (line 28) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorernavigation.cpp
type olive (line 29) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorernavigation.h
function namespace (line 31) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorertreeview.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorertreeview.h
function namespace (line 28) | namespace olive {
FILE: app/widget/projectexplorer/projectexplorerundo.h
function namespace (line 26) | namespace olive {
FILE: app/widget/projectexplorer/projectviewmodel.cpp
type olive (line 31) | namespace olive {
function Project (line 39) | Project *ProjectViewModel::project() const
function QModelIndex (line 61) | QModelIndex ProjectViewModel::index(int row, int column, const QModelI...
function QModelIndex (line 75) | QModelIndex ProjectViewModel::parent(const QModelIndex &child) const
function QVariant (line 126) | QVariant ProjectViewModel::data(const QModelIndex &index, int role) const
function QVariant (line 190) | QVariant ProjectViewModel::headerData(int section, Qt::Orientation ori...
function QStringList (line 275) | QStringList ProjectViewModel::mimeTypes() const
function QMimeData (line 281) | QMimeData *ProjectViewModel::mimeData(const QModelIndexList &indexes) ...
function Node (line 433) | Node *ProjectViewModel::GetItemObjectFromIndex(const QModelIndex &inde...
function QModelIndex (line 539) | QModelIndex ProjectViewModel::CreateIndexFromItem(Node *item, int column)
FILE: app/widget/projectexplorer/projectviewmodel.h
function namespace (line 30) | namespace olive {
FILE: app/widget/projecttoolbar/projecttoolbar.cpp
type olive (line 29) | namespace olive {
FILE: app/widget/projecttoolbar/projecttoolbar.h
function namespace (line 30) | namespace olive {
FILE: app/widget/resizablescrollbar/resizablescrollbar.cpp
type olive (line 30) | namespace olive {
function QRect (line 115) | QRect ResizableScrollBar::GetScrollBarRect()
FILE: app/widget/resizablescrollbar/resizablescrollbar.h
function namespace (line 28) | namespace olive {
FILE: app/widget/resizablescrollbar/resizabletimelinescrollbar.cpp
type olive (line 30) | namespace olive {
FILE: app/widget/resizablescrollbar/resizabletimelinescrollbar.h
function namespace (line 29) | namespace olive {
FILE: app/widget/scope/histogram/histogram.cpp
type olive (line 30) | namespace olive {
function ShaderCode (line 56) | ShaderCode HistogramScope::GenerateShaderCode()
FILE: app/widget/scope/histogram/histogram.h
function namespace (line 26) | namespace olive {
FILE: app/widget/scope/scopebase/scopebase.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/scope/scopebase/scopebase.h
function namespace (line 28) | namespace olive {
FILE: app/widget/scope/waveform/waveform.cpp
type olive (line 34) | namespace olive {
function ShaderCode (line 43) | ShaderCode WaveformScope::GenerateShaderCode()
FILE: app/widget/scope/waveform/waveform.h
function namespace (line 26) | namespace olive {
FILE: app/widget/slider/base/decimalsliderbase.cpp
type olive (line 23) | namespace olive {
function QString (line 42) | QString DecimalSliderBase::FloatToString(double val, int decimal_place...
FILE: app/widget/slider/base/decimalsliderbase.h
function namespace (line 26) | namespace olive {
FILE: app/widget/slider/base/numericsliderbase.cpp
type olive (line 27) | namespace olive {
function QVariant (line 144) | QVariant NumericSliderBase::AdjustValue(const QVariant &value) const
function QVariant (line 163) | QVariant NumericSliderBase::AdjustDragDistanceInternal(const QVariant ...
FILE: app/widget/slider/base/numericsliderbase.h
function namespace (line 26) | namespace olive {
FILE: app/widget/slider/base/sliderbase.cpp
type olive (line 31) | namespace olive {
function QVariant (line 74) | const QVariant &SliderBase::GetValueInternal() const
function QVariant (line 133) | QVariant SliderBase::AdjustValue(const QVariant &value) const
function QString (line 230) | QString SliderBase::GetFormat() const
function QString (line 239) | QString SliderBase::GetFormattedValueToString() const
function QString (line 244) | QString SliderBase::GetFormattedValueToString(const QVariant &v) const
FILE: app/widget/slider/base/sliderbase.h
function namespace (line 30) | namespace olive {
FILE: app/widget/slider/base/sliderlabel.cpp
type olive (line 27) | namespace olive {
FILE: app/widget/slider/base/sliderlabel.h
function namespace (line 28) | namespace olive {
FILE: app/widget/slider/base/sliderladder.cpp
type olive (line 38) | namespace olive {
function foreach (line 68) | foreach (SliderLadderElement* e, elements_) {
function foreach (line 123) | foreach (SliderLadderElement* e, elements_) {
FILE: app/widget/slider/base/sliderladder.h
function namespace (line 30) | namespace olive {
FILE: app/widget/slider/floatslider.cpp
type olive (line 28) | namespace olive {
function QString (line 113) | QString FloatSlider::ValueToString(double val, FloatSlider::DisplayTyp...
function QString (line 123) | QString FloatSlider::ValueToString(const QVariant &v) const
function QVariant (line 128) | QVariant FloatSlider::StringToValue(const QString &s, bool *ok) const
function QVariant (line 147) | QVariant FloatSlider::AdjustDragDistanceInternal(const QVariant &start...
FILE: app/widget/slider/floatslider.h
function namespace (line 26) | namespace olive {
FILE: app/widget/slider/integerslider.cpp
type olive (line 23) | namespace olive {
function QString (line 58) | QString IntegerSlider::ValueToString(const QVariant &v) const
function QVariant (line 63) | QVariant IntegerSlider::StringToValue(const QString &s, bool *ok) const
function QVariant (line 89) | QVariant IntegerSlider::AdjustDragDistanceInternal(const QVariant &sta...
FILE: app/widget/slider/integerslider.h
function namespace (line 26) | namespace olive {
FILE: app/widget/slider/rationalslider.cpp
type olive (line 27) | namespace olive {
function rational (line 43) | rational RationalSlider::GetValue()
function QString (line 98) | QString RationalSlider::ValueToString(const QVariant &v) const
function QVariant (line 120) | QVariant RationalSlider::StringToValue(const QString &s, bool *ok) const
function QVariant (line 152) | QVariant RationalSlider::AdjustDragDistanceInternal(const QVariant &st...
FILE: app/widget/slider/rationalslider.h
function namespace (line 29) | namespace olive {
FILE: app/widget/slider/stringslider.cpp
type olive (line 23) | namespace olive {
function QString (line 35) | QString StringSlider::GetValue() const
function QString (line 50) | QString StringSlider::ValueToString(const QVariant &v) const
function QVariant (line 56) | QVariant StringSlider::StringToValue(const QString &s, bool *ok) const
FILE: app/widget/slider/stringslider.h
function namespace (line 26) | namespace olive {
FILE: app/widget/standardcombos/channellayoutcombobox.h
function namespace (line 29) | namespace olive {
FILE: app/widget/standardcombos/frameratecombobox.h
function namespace (line 32) | namespace olive {
FILE: app/widget/standardcombos/interlacedcombobox.h
function namespace (line 28) | namespace olive {
FILE: app/widget/standardcombos/pixelaspectratiocombobox.h
function namespace (line 29) | namespace olive {
FILE: app/widget/standardcombos/pixelformatcombobox.h
function namespace (line 28) | namespace olive {
FILE: app/widget/standardcombos/sampleformatcombobox.h
function namespace (line 29) | namespace olive {
FILE: app/widget/standardcombos/sampleratecombobox.h
function namespace (line 29) | namespace olive {
FILE: app/widget/standardcombos/videodividercombobox.h
function namespace (line 28) | namespace olive {
FILE: app/widget/taskview/elapsedcounterwidget.cpp
type olive (line 28) | namespace olive {
FILE: app/widget/taskview/elapsedcounterwidget.h
function namespace (line 30) | namespace olive {
FILE: app/widget/taskview/taskview.cpp
type olive (line 25) | namespace olive {
FILE: app/widget/taskview/taskview.h
function namespace (line 29) | namespace olive {
FILE: app/widget/taskview/taskviewitem.cpp
type olive (line 28) | namespace olive {
FILE: app/widget/taskview/taskviewitem.h
function namespace (line 33) | namespace olive {
FILE: app/widget/timebased/timebasedview.cpp
type olive (line 30) | namespace olive {
function QPointF (line 160) | QPointF TimeBasedView::ScalePoint(const QPointF &p) const
function QPointF (line 165) | QPointF TimeBasedView::UnscalePoint(const QPointF &p) const
function foreach (line 198) | foreach (const rational& r, snap_time_) {
function qreal (line 256) | qreal TimeBasedView::GetPlayheadX()
FILE: app/widget/timebased/timebasedview.h
function namespace (line 31) | namespace olive {
FILE: app/widget/timebased/timebasedviewselectionmanager.cpp
type olive (line 23) | namespace olive {
FILE: app/widget/timebased/timebasedviewselectionmanager.h
function namespace (line 34) | namespace olive {
FILE: app/widget/timebased/timebasedwidget.cpp
type olive (line 34) | namespace olive {
function ViewerOutput (line 69) | ViewerOutput *TimeBasedWidget::GetConnectedNode() const
function foreach (line 160) | foreach (TimeBasedView* base, timeline_views_) {
function TimeRuler (line 267) | TimeRuler *TimeBasedWidget::ruler() const
function ResizableTimelineScrollBar (line 272) | ResizableTimelineScrollBar *TimeBasedWidget::scrollbar() const
function foreach (line 616) | foreach (TimeBasedView* view, timeline_views_) {
type SnapData (line 753) | struct SnapData {
function AttemptSnap (line 758) | void AttemptSnap(std::vector<SnapData> &snap_data,
function foreach (line 899) | foreach (const SnapData& d, potential_snaps) {
function foreach (line 912) | foreach (TimeBasedView* view, timeline_views_) {
function foreach (line 919) | foreach (TimeBasedView* view, timeline_views_) {
FILE: app/widget/timebased/timebasedwidget.h
function namespace (line 34) | namespace olive {
FILE: app/widget/timebased/timescaledobject.cpp
type olive (line 28) | namespace olive {
function rational (line 47) | const rational &TimeScaledObject::timebase() const
function rational (line 57) | rational TimeScaledObject::SceneToTime(const double &x, const double &...
function rational (line 77) | rational TimeScaledObject::SceneToTimeNoGrid(const double &x, const do...
function rational (line 89) | rational TimeScaledObject::SceneToTime(const double &x, bool round) const
function rational (line 94) | rational TimeScaledObject::SceneToTimeNoGrid(const double &x) const
FILE: app/widget/timebased/timescaledobject.h
function class (line 34) | class TimeScaledObject
FILE: app/widget/timelinewidget/timelineandtrackview.cpp
type olive (line 26) | namespace olive {
function QSplitter (line 51) | QSplitter *TimelineAndTrackView::splitter() const
function TimelineView (line 56) | TimelineView *TimelineAndTrackView::view() const
function TrackView (line 61) | TrackView *TimelineAndTrackView::track_view() const
FILE: app/widget/timelinewidget/timelineandtrackview.h
function namespace (line 30) | namespace olive {
FILE: app/widget/timelinewidget/timelinewidget.cpp
type olive (line 60) | namespace olive {
function foreach (line 132) | foreach (TimelineAndTrackView* tview, views_) {
function foreach (line 274) | foreach (TimelineAndTrackView* view, views_) {
function foreach (line 311) | foreach (Track* track, tracks) {
function foreach (line 340) | foreach (TimelineAndTrackView* tview, views_) {
function foreach (line 359) | foreach (Block* block, added_blocks_) {
function foreach (line 418) | foreach (Track* track, sequence()->GetTracks()) {
function foreach (line 463) | foreach (Block* b, blocks) {
function foreach (line 499) | foreach (Block* b, selected_list) {
function foreach (line 521) | foreach (TransitionBlock* transition, transitions_to_delete) {
function foreach (line 539) | foreach (Block* b, selected_list) {
function foreach (line 565) | foreach (Track* t, sequence()->GetTracks()) {
function foreach (line 577) | foreach (Track* t, sequence()->GetTracks()) {
function foreach (line 601) | foreach (Block* item, GetSelectedBlocks()) {
function foreach (line 626) | foreach (Block* item, GetSelectedBlocks()) {
function foreach (line 650) | foreach (Block* block, selected_blocks_) {
function foreach (line 669) | foreach (Block* block, selected_blocks_) {
function foreach (line 673) | foreach (Block* block, selected_blocks_) {
function foreach (line 734) | foreach (Track* track, unlocked_tracks) {
function foreach (line 771) | foreach (Block* i, items) {
function foreach (line 783) | foreach (Block* b, selected_blocks_) {
function foreach (line 818) | foreach (Block *b, selected_blocks_) {
function foreach (line 854) | foreach (TimelineAndTrackView* tview, views_) {
function foreach (line 861) | foreach (TimelineAndTrackView* tview, views_) {
function Track (line 1002) | Track *TimelineWidget::GetTrackFromReference(const Track::Reference &r...
function foreach (line 1025) | foreach (TimelineViewGhostItem* ghost, ghost_items_) {
function TimelineTool (line 1035) | TimelineTool *TimelineWidget::GetActiveTool()
function foreach (line 1220) | foreach (TimelineAndTrackView* tview, views_) {
function foreach (line 1611) | foreach (Block* b, selected_blocks_) {
function foreach (line 1623) | foreach (Block* b, selected_blocks_) {
function foreach (line 1627) | foreach (Block* b, selected_blocks_) {
function foreach (line 1647) | foreach (Block *b, selected_blocks_) {
function foreach (line 1657) | foreach (Block *b, selected_blocks_) {
function foreach (line 1694) | foreach (TimelineAndTrackView* tview, views_) {
function foreach (line 1701) | foreach (TimelineAndTrackView* tview, views_) {
function TimelineView (line 1725) | TimelineView *TimelineWidget::GetFirstTimelineView()
function rational (line 1730) | rational TimelineWidget::GetTimebaseForTrackType(Track::Type type)
function QRect (line 1735) | const QRect& TimelineWidget::GetRubberBandGeometry() const
function foreach (line 1769) | foreach (Block* b, deselected_blocks) {
function foreach (line 1845) | foreach (const Timeline::EditToInfo& info, tracks) {
function foreach (line 1901) | foreach (const Timeline::EditToInfo& info, tracks) {
function foreach (line 1927) | foreach (TimelineAndTrackView* tview, views_) {
function TimelineAndTrackView (line 1994) | TimelineAndTrackView *TimelineWidget::AddTimelineAndTrackView(Qt::Alig...
function QByteArray (line 2019) | QByteArray TimelineWidget::SaveSplitterState() const
function foreach (line 2080) | foreach (Block* b, items_in_rubberband) {
function foreach (line 2160) | foreach (Block *b, selected_blocks_) {
function Block (line 2189) | Block *TimelineWidget::GetItemAtScenePos(const TimelineCoordinate& coord)
FILE: app/widget/timelinewidget/timelinewidget.h
function namespace (line 40) | namespace olive {
FILE: app/widget/timelinewidget/timelinewidgetselections.cpp
type olive (line 23) | namespace olive {
FILE: app/widget/timelinewidget/timelinewidgetselections.h
function namespace (line 28) | namespace olive {
FILE: app/widget/timelinewidget/tool/add.cpp
type olive (line 32) | namespace olive {
function Node (line 126) | Node *AddTool::CreateAddableClip(MultiUndoCommand *command, Sequence *...
FILE: app/widget/timelinewidget/tool/add.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/beam.cpp
type olive (line 24) | namespace olive {
function TimelineCoordinate (line 36) | TimelineCoordinate BeamTool::ValidatedCoordinate(TimelineCoordinate co...
FILE: app/widget/timelinewidget/tool/beam.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/edit.cpp
type olive (line 24) | namespace olive {
FILE: app/widget/timelinewidget/tool/edit.h
function namespace (line 28) | namespace olive {
FILE: app/widget/timelinewidget/tool/import.cpp
type olive (line 43) | namespace olive {
function foreach (line 142) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
function foreach (line 199) | foreach (ViewerOutput* f, footage) {
function foreach (line 267) | foreach (const Track::Reference& ref, it->second) {
function TimelineViewGhostItem (line 529) | TimelineViewGhostItem* ImportTool::CreateGhost(const TimeRange &range,...
FILE: app/widget/timelinewidget/tool/import.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/pointer.cpp
type olive (line 37) | namespace olive {
function SetGhostToSlideMode (line 240) | void SetGhostToSlideMode(TimelineViewGhostItem* g)
function foreach (line 269) | foreach (Block* block, clips) {
function foreach (line 298) | foreach (Block* this_block, clips) {
function foreach (line 382) | foreach (Block* block, clips) {
function foreach (line 566) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
type GhostBlockPair (line 604) | struct GhostBlockPair {
function foreach (line 616) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
function foreach (line 640) | foreach (const GhostBlockPair& p, blocks_trimming) {
function foreach (line 697) | foreach (const GhostBlockPair& p, blocks_moving) {
function foreach (line 766) | foreach (const GhostBlockPair& p, blocks_sliding) {
function TimelineViewGhostItem (line 848) | TimelineViewGhostItem *PointerTool::GetExistingGhostFromBlock(Block *b...
function TimelineViewGhostItem (line 861) | TimelineViewGhostItem* PointerTool::AddGhostFromBlock(Block* block, Ti...
function TimelineViewGhostItem (line 892) | TimelineViewGhostItem* PointerTool::AddGhostFromNull(const rational &i...
function foreach (line 936) | foreach (Block* compare, items) {
function rational (line 948) | rational PointerTool::ValidateInTrimming(rational movement)
function rational (line 984) | rational PointerTool::ValidateOutTrimming(rational movement)
FILE: app/widget/timelinewidget/tool/pointer.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/razor.cpp
type olive (line 27) | namespace olive {
function foreach (line 65) | foreach (const Track::Reference& track_ref, split_tracks_) {
FILE: app/widget/timelinewidget/tool/razor.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/record.cpp
type olive (line 5) | namespace olive {
FILE: app/widget/timelinewidget/tool/record.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/ripple.cpp
type olive (line 27) | namespace olive {
function foreach (line 47) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
function foreach (line 60) | foreach (Track* track, sequence()->GetTracks()) {
function foreach (line 122) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
FILE: app/widget/timelinewidget/tool/ripple.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/rolling.cpp
type olive (line 27) | namespace olive {
FILE: app/widget/timelinewidget/tool/rolling.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/slide.cpp
type olive (line 27) | namespace olive {
FILE: app/widget/timelinewidget/tool/slide.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/slip.cpp
type olive (line 29) | namespace olive {
function foreach (line 44) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
function foreach (line 51) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
function foreach (line 74) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
FILE: app/widget/timelinewidget/tool/slip.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/tool.cpp
type olive (line 25) | namespace olive {
function TimelineWidget (line 39) | TimelineWidget *TimelineTool::parent()
function Sequence (line 44) | Sequence *TimelineTool::sequence()
function rational (line 62) | rational TimelineTool::SnapMovementToTimebase(const rational &start, r...
function rational (line 74) | rational TimelineTool::ValidateTimeMovement(rational movement)
function foreach (line 99) | foreach (TimelineViewGhostItem* ghost, ghosts) {
function foreach (line 124) | foreach (TimelineViewGhostItem* ghost, parent()->GetGhostItems()) {
FILE: app/widget/timelinewidget/tool/tool.h
function namespace (line 29) | namespace olive {
FILE: app/widget/timelinewidget/tool/trackselect.cpp
type olive (line 27) | namespace olive {
function foreach (line 49) | foreach (Track *track, parent()->sequence()->GetTracks()) {
FILE: app/widget/timelinewidget/tool/trackselect.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/transition.cpp
type olive (line 30) | namespace olive {
FILE: app/widget/timelinewidget/tool/transition.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/tool/zoom.cpp
type olive (line 24) | namespace olive {
FILE: app/widget/timelinewidget/tool/zoom.h
function namespace (line 26) | namespace olive {
FILE: app/widget/timelinewidget/trackview/trackview.cpp
type olive (line 31) | namespace olive {
FILE: app/widget/timelinewidget/trackview/trackview.h
function namespace (line 31) | namespace olive {
FILE: app/widget/timelinewidget/trackview/trackviewitem.cpp
type olive (line 35) | namespace olive {
function QPushButton (line 84) | QPushButton *TrackViewItem::CreateMSLButton(const QColor& checked_colo...
function foreach (line 172) | foreach (Track *track, tracks_to_remove) {
FILE: app/widget/timelinewidget/trackview/trackviewitem.h
function namespace (line 33) | namespace olive {
FILE: app/widget/timelinewidget/trackview/trackviewsplitter.cpp
type olive (line 28) | namespace olive {
function foreach (line 114) | foreach (int s, sizes) {
function QSplitterHandle (line 159) | QSplitterHandle *TrackViewSplitter::createHandle()
FILE: app/widget/timelinewidget/trackview/trackviewsplitter.h
function namespace (line 28) | namespace olive {
FILE: app/widget/timelinewidget/view/timelineview.cpp
type olive (line 38) | namespace olive {
function foreach (line 225) | foreach (const TimeRange& range, it.value()) {
function TimelineCoordinate (line 351) | TimelineCoordinate TimelineView::ScreenToCoordinate(const QPoint& pt)
function TimelineCoordinate (line 356) | TimelineCoordinate TimelineView::SceneToCoordinate(const QPointF& pt)
function TimelineViewMouseEvent (line 361) | TimelineViewMouseEvent TimelineView::CreateMouseEvent(QMouseEvent *event)
function TimelineViewMouseEvent (line 366) | TimelineViewMouseEvent TimelineView::CreateMouseEvent(const QPoint& po...
function qreal (line 686) | qreal TimelineView::GetTimelineLeftBound() const
function qreal (line 691) | qreal TimelineView::GetTimelineRightBound() const
function QPoint (line 757) | QPoint TimelineView::GetScrollCoordinates() const
function Block (line 853) | Block *TimelineView::GetItemAtScenePos(const rational &time, int track...
FILE: app/widget/timelinewidget/view/timelineview.h
function namespace (line 35) | namespace olive {
FILE: app/widget/timelinewidget/view/timelineviewghostitem.h
function namespace (line 32) | namespace olive {
FILE: app/widget/timelinewidget/view/timelineviewmouseevent.h
function namespace (line 32) | namespace olive {
function QMimeData (line 86) | const QMimeData *GetMimeData()
function SetMimeData (line 91) | void SetMimeData(const QMimeData *data)
function SetEvent (line 96) | void SetEvent(QEvent* event)
function accept (line 114) | void accept()
function ignore (line 120) | void ignore()
function SetBypassImportBuffer (line 127) | void SetBypassImportBuffer(bool e) { bypass_import_buffer_ = e; }
FILE: app/widget/timeruler/seekablewidget.cpp
type olive (line 38) | namespace olive {
FILE: app/widget/timeruler/seekablewidget.h
function namespace (line 30) | namespace olive {
FILE: app/widget/timeruler/timeruler.cpp
type olive (line 32) | namespace olive {
FILE: app/widget/timeruler/timeruler.h
function namespace (line 30) | namespace olive {
FILE: app/widget/timetarget/timetarget.cpp
type olive (line 23) | namespace olive {
function ViewerOutput (line 31) | ViewerOutput *TimeTargetObject::GetTimeTarget() const
function rational (line 55) | rational TimeTargetObject::GetAdjustedTime(Node* from, Node* to, const...
function TimeRange (line 64) | TimeRange TimeTargetObject::GetAdjustedTime(Node* from, Node* to, cons...
FILE: app/widget/timetarget/timetarget.h
function namespace (line 26) | namespace olive {
FILE: app/widget/toolbar/toolbar.cpp
type olive (line 34) | namespace olive {
function ToolbarButton (line 145) | ToolbarButton* Toolbar::CreateToolButton(const Tool::Item& tool)
function ToolbarButton (line 162) | ToolbarButton *Toolbar::CreateNonToolButton()
FILE: app/widget/toolbar/toolbar.h
function namespace (line 30) | namespace olive {
FILE: app/widget/toolbar/toolbarbutton.cpp
type olive (line 23) | namespace olive {
FILE: app/widget/toolbar/toolbarbutton.h
function namespace (line 28) | namespace olive {
FILE: app/widget/viewer/audiowaveformview.cpp
type olive (line 30) | namespace olive {
FILE: app/widget/viewer/audiowaveformview.h
function namespace (line 30) | namespace olive {
FILE: app/widget/viewer/footageviewer.cpp
type olive (line 29) | namespace olive {
FILE: app/widget/viewer/footageviewer.h
function namespace (line 27) | namespace olive {
FILE: app/widget/viewer/viewer.cpp
type olive (line 52) | namespace olive {
function foreach (line 160) | foreach (ViewerWindow* window, windows) {
function foreach (line 229) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 276) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function RenderTicketPtr (line 317) | RenderTicketPtr ViewerWidget::GetSingleFrame(const rational &t, bool dry)
function foreach (line 343) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 352) | foreach (QScreen* test, QGuiApplication::screens()) {
function FramePtr (line 442) | FramePtr ViewerWidget::DecodeCachedImage(const QString &cache_path, co...
function foreach (line 477) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 931) | foreach (ViewerWidget* viewer, instances_) {
function foreach (line 1017) | foreach (ViewerDisplayWidget *dw, playback_devices_){
function QString (line 1094) | QString ViewerWidget::GetCachedFilenameFromTime(const rational &time)
function foreach (line 1115) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function RenderTicketWatcher (line 1128) | RenderTicketWatcher *ViewerWidget::RequestNextFrameForQueue(bool incre...
function RenderTicketPtr (line 1151) | RenderTicketPtr ViewerWidget::GetFrame(const rational &t)
function foreach (line 1191) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 1305) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 1641) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 1758) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 1767) | foreach (ViewerWindow* vw, windows_) {
function foreach (line 1776) | foreach (ViewerWindow* vw, windows_) {
function foreach (line 1800) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 1809) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
function foreach (line 1820) | foreach (ViewerDisplayWidget *dw, playback_devices_) {
FILE: app/widget/viewer/viewer.h
function namespace (line 43) | namespace olive {
FILE: app/widget/viewer/viewerdisplay.cpp
type olive (line 49) | namespace olive {
function ViewerSafeMarginInfo (line 169) | const ViewerSafeMarginInfo &ViewerDisplayWidget::GetSafeMargin() const
function QPointF (line 234) | QPointF ViewerDisplayWidget::TransformViewerSpaceToBufferSpace(const Q...
function QPointF (line 577) | QPointF ViewerDisplayWidget::GetTexturePosition(const QPoint &screen_pos)
function QPointF (line 582) | QPointF ViewerDisplayWidget::GetTexturePosition(const QSize &size)
function QPointF (line 587) | QPointF ViewerDisplayWidget::GetTexturePosition(const double &x, const...
function rational (line 601) | rational ViewerDisplayWidget::GetGizmoTime()
function QTransform (line 622) | QTransform ViewerDisplayWidget::GenerateWorldTransform()
function QTransform (line 644) | QTransform ViewerDisplayWidget::GenerateDisplayTransform()
function QTransform (line 653) | QTransform ViewerDisplayWidget::GenerateGizmoTransform(NodeTraverser &...
function NodeGizmo (line 679) | NodeGizmo *ViewerDisplayWidget::TryGizmoPress(const NodeValueRow &row,...
function QPointF (line 1192) | QPointF ViewerDisplayWidget::AdjustPosByVAlign(QPointF p)
function QPointF (line 1288) | QPointF ViewerDisplayWidget::ScreenToScenePoint(const QPoint &p)
function QRectF (line 1407) | QRectF ViewerDisplayWidget::UpdateActiveTextGizmoSize()
FILE: app/widget/viewer/viewerdisplay.h
function namespace (line 40) | namespace olive {
FILE: app/widget/viewer/viewerplaybacktimer.cpp
type olive (line 26) | namespace olive {
FILE: app/widget/viewer/viewerplaybacktimer.h
function namespace (line 28) | namespace olive {
FILE: app/widget/viewer/viewerpreventsleep.cpp
type olive (line 13) | namespace olive {
function PreventSleep (line 21) | void PreventSleep(bool on)
FILE: app/widget/viewer/viewerpreventsleep.h
function namespace (line 4) | namespace olive {
FILE: app/widget/viewer/viewerqueue.h
function namespace (line 26) | namespace olive {
FILE: app/widget/viewer/viewersafemargininfo.h
function namespace (line 28) | namespace olive {
FILE: app/widget/viewer/viewersizer.cpp
type olive (line 30) | namespace olive {
function QSize (line 67) | QSize ViewerSizer::GetContainerSize() const
FILE: app/widget/viewer/viewersizer.h
function namespace (line 28) | namespace olive {
FILE: app/widget/viewer/viewertexteditor.cpp
type olive (line 35) | namespace olive {
function foreach (line 196) | foreach (ViewerTextEditorToolBar *toolbar, toolbars_) {
function foreach (line 544) | foreach (const QString &style, l) {
FILE: app/widget/viewer/viewertexteditor.h
function namespace (line 33) | namespace olive {
FILE: app/widget/viewer/viewerwindow.cpp
type olive (line 26) | namespace olive {
function ViewerDisplayWidget (line 40) | ViewerDisplayWidget *ViewerWindow::display_widget() const
FILE: app/widget/viewer/viewerwindow.h
function namespace (line 28) | namespace olive {
FILE: app/window/mainwindow/mainmenu.cpp
type olive (line 40) | namespace olive {
function foreach (line 373) | foreach (QAction* a, tool_actions) {
function foreach (line 410) | foreach (PanelWidget* panel, PanelManager::instance()->panels()) {
FILE: app/window/mainwindow/mainmenu.h
function namespace (line 30) | namespace olive {
FILE: app/window/mainwindow/mainstatusbar.cpp
type olive (line 25) | namespace olive {
FILE: app/window/mainwindow/mainstatusbar.h
function namespace (line 29) | namespace olive {
FILE: app/window/mainwindow/mainwindow.cpp
type olive (line 37) | namespace olive {
function QString (line 159) | QString TransformNameForSerialization(const QString &unique, int i)
function CorrectPanelDataIfNecessary (line 164) | void CorrectPanelDataIfNecessary(const QString &unique_name, int index...
function MainWindowLayoutInfo (line 173) | MainWindowLayoutInfo MainWindow::SaveLayout() const
function TimelinePanel (line 206) | TimelinePanel* MainWindow::OpenSequence(Sequence *sequence, bool enabl...
function foreach (line 242) | foreach (TimelinePanel* tp, copy) {
function foreach (line 251) | foreach (TimelinePanel* tp, timeline_panels_) {
function foreach (line 341) | foreach (PanelWidget* panel, PanelManager::instance()->panels()) {
function foreach (line 374) | foreach (PanelWidget* panel, PanelManager::instance()->panels()) {
function foreach (line 388) | foreach (ProjectPanel* panel, folder_panels_) {
function foreach (line 393) | foreach (ViewerPanel *viewer, viewer_panels_) {
function foreach (line 522) | foreach (ProjectPanel *p, panels) {
function foreach (line 591) | foreach (ViewerPanel *p, viewer_panels_) {
function TimelinePanel (line 612) | TimelinePanel* MainWindow::AppendTimelinePanel()
function QString (line 658) | QString MainWindow::GetCustomShortcutsFile()
function LoadCustomShortcutsInternal (line 663) | void LoadCustomShortcutsInternal(QMenu* menu, const QMap<QString, QStr...
function foreach (line 690) | foreach (const QString& s, shortcut_list) {
function foreach (line 702) | foreach (QAction* menu, menus) {
function SaveCustomShortcutsInternal (line 709) | void SaveCustomShortcutsInternal(QMenu* menu, QMap<QString, QString>* ...
function foreach (line 732) | foreach (QAction* menu, menus) {
function T (line 904) | T *MainWindow::AppendPanelInternal(const QString &panel_name, QList<T*...
FILE: app/window/mainwindow/mainwindow.h
type ProgressStatus (line 77) | enum ProgressStatus {
FILE: app/window/mainwindow/mainwindowlayoutinfo.cpp
type olive (line 3) | namespace olive {
function foreach (line 11) | foreach (Folder* folder, open_folders_) {
function foreach (line 19) | foreach (Sequence *sequence, open_sequences_) {
function foreach (line 27) | foreach (Sequence *sequence, open_sequences_) {
function MainWindowLayoutInfo (line 59) | MainWindowLayoutInfo MainWindowLayoutInfo::fromXml(QXmlStreamReader *r...
FILE: app/window/mainwindow/mainwindowlayoutinfo.h
function namespace (line 8) | namespace olive {
FILE: app/window/mainwindow/mainwindowundo.cpp
type olive (line 26) | namespace olive {
FILE: app/window/mainwindow/mainwindowundo.h
function namespace (line 26) | namespace olive {
FILE: tests/compositing/compositing-tests.cpp
type olive (line 30) | namespace olive {
FILE: tests/general/common-tests.cpp
type olive (line 25) | namespace olive {
function OLIVE_ADD_TEST (line 27) | OLIVE_ADD_TEST(DigitTest)
FILE: tests/timeline/timeline-tests.cpp
type olive (line 33) | namespace olive {
function OLIVE_ADD_TEST (line 41) | OLIVE_ADD_TEST(AddTrack)
function OLIVE_ADD_TEST (line 96) | OLIVE_ADD_TEST(SequenceDefaults)
function OLIVE_ADD_TEST (line 115) | OLIVE_ADD_TEST(Trim)
function OLIVE_ADD_TEST (line 222) | OLIVE_ADD_TEST(ReplaceBlockWithGap_ClipsOnly)
function OLIVE_ADD_TEST (line 285) | OLIVE_ADD_TEST(ReplaceBlockWithGap_ClipsAndGaps)
function OLIVE_ADD_TEST (line 434) | OLIVE_ADD_TEST(ReplaceBlockWithGap_ClipsAndTransitions)
function OLIVE_ADD_TEST (line 493) | OLIVE_ADD_TEST(InsertGaps_SingleTrack)
Copy disabled (too large)
Download .json
Condensed preview — 1145 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (29,525K chars).
[
{
"path": ".clang-format",
"chars": 4001,
"preview": "---\nLanguage: Cpp\n# BasedOnStyle: Google\nAccessModifierOffset: -1\nAlignAfterOpenBracket: Align\nAlignConsecutiveA"
},
{
"path": ".gitattributes",
"chars": 166,
"preview": "# Default behavior\n* text=auto\n\n# Enforce LF line endings on source files\n*.h text eol=lf\n*.cpp text eol=lf\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 687,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/ISSUE_TEMPLATE/00-olive_unsupported.md",
"chars": 400,
"preview": "---\nname: Legacy Olive 0.1.x issue ⛔\nabout: >-\n Olive 0.1 is no longer supported and issues made about it will be\n aut"
},
{
"path": ".github/ISSUE_TEMPLATE/01-crash_issue.md",
"chars": 633,
"preview": "---\nname: Crash\nabout: Report a fatal crash that resulted in Olive unexpectedly closing.\ntitle: '[CRASH] '\nlabels: 'Cras"
},
{
"path": ".github/ISSUE_TEMPLATE/50-build_issue.md",
"chars": 561,
"preview": "---\nname: Build/Packaging\nabout: >-\n Report an issue related to compiling or packaging.\n Note that we do not officiall"
},
{
"path": ".github/ISSUE_TEMPLATE/50-cache_issue.md",
"chars": 551,
"preview": "---\nname: Disk Cache\nabout: >-\n Report an issue related to the disk cache system, including failure to cache,\n frames "
},
{
"path": ".github/ISSUE_TEMPLATE/50-codec_issue.md",
"chars": 489,
"preview": "---\nname: Codec\nabout: >-\n Report an issue related to codec handling, including importing footage or any\n footage usag"
},
{
"path": ".github/ISSUE_TEMPLATE/50-color_issue.md",
"chars": 518,
"preview": "---\nname: Color Management\nabout: >-\n Report an issue related to the management of pixels and color, including\n inaccu"
},
{
"path": ".github/ISSUE_TEMPLATE/50-editing_issue.md",
"chars": 545,
"preview": "---\nname: Timeline/Editing\nabout: >-\n Report an issue related to the overall editing experience, including usage of\n t"
},
{
"path": ".github/ISSUE_TEMPLATE/50-export_issue.md",
"chars": 506,
"preview": "---\nname: Export\nabout: >-\n Report an issue related to exporting videos from Olive, including errors\n while exporting,"
},
{
"path": ".github/ISSUE_TEMPLATE/50-node_issue.md",
"chars": 569,
"preview": "---\nname: Node/Compositing\nabout: >-\n Report an issue related to the node-based compositing system, including node grap"
},
{
"path": ".github/ISSUE_TEMPLATE/50-playback_issue.md",
"chars": 511,
"preview": "---\nname: Playback\nabout: >-\n Report an issue related to the playback of video or audio, including laggy or\n inconsist"
},
{
"path": ".github/ISSUE_TEMPLATE/50-project_issue.md",
"chars": 493,
"preview": "---\nname: Project Management\nabout: >-\n Report an issue related to project management, including working with and\n org"
},
{
"path": ".github/ISSUE_TEMPLATE/50-renderer_issue.md",
"chars": 513,
"preview": "---\nname: Renderer\nabout: >-\n Report an issue related to rendering, including corrupted frames, incorrect\n render resu"
},
{
"path": ".github/ISSUE_TEMPLATE/50-ui_issue.md",
"chars": 516,
"preview": "---\nname: User Interface\nabout: >-\n Report an issue related to general user interface usability, including\n behavior i"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 159,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Community Support\n url: https://discordapp.com/invite/4Ae9KZn\n "
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 340,
"preview": "---\nname: Default issue template\nlabels: 'Triage'\n---\n<!-- ⚠ Do not delete this issue template! ⚠ -->\n\n**Commit Hash** <"
},
{
"path": ".github/workflows/ci.yml",
"chars": 18728,
"preview": "name: CI\n\non:\n push:\n branches:\n - master\n paths-ignore:\n - '.github/ISSUE_TEMPLATE/**'\n - '.githu"
},
{
"path": ".gitignore",
"chars": 1480,
"preview": "# CMake artifacts\n/build*/\n\n# Doxygen\n/docs/\n\n# Visual Studio (Code)\n.localhistory/\n.history/\n.vscode/\n.vs/\n/out/\nCmakeS"
},
{
"path": ".gitmodules",
"chars": 199,
"preview": "[submodule \"ext/core\"]\n\tpath = ext/core\n\turl = https://github.com/olive-editor/core\n[submodule \"ext/KDDockWidgets\"]\n\tpat"
},
{
"path": "CMakeLists.txt",
"chars": 6793,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2023 Olive Studios LLC\n#\n# This program is free software: you can redi"
},
{
"path": "CONTRIBUTING.md",
"chars": 1500,
"preview": "# Contributing to Olive\n\nThank you for your interest in contributing to Olive!\n\n## Reporting issues\n\nBug reports help to"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 1759,
"preview": "# Olive Video Editor [](https"
},
{
"path": "app/CMakeLists.txt",
"chars": 4725,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/audio/CMakeLists.txt",
"chars": 919,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/audio/audiomanager.cpp",
"chars": 8109,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/audio/audiomanager.h",
"chars": 2781,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/audio/audioprocessor.cpp",
"chars": 8323,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/audio/audioprocessor.h",
"chars": 1855,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/audio/audiovisualwaveform.cpp",
"chars": 16584,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/audio/audiovisualwaveform.h",
"chars": 4186,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/cli/CMakeLists.txt",
"chars": 814,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/cli/cliexport/cliexportmanager.cpp",
"chars": 807,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/cli/cliexport/cliexportmanager.h",
"chars": 927,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/cli/cliprogress/CMakeLists.txt",
"chars": 835,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/cli/cliprogress/cliprogressdialog.cpp",
"chars": 2406,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/cli/cliprogress/cliprogressdialog.h",
"chars": 1141,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/cli/clitask/CMakeLists.txt",
"chars": 819,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/cli/clitask/clitaskdialog.cpp",
"chars": 1020,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/cli/clitask/clitaskdialog.h",
"chars": 1049,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/CMakeLists.txt",
"chars": 1118,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/codec/conformmanager.cpp",
"chars": 4154,
"preview": "#include \"conformmanager.h\"\n\n#include <QDir>\n\n#include \"task/taskmanager.h\"\n\nnamespace olive {\n\nConformManager *ConformM"
},
{
"path": "app/codec/conformmanager.h",
"chars": 1739,
"preview": "#ifndef CONFORMMANAGER_H\n#define CONFORMMANAGER_H\n\n#include <QMutex>\n#include <QObject>\n\n#include \"decoder.h\"\n#include \""
},
{
"path": "app/codec/decoder.cpp",
"chars": 9221,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/decoder.h",
"chars": 9358,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/encoder.cpp",
"chars": 18283,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/encoder.h",
"chars": 8271,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/exportcodec.cpp",
"chars": 2848,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/exportcodec.h",
"chars": 1530,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/exportformat.cpp",
"chars": 6060,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/exportformat.h",
"chars": 1840,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/ffmpeg/CMakeLists.txt",
"chars": 885,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/codec/ffmpeg/ffmpegdecoder.cpp",
"chars": 36662,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/ffmpeg/ffmpegdecoder.h",
"chars": 4451,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/ffmpeg/ffmpegencoder.cpp",
"chars": 31499,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/ffmpeg/ffmpegencoder.h",
"chars": 3319,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/frame.cpp",
"chars": 4499,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/frame.h",
"chars": 3375,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/oiio/CMakeLists.txt",
"chars": 869,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/codec/oiio/oiiodecoder.cpp",
"chars": 7339,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/oiio/oiiodecoder.h",
"chars": 1830,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/oiio/oiioencoder.cpp",
"chars": 1776,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/oiio/oiioencoder.h",
"chars": 1240,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/planarfiledevice.cpp",
"chars": 2422,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/codec/planarfiledevice.h",
"chars": 1455,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/CMakeLists.txt",
"chars": 1554,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/common/autoscroll.h",
"chars": 914,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/cancelableobject.h",
"chars": 1209,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/channellayout.h",
"chars": 1008,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/commandlineparser.cpp",
"chars": 4449,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/commandlineparser.h",
"chars": 2917,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/crashpadinterface.cpp",
"chars": 2979,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/crashpadinterface.h",
"chars": 947,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/crashpadutils.h",
"chars": 1439,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/debug.cpp",
"chars": 1577,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/debug.h",
"chars": 923,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/decibel.h",
"chars": 2400,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/define.h",
"chars": 1977,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/digit.h",
"chars": 999,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/ffmpegutils.cpp",
"chars": 5153,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/ffmpegutils.h",
"chars": 3027,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/filefunctions.cpp",
"chars": 6428,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/filefunctions.h",
"chars": 3238,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/html.cpp",
"chars": 13507,
"preview": "#include \"html.h\"\n\n#include <QDebug>\n#include <QTextBlock>\n\n#include \"xmlutils.h\"\n\nnamespace olive {\n\nconst QVector<QStr"
},
{
"path": "app/common/html.h",
"chars": 2168,
"preview": "#ifndef HTML_H\n#define HTML_H\n\n#include <QTextDocument>\n#include <QTextFragment>\n#include <QXmlStreamReader>\n#include <Q"
},
{
"path": "app/common/jobtime.cpp",
"chars": 381,
"preview": "#include \"jobtime.h\"\n\n#include <QMutex>\n\nnamespace olive {\n\nuint64_t job_time_index = 0;\nQMutex job_time_mutex;\n\nJobTime"
},
{
"path": "app/common/jobtime.h",
"chars": 868,
"preview": "#ifndef JOBTIME_H\n#define JOBTIME_H\n\n#include <QDebug>\n#include <stdint.h>\n\nnamespace olive {\n\nclass JobTime\n{\npublic:\n "
},
{
"path": "app/common/lerp.h",
"chars": 1173,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/memorypool.h",
"chars": 10009,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/ocioutils.cpp",
"chars": 1230,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/ocioutils.h",
"chars": 1007,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/oiioutils.cpp",
"chars": 2272,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/oiioutils.h",
"chars": 1725,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/otioutils.h",
"chars": 890,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2019 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/power.h",
"chars": 1153,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/qtutils.cpp",
"chars": 5194,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/qtutils.h",
"chars": 3143,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/range.h",
"chars": 867,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/ratiodialog.cpp",
"chars": 2682,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/ratiodialog.h",
"chars": 969,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/threadsafemap.h",
"chars": 363,
"preview": "#ifndef THREADSAFEMAP_H\n#define THREADSAFEMAP_H\n\n#include <QMap>\n#include <QMutex>\n\ntemplate <typename K, typename V>\ncl"
},
{
"path": "app/common/tohex.h",
"chars": 223,
"preview": "#ifndef TOHEX_H\n#define TOHEX_H\n\n#include <QString>\n#include <QtGlobal>\n\n#include \"common/define.h\"\n\nnamespace olive {\n\n"
},
{
"path": "app/common/util.h",
"chars": 834,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/xmlutils.cpp",
"chars": 1258,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/common/xmlutils.h",
"chars": 1654,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/config/CMakeLists.txt",
"chars": 795,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/config/config.cpp",
"chars": 14504,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/config/config.h",
"chars": 1558,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/core.cpp",
"chars": 49304,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/core.h",
"chars": 14042,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/crashhandler/CMakeLists.txt",
"chars": 2296,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/crashhandler/crashhandler.cpp",
"chars": 11826,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/crashhandler/crashhandler.h",
"chars": 1769,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/CMakeLists.txt",
"chars": 1387,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/about/CMakeLists.txt",
"chars": 896,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/about/about.cpp",
"chars": 5077,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/about/about.h",
"chars": 1447,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/about/patreon.h",
"chars": 103,
"preview": "#ifndef PATREON_H\n#define PATREON_H\n\n#include <QStringList>\n\nQStringList patrons;\n\n#endif // PATREON_H\n"
},
{
"path": "app/dialog/about/patreon.py",
"chars": 1310,
"preview": "import json\nimport requests\nimport os\n\nurl = 'https://www.patreon.com/api/oauth2/v2/campaigns/1478705/members?include=cu"
},
{
"path": "app/dialog/about/scrollinglabel.cpp",
"chars": 2914,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/about/scrollinglabel.h",
"chars": 1496,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/actionsearch/CMakeLists.txt",
"chars": 833,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/actionsearch/actionsearch.cpp",
"chars": 8698,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2019 Olive Team\n\n This program is free software: you can redis"
},
{
"path": "app/dialog/actionsearch/actionsearch.h",
"chars": 5286,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2019 Olive Team\n\n This program is free software: you can redis"
},
{
"path": "app/dialog/autorecovery/CMakeLists.txt",
"chars": 845,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/autorecovery/autorecoverydialog.cpp",
"chars": 4394,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/autorecovery/autorecoverydialog.h",
"chars": 1383,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/color/CMakeLists.txt",
"chars": 817,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/color/colordialog.cpp",
"chars": 7632,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/color/colordialog.h",
"chars": 2508,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/configbase/CMakeLists.txt",
"chars": 923,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/configbase/configdialogbase.cpp",
"chars": 2374,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/configbase/configdialogbase.h",
"chars": 1367,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/configbase/configdialogbasetab.cpp",
"chars": 824,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/configbase/configdialogbasetab.h",
"chars": 1064,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/diskcache/CMakeLists.txt",
"chars": 833,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/diskcache/diskcachedialog.cpp",
"chars": 3796,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/diskcache/diskcachedialog.h",
"chars": 1424,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/CMakeLists.txt",
"chars": 1300,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/export/codec/CMakeLists.txt",
"chars": 1209,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/export/codec/av1section.cpp",
"chars": 4262,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/av1section.h",
"chars": 1619,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/cineformsection.cpp",
"chars": 2942,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/cineformsection.h",
"chars": 1139,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/codecsection.cpp",
"chars": 829,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/codecsection.h",
"chars": 1087,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/codecstack.cpp",
"chars": 1354,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/codecstack.h",
"chars": 1034,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/h264section.cpp",
"chars": 9192,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/h264section.h",
"chars": 2736,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/imagesection.cpp",
"chars": 1721,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/codec/imagesection.h",
"chars": 1621,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/export.cpp",
"chars": 29514,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/export.h",
"chars": 3341,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportadvancedvideodialog.cpp",
"chars": 2020,
"preview": "#include \"exportadvancedvideodialog.h\"\n\n#include <QDialogButtonBox>\n#include <QGridLayout>\n#include <QGroupBox>\n#include"
},
{
"path": "app/dialog/export/exportadvancedvideodialog.h",
"chars": 1143,
"preview": "#ifndef EXPORTADVANCEDVIDEODIALOG_H\n#define EXPORTADVANCEDVIDEODIALOG_H\n\n#include <QComboBox>\n#include <QDialog>\n\n#inclu"
},
{
"path": "app/dialog/export/exportaudiotab.cpp",
"chars": 3384,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportaudiotab.h",
"chars": 2266,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportformatcombobox.cpp",
"chars": 3785,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportformatcombobox.h",
"chars": 1764,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportsavepresetdialog.cpp",
"chars": 2812,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportsavepresetdialog.h",
"chars": 1269,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportsubtitlestab.cpp",
"chars": 2102,
"preview": "#include \"exportsubtitlestab.h\"\n\n#include <QGridLayout>\n\nnamespace olive {\n\nExportSubtitlesTab::ExportSubtitlesTab(QWidg"
},
{
"path": "app/dialog/export/exportsubtitlestab.h",
"chars": 1892,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportvideotab.cpp",
"chars": 8074,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/export/exportvideotab.h",
"chars": 4907,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footageproperties/CMakeLists.txt",
"chars": 889,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2020 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/footageproperties/footageproperties.cpp",
"chars": 8018,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2020 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footageproperties/footageproperties.h",
"chars": 2775,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2020 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footageproperties/streamproperties/CMakeLists.txt",
"chars": 1161,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2020 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/footageproperties/streamproperties/audiostreamproperties.cpp",
"chars": 1010,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2020 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footageproperties/streamproperties/audiostreamproperties.h",
"chars": 1146,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2020 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footageproperties/streamproperties/streamproperties.cpp",
"chars": 841,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2020 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footageproperties/streamproperties/streamproperties.h",
"chars": 1086,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2020 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footageproperties/streamproperties/videostreamproperties.cpp",
"chars": 10016,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2020 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footageproperties/streamproperties/videostreamproperties.h",
"chars": 3856,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2020 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/footagerelink/CMakeLists.txt",
"chars": 849,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/footagerelink/footagerelinkdialog.cpp",
"chars": 6560,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2019 Olive Team\n\n This program is free software: you can redis"
},
{
"path": "app/dialog/footagerelink/footagerelinkdialog.h",
"chars": 1212,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2019 Olive Team\n\n This program is free software: you can redis"
},
{
"path": "app/dialog/keyframeproperties/CMakeLists.txt",
"chars": 857,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/keyframeproperties/keyframeproperties.cpp",
"chars": 7595,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/keyframeproperties/keyframeproperties.h",
"chars": 1700,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/markerproperties/CMakeLists.txt",
"chars": 861,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/markerproperties/markerpropertiesdialog.cpp",
"chars": 4549,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/markerproperties/markerpropertiesdialog.h",
"chars": 1762,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/otioproperties/CMakeLists.txt",
"chars": 854,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2019 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/otioproperties/otiopropertiesdialog.cpp",
"chars": 3266,
"preview": "/***\n Olive - Non-Linear Video Editor\n Copyright (C) 2019 Olive Team\n This program is free software: you can redistr"
},
{
"path": "app/dialog/otioproperties/otiopropertiesdialog.h",
"chars": 847,
"preview": "\n#ifndef OTIOPROPERTIESDIALOG_H\n#define OTIOPROPERTIESDIALOG_H\n\n#include <QDialog>\n#include <QTreeWidget>\n\n#include \"com"
},
{
"path": "app/dialog/preferences/CMakeLists.txt",
"chars": 937,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/preferences/keysequenceeditor.cpp",
"chars": 1942,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/preferences/keysequenceeditor.h",
"chars": 3543,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/preferences/preferences.cpp",
"chars": 1700,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/preferences/preferences.h",
"chars": 1325,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/preferences/tabs/CMakeLists.txt",
"chars": 1369,
"preview": "# Olive - Non-Linear Video Editor\n# Copyright (C) 2022 Olive Team\n#\n# This program is free software: you can redistribut"
},
{
"path": "app/dialog/preferences/tabs/preferencesappearancetab.cpp",
"chars": 3451,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/preferences/tabs/preferencesappearancetab.h",
"chars": 1408,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/preferences/tabs/preferencesaudiotab.cpp",
"chars": 9831,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
},
{
"path": "app/dialog/preferences/tabs/preferencesaudiotab.h",
"chars": 2028,
"preview": "/***\n\n Olive - Non-Linear Video Editor\n Copyright (C) 2022 Olive Team\n\n This program is free software: you can redist"
}
]
// ... and 945 more files (download for full content)
About this extraction
This page contains the full source code of the olive-editor/olive GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1145 files (27.0 MB), approximately 7.1M tokens, and a symbol index with 2150 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.