This fixed two issues:
* RAW DV-seeking has to be done using DTS. Sounds silly, but ffmpeg
tracks internal state in RAW DV format decoder and runs mad, if
we seek by byte. Don't know, why I haven't noticed that, when I
added it.
* real fix(tm) for #29295
problem was: we did AVFrame read ahead, and the pattern
read_frame -> decode -> read_frame -> do color conversion of first frame
works everywhere but RAW RGB-files which do some pointer shuffling
within ffmpeg to save a memcpy...
I removed read ahead completely, since it didn't work like originally
intented. Might come back later, but the original purpose (making
resyncing easier if we are completely lost in stream) it never
fullfilled.
Unfortunately, error was caused by own attempt to deal with some kind of broken
videos when was investigating crashes in sequencer. Issue discovered that time
was related on values stored in timecode index and using them as signed data type
later.
Trying to use unsigned value here leads to signed/unsigned check failures.
Prefer just to pre-process that kind of videos i've been trying to deal with
rather than making more global changes during BCON3.
Crash was caused by several conditions:
- Frame which failed to decode tried to be converted to RGB colorspace
and some filters like deinterlacing used to be applied as well
(it's avscale stuff sws_scale where crash happened).
- In some cases it happened reading of freed memory when calling
sws_scale function. Looks like it happened because of freeing
packet on which decoding of frame finished and reading next packet.
Solved this two issues by making YUV->RGB conversion as soon as
frame was decoded in ffmpeg_decode_video_frame (such postprocessing
used to happen in callee of this function ffmpeg_fetchibuf), so now
sws_scale would be called before freeing packet on which decoding of
frame finished and it wouldn't be called in cases when decoding of
frame failed.
If decoding of frame failed, it'll be black ibuf returned to the sequencer.
- Fixed inconsistent data type used for pts number in ffmpeg_fetchibuf
and stored in timecode structure. Not really issue for "correct" movie files,
but probably can help for "broken" one
Implementation of cache for general movie-related areas
such as sequencer and clip editor (in the future)
Some changes in limiter were necessary:
- Limiter counted mapped memory twice when was checking how many memory is used.
- It was using "global" memory usage not memory usage by cached elements.
It will cause big problems when there's large mesh or plenty of undo steps are
in memory nothing would be cached in sequencer.
- To solve this problem introduced "callback" to measure cached element size.
It could be not very accurate in general, but it works well for image buffers.
And if this callback isn't set old-school memory usage check would be used.
- The whole cache used to get freed when memory limit exceeded, now it'll drop only
as much elements as necessary to reduce memory usage.
Seqcache is switched to use this new cache code.
It helped to make things works better for some movies but it
didn't help proxies to work properly. Correct fix seems a bit larger
and better not be made atm, so to keep behavior of proxies and
original movie consistent keep resolution behaves like it was before
recent changes,
- Display running job template in all sequencer modes
It was displayed only for sequencer mode without preview.
- Fixed proxy rebuild progress indicator
It was alsways zero because of incorrect rounding.
- Fixed timecode saving on windows (and probably some other platforms)
It was caused by incorrect opening file for writting -- it should
be opened in binary format "wb". This error caused incorrect
movie duration detection on windows.
- Fixed movie resolution detection for some movies.
In file attached to report, Blender detected resolution 1920x1088
instead of 1920x1080. Not sure if this fix is correct or it's
issue in FFmpeg, but it's something what mplayer using: store
width/height before running avcodec_open().
- Fixed frame number calculation when building timecodes.
It was rounding error caused some frames be positioned incorrect
in several cases (that each 6th frame rendered as next frame
from report).
- define __BIG_ENDIAN__ or __LITTLE_ENDIAN__ with cmake & scons.
- ENDIAN_ORDER is now a define rather than a global short.
- replace checks like this with single ifdef: #if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__)
- remove BKE_endian.h which isn't used
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.