[FFmpeg-devel] Understanding motion vectors from ff_print_debug_info()
Sun Jul 29 04:46:57 CEST 2007
A while back Paolo suggested that people looking to extract motion
vectors in ffmpeg should look at
the method ff_print_debug_info() in libavcodec/mpegvideo.c.
This advice turned out to be very useful in my case. Thx Paolo.
However, I have a couple of questions about the constants being used
ff_print_debug_info() that would
really help noobs like myself really understand what is going on. Please
consider posting a reply if you
are familiar with this part of ffmpeg.
# It looks like you have to divide by 2 (or a higher power of 2) the
values in the motion_val array
to obtain the true motion vectors. Why is this so?
For example ff_print_debug_info() processes the motion_val vectors in
the following manner:
where shift = 1 + s->quarter_sample.
The 'quarter_sample' variable makes sense. It's accounting for some sort
of mode where the video is
sub-sampled by 2 in the X and Y axis. But I don't understand why the '1'
is added to 'shift' in effect
dividing all motion vectors by 2.
# For computing the 'mv_stride' variable avcodec.h suggests the
mv_stride= (mb_width << mv_sample_log2) + 1
While I don't understand why that '1' is added mv_stride.
What worries me is that the addition of that '1' is conditional and I
don't understand when not to add that '1'. For example
ff_print_debug_info() uses the following formula:
(s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1)
# Finally, is there any way to populate the AVFrame.motion_val array
with the motion vectors without having the motion vectors visualized on
the decoded video frame? I'm setting AVCodecContext.debug_mv = 1 to
obtain the motion vectors but as a side effect that flag also draws the
motion vectors. It looks like ff_print_debug_info() always draws the
motion vectors when the debug_mv flag is set. It seems wasteful to have
to decode the video twice in order to obtain the motion vectors and the
video frames without the visualization.
Thank you for your time.
More information about the ffmpeg-devel