From b926b6282d3b9fc8115660ae013f74f4f8c06d30 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 30 Sep 2010 21:57:31 +0000 Subject: av_assert() system. With this the developer can now choose if he wants an assert always enabled or at which compile time assert level. This can thus replace the #define NDEBUG hacks Originally committed as revision 25278 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffmpeg.c | 17 +++++++-------- libavutil/Makefile | 1 + libavutil/assert.h | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ libavutil/avutil.h | 2 +- libavutil/rational.c | 4 ++-- 5 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 libavutil/assert.h diff --git a/ffmpeg.c b/ffmpeg.c index d9812be97e..b9ae4cae0c 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -79,8 +79,7 @@ #include "cmdutils.h" -#undef NDEBUG -#include +#include "libavutil/assert.h" const char program_name[] = "FFmpeg"; const int program_birth_year = 2000; @@ -905,7 +904,7 @@ need_realloc: } }else if(audio_sync_method>1){ int comp= av_clip(delta, -audio_sync_method, audio_sync_method); - assert(ost->audio_resample); + av_assert0(ost->audio_resample); if(verbose > 2) fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate); // fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2)); @@ -1223,10 +1222,10 @@ static void do_video_out(AVFormatContext *s, rightBand = ((int64_t)ist->st->codec->width * ost->original_rightBand / ost->original_width) & ~1; /* sanity check to ensure no bad band sizes sneak in */ - assert(topBand <= INT_MAX && topBand >= 0); - assert(bottomBand <= INT_MAX && bottomBand >= 0); - assert(leftBand <= INT_MAX && leftBand >= 0); - assert(rightBand <= INT_MAX && rightBand >= 0); + av_assert0(topBand <= INT_MAX && topBand >= 0); + av_assert0(bottomBand <= INT_MAX && bottomBand >= 0); + av_assert0(leftBand <= INT_MAX && leftBand >= 0); + av_assert0(rightBand <= INT_MAX && rightBand >= 0); ost->topBand = topBand; ost->bottomBand = bottomBand; @@ -1696,7 +1695,7 @@ static int output_packet(AVInputStream *ist, int ist_index, //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE; if (ost->encoding_needed) { - assert(ist->decoding_needed); + av_assert0(ist->decoding_needed); switch(ost->st->codec->codec_type) { case AVMEDIA_TYPE_AUDIO: do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size); @@ -3628,7 +3627,7 @@ static void opt_new_stream(const char *opt, const char *arg) if (!strcmp(opt, "newvideo" )) new_video_stream (oc); else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc); else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc); - else assert(0); + else av_assert0(0); } /* arg format is "output-stream-index:streamid-value". */ diff --git a/libavutil/Makefile b/libavutil/Makefile index f9178e87d9..3f13092c3c 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -3,6 +3,7 @@ include $(SUBDIR)../config.mak NAME = avutil HEADERS = adler32.h \ + assert.h \ attributes.h \ avstring.h \ avutil.h \ diff --git a/libavutil/assert.h b/libavutil/assert.h new file mode 100644 index 0000000000..8f6e2f0208 --- /dev/null +++ b/libavutil/assert.h @@ -0,0 +1,59 @@ +/* + * copyright (c) 2010 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * simple assert() macros that are a bit more flexible than ISO C assert(). + * @author Michael Niedermayer + */ + +#ifndef AVUTIL_ASSERT_H +#define AVUTIL_ASSERT_H + +#include "avutil.h" +#include "log.h" + +/** + * assert() equivalent, that is always enabled. + */ +#define av_assert0(cond) do {if(!(cond)) { av_log(NULL, AV_LOG_FATAL, "Assertion %s failed at %s:%d\n", AV_STRINGIFY(cond), __FILE__, __LINE__); abort(); }}while(0) + + +/** + * assert() equivalent, that does not lie in speed critical code. + * These asserts() thus can be enabled without fearing speedloss. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0 +#define av_assert1(cond) av_assert_always(cond) +#else +#define av_assert1(cond) ((void)0) +#endif + + +/** + * assert() equivalent, that does lie in speed critical code. + */ +#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 +#define av_assert2(cond) av_assert_always(cond) +#else +#define av_assert2(cond) ((void)0) +#endif + +#endif diff --git a/libavutil/avutil.h b/libavutil/avutil.h index a40bd957ae..e3391e58a2 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -40,7 +40,7 @@ #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) #define LIBAVUTIL_VERSION_MAJOR 50 -#define LIBAVUTIL_VERSION_MINOR 31 +#define LIBAVUTIL_VERSION_MINOR 32 #define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ diff --git a/libavutil/rational.c b/libavutil/rational.c index 3e8b885d49..4e3c50be81 100644 --- a/libavutil/rational.c +++ b/libavutil/rational.c @@ -25,7 +25,7 @@ * @author Michael Niedermayer */ -#include +#include "assert.h" //#include #include @@ -67,7 +67,7 @@ int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max) num= den; den= next_den; } - assert(av_gcd(a1.num, a1.den) <= 1U); + av_assert2(av_gcd(a1.num, a1.den) <= 1U); *dst_num = sign ? -a1.num : a1.num; *dst_den = a1.den; -- cgit v1.2.3