First, rebuild the ffmpeg package with profiling enabled. This is the important excerpt from my build script:
...
./configure \
--prefix=/usr \
--libdir=/usr/lib64 \
--mandir=/usr/man \
--shlibdir=/usr/lib64 \
--disable-debug \
...
--enable-gprof \
--disable-stripping \
...
#REMEMBER NOT TO STRIP THE FINAL BINARY -- SO COMMENT THE LINES BELOW
#find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \
# | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
...
Now, rebuild the ffmpeg package. Install it afterwards.
Second, run ffmpeg to transcode a DVD VOB file into an mpeg4 avi file. This is the example:
ffmpeg -i /mnt/dvd/VIDEO_TS/VTS_01_4.VOB -f avi -vcodec mpeg4 -b 800k -g 300 -bf 2 -acodec libfaac -ab 128k outlander_01_4.avi
After the transcoding completed. We will have the profiling information in a file named gmon.out in the directory where ffmpeg was executed.
Next up, use gprof to generate a human readable statistics of the previous ffmpeg run.
gprof /usr/bin/ffmpeg gmon.out > stats.txt
At this point we have the profiling information in stats.txt. The following is snippets of the contents of my stats.txt
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
45.46 0.20 0.20 main
40.92 0.38 0.18 68375 0.00 0.00 output_packet
6.82 0.41 0.03 38468 0.00 0.00 do_audio_out
3.41 0.43 0.02 87594 0.00 0.00 write_frame
2.27 0.44 0.01 107095 0.00 0.00 print_report
1.14 0.44 0.01 1 5.00 5.00 opt_format
0.00 0.44 0.00 1982784 0.00 0.00 data_start
0.00 0.44 0.00 7 0.00 0.00 find_codec_or_die
0.00 0.44 0.00 7 0.00 0.00 set_context_opts
0.00 0.44 0.00 4 0.00 0.00 opt_default
0.00 0.44 0.00 2 0.00 0.00 opt_bitrate
0.00 0.44 0.00 1 0.00 0.00 av_exit
0.00 0.44 0.00 1 0.00 0.00 new_audio_stream
0.00 0.44 0.00 1 0.00 0.00 new_video_stream
0.00 0.44 0.00 1 0.00 0.00 opt_audio_codec
0.00 0.44 0.00 1 0.00 0.00 opt_input_file
0.00 0.44 0.00 1 0.00 0.00 opt_output_file
0.00 0.44 0.00 1 0.00 0.00 opt_video_codec
0.00 0.44 0.00 1 0.00 5.00 parse_options
0.00 0.44 0.00 1 0.00 0.00 print_all_lib_versions
0.00 0.44 0.00 1 0.00 0.00 show_banner
% the percentage of the total running time of the
time program used by this function.
...
granularity: each sample hit covers 2 byte(s) for 2.27% of 0.44 seconds
index % time self children called name
[1] 100.0 0.20 0.24 main [1]
0.18 0.05 68375/68375 output_packet [2]
0.01 0.00 107095/107095 print_report [5]
0.00 0.01 1/1 parse_options [7]
0.00 0.00 715631/1982784 data_start [8]
0.00 0.00 1/1 show_banner [21]
0.00 0.00 1/1 av_exit [13]
-----------------------------------------------
0.18 0.05 68375/68375 main [1]
[2] 51.1 0.18 0.05 68375 output_packet [2]
0.03 0.01 38468/38468 do_audio_out [3]
0.01 0.00 29892/87594 write_frame [4]
0.00 0.00 512643/1982784 data_start [8]
...
Index by function name
[13] av_exit [16] opt_audio_codec [2] output_packet
[8] data_start [12] opt_bitrate [7] parse_options
[3] do_audio_out [11] opt_default [20] print_all_lib_versions
[9] find_codec_or_die [6] opt_format [5] print_report
[1] main [17] opt_input_file [10] set_context_opts
[14] new_audio_stream [18] opt_output_file [21] show_banner
[15] new_video_stream [19] opt_video_codec [4] write_frame
There is an explanation following every statistics section generated by gprof. Therefore, it shouldn't be hard to analyze the profiling result. That's it for the moment.