You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.7 KiB
102 lines
3.7 KiB
----------------------------------------------------
|
|
More accurate and up-to-date information is in /docs/architecture.txt
|
|
----------------------------------------------------
|
|
|
|
HOWTO clone frames
|
|
|
|
I want to contribute a quick how-to how to use the new attribute
|
|
TC_FRAME_IS_CLONED.
|
|
|
|
I have written two filters tc_video and tc_audio as an
|
|
demonstration example of the clone flag doing actually something
|
|
useful. These filters telecine a NTSC_FILM to NTSC_VIDEO
|
|
(23.9->29.9 fps) for video and audio. The input material must be
|
|
in 23.9 fps or weird results come out. Of course, you can use
|
|
ivtc+decimate to reverse the process and restore the original
|
|
video :)
|
|
|
|
The best documentation is (as always) the source but let me
|
|
summarize my experience.
|
|
|
|
A filter can clone (duplicate) a frame by setting the clone flag
|
|
to a frame by
|
|
ptr->attributes |= TC_FRAME_IS_CLONED;
|
|
|
|
The encoder then deletes the flag and sets another flag named
|
|
TC_FRAME_WAS_CLONED. This is necessary for the filter because
|
|
frame IDs never get incremented.
|
|
|
|
The filter has to live in the TC_POST_M_PROCESS or in the
|
|
TC_POST_S_PROCESS (synchronous) slot for this to work and its
|
|
quite a difference between TC_POST_M_PROCESS and TC_POST_S_PROCESS
|
|
|
|
TC_POST_M_PROCESS:
|
|
The filter can set the the clone flag which causes the frame
|
|
to get encoded twice. The filter WON'T see the frame again, so
|
|
it cannot make modifications to the frame. This is what the
|
|
demo filter_clone uses.
|
|
|
|
import -> .. -> filter (set_clone) -> encoder (frame)-,
|
|
/ /
|
|
\______<<<________/
|
|
|
|
TC_POST_S_PROCESS:
|
|
The filter can set the clone flag which causes the frame to
|
|
get encoded and run through the filter again with the
|
|
was_cloned flag set. The filter can now check if this frame
|
|
already was cloned and not clone it again. This is very handy
|
|
when doing modulo insertions of frames.
|
|
|
|
import -> .. -> filter (if !was_cloned -> encoder (frame)-,
|
|
/ then set_clone) /
|
|
\_________<<<________________<<<____________/
|
|
|
|
|
|
Definitions:
|
|
The frame ID never gets incremented to reflect the count of
|
|
cloned frames. If the filter decides to clone a frame, it gets the
|
|
frame back with the same ID but with TC_FRAME_WAS_CLONED set, so
|
|
its easy to distinguish between the frame with the original ID
|
|
and the duplicated ID.
|
|
|
|
Limitations/Bugs:
|
|
- It is not possible to rerun the frame through the complete
|
|
filter pipeline. TC_POST_S_PROCESS is the most far away point
|
|
the frame can get back.
|
|
|
|
- transcode's encoding frame counter is wrong, but the final
|
|
message, ie
|
|
[transcode] encoded 331 frames (0 dropped), clip length 11.04 s
|
|
is correct.
|
|
|
|
Notes:
|
|
TC_FRAME_WAS_CLONED is introduced in this patch and is not
|
|
available in earlier transcode versions.
|
|
|
|
Notes on the included filters:
|
|
The tc_video filter is pretty straight forward, doing a normal
|
|
telecine. Thanks to Thanassis Tsiodras who explained very
|
|
precise what telecine and what inverse telecine is. The code is
|
|
commented to show its work flow and workings.
|
|
|
|
The tc_audio filter is a bit trickier, because the audio frames
|
|
have to get "repackaged". The audio import bufsize is tweaked to
|
|
read the frames in chunks suitable for 23.9 fps and the filter
|
|
then moves them back and forth to repackage them suitable for
|
|
29.9 fps. Considering this example.
|
|
|
|
Import: 48000,16,2 @ 23.9 fps -> bufsize = 8008
|
|
export: 48000,16,2 @ 29.9 fps -> bufsize = 6408
|
|
|
|
The filter does a conversion from 4 frames * 8008 to
|
|
5 frames * 6408
|
|
|
|
No data is added or removed.
|
|
|
|
I think this feature is now pretty usable so start hacking on
|
|
frame rate conversion filters :)
|
|
|
|
Version 0.1
|
|
|
|
2002 Tilmann Bitterberg <transcode@tibit.org>
|