[FFmpeg-devel] Discussion around: built in profiling.

Marc Hoffman mmhoffm
Mon Jun 25 17:05:43 CEST 2007


I know there has been some thoughts around this and I'm not sure what the
current plans are for internal profiling.  But I have been using this
mechanism to collect stats on execution times.

Basically, I define a new pair of macros PROF_BEGIN, PROF_END that are
defined to expand to START_TIMER, STOP_TIMER when GATHER_STATS is defined by
the compilation system.  This way the code can be littered with
PROF_BEGIN/PROF_END with out the need of #ifdef code sections.

Does anyone have thoughts around this type of infrastructure?  Also would
anyone mind if I changed the output of

14122033 dezicycles in sws_scale, 512 runs, 0 skips
154924245 dezicycles in avcodec_encode_video, 1024 runs, 0 skips

to

sws_scale: 14122033 dezicycles, 512 runs, 0 skips
avcodec_encode_video: 154924245 dezicycles, 1024 runs, 0 skips

Its easier to find things this way when your profiling lots of stuff.

Thanks
Marc



mmh at yoda$ svn diff libavutil ffmpeg.c
Index: libavutil/common.h
===================================================================
--- libavutil/common.h  (revision 9419)
+++ libavutil/common.h  (working copy)
@@ -344,4 +344,12 @@
 #define STOP_TIMER(id) {}
 #endif

+#ifdef GATHER_STATS
+#define PROF_BEGIN()   START_TIMER
+#define PROF_END(id)   STOP_TIMER(id)
+#else
+#define PROF_BEGIN()
+#define PROF_END(id)
+#endif
+
 #endif /* COMMON_H */
Index: ffmpeg.c
===================================================================
--- ffmpeg.c    (revision 9419)
+++ ffmpeg.c    (working copy)
@@ -743,8 +743,10 @@
     if (ost->video_resample) {
         padding_src = NULL;
         final_picture = &ost->pict_tmp;
+       PROF_BEGIN();
         sws_scale(ost->img_resample_ctx, formatted_picture->data,
formatted_picture->linesize,
               0, ost->resample_height, resampling_dst->data,
resampling_dst->linesize);
+       PROF_END("sws_scale");
     }

     if (ost->video_pad) {
@@ -800,9 +802,11 @@
             big_picture.pts= ost->sync_opts;
 //            big_picture.pts= av_rescale(ost->sync_opts,
AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
+           PROF_BEGIN();
             ret = avcodec_encode_video(enc,
                                        bit_buffer, bit_buffer_size,
                                        &big_picture);
+           PROF_END("avcodec_encode_video");
             if (ret == -1) {
                 fprintf(stderr, "Video encoding failed\n");
                 exit(1);




More information about the ffmpeg-devel mailing list