research for a digital cinema workflow under linux
Introduction
Research published in October, 2010.
The research presented here aims at establishing a digital cinema editing workflow made exclusively under Linux machines. The steps described below start at the point in which we already have a sequence, or many sequences, of digital negative (DNG) files. In the diagram, they correspond to the stages immediately after the third grey box. Everything described from there on has been tested and is documented here.
Even though it is the aim of this documentation to gather information related to the whole process – which includes capturing and monitoring the recording, transferring the data to the computer, playing the JP4 files and finally converting them to DNG sequences – the previous parts are can be retraced by putting together information that can be found at Apertus’ site or that is spread throughout Elphel’s Wiki. We can consider that, therefore, as a second step towards our objective.
This research first tests which format is best to be used as proxy. It takes into consideration that editors will need to do many test renders during editing and that a fine photographic adjustment of the images will be done only at the final stages (those proxies, then, must be easily replaceable), in which the workflow is divided between the photographer, the audio technician and the final retouches by the editor.
Preparations for editing
files to be used as proxies
We could render the DNG files generated by movie2dng using ufraw-batch. At this moment of the workflow, we are interested in generating proxies files – that is, light files that have three characteristics: they have to be able to used for editing; they have to present a good preview of the final video without compromising too much of the quality; and they have to register fast rendering times in our NLE (be it Cinelerra or Blender) so that we can do preview-renders of our edited video quickly and leave high CPU demands for post-editing.
To achieve so, however, we have to test which type of file would best fit into all these requirements. Would the best format be TIF of JPG? For the test below, I used 4 sample DNGs generated by Elphel downloaded from Apertus Project’s website. I copied them and pasted them into the same folder so that I would have 360 frames – or a good preview of what to expect from 15 seconds of a CIMAX recording (2592×1120) at 24fps. Note that the frames I used were even larger than the CIMAX format.
Test 1
Process 360 DNG frames (occupying 3,4GB of disk space), or 15s of RAW video footage
Command line used:
ufraw-batch --conf=apertus_teste.ufraw *.dng |
format | debayer pattern | space in disk (all files) |
processing time for 15s |
processing time for 60s (est.) |
processing time for 10m (est.) |
JPEG (50% compression) | bilinear | 44MB | 4m | 16m | 2h40m |
JPEG (50% compression) | PPG | 45MB | 3m55s | 15m40s | 2h36m |
JPEG (50% compression) | VNG | 44,5MB | 5m25s | 21m40s | 3h36m |
JPEG (50% compression) | AHD | 45MB | 4m35s | 18m10s | 3h10m |
JPEG (100% compression) | bilinear | 1,9GB | 7m30s | 30m | 5h |
JPEG (100% compression) | AHD | 2,0GB | 9m25s | 37m40s | 6h15m |
TIF (uncompressed) | bilinear | 5,1GB | 4m15s | 17m | 2h50m |
TIF (uncompressed) | PPG | 5,1GB | 4m17s | 17m08s | 2h51m |
TIF (uncompressed) | VNG | 5,1GB | 5m57s | 23m48s | 3h58m |
TIF (uncompressed) | AHD | 5,1GB | 6m20s | 25m20s | 4h15m |
Results: For what we can see from this first test, four formats have the potential to be used as proxies: JPEG 50% PPG, JPEG 50% Bilinear, TIF Uncompressed Bilinear and TIF Uncompressed PPG. The first two have the advantage of occupying very low disk space if compared to the third and fourth ones (44MB~ x 5,1GB). They can be a very interesting solution, especially for larger projects. But if we consider the workflow as a whole, the TIF formats should make out life easier at post-production.
The problem with this test is that the command line above processes only one image at a time. With some research, I came across a very simple software called parallel, that can be easily compiled (don’t use the pre-packaged versions, they are too old) and will help us to use all the cores of a multi-threaded processor, in my case, the Intel i7 860. Dividing the work between the cores of the processor dramatically reduced the time in my tests – generally, it took him half the time to complete the task; in some cases, it took him one third of the time.
Test 2
Process 360 DNG frames (occupying 3,4GB of disk space), or 15s of RAW video footage – using multi-threaded processing
Command line used:
ls *.dng | parallel -j +0 ufraw-batch --conf=apertus02.ufraw --silent {} |
format | debayer pattern | space in disk (all files) |
processing time for 15s |
processing time for 60s (est.) |
processing time for 10m (est.) |
JPEG (50% compression) | bilinear | 44MB | 1m41s (previous: 4m) |
6m44s | 67m20s |
JPEG (50% compression) | PPG | 45MB | 1m44s (previous: 3m55s) |
6m56s | 69m20s |
JPEG (50% compression) | VNG | 44,5MB | 3m (previous: 5m25s) |
12m | 120m |
JPEG (50% compression) | AHD | 45MB | 2m26s (previous: 4m35s) |
9m44s | 97m20s |
JPEG (100% compression) | bilinear | 1,9GB | 2m20s (previous: 7m30s) |
9m20 | 93m20s |
JPEG (100% compression) | AHD | 2,0GB | 3m05s (previous: 9m25s) |
12m20s | 123m20s |
TIF (uncompressed) | bilinear | 5,1GB | 2m59s (previous: 4m15s) |
11m56s | 119m20s |
TIF (uncompressed) | PPG | 5,1GB | 2m57s (previous: 4m17s) |
11m48s | 116m |
TIF (uncompressed) | VNG | 5,1GB | 3m13s (previous: 5m57s) |
12m52s | 128m40s |
TIF (uncompressed) | AHD | 5,1GB | 2m58s (previous: 6m20s) |
11m52s | 118m40s |
Results: As it turns out, it seems that the best formats to be used as proxy are the JPEG 50% Bilinear and the JPEG 50% PPG. The observation about disk space occupied by both (see previous results) is still pertinent and reducing further the quality of the JPEGs (below 50%) may even fasten the overall conversion, but that must be tested in the timeline of the NLE, during a real editing project. The JPEG formats also benefited most from the multi-threaded task.
Space in disk worries
For the TIF formats, we must consider the enormous amount of disk space occupied by them. The table below is just a rough preview. I take into consideration only the DNGs converted by movie2dng and their processed TIF counterparts, by ufraw-batch. You should have in mind that there are still the original Elphel’s JP4 files, (many) Cinelerra preview renders you should make along the way, the temporary files you should use as the project goes through the whole process, original audio, audio for post-production and the final movie render.
source video | DNGs | UFRaw’s TIFs | total |
15s | 3,4 GB | 5,1 GB | 8,5 GB |
1min | 13,6 GB | 20,4 GB | 34 GB |
10min | 136 GB | 204 GB | 340 GB |
30min | 408 GB | 612 GB | 1020 GB |
Rendering tests using the proxy files
It is now time to check how these image sequences will behave in our NLE. My initial intent is to use Cinelerra as editor and Blender for effects, such as titles or post-production. So I imported the files generated by the tests above into a timeline, using CIMAX standard as reference (2592×1120 at 24fps). Note that for this test, I use only the video stream, since it’s too soon to preview which will be the best workflow for audio.
Test 3
Render 360 frames, or 15s of 2592×1120 video footage at 24fps from Cinelerra’s Timeline
source | render characteristics | time taken to render 15s of video |
space in disk occupied by renders |
JPEG (50% compression) Bilinear | MOV with JPEG Photo at 100% | 34s | 240MB |
JPEG (50% compression) Bilinear | MOV with JPEG Photo at 50% | 32s | 35MB |
JPEG (50% compression) PPG | MOV with JPEG Photo at 100% | 34s | 241MB |
JPEG (50% compression) PPG | MOV with JPEG Photo at 50% | 32s | 35,5MB |
JPEG (50% compression) AHD | MOV with JPEG Photo at 100% | 1m51s | 700MB |
JPEG (50% compression) AHD | MOV with JPEG Photo at 50% | 1m59s | 35,4MB |
TIF (Uncompressed) Bilinear | MOV with JPEG Photo at 100% | 1m53s | 640MB |
TIF (Uncompressed) Bilinear | MOV with JPEG Photo at 50% | 1m49s | 34,6MB |
TIF (Uncompressed) Bilinear | TIF Sequence (Uncompressed) | 3m26s | 2,96GB |
TIF (Uncompressed) PPG | MOV with JPEG Photo at 100% | 1m56s | 672MB |
TIF (Uncompressed) PPG | MOV with JPEG Photo at 50% | 1m44s | 35MB |
TIF (Uncompressed) PPG | TIF Sequence (Uncompressed) | 2m38s | 2,96GB |
TIF (Uncompressed) AHD | TIF Sequence (Uncompressed) | 3m08s | 2,96GB |
Results: The JPEG 50% Bilinear and JPEG 50% PPG are the fastest, both rendering at similar speeds. The difference in time when rendering these formats with the JPEG Photo codec at 50% or 100% is almost irrelevant, but the space in disk occupied by them should weight in favour of JPEG Photo at 50%’s side. It is worthy noticing the behaviour of JPEG brought to Cinelerra using AHD. It takes about 4x to render when compared to its cousins – if rendered with JPEG Photo at 100%, it also takes way more space in disk. Working with TIF here serves for us to have an idea of the necessary time to render the final version of the video, that should be brought here using TIF Uncompressed AHD and rendered either as a TIF Uncompressed Sequence (to be encoded by MEncoder for standard outputs) or as JPEG Photo at 100% with PCM audio in a MOV container.
Overall conclusion from the tests
There are two main conclusions to be drawn from these tests. The first one is that the JPEG 50% Bilinear and JPEG 50% PPG are the best ones to be used as proxies. They are the fastest to be processed, both during ufraw’s batch conversion and cinelerra’s render: they take 7x real-time to be processed at the first step and only 2x real-time at the second one. They also occupy minimum space in disk, and can be easily previewed by MPlayer at anytime during the workflow.
But there is a major drawback in using the JPEG formats. If we combine them with img2list, we’ll have a hard time replacing the JPEGs at Cinelerra’s timeline with the final TIFs due to how img2list and Cinelerra work together (Cinelerra’s XML don’t point to the images, but to img2list’s generated list, which can’t be changed without harming Cinelerra’s interpretation of it). That should leave you two options. You can invert the workflow and do the photographic treatment before editing. That can be done for some movies; for others, it will be unthinkable. Or, more reasonably, you could replace the JPEG image blocks manually in Cinelerra’s timeline for the TIF ones. That can be less work than it seems, but you’d have to have the very final cut of the movie at the moment of replacement, since further editing – even a minor tweak – will become quite hard. In other words, you’d be fronzen there.
Update: The above mentioned is not necessarily true. In further research conducted on this workflow, we have been able to establish a link between automation scripts and the updating of Cinelerra’s XML, resulting in the best of bost worlds – we can use JPEG 50% as proxies and use TIF for the final render, gaining both speed and quality. Check out the new findings here. |
grep “EDIT STARTSOURCE=” cinelerra_outra_pasta.xml | cut -d”>” -f1,2 | cut -d”=” -f1,2,4,5 > temp_readableXML.txt && sed -ie ‘s/<EDIT STARTSOURCE=”/- frames /g’ temp_readableXML.txt && sed -ie ‘s/” CHANNEL=”/ to /g’ temp_readableXML.txt && sed -ie ‘s/”><FILE SRC=/ File: /g’ temp_readableXML.txt && grep File temp_readableXML.txt > temp_readableXML2.txt && gawk ‘{ $8 = $5 + $3; $9 = $3+1 ;print $6,$7,$1,$2,$9,$4,$8 }’ temp_readableXML2.txt > List_of_DNGs_for_post_production.txt && rm temp_readableXML*.txt temp_readableXML.txte |
Will give us this more reassuring output in the text file:
File: “/home/livre/Desktop/testes_e_exemplos_elphel/dngs/img2list/lista” – frames 1 to 7 File: “/home/livre/Desktop/testes_e_exemplos_elphel/dngs/img2list/lista” – frames 8 to 13 |
Now it is clear which DNGs we should use. In this case, I’d just go through my file “lista” (which is a img2list file I had created previously for editing) and see which DNGs I’ll have to reprocess in UFRaw and ufraw-batch. The easiest way to do that would be to copy those files to a temporary folder, treat them and check them out directly at Cinelerra’s timeline or with MPlayer:
Command line used:
mplayer “mf://*.jpg” -mf fps=24:type=jpg -fs -vf dsize=2592:1120 |
When you’re satisfied with the results, copy the resulting files (probably Uncompressed AHD TIFs) and paste them into the original DNG’s folder. If you have used Uncompressed TIFs as proxies, you will be prompted to replace the TIFs in that folder. Do it, replace them. And you’re done.
Now, when you open your Cinelerra project again (that cinelerra.xml file, in our example), the program will read your new TIFs instead of the old ones and you’re ready to mix the other final sources (audio and lettering) for a final render.
Lettering and other effects should be done in Blender. Depending on Blender’s behaviour, we can use proxies to do it and export the result using an alpha channel, so that it can be brought into Cinelerra’s timeline for the final render. In case Blender is able to read our original files, we can do the final render inside it. In both scenarios, a Render Farm can be built to help the CPU efforts.
Research continues…
Update: the continuation to this research has been published. It shows how all the steps mentioned here can be easened by the use of automation scripts. Check out here. |
[…] ver una versión ampliada de esta imagen […]
Más cerca de un verdadero cine digital de código abierto de lo que pensamos 【2022】
22 de janeiro de 2022 at 9:40