---------------------------------------------------- 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