mt-work/todo.txt
d375c104
 Todo
 
 -- For other people
0424e052
 - Multithread vc1.
55ce3c67
 - Multithread an intra codec like mjpeg (trivial).
d375c104
 - Fix mpeg1 (see below).
 - Try the first three items under Optimization.
 - Fix h264 (see below).
 - Try mpeg4 (see below).
 
 -- Bug fixes
 
 General critical:
 - Error resilience has to run before ff_report_frame_progress()
 is called. Otherwise there will be race conditions. (This might already
 work.) In general testing error paths should be done more.
55ce3c67
 - 'make fate THREADS=2' doesn't pass. Most failures are due to
 bugs in vsync in ffmpeg.c, which are currently obscuring real failures.
d375c104
 
 h264:
0424e052
 - Files that aren't parsed (e.g. mp4) and contain PAFF with two
 field pictures in the same packet are not optimal. Modify the
 nals_needed check so that the second field's first slice is
 considered as needed, then uncomment the FIXME code in decode_postinit.
 Ex: http://astrange.ithinksw.net/ffmpeg/mt-samples/PAFF-Chalet-Tire.mp4
d375c104
 
 mpeg4:
 - Packed B-frames need to be explicitly split up
 when frame threading is on. It's not very fast
 without this.
 - The buffer age optimization is disabled due to
 the way buffers are allocated across threads. The
 branch 'fix_buffer_age' has an attempt to fix it
 which breaks ffplay.
 - Support interlaced.
 
 mpeg1/2:
 - Seeking always prints "first frame not a keyframe"
 with threads on. Currently disabled for this reason.
 
 -- Prove correct
 
 - decode_update_progress() in h264.c
55ce3c67
 race_checking branch has some work on h264,
d375c104
 but not that function. It might be worth putting
 the branch under #ifdef DEBUG in mainline, but
 the code would have to be cleaner.
 - MPV_lowest_referenced_row() and co in mpegvideo.c
 - Same in vp3.
 
 -- Optimization
 
55ce3c67
 - Merge h264 decode_update_progress() with loop_filter().
 Add CODEC_CAP_DRAW_HORIZ_BAND as a side effect.
d375c104
 - EMU_EDGE is always set for h264 PAFF+MT
 because draw_edges() writes into the other field's
55ce3c67
 thread's pixels. Needs an option to skip T/B fields.
d375c104
 - Check update_thread_context() functions and make
 sure they only copy what they need to.
 - Try some more optimization of the "ref < 48; ref++"
 loop in h264.c await_references(), try turning the list0/list1 check
 above into a loop without being slower.
 - Support frame+slice threading at the same time
 by assigning slice_count threads for frame threads
 to use with execute(). This is simpler but unbalanced
 if only one frame thread uses any.
 
 -- Features
 
 - Support streams with width/height changing. This
 requires flushing all current frames (and buffering
 the input in the meantime), closing the codec and
 reopening it. Or don't support it.
 - Support encoding. Might need more threading primitives
 for good ratecontrol; would be nice for audio and libavfilter too.
 - Async decoding part 1: instead of trying to
 start every thread at the beginning, return a picture
 if the earliest thread is already done, but don't wait
 for it. Not sure what effect this would have.
 - Part 2: have an API that doesn't wait for the decoding
 thread, only returns EAGAIN if it's not ready. What will
 it do with the next input packet if it returns that?
 - Have an API that returns finished pictures but doesn't
 require sending new ones. Maybe allow NULL avpkt when
 not at the end of the stream.
 
 -- Samples
 
 http://astrange.ithinksw.net/ffmpeg/mt-samples/
 
 See yuvcmp.c in this directory to compare decoded samples.
 
 For debugging, try commenting out ff_thread_finish_setup calls so
 that only one thread runs at once, and then binary search+
 scatter printfs to look for differences in codec contexts.