+++ /dev/null
-11/7/01
-
-Mask feathering and value implemented. Crash bug in
-CWindowMaskGUI::get_keyframe fixed.
-
-
-
-
-
-11/22/01
-
-Removed memory leak in VirtualConsole. Another case of base destructor
-calling base methods only.
-
-Time average finally implemented. Deinterlace implemented.
-
-Translation in screencapture recording implemented.
-
-AVI parameter editing box.
-
-Drag and drop of assets during an index build doesn't lock up.
-Dragging mixtures of audio and video works better. Better handling of
-shared effects which are off.
-
-Batches can be moved up and down the list.
-
-
-
-
-
-12/6/01
-
-OpenDIVX debugging:
-
-Fixed bugs in decore2: *run = *last = -1; was not copied over from
-encore50.
-
-Rewrote bitstream parser in encore2 and decore2 to be more reliable.
-
-Disabled MMX due to crashes in Redhat 7.2.
-
-Discovered decore2 can't do P frames so switched back to decore50.
-
-Renamed header files, symbols to all
-in the same program.
-
-Renamed more symbols in mpeg2enc to coexist with opendivx.
-
-To make encore2 work on 64 bit processors:
-
-Typecasted offsets in CompensateBlock and get_ref to (int)
-
-Decore50 still not functional on 64 bit processors.
-
-
-
-
-Implemeneted PNG list output. Debugged list output and input.
-
-Configuration dialog for OpenDivx in Cinelerra migrated from encore50
-to encore2.
-
-Configuration dialog for Vorbis and Vorbis export to Quicktime.
-
-Can use shift-R to render.
-
-DV encoding implemented. The last libdv library only supported MMX and
-B&W.
-
-
-
-
-12/16/01
-
-Moved all OpenDivx support to the encore50 derivative of the encoder.
-This appears to do everything that the encore2 derivative could do at
-equal or lesser reliability.
-
-Changed bmp argument for decore50 to 3 member array. Added quant
-argument which, when set to nonzero, fixes the quantization. OpenDivx
-with fixed quantization looks 33% better than MPEG-2.
-
-Direct copy rendering for OpenDivx so output of the renderfarm can be
-direct copied into a single file.
-
-Moved all theme support into a plugin. Resources are no longer
-compiled in but concatenated to the binaries. This made compilation
-take less time and should theoretically allow more themes to be
-supported without increasing resident set size.
-
-Made ports specific to each render node instead of global. This way
-multiple Cinelerra clients can run on the same box without violating
-the single thread requirement of new libraries.
-
-Cinelerra daemon forks to background. Made assets export more
-compression parameters to render nodes.
-
-Vorbis decoding in Quicktime without seeking. The encoding is probably
-not going to change anymore but Vorbis doesn't appear seekable. No-one
-is going to use OpenDivx and Vorbis without an endorsement from
-Microsoft anyway.
-
-
-
-
-
-
-
-12/22/01
-
-Seeking support for Quicktime/Vorbis. Support for Vorbis on 64 bit
-processors. Further debugging of Divx. Quality of 6 yields errors in
-output. Quality of 5 seems to be the maximum. Changed fourcc from
-VBIS to OggS for vorbis.
-
-To make Vorbis work on 64 bit processors:
-
-change sizeof(int) to sizeof(int*) in lib/floor1.c: 263
-
-Menu effects can paste into the timeline.
-
-Changes in label handling when pasting resources.
-
-Statusbar and zoombar resizing restored.
-
-Implemented code to move plugin sets up and down a level.
-
-Improved table of contents support for libmpeg3. This scans every byte
-of the mpeg files and records the location of every keyframe and every
-sample of audio. The table of contents can then be loaded by
-Cinelerra, allowing frame accurate editing from mpeg source material.
-
-A memory allocation bug in the Linux kernel crashes the system when
-using mpeg3toc on DVD's so forget about transcoding Starwars on a
-render farm. Don't know who discovered that either.
-
-
-
-
-
-
-
-12/28/01
-
-Ignored the warnings and set -ieee for all files in quicktime to fix
-floating point exceptions. This made it twice as slow but it worked.
-
-Floating point exceptions in the following places were fixable with
-certain changes:
-
-vorbis_lpc_predict -> A return statement before anything is done.
-bark_noise_pointmp -> noise[i] could be set to 0
-bark_noise_hybridmp -> noise[i] could be set to 0
-
-Defining VORBIS_IEEE_FLOAT32 seemed to fix mapping0 crashes so the
-preceeding changes were backed out.
-
-Loading XML files with multiple video tracks works better.
-
-Linux 2.4.17 handles DVD table of contents operations better but
-crashes after 5 hours of reading a DVD. You'll have to reboot often to
-control memory corruption.
-
-
-
-
-
-
-
-1/4/02
-
-Credit for official Microsoft software even though there isn't any
-official Microsoft software.
-
-Records to DV again but not under kernels after 2.4.7.
-
-New audio effects:
-Tone generator
-Reverse audio
-Delay audio
-
-3rd attempt to improve main window scrollbars.
-
-
-
-
-
-
-1/11/02
-
-New video effects:
-Delay video
-Reverse video
-Swap channels
-
-New audio effects:
-Denoise
-Parametric EQ using fast fourier transform. This isn't standard but
-it gives real gaussian curves.
-Spectrogram
-Time stretch
-Resample
-Pitch shift
-
-Frequency table expanded in Units. This uses real 1/3 octave steps.
-
-Flipped U and V in opendivx encoder so it conforms to YUV order on
-disk.
-
-Reconfiguration during audio rendering reenabled.
-
-Constitutive reconfiguration for video turned off. This was used to
-debug the memory leaks.
-
-Icon for Normalize. Tone generator improvement.
-
-
-
-
-
-1/18/02
-
-New audio effects:
-Compressor
-
-
-New video effects:
-Denoise
-Frame to field conversion
-Field to frame conversion
-Reframe
-
-Video denoise uses the average of an arbitrary number of previous
-frames to predict what the value for the next frame should be. This
-can also be used as a threshold effect or a time average.
-
-Optimized time average.
-
-
-
-
-1/25/02
-
-Plugin keyframes loaded from XML.
-Correct rendering of plugin keyframes. Some plugins interpolate.
-Most plugin GUI's update when insertion point is moved among keyframes.
-Plugin keyframes draw when created.
-Cursor jumps to plugin keyframes when selected.
-Samplerate adjustable in all media info windows.
-Samplerate and framerate adjustments not overridden when loaded in an EDL.
-Improved fade automation rendering.
-
-New video effects:
-Oil painting
-Whirl/pinch
-Polar
-Rotation
-Waves
-Waveform/Vectorscope
-Hue/Saturation
-YUV adjustment
-Invert video
-
-New audio effect:
-Invert audio
-
-
-
-
-
-
-
-2/1/02
-
-Progress windows really cancel instead of just letting you press the
-button.
-Status bar shows how long something took when it finishes.
-Removed Send and Recieve options from effects. It was never needed and it
-complicated the use of variable track sizes.
-
-First stage of making width and height specific to tracks and renamed
-projector size to canvas size.
-More interpolation for effects.
-Second stage of titler.
-
-
-
-
-
-
-2/8/02
-Pasting effect keyframes works better.
-Improved extension and contraction of effects during clear and paste.
-Automation for more effects.
-Effect keyframe behavior is more predictable.
-For a good time enable auto keyframes and type stuff into the titler while playing back.
-Clearing VFrames clears the alpha too.
-Added a tests directory and stored some test EDLs.
-Blur can selectively blur single channels
-Effects can be attached to tracks with no data via a popup menu finally.
-Plugin GUI's are more often updated when tracks are deleted.
-
-Final stage of titling implementation.
-Chromakey and lumakey
-
-
-
-2/15/02
-Effects more accurately follow edits while cutting and pasting.
-More accurate keyframing in effects.
-Video Transitions restored.
-Audio transitions enabled.
-Transition length inputted in seconds.
-Stepped up the number of previous files displayed.
-Option to disable tracks when no edits was removed. The VConsole automatically
-detects when effects synthesize material.
-Independant track sizes can now be changed with a popup menu.
-Renderfarm more accurately calculates balanced loads.
-Disabled avifile to reduce the debugging noise.
-Removed memory leak from Quicktime MPEG-4 decoder.
-Slightly optimized resource window updates after loading.
-
-Linux 2.4.17 crashes probably because Cinelerra moves too much memory
-around. We disabled kswapd by putting a return 0; in
-/usr/src/linux/mm/vmscan.c. The operating system seems more stable now.
-
-Enabled deletion of assets and clips from the project. Also can delete
-assets from disk.
-Rebuild indices should handle multiple indices if selected.
-
-Rectangle selection in asset window. The heroine background was
-lightened but mind you, the heroine background is a permanent feature.
-
-Latest seeking issue fixed in libmpeg3. Looking for ways to shift
-audio based on the pts.
-Compositor window tumblers work better.
-More verbose overlays for camera, projector, and output regions, making
-it easier to visualize the compositing pipeline.
-Easier to use magnifying glass.
-Middle mouse button dragging in CWindow works.
-
-
-new video transitions:
-bandslide
-bandwipe
-slide
-wipe
-irissquare
-
-
-
-
-
-
-
-2/22/02
-
-Implemented another MPEG-2 bitrate control algorithm. YUV 4:2:2 MPEG-2
-in fixed bitrate modes above 7000000 is recommended for DV footage for
-now.
-
-Assets and effects are now sortable in the Resource window. Text
-displays aren't corrupted as much.
-
-Certain EDL load operations honor the labels follow edits setting and
-certain load operations insert labels constitutively.
-
-Width and height of tracks load properly. Adjustments to track width
-and height render more often.
-
-Playback automation always restored from undos.
-
-Improved tracking when every frame is played. Smooth scrolling during
-playback is now supported.
-
-Right mouse button doesn't activate selection rectangles anymore.
-AVIFile disabled since it doesn't support GCC 3.0 anymore.
-More reliable reading of individual image files.
-More accurate rendering of fade automation.
-More accurate tracking during playback.
-Deinterlace with average works.
-Certain edit operations from CWindow don't lock up the MWindow anymore.
-CWindow scrollbars updatge after loading.
-Track canvas after In/Out point dragging is properly refreshed.
-Cursor motion over keyframes doesn't force rendering as often.
-
-
-
-
-
-
-3/1/02
-
-In/Out clearing crashes less and works better.
-
-Removed IPC modeled semaphores. Now no IPC stubs are left after a crash.
-
-Rendering nodes and recording batches can be individually toggled.
-
-Buz driver refurbished. No longer requires kernel hacks to change channels.
-
-Motion JPEG compression library debugged further. Less corruption.
-
-Playback through Buz driver enabled. Now adjust color correction and see
-it on a monitor.
-
-Playback of video through Firewire implemented. Still not functional.
-
-YUV 4:2:0 Planar -> YUV 4:2:2 Planar color conversion
-
-Renderengine retools the playback configuration for every command instead of
-every EDL change.
-
-Integrated IA-32 assembly language jpeg library.
-
-
-
-
-
-
-
-3/15/02
-
-Enabled assembly language routines in jpeg library. Added swap fields
-option to Buz output driver.
-
-YUV overlay reenabled. Only works on commercial NVidia drivers.
-
-Libmpeg3 reads transport streams again.
-
-Dissolve debugged further.
-
-Moving out guicast images. Implementing defaulttheme and microtheme.
-
-
-
-
-
-
-
-
-
-
-
-
-3/22/02
-
-Consolidated audio and video settings into a format dialog.
-Made XVideo a separate driver.
-Continued improvements of defaulttheme.
-Draws MWindow BG and copies top background instead of several MWindow drawing calls.
-
-
-
-
-
-
-
-
-
-
-
-
-
-4/5/02
-
-Re-enabled configurable preloading in Quicktime since moov atoms larger
-than 2 M were setting the preload too high.
-
-Frame to field copies two fields into the output instead of line
-doubling one field.
-
-Tightened synchronization during recording startup.
-
-CWindow and VWindow timebars implemented.
-Timebars in CWindow and VWindow allow a region to be selected for
-previewing.
-
-Debugged configuration updates in Synthesizer and Parametric EQ.
-
-Extra redundancies in the jpeg library enabled to get IA-32 assembly
-working.
-
-Time average is absolute.
-
-Keybindings and icons for In/Out points changed.
-
-Bezier keyframes less than 10 frames apart don't freeze the CWindow.
-
-Clearing puts the cursor at the in point when using in/out points.
-
-Camera translation from the exact top of a frame to less than the full
-height really translates instead of squishing.
-
-Reenabled background_pixmap in TrackCanvas to allow faster overlay drawing.
-
-Loading non-XML files doesn't change the output width and height
-anymore. This allows VWindow to change sources without reverting the
-output size.
-
-Loop region loads right.
-
-Pan images aren't corrupted anymore.
-
-Clips created when no region is selected take the entire EDL now.
-
-Parametric EQ reenabled.
-
-Shared effects work again when deleted.
-
-Multiple effects per effect row load properly again.
-
-Jumping to next and prev label from CWindow doesn't lock up when playing back.
-
-Instead of synchronizing the absolute position of each fader, the gang
-option now changes the relative position of each fader.
-
-Slider tooltips always update before being shown instead of showing
-obsolete data.
-
-Got rid of next record label in RecordGUI. Labels set while recording
-are finally inserted in the timeline. The 'l' key triggers a label
-when recording.
-
-Busy wait removed from repeater finally.
-Prepared settings menu for addition of plugin editing option.
-
-Began first stage of Microsoft AVI importer for Quicktime.
-
-
-
-
-
-
-4/19/02
-
-AVI decoding of official Microsoft MPEG-4 and mp3.
-Second debugging pass for BC_Repeater.
-23.976 framerate put in place of 24.976 framerate.
-Synthesizer locks up less.
-Libmpeg3 needs only 1 include path instead of 5000.
-MPEG audio decoding 75% reimplemented for use in Quicktime.
-AC3 reimplemented using liba52.
-The mpeg3_layer_t structure handles mp2 and mp3 decoding separate
-from libmpeg3 on a frame basis.
-The mpeg3_ac3_t structure handles ac3 decoding on a frame basis.
-The mpeg3_pcm_t handles pcm decoding. PCM is repacketized by the demuxer.
-
-Zoombar clamps more selection values.
-
-
-
-
-
-
-5/3/02
-
-Microsoft MPEG-4 and MP3 encoding in Quicktime, AVI edition.
- 100% Readable by Cinelerra and Xine but not by Microsoft.
- Either audio or video plays back in Windows but not both.
-Several Quicktime frame rates changed to double.
-CWindow scrollbars updated on startup.
-Another pass through scrollbar appearance.
-New option to make effects follow edits.
-Preview range updated more often in CWindow.
-Another pass through listbox appearance.
-Track cursor redrawn more frequently.
-XMovie merged with new theme.
-MPEG audio debugging pass 1.
-Got rid of AVIFile and obsolete ffmpeg copy.
-
-
-
-
-
-
-
-
-
-
-
-5/10/02
-
-Better handling of non-existent files in edit lists and renderfarms.
-Hopefully better reporting of errors with the renderfarm.
-Debugged percentage seeking in mpeg3audio.
-Vorbis rc3 doesn't encode without crashing. Downgraded to vorbis rc2.
-JPEG exporting in AVI.
-More codec checking in AVI and Quicktime export.
-Paste assets from AWindow doesn't lock up as much.
-Faders not visible in the patchbay should now be gangable.
-Debugged YUV compositing algorithms.
-New RGBA -> YUV 16 bit conversions.
-Selecting labels during playback in CWindow doesn't lock up.
-Rewind and end in CWindow and VWindow do something again.
-Playing from the VWindow after loading from XML doesn't crash as much.
-Localsession needs to initialize everything in its constructor.
-Paste from one samplerate to another isn't corrupted as much. Samplerate conversion in paste_edls.
-
-MICROSOFT mouse wheel adjusts all scrollbars, sliders, pots, and
-tumblers, perfect for fine adjustments and zooming. In CWindow and
-VWindow it performs frame advance.
-
-Mix2000 update for mouse wheel.
-
-
-
-
-
-5/17/02
-
-Pulling the official MICROSOFT mouse wheel back zooms out the CWindow
-when using the zoom tool.
-
-Brought back the last reflection level in Heroine College Concert Hall
-since backwards reverb seems to be popular.
-
-Paste automation resampling implemented.
-
-Splice and overwrite debugged. Paste_edls doesn't change the VWindow
-source during splice and overwrite. Splice inserts before the in_point
-and ignores the out_point. Overwrite erases between in_point and
-out_point.
-
-Dragging asset into VWindow updates the timebar.
-
-Shifting effect handles works better. Disabled checks not important to
-effects.
-
-TIFF and TGA I/O with image sequences.
-
-Reenabled alpha blending.
-
-Got rid of row_table[i] reference in cmodel_permutation output subscript.
-
-Decompression of YUV 4:4:4 JPEG.
-
-
-
-
-
-
-
-6/10/02
-
-New option to disable thumbnails in AWindow.
-Shift right handle out doesn't shift keyframes before it.
-Waveform drawn more often after undo load.
-Confirmation box for quit.
-Quit really quits instead of crashing and looking like it quit.
-MP3 decoding hacks to skip JPEG images without parsing ID3 tags.
-Changing track titles redraws overlays.
-Window is renamed after replacing project.
-
-Shrank threshold in equivalency tests. It was catching the wrong
-in/out points.
-
-Made FloatAutos store bezier curve information.
-
-Got rid of full duplex record options. Since modern sound drivers
-allow single devices to be opened twice this is more easily done by
-starting playback on the timeline manually when recording.
-
-Plugin titles updated when track titles change.
-Create clip with just in or out point creates something of positive length.
-Create clip with no in or out point takes the entire length in VWindow.
-Labels enabled in VWindow.
-Overwrite doesn't shift effects or labels.
-Overwrite overwrites the region between in and out of in and out are different
-but overwrites its own length if in and out are identical.
-
-Shifting out point in doesn't delete transitions.
-
-Paste should extend effects when the clipboard has no effects and should
-overwrite effects when the clipboard has effects.
-
-Labels are undone during undo after paste.
-Video tracks are added to the top of the stack while audio tracks are added
-to the bottom of the stack.
-
-Dragging an effect from one track to a zero length track retains the length
-of the effect instead of crashing.
-
-Dragging an effect from the Resource Window onto a zero length track doesn't
-insert the effect on the track.
-
-
-
-
-
-
-
-6/14/02
-
-Bilinear interpolation from Broadcast 2000 migrated over. This
-averaged more pixels than the standard bilinear interpolation we
-upgraded to in 2000.
-
-Mutual exclusion lock for liba52 since liba52 can't run two frame
-decodes simultaneously.
-
-Removed double lock from Heroine College Concert Hall.
-
-Correctly detects playable tracks more often.
-
-Bezier curves for fade and zoom.
-
-64 bit mpeg file support. XMovie plays 64 bit mpeg files.
-
-Variable channel numbers work finally. Audio pans adjust when channel
-count changes.
-
-DV encoding in color works slightly better but still corrupted on the
-right side. The libdv upgrade can't decode of course.
-
-After assessing levels of interest, marketing direction, and
-experiencing a CVS erasing filesystem crash we moved forward on the
-folding of all code into a single repository. Moved quicktime,
-libmpeg3, xmovie, mix2000, and 2 mpeg multiplexing tools into the
-cinelerra tree and renamed the one gigantic tree hvirtual. The upside
-is Cinelerra compilation only requires exporting CFLAGS instead of
-hunting down 5 packages and exporting CFLAGS. The downside is the one
-guy who uses Quicktime has to download a bigger package through his
-bankrupt ISP's refurbished 1998 reissued cable modem.
-
-Mind you everything except cinelerra and plugins will remain
-independant of each other.
-
-While it may work for servers ext3 isn't suitable for desktops which
-are constantly shut down and restarted.
-
-
-
-6/21/02
-
-DV decoder 0.9.5 migrated. Not tested for error resilience yet.
-Made to_clip not copy all to the temporary clipboard so it wouldn't
-copy the child EDL's.
-Sort items put in AssetPopup.
-Plugin titles don't extend beyond background.
-Menus reposition when the window is repositioned.
-Default window positions is more accurate.
-Despike migrated to interpolated keyframes.
-Level window resets with everything else.
-Fixed detection of playable tracks error that was introduced with bezier faders.
-More often plays full audio track instead of truncating it.
-MPEG decoder supports XVideo better.
-Going to next and previous label with scrolling refreshes the compositor.
-Drawing of highlight box when dragging over the timeline is more accurate.
-Dragging one keyframe beyond another deletes the keyframe like it should.
-Bezier keyframes may work better than before.
-
-tracks->get_total_length considers keyframe length as well as edit
-length. This allows keyframe undo for regions where no edits exist.
-
-Update undo routines can be called recursively without corrupting the
-undo table.
-Undoing and redoing keyframe adjustments works better.
-
-Bilinear reduction with alpha channels fixed.
-
-Memory leak removed from Quicktime udta.
-Kludge for 88200 samplerate in Quicktime. Not tested.
-
-
-
-
-
-
-
-
-
-7/12/02
-
-Sharpen GUI synchronized to keyframes.
-Flip video.
-Freezeframe.
-Freeverb.
-Shift interlace.
-AWindow scrollbars calculated more accurately.
-Attach when effect is already in slot lets you change the effect.
-Faders and effect GUI's track playback.
-More frequent updating of patchbay when scrubbing.
-Pan automation works.
-Raw PCM export supports endian changes.
-All assets are saved during Save File.
-Keyframing right curves for projector zoom.
-All paste_edl operations copy all the assets.
-Camera zoom and projector zoom keyframes are properly generated from CWindow.
-Better bezier keyframe drawing in CWindow.
-Default window positions work in KDE, Gnome, and fvwm.
-
-Can grab control points in CWindow more easily if they're both against
-the left side.
-
-Large amout of unused Broadcast 2000 code removed.
-RecordGUI uses EDL aspect ratio.
-
-Grabbing control points in CWindow works better.
-Different colors for curves.
-Frame advance reverse plays the last frame in the timeline properly.
-Single frame record.
-Rendered effects handle transitions.
-
-Fewer crashes when hiding and showing effects during playback.
-More macros for plugins.
-Ganged faders are unaffected with record off.
-
-Pasting shared effects to different tracks than they were copied from
-doesn't crash but shared effect resolution will be broken.
-
-Shift key snaps curve values when dragging curves.
-
-Documentation buildout.
-
-Creating a clip in the VWindow doesn't automatically set the VWindow to
-the new clip.
-
-Changing asset sample rate works again.
-List boxes updated in AWindow after changing mode.
-Interface preferences have options for trimming.
-
-Copy added to CWindow buttons. Cut removed from VWindow buttons.
-Copying always takes session parameters, so it works in VWindow instead
-of crashing.
-
-Audio module fragment reduced to support Linux 2.4.18. Maximum DMA
-allocation is no longer supported in 2.4.18 so audio fragments must be
-kept below 4096.
-
-Units in freeverb changed to DB.
-
-
-
-
-
-
-
-
-
-
-7/19/02
-
-libmjpeg works on dual CPU systems finally. Mutually excludes
-allocate_temps. MJPEG files should crash less often.
-
-Start playback after editing doesn't have noise. Denoise mutes first window.
-
-Clear plugin GUI after attach changes it to a different plugin.
-
-DV capture migrated to Linux 2.4.18.
-
-Freezeframe works better.
-
-Concatenate tracks works more often.
-
-When dragging effects, the effect can be positioned at the start of an
-edit or at the start of a track instead of just at the start of a
-track.
-
-More accurate drawing of highlighting.
-
-ALSA driver migrated to Linux 2.4.18, alsa-0.9.0rc2.
-
-Render realtime affect doesn't crash when bringing up GUI.
-Plugin initialization takes proper buffer size.
-Resource Window starts up with nothing highlighted.
-Textboxes don't update contents if the contents are identical.
-Textboxes allow entry and have normal cursor behavior during playback.
-
-Loading with insertion modes that don't replace the project doesn't
-change the project filename.
-
-Curves aren't affected by the cursor when the track isn't armed.
-Tooltips deleted when widgets are deleted.
-start_realtime and stop_realtime removed from plugin interface.
-Memory leaks due to plugins not deleting data reduced.
-
-Must use -O3 because optimization errors prevent video from playing with -O2.
-
-Labels in CWindow don't vanish after resize to fullscreen.
-Undo for transitions.
-
-Better recording from DV camcorders.
-
-
-
-
-
-
-
-
-
-7/26/02
-
-FFT based denoiser.
-Ogg Vorbis support.
-Interpolate effect interpolates the start and end sample of a selection.
-Quicktime ported to Vorbis 1.0
-Undo detach transition.
-Fade should cut out at INFINITYGAIN.
-More accurate waveform drawing of sound files.
-Dragging end of an edit in doesn't clear the first keyframe of the next edit.
-Dragging end of an edit out shifts keyframes with it.
-AgingTV debugged.
-Changing sample rate of asset has an effect on played output.
-Reset camera and projector once again resets the zoom curve.
-U and u key for default transition. Default transition menu item.
-VWindow remembers labels and in/out points.
-Labels updated in CWindow after undo.
-More intuitive centering on cursor after zooming.
-
-
-
-
-
-
-7/29/02
-16 bit color supported again.
-Apply button in format settings.
-Fewer crashes when toggling play and mute patches during playback.
-More locking when record updates the GUI.
-Better floating point comparison for setting labels.
-More intuitive scrollbar behavior for timeline.
-Level window updates when meter range changes.
-Waveforms drawn after window expansion.
-Background for RecordGUI.
-Preview size adjusted after in/out point dragging and silence pasting.
-More robust handling of Freetype failures in titler.
-Private font directory for titler. Should ease renderfarm administration.
-AWindow background title updated more often.
-Drop shadow in titler.
-Compositor overlays translated more accurately when scrollbars are gone.
-Better handling of scrollbar and tumbler repeating after mousewheel is used.
-Creating a new project removes the clip reference from VWindow instead of making it crash.
-Project deletion operations while CWindow or VWindow is playing crash less often.
-Overlay modes ported to YUV colormodels.
-8 bit RGB -> 16 bit YUV importing.
-RGB601 refurbished.
-Pots debugged. They might change value with cursor keys now.
-Bilinear scaling has better clipping for fewer crashes.
-
-
-
-
-
-
-
-
-
-
-
-8/2/02
-Titler crash with drop shadow fixed.
-Titler looping.
-Render uses in/out points if they exist.
-More accurate edges in bilinear scaling.
-Playback termination memory leak removed.
-Module calls render_stop before deleting the attachmentpoint.
-Render farm crash fixed.
-More often terminates recording when no firewire device exists instead
-of just freezing up.
-Titler doesn't interpolate any parameters.
-Old references to real_transition removed from virtual console.
-Source position in plugin client made relative to start of track.
-
-
-
-
-
-
-
-
-8/19/02
-Titler fonts installed by rpm.
-XMovie decodes ac3 according to redesigned liba52 channel mappings.
-Quicktime MPEG4 parameters debugged.
-Gradient effect.
-Background rendering over a renderfarm.
-Renderfarm clients automatically reduced to idle priority.
-Better MJPA decoding on single processors.
-Better title functionality in 16 bit colormodels.
-Undo for effect keyframes.
-Effect GUI's cleared during undo for effect attachment.
-Fewer lockups on startup.
-Proper keyframe interpolation in scale effect.
-Stamp timecode in titler.
-Memory leak in rendering stages removed.
-Removed legacy plugin server code.
-Downsample video resolution.
-Option to generate sequence header in every GOP for MPEG2.
-LADSPA support.
-Listbox doesn't enter drag_icon state when dragging column division.
-Radial, linear, and zoom blur.
-Effect rendering bug fixed.
-64 bit mpeg transport stream seeking beyond 2 gigs.
-More accurate mask drawing when projector is zoomed.
-Clear labels updates CWindow
-More accurate YUV/RGB conversions.
-Histogram.
-Perspective.
-Import partial tga's
-Copy keyframes doesn't copy default keyframe.
-Track highlighting offset by vertical scroll.
-Multiple video scope, spectrogram, and histogram displays may be opened.
-HutSaturation in YUV colorspaces.
-Undo for masks.
-
-
-
-
-10/13/02
-Interpolation of gradient keyframes
-libmpeg3 handles case where audio channel count increases in the middle of the stream
-Zoom bar redrawn more accurately when time format changes.
-More reliable quit of render nodes when master node crashes.
-Render doesn't reset brender to 0.
-Play keyframes discontinued.
-Deleting media from middle of track and pasting to end plays back.
-Persistent frame rate statistics stored in render farm.
-Flash transition.
-Undo for in and out points.
-
-
-
-10/19/02
-sync_parameters for splice, drag assets on CWindow.
-Change asset path updates brender and index file status.
-Transition drop on CWindow.
-Changing video play patch doesn't freeze brender permanently.
-Swap channels generates correct output.
-Shared synthesis effects cause the sharing tracks to
-play back instead of just the owning track.
-Quicktime recovery utility improved.
-Memory leaks in FileVorbis::check_sig and AssetPicon::create_objects removed.
- - Remove asset from disk removes it more often.
-AttachmentPoint::~AttachmentPoint deletes plugin servers.
- - For some reason they were originally deleted in render_stop but render_stop
- was commented out of Module::~Module.
-Drag scroll working for region selections.
-Single frame recording with multiple batches doesn't crash.
-Sound Level
-DV encoding with proper color conversion.
-
-
-
-
-
-
-
-
-11/08/02
-
-More options for the ffmpeg/MPEG-4 codecs.
-Histogram works on SMP.
-Proper 16 bit alpha blending.
-BRender path updates from preferences.
-Separate preroll for background rendering and rendering.
-Deinterlace by averaging lines 0 and 2 or 1 and 3 to get intervening lines.
-Adaptive deinterlace.
-Frame per second statistics in renderfarm are more reliable.
-Select and slide in the patchbay.
-Video scope can be resized.
-Effect keyframes pasted in right positions.
-Selective denoising of video based on color channel.
-
-
-
-1/12/03
-
-More mouse wheel bindings in MainWindow and ListBox.
-Ctrl-w closes effect windows.
-Perspective doesn't crash when switching from stretch to sheer.
-Better text list searching and keyboard navigation.
-Better Vorbis decoding.
-
-
-
-2/10/03
-
-Close recording without recording anything doesn't crash.
-Save backup now option.
-OpenGL not required anymore.
-Time format changes update the selection textboxes more often.
-MPEG-4 deblocking option in XMovie.
-Resize in Record GUI.
-Export of YUVA16161616 to Component Y'CbCr 10-bit 4:4:4.
-Import of Component Y'CbCr 10-bit 4:4:4 to RGB colorspaces.
-
-
-
-
-
-
-
-
-
-2/14/03
-
-
-Create fade keyframe inadverdently drags bezier handle less often.
-Float autos don't draw on right edge of timeline when keyframes are beyond right edge.
-Better float auto creation.
-Add track anywhere in timeline through track popup.
-Shared track references are automatically reconfigured after deleting or adding tracks.
-Libmpeg3: Better decoding of field-based MPEG video.
-Channels can be moved up or down in the Channel picker properly.
-Better handling of the long delay in deleting files without overflowing the recording buffers.
-Deinterlace really swaps fields instead of just saying it.
-Two line swapping combinations in deinterlace.
-Better listbox row sizing.
-Downsample offset.
-Faster window creation.
-Splash screen while you wait for it to start up.
-File deletion occurs before opening the driver instead of
- after opening the driver for recording.
-Changing sample rate of WAV file in Asset window works.
-JPEG stills get saved with proper dimensions.
-Migrated to RedHat 8.0.
- - e2fsprogs-devel is needed to compile the background render object.
-Fewer crashes due to OpenDivx global variables getting overwritten.
-Paste silence and clipboards also shifts effect keyframes properly.
-More checks for circular references in shared effects and shared tracks.
-Tracking during audio playback without video doesn't run past edge of loop boundaries.
-Better keyframing in Titler.
-Multiple language encodings in Titler.
-Undo of replace project after an effect works.
-Frame -> field conversion does line averaging and pixel shifting.
-Field -> frame conversion uses pixel shifting.
-Negative cursor selection is frame aligned.
-Documentation on video cleaning and deinterlacing tools.
-Buttons repositioned properly when filebox is resized vertically.
-Fade automation is more accurate.
-CWindow and VWindow slider position is less erratic after the window is resized.
-Timebars with regions track the playback position.
-More workarounds for buz driver lockups.
-Dragging the cursor on the timebar off the edges scrolls the timeline.
-IVTC uses luminance only in YUV colorspaces to improve accuracy.
-Quicktime: Tighter audio synchronization when encoding Quicktime with Vorbis audio.
-Start of audio effects is more accurate.
-Better IEEE1394 playback of video only.
-More IEEE1394 playback options.
-
-
-
-
-
-
-
-A lot of patches were rejected. Some were accepted. Most of these
-coding practices were done in 1997 but abandonned later because of high
-maintenance. To save code size, the memory leak checker shouldn't flag
-single allocations as leaks and static pointers shouldn't be
-explicitely deleted on exit.
-
-
-titler-charsets.diff
-
-merged.
-
-
-cinelerra-loop-patch*
-
-The bugs in loops and audio positioning were fixed another way.
-
-
-cursor-patch.diff
-
-Too much maintenance in function indirection with no effect.
-
-Explicit declaration of the movement distance requires too much
-maintenance. The move commands were separated for scalability reasons.
-
-
-
-mempatch-2.diff
-
-
-Units::topower was already static. Patch has no effect and requires
-too much maintenance.
-
-
-mempatch-3.diff:
-
-DefaultTheme is intended to be replaced by a subclass of BC_Theme and
-use BC_Theme for all memory management. No expansion of this file is
-maintainable.
-
-ArrayList::aray_delete was merged.
-
-Changes to BC_Meter, BC_Resources require too much maintainence and
-have no effect.
-
-static variables in BC_WindowBase prevent different windows in the same
-application from having different fonts.
-
-Deletion of pointers in AWindow, CWindow, VWindow, MWindow requires too
-much maintenance.
-
-Buttons in AWindow may be used in the future and should not be deleted.
-
-Buttons in editpanel may be used in the future and should not be deleted.
-
-Selections were replaced by masks. Deleted from VTrack.
-
-
-
-
-
-
-
-mempatch-5.diff
-
-BC_NewFolderThread expansion done differently.
-BC_FileBox widget deletion already done by BC_WindowBase. Too much code for no effect.
-BC_ProgressBar::~BC_ProgressBar() implemented.
-BC_Resources changes have no effect.
-It's already a static object and if the images were overridden, their BC_Theme class would delete the lists.
-BC_WindowBase changes were preemptively rejected.
-Canvas::~Canvas merged.
-CPanel::~CPanel already done by BC_WindowBase. Too much code.
-CWindowGUI::~CWindowGUI mostly done by BC_WindowBase.
-MeterPanel::~MeterPanel merged
-Module::create_new_attachments merged
-StatusBar::~StatusBar already done by BC_SubWindow.
-theme.C too much code.
-VirtualConsole::~VirtualConsole introduced too many bugs.
-ZoomBar::~ZoomBar partially merged. Mostly done by BC_SubWindow.
-DefaultTheme::DeleteVFrames is done by BC_Theme.
-title.C fonts is a static variable because it shouldn't be deleted.
-
-
-
-
-mempatch-6.diff
-BC_FileBox done differently. Lock_window is normally used when updating a GUI from a thread.
-
-mempatch-7.diff
-VirtualConsole refurbishment was handled differently.
-
-filevorbis.C asymetric fclose patch applied.
-
-
-
-
-
-
-
-mempatch-9.diff
-
-MWindow::load_filenames memory management applied.
-Rest has no effect.
-
-mempatch-10.diff
-
-decode_lock is static because it shouldn't be deleted.
-Rest has no effect.
-
-
-
-
-
-
-
-
-
-
-
-
-5/16/03
-
-Audio and video playback through firewire. Can't get a playable
-audio stream for the camcorder in realtime but the interface is there.
-
-Quicktime: Libraw1394 and grabbing removed. Didn't serve any purpose
-since playback requires a completely different mechanism than record.
-
-Quicktime, XMovie, Cinelerra: ffmpeg decoder used in MPEG-4. This
-gives slightly faster playback but is lousy at seeking.
-
-More file writing recovery from crashes.
-
-Cinelerra: Module dereferences renderengine less often in nonrealtime
-effects where renderengine is 0.
-
-Quicktime: Importing of dvgrab and lavtools AVI files.
-Cinelerra: Hitting space rapidly doesn't lock up recording as much.
-Cinelerra: Resize Render effect window.
-Cinelerra: Changing parameters for PCM file works more often.
-
-Cinelerra: tiff upgraded to 3.1.7
-Firehose: Fixed bug in firehose reciever.
-Cinelerra: Virtual file system for renderfarm.
- - The filesystem prefix for rendering nodes was decidedly useless so it was
-discontinued.
-Cinelerra: Time stretch based on overlapping windows instead of FFT.
-Cinelerra: Freeze frame has line doubling option.
-
-Integrated mpeg2enc, toolame, lame encoding as libraries.
-Toolame refurbishment:
- - converted exit to return in main.
- - put prototypes in filempeg.h
- - created input buffer management.
- - forced stdin at all times
- - created error and eof variables.
- - freq2bark -> toolame_freq2bark
-mpeg2enc symbol conflicts:
- - putbits -> mpeg2enc_putbits
- - SmpFrqIndex -> toolame_SmpFrqIndex
- - BitrateIndex -> toolame_BitrateIndex
-
-edit and effect titles stay visible at all times. We'll see how long
-this lasts.
-
-long replaced with int64 wherever possible. After many years of
-assuming long would automatically scale to whatever it was compiled on,
-it appears more of a pain than a scalability point in matters of
-function overloading.
-
-Default configuration should run on stock Redhat 9.0 system.
-
-
-
-Patches:
-loop-crush.diff applied
-exit-crush.diff too much code for no effect
-splash-leak.diff applied
-overlay-speedup.diff applied
-overlay-speedup2.diff applied
-titler-stroke.diff
-titler-stroke2.diff applied but disabled due to SMP crash. (crush)
- Added Outline style and tumbler.
- Reduced number of exits due to bounds checking errors.
-
-
-quicktime_leak.diff applied
-small-clean2.diff file may be closed and reopened without calling destructor.
-
-patchbay_free.diff applied but the real problem was PatchBay::update()
- dereferenced non-existent tracks to get the ID.
-
-
-perspective_alpha_stretch.diff applied
-virtualconsole_leak.diff applied but the default destructors seem to be
- getting called.
-dvlib_bug_workaround.diff applied
-debian_new_dvlib_compile.diff applied
-
-multihead_compositor-1.1.5.diff rejected The X11 parameter in Playback
-preferences is the compositor display.
-
-filexml.diff applied
-paste-outpoints.diff needs testing
-
-paste-outpoints.diff rejected. Broke other paste behavior. The paste
-behavior is not a uniform case but the result of trying behaviors on a
-case by case basis and deciding which behavior is the most convenient.
-Most of the time what's convenient is not the most scientific.
-
-
-
-
-
-
-
+++ /dev/null
-Audio and video playback through firewire. Can't get a playable
-audio stream for the camcorder in realtime but the interface is there.
-
-Quicktime: Libraw1394 and grabbing interface removed. Didn't serve any
-purpose since playback requires a completely different mechanism than
-record.
-
-Quicktime, XMovie, Cinelerra: ffmpeg decoder used in MPEG-4. This
-gives slightly faster playback but is lousy at seeking.
-
-More file writing recovery from crashes.
-
-Cinelerra: Module dereferences renderengine less often in nonrealtime
-effects where renderengine is 0.
-
-Quicktime: Importing of dvgrab and lavtools AVI files.
-Cinelerra: Hitting space rapidly doesn't lock up recording as much.
-Cinelerra: Resize Render effect window.
-Cinelerra: Changing parameters for PCM file works more often.
-
-Cinelerra: tiff upgraded to 3.1.7
-Firehose: Fixed bug in firehose reciever.
-Cinelerra: Virtual file system for renderfarm.
- - The filesystem prefix for rendering nodes was decidedly useless so it was
-discontinued.
-Cinelerra: Time stretch based on overlapping windows instead of FFT.
-Cinelerra: Freeze frame has line doubling option.
-
-Integrated mpeg2enc, toolame, lame encoding as libraries.
-Toolame refurbishment:
- - converted exit to return in main.
- - put prototypes in filempeg.h
- - created input buffer management.
- - forced stdin at all times
- - created error and eof variables.
- - freq2bark -> toolame_freq2bark
-mpeg2enc symbol conflicts:
- - putbits -> mpeg2enc_putbits
- - SmpFrqIndex -> toolame_SmpFrqIndex
- - BitrateIndex -> toolame_BitrateIndex
-
-edit and effect titles stay visible at all times. We'll see how long
-this lasts.
-
-long replaced with int64 wherever possible. After many years of
-assuming long would automatically scale to whatever it was compiled on,
-it appears more of a pain than a scalability point in matters of
-function overloading.
-
-Default configuration should run on stock Redhat 9.0 system.
-
-
-
-Patches:
-loop-crush.diff applied
-exit-crush.diff too much code for no effect
-splash-leak.diff applied
-overlay-speedup.diff applied
-overlay-speedup2.diff applied
-titler-stroke.diff
-titler-stroke2.diff applied but disabled due to SMP crash. (crush)
- Added Outline style and tumbler.
- Reduced number of exits due to bounds checking errors.
-
-
-quicktime_leak.diff applied
-small-clean2.diff file may be closed and reopened without calling destructor.
-
-patchbay_free.diff applied but the real problem was PatchBay::update()
- dereferenced non-existent tracks to get the ID.
-
-
-perspective_alpha_stretch.diff applied
-virtualconsole_leak.diff applied but the default destructors seem to be
- getting called.
-dvlib_bug_workaround.diff applied
-debian_new_dvlib_compile.diff applied
-
-multihead_compositor-1.1.5.diff rejected The X11 parameter in Playback
-preferences is the compositor display.
-
-filexml.diff applied
-paste-outpoints.diff needs testing
-
-paste-outpoints.diff rejected. Broke other paste behavior. The paste
-behavior is not a uniform case but the result of trying behaviors on a
-case by case basis and deciding which behavior is the most convenient.
-Most of the time what's convenient is not the most scientific.
-
-
-
-
-
-
-
-
-Brief:
-
-
-Improved playback through firewire. Importing of dvgrab and lavtools
-AVI files. Changing parameters for PCM works more often. Virtual file
-system for renderfarm. Time stretch based on overlapping windows
-instead of FFT. Integrated mpeg2enc, toolame, lame encoding as
-libraries. Default configuration should run on stock Redhat 9.0 system.
-
-
-
-
-
+++ /dev/null
-Date, Size, Path sorting in file boxes.
-
-libsndfile upgraded
- - libsndfile.diff applied
- - Debugged libsndfile patches.
- - Modified libsndfile to support VFS
-MJPEG software encoding debug on AVI and Quicktime.
-Better drawing of highly oversampled waves.
-Better rendering of MPEG video where the framerate is oversampled.
-Overlay mode displayed as icon.
-Date, Size, Path sorting in file boxes.
-Track nudge.
-Tool tips for nudge, pan, overlay mode.
-Context menu for seconds or samples/frames for nudge
-Better handling of mpeg table of contents files with relative paths.
-MPEG-4 decoding starts on right frame more often.
-Cursors deactivate when window not focused
-Pan positions load properly.
-Short audio clips play in their entirety.
-Text conforming in time textboxes.
-Troubleshooting guide for recording slow framerates.
-Crash when cancelling some Vorbis Quicktime rendering fixed.
-Better synchronization for fixed bitrate Vorbis Quicktime movies.
-Home and End keys go to start and end of timeline.
-Patternless Inverse Telecine.
-Better drag select behavior for patches.
-Single confirmation dialog instead of multiple dialogs for file overwrites.
-Batch rendering.
-Force single processor is a preferences option not an EDL parameter.
-Simple lock debugging and tracing.
-ESound migrated to new GCC syntax.
-Video In transport control removed due to lockups. Should be a remote control there.
-DV1394 implemented as new driver.
-Titler: More redundancy when scanning font dir.
-Tracking::stop_playback stops the thread entirely instead of capturing loop_lock.
- - In the NPTL, a mutex can't be locked unless the other user delays
- between unlocking and locking.
- - In the NPTL, cancelling a select operation crashes.
-libmpeg3: seek_percentage replaced by seek_byte
- mpeg3_previous_frame really gets previous frame
- more accurate decoding of start of video
- faster seeking
-xmovie: previous frame really gets previous frame in MPEG 1&2
- Quit during playback -> fewer crashes
- Workaround for NPTL cancel.
- MMX disabled due to compiler changes.
-quicktime: ffmpeg upgraded to 0.4.8
-Configure script implemented to error out in an unsuitable build environment.
-Foreign languages implemented but disabled due to new bugs.
-Buz recording migrated to 2.4.22.
-Assorted locks migrated to NPTL.
-Boundary tests in EDL::load_xml.
-
-
-Jens Seidel:
-German translation
-
-
-
-
-
-Andraz Tori:
-
-Slovanian translation
-
-Fixed crash when slave plugin extended past master plugin with no asset
-in track.
-
-bcsignal_new_delete.diff - the meters need to have separations at 5 and
-20, not 1/6 and 2/5.
-
-bcmeter_illegal_access.diff - this function shouldn't copy the string
-at all.
-
-
-overlay-speedup3.diff applied
-
-overlay-speedup4.diff rejected
- - pixel_transparency is still taken from the alpha of the pixel, which is 0 - max.
- Bit shifting reduces the result by 1.
-
-imagesequence.patch applied
-
-framecache1.diff rejected
- - The cache explodes when handling HDTV. Can't use it until you've
- finished the options in preferences and the absolute size.
-
-close_window.diff rejected
- - too much work for something that a set_done call would do.
-
-quicktime debug
-
-
-
+++ /dev/null
-Command line option for alternate configure file.
-Pinch works if whirl is zero.
-Push method replaced by pull method in virtual console.
- - less memory
- - realtime time domain effects possible
- - no distinction between amount to read from disk and amount to send through console
-Popup menu instead of text entry for playback fragment size.
-Video decimation
-Parametric EQ, pitch shift, time stretch have no delay.
-Synchronized start of video and audio playback.
-Controls can be hidden from compositor.
-Mov not improperly detected as OGG Vorbis
- - ov_open result also needs testing against first 8 bytes
-Fixed histogram crashes due to not all LoadClients being called.
-Attach button attaches shared effects properly.
-Automatic filename generation doesn't change directory.
-Nudge values updated when project rates change.
-Background rendering detects nudge change.
-Loading an EDL with the CWindow tool followed by loading an EDL without
- the CWindow tool crashes less.
-PCM format configuration more reliable.
-Freeze frame freezes on the exact frame the effect starts
- or on the latest keyframe.
-Better alignment of fade out in Titler.
-Better text entry in titler.
-Video overlay effect.
-Realtime reverse video and audio.
-Loop audio and video effects.
-Colorbalance tabulation doesn't leave last entry empty
-Zoom menu goes towards center instead of top left of compositor.
-Middle mouse button scrolling works when compositor output is smaller than canvas.
-Aspect ratio saved in mpeg video.
-Default keyframe position stays at 0 after shifting effect right then left.
-Batch render from command line without GUI.
-Titler reverted to old freetype API.
- - 400 less lines of code and better vertical alignment.
- - the "stroker" outline looked terrible. Outlines need to be done with a real
- outline filter.
-Rendering load balancing tests for infinite frame rate.
-Frame -> fields optimized for pull console.
-Fields -> frame converted to realtime.
-Bounds checking in crop entry point.
-Memory debug system.
-An optimization error in GCC 3.3.2 causes RGB16 colormodels to crash.
-Easier changing of the nudge parameters during playback.
-
-quicktime: Memory leak in raw.c with temp_rows removed.
- RLE decoding
-
-libmpeg3: multiple title stream handling and table of contents moved to
-absolute offsets
-- mpeg3toc takes -a to limit the number of audio streams scanned.
-
-
-
-
-
-Andraz Tori:
-
-locale.diff more language bindings
- applied
-bctheme_memfix.diff different arraylist handling
- applied
-cinelerra-gettext-6.diff more language bindings
- applied
-sharpen.diff engine debug
- applied
-buttons.diff + buttons_pngs.tar.gz 3 segment replacement for text
- rejected.
- Why don't you add support for picons in generic buttons
- instead of requiring different 3segment bitmaps.
- Set real x and y in the initialize() instead of guessing in the constructor.
-canvas_cache2.diff picon and rendering cache with preferences rejected.
- Make File work without *preferences.
- Caching picons should only involve FrameCache and ResourcePixmap.
- Picon caching is good. Playback caching is too slow.
- Either require a total cache bytes or a total cache items but not both.
-libdv yuv->rgb conversion used again.
-version_define.diff version macro renamed
- applied
-dv_in_32khz.diff 12 bit hack for 1394
- applied
-alsa_fix.diff ALSA API change
- applied
-crop_crush.diff new crop interface
- Partially applied. The corners shouldn't snap to the cursor.
-qt_mpeg_cleanup.diff:
- Partially applied. The temp rows are needed for packed colormodels.
-overlay-speedup5.diff TRANSFER_REPLACE overlay optimization:
- applied
-maskengine4* mask engine rewrite:
- rejected - not SMP compatible
-masks_fixes.diff new rerendering test + interpolation rewrite
- new rerendering test imported
- new interpolation rejected. This needs to be done with the existing API
- instead of an orthogonal one. Try confining it to CWindowGUI.
- Mask points need to interpolate in every
- previous and every next keyframe instead of just the previous.
-
-
-
-xml.diff different xml syntax
- rejected. These standards points are ignored in
- most every web page anyway, and Cinelerra exports aren't used by
- anything else.
-render.diff rendering hack
- rejected. Command line rendering should run without a GUI and do
- batches.
-
-
-
-
-french translation imported
-
-
-
-
-drag.diff different drag behavior
- rejected. Most people seem to want arbitary dropping with an
- option to paste to arbitrary positions.
-spanish translation imported
-
-
-
-
-newskin-cinelerra.diff - rejected. Move Cinelerra specific settings
-from BC_Resources to Theme. Put default values back in BC_Resources so
-it can be used by other applications. Need button picons instead of 3
-segment button. Make splash screen determined by a default field, set
-when the user sets a theme.
-
-
+++ /dev/null
-I/O subsystems partially migrated to 2.6.3
- - Video4Linux 2 JPEG capture
- - ALSA migrated to alsa-lib 1.0.2
-Fixed rounding error in conversion between requested position and
- project position in VModule::render
-Patchbay redrawn after rendering effect which adds tracks.
-Caching of picons and single frame playback.
-Caching based on total megabytes instead of total open files.
-Compression settings retained in batch render if the data type is not enabled.
-Batch render doesn't insert into project if an insertion strategy was selected in Render.
-More useful increments for compressed video bitrate and compressed audio bitrate.
-AC3 audio encoding.
-Key bindings for AVC transport.
-Realtime effect rendering debugged.
-Interpolate audio in realtime.
-Time based interpolate of video in realtime.
-
-Shift dragging floatautos snaps to closest neighboring value if adjoined
-by other autos.
-
-Quad CPU's debugged. FileThread now limits the ring buffer count to 2
-and expands the frame number count to match the CPU's.
-
-Temporary file deletion on crash.
-
-Nudge forces update of PARAMS instead of EDL for audio.
-
-Default render jobs increased
-
-Automatic disabling of realtime priority for nonroot.
-Deck control for DV camcorders.
-DV playback debugs.
-Histogram crashes fixed.
-Slide optimization.
-More locale debugging.
-Context sensitive menu for effect keyframes.
-Double click on effect selects the region of the effect.
-Scrollbars in asset window improved.
-Drag and drop debugs.
-Optimizations in fade engine.
-Alignment buttons for camera and projector debugged.
-Fewer loopvideo crashes.
-Direct copy of more Quicktime DV files.
-Rounding changed to conform to PAL framerates.
-
-
-
-Quicktime:
- Decoding of compressed headers.
- Sorenson Video 1 & 3 playback supported through ffmpeg.
- mp4v decoding
-
-Mix2000: signal handling fixed again so defaults get saved during X
-server crashes.
-
-
+++ /dev/null
-Theme images stored as elf binaries instead of concatenated png files.
-Project filename restored from backups.
-Proper frame being read out of cache for frame advance.
-Automatically repositions when loading new file to top left of timeline.
-Presets in Set Format for quick reconfiguration.
-Transition lengths adjusted for frame rate changes.
-Keyframes for effects are hidden if edits are collapsed.
-
-Compressor works better. Readahead option removed. Delay removed.
-Setting reaction time negative provides readahead now. Also a
-smoothing only option renders the just loudness for academic uses.
-
-Realtime time stretch and reframe for video.
-Time average now supports accumulation and doesn't require reading ahead.
-
-ALSA buffer underruns handled better for 2.6.7.
-ALSA synchronization and interrupts handled better.
-32 bit option in ALSA.
-Backup fonts in case primary fonts don't exist.
-Sound levels over 0 DB show in meters with a new max level setting.
-DenoiseFFT debug
-
-New event propogation system should reduce the number of lockups due to
-repeat events.
-
-Faster meter responsiveness.
-
-Migrated to DV1394 version 2.6.7 for DV capture.
-Migrated the Video 4 Linux 2 JPEG driver to Video 4 Linux 2 JPEG version 2.6.7.
-Partially supported uncompressed Video 4 Linux 2 version 2.6.7 but need new frequency table.
-Linux 2.4 is depreciated.
-
-RGB floating point color space.
-RGB 16 removed.
-OpenEXR support
-Floating point TIFF.
-
-Higher precision in YUV/RGB conversions.
-Greyscale JPEGs imported properly.
-
-CD ripper accepts ending tracks higher than the total tracks. Put in
-100 for the ending track to get the entire disk.
-
-Race conditions in certain dialog box openings removed.
-
-
-Quicktime: faster writing since write buffer is disabled while writing
-data.
-Quicktime: floating point color conversions
-
-
-
-
+++ /dev/null
-Debugging for VFS in 64 bit mode
-Quicktime: quicktime_set_position without buffering sets the position
-Threshold effect.
-Unsharp mask effect.
-Debugging for image sequence rendering on renderfarms.
-Greyscale TIFF loading.
-Wheel mouse works over textbox for tumble textboxes.
-Rotation moved to the affine transform since trig transform seemed to have very
-slight errors.
-Writing floating point wav files doesn't clamp the sound level anymore.
-Writing and reading quicktime RGBA8888 works.
-Compression title in asset info displays readable info.
-Spherical gradient
-Motion and rotation tracking.
-Bilinear reduction banding error fixed.
-Realtime priority routines migrated to 2.6 kernels.
-Realtime priority now extends from the virtual console to the sound driver and is
-inherited by Thread objects from the parent thread.
-Rendering effects where the region contains a transition doesn't crash.
-Allow effect keyframe at end of effect.
-Video keyframes positioned more accurately at subframe zoom levels.
-Shift clicking a boundary of an effect causes the trim operation to
- change only the one effect.
-Interpolate video doesn't use the input frame rate when keyframes are used
- as the border frames.
-Status indicator on Compositor window shows when processing is occurring.
-Time can be displayed as seconds.
-On time bar, ctrl-middle button selects previous time format.
- Ctrl-left button selects next time format.
-AC3 file creation works better.
-X11 video doesn't blank out before playback.
-Tried disabling ALSA thread cancellation again due to continued crashes
-with this library.
-
-
-
+++ /dev/null
-H.264 Video, MPEG-4 Audio and Video encoding in Quicktime, compatible with Quicktime player.
- - The ffmpeg front end has been improved to where it generates useful quality.
- - Certain frame rates and compression options don't work in Win.
-
-Refurbished MPEG table of contents.
- - Tables of contents now detect changes in PID.
- - Tables of contents are created twice as fast.
- - Load any MPEG or IFO file with video in Cinelerra and a table of
- contents is automatically created.
- - Audio indexes are created simultaneously with MPEG tables of contents.
- - Still possible to create permanent tables of contents with mpeg3toc.
- - Using MPEG files in a renderfarm still requires mpeg3toc due to the fact that the
- automatic .toc files are hidden.
-
-Fewer lockups when resizing video window.
-Fewer crashes due to socket timeouts in background rendering.
-Directory search boxes only contain relevant information for directories.
-Hourglass displayed in main window during time consuming operations.
-Having shared effect off but sharing instance on doesn't create mono sound anymore.
-Tool options get closed when CWindow is closed.
-Picture settings retained after recording from V4L2. Workaround for V4L2 driver
- where 2 different picture settings must be uploaded.
-Bitrate displayed in asset info box.
-64 bit plugins are stored in /usr/lib64 so 64 bit executables can be run on the
- same systems as 32 bit executables without renaming the directory.
-Color picker in compositor window allows selecting colors from the output frame
- for use in effects.
-Refurbushed chroma key:
- - uses color cube instead of hue for color comparison
- - uses the color picker to select the color
-Support for raw digital camera importing.
- - Uses dcraw to decode the images into floating point RGB.
- - tested on Canon .cr2 and .tiff files.
- - Linearize effect is provided to convert gamma values.
-White balance function in colorbalance effect.
- - Select the grey color in the compositor window.
- - Hit the white balance button.
-
-YUV 16 bit colormodels have been depreciated. The only practical
-colormodels have been 8 bit and floating point. Even with raw sensor
-data, the precision needs to be higher to handle the gamma correction.
-
-Difference key using different tracks.
-Undo buffers use compression to reduce memory usage.
-Undo supports effect tweeks.
-Nudge textboxes are ganged.
-Mouse wheel changes nudge value.
-
-Holding CTRL when doing any playback operation causes the in/out points to be used
-for the playback range.
-
-Moved from the unified camera and projector keyframes to discrete x
-and y curves.
- - Z was already made discrete out of necessary utility.
- - Too much information was drawn on the Compositor window.
- - The timeline functionality is extended to better handle curves.
-
-Alt+up and Alt+down zoom the automation vertically.
-
-Dedicated window provided for selecting which automation overlays to show.
-
-The problem with virtual filesystem:
- - VFS was developed back when we wanted to use some high powered servers but
- didn't have root access to mount filesystems on them. That situation ended and
- it was taking an enourmous amount of effort to work VFS around the number of
- strange things libraries do like accessing megabytes using fgetc.
- VFS has now been phased out.
-
-Fixed lockups due to MWindow locking CWindow when MWindow was still locked.
-Fixed problems loading ulaw sound files.
-
-Tip of the day shown.
-Filebox supports deleting files and refreshing.
-Extra zoom levels added to Compositor window.
-
-Highlighted region overrides in/out points if it is nonzero length.
-
-Blond theme has not been updated. Instead it has been replaced by the
-SUV theme. The SUV theme is extremely manly and dark and should make
-the media stand out more.
-
-MPEG4 audio decodes on x86_64. Had to put stdint.h in faad.h and
-change all the unsigned long to uint32_t because those structures were
-redefined in structs.h with uint32_t.
-
-Channel changing for Video4Linux2 ported to kernel 2.6.7. Automatic
-channel scanning and sorting is supported for the 1 guy who still uses
-these cards.
-
-Pressing ALT while clicking in cropping window causes translation of
-all 4 cropping points.
-
-Rotation effect supports a variable pivot and drawing of the pivot in
-the frame.
-
-DV support migrated to latest API rewrite: libIEC61883
-
-MPEG video encoding provides a graphical interface for YUV 4:2:0
-encoding on the mjpegtools version of mpeg2enc.
-
-The audio playback options support a global offset for audio
-synchronization. This doesn't affect the audio playback or the
-rendering. It just compensates for inaccuracy in the Linux sound
-drivers.
-
-The ALSA options allow compensation for lockups at end of playback
-depending on the ALSA version, soundcard, and ALSA rewrite.
-
-Press Tab while the cursor is anywhere over a track to toggle the track
-arming status. Press Shift-Tab while the cursor is over a track to
-toggle the arming status of every other track.
-
-Resample effect changed to match the behavior of the Reframe effects.
-Scale factors > 1 shorten the length of the audio.
-
-
+++ /dev/null
-Overlay audio effect. Allows applying compression to the result of a
-6 -> 2 mixdown in realtime.
-
-Compressor can use sum of all channels in addition to highest channel
-and trigger.
-
-Channel position recall based on number of channels.
-
-Audio recording uses another layer of buffers to handle the extremely
-small ALSA buffers better.
-ALSA support migrated to version 1.0.11 and using the dynamic library since
-it is now installed by default.
-
-Faster entry into recording interface. Recording file format is now
-set in Preferences under Recording so the r key drops you straight into
-monitor mode.
-
-Live Audio effect, allowing processing of the soundcard's input through
-the timeline, in realtime.
- - effects requiring read ahead don't work
-
-Live Video effect for IEC61883 and uncompressed Video4Linux 2 devices.
- - With OpenGL, allows processing video input through the timeline in realtime.
- - Must configure video driver using Record interface first.
- - Uses record output file format to determine video path.
- - Can't be used simultaneously with Live Audio if both drivers use DV.
-
-Filename extension automatically changed when selecting file format.
-
-Toggles for effect on/show.
-
-Motion tracking controls width and height for the block and range
-instead of just size. Motion tracking takes the previous keyframe's x
-and y instead of interpolating them.
-
-Channel mapping for the AC3/A52 decoder is fixed for 5.1 channels.
-Liba52 outputs LFE, FL, C, FR, BL, BR but every other library expects
-C, FL, FR, BL, BR, LFE, which caused errors when the BR channel from
-liba52 was encoded straight through as LFE.
-
-2 presets for audio mixing positions. Map each track to a different
-channel and map 5.1 tracks to stereo.
-
-Preview region in VWindow and CWindow follows the timeline length more often.
-
-Background drawing of tracks for more responsiveness.
-
-Number of channels is no longer set in device configuration but totally
-dependant on project settings.
-
-Automatic cursor hiding when video is playing back.
-
-Fullscreen video in compositor window, recording monitor. Lots of new
-menu options in the compositor popup.
-
-A floating point boundary condition in Linearize was fixed, defeating
-the color glitches that would show up many steps later in floating
-point images.
-
-Smarter timebar drawing.
-
-Tabs instead of pulldown menu for changing preferences dialogs.
-
-Pulldown menu for automation zoom with most popular values.
-Keyframes->Straighten curves: straightens the bezier curves if more than one
-curve keyframe is in the highlighted area.
-
-W and H may be swapped by a single button in the project settings.
-
-Entire GOP's from compressed MPEG-4, H.264, and MPEG-2 video are
-cached during seeking, allowing faster reverse playback.
-
-Plugin dialog has a single OK button instead of 3 attach buttons.
-
-Option to match project frame rate in asset popup.
-Asset info gives bitrate of actual MPEG stream instead of table of
-contents file.
-
-TOC rebuilt if source MPG file changes date.
-
-Antialiased fonts for the interface.
-
-Colorbalance ranges changed to more easily support white balancing.
-
-Histogram shows the output of the RGB transfer in the value plot,
-because the value transfer is applied after the RGB transfer.
- - Histogram has split output
-
-Limited DVD subtitle support. Requires starting playback before the
-subtitle appears. The number of subtitle tracks are given in the asset
-info dialog for MPEG video files.
-
-Full OpenGL support during playback for compositing and effects.
- - Some effects can't be useful and software isn't catching up to hardware.
- - Requires OpenGL 2.0 drivers which only NVidia supports currently.
- - Selected effects have been OpenGL enabled but most have not.
- - OpenGL allows higher video resolution than Xv can handle.
- - OpenGL enabled effects must be placed after software-only effects to get the hardware
-acceleration.
- - The OpenGL routines are not very optimized. You can get in the code
-and fix that.
- - Histogram only uses OpenGL if no channel has more than 3 points.
- - Histogram effects only use OpenGL if the
- GUI is closed or the histogram plot is disabled.
- - Certain frame sizes don't work in OpenGL. If they're not multiples of 4.
- - Most effect sequences have 8 bit intermediates.
- - Certain effect sequences don't have 8 bit intermediates.
- - Interpolate Pixels->Linearize->Color Balance->Histogram
- - Frames to Fields->RGB601
- - Multichannel effects should set discarded outputs to TEXTURE.
- - PBuffers are unreliable. It may take advancing 2 frames or restarting for
- an OpenGL operation to take effect.
-
-The following effects support OpenGL:
-brightness
-chromakey
-chromakeyhsv
-colorbalance
-deinterlace
-diffkey
-dissolve
-flip
-frames to fields
-freezeframe
-gamma
-gradient
-histogram
-huesaturation
-interpolate Pixels
-invertvideo
-linearblur
-overlay
-perspective
-radialblur
-rgb601
-rotate
-scale
-threshold
-zoomblur
-
-
-
-Advancing labels and edits from compositor window doesn't get stuck on
-select mode as often.
-
-The line doubling options in Frames to Fields and Freezeframe were
-removed to simplify things. Use deinterlace after freezeframe. Frames
-to Fields always averages lines.
-
-Rounding error in picon drawing for long timelines fixed.
-
-Handy error dialog pops up showing errors that would previously only
-appear on the console.
-
-Gradient in floating point doesn't stair step anymore.
-Gradient with changing alpha works when colormodel doesn't have alpha.
-
-Chromakey with hue/saturation/value is back, in addition to the color
-cube method and difference key.
-
-All operations except STOP that could interrupt a recording in progress
-are confirmed instead of just cancel.
-
-For overlaying, divide behavior is the same as the Gimp.
-New overlaying algorithm: Max takes the maximum r, g, and b values.
-
-If an output track contains a shared track but the output track has no
-media, the output track reads the shared track's media. If the output
-track has media, it reads its own media. This allows replicating media
-between tracks with shared tracks instead of copying the media.
-
+++ /dev/null
-Newer faster icon buttons for selecting load mode.
-Blur extended to radei beyond 100 pixels.
-Swap channels supports OpenGL.
-New swap frames effect.
-Quicktime make_streamable utility has been ported to support some outside
- streams with AVC1.
-QDesign Music 2 decoding finally supported.
-x and backspace function in the Compositor window.
-Ruler and angle tool.
-For IEEE1394/IEC61883/DV1394 replaced timed waits with polling since pthread_cond_timedwait doesn't work
-in all kernels.
-Beefier table of contents generation for the MPEG decoding.
-2 point motion tracking for faster rotation tracking.
-Configurable x, y for search area in addition to w, h.
-Backed out broken default keyframe paste from Cinelerra-CV.
-Full screen mode selects the right monitor for dual head.
-Title does proper alpha blending when dropshadow and fade are used but is slower.
-Lens aberration effect
-Graphic EQ.
-Parametric EQ now uses a logarithmic envelope.
-Musical note entry in the Synthesizer.
-FLAC audio
-Linear & bezier modes for curves.
-Proper outlining for Titles.
-Attach effects to multiple tracks simultaneously from the Audio & Video menus.
-Asynchronous decoding debugged.
-ID3 tags handled by mp3 parser.
+++ /dev/null
-Newer faster icon buttons for selecting load mode.
-Blur extended to radei beyond 100 pixels.
-Swap channels supports OpenGL.
-New swap frames effect.
-Quicktime make_streamable utility has been ported to support some outside
- streams with AVC1.
-Most QDesign Music 2 derivatives supported.
-Most WMA, WMV & FLV derivatives supported through FFMPEG. These formats don't support seeking.
-x and backspace function in the Compositor window.
-Ruler and angle tool.
-For IEEE1394/IEC61883/DV1394 replaced timed waits with polling since pthread_cond_timedwait doesn't work
-in all kernels.
-Better table of contents generation for the MPEG decoding.
-2 point motion tracking for faster rotation tracking.
-Configurable x, y for search area in addition to w, h.
-Backed out broken default keyframe paste from Cinelerra-CV.
-Full screen mode selects the right monitor for dual head.
-Title does proper alpha blending when dropshadow and fade are used but is slower.
-Lens aberration effect
-Graphic EQ.
-Parametric EQ now uses a logarithmic envelope.
-Musical note entry in the Synthesizer.
-FLAC audio
-Linear & bezier modes for curves.
-Proper outlining for Titles.
-Attach effects to multiple tracks simultaneously from the Audio & Video menus.
-Asynchronous decoding debugged.
-ID3 tags handled by mp3 parser.
-Keyframe spanning for effects & masks.
- - Select single point in time & it uses default keyframe generation as before.
- - Select a range & it copies the changed parameter to all selected keyframes.
-Spectrogram horizontal zoom & color
-
$(OBJDIR)/filejpeg.o \
$(OBJDIR)/filelist.o \
$(OBJDIR)/file.o \
- $(OBJDIR)/fileogg.o \
$(OBJDIR)/filepng.o \
$(OBJDIR)/fileppm.o \
$(OBJDIR)/filescene.o \
$(OBJDIR)/filetga.o \
$(OBJDIR)/filethread.o \
$(OBJDIR)/filetiff.o \
- $(OBJDIR)/filevorbis.o \
$(OBJDIR)/filexml.o \
$(OBJDIR)/floatauto.o \
$(OBJDIR)/floatautos.o \
clean:
rm -rf $(OBJDIR)
+ rm -f shuttle_keys.h
tags:
ampeg_bitrate = 256;
ampeg_derivative = 3;
- vorbis_vbr = 0;
- vorbis_min_bitrate = -1;
- vorbis_bitrate = 128000;
- vorbis_max_bitrate = -1;
-
- theora_fix_bitrate = 1;
- theora_bitrate = 860000;
- theora_quality = 16;
- theora_sharpness = 2;
- theora_keyframe_frequency = 64;
- theora_keyframe_force_frequency = 64;
-
// mpeg parameters
vmpeg_iframe_distance = 45;
vmpeg_pframe_distance = 0;
ampeg_bitrate = asset->ampeg_bitrate;
ampeg_derivative = asset->ampeg_derivative;
-
- vorbis_vbr = asset->vorbis_vbr;
- vorbis_min_bitrate = asset->vorbis_min_bitrate;
- vorbis_bitrate = asset->vorbis_bitrate;
- vorbis_max_bitrate = asset->vorbis_max_bitrate;
-
-
- theora_fix_bitrate = asset->theora_fix_bitrate;
- theora_bitrate = asset->theora_bitrate;
- theora_quality = asset->theora_quality;
- theora_sharpness = asset->theora_sharpness;
- theora_keyframe_frequency = asset->theora_keyframe_frequency;
- theora_keyframe_force_frequency = asset->theora_keyframe_frequency;
-
-
jpeg_quality = asset->jpeg_quality;
// mpeg parameters
// file->tag.set_property("AMPEG_BITRATE", ampeg_bitrate);
// file->tag.set_property("AMPEG_DERIVATIVE", ampeg_derivative);
-//
-// file->tag.set_property("VORBIS_VBR", vorbis_vbr);
-// file->tag.set_property("VORBIS_MIN_BITRATE", vorbis_min_bitrate);
-// file->tag.set_property("VORBIS_BITRATE", vorbis_bitrate);
-// file->tag.set_property("VORBIS_MAX_BITRATE", vorbis_max_bitrate);
-//
// file->tag.set_property("MP3_BITRATE", mp3_bitrate);
-//
ampeg_bitrate = GET_DEFAULT("AMPEG_BITRATE", ampeg_bitrate);
ampeg_derivative = GET_DEFAULT("AMPEG_DERIVATIVE", ampeg_derivative);
- vorbis_vbr = GET_DEFAULT("VORBIS_VBR", vorbis_vbr);
- vorbis_min_bitrate = GET_DEFAULT("VORBIS_MIN_BITRATE", vorbis_min_bitrate);
- vorbis_bitrate = GET_DEFAULT("VORBIS_BITRATE", vorbis_bitrate);
- vorbis_max_bitrate = GET_DEFAULT("VORBIS_MAX_BITRATE", vorbis_max_bitrate);
-
- theora_fix_bitrate = GET_DEFAULT("THEORA_FIX_BITRATE", theora_fix_bitrate);
- theora_bitrate = GET_DEFAULT("THEORA_BITRATE", theora_bitrate);
- theora_quality = GET_DEFAULT("THEORA_QUALITY", theora_quality);
- theora_sharpness = GET_DEFAULT("THEORA_SHARPNESS", theora_sharpness);
- theora_keyframe_frequency = GET_DEFAULT("THEORA_KEYFRAME_FREQUENCY", theora_keyframe_frequency);
- theora_keyframe_force_frequency = GET_DEFAULT("THEORA_FORCE_KEYFRAME_FREQUENCY", theora_keyframe_force_frequency);
-
GET_DEFAULT("FF_AUDIO_OPTIONS", ff_audio_options);
GET_DEFAULT("FF_SAMPLE_FORMAT", ff_sample_format);
ff_audio_bitrate = GET_DEFAULT("FF_AUDIO_BITRATE", ff_audio_bitrate);
vmpeg_preset = GET_DEFAULT("VMPEG_PRESET", vmpeg_preset);
vmpeg_field_order = GET_DEFAULT("VMPEG_FIELD_ORDER", vmpeg_field_order);
- theora_fix_bitrate = GET_DEFAULT("THEORA_FIX_BITRATE", theora_fix_bitrate);
- theora_bitrate = GET_DEFAULT("THEORA_BITRATE", theora_bitrate);
- theora_quality = GET_DEFAULT("THEORA_QUALITY", theora_quality);
- theora_sharpness = GET_DEFAULT("THEORA_SHARPNESS", theora_sharpness);
- theora_keyframe_frequency = GET_DEFAULT("THEORA_KEYFRAME_FREQUENCY", theora_keyframe_frequency);
- theora_keyframe_force_frequency = GET_DEFAULT("THEORA_FORCE_KEYFRAME_FEQUENCY", theora_keyframe_force_frequency);
-
-
ac3_bitrate = GET_DEFAULT("AC3_BITRATE", ac3_bitrate);
png_use_alpha = GET_DEFAULT("PNG_USE_ALPHA", png_use_alpha);
UPDATE_DEFAULT("AMPEG_BITRATE", ampeg_bitrate);
UPDATE_DEFAULT("AMPEG_DERIVATIVE", ampeg_derivative);
- UPDATE_DEFAULT("VORBIS_VBR", vorbis_vbr);
- UPDATE_DEFAULT("VORBIS_MIN_BITRATE", vorbis_min_bitrate);
- UPDATE_DEFAULT("VORBIS_BITRATE", vorbis_bitrate);
- UPDATE_DEFAULT("VORBIS_MAX_BITRATE", vorbis_max_bitrate);
-
UPDATE_DEFAULT("FF_AUDIO_OPTIONS", ff_audio_options);
UPDATE_DEFAULT("FF_SAMPLE_FORMAT", ff_sample_format);
UPDATE_DEFAULT("FF_AUDIO_BITRATE", ff_audio_bitrate);
UPDATE_DEFAULT("FF_VIDEO_BITRATE", ff_video_bitrate);
UPDATE_DEFAULT("FF_VIDEO_QUALITY", ff_video_quality);
- UPDATE_DEFAULT("THEORA_FIX_BITRATE", theora_fix_bitrate);
- UPDATE_DEFAULT("THEORA_BITRATE", theora_bitrate);
- UPDATE_DEFAULT("THEORA_QUALITY", theora_quality);
- UPDATE_DEFAULT("THEORA_SHARPNESS", theora_sharpness);
- UPDATE_DEFAULT("THEORA_KEYFRAME_FREQUENCY", theora_keyframe_frequency);
- UPDATE_DEFAULT("THEORA_FORCE_KEYFRAME_FREQUENCY", theora_keyframe_force_frequency);
-
-
-
UPDATE_DEFAULT("MP3_BITRATE", mp3_bitrate);
UPDATE_DEFAULT("JPEG_QUALITY", jpeg_quality);
// 2 - 3
int ampeg_derivative;
-// Vorbis compression
- int vorbis_min_bitrate;
- int vorbis_bitrate;
- int vorbis_max_bitrate;
- int vorbis_vbr;
-
-// Theora compression
- int theora_fix_bitrate;
- int theora_bitrate;
- int theora_quality;
- int theora_sharpness;
- int theora_keyframe_frequency;
- int theora_keyframe_force_frequency;
-
-
// Set by package render during file creation. -1 means square pixels.
double aspect_ratio;
#include "filejpeg.h"
#include "filempeg.h"
#undef HAVE_STDLIB_H // automake conflict
-#include "fileogg.h"
#include "filepng.h"
#include "fileppm.h"
#include "filescene.h"
#include "filetga.h"
#include "filethread.h"
#include "filetiff.h"
-#include "filevorbis.h"
#include "filexml.h"
#include "formatwindow.h"
#include "formattools.h"
#include "samples.h"
#include "vframe.h"
-//static int temp_debug = 0;
-//suppress noref warning
-void *vorbis0_ov_callbacks[] = {
- &OV_CALLBACKS_DEFAULT, &OV_CALLBACKS_NOCLOSE,
- &OV_CALLBACKS_STREAMONLY, &OV_CALLBACKS_STREAMONLY_NOCLOSE,
-};
-
File::File()
{
cpus = 1;
FileTIFF::get_parameters(parent_window, asset, format_window,
audio_options, video_options, edl);
break;
- case FILE_OGG:
- FileOGG::get_parameters(parent_window, asset, format_window,
- audio_options, video_options, edl);
- break;
default:
break;
}
"CR2",
"TGA",
"TIFF",
- "OGG",
- "Vorbis",
"MPEG",
"EDL",
"FFMPEG_Late",
file = new FileTIFF(this->asset, this);
return FILE_OK;
}
- if( !strcmp(pref->name,"OGG") ) { // OGG file
- if( !FileOGG::check_sig(this->asset) ) continue;
- file = new FileOGG(this->asset, this);
- return FILE_OK;
- }
- if( !strcmp(pref->name,"Vorbis") ) { // VorbisFile file
- if( !FileVorbis::check_sig(this->asset) ) continue;
- file = new FileVorbis(this->asset, this);
- return FILE_OK;
- }
#ifdef HAVE_LIBZMPEG
if( !strcmp(pref->name,"MPEG") ) { // MPEG file
if( !FileMPEG::check_sig(this->asset) ) continue;
file = new FileMPEG(this->asset, this);
break;
#endif
- case FILE_OGG:
- file = new FileOGG(this->asset, this);
- break;
-
- case FILE_VORBIS:
- file = new FileVorbis(this->asset, this);
- break;
#ifdef HAVE_DV
case FILE_RAWDV:
file = new FileDV(this->asset, this);
if( !strcasecmp(format, _(VMPEG_NAME)) ) return FILE_VMPEG;
if( !strcasecmp(format, _(TGA_NAME)) ) return FILE_TGA;
if( !strcasecmp(format, _(TGA_LIST_NAME)) ) return FILE_TGA_LIST;
- if( !strcasecmp(format, _(OGG_NAME)) ) return FILE_OGG;
- if( !strcasecmp(format, _(VORBIS_NAME)) ) return FILE_VORBIS;
if( !strcasecmp(format, _(RAWDV_NAME)) ) return FILE_RAWDV;
if( !strcasecmp(format, _(FFMPEG_NAME)) ) return FILE_FFMPEG;
if( !strcasecmp(format, _(DBASE_NAME)) ) return FILE_DB;
case FILE_TGA_LIST: return _(TGA_LIST_NAME);
case FILE_TIFF: return _(TIFF_NAME);
case FILE_TIFF_LIST: return _(TIFF_LIST_NAME);
- case FILE_OGG: return _(OGG_NAME);
- case FILE_VORBIS: return _(VORBIS_NAME);
case FILE_RAWDV: return _(RAWDV_NAME);
case FILE_FFMPEG: return _(FFMPEG_NAME);
case FILE_DB: return _(DBASE_NAME);
int File::renders_video(int format)
{
switch( format ) {
- case FILE_OGG:
case FILE_JPEG:
case FILE_JPEG_LIST:
case FILE_CR2:
case FILE_FLAC:
case FILE_PCM:
case FILE_WAV:
- case FILE_OGG:
- case FILE_VORBIS:
case FILE_AMPEG:
case FILE_AU:
case FILE_AIFF:
case FILE_FLAC: return "flac";
case FILE_JPEG: return "jpg";
case FILE_JPEG_LIST: return "jpg";
- case FILE_OGG: return "ogg";
case FILE_PCM: return "pcm";
case FILE_PNG: return "png";
case FILE_PNG_LIST: return "png";
case FILE_TIFF: return "tif";
case FILE_TIFF_LIST: return "tif";
case FILE_VMPEG: return "m2v";
- case FILE_VORBIS: return "ogg";
case FILE_WAV: return "wav";
case FILE_FFMPEG: return "ffmpg";
}
case FILE_EXR: return "EXR";
case FILE_EXR_LIST: return "EXR_LIST";
case FILE_CR2: return "CR2";
- case FILE_OGG: return "OGG";
- case FILE_VORBIS: return "VORBIS";
case FILE_FLAC: return "FLAC";
case FILE_FFMPEG: return "FFMPEG";
case FILE_SCENE: return "SCENE";
PackagingEngine *File::new_packaging_engine(Asset *asset)
{
- PackagingEngine *result;
- switch( asset->format ) {
- case FILE_OGG:
- result = (PackagingEngine*)new PackagingEngineOGG();
- break;
- default:
- result = (PackagingEngine*) new PackagingEngineDefault();
- break;
- }
-
+ PackagingEngine *result = (PackagingEngine*) new PackagingEngineDefault();
return result;
}
#define FILE_EXR 26
#define FILE_EXR_LIST 27
#define FILE_CR2 28
-#define FILE_OGG 30
-#define FILE_VORBIS 31
#define FILE_FLAC 32
#define FILE_FFMPEG 33
#define FILE_SCENE 34
N_("MPEG Audio") // For encoding only
N_("MPEG") // For decoding only
N_("MPEG Video") // For encoding only
-N_("OGG Theora/Vorbis")
-N_("OGG Vorbis") // For decoding only
N_("PNG")
N_("PNG Sequence")
N_("PPM")
#define JPEG_LIST_NAME "JPEG Sequence"
#define JPEG_NAME "JPEG"
#define MPEG_NAME "MPEG Stream" // For capture only
-#define OGG_NAME "OGG Theora/Vorbis"
#define PCM_NAME "Raw PCM"
#define PNG_LIST_NAME "PNG Sequence"
#define PNG_NAME "PNG"
#define TIFF_LIST_NAME "TIFF Sequence"
#define TIFF_NAME "TIFF"
#define VMPEG_NAME "MPEG Video" // For encoding only
-#define VORBIS_NAME "OGG Vorbis"
#define WAV_NAME "Microsoft WAV"
#define BITSLINEAR8 8
+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
- * 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 2 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "asset.h"
-#include "bcsignals.h"
-#include "byteorder.h"
-#include "clip.h"
-#include "edit.h"
-#include "file.h"
-#include "fileogg.h"
-#include "guicast.h"
-#include "interlacemodes.h"
-#include "language.h"
-#include "mainerror.h"
-#include "mutex.h"
-#include "mwindow.inc"
-#include "preferences.h"
-#include "render.h"
-#include "vframe.h"
-#include "versioninfo.h"
-#include "videodevice.inc"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-#define READ_SIZE 3*66000
-
-/* This code was aspired by ffmpeg2theora */
-
-int ogg_ret0, ogg_ret1, ogg_ret2;
-
-FileOGG::FileOGG(Asset *asset, File *file)
- : FileBase(asset, file)
-{
- if(asset->format == FILE_UNKNOWN)
- asset->format = FILE_OGG;
- asset->byte_order = 0;
- reset_parameters();
- final_write = 1;
-}
-
-FileOGG::~FileOGG()
-{
- if (tf)
- {
-
- if (tf->videosync)
- {
- ogg_sync_clear(&tf->videosync->sync);
- delete tf->videosync;
- theora_info_clear(&tf->ti);
- theora_comment_clear(&tf->tc);
- }
- if (tf->audiosync)
- {
- ogg_sync_clear(&tf->audiosync->sync);
- delete tf->audiosync;
- vorbis_info_clear(&tf->vi);
- vorbis_comment_clear(&tf->vc);
- }
- if (tf->vpage)
- free(tf->vpage);
- if (tf->apage)
- free(tf->apage);
- delete tf;
- }
- if (temp_frame) delete temp_frame;
- if (stream) close_file();
- if(pcm_history)
- {
- for(int i = 0; i < asset->channels; i++)
- delete [] pcm_history[i];
- delete [] pcm_history;
- }
-
- if (flush_lock) delete flush_lock;
-}
-
-void FileOGG::get_parameters(BC_WindowBase *parent_window,
- Asset *asset, BC_WindowBase* &format_window,
- int audio_options, int video_options, EDL *edl)
-{
- if(audio_options)
- {
- OGGConfigAudio *window = new OGGConfigAudio(parent_window, asset);
- format_window = window;
- window->create_objects();
- window->run_window();
- delete window;
- }
- else
- if(video_options)
- {
- OGGConfigVideo *window = new OGGConfigVideo(parent_window, asset);
- format_window = window;
- window->create_objects();
- window->run_window();
- delete window;
- }
-}
-
-int FileOGG::reset_parameters_derived()
-{
- tf = 0;
- temp_frame = 0;
- stream = 0;
- flush_lock = 0;
- pcm_history = 0;
- start_frame = 0;
- return 0;
-}
-
-static int read_buffer(FILE *in, sync_window_t *sw, int buflen)
-{
- char *buffer = ogg_sync_buffer(&sw->sync, buflen);
-// printf("reading range: %lli - %lli\n", sw->file_bufpos, sw->file_bufpos + buflen);
- sw->wlen = fread(buffer, 1, buflen, in);
- ogg_sync_wrote(&sw->sync, sw->wlen);
-// printf("XX data: %c %c %c %c\n", sw->sync.data[0], sw->sync.data[1], sw->sync.data[2], sw->sync.data[3]);
- sw->file_bufpos += sw->wlen;
-// printf("sb: %i\n",buffer);
- return (sw->wlen);
-}
-
-static int read_buffer_at(FILE *in, sync_window_t *sw, int buflen, off_t filepos)
-{
-// printf("seeking to %lli %lli\n", filepos, sw->file_bufpos);
- fseeko(in, filepos, SEEK_SET);
-// if (sw->file_bufpos != filepos)
-// {
- sw->file_bufpos = filepos;
- sw->file_pagepos = filepos; // this one is not valid until sync_pageseek!
- ogg_sync_reset(&sw->sync);
-
-// }
- return read_buffer(in, sw, buflen);
-}
-
-static int take_page_out_autoadvance(FILE *in, sync_window_t *sw, ogg_page *og)
-{
- while (1)
- {
- int ret = ogg_sync_pageout(&sw->sync, og);
- if (ret > 0)
- {
-// printf("fpa: %lli\n", sw->file_pagepos);
-// advance 'virtual' position
- sw->file_pagepos += og->header_len + og->body_len;
-// printf("ret2: %i %i\n",ret, og->header_len + og->body_len);
- return ret;
- }
- else if (ret < 0)
- {
- eprintf(_("FileOGG: Taking page out on nonsynced stream!\n"));
- return ret;
-
- } else
- {
- // need more data for page
- if ((ret = read_buffer(in, sw, READ_SIZE)) == 0)
- {
- printf(_("FileOGG: There is no more data in the file we are reading from\n"));
- return 0; // No more data
- }
- }
- }
- return 1;
-}
-
-
-// we never need to autoadvance when syncing, since our read chunks are larger than
-// maximum page size
-static int sync_and_take_page_out(sync_window_t *sw, ogg_page *page)
-{
- page->header_len = 0;
- page->body_len = 0;
- page->header = 0;
- page->body = 0;
- int ret = ogg_sync_pageseek(&sw->sync, page);
- if (ret < 0)
- {
- sw->file_pagepos -= ret;
- }
- else if (ret > 0)
- {
- sw->file_pagepos += ret;
-// printf("ret: %i %i\n",ret, page->header_len + page->body_len);
- }
- return ret;
-}
-
-int FileOGG::open_file(int rd, int wr)
-{
- if (!tf)
- {
- tf = new theoraframes_info_t;
- memset(tf, 0, sizeof(*tf));
- }
-
-
- if(wr)
- {
-
-
- if((stream = fopen(asset->path, "w+b")) == 0)
- {
- eprintf(_("Error while opening \"%s\" for writing. %m\n"), asset->path);
- return 1;
- }
-
- tf->audio_bytesout = 0;
- tf->video_bytesout = 0;
- tf->videotime = 0;
- tf->audiotime = 0;
-
- tf->vpage_valid = 0;
- tf->apage_valid = 0;
- tf->apage_buffer_length = 0;
- tf->vpage_buffer_length = 0;
- tf->apage = NULL;
- tf->vpage = NULL;
- tf->v_pkg=0;
- tf->a_pkg=0;
-
-
- /* yayness. Set up Ogg output stream */
- srand (time (NULL));
-
- if(asset->video_data)
- {
- ogg_stream_init (&tf->to, rand ()); /* oops, add one ot the above */
-
- theora_info_init (&tf->ti);
-
- tf->ti.frame_width = asset->width;
- tf->ti.frame_height = asset->height;
-
- tf->ti.width = ((asset->width + 15) >>4)<<4; // round up to the nearest multiple of 16
- tf->ti.height = ((asset->height + 15) >>4)<<4; // round up to the nearest multiple of 16
- if (tf->ti.width != tf->ti.frame_width || tf->ti.height != tf->ti.frame_height)
- {
- eprintf(_("WARNING: Encoding theora when width or height are not dividable by 16 is suboptimal\n"));
- }
-
- tf->ti.offset_x = 0;
- tf->ti.offset_y = tf->ti.height - tf->ti.frame_height;
- tf->ti.fps_numerator = (unsigned int)(asset->frame_rate * 1000000);
- tf->ti.fps_denominator = 1000000;
-
- if (asset->aspect_ratio > 0)
- {
- // Cinelerra uses frame aspect ratio, theora uses pixel aspect ratio
- float pixel_aspect = asset->aspect_ratio / asset->width * asset->height;
- tf->ti.aspect_numerator = (unsigned int)(pixel_aspect * 1000000);
- tf->ti.aspect_denominator = 1000000;
- } else
- {
- tf->ti.aspect_numerator = 1000000;
- tf->ti.aspect_denominator = 1000000;
- }
- if(EQUIV(asset->frame_rate, 25) || EQUIV(asset->frame_rate, 50))
- tf->ti.colorspace = OC_CS_ITU_REC_470BG;
- else if((asset->frame_rate > 29 && asset->frame_rate < 31) || (asset->frame_rate > 59 && asset->frame_rate < 61) )
- tf->ti.colorspace = OC_CS_ITU_REC_470M;
- else
- tf->ti.colorspace = OC_CS_UNSPECIFIED;
-
- if (asset->theora_fix_bitrate)
- {
- tf->ti.target_bitrate = asset->theora_bitrate;
- tf->ti.quality = 0;
- } else
- {
- tf->ti.target_bitrate = 0;
- tf->ti.quality = asset->theora_quality; // video quality 0-63
- }
- tf->ti.dropframes_p = 0;
- tf->ti.quick_p = 1;
- tf->ti.keyframe_auto_p = 1;
- tf->ti.keyframe_frequency = asset->theora_keyframe_frequency;
- tf->ti.keyframe_frequency_force = asset->theora_keyframe_force_frequency;
- tf->ti.keyframe_data_target_bitrate = (unsigned int) (tf->ti.target_bitrate * 1.5) ;
- tf->ti.keyframe_auto_threshold = 80;
- tf->ti.keyframe_mindistance = 8;
- tf->ti.noise_sensitivity = 1;
- tf->ti.sharpness = 2;
-
-
- if (theora_encode_init (&tf->td, &tf->ti))
- {
- eprintf(_("(FileOGG:file_open) initialization of theora codec failed\n"));
- }
- }
- /* init theora done */
-
- /* initialize Vorbis too, if we have audio. */
- if(asset->audio_data)
- {
- ogg_stream_init (&tf->vo, rand ());
- vorbis_info_init (&tf->vi);
- /* Encoding using a VBR quality mode. */
- int ret;
- if(!asset->vorbis_vbr)
- {
- ret = vorbis_encode_init(&tf->vi,
- asset->channels,
- asset->sample_rate,
- asset->vorbis_max_bitrate,
- asset->vorbis_bitrate,
- asset->vorbis_min_bitrate);
- } else
- {
- // Set true VBR as demonstrated by http://svn.xiph.org/trunk/vorbis/doc/vorbisenc/examples.html
- ret = vorbis_encode_setup_managed(&tf->vi,
- asset->channels,
- asset->sample_rate,
- -1,
- asset->vorbis_bitrate,
- -1);
- ret |= vorbis_encode_ctl(&tf->vi, OV_ECTL_RATEMANAGE_AVG, NULL);
- ret |= vorbis_encode_setup_init(&tf->vi);
- }
-
- if (ret)
- {
- eprintf(_("The Vorbis encoder could not set up a mode according to\n"
- "the requested quality or bitrate.\n\n"));
- fclose (stream);
- stream = 0;
- return 1;
- }
-
- vorbis_comment_init (&tf->vc); // comment is cleared lateron
- vorbis_comment_add_tag (&tf->vc, (char*)"ENCODER", (char*)PROGRAM_NAME " " CINELERRA_VERSION);
- /* set up the analysis state and auxiliary encoding storage */
- vorbis_analysis_init (&tf->vd, &tf->vi);
- vorbis_block_init (&tf->vd, &tf->vb);
-
- }
- /* audio init done */
-
- /* write the bitstream header packets with proper page interleave */
-
- /* first packet will get its own page automatically */
- if(asset->video_data)
- {
- theora_encode_header (&tf->td, &tf->op);
- ogg_stream_packetin (&tf->to, &tf->op);
- if (ogg_stream_pageout (&tf->to, &tf->og) != 1)
- {
- eprintf(_("Internal Ogg library error.\n"));
- return 1;
- }
- fwrite (tf->og.header, 1, tf->og.header_len, stream);
- fwrite (tf->og.body, 1, tf->og.body_len, stream);
-
- /* create the remaining theora headers */
- theora_comment_init (&tf->tc);
- theora_comment_add_tag (&tf->tc, (char*)"ENCODER",
- (char*)PROGRAM_NAME " " CINELERRA_VERSION);
- theora_encode_comment (&tf->tc, &tf->op);
- ogg_stream_packetin (&tf->to, &tf->op);
- theora_comment_clear(&tf->tc);
- theora_encode_tables (&tf->td, &tf->op);
- ogg_stream_packetin (&tf->to, &tf->op);
- }
- if(asset->audio_data)
- {
- ogg_packet header;
- ogg_packet header_comm;
- ogg_packet header_code;
-
- vorbis_analysis_headerout (&tf->vd, &tf->vc, &header,
- &header_comm, &header_code);
- ogg_stream_packetin (&tf->vo, &header); /* automatically placed in its own page */
- vorbis_comment_clear(&tf->vc);
- if (ogg_stream_pageout (&tf->vo, &tf->og) != 1)
- {
- eprintf(_("Internal Ogg library error.\n"));
- return 1;
- }
- fwrite (tf->og.header, 1, tf->og.header_len, stream);
- fwrite (tf->og.body, 1, tf->og.body_len, stream);
-
- /* remaining vorbis header packets */
- ogg_stream_packetin (&tf->vo, &header_comm);
- ogg_stream_packetin (&tf->vo, &header_code);
- }
-
- /* Flush the rest of our headers. This ensures
- * the actual data in each stream will start
- * on a new page, as per spec. */
- while (1 && asset->video_data)
- {
- int result = ogg_stream_flush (&tf->to, &tf->og);
- if (result < 0)
- {
- /* can't get here */
- eprintf(_("Internal Ogg library error.\n"));
- return 1;
- }
- if (result == 0)
- break;
- fwrite (tf->og.header, 1, tf->og.header_len, stream);
- fwrite (tf->og.body, 1, tf->og.body_len, stream);
- }
- while (1 && asset->audio_data)
- {
- int result = ogg_stream_flush (&tf->vo, &tf->og);
- if (result < 0)
- {
- /* can't get here */
- eprintf(_("Internal Ogg library error.\n"));
- return 1;
- }
- if (result == 0)
- break;
- fwrite (tf->og.header, 1, tf->og.header_len, stream);
- fwrite (tf->og.body, 1, tf->og.body_len, stream);
- }
- flush_lock = new Mutex("OGGFile::Flush lock");
-// printf("End of headers at position: %lli\n", ftello(stream));
- } else
- if (rd)
- {
-
- if((stream = fopen(asset->path, "rb")) == 0)
- {
- eprintf(_("Error while opening %s for reading. %m\n"), asset->path);
- return 1;
- }
-
- /* get file length */
- struct stat file_stat;
- stat(asset->path, &file_stat);
- file_length = file_stat.st_size;
-
- /* start up Ogg stream synchronization layer */
- /* oy is used just here to parse header, we use separate syncs for video and audio*/
- sync_window_t oy;
- ogg_sync_init(&oy.sync);
- // make sure we init the position structures to zero
- read_buffer_at(stream, &oy, READ_SIZE, 0);
-
-
- /* init supporting Vorbis structures needed in header parsing */
- vorbis_info_init(&tf->vi);
- vorbis_comment_init(&tf->vc);
-
-
- /* init supporting Theora structures needed in header parsing */
- theora_comment_init(&tf->tc);
- theora_info_init(&tf->ti);
-
-
-
- /* Ogg file open; parse the headers */
- /* Only interested in Vorbis/Theora streams */
- int stateflag = 0;
- int theora_p = 0;
- int vorbis_p = 0;
- while(!stateflag)
- {
-
-
-// int ret = read_buffer(stream, &oy, 4096);
- TRACE("FileOGG::open_file 60")
-// if(ret == 0)
-// break;
-
- while(take_page_out_autoadvance(stream, &oy, &tf->og) > 0)
- {
- ogg_stream_state test;
-
- /* is this a mandated initial header? If not, stop parsing */
- if(!ogg_page_bos(&tf->og))
- {
- /* don't leak the page; get it into the appropriate stream */
- // queue_page(&tf->og);
- if(theora_p)ogg_stream_pagein(&tf->to, &tf->og);
- if(vorbis_p)ogg_stream_pagein(&tf->vo, &tf->og);
-
- stateflag = 1;
- break;
- }
-
- ogg_stream_init(&test, ogg_page_serialno(&tf->og));
- ogg_stream_pagein(&test, &tf->og);
- ogg_stream_packetout(&test, &tf->op);
-
- /* identify the codec: try theora */
- if(!theora_p && theora_decode_header(&tf->ti, &tf->tc, &tf->op)>=0)
- {
- /* it is theora */
- memcpy(&tf->to, &test, sizeof(test));
- theora_p = 1;
- // find out granule shift - from liboggz's oggz_auto.c
- unsigned char * header = tf->op.packet;
- theora_keyframe_granule_shift = (char) ((header[40] & 0x03) << 3);
- theora_keyframe_granule_shift |= (header[41] & 0xe0) >> 5;
-
- } else if(!vorbis_p && vorbis_synthesis_headerin(&tf->vi, &tf->vc, &tf->op)>=0)
- {
- /* it is vorbis */
- memcpy(&tf->vo, &test, sizeof(test));
- vorbis_p = 1;
- } else
- {
- /* whatever it is, we don't care about it */
- ogg_stream_clear(&test);
- }
- }
- /* fall through to non-bos page parsing */
- }
-
-
- /* we're expecting more header packets. */
- while((theora_p && theora_p < 3) || (vorbis_p && vorbis_p < 3))
- {
- int ret;
-
- /* look for further theora headers */
- while(theora_p && (theora_p < 3) && (ret = ogg_stream_packetout(&tf->to, &tf->op)))
- {
- if(ret < 0)
- {
- eprintf(_("FileOGG: Error parsing Theora stream headers; corrupt stream?\n"));
- return 1;
- }
- if(theora_decode_header(&tf->ti, &tf->tc, &tf->op))
- {
- eprintf(_("FileOGG: Error parsing Theora stream headers; corrupt stream?\n"));
- return 1;
- }
- theora_p++;
- if(theora_p == 3)
- break;
- }
-
- /* look for more vorbis header packets */
- while(vorbis_p && (vorbis_p < 3) && (ret = ogg_stream_packetout(&tf->vo, &tf->op)))
- {
- if(ret<0)
- {
- eprintf(_("FileOGG: Error parsing Vorbis stream headers; corrupt stream?\n"));
- return 1;
- }
- if (vorbis_synthesis_headerin(&tf->vi, &tf->vc, &tf->op))
- {
- eprintf(_("FileOGG: Error parsing Vorbis stream headers; corrupt stream?\n"));
- return 1;
- }
- vorbis_p++;
- if (vorbis_p == 3)
- break;
- }
-
- if ((!vorbis_p || vorbis_p == 3) && (!theora_p || theora_p == 3))
- break;
- /* The header pages/packets will arrive before anything else we
- care about, or the stream is not obeying spec */
-
- if(take_page_out_autoadvance(stream, &oy, &tf->og) > 0)
- {
-// queue_page(&tf->og); /* demux into the appropriate stream */
- if(theora_p) ogg_stream_pagein(&tf->to, &tf->og);
- if(vorbis_p) ogg_stream_pagein(&tf->vo, &tf->og);
-
- } else
- {
- eprintf(_("FileOGG: End of file while searching for codec headers.\n"));
- return 1;
- }
- }
- // Remember where the real data begins for later seeking purposes
- filedata_begin = oy.file_pagepos;
-
-
-
- /* and now we have it all. initialize decoders */
- if(theora_p)
- {
- int ret;
-
-// WORKAROUND for bug in alpha4 version of theora:
- tf->td.internal_encode = 0;
-
- ret = theora_decode_init(&tf->td, &tf->ti);
- if( ret ) printf("theora_decode_init ret=%d\n", ret);
- double fps = (double)tf->ti.fps_numerator/tf->ti.fps_denominator;
-/* printf("FileOGG: Ogg logical stream %x is Theora %dx%d %.02f fps\n",
- (unsigned int)tf->to.serialno, tf->ti.width, tf->ti.height,
- fps);
-*/
-/*
-Not yet available in alpha4, we assume 420 for now
-
- switch(tf->ti.pixelformat)
- {
- case OC_PF_420: printf(" 4:2:0 video\n"); break;
- case OC_PF_422: printf(" 4:2:2 video\n"); break;
- case OC_PF_444: printf(" 4:4:4 video\n"); break;
- case OC_PF_RSVD:
- default:
- printf(" video\n (UNKNOWN Chroma sampling!)\n");
- break;
- }
-*/
-
- theora_cmodel = BC_YUV420P;
-
- if(tf->ti.width!=tf->ti.frame_width || tf->ti.height!=tf->ti.frame_height)
- {
- eprintf(_("Frame content is %dx%d with offset (%d,%d), We do not support this yet. You will get black border.\n"),
- tf->ti.frame_width, tf->ti.frame_height, tf->ti.offset_x, tf->ti.offset_y);
- }
- tf->videosync = new sync_window_t;
- ogg_sync_init(&tf->videosync->sync);
- tf->videosync->wlen = 0;
-
- ret = ogg_get_first_page(tf->videosync, tf->to.serialno, &tf->videopage);
- if( !ret ) printf("ogg_get_first_page ret=%d\n", ret);
- ogg_packet op;
-
- // we have headers already decoded, so just skip them
- ogg_stream_reset(&tf->to);
- ogg_stream_pagein(&tf->to, &tf->videopage);
- while (1)
- {
- while (ogg_stream_packetpeek(&tf->to, NULL) != 1)
- {
- if (!ogg_get_next_page(tf->videosync, tf->to.serialno, &tf->videopage))
- {
- printf(_("FileOGG: Cannot find next page while looking for first non-header packet\n"));
- return 1;
- }
- ogg_stream_pagein(&tf->to, &tf->videopage);
- }
- ogg_stream_packetout(&tf->to, &op);
- if (!theora_packet_isheader(&op))
- break;
- }
- // now get to the page of the finish of the first packet
- while (ogg_page_packets(&tf->videopage) == 0)
- {
- if (ogg_page_granulepos(&tf->videopage) != -1)
- {
- printf(_("FileOGG: Broken ogg file - broken page: ogg_page_packets == 0 and granulepos != -1\n"));
- return 1;
- }
- ogg_get_next_page(tf->videosync, tf->to.serialno, &tf->videopage);
- }
- // FIXME - LOW PRIORITY - start counting at first decodable keyframe!
- // but then we have to fix a/v sync somehow
- start_frame = (int64_t) (theora_granule_frame (&tf->td, ogg_page_granulepos(&tf->videopage)) - ogg_page_packets(&tf->videopage)) + 1;
-
- ret = ogg_get_last_page(tf->videosync, tf->to.serialno, &tf->videopage);
- last_frame = (int64_t) (theora_granule_frame (&tf->td, ogg_page_granulepos(&tf->videopage)));
- asset->video_length = last_frame - start_frame + 1;
-// printf("FileOGG:: first frame: %lli, last frame: %lli, video length: %lli\n", start_frame, last_frame, asset->video_length);
-
- asset->layers = 1;
- // FIXME - LOW PRIORITY Cinelerra does not honor the frame_width and frame_height
- asset->width = tf->ti.width;
- asset->height = tf->ti.height;
-// Don't want a user configured frame rate to get destroyed
- if(!asset->frame_rate)
- asset->frame_rate = fps;
-// All theora material is noninterlaced by definition
- if(!asset->interlace_mode)
- asset->interlace_mode = ILACE_MODE_NOTINTERLACED;
-
- /* ogg_get_page_of_frame(tf->videosync, tf->to.serialno, &og, 0 +start_frame);
- ogg_get_page_of_frame(tf->videosync, tf->to.serialno, &og, 1 +start_frame);
- ogg_get_page_of_frame(tf->videosync, tf->to.serialno, &og, 5 +start_frame);
- ogg_get_page_of_frame(tf->videosync, tf->to.serialno, &og, 206 +start_frame);
- ogg_get_page_of_frame(tf->videosync, tf->to.serialno, &og, 207 +start_frame);
- ogg_get_page_of_frame(tf->videosync, tf->to.serialno, &og, 208 +start_frame);
-
- int64_t kf;
- ogg_seek_to_keyframe(tf->videosync, tf->to.serialno, 0 + start_frame, &kf);
- ogg_seek_to_keyframe(tf->videosync, tf->to.serialno, 1 + start_frame, &kf);
- ogg_seek_to_keyframe(tf->videosync, tf->to.serialno, 5 + start_frame, &kf);
- ogg_seek_to_keyframe(tf->videosync, tf->to.serialno, 66 + start_frame, &kf);
- //printf("Keyframe: %lli\n", kf);
- ogg_seek_to_keyframe(tf->videosync, tf->to.serialno, 1274 + start_frame, &kf);
-*/
-
- set_video_position(0); // make sure seeking is done to the first sample
- ogg_frame_position = -10;
- asset->video_data = 1;
- strncpy(asset->vcodec, "theo", 4);
-
-
-// report_colorspace(&ti);
-// dump_comments(&tc);
- } else
- {
- /* tear down the partial theora setup */
- theora_info_clear(&tf->ti);
- theora_comment_clear(&tf->tc);
- }
-
-
- if(vorbis_p)
- {
- vorbis_synthesis_init(&tf->vd, &tf->vi);
- vorbis_block_init(&tf->vd, &tf->vb);
-/* eprintf(_("FileOGG: Ogg logical stream %x is Vorbis %d channel %d Hz audio.\n"),
- (unsigned int)tf->vo.serialno, tf->vi.channels, (int)tf->vi.rate);
-*/
- /* init audio_sync structure */
- tf->audiosync = new sync_window_t;
- ogg_sync_init(&tf->audiosync->sync);
- tf->audiosync->wlen = 0;
-
- ogg_get_first_page(tf->audiosync, tf->vo.serialno, &tf->audiopage);
- ogg_packet op;
- ogg_stream_reset(&tf->vo);
- // FIXME - LOW PRIORITY should be getting pages until one has granulepos,
- // probably never happens in pracitce
- ogg_ret2 = ogg_stream_pagein(&tf->vo, &tf->audiopage);
- ogg_int64_t accumulated = 0;
- long lastblock = -1;
- int result;
- while((result = ogg_stream_packetout(&tf->vo, &op)))
- {
- if(result > 0)
- { // ignore holes
- long thisblock = vorbis_packet_blocksize(&tf->vi, &op);
- if(lastblock != -1)
- accumulated += (lastblock + thisblock) >> 2;
- lastblock = thisblock;
- }
- }
- start_sample = ogg_page_granulepos(&tf->audiopage) - accumulated;
-/*
- printf("Begin: %lli, To byte: %lli, granule: %lli, serialno: %x\n",
- tf->audiosync->file_pagepos_found,
- tf->audiosync->file_pagepos_found + tf->audiopage.body_len + tf->audiopage.header_len,
- ogg_page_granulepos(&tf->audiopage),
- ogg_page_serialno(&tf->audiopage));
- while (ogg_get_next_page(tf->audiosync, tf->vo.serialno, &tf->audiopage))
- printf("At byte: %lli, To byte: %lli, granule: %lli, serialno: %x\n",
- tf->audiosync->file_pagepos_found,
- tf->audiosync->file_pagepos_found + tf->audiopage.body_len + tf->audiopage.header_len,
- ogg_page_granulepos(&tf->audiopage),
- ogg_page_serialno(&tf->audiopage));
-*/
-
- ogg_ret1 = ogg_get_last_page(tf->audiosync, tf->vo.serialno, &tf->audiopage);
- last_sample = ogg_page_granulepos(&tf->audiopage);
- asset->audio_length = last_sample - start_sample;
-
-/* printf("FileOGG:: First sample: %lli, last_sample: %lli\n", start_sample, last_sample);
- printf("FileOGG:: audio length: samples: %lli, playing time: %f\n", asset->audio_length, 1.0 * asset->audio_length / tf->vi.rate);
-*/
-/* printf("End: %lli, To byte: %lli, granule: %lli, serialno: %x\n",
- tf->audiosync->file_pagepos_found,
- tf->audiosync->file_pagepos_found + tf->audiopage.body_len + tf->audiopage.header_len,
- ogg_page_granulepos(&tf->audiopage),
- ogg_page_serialno(&tf->audiopage));
- while (ogg_get_prev_page(tf->audiosync, tf->vo.serialno, &tf->audiopage))
- printf("At byte: %lli, To byte: %lli, granule: %lli, serialno: %x\n",
- tf->audiosync->file_pagepos_found,
- tf->audiosync->file_pagepos_found + tf->audiopage.body_len + tf->audiopage.header_len,
- ogg_page_granulepos(&tf->audiopage),
- ogg_page_serialno(&tf->audiopage));
-*/
-
-/* ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 0);
- ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 1);
- ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 50);
- ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 5000);
- ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 30000);
- ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 50000);
- ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 90000);
- ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 95999);
- ogg_get_page_of_sample(tf->audiosync, tf->vo.serialno, &tf->audiopage, 96000);
- ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, 0);
- ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, 1);
- ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, 5000);
- ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, 30000);
- ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, 50000);
- ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, 90000);
- ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, 95999);
- ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, 96000);
-*/
- asset->channels = tf->vi.channels;
- if(!asset->sample_rate)
- asset->sample_rate = tf->vi.rate;
- asset->audio_data = 1;
-
-
- ogg_sample_position = -10;
- set_audio_position(0); // make sure seeking is done to the first sample
- strncpy(asset->acodec, "vorb", 4);
-
-
- } else
- {
- /* tear down the partial vorbis setup */
- vorbis_info_clear(&tf->vi);
- vorbis_comment_clear(&tf->vc);
- }
-
- ogg_sync_clear(&oy.sync);
-
- }
- return 0;
-}
-
-int FileOGG::ogg_get_prev_page(sync_window_t *sw, long serialno, ogg_page *og)
-{
- ogg_page page;
- off_t filepos = sw->file_pagepos_found - READ_SIZE;
- int first_page_offset = 0;
- int done = 0;
- int read_len = READ_SIZE;
-
-// printf("fp: %lli pagepos found: %lli\n", filepos, sw->file_pagepos_found);
- while (!done)
- {
- if (filepos < 0)
- {
-// read_len = read_len - (filedata_begin - filepos);
- read_len = read_len + filepos;
- filepos = 0;
- }
- if (read_len <= 0)
- return 0;
- int have_read = read_buffer_at(stream, sw, read_len, filepos);
-
-// printf("reading at %lli, len: %i, read: %i, pagepos: %lli, pageposfound: %lli\n", filepos, read_len, have_read, sw->file_pagepos, sw->file_pagepos_found);
-// printf("Buffer position: %lli\n", sw->file_bufpos);
-// printf("SS: storage: %i, fill: %i, returned: %i\n", sw->sync.storage, sw->sync.fill, sw->sync.returned);
-// printf("US: unsynced%i, headrebytes: %i, bodybyes: %i\n", sw->sync.unsynced, sw->sync.headerbytes, sw->sync.bodybytes);
-// printf("data: %c %c %c %c\n", sw->sync.data[0], sw->sync.data[1], sw->sync.data[2], sw->sync.data[3]);
- if (!have_read)
- return 0;
-
-// read all pages in the buffer
- int page_offset = 0;
- int page_length = 0;
- int first_page = 1;
- while (first_page || page_length)
- {
- // if negative, skip bytes
- while ((page_length = sync_and_take_page_out(sw, &page)) < 0)
- {
- page_offset -= page_length;
-
-// if (filepos == 0)
-// printf("BBBb page_len: %i\n", page_length);
- }
-// if (filepos == 0 && page_length)
-// {
-// printf("AAAAAAAAAAAAAAAAAAAAAAAAAaaa\n");
-// printf("pp: %lli %x\n", sw->file_pagepos, ogg_page_serialno(&page));
-// }
- if (first_page)
- first_page_offset = page_offset;
- first_page = 0;
-// printf("pl: %i, serial: %x iscem: %x\n", page_length, ogg_page_serialno(&page), serialno);
- if (page_length && ogg_page_serialno(&page) == serialno)
- {
- // we will copy every page until last page in this buffer
- done = 1;
-
- sw->file_pagepos_found = sw->file_pagepos - page.header_len - page.body_len;
-// printf("got it : %lli %i %i\n", sw->file_pagepos, page.header_len, page.body_len);
- memcpy(og, &page, sizeof(page));
- }
- }
-// printf("fpo: %i\n", first_page_offset);
- filepos += first_page_offset - READ_SIZE;
- }
-
-// printf("finished\n");
- if (done)
- return 1;
- else
- return 0;
-}
-
-int FileOGG::ogg_get_last_page(sync_window_t *sw, long serialno, ogg_page *og)
-{
- ogg_page page;
- off_t filepos = file_length - READ_SIZE;
- if (filepos < 0)
- filepos = 0;
-
- int first_page_offset = 0;
- int done = 0;
- while (!done && filepos >= 0)
- {
- //int readlen =
- read_buffer_at(stream, sw, READ_SIZE, filepos);
-
-// read all pages in the buffer
- int page_offset = 0;
- int page_length = 0;
- int first_page = 1;
- while (first_page || page_length)
- {
- // if negative, skip bytes
- while ((page_length = sync_and_take_page_out(sw, &page)) < 0)
- page_offset -= page_length;
- if (first_page)
- first_page_offset = page_offset;
- first_page = 0;
- if (page_length && ogg_page_serialno(&page) == serialno)
- {
- // we will copy every page until last page in this buffer
- done = 1;
- sw->file_pagepos_found = sw->file_pagepos - page.header_len - page.body_len;
- memcpy(og, &page, sizeof(page));
- }
- }
- filepos = filepos + first_page_offset - READ_SIZE;
- }
-
- if (done)
- return 1;
- else
- return 0;
-}
-
-int FileOGG::ogg_get_first_page(sync_window_t *sw, long serialno, ogg_page *og)
-{
-// printf("FileOGG:: Seeking to first page at %lli\n", filedata_begin);
- read_buffer_at(stream, sw, READ_SIZE, 0);
-// we don't even need to sync since we _know_ it is right
- return (ogg_get_next_page(sw, serialno, og));
-}
-
-int FileOGG::ogg_seek_to_databegin(sync_window_t *sw, long serialno)
-{
-
-// printf("FileOGG:: Seeking to first page at %lli\n", filedata_begin);
- read_buffer_at(stream, sw, READ_SIZE, filedata_begin);
-// we don't even need to sync since we _know_ it is right
- return (0);
-}
-
-int FileOGG::ogg_get_next_page(sync_window_t *sw, long serialno, ogg_page *og)
-{
- while (take_page_out_autoadvance(stream, sw, og) > 0)
- {
- if (ogg_page_serialno(og) == serialno)
- {
- sw->file_pagepos_found = sw->file_pagepos - og->header_len - og->body_len;
- return 1;
- }
- }
- return 0;
-}
-
-int FileOGG::ogg_sync_and_get_next_page(sync_window_t *sw, long serialno, ogg_page *og)
-{
-// TODO: Put better error reporting inhere
- int ret;
- while ((ret = sync_and_take_page_out(sw, og)) < 0)
- {
- // do nothing;
- }
- if (ret == 0)
- return 0;
- if (ogg_page_serialno(og) == serialno)
- {
- sw->file_pagepos_found = sw->file_pagepos - og->header_len - og->body_len;
- return 1;
- }
- while (ogg_get_next_page(sw, serialno, og))
- if (ogg_page_serialno(og) == serialno)
- {
- sw->file_pagepos_found = sw->file_pagepos - og->header_len - og->body_len;
- return 1;
- }
-
- return 0;
-}
-// Returns:
-// >= 0, number of sample within a page
-// < 0 error
-int FileOGG::ogg_get_page_of_sample(sync_window_t *sw, long serialno, ogg_page *og, int64_t sample)
-{
-// First make an educated guess about position
- if (sample >= asset->audio_length + start_sample)
- {
- printf(_("FileOGG: Illegal seek beyond end of samples\n"));
- return 0;
- }
- off_t educated_guess = filedata_begin + (file_length - filedata_begin) * (sample - start_sample) / asset->audio_length - READ_SIZE;
- if (educated_guess < 0)
- educated_guess = 0;
-// printf("My educated guess: %lli\n", educated_guess);
-// now see if we won
- read_buffer_at(stream, sw, READ_SIZE, educated_guess);
- ogg_sync_and_get_next_page(sw, serialno, og);
- int64_t end_sample = ogg_page_granulepos(og);
- // linear seek to the sample
- int64_t start_sample = 0;
-// TODO: Use bisection also
-// printf("Next page granulepos: %lli, pagepos: %lli\n", end_sample, sw->file_pagepos_found);
- if (end_sample <= sample)
- {
- // scan forward
- while (end_sample <= sample)
- {
- ogg_get_next_page(sw, serialno, og);
- start_sample = end_sample;
- end_sample = ogg_page_granulepos(og);
- }
- ogg_get_prev_page(sw, serialno, og);
- while (ogg_page_continued(og) && ogg_page_packets(og) == 1)
- ogg_get_prev_page(sw, serialno, og);
- } else
- {
- // scan backward
- start_sample = end_sample;
- while (start_sample > sample || (ogg_page_continued(og) &&
- ogg_page_packets(og) == 1))
- {
-// printf("get prev page: %lli pagepos:%lli\n", ogg_page_granulepos(og), sw->file_pagepos_found);
- ogg_get_prev_page(sw, serialno, og);
- end_sample = start_sample;
- start_sample = ogg_page_granulepos(og);
- }
- // go forward one page at the end
-
- }
-
-// printf("For sample %lli we need to start decoding on page with granulepos: %lli\n", sample, ogg_page_granulepos(og));
- return 1;
-}
-
-// seeks, so next sample returned will be the correct one
-// sample here is still the vorbis sample number (= cinelerra sample number + start_sample)
-// reinits the decoding engine
-
-int FileOGG::ogg_seek_to_sample(sync_window_t *sw, long serialno, int64_t sample)
-{
- // MAYBE FIXME - find out if we really are decoding previous two packets or not
- // get to the sample
- ogg_page og;
- ogg_packet op;
-// printf("Calling get page of sample\n");
- if (!ogg_get_page_of_sample(sw, serialno, &og, sample))
- {
- eprintf(_("FileOGG: Seeking to sample's page failed\n"));
- return 0;
- }
-// printf("Pagepos: %lli\n", sw->file_pagepos);
- vorbis_synthesis_restart(&tf->vd);
- ogg_stream_reset(&tf->vo);
- ogg_stream_pagein(&tf->vo, &og);
- int sync = 0;
-// printf("seeking to sample : %lli , starting at page with gpos: %lli\n", sample, ogg_page_granulepos(&og));
-
- int64_t current_comming_sample = -1;
- while (1)
- {
-
- // make sure we have a packet ready
- while (ogg_stream_packetpeek(&tf->vo, NULL) != 1)
- {
- if (!ogg_get_next_page(sw, serialno, &og))
- {
- eprintf(_("FileOGG: Cannot find next page while seeking\n"));
- return 0;
- }
- ogg_stream_pagein(&tf->vo, &og);
- }
- ogg_stream_packetout(&tf->vo, &op);
- if (sync)
- {
-
- if(!vorbis_synthesis(&tf->vb, &op))
- {
- ogg_ret0 = vorbis_synthesis_blockin(&tf->vd, &tf->vb);
- int64_t previous_comming_sample = current_comming_sample;
- current_comming_sample += vorbis_synthesis_pcmout(&tf->vd, NULL);
- if (current_comming_sample > sample)
- {
- if (previous_comming_sample > sample)
- {
- eprintf(_("Ogg decoding error while seeking sample\n"));
- }
- vorbis_synthesis_read(&tf->vd, (sample - previous_comming_sample));
-// printf("WE GOT IT, samples already decoded: %jd\n", vorbis_synthesis_pcmout(&tf->vd,NULL));
- return 1; // YAY next sample read is going to be ours, sexy!
- } else
- {
- // discard decoded data before current sample
- vorbis_synthesis_read(&tf->vd, (current_comming_sample - previous_comming_sample));
-
- }
- }
- }
- if (!sync && op.granulepos >= 0)
- {
- sync = 1;
- current_comming_sample = op.granulepos;
- if(!vorbis_synthesis(&tf->vb, &op))
- {
- vorbis_synthesis_blockin(&tf->vd, &tf->vb);
- if (vorbis_synthesis_pcmout(&tf->vd, NULL) != 0)
- {
- eprintf(_("FileOGG: Something wrong while trying to seek\n"));
- return 0;
- }
-
- }
-
- }
- }
-
-
- return 0;
-}
-
-int FileOGG::ogg_get_page_of_frame(sync_window_t *sw, long serialno, ogg_page *og, int64_t frame)
-{
- if (frame >= asset->video_length + start_frame)
- {
- eprintf(_("FileOGG: Illegal seek beyond end of frames\n"));
- return 0;
- }
-// printf("frame: %lli start frame: %lli\n", frame, start_frame);
-// printf("file_length: %lli filedata_begin: %lli\n", file_length, filedata_begin);
- off_t educated_guess = filedata_begin + (file_length - filedata_begin) * (frame - start_frame) / asset->video_length - READ_SIZE/2;
-// educated_guess += 100000;
- if (educated_guess > file_length - READ_SIZE)
- educated_guess = file_length - READ_SIZE;
- if (educated_guess < filedata_begin)
- educated_guess = filedata_begin;
-// printf("My educated guess: %lli\n", educated_guess);
-// now see if we won
- read_buffer_at(stream, sw, READ_SIZE, educated_guess);
- if( !ogg_sync_and_get_next_page(sw, serialno, og) ) {
- printf(_("FileOGG: ogg_sync_and_get_next_page failed\n"));
- return 0;
- }
- int64_t pageend_frame;
- //int read_back = 0;
- // find the page with "real" ending
- while ((pageend_frame = ogg_page_granulepos(og)) == -1)
- {
- if (ogg_get_next_page(sw, serialno, og) == 0)
- {
- //read_back = 1;
- break;
- }
- }
- pageend_frame = theora_granule_frame(&tf->td, ogg_page_granulepos(og));
-
- // FIXME - MEDIUM PRIORITY: read back if we've gone too far and no page of our serialno at all can be found
-
-
- // linear seek to the sample
-// TODO: Use bisection also
-// printf("Next page granulepos: %lli, pagepos: %lli\n", end_sample, sw->file_pagepos_found);
- //int discard_packets = 0;
- int missp = 0;
- int missm = 0;
- if (pageend_frame <= frame)
- {
- // scan forward
- while (pageend_frame < frame)
- {
- do {
- ogg_get_next_page(sw, serialno, og);
- } while (ogg_page_packets(og) == 0);
- pageend_frame = theora_granule_frame(&tf->td, ogg_page_granulepos(og));
- missp++;
- }
- // go back if this frame starts on previous page
- if (ogg_page_continued(og) && pageend_frame - ogg_page_packets(og) == frame - 1)
- {
- do {
- ogg_get_prev_page(sw, serialno, og);
- } while (ogg_page_packets(og) == 0 && ogg_page_continued(og));
- }
- pageend_frame = theora_granule_frame(&tf->td, ogg_page_granulepos(og));
- } else
- {
- // scan backward
- int64_t first_frame_on_page = theora_granule_frame(&tf->td, ogg_page_granulepos(og)) - ogg_page_packets(og) + 2;
- if (!ogg_page_continued(og))
- first_frame_on_page--;
- while (first_frame_on_page > frame)
- {
-// printf("get prev page: %lli pagepos:%lli\n", ogg_page_granulepos(og), sw->file_pagepos_found);
- do {
- ogg_get_prev_page(sw, serialno, og);
- } while (ogg_page_packets(og) == 0 && ogg_page_continued(og));
- missm++;
-// pageend_frame = theora_granule_frame(&tf->td, ogg_page_granulepos(og));
- first_frame_on_page = theora_granule_frame(&tf->td, ogg_page_granulepos(og)) - ogg_page_packets(og) + 2;
- if (!ogg_page_continued(og))
- first_frame_on_page--;
- }
- }
-// printf("Miss plus: %i, miss minus: %i\n", missp, missm);
-// printf("last frame of page with frame : %lli\n", pageend_frame);
- return 1;
-}
-
-
-int FileOGG::ogg_seek_to_keyframe(sync_window_t *sw, long serialno, int64_t frame, int64_t *position)
-{
-//printf("seek %jd\n", frame);
- ogg_page og;
- ogg_packet op;
-
- if( !ogg_get_page_of_frame(sw, serialno, &og, frame) ) {
- eprintf(_("FileOGG: seek to frame failed\n"));
- return 0;
- }
- // find a page with packets
- while( ogg_page_packets(&og) == 0 ) {
- ogg_get_prev_page(sw, serialno, &og);
- }
- int64_t granulepos = ogg_page_granulepos(&og);
- granulepos &= ~((1<<theora_keyframe_granule_shift)-1);
- int64_t iframe = theora_granule_frame(&tf->td, granulepos);
- // iframe based on granulepos
- if( frame < iframe || !ogg_get_page_of_frame(sw, serialno, &og, iframe) ) {
- eprintf(_("FileOGG: seek to iframe failed\n"));
- return 0;
- }
- while( ogg_page_packets(&og) == 0 ) {
- ogg_get_prev_page(sw, serialno, &og);
- }
- int64_t pageend_frame = theora_granule_frame(&tf->td, ogg_page_granulepos(&og));
- int64_t frames_on_page = ogg_page_packets(&og);
- if( ogg_page_continued(&og) ) --frames_on_page;
- // get frame before page with with iframe
- int64_t page_frame = pageend_frame - frames_on_page;
- if( page_frame < 0 ) page_frame = 0;
-//printf("iframe %jd, page_frame %jd, frames_on_page %jd\n", iframe, page_frame, frames_on_page);
- ogg_stream_reset(&tf->to);
- ogg_stream_pagein(&tf->to, &og);
-
- while( ++page_frame < iframe ) {
- while( ogg_stream_packetpeek(&tf->to, NULL) != 1 ) {
- if( !ogg_get_next_page(sw, serialno, &og) ) {
- eprintf(_("FileOGG: Cannot find next page while seeking\n"));
- return 0;
- }
- ogg_stream_pagein(&tf->to, &og);
- }
- ogg_stream_packetout(&tf->to, &op);
- }
-
- *position = iframe - 1;
- return 1;
-}
-
-
-int FileOGG::check_sig(Asset *asset)
-{
-
- FILE *fd = fopen(asset->path, "rb");
-
-// Test for "OggS"
- fseek(fd, 0, SEEK_SET);
- char data[4];
-
- (void)fread(data, 4, 1, fd);
-
- if(data[0] == 'O' &&
- data[1] == 'g' &&
- data[2] == 'g' &&
- data[3] == 'S')
- {
-
- fclose(fd);
-// printf("Yay, we have an ogg file\n");
- return 1;
- }
-
- fclose(fd);
-
- return 0;
-
-}
-
-int FileOGG::close_file()
-{
-
- if (file->wr)
- {
- if (final_write)
- {
- if (asset->audio_data)
- write_samples_vorbis(0, 0, 1); // set eos
- if (asset->video_data)
- write_frames_theora(0, 1, 1); // set eos
- }
- flush_ogg(1); // flush all
-
- if (asset->audio_data)
- {
- vorbis_block_clear (&tf->vb);
- vorbis_dsp_clear (&tf->vd);
- vorbis_info_clear (&tf->vi);
- ogg_stream_clear (&tf->vo);
- }
- if (asset->video_data)
- {
- theora_info_clear (&tf->ti);
- ogg_stream_clear (&tf->to);
- theora_clear (&tf->td);
- }
-
- if (stream) fclose(stream);
- stream = 0;
- }
- else
- if (file->rd)
- {
- if (asset->audio_data)
- {
- vorbis_block_clear (&tf->vb);
- vorbis_dsp_clear (&tf->vd);
- vorbis_comment_clear (&tf->vc);
- vorbis_info_clear (&tf->vi);
- ogg_stream_clear (&tf->vo);
- }
- theora_comment_clear(&tf->tc);
- if (asset->video_data)
- {
- theora_info_clear (&tf->ti);
- theora_comment_clear (&tf->tc);
- theora_clear (&tf->td);
- ogg_stream_clear (&tf->to);
- }
-
-
- if (stream) fclose(stream);
- stream = 0;
-
- }
- return 0;
-}
-
-int FileOGG::close_file_derived()
-{
-//printf("FileOGG::close_file_derived(): 1\n");
- if (stream) fclose(stream);
- stream = 0;
- return 0;
-}
-
-int64_t FileOGG::get_video_position()
-{
-// printf("GVP\n");
- return next_frame_position - start_frame;
-}
-
-int64_t FileOGG::get_audio_position()
-{
- return next_sample_position - start_sample;
-}
-
-int FileOGG::set_video_position(int64_t x)
-{
-// x=0;
-// printf("SVP: %lli\n", x);
-
- next_frame_position = x + start_frame;
- return 1;
-}
-
-
-int FileOGG::colormodel_supported(int colormodel)
-{
-// printf("CMS\n");
-
- if (colormodel == BC_YUV420P)
- return BC_YUV420P;
- else
- return colormodel;
-}
-int FileOGG::get_best_colormodel(Asset *asset, int driver)
-{
-
- return BC_YUV420P;
-}
-
-
-int FileOGG::read_frame(VFrame *frame)
-{
-
- if(!stream) return 1;
-
-
- // skip is cheaper than seek, do it...
- int decode_frames = 0;
- int expect_keyframe = 0;
- if (ogg_frame_position >= 0 &&
- next_frame_position >= ogg_frame_position &&
- next_frame_position - ogg_frame_position < 32)
- {
- decode_frames = next_frame_position - ogg_frame_position;
- } else
- if (next_frame_position != ogg_frame_position)
- {
- if (!ogg_seek_to_keyframe(tf->videosync, tf->to.serialno,
- next_frame_position, &ogg_frame_position)) {
- eprintf(_("FileOGG:: Error while seeking to frame's keyframe"
- " (frame: %jd, keyframe: %jd)\n"),
- next_frame_position, ogg_frame_position);
- return 1;
- }
-// printf("For frame: %lli, keyframe is: %lli\n", next_frame_position,ogg_frame_position);
- // skip frames must be > 0 here
- decode_frames = next_frame_position - ogg_frame_position;
- if (decode_frames <= 0)
- {
- eprintf(_("FileOGG:: Error while seeking to keyframe,"
- " wrong keyframe number (frame: %jd, keyframe: %jd)\n"),
- next_frame_position, ogg_frame_position);
- return 1;
-
- }
- expect_keyframe = 1;
- }
-
-// printf("Frames to decode: %i\n", decode_frames);
-
-// THIS IS WHAT CAUSES SLOWNESS OF SEEKING, but we can do nothing about it.
- int ret = -1;
- while (decode_frames > 0)
- {
- ogg_page og;
- ogg_packet op;
- while (ogg_stream_packetpeek(&tf->to, NULL) != 1)
- {
- if (!ogg_get_next_page(tf->videosync, tf->to.serialno, &og))
- {
- eprintf(_("FileOGG: Cannot find next page while seeking\n"));
- return 1;
- }
- ogg_stream_pagein(&tf->to, &og);
- }
- ogg_stream_packetout(&tf->to, &op);
- if( theora_packet_isheader(&op) ) continue;
-//printf("frame %jd, key %d\n", ogg_frame_position, theora_packet_iskeyframe(&op));
- if (expect_keyframe && !theora_packet_iskeyframe(&op))
- {
- eprintf(_("FileOGG: Expecting keyframe, but didn't get it\n"));
- // return 1; this is generally not a fatal error
- }
- expect_keyframe = 0;
-
- // decode
- ret = theora_decode_packetin(&tf->td, &op);
-//if(ret < 0 )printf("ret = %d\n", ret);
- decode_frames --;
- ogg_frame_position ++;
- }
- if( ret >= 0 ) {
- yuv_buffer yuv;
- int ret = theora_decode_YUVout (&tf->td, &yuv);
- if (ret)
- {
- eprintf(_("FileOGG: theora_decode_YUVout failed with code %i\n"), ret);
- }
-
-// Dirty magic
-/* yuv.y += yuv.y_stride * (yuv.y_height - 1);
- yuv.u += yuv.uv_stride * (yuv.uv_height - 1);
- yuv.v += yuv.uv_stride * (yuv.uv_height - 1);
- yuv.y_stride = - yuv.y_stride;
- yuv.uv_stride = - yuv.uv_stride;*/
- VFrame *temp_frame = new VFrame(yuv.y, -1, 0,
- yuv.u - yuv.y, yuv.v - yuv.y, - yuv.y_stride,
- yuv.y_height, BC_YUV420P, - yuv.y_stride);
- // copy into temp frame...
-
- BC_CModels::transfer(frame->get_rows(),
- temp_frame->get_rows(),
- frame->get_y(),
- frame->get_u(),
- frame->get_v(),
- temp_frame->get_y(),
- temp_frame->get_u(),
- temp_frame->get_v(),
- 0,
- 0,
- yuv.y_width,
- yuv.y_height,
- 0,
- 0,
- yuv.y_width, // temp_frame can be larger than frame if width not dividable by 16
- yuv.y_height,
- BC_YUV420P,
- frame->get_color_model(),
- 0,
- -temp_frame->get_w(),
- frame->get_w());
- delete temp_frame;
- }
-
- next_frame_position ++;
-
- return 0;
-}
-
-
-
-int FileOGG::ogg_decode_more_samples(sync_window_t *sw, long serialno)
-{
- ogg_page og;
- ogg_packet op;
- int done = 0;
- while (!done)
- {
- while (ogg_stream_packetpeek(&tf->vo, NULL) != 1)
- {
- if (!ogg_get_next_page(sw, serialno, &og))
- {
- eprintf(_("FileOGG: Cannot find next page while trying to decode more samples\n"));
- return 0;
- }
- ogg_stream_pagein(&tf->vo, &og);
- }
- ogg_stream_packetout(&tf->vo, &op);
- if(!vorbis_synthesis(&tf->vb, &op))
- {
- done = 1;
- vorbis_synthesis_blockin(&tf->vd, &tf->vb);
- }
- }
- return 1;
-}
-
-int FileOGG::set_audio_position(int64_t x)
-{
- next_sample_position = x + start_sample;
- return 0;
-}
-
-int FileOGG::move_history(int from, int to, int len)
-{
- if( len > 0 ) {
- for(int i = 0; i < asset->channels; i++)
- memmove(pcm_history[i] + to, pcm_history[i] + from, sizeof(float) * len);
- }
- history_start = history_start + from - to;
- if( history_start < 0 ) history_start = 0;
- return 0;
-}
-
-int FileOGG::read_samples(double *buffer, int64_t len)
-{
- float **vorbis_buffer;
- if (len <= 0)
- return 0;
-// printf("Reading samples: Channel: %i, number of samples: %lli, reading at :%lli\n", file->current_channel, len, next_sample_position);
-// printf("\tnext_sample_position: %lli, length: %i\n", next_sample_position, len);
-// printf("\thistory_start: %lli, length: %i\n", history_start, history_size);
-
- if(len > HISTORY_MAX)
- {
- eprintf(_("max samples=%d\n"), HISTORY_MAX);
- return 1;
- }
-
- if(!pcm_history)
- {
- pcm_history = new float*[asset->channels];
- for(int i = 0; i < asset->channels; i++)
- pcm_history[i] = new float[HISTORY_MAX];
- history_start = -100000000; // insane value to trigger reload
- history_size = 0;
- }
-
- int64_t hole_start = -1;
- int64_t hole_len = -1;
- int64_t hole_absstart = -1;
- int64_t hole_fill = 0;
-
- if (history_start < next_sample_position && history_start + history_size > next_sample_position && history_start + history_size < next_sample_position + len)
- {
-// printf("a\n");
- hole_fill = 1;
- hole_start = history_start + history_size - next_sample_position;
- hole_len = history_size - hole_start;
- hole_absstart = next_sample_position + hole_start;
- move_history(next_sample_position - history_start,
- 0,
- hole_start); //
-
- } else
- if (next_sample_position < history_start && history_start < next_sample_position + len)
- {
-// printf("b\n");
- hole_fill = 1;
- hole_start = 0;
- hole_len = history_start - next_sample_position;
- hole_absstart = next_sample_position;
-// printf("hs: %lli, histstart: %lli, next_sample_position: %lli\n", history_size, history_start, next_sample_position);
-// printf("to: 0, from: %lli, size: %lli\n",
- // history_start - next_sample_position,
-// history_size - history_start + next_sample_position);
- move_history(0,
- history_start - next_sample_position,
- history_size - history_start + next_sample_position);
-
- } else
- if (next_sample_position >= history_start + history_size || next_sample_position + len <= history_start)
- {
-// printf("c\n");
- hole_fill = 1;
- hole_start = 0;
- hole_len = HISTORY_MAX;
- hole_absstart = next_sample_position;
- history_start = hole_absstart;
- history_size = hole_len;
- }
-
- if (hole_fill)
- {
- if (hole_start < 0 || hole_len <= 0 || hole_absstart < 0)
- {
- eprintf(_("FileOGG: Error at finding out what to read from file\n"));
- return 1;
- }
-
- if (hole_absstart + hole_len > asset->audio_length + start_sample)
- {
- hole_len = asset->audio_length + start_sample - hole_absstart;
- history_size = asset->audio_length + start_sample - history_start;
- } else
- {
- history_size = HISTORY_MAX;
- }
-
-
-// printf("Decode samples at position: %lli, samples to read: %lli\n", hole_absstart, hole_len);
-
- int64_t samples_read = 0;
- if (ogg_sample_position != hole_absstart)
- {
- ogg_sample_position = hole_absstart;
- if (!ogg_seek_to_sample(tf->audiosync, tf->vo.serialno, ogg_sample_position))
- {
- eprintf(_("Error while seeking to sample\n"));
- return 1;
- }
- }
- // now we have ogg_sample_positon aligned
- int64_t samples_to_read = hole_len;
- while (samples_read < hole_len)
- {
- int64_t waiting_samples = vorbis_synthesis_pcmout(&tf->vd, &vorbis_buffer);
- int64_t takeout_samples;
- if (waiting_samples > samples_to_read - samples_read)
- takeout_samples = samples_to_read - samples_read;
- else
- takeout_samples = waiting_samples;
-
-// printf("takeout samples: %lli, samples_read: %lli\n", takeout_samples, samples_read);
-
- if(waiting_samples)
- {
- for(int i = 0; i < asset->channels; i++)
- {
- float *input = vorbis_buffer[i];
- float *output = pcm_history[i] + hole_start;
- // TODO: use memcpy
- for(int j = 0; j < takeout_samples ; j++)
- {
- output[j] = input[j];
- }
- }
- }
-
- vorbis_synthesis_read(&tf->vd, takeout_samples);
- samples_read += takeout_samples;
- ogg_sample_position += takeout_samples;
- hole_start += takeout_samples;
-
- if (samples_read < hole_len)
- if (!ogg_decode_more_samples(tf->audiosync, tf->vo.serialno))
- {
- ogg_sample_position = -1;
- return 1;
- }
-
-
- }
- }
-
- // now we can be sure our history is correct, just copy it out
- if (next_sample_position < history_start || next_sample_position + len > history_start + history_size)
- {
- printf(_("FileOGG:: History not aligned properly \n"));
- printf(_("\tnext_sample_position: %jd, length: %jd\n"), next_sample_position, len);
- printf(_("\thistory_start: %jd, length: %jd\n"), history_start, history_size);
- return 1;
- }
- float *input = pcm_history[file->current_channel] + next_sample_position - history_start;
- for (int i = 0; i < len; i++)
- buffer[i] = input[i];
-
- next_sample_position += len;
- return 0;
-}
-
-
-int FileOGG::write_audio_page()
-{
- int ret;
-
- ret = fwrite(tf->apage, 1, tf->apage_len, stream);
- if(ret < tf->apage_len)
- {
- eprintf(_("error writing audio page\n"));
- }
- tf->apage_valid = 0;
- tf->a_pkg -= ogg_page_packets((ogg_page *)&tf->apage);
- return ret;
-}
-
-int FileOGG::write_video_page()
-{
- int ret;
-
- ret = fwrite(tf->vpage, 1, tf->vpage_len, stream);
- if(ret < tf->vpage_len)
- {
- eprintf(_("error writing video page\n"));
- }
- tf->vpage_valid = 0;
- tf->v_pkg -= ogg_page_packets((ogg_page *)&tf->vpage);
- return ret;
-}
-
-void FileOGG::flush_ogg (int e_o_s)
-{
- int len;
- ogg_page og;
-
- flush_lock->lock();
- /* flush out the ogg pages */
- while(1) {
- /* Get pages for both streams, if not already present, and if available.*/
- if(asset->video_data && !tf->vpage_valid) {
- // this way seeking is much better,
- // not sure if 23 packets is a good value. it works though
- int v_next=0;
- if(tf->v_pkg>22 && ogg_stream_flush(&tf->to, &og) > 0) {
- v_next=1;
- }
- else if(ogg_stream_pageout(&tf->to, &og) > 0) {
- v_next=1;
- }
- if(v_next) {
- len = og.header_len + og.body_len;
- if(tf->vpage_buffer_length < len) {
- tf->vpage = (unsigned char *)realloc(tf->vpage, len);
- tf->vpage_buffer_length = len;
- }
- tf->vpage_len = len;
- memcpy(tf->vpage, og.header, og.header_len);
- memcpy(tf->vpage+og.header_len , og.body, og.body_len);
-
- tf->vpage_valid = 1;
- tf->videotime = theora_granule_time (&tf->td,
- ogg_page_granulepos(&og));
- }
- }
- if(asset->audio_data && !tf->apage_valid) {
- // this way seeking is much better,
- // not sure if 23 packets is a good value. it works though
- int a_next=0;
- if(tf->a_pkg>22 && ogg_stream_flush(&tf->vo, &og) > 0) {
- a_next=1;
- }
- else if(ogg_stream_pageout(&tf->vo, &og) > 0) {
- a_next=1;
- }
- if(a_next) {
- len = og.header_len + og.body_len;
- if(tf->apage_buffer_length < len) {
- tf->apage = (unsigned char *)realloc(tf->apage, len);
- tf->apage_buffer_length = len;
- }
- tf->apage_len = len;
- memcpy(tf->apage, og.header, og.header_len);
- memcpy(tf->apage+og.header_len , og.body, og.body_len);
-
- tf->apage_valid = 1;
- tf->audiotime= vorbis_granule_time (&tf->vd,
- ogg_page_granulepos(&og));
- }
- }
-
- if(!asset->audio_data && tf->vpage_valid) {
- write_video_page();
- }
- else if(!asset->video_data && tf->apage_valid) {
- write_audio_page();
- }
- /* We're using both. We can output only:
- * a) If we have valid pages for both
- * b) At EOS, for the remaining stream.
- */
- else if(tf->vpage_valid && tf->apage_valid) {
- /* Make sure they're in the right order. */
- if(tf->videotime <= tf->audiotime)
- write_video_page();
- else
- write_audio_page();
- }
- else if(e_o_s && tf->vpage_valid) {
- write_video_page();
- }
- else if(e_o_s && tf->apage_valid) {
- write_audio_page();
- }
- else {
- break; /* Nothing more writable at the moment */
- }
- }
- flush_lock->unlock();
-}
-
-
-int FileOGG::write_samples_vorbis(double **buffer, int64_t len, int e_o_s)
-{
- float **vorbis_buffer;
- static int samples = 0;
- samples += len;
- if(e_o_s)
- {
- vorbis_analysis_wrote (&tf->vd, 0);
- } else
- {
- vorbis_buffer = vorbis_analysis_buffer (&tf->vd, len);
- /* double to float conversion */
- for(int i = 0; i<asset->channels; i++)
- {
- for (int j = 0; j < len; j++)
- {
- vorbis_buffer[i][j] = buffer[i][j];
- }
- }
- vorbis_analysis_wrote (&tf->vd, len);
- }
- while(vorbis_analysis_blockout (&tf->vd, &tf->vb) == 1)
- {
- /* analysis, assume we want to use bitrate management */
- vorbis_analysis (&tf->vb, NULL);
- vorbis_bitrate_addblock (&tf->vb);
-
- /* weld packets into the bitstream */
- while (vorbis_bitrate_flushpacket (&tf->vd, &tf->op))
- {
- flush_lock->lock();
- ogg_stream_packetin (&tf->vo, &tf->op);
- tf->a_pkg++;
- flush_lock->unlock();
- }
-
- }
- flush_ogg(0);
- return 0;
-
-
-}
-
-int FileOGG::write_samples(double **buffer, int64_t len)
-{
- if (len > 0)
- return write_samples_vorbis(buffer, len, 0);
- return 0;
-}
-
-int FileOGG::write_frames_theora(VFrame ***frames, int len, int e_o_s)
-{
- // due to clumsy theora's design we need to delay writing out by one frame
- // always stay one frame behind, so we can correctly encode e_o_s
- int result = 0;
- if(!stream) return 0;
-
- for(int j = 0; j < len && !result; j++)
- {
- if (temp_frame) // encode previous frame if available
- {
- yuv_buffer yuv;
- yuv.y_width = tf->ti.width;
- yuv.y_height = tf->ti.height;
- yuv.y_stride = temp_frame->get_bytes_per_line();
-
- yuv.uv_width = tf->ti.width / 2;
- yuv.uv_height = tf->ti.height / 2;
- yuv.uv_stride = temp_frame->get_bytes_per_line() /2;
-
- yuv.y = temp_frame->get_y();
- yuv.u = temp_frame->get_u();
- yuv.v = temp_frame->get_v();
- int ret = theora_encode_YUVin (&tf->td, &yuv);
- if (ret)
- {
- printf(_("FileOGG: theora_encode_YUVin failed with code %i\n"), ret);
- printf("yuv_buffer: y_width: %i, y_height: %i, y_stride: %i,"
- " uv_width: %i, uv_height: %i, uv_stride: %i\n",
- yuv.y_width, yuv.y_height, yuv.y_stride,
- yuv.uv_width, yuv.uv_height, yuv.uv_stride);
- }
- while(theora_encode_packetout (&tf->td, e_o_s, &tf->op)) {
- flush_lock->lock();
- ogg_stream_packetin (&tf->to, &tf->op);
- tf->v_pkg++;
- flush_lock->unlock();
- }
- flush_ogg(0); // eos flush is done later at close_file
- }
-// If we have e_o_s, don't encode any new frames
- if (e_o_s)
- break;
-
- if (!temp_frame)
- {
- temp_frame = new VFrame ( tf->ti.width, tf->ti.height, BC_YUV420P, 0);
- }
- VFrame *frame = frames[0][j];
- int in_color_model = frame->get_color_model();
- if (in_color_model == BC_YUV422P &&
- temp_frame->get_w() == frame->get_w() &&
- temp_frame->get_h() == frame->get_h() &&
- temp_frame->get_bytes_per_line() == frame->get_bytes_per_line())
- {
- temp_frame->copy_from(frame);
- } else
- {
-
- BC_CModels::transfer(temp_frame->get_rows(),
- frame->get_rows(),
- temp_frame->get_y(),
- temp_frame->get_u(),
- temp_frame->get_v(),
- frame->get_y(),
- frame->get_u(),
- frame->get_v(),
- 0,
- 0,
- frame->get_w(),
- frame->get_h(),
- 0,
- 0,
- frame->get_w(), // temp_frame can be larger than frame if width not dividable by 16
- frame->get_h(),
- frame->get_color_model(),
- BC_YUV420P,
- 0,
- frame->get_w(),
- temp_frame->get_w());
-
- }
- }
-
- return 0;
-}
-
-
-int FileOGG::write_frames(VFrame ***frames, int len)
-{
-
- return write_frames_theora(frames, len, 0);
-}
-
-OGGConfigAudio::OGGConfigAudio(BC_WindowBase *parent_window, Asset *asset)
- : BC_Window(_(PROGRAM_NAME ": Audio Compression"),
- parent_window->get_abs_cursor_x(1),
- parent_window->get_abs_cursor_y(1),
- 350, 250)
-{
- this->parent_window = parent_window;
- this->asset = asset;
-}
-
-OGGConfigAudio::~OGGConfigAudio()
-{
-
-}
-
-void OGGConfigAudio::create_objects()
-{
-// add_tool(new BC_Title(10, 10, _("There are no audio options for this format")));
-
- int x = 10, y = 10;
- int x1 = 150;
- char string[BCTEXTLEN];
-
- lock_window("OGGConfigAudio::create_objects");
- add_tool(fixed_bitrate = new OGGVorbisFixedBitrate(x, y, this));
- add_tool(variable_bitrate = new OGGVorbisVariableBitrate(x1, y, this));
-
- y += 30;
- sprintf(string, "%d", asset->vorbis_min_bitrate);
- add_tool(new BC_Title(x, y, _("Min bitrate:")));
- add_tool(new OGGVorbisMinBitrate(x1, y, this, string));
-
- y += 30;
- add_tool(new BC_Title(x, y, _("Avg bitrate:")));
- sprintf(string, "%d", asset->vorbis_bitrate);
- add_tool(new OGGVorbisAvgBitrate(x1, y, this, string));
-
- y += 30;
- add_tool(new BC_Title(x, y, _("Max bitrate:")));
- sprintf(string, "%d", asset->vorbis_max_bitrate);
- add_tool(new OGGVorbisMaxBitrate(x1, y, this, string));
-
-
- add_subwindow(new BC_OKButton(this));
- show_window(1);
- unlock_window();
-}
-
-int OGGConfigAudio::close_event()
-{
- set_done(0);
- return 1;
-}
-
-OGGVorbisFixedBitrate::OGGVorbisFixedBitrate(int x, int y, OGGConfigAudio *gui)
- : BC_Radial(x, y, !gui->asset->vorbis_vbr, _("Average bitrate"))
-{
- this->gui = gui;
-}
-int OGGVorbisFixedBitrate::handle_event()
-{
- gui->asset->vorbis_vbr = 0;
- gui->variable_bitrate->update(0);
- return 1;
-}
-
-OGGVorbisVariableBitrate::OGGVorbisVariableBitrate(int x, int y, OGGConfigAudio *gui)
- : BC_Radial(x, y, gui->asset->vorbis_vbr, _("Variable bitrate"))
-{
- this->gui = gui;
-}
-int OGGVorbisVariableBitrate::handle_event()
-{
- gui->asset->vorbis_vbr = 1;
- gui->fixed_bitrate->update(0);
- return 1;
-}
-
-
-OGGVorbisMinBitrate::OGGVorbisMinBitrate(int x,
- int y,
- OGGConfigAudio *gui,
- char *text)
- : BC_TextBox(x, y, 180, 1, text)
-{
- this->gui = gui;
-}
-int OGGVorbisMinBitrate::handle_event()
-{
- gui->asset->vorbis_min_bitrate = atol(get_text());
- return 1;
-}
-
-
-
-OGGVorbisMaxBitrate::OGGVorbisMaxBitrate(int x,
- int y,
- OGGConfigAudio *gui,
- char *text)
- : BC_TextBox(x, y, 180, 1, text)
-{
- this->gui = gui;
-}
-int OGGVorbisMaxBitrate::handle_event()
-{
- gui->asset->vorbis_max_bitrate = atol(get_text());
- return 1;
-}
-
-
-
-OGGVorbisAvgBitrate::OGGVorbisAvgBitrate(int x, int y, OGGConfigAudio *gui, char *text)
- : BC_TextBox(x, y, 180, 1, text)
-{
- this->gui = gui;
-}
-int OGGVorbisAvgBitrate::handle_event()
-{
- gui->asset->vorbis_bitrate = atol(get_text());
- return 1;
-}
-
-
-
-
-
-OGGConfigVideo::OGGConfigVideo(BC_WindowBase *parent_window, Asset *asset)
- : BC_Window(_(PROGRAM_NAME ": Video Compression"),
- parent_window->get_abs_cursor_x(1),
- parent_window->get_abs_cursor_y(1),
- 450, 220)
-{
- this->parent_window = parent_window;
- this->asset = asset;
-}
-
-OGGConfigVideo::~OGGConfigVideo()
-{
-
-}
-
-void OGGConfigVideo::create_objects()
-{
-// add_tool(new BC_Title(10, 10, _("There are no video options for this format")));
- int x = 10, y = 10;
- int x1 = x + 150;
- int x2 = x + 300;
-
- lock_window("OGGConfigVideo::create_objects");
- add_subwindow(new BC_Title(x, y + 5, _("Bitrate:")));
- add_subwindow(new OGGTheoraBitrate(x1, y, this));
- add_subwindow(fixed_bitrate = new OGGTheoraFixedBitrate(x2, y, this));
- y += 30;
-
- add_subwindow(new BC_Title(x, y, _("Quality:")));
- add_subwindow(new BC_ISlider(x + 80, y, 0,
- 200, 200, 0, 63,
- asset->theora_quality, 0,
- 0, &asset->theora_quality));
-
- add_subwindow(fixed_quality = new OGGTheoraFixedQuality(x2, y, this));
- y += 30;
-
- add_subwindow(new BC_Title(x, y, _("Keyframe frequency:")));
- OGGTheoraKeyframeFrequency *keyframe_frequency =
- new OGGTheoraKeyframeFrequency(x1 + 60, y, this);
- keyframe_frequency->create_objects();
- y += 30;
-
- add_subwindow(new BC_Title(x, y, _("Keyframe force frequency:")));
- OGGTheoraKeyframeForceFrequency *keyframe_force_frequency =
- new OGGTheoraKeyframeForceFrequency(x1 + 60, y, this);
- keyframe_force_frequency->create_objects();
- y += 30;
-
- add_subwindow(new BC_Title(x, y, _("Sharpness:")));
- OGGTheoraSharpness *sharpness =
- new OGGTheoraSharpness(x1 + 60, y, this);
- sharpness->create_objects();
- y += 30;
-
-
- add_subwindow(new BC_OKButton(this));
- show_window(1);
- unlock_window();
-}
-
-
-int OGGConfigVideo::close_event()
-{
- set_done(0);
- return 1;
-}
-
-OGGTheoraBitrate::OGGTheoraBitrate(int x, int y, OGGConfigVideo *gui)
- : BC_TextBox(x, y, 100, 1, gui->asset->theora_bitrate)
-{
- this->gui = gui;
-}
-
-
-int OGGTheoraBitrate::handle_event()
-{
- // TODO: MIN / MAX check
- gui->asset->theora_bitrate = atol(get_text());
- return 1;
-};
-
-
-
-
-OGGTheoraFixedBitrate::OGGTheoraFixedBitrate(int x, int y, OGGConfigVideo *gui)
- : BC_Radial(x, y, gui->asset->theora_fix_bitrate, _("Fixed bitrate"))
-{
- this->gui = gui;
-}
-
-int OGGTheoraFixedBitrate::handle_event()
-{
- update(1);
- gui->asset->theora_fix_bitrate = 1;
- gui->fixed_quality->update(0);
- return 1;
-};
-
-OGGTheoraFixedQuality::OGGTheoraFixedQuality(int x, int y, OGGConfigVideo *gui)
- : BC_Radial(x, y, !gui->asset->theora_fix_bitrate, _("Fixed quality"))
-{
- this->gui = gui;
-}
-
-int OGGTheoraFixedQuality::handle_event()
-{
- update(1);
- gui->asset->theora_fix_bitrate = 0;
- gui->fixed_bitrate->update(0);
- return 1;
-};
-
-OGGTheoraKeyframeFrequency::OGGTheoraKeyframeFrequency(int x, int y, OGGConfigVideo *gui)
- : BC_TumbleTextBox(gui,
- (int64_t)gui->asset->theora_keyframe_frequency,
- (int64_t)1,
- (int64_t)500,
- x,
- y,
- 40)
-{
- this->gui = gui;
-}
-
-int OGGTheoraKeyframeFrequency::handle_event()
-{
- gui->asset->theora_keyframe_frequency = atol(get_text());
- return 1;
-}
-
-OGGTheoraKeyframeForceFrequency::OGGTheoraKeyframeForceFrequency(int x, int y, OGGConfigVideo *gui)
- : BC_TumbleTextBox(gui,
- (int64_t)gui->asset->theora_keyframe_frequency,
- (int64_t)1,
- (int64_t)500,
- x,
- y,
- 40)
-{
- this->gui = gui;
-}
-
-int OGGTheoraKeyframeForceFrequency::handle_event()
-{
- gui->asset->theora_keyframe_frequency = atol(get_text());
- return 1;
-}
-
-
-OGGTheoraSharpness::OGGTheoraSharpness(int x, int y, OGGConfigVideo *gui)
- : BC_TumbleTextBox(gui,
- (int64_t)gui->asset->theora_sharpness,
- (int64_t)0,
- (int64_t)2,
- x,
- y,
- 40)
-{
- this->gui = gui;
-}
-
-int OGGTheoraSharpness::handle_event()
-{
- gui->asset->theora_sharpness = atol(get_text());
- return 1;
-}
-
-
-PackagingEngineOGG::PackagingEngineOGG()
-{
- packages = 0;
- default_asset = 0;
-}
-
-PackagingEngineOGG::~PackagingEngineOGG()
-{
- if(packages)
- {
- for(int i = 0; i < total_packages; i++)
- delete packages[i];
- delete [] packages;
- }
- if (default_asset)
- default_asset->remove_user();
-}
-
-
-
-int PackagingEngineOGG::create_packages_single_farm(
- EDL *edl,
- Preferences *preferences,
- Asset *default_asset,
- double total_start,
- double total_end)
-{
- this->total_start = total_start;
- this->total_end = total_end;
- this->edl = edl;
-
- this->preferences = preferences;
-
-// We make A COPY of the asset, because we set audio_data = 0 on local asset which is the same copy as default_asset...
-// Should be taken care of somewhere else actually
- this->default_asset = new Asset(*default_asset);
-
- audio_start = Units::to_int64(total_start * default_asset->sample_rate);
- video_start = Units::to_int64(total_start * default_asset->frame_rate);
- audio_position = audio_start;
- video_position = video_start;
- audio_end = Units::to_int64(total_end * default_asset->sample_rate);
- video_end = Units::to_int64(total_end * default_asset->frame_rate);
- current_package = 0;
-
- double total_len = total_end - total_start;
-//printf("PackageDispatcher::create_packages: %f / %d = %f\n", total_len, total_packages, package_len);
-
- total_packages = 0;
- if (default_asset->audio_data)
- total_packages++;
- if (default_asset->video_data)
- total_packages += preferences->renderfarm_job_count;
-
- packages = new RenderPackage*[total_packages];
-
- int local_current_package = 0;
- if (default_asset->audio_data)
- {
- packages[local_current_package] = new RenderPackage;
- snprintf(packages[current_package]->path,
- sizeof(packages[current_package]->path),
- "%s.audio", default_asset->path);
- local_current_package++;
- }
-
- if (default_asset->video_data)
- {
- video_package_len = (total_len) / preferences->renderfarm_job_count;
- int current_number; // The number being injected into the filename.
- int number_start; // Character in the filename path at which the number begins
- int total_digits; // Total number of digits including padding the user specified.
-
- Render::get_starting_number(default_asset->path,
- current_number,
- number_start,
- total_digits,
- 3);
-
- for(int i = 0; i < preferences->renderfarm_job_count; i++)
- {
- RenderPackage *package = packages[local_current_package] = new RenderPackage;
- Render::create_filename(package->path,
- default_asset->path,
- current_number,
- total_digits,
- number_start);
- current_number++;
- local_current_package++;
- }
- }
- return 0;
-}
-
-RenderPackage* PackagingEngineOGG::get_package_single_farm(double frames_per_second,
- int client_number,
- int use_local_rate)
-{
-
-//printf("PackageDispatcher::get_package %ld %ld %ld %ld\n", audio_position, video_position, audio_end, video_end);
- if (current_package == total_packages)
- return 0;
-
- RenderPackage *result = 0;
- if (current_package == 0 && default_asset->audio_data)
- {
- result = packages[0];
- result->audio_start = audio_start;
- result->video_start = video_start;
- result->audio_end = audio_end;
- result->video_end = video_end;
- result->audio_do = 1;
- result->video_do = 0;
- } else if (default_asset->video_data)
- {
- // Do not do any scaling according to node speed, so we know we can get evenly distributed 'forced' keyframes
- result = packages[current_package];
- result->audio_do = 0;
- result->video_do = 1;
-
- result->audio_start = audio_position;
- result->video_start = video_position;
- result->audio_end = audio_position +
- Units::round(video_package_len * default_asset->sample_rate);
- result->video_end = video_position +
- Units::round(video_package_len * default_asset->frame_rate);
-
-// Last package... take it all!
- if (current_package == total_packages -1 )
- {
- result->audio_end = audio_end;
- result->video_end = video_end;
- }
-
- audio_position = result->audio_end;
- video_position = result->video_end;
-
- }
-
- current_package ++;
- return result;
-
-}
-
-void PackagingEngineOGG::get_package_paths(ArrayList<char*> *path_list)
-{
- for(int i = 0; i < total_packages; i++)
- {
- path_list->append(strdup(packages[i]->path));
- }
-// We will mux to the the final file at the end!
- path_list->append(strdup(default_asset->path));
- path_list->set_free();
-}
-
-int64_t PackagingEngineOGG::get_progress_max()
-{
- return Units::to_int64(default_asset->sample_rate *
- (total_end - total_start)) * 2+
- Units::to_int64(preferences->render_preroll *
- total_packages *
- default_asset->sample_rate);
-}
-
-int PackagingEngineOGG::packages_are_done()
-{
-
-
-// Mux audio and video into one file
-
-// First fix our asset... have to workaround the bug of corruption of local asset
-// Render::check_asset(edl, *default_asset);
-
- Asset *video_asset = 0, *audio_asset = 0;
- File *audio_file_gen = 0, *video_file_gen = 0;
- FileOGG *video_file = 0, *audio_file = 0;
- ogg_stream_state audio_in_stream, video_in_stream;
-
- int local_current_package = 0;
- if (default_asset->audio_data)
- {
- audio_asset = new Asset(packages[local_current_package]->path);
- audio_asset->format = FILE_OGG;
- local_current_package++;
-
- audio_file_gen = new File();
- audio_file_gen->open_file(preferences, audio_asset, 1, 0);
- audio_file = (FileOGG*) audio_file_gen->file;
- ogg_stream_init(&audio_in_stream, audio_file->tf->vo.serialno);
- audio_file->ogg_seek_to_databegin(audio_file->tf->audiosync, audio_file->tf->vo.serialno);
- }
-
- if (default_asset->video_data)
- {
- video_asset = new Asset(packages[local_current_package]->path);
- video_asset->format = FILE_OGG;
- local_current_package++;
-
- video_file_gen = new File();
- video_file_gen->open_file(preferences, video_asset, 1, 0);
- video_file = (FileOGG*) video_file_gen->file;
- ogg_stream_init(&video_in_stream, video_file->tf->to.serialno);
- video_file->ogg_seek_to_databegin(video_file->tf->videosync, video_file->tf->to.serialno);
- }
-
-// Output file
- File *output_file_gen = new File();
- output_file_gen->open_file(preferences, default_asset, 0, 1);
- FileOGG *output_file = (FileOGG*) output_file_gen->file;
-
- //ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */
- ogg_packet op; /* one raw packet of data for decode */
-
-
- int audio_ready = default_asset->audio_data;
- int video_ready = default_asset->video_data;
- int64_t video_packetno = 1;
- int64_t audio_packetno = 1;
- int64_t frame_offset = 0;
- int64_t current_frame = 0;
- while ((default_asset->audio_data && audio_ready) || (default_asset->video_data && video_ready))
- {
- if (video_ready)
- {
- while (ogg_stream_packetpeek(&video_in_stream, NULL) != 1) // get as many pages as needed for one package
- {
- if (!video_file->ogg_get_next_page(video_file->tf->videosync, video_file->tf->to.serialno, &video_file->tf->videopage))
- {
- // We are at the end of our file, see if it is more and open more if there is
- if (local_current_package < total_packages)
- {
- frame_offset = current_frame +1;
- ogg_stream_clear(&video_in_stream);
- video_file_gen->close_file();
- delete video_file_gen;
- if( video_asset ) video_asset->remove_user();
- video_asset = new Asset(packages[local_current_package]->path);
- video_asset->format = FILE_OGG;
- local_current_package++;
-
- video_file_gen = new File();
- video_file_gen->open_file(preferences, video_asset, 1, 0);
- video_file = (FileOGG*) video_file_gen->file;
- ogg_stream_init(&video_in_stream, video_file->tf->to.serialno);
- video_file->ogg_seek_to_databegin(video_file->tf->videosync, video_file->tf->to.serialno);
-
- } else
- video_ready = 0;
- break;
- }
- ogg_stream_pagein(&video_in_stream, &video_file->tf->videopage);
- }
- while (ogg_stream_packetpeek(&video_in_stream, NULL) == 1) // get all packets out of the page
- {
- ogg_stream_packetout(&video_in_stream, &op);
- if (local_current_package != total_packages) // keep it from closing the stream
- op.e_o_s = 0;
- if (video_packetno != 1) // if this is not the first video package do not start with b_o_s
- op.b_o_s = 0;
- else
- op.b_o_s = 1;
- op.packetno = video_packetno;
- video_packetno ++;
- int64_t granulepos = op.granulepos;
- if (granulepos != -1)
- {
- // Fix granulepos!
- int64_t rel_iframe = granulepos >> video_file->theora_keyframe_granule_shift;
- int64_t rel_pframe = granulepos - (rel_iframe << video_file->theora_keyframe_granule_shift);
- int64_t rel_current_frame = rel_iframe + rel_pframe;
- current_frame = frame_offset + rel_current_frame;
- int64_t abs_iframe = current_frame - rel_pframe;
-
- op.granulepos = (abs_iframe << video_file->theora_keyframe_granule_shift) + rel_pframe;
-
-// printf("iframe: %i, pframe: %i, granulepos: %i, op.packetno %lli, abs_iframe: %i\n", rel_iframe, rel_pframe, granulepos, op.packetno, abs_iframe);
-
- }
- ogg_stream_packetin (&output_file->tf->to, &op);
- output_file->tf->v_pkg++;
- }
- }
- if (audio_ready)
- {
- while (ogg_stream_packetpeek(&audio_in_stream, NULL) != 1) // get as many pages as needed for one package
- {
- if (!audio_file->ogg_get_next_page(audio_file->tf->audiosync, audio_file->tf->vo.serialno, &audio_file->tf->audiopage))
- {
- audio_ready = 0;
- break;
- }
- ogg_stream_pagein(&audio_in_stream, &audio_file->tf->audiopage);
- }
- while (ogg_stream_packetpeek(&audio_in_stream, NULL) == 1) // get all packets out of the page
- {
- ogg_stream_packetout(&audio_in_stream, &op);
- ogg_stream_packetin (&output_file->tf->vo, &op);
- audio_packetno++;
- output_file->tf->a_pkg++;
- }
- }
-
- output_file->flush_ogg(0);
-
-
- }
-
-// flush_ogg(1) is called on file closing time...
-// output_file->flush_ogg(1);
-
-// Just prevent thet write_samples and write_frames are called
- output_file->final_write = 0;
-
- if (default_asset->audio_data)
- {
- ogg_stream_clear(&audio_in_stream);
- audio_file_gen->close_file();
- delete audio_file_gen;
- if( audio_asset )
- audio_asset->remove_user();
- }
- if (default_asset->video_data)
- {
- ogg_stream_clear(&video_in_stream);
- video_file_gen->close_file();
- delete video_file_gen;
- if( video_asset )
- video_asset->remove_user();
- }
-
- output_file_gen->close_file();
- delete output_file_gen;
-
-// don't delete the temp files, for now
-// for(int i = 0; i < total_packages; i++)
-// unlink(packages[i]->path);
-
- return 0;
-}
-
-
-
+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
- * 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 2 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifndef FILEOGG_H
-#define FILEOGG_H
-
-#include "edl.inc"
-#include "filebase.h"
-#include "file.inc"
-#include "packagingengine.h"
-
-#include <theora/theora.h>
-#include <vorbis/codec.h>
-#include <vorbis/vorbisenc.h>
-
-
-#include <libdv/dv.h>
-
-/* This code was aspired by ffmpeg2theora */
-
-typedef struct
-{
- ogg_sync_state sync;
- off_t file_bufpos; // position of the start of the buffer inside the file
- off_t file_pagepos; // position of the page that will be next read
- off_t file_pagepos_found; // position of last page that was returned (in seeking operations)
- int wlen;
-} sync_window_t;
-
-typedef struct
-{
- ogg_page audiopage;
- ogg_page videopage;
-
- double audiotime;
- double videotime;
- ogg_int64_t audio_bytesout;
- ogg_int64_t video_bytesout;
-
- ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */
- ogg_packet op; /* one raw packet of data for decode */
-
- theora_info ti;
- theora_comment tc;
- theora_state td;
-
- vorbis_info vi; /* struct that stores all the static vorbis bitstream settings */
- vorbis_comment vc; /* struct that stores all the user comments */
- vorbis_dsp_state vd; /* central working state for the packet<->PCM encoder/decoder */
- vorbis_block vb; /* local working space for packet<->PCM encode/decode */
-
- /* used for muxing */
- ogg_stream_state to; /* take physical pages, weld into a logical
- * stream of packets */
- ogg_stream_state vo; /* take physical pages, weld into a logical
- * stream of packets */
-
- int apage_valid;
- int vpage_valid;
- unsigned char *apage;
- unsigned char *vpage;
- int vpage_len;
- int apage_len;
- int vpage_buffer_length;
- int apage_buffer_length;
-
-
-// stuff needed for reading only
- sync_window_t *audiosync;
- sync_window_t *videosync;
-
- //to do some manual page flusing
- int v_pkg;
- int a_pkg;
-
-}
-theoraframes_info_t;
-
-class FileOGG : public FileBase
-{
-friend class PackagingEngineOGG;
-public:
- FileOGG(Asset *asset, File *file);
- ~FileOGG();
-
- static void get_parameters(BC_WindowBase *parent_window,
- Asset *asset, BC_WindowBase* &format_window,
- int audio_options, int video_options, EDL *edl);
-
- int reset_parameters_derived();
- int open_file(int rd, int wr);
- static int check_sig(Asset *asset);
- int close_file();
- int close_file_derived();
- int64_t get_video_position();
- int64_t get_audio_position();
- int set_video_position(int64_t x);
- int set_audio_position(int64_t x);
- int colormodel_supported(int colormodel);
- int get_best_colormodel(Asset *asset, int driver);
- int write_samples(double **buffer, int64_t len);
- int write_frames(VFrame ***frames, int len);
- int read_samples(double *buffer, int64_t len);
- int read_frame(VFrame *frame);
-
-private:
- int write_samples_vorbis(double **buffer, int64_t len, int e_o_s);
- int write_frames_theora(VFrame ***frames, int len, int e_o_s);
- void flush_ogg(int e_o_s);
- int write_audio_page();
- int write_video_page();
-
- FILE *stream;
- off_t file_length;
-
- theoraframes_info_t *tf;
- VFrame *temp_frame;
- Mutex *flush_lock;
-
- off_t filedata_begin;
-
- int ogg_get_last_page(sync_window_t *sw, long serialno, ogg_page *og);
- int ogg_get_prev_page(sync_window_t *sw, long serialno, ogg_page *og);
- int ogg_get_first_page(sync_window_t *sw, long serialno, ogg_page *og);
- int ogg_get_next_page(sync_window_t *sw, long serialno, ogg_page *og);
- int ogg_sync_and_get_next_page(sync_window_t *sw, long serialno, ogg_page *og);
-
- int ogg_get_page_of_sample(sync_window_t *sw, long serialno, ogg_page *og, int64_t sample);
- int ogg_seek_to_sample(sync_window_t *sw, long serialno, int64_t sample);
- int ogg_decode_more_samples(sync_window_t *sw, long serialno);
-
- int ogg_get_page_of_frame(sync_window_t *sw, long serialno, ogg_page *og, int64_t frame);
- int ogg_seek_to_keyframe(sync_window_t *sw, long serialno, int64_t frame, int64_t *position);
- int ogg_seek_to_databegin(sync_window_t *sw, long serialno);
-
-
- int64_t start_sample; // first and last sample inside this file
- int64_t last_sample;
- int64_t start_frame; // first and last frame inside this file
- int64_t last_frame;
-
-
- int64_t ogg_sample_position; // what will be the next sample taken from vorbis decoder
- int64_t next_sample_position; // what is the next sample read_samples must deliver
-
- int move_history(int from, int to, int len);
-
- float **pcm_history;
-#ifndef HISTORY_MAX
-#define HISTORY_MAX 0x100000
-#endif
- int64_t history_start;
- int64_t history_size;
-
- int theora_cmodel;
- int64_t ogg_frame_position; // LAST decoded frame position
- int64_t next_frame_position; // what is the next sample read_frames must deliver
- char theora_keyframe_granule_shift;
- int final_write;
-};
-
-class OGGConfigAudio;
-class OGGConfigVideo;
-
-class OGGVorbisFixedBitrate : public BC_Radial
-{
-public:
- OGGVorbisFixedBitrate(int x, int y, OGGConfigAudio *gui);
- int handle_event();
- OGGConfigAudio *gui;
-};
-
-class OGGVorbisVariableBitrate : public BC_Radial
-{
-public:
- OGGVorbisVariableBitrate(int x, int y, OGGConfigAudio *gui);
- int handle_event();
- OGGConfigAudio *gui;
-};
-
-class OGGVorbisMinBitrate : public BC_TextBox
-{
-public:
- OGGVorbisMinBitrate(int x,
- int y,
- OGGConfigAudio *gui,
- char *text);
- int handle_event();
- OGGConfigAudio *gui;
-};
-
-class OGGVorbisMaxBitrate : public BC_TextBox
-{
-public:
- OGGVorbisMaxBitrate(int x,
- int y,
- OGGConfigAudio *gui,
- char *text);
- int handle_event();
- OGGConfigAudio *gui;
-};
-
-class OGGVorbisAvgBitrate : public BC_TextBox
-{
-public:
- OGGVorbisAvgBitrate(int x,
- int y,
- OGGConfigAudio *gui,
- char *text);
- int handle_event();
- OGGConfigAudio *gui;
-};
-
-
-class OGGConfigAudio: public BC_Window
-{
-public:
- OGGConfigAudio(BC_WindowBase *parent_window, Asset *asset);
- ~OGGConfigAudio();
-
- void create_objects();
- int close_event();
-
- Asset *asset;
- OGGVorbisFixedBitrate *fixed_bitrate;
- OGGVorbisVariableBitrate *variable_bitrate;
-private:
- BC_WindowBase *parent_window;
- char string[BCTEXTLEN];
-};
-
-
-class OGGTheoraBitrate : public BC_TextBox
-{
-public:
- OGGTheoraBitrate(int x, int y, OGGConfigVideo *gui);
- int handle_event();
- OGGConfigVideo *gui;
-};
-
-class OGGTheoraKeyframeFrequency : public BC_TumbleTextBox
-{
-public:
- OGGTheoraKeyframeFrequency(int x, int y, OGGConfigVideo *gui);
- int handle_event();
- OGGConfigVideo *gui;
-};
-
-class OGGTheoraKeyframeForceFrequency : public BC_TumbleTextBox
-{
-public:
- OGGTheoraKeyframeForceFrequency(int x, int y, OGGConfigVideo *gui);
- int handle_event();
- OGGConfigVideo *gui;
-};
-
-class OGGTheoraSharpness : public BC_TumbleTextBox
-{
-public:
- OGGTheoraSharpness(int x, int y, OGGConfigVideo *gui);
- int handle_event();
- OGGConfigVideo *gui;
-};
-
-class OGGTheoraFixedBitrate : public BC_Radial
-{
-public:
- OGGTheoraFixedBitrate(int x, int y, OGGConfigVideo *gui);
- int handle_event();
- OGGConfigVideo *gui;
-};
-
-class OGGTheoraFixedQuality : public BC_Radial
-{
-public:
- OGGTheoraFixedQuality(int x, int y, OGGConfigVideo *gui);
- int handle_event();
- OGGConfigVideo *gui;
-};
-
-
-
-class OGGConfigVideo: public BC_Window
-{
-public:
- OGGConfigVideo(BC_WindowBase *parent_window, Asset *asset);
- ~OGGConfigVideo();
-
- void create_objects();
- int close_event();
-
- OGGTheoraFixedBitrate *fixed_bitrate;
- OGGTheoraFixedQuality *fixed_quality;
- Asset *asset;
-private:
- BC_WindowBase *parent_window;
-};
-
-class PackagingEngineOGG : public PackagingEngine
-{
-public:
- PackagingEngineOGG();
- ~PackagingEngineOGG();
- int create_packages_single_farm(
- EDL *edl,
- Preferences *preferences,
- Asset *default_asset,
- double total_start,
- double total_end);
- RenderPackage* get_package_single_farm(double frames_per_second,
- int client_number,
- int use_local_rate);
- int64_t get_progress_max();
- void get_package_paths(ArrayList<char*> *path_list);
- int packages_are_done();
-
-private:
- EDL *edl;
-
- RenderPackage **packages;
- int total_packages;
- double video_package_len; // Target length of a single package
-
- Asset *default_asset;
- Preferences *preferences;
- int current_package;
- double total_start;
- double total_end;
- int64_t audio_position;
- int64_t video_position;
- int64_t audio_start;
- int64_t video_start;
- int64_t audio_end;
- int64_t video_end;
-
-};
-
-
-#endif
+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
- * 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 2 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "asset.h"
-#include "bcsignals.h"
-#include "byteorder.h"
-#include "clip.h"
-#include "file.h"
-#include "filevorbis.h"
-#include "guicast.h"
-#include "language.h"
-#include "mainerror.h"
-#include "mwindow.inc"
-#include "mainerror.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-//suppress noref warning
-void *vorbis1_ov_callbacks[] = {
- &OV_CALLBACKS_DEFAULT, &OV_CALLBACKS_NOCLOSE,
- &OV_CALLBACKS_STREAMONLY, &OV_CALLBACKS_STREAMONLY_NOCLOSE,
-};
-
-FileVorbis::FileVorbis(Asset *asset, File *file)
- : FileBase(asset, file)
-{
- reset_parameters();
- if(asset->format == FILE_UNKNOWN) asset->format = FILE_VORBIS;
- asset->byte_order = 0;
-}
-
-FileVorbis::~FileVorbis()
-{
- close_file();
-}
-
-void FileVorbis::get_parameters(BC_WindowBase *parent_window,
- Asset *asset, BC_WindowBase* &format_window,
- int audio_options, int video_options, EDL *edl)
-{
- if(audio_options)
- {
- VorbisConfigAudio *window = new VorbisConfigAudio(parent_window, asset);
- format_window = window;
- window->create_objects();
- window->run_window();
- delete window;
- }
-}
-
-int FileVorbis::check_sig(Asset *asset)
-{
- FILE *fd = fopen(asset->path, "rb");
- OggVorbis_File vf;
-
-// Test for Quicktime since OGG misinterprets it
- if(fd)
- {
- fseek(fd, 4, SEEK_SET);
- char data[4];
- (void)fread(data, 4, 1, fd);
- if(data[0] == 'm' &&
- data[1] == 'd' &&
- data[2] == 'a' &&
- data[3] == 't')
- {
- fclose(fd);
- return 0;
- }
-
- fseek(fd, 0, SEEK_SET);
-
- if(ov_open(fd, &vf, NULL, 0) < 0)
- {
- // OGG failed. Close file handle manually.
- ov_clear(&vf);
- if(fd) fclose(fd);
- return 0;
- }
- else
- {
- ov_clear(&vf);
- return 1;
- }
- }
-
- return 0;
-}
-
-int FileVorbis::reset_parameters_derived()
-{
- fd = 0;
- bzero(&vf, sizeof(vf));
- return 0;
-}
-
-
-int FileVorbis::open_file(int rd, int wr)
-{
-
- int result = 0;
-
-//printf("FileVorbis::open_file 1\n");
- if(rd)
- {
-//printf("FileVorbis::open_file 1\n");
- if(!(fd = fopen(asset->path, "rb")))
- {
- eprintf("Error while opening \"%s\" for reading. \n%m\n", asset->path);
- result = 1;
- }
- else
- {
-//printf("FileVorbis::open_file 2 %p %p\n", fd, vf);
- if(ov_open(fd, &vf, NULL, 0) < 0)
- {
- eprintf(_("FileVorbis::open_file %s: invalid bitstream.\n"), asset->path);
- result = 1;
- }
- else
- {
-//printf("FileVorbis::open_file 1\n");
- vorbis_info *vi = ov_info(&vf, -1);
- asset->channels = vi->channels;
- if(!asset->sample_rate)
- asset->sample_rate = vi->rate;
-//printf("FileVorbis::open_file 1\n");
- asset->audio_length = ov_pcm_total(&vf,-1);
-//printf("FileVorbis::open_file 1\n");
- asset->audio_data = 1;
-// printf("FileVorbis::open_file 1 %d %d %d\n",
-// asset->channels,
-// asset->sample_rate,
-// asset->audio_length);
- }
- }
- }
-
- if(wr)
- {
- if(!(fd = fopen(asset->path, "wb")))
- {
- eprintf(_("Error while opening \"%s\" for writing. \n%m\n"), asset->path);
- result = 1;
- }
- else
- {
- vorbis_info_init(&vi);
- if(!asset->vorbis_vbr)
- result = vorbis_encode_init(&vi,
- asset->channels,
- asset->sample_rate,
- asset->vorbis_max_bitrate,
- asset->vorbis_bitrate,
- asset->vorbis_min_bitrate);
- else
- {
- result = vorbis_encode_setup_managed(&vi,
- asset->channels,
- asset->sample_rate,
- asset->vorbis_max_bitrate,
- asset->vorbis_bitrate,
- asset->vorbis_min_bitrate);
- result |= vorbis_encode_ctl(&vi, OV_ECTL_RATEMANAGE_AVG, NULL);
- result |= vorbis_encode_setup_init(&vi);
- }
-
- if(!result)
- {
- vorbis_analysis_init(&vd, &vi);
- vorbis_block_init(&vd, &vb);
- vorbis_comment_init(&vc);
- srand(time(NULL));
- ogg_stream_init(&os, rand());
-
- ogg_packet header;
- ogg_packet header_comm;
- ogg_packet header_code;
- vorbis_analysis_headerout(&vd,
- &vc,
- &header,
- &header_comm,
- &header_code);
- ogg_stream_packetin(&os,
- &header);
- ogg_stream_packetin(&os,
- &header_comm);
- ogg_stream_packetin(&os,
- &header_code);
-
- while(1)
- {
- int result = ogg_stream_flush(&os, &og);
- if(result == 0) break;
- fwrite(og.header, 1, og.header_len, fd);
- fwrite(og.body, 1, og.body_len, fd);
- }
- }
- }
- }
-
-//printf("FileVorbis::open_file 2\n");
- return result;
-}
-
-#define FLUSH_VORBIS \
-while(vorbis_analysis_blockout(&vd, &vb) == 1) \
-{ \
- vorbis_analysis(&vb, NULL); \
- vorbis_bitrate_addblock(&vb); \
- while(vorbis_bitrate_flushpacket(&vd, &op)) \
- { \
- ogg_stream_packetin(&os, &op); \
- while(1) \
- { \
- int result = ogg_stream_pageout(&os, &og); \
- if(!result) break; \
- fwrite(og.header, 1, og.header_len, fd); \
- fwrite(og.body, 1, og.body_len, fd); \
- if(ogg_page_eos(&og)) break; \
- } \
- } \
-}
-
-
-int FileVorbis::close_file_derived()
-{
- if(fd)
- {
- if(file->wr)
- {
- vorbis_analysis_wrote(&vd, 0);
- FLUSH_VORBIS
-
- ogg_stream_clear(&os);
- vorbis_block_clear(&vb);
- vorbis_dsp_clear(&vd);
- vorbis_comment_clear(&vc);
- vorbis_info_clear(&vi);
- fclose(fd);
- }
-
- if(file->rd)
- {
-// This also closes the file handle.
- ov_clear(&vf);
- }
- fd = 0;
- }
-
- return 0;
-}
-
-
-int FileVorbis::write_samples(double **buffer, int64_t len)
-{
- if(!fd) return 0;
-
- float **vorbis_buffer = vorbis_analysis_buffer(&vd, len);
- for(int i = 0; i < asset->channels; i++)
- {
- float *output = vorbis_buffer[i];
- double *input = buffer[i];
- for(int j = 0; j < len; j++)
- {
- output[j] = input[j];
- }
- }
-
- vorbis_analysis_wrote(&vd, len);
- FLUSH_VORBIS
-
- return 0;
-}
-
-int FileVorbis::read_samples(double *buffer, int64_t len)
-{
- if(!fd) return 0;
-
-// printf("FileVorbis::read_samples 1 %d %d %d %d\n",
-// history_start,
-// history_size,
-// file->current_sample,
-// len);
- float **vorbis_output;
- int bitstream;
- int accumulation = 0;
-
-
- update_pcm_history(len);
-
-
-// Fill history buffer
- if(decode_start != decode_end)
- {
- ov_pcm_seek(&vf, decode_start);
- decode_end = decode_start;
- }
-
- while(accumulation < decode_len)
- {
- int result = ov_read_float(&vf,
- &vorbis_output,
- decode_len - accumulation,
- &bitstream);
-//printf("FileVorbis::read_samples 1 %d %d %d\n", result, len, accumulation);
- if(!result) break;
-
- append_history(vorbis_output, result);
- accumulation += result;
- }
-
-
- read_history(buffer,
- file->current_sample,
- file->current_channel,
- len);
-
-// printf("FileVorbis::read_samples 2 %d %d %d %d\n",
-// history_start,
-// history_size,
-// file->current_sample,
-// len);
-
- return 0;
-}
-
-
-
-
-
-
-
-
-
-
-VorbisConfigAudio::VorbisConfigAudio(BC_WindowBase *parent_window,
- Asset *asset)
- : BC_Window(_(PROGRAM_NAME ": Audio Compression"),
- parent_window->get_abs_cursor_x(1),
- parent_window->get_abs_cursor_y(1),
- 350,
- 170,
- -1,
- -1,
- 0,
- 0,
- 1)
-{
- this->parent_window = parent_window;
- this->asset = asset;
-}
-
-VorbisConfigAudio::~VorbisConfigAudio()
-{
-}
-
-void VorbisConfigAudio::create_objects()
-{
- int x = 10, y = 10;
- int x1 = 150;
- char string[BCTEXTLEN];
-
- lock_window("VorbisConfigAudio::create_objects");
- add_tool(fixed_bitrate = new VorbisFixedBitrate(x, y, this));
- add_tool(variable_bitrate = new VorbisVariableBitrate(x1, y, this));
-
- y += 30;
- sprintf(string, "%d", asset->vorbis_min_bitrate);
- add_tool(new BC_Title(x, y, _("Min bitrate:")));
- add_tool(new VorbisMinBitrate(x1, y, this, string));
-
- y += 30;
- add_tool(new BC_Title(x, y, _("Avg bitrate:")));
- sprintf(string, "%d", asset->vorbis_bitrate);
- add_tool(new VorbisAvgBitrate(x1, y, this, string));
-
- y += 30;
- add_tool(new BC_Title(x, y, _("Max bitrate:")));
- sprintf(string, "%d", asset->vorbis_max_bitrate);
- add_tool(new VorbisMaxBitrate(x1, y, this, string));
-
-
- add_subwindow(new BC_OKButton(this));
- show_window();
- flush();
- unlock_window();
-}
-
-int VorbisConfigAudio::close_event()
-{
- set_done(0);
- return 1;
-}
-
-
-
-
-
-VorbisFixedBitrate::VorbisFixedBitrate(int x, int y, VorbisConfigAudio *gui)
- : BC_Radial(x, y, !gui->asset->vorbis_vbr, _("Fixed bitrate"))
-{
- this->gui = gui;
-}
-int VorbisFixedBitrate::handle_event()
-{
- gui->asset->vorbis_vbr = 0;
- gui->variable_bitrate->update(0);
- return 1;
-}
-
-VorbisVariableBitrate::VorbisVariableBitrate(int x, int y, VorbisConfigAudio *gui)
- : BC_Radial(x, y, gui->asset->vorbis_vbr, _("Variable bitrate"))
-{
- this->gui = gui;
-}
-int VorbisVariableBitrate::handle_event()
-{
- gui->asset->vorbis_vbr = 1;
- gui->fixed_bitrate->update(0);
- return 1;
-}
-
-
-VorbisMinBitrate::VorbisMinBitrate(int x,
- int y,
- VorbisConfigAudio *gui,
- char *text)
- : BC_TextBox(x, y, 180, 1, text)
-{
- this->gui = gui;
-}
-int VorbisMinBitrate::handle_event()
-{
- gui->asset->vorbis_min_bitrate = atol(get_text());
- return 1;
-}
-
-
-
-VorbisMaxBitrate::VorbisMaxBitrate(int x,
- int y,
- VorbisConfigAudio *gui,
- char *text)
- : BC_TextBox(x, y, 180, 1, text)
-{
- this->gui = gui;
-}
-int VorbisMaxBitrate::handle_event()
-{
- gui->asset->vorbis_max_bitrate = atol(get_text());
- return 1;
-}
-
-
-
-VorbisAvgBitrate::VorbisAvgBitrate(int x, int y, VorbisConfigAudio *gui, char *text)
- : BC_TextBox(x, y, 180, 1, text)
-{
- this->gui = gui;
-}
-int VorbisAvgBitrate::handle_event()
-{
- gui->asset->vorbis_bitrate = atol(get_text());
- return 1;
-}
-
-
-
-
+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
- * 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 2 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifndef FILEVORBIS_H
-#define FILEVORBIS_H
-
-#include "edl.inc"
-#include "file.inc"
-#include "filebase.h"
-#include "vorbis/vorbisenc.h"
-#include "vorbis/vorbisfile.h"
-
-
-
-
-
-
-class FileVorbis : public FileBase
-{
-public:
- FileVorbis(Asset *asset, File *file);
- ~FileVorbis();
-
- static void get_parameters(BC_WindowBase *parent_window,
- Asset *asset, BC_WindowBase* &format_window,
- int audio_options, int video_options, EDL *edl);
- int reset_parameters_derived();
-
- static int check_sig(Asset *asset);
- int open_file(int rd, int wr);
- int close_file_derived();
- int write_samples(double **buffer,
- int64_t len);
-
- int read_samples(double *buffer, int64_t len);
-
-// Decoding
- OggVorbis_File vf;
- FILE *fd;
-
-// Encoding
- vorbis_info vi;
- vorbis_comment vc;
- vorbis_dsp_state vd;
- vorbis_block vb;
- ogg_stream_state os;
- ogg_page og;
- ogg_packet op;
-};
-
-
-class VorbisConfigAudio;
-
-
-class VorbisFixedBitrate : public BC_Radial
-{
-public:
- VorbisFixedBitrate(int x, int y, VorbisConfigAudio *gui);
- int handle_event();
- VorbisConfigAudio *gui;
-};
-
-class VorbisVariableBitrate : public BC_Radial
-{
-public:
- VorbisVariableBitrate(int x, int y, VorbisConfigAudio *gui);
- int handle_event();
- VorbisConfigAudio *gui;
-};
-
-class VorbisMinBitrate : public BC_TextBox
-{
-public:
- VorbisMinBitrate(int x,
- int y,
- VorbisConfigAudio *gui,
- char *text);
- int handle_event();
- VorbisConfigAudio *gui;
-};
-
-class VorbisMaxBitrate : public BC_TextBox
-{
-public:
- VorbisMaxBitrate(int x,
- int y,
- VorbisConfigAudio *gui,
- char *text);
- int handle_event();
- VorbisConfigAudio *gui;
-};
-
-class VorbisAvgBitrate : public BC_TextBox
-{
-public:
- VorbisAvgBitrate(int x,
- int y,
- VorbisConfigAudio *gui,
- char *text);
- int handle_event();
- VorbisConfigAudio *gui;
-};
-
-class VorbisConfigAudio : public BC_Window
-{
-public:
- VorbisConfigAudio(BC_WindowBase *parent_window, Asset *asset);
- ~VorbisConfigAudio();
-
- void create_objects();
- int close_event();
-
- VorbisFixedBitrate *fixed_bitrate;
- VorbisVariableBitrate *variable_bitrate;
- BC_WindowBase *parent_window;
- char string[BCTEXTLEN];
- Asset *asset;
-};
-
-
-
-#endif
+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
- * 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 2 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifndef FILEVORBIS_INC
-#define FILEVORBIS_INC
-
-class FileVorbis;
-
-
-
-#endif
post_item(FILE_AMPEG);
post_item(FILE_VMPEG);
#endif
- post_item(FILE_VORBIS);
- post_item(FILE_OGG);
post_item(FILE_PCM);
}
static const char *shuttle_devs[] = {
"/dev/input/by-id/usb-Contour_Design_ShuttleXpress-event-if00",
"/dev/input/by-id/usb-Contour_Design_ShuttlePRO_v2-event-if00",
+ "/dev/input/by-id/usb-Contour_Design_ShuttlePro-event-if00",
};
int ret = sizeof(shuttle_devs) / sizeof(shuttle_devs[0]);
while( --ret >= 0 && stat(shuttle_devs[ret] , &st) );
}
}
+BC_WindowBase *Shuttle::owns(BC_WindowBase *wdw, Window win)
+{
+ if( wdw->win == win ) return wdw;
+ if( (wdw=wdw->top_level)->win == win ) return wdw;
+ for( int i=wdw->popups.size(); --i>=0; )
+ if( wdw->popups[i]->win == win ) return wdw;
+ return 0;
+}
int Shuttle::get_focused_window_translation()
{
this->msk = 0;
BC_WindowBase *wdw = 0;
int cin = -1;
- if( (wdw=mwindow->gui) && wdw->win == focus )
+ if( (wdw=owns(mwindow->gui, focus)) != 0 )
cin = FOCUS_MWINDOW;
- else if( (wdw=mwindow->awindow->gui) && wdw->win == focus )
+ else if( (wdw=owns(mwindow->awindow->gui, focus)) != 0 )
cin = FOCUS_AWINDOW;
- else if( (wdw=mwindow->cwindow->gui) && wdw->win == focus )
+ else if( (wdw=owns(mwindow->cwindow->gui, focus)) != 0 ) {
+ if( mwindow->cwindow->gui->canvas->get_fullscreen() )
+ wdw = mwindow->cwindow->gui->canvas->get_canvas();
cin = FOCUS_CWINDOW;
- else if( (wdw=mwindow->gui->mainmenu->load_file->thread->window) &&
+ }
+ else if( (wdw=mwindow->gui->mainmenu->load_file->thread->window) != 0 &&
wdw->win == focus )
cin = FOCUS_LOAD;
else {
while( --i >= 0 ) {
VWindow *vwdw = mwindow->vwindows[i];
if( !vwdw->is_running() ) continue;
- if( (wdw=vwdw->gui) && wdw->win == focus ) {
+ if( (wdw=owns(vwdw->gui, focus)) != 0 ) {
+ if( vwdw->gui->canvas->get_fullscreen() )
+ wdw = vwdw->gui->canvas->get_canvas();
cin = FOCUS_VIEWER; break;
}
}
int root_x = 0, root_y = 0, win_x = 0, win_y = 0, x = 0, y = 0;
unsigned int mask = 0, width = 0, height = 0, border_width = 0, depth = 0;
wdw->lock_window("Shuttle::get_focused_window_translation 1");
- if( XQueryPointer(wdw->display, focus, &root, &child,
+ if( XQueryPointer(wdw->top_level->display, focus, &root, &child,
&root_x, &root_y, &win_x, &win_y, &mask) ) {
if( !child ) {
if( wdw->active_menubar )
child = wdw->active_popup_menu->win;
else if( wdw->active_subwindow )
child = wdw->active_subwindow->win;
+ else
+ child = wdw->win;
}
- if( child )
- XGetGeometry(wdw->display, child, &root, &x, &y,
+ else
+ XGetGeometry(wdw->top_level->display, child, &root, &x, &y,
&width, &height, &border_width, &depth);
}
wdw->unlock_window();
static const char *probe();
void run();
int read_config_file();
+ static BC_WindowBase *owns(BC_WindowBase *wdw, Window win);
int done;
int failed;
#include "libswscale/swscale.h"
}
+#ifdef FFMPEG3
+#define url filename
+#else
+#define av_register_all(s)
+#define avfilter_register_all(s)
+#endif
+
int done = 0;
int64_t tm = 0, tn = 0;
fi
PKG_3RD([fftw],[auto],
- [fftw-3.3.7],
+ [fftw-3.3.8],
[ .libs/libfftw3.a \
libbench2/libbench2.a \
rdft/scalar/r2cb/.libs/librdft_scalar_r2cb.a \
[ . ])
PKG_3RD([opus],[auto],
- [opus-1.2.1],
+ [opus-1.3],
[ .libs/libopus.a ],
[ include ])
[ src/lib/openjp2 ])
PKG_3RD([libogg],[auto],
- [libogg-1.3.2],
+ [libogg-1.3.3],
[ src/.libs/libogg.a ],
[ include ])
[ . ])
PKG_3RD([libvorbis],[auto],
- [libvorbis-1.3.5],
+ [libvorbis-1.3.6],
[ lib/.libs/libvorbis.a \
lib/.libs/libvorbisenc.a \
lib/.libs/libvorbisfile.a ],
# [])
#
PKG_3RD([tiff],[auto],
- [tiff-4.0.9],
+ [tiff-4.0.10],
[ libtiff/.libs/libtiff.a \
libtiff/.libs/libtiffxx.a \
port/.libs/libport.a ],[
[ . ])
PKG_3RD([x265],[auto],
- [x265_2.9],
+ [x265_3.0],
[ libx265.a ],
[ . source ])
[ usr/local/lib/libsuil-0.a ],
[ usr/local/include ])
+PKG_3RD([libaom],[auto],
+ [libaom-v1.0.0],
+ [ usr/local/lib*/libaom*.a ],
+ [ usr/local/include ])
+
+PKG_3RD([libwebp],[auto],
+ [libwebp-1.0.2],
+ [ usr/local/lib*/libwebp*.a ],
+ [ usr/local/include ])
+
AC_SUBST(STATIC_PKGS)
AC_DEFUN([CHECK_ENABLE], [
AC_DEFUN([CHECK_LIB], [
if test "x$HAVE_$1" != "xno"; then
- if test "x$PKG_$1" = "x" -o "x$WANT_STATIC_BUILD" = "xno"; then
+ if test "x$PKG_$1" = "x" -o "x$WANT_STATIC_BUILD" = "xno" -a "x$PKG_$1" = "xauto"; then
AC_CHECK_LIB([$2], [$3], [HAVE_$1=yes], [HAVE_$1=no], [$4])
AC_SUBST([HAVE_$1])
if test "x$HAVE_$1" = "xyes"; then
CHECK_HEADERS([x264], [x264 headers], [stdint.h x264.h])
CHECK_LIB([x265], [x265], [x265_encoder_encode])
CHECK_HEADERS([x265], [x265 headers], [x265.h])
+CHECK_LIB([opus], [opus], [opus_multistream_decoder_create])
+CHECK_HEADERS([opus], [libopus headers], [opus/opus_multistream.h])
+CHECK_LIB([libaom], [aom], [aom_codec_version])
+CHECK_HEADERS([libaom], [libaom headers], [aom/aom.h])
+CHECK_LIB([libwebp], [webp], [WebPGetEncoderVersion])
+CHECK_HEADERS([libwebp], [libwebp headers], [webp/encode.h])
CHECK_LIB([a52dec], [a52], [a52_init])
CHECK_HEADERS([a52dec], [a52 headers], [a52.h])
CHECK_LIB([encore], [encore], [encore])
CHECK_LIB([audiofile], [audiofile], [afOpenFile])
CHECK_HEADERS([audiofile], [audiofile headers], [audiofile.h])])
-CHECK_WANT([OPUS], [auto], [use libopus], [
- CHECK_LIB([opus], [opus], [opus_multistream_decoder_create])
- CHECK_HEADERS([opus], [libopus headers], [opus/opus_multistream.h])])
-
CHECK_WANT([LV2], [auto], [use lv2], [
saved_CFLAGS="$CFLAGS"
CHECK_LIB([lilv], [lilv-0], [lilv_world_new])
BUILD_$1=0
AC_SUBST(BUILD_$1)
SHARED_LIBS+="$SHARED_$1"
- echo "AC_HELP_STRING([shared],[$1])"
])
AC_DEFUN([PKG_STATIC],[
PKG_PROVIDE([libuuid])
PKG_PROVIDE([libvorbis])
PKG_PROVIDE([mjpegtools])
+PKG_PROVIDE([libaom])
+PKG_PROVIDE([libwebp])
PKG_PROVIDE([openexr], [$WANT_OPENEXR])
PKG_PROVIDE([openjpeg])
PKG_PROVIDE([tiff])
PKG_PROVIDE([x264])
PKG_PROVIDE([x265])
PKG_PROVIDE([libvpx])
-PKG_PROVIDE([opus], [$WANT_OPUS])
+PKG_PROVIDE([opus])
PKG_PROVIDE([lv2], [$WANT_LV2])
PKG_PROVIDE([lilv], [$WANT_LV2])
PKG_PROVIDE([sratom], [$WANT_LV2])
fi
AC_SUBST(STATIC_BLDS)
+for f in $SHARED_LIBS; do
+ echo "AC_HELP_STRING([shared],[$f])"
+done
AC_SUBST(SHARED_LIBS)
-
for f in $SYSTEM_LIBS; do
echo "AC_HELP_STRING([system],[$f])"
done
EXTRA_LIBS+=' -ldl'
FFMPEG_EXTRA_CFG+=' --extra-ldflags="-ldl"'
fi
-if test "x$WANT_OPUS" = "xyes"; then
- FFMPEG_EXTRA_CFG+=' --enable-libopus'
- if test "x$HAVE_opus" = "xyes" -a "x$BUILD_opus" = "x0"; then
- EXTRA_LIBS+=' -lopus'
- CFG_CFLAGS+=' -I/usr/include/opus -I/usr/local/include/opus'
- fi
-fi
if test "x$WANT_BOOBY" != "xno"; then
CFG_CFLAGS+=" -DBOOBY"
fi
if test "x$WANT_GIT_FFMPEG" != "xno"; then
echo "ffmpeg.git := $WANT_GIT_FFMPEG"
fi
-if test "x$WANT_OPUS" = "xyes" -a "x$BUILD_opus" = "x0"; then
- echo 'ffmpeg.cflags+=" -I/usr/include/opus -I/usr/local/include/opus"'
-fi
if test "x$X264_CFG_PARAMS" != "x" ; then
echo "x264.cfg_params :=$X264_CFG_PARAMS --enable-static --enable-pic"
fi
ATTRS{name}=="Contour Design ShuttlePRO v2" MODE="0644"
ATTRS{name}=="Contour Design ShuttleXpress" MODE="0644"
+ATTRS{name}=="Contour Design ShuttlePro" MODE="0644"
cp -a Features5.pdf $(TARGET_DIR)/.
cp -a shortcuts.html $(TARGET_DIR)/.
cp -a RenderMux.sh $(TARGET_DIR)/.
+ cp -a 99-ShuttlePRO.rules $(TARGET_DIR)/.
clean:
rm -f $(OUTPUT) $(IMAGES)
--- /dev/null
+webm libaom-av1
+# this codec codes less than one frame per sec
+# and so even a few seconds of video can take
+# a very long time to encode
+strict -2
+threads 8
image2 bmp
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/b%05d.bmp
--- /dev/null
+image2 libopenjpeg
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/j%05d.jp2
image2 pam
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/p%05d.pam
image2 pbm
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/p%05d.pbm
image2 pcx
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/p%05d.pcx
image2 pgm
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/p%05d.pgm
image2 pgmyuv
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/p%05d.pgmyuv
image2 png
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/p%05d.png
image2 ppm
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/p%05d.ppm
image2 sgi
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/s%05d.sgi
image2 tiff
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/t%05d.tiff
image2 tiff
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/t%05d.tiff
pixel_format=rgb48
--- /dev/null
+image2 libwebp
+# this codec creates a set of image files in a directory
+# use an image2 file name like /dir/w%05d.webp
$(call if_pkg,twolame,--enable-libtwolame) \
$(call if_pkg,openjpeg,--enable-libopenjpeg) \
$(call if_pkg,lame,--enable-libmp3lame) \
+ $(call if_pkg,libaom,--enable-libaom) \
+ $(call if_pkg,libwebp,--enable-libwebp) \
+ $(call if_pkg,opus,--enable-libopus) \
$(call if_pkg,libvorbis,--enable-libvorbis) \
$(call if_pkg,libtheora,--enable-libtheora) \
$(call if_pkg,libvpx,--enable-libvpx) \
--extra-cflags="\
$(call inc_path,twolame,libtwolame) \
$(call inc_path,lame,include) \
+ $(call inc_path,libaom,usr/local/include) \
+ $(call inc_path,libwebp,usr/local/include) \
$(call inc_path,openjpeg,src/lib/openjp2) \
$(call inc_path,libogg,include) \
$(call inc_path,opus,include) \
--extra-libs="-Wl,--start-group \
$(call ld_path,twolame,libtwolame/.libs) \
$(call ld_path,lame,libmp3lame/.libs) \
+ $(call ld_path,libaom,usr/local/lib) \
+ $(call ld_path,libwebp,usr/local/lib) \
$(call ld_path,openjpeg,bin) \
$(call ld_path,opus,.libs) \
$(call ld_path,libogg,lib/.libs) \
lame.cfg_vars?= CFLAGS+=" -O"
lame.cfg_params?=--enable-shared=no
lame.mak_params?= ; cd $(call bld_path,lame,include); ln -sf . lame
+libaom.cfg_vars?=$(call cmake_config,aom-master)
+libaom.cfg_params?= -DENABLE_SHARED=no -DCMAKE_INSTALL_LIBDIR=lib \
+ -DCMAKE_INSTALL_PREFIX=$(call bld_path,libaom)/usr/local
+libaom.mak_params?= ; $(MAKE) -C libaom* install
+libwebp.cfg_vars?= ./autogen.sh ;
+libwebp.cfg_params?=--enable-shared=no
+libwebp.mak_params?=; $(MAKE) -C libwebp* install DESTDIR=$(call bld_path,libwebp)
mjpegtools.cflags?="$(call inc_path,libjpeg) $(call ld_path,libjpeg,.libs)"
mjpegtools.mak_params?=; ln -s . $(call bld_path,mjpegtools,utils)/mjpegtools
mjpegtools.cfg_params?= --enable-shared=no --without-libsdl --without-v4l
$(call rules,$(call std-build,audiofile))
$(call rules,$(call std-build,encore))
$(call rules,$(call std-build,esound,audiofile))
-$(call rules,$(call std-build,ffmpeg, twolame lame openjpeg opus libtheora x264 x265 libvpx))
+$(call rules,$(call std-build,ffmpeg, twolame lame openjpeg opus libtheora x264 x265 libvpx libaom libwebp))
$(call rules,$(call std-build,fftw))
$(call rules,$(call std-build,flac,libogg))
$(call rules,$(call std-build,giflib))
$(call rules,$(call std-build,ilmbase))
$(call rules,$(call std-build,ladspa))
$(call rules,$(call std-build,lame))
+$(call rules,$(call std-build,libaom))
+$(call rules,$(call std-build,libwebp))
$(call rules,$(call std-build,libavc1394,libraw1394))
$(call rules,$(call std-build,libdv))
$(call rules,$(call std-build,libiec61883,libraw1394))
https://www.cybercom.net/~dcoffin/dcraw/dcraw.c
-http://download-mirror.savannah.gnu.org/releases//openexr/ilmbase-2.2.0.tar.gz
-http://gnu.mirrors.pair.com/savannah/savannah//openexr/openexr-2.2.0.tar.gz
+http://download-mirror.savannah.gnu.org/releases//openexr/ilmbase-2.2.1.tar.gz
+http://gnu.mirrors.pair.com/savannah/savannah//openexr/openexr-2.2.1.tar.gz
https://sourceforge.net/projects/opencvlibrary/files/latest/download?source=directory = 3.2.0
-https://sourceforge.net/projects/opencore-amr/files/fdk-aac/fdk-aac-0.1.5.tar.gz/download
+#https://sourceforge.net/projects/opencore-amr/files/fdk-aac/fdk-aac-2.2.0.tar.gz/download
http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.28.tar.gz
https://ieee1394.wiki.kernel.org/index.php/Libraries
https://www.kernel.org/pub/linux/libs/ieee1394/libraw1394-2.1.2.tar.xz
https://www.kernel.org/pub/linux/libs/ieee1394/libiec61883-1.2.0.tar.xz
https://sourceforge.net/projects/libavc1394/files/latest/download?source=directory = 0.5.4
-https://sourceforge.net/projects/libdv/files/latest/download?source=directory
-https://sourceforge.net/projects/giflib/files/latest/download
-https://sourceforge.net/projects/flac/files/latest/download?source=directory
-https://github.com/uclouvain/openjpeg/archive/master.zip = openjpeg-2.1.0-20160221.tar.xz
+https://sourceforge.net/projects/libdv/files/latest/download?source=directory = 0.104
+https://sourceforge.net/projects/giflib/files/latest/download = 5.1.4
+https://sourceforge.net/projects/flac/files/latest/download?source=directory = 1.3.2
+https://github.com/uclouvain/openjpeg/archive/master.zip = openjpeg-2.3.0-20171004.tar.xz ??
https://sourceforge.net/projects/libjpeg-turbo/files/1.5.1/libjpeg-turbo-1.5.1.tar.gz/download
-http://www.fftw.org/fftw-3.3.6-pl2.tar.gz
+http://www.fftw.org/fftw-3.3.8.tar.gz
http://festvox.org/packed/festival/2.4/festival-2.4-release.tar.gz
http://festvox.org/packed/festival/2.4/speech_tools-2.4-release.tar.gz
http://festvox.org/packed/festival/2.4/voices/festvox_cmu_us_ahw_cg.tar.gz
-http://downloads.sourceforge.net/faac/faac-1.28.tar.bz2
-http://downloads.sourceforge.net/faac/faad2-2.7.tar.bz2
-http://ftp.gnome.org/pub/gnome/sources/esound/0.2/esound-0.2.41.tar.bz2
+#http://downloads.sourceforge.net/faac/faac-1.29.9.2.tar.gz
+#http://downloads.sourceforge.net/faac/faad2-2.8.8.tar.gz
+#http://ftp.gnome.org/pub/gnome/sources/esound/0.2/esound-0.2.41.tar.bz2
http://audiofile.68k.org/audiofile-0.3.6.tar.gz
https://sourceforge.net/projects/twolame/files/latest/download?source=directory = 0.3.13
-http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.xz
-http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
+http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.6.tar.xz
+http://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.gz
http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2
-https://sourceforge.net/projects/lame/files/latest/download?source=directory = 3.99.5
-http://dl.maptools.org/dl/libtiff/libtiff-cvsroot, untar, cd libtiff, cvs init, cd /tmp/x, cvs co -d path/libtiff = 4.0.6
+https://sourceforge.net/projects/lame/files/latest/download?source=directory = 3.100
+https://download.osgeo.org/libtiff/tiff-4.0.10.tar.gz
https://sourceforge.net/projects/libuuid/files/latest/download?source=directory - 1.0.3
-ftp://ftp.videolan.org/pub/x264/snapshots/x264-snapshot-20170426-2245-stable.tar.bz2
-https://bitbucket.org/multicoreware/x265/downloads/x265_2.4.tar.gz
-http://ffmpeg.org/releases/ffmpeg-4.0.tar.bz2
+ftp://ftp.videolan.org/pub/x264/snapshots/x264-snapshot-20190131-2245-stable.tar.bz2
+https://bitbucket.org/multicoreware/x265/downloads/x265_3.0.tar.gz
+http://ffmpeg.org/releases/ffmpeg-4.1.tar.gz
https://github.com/webmproject/libvpx/releases/tag/v1.7.0
https://github.com/swh/ladspa/releases/tag/v0.4.17, plugin.org.uk
-https://archive.mozilla.org/pub/opus/opus-1.2.1.tar.gz
+https://archive.mozilla.org/pub/opus/opus-1.3.tar.gz