Commit 99efd596 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'cb45553f'

* commit 'cb45553f':
  Remove pointless #undefs of previously forbidden functions.
  fate: Add dependencies for bmp, cdxl, dfa, mp3

Conflicts:
	doc/examples/muxing.c
	libavfilter/filtfmts.c
	libavutil/des.c
	libavutil/eval.c
	libavutil/log.c
	libavutil/parseutils.c
	tests/fate/mp3.mak
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 1fa2bdc9 cb45553f
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include "golomb.h" #include "golomb.h"
#include "put_bits.h" #include "put_bits.h"
#undef fprintf
#define COUNT 8191 #define COUNT 8191
#define SIZE (COUNT * 4) #define SIZE (COUNT * 4)
......
...@@ -312,7 +312,6 @@ av_cold void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs) ...@@ -312,7 +312,6 @@ av_cold void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs)
} }
#ifdef TEST #ifdef TEST
#undef printf
#include <stdio.h> #include <stdio.h>
#define FILT_ORDER 4 #define FILT_ORDER 4
......
...@@ -92,9 +92,7 @@ static av_cold int aacPlus_encode_init(AVCodecContext *avctx) ...@@ -92,9 +92,7 @@ static av_cold int aacPlus_encode_init(AVCodecContext *avctx)
avctx->extradata_size = decoder_specific_info_size; avctx->extradata_size = decoder_specific_info_size;
memcpy(avctx->extradata, buffer, avctx->extradata_size); memcpy(avctx->extradata, buffer, avctx->extradata_size);
} }
#undef free
free(buffer); free(buffer);
#define free please_use_av_free
} }
return 0; return 0;
} }
......
...@@ -158,9 +158,7 @@ static av_cold int Faac_encode_init(AVCodecContext *avctx) ...@@ -158,9 +158,7 @@ static av_cold int Faac_encode_init(AVCodecContext *avctx)
memcpy(avctx->extradata, buffer, avctx->extradata_size); memcpy(avctx->extradata, buffer, avctx->extradata_size);
faac_cfg->outputFormat = 0; faac_cfg->outputFormat = 0;
} }
#undef free
free(buffer); free(buffer);
#define free please_use_av_free
} }
if (!faacEncSetConfiguration(s->faac_handle, faac_cfg)) { if (!faacEncSetConfiguration(s->faac_handle, faac_cfg)) {
......
...@@ -33,9 +33,6 @@ ...@@ -33,9 +33,6 @@
#include "libavformat/avformat.h" #include "libavformat/avformat.h"
#include "libavformat/internal.h" #include "libavformat/internal.h"
/* cdio returns some malloced strings that need to be free()d */
#undef free
typedef struct CDIOContext { typedef struct CDIOContext {
const AVClass *class; const AVClass *class;
cdrom_drive_t *drive; cdrom_drive_t *drive;
......
...@@ -48,8 +48,6 @@ ...@@ -48,8 +48,6 @@
#define DC1394_FRAMERATE_240 FRAMERATE_240 #define DC1394_FRAMERATE_240 FRAMERATE_240
#endif #endif
#undef free
typedef struct dc1394_data { typedef struct dc1394_data {
AVClass *class; AVClass *class;
#if HAVE_LIBDC1394_1 #if HAVE_LIBDC1394_1
......
...@@ -90,8 +90,6 @@ double ff_timefilter_eval(TimeFilter *self, double delta) ...@@ -90,8 +90,6 @@ double ff_timefilter_eval(TimeFilter *self, double delta)
#include "libavutil/lfg.h" #include "libavutil/lfg.h"
#define LFG_MAX ((1LL << 32) - 1) #define LFG_MAX ((1LL << 32) - 1)
#undef printf
int main(void) int main(void)
{ {
AVLFG prng; AVLFG prng;
......
...@@ -26,9 +26,6 @@ ...@@ -26,9 +26,6 @@
#include "libavfilter/avfilter.h" #include "libavfilter/avfilter.h"
#include "libavfilter/formats.h" #include "libavfilter/formats.h"
#undef fprintf
#undef printf
static void print_formats(AVFilterContext *filter_ctx) static void print_formats(AVFilterContext *filter_ctx)
{ {
int i, j; int i, j;
......
...@@ -47,8 +47,6 @@ ...@@ -47,8 +47,6 @@
#include "internal.h" #include "internal.h"
#include "video.h" #include "video.h"
#undef time
#include <ft2build.h> #include <ft2build.h>
#include <freetype/config/ftheader.h> #include <freetype/config/ftheader.h>
#include FT_FREETYPE_H #include FT_FREETYPE_H
......
...@@ -581,7 +581,7 @@ int vf_next_put_image(struct vf_instance *vf,mp_image_t *mpi, double pts){ ...@@ -581,7 +581,7 @@ int vf_next_put_image(struct vf_instance *vf,mp_image_t *mpi, double pts){
goto fail; goto fail;
picref->buf = pic; picref->buf = pic;
picref->buf->please_use_av_free= (void*)av_free; picref->buf->free= (void*)av_free;
if (!(picref->video = av_mallocz(sizeof(AVFilterBufferRefVideoProps)))) if (!(picref->video = av_mallocz(sizeof(AVFilterBufferRefVideoProps))))
goto fail; goto fail;
......
...@@ -60,8 +60,6 @@ static unsigned long openssl_thread_id(void) ...@@ -60,8 +60,6 @@ static unsigned long openssl_thread_id(void)
#if HAVE_THREADS && GNUTLS_VERSION_NUMBER <= 0x020b00 #if HAVE_THREADS && GNUTLS_VERSION_NUMBER <= 0x020b00
#include <gcrypt.h> #include <gcrypt.h>
#include <errno.h> #include <errno.h>
#undef malloc
#undef free
GCRY_THREAD_OPTION_PTHREAD_IMPL; GCRY_THREAD_OPTION_PTHREAD_IMPL;
#endif #endif
#endif #endif
......
...@@ -28,9 +28,6 @@ ...@@ -28,9 +28,6 @@
#include "libavutil/mathematics.h" #include "libavutil/mathematics.h"
#include "libavformat/avformat.h" #include "libavformat/avformat.h"
#undef printf
#undef fprintf
static char buffer[20]; static char buffer[20];
static const char *ret_str(int v) static const char *ret_str(int v)
......
...@@ -20,9 +20,6 @@ ...@@ -20,9 +20,6 @@
#include "internal.h" #include "internal.h"
#undef printf
#undef exit
static void test(const char *base, const char *rel) static void test(const char *base, const char *rel)
{ {
char buf[200], buf2[200]; char buf[200], buf2[200];
......
...@@ -3530,7 +3530,6 @@ static void hex_dump_internal(void *avcl, FILE *f, int level, ...@@ -3530,7 +3530,6 @@ static void hex_dump_internal(void *avcl, FILE *f, int level,
const uint8_t *buf, int size) const uint8_t *buf, int size)
{ {
int len, i, j, c; int len, i, j, c;
#undef fprintf
#define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0) #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
for(i=0;i<size;i+=16) { for(i=0;i<size;i+=16) {
...@@ -3568,7 +3567,6 @@ void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size) ...@@ -3568,7 +3567,6 @@ void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size)
static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base) static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
{ {
#undef fprintf
#define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0) #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
PRINT("stream #%d:\n", pkt->stream_index); PRINT("stream #%d:\n", pkt->stream_index);
PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0)); PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
......
...@@ -214,7 +214,6 @@ int av_strncasecmp(const char *a, const char *b, size_t n) ...@@ -214,7 +214,6 @@ int av_strncasecmp(const char *a, const char *b, size_t n)
#ifdef TEST #ifdef TEST
#include "common.h" #include "common.h"
#undef printf
int main(void) int main(void)
{ {
......
...@@ -175,8 +175,6 @@ char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size) ...@@ -175,8 +175,6 @@ char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
#ifdef TEST #ifdef TEST
// LCOV_EXCL_START // LCOV_EXCL_START
#undef printf
#define MAX_DATA_SIZE 1024 #define MAX_DATA_SIZE 1024
#define MAX_ENCODED_SIZE 2048 #define MAX_ENCODED_SIZE 2048
......
...@@ -420,7 +420,6 @@ void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, ...@@ -420,7 +420,6 @@ void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
#ifdef TEST #ifdef TEST
#include <stdio.h> #include <stdio.h>
#undef printf
#define NUM_VARIABLE_KEY_TESTS 34 #define NUM_VARIABLE_KEY_TESTS 34
...@@ -523,7 +522,6 @@ static const uint8_t ciphertext2[16] = { ...@@ -523,7 +522,6 @@ static const uint8_t ciphertext2[16] = {
#define IV "blowfish" #define IV "blowfish"
#undef exit
static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
const uint8_t *ref, int len, uint8_t *iv, int dir, const uint8_t *ref, int len, uint8_t *iv, int dir,
const char *test) const char *test)
......
...@@ -175,7 +175,6 @@ int av_parse_cpu_caps(unsigned *flags, const char *s) ...@@ -175,7 +175,6 @@ int av_parse_cpu_caps(unsigned *flags, const char *s)
} }
#ifdef TEST #ifdef TEST
#undef printf
#include <stdio.h> #include <stdio.h>
static const struct { static const struct {
......
...@@ -113,7 +113,6 @@ uint32_t av_crc(const AVCRC *ctx, uint32_t crc, ...@@ -113,7 +113,6 @@ uint32_t av_crc(const AVCRC *ctx, uint32_t crc,
} }
#ifdef TEST #ifdef TEST
#undef printf
int main(void) int main(void)
{ {
uint8_t buf[1999]; uint8_t buf[1999];
......
...@@ -337,10 +337,6 @@ void av_des_mac(AVDES *d, uint8_t *dst, const uint8_t *src, int count) { ...@@ -337,10 +337,6 @@ void av_des_mac(AVDES *d, uint8_t *dst, const uint8_t *src, int count) {
} }
#ifdef TEST #ifdef TEST
// LCOV_EXCL_START
#undef printf
#undef rand
#undef srand
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "libavutil/time.h" #include "libavutil/time.h"
...@@ -442,5 +438,4 @@ int main(void) { ...@@ -442,5 +438,4 @@ int main(void) {
#endif #endif
return 0; return 0;
} }
// LCOV_EXCL_STOP
#endif #endif
...@@ -660,8 +660,6 @@ int av_expr_parse_and_eval(double *d, const char *s, ...@@ -660,8 +660,6 @@ int av_expr_parse_and_eval(double *d, const char *s,
} }
#ifdef TEST #ifdef TEST
// LCOV_EXCL_START
#undef printf
#include <string.h> #include <string.h>
static const double const_values[] = { static const double const_values[] = {
...@@ -797,5 +795,4 @@ int main(int argc, char **argv) ...@@ -797,5 +795,4 @@ int main(int argc, char **argv)
return 0; return 0;
} }
// LCOV_EXCL_STOP
#endif #endif
...@@ -149,8 +149,6 @@ void av_fifo_drain(AVFifoBuffer *f, int size) ...@@ -149,8 +149,6 @@ void av_fifo_drain(AVFifoBuffer *f, int size)
#ifdef TEST #ifdef TEST
#undef printf
int main(void) int main(void)
{ {
/* create a FIFO buffer */ /* create a FIFO buffer */
......
...@@ -58,38 +58,6 @@ ...@@ -58,38 +58,6 @@
# define INT_BIT (CHAR_BIT * sizeof(int)) # define INT_BIT (CHAR_BIT * sizeof(int))
#endif #endif
/* avoid usage of dangerous/inappropriate system functions */
#undef malloc
#define malloc please_use_av_malloc
#undef free
#define free please_use_av_free
#undef realloc
#define realloc please_use_av_realloc
#undef rand
#define rand rand_is_forbidden_due_to_state_trashing_use_av_lfg_get
#undef srand
#define srand srand_is_forbidden_due_to_state_trashing_use_av_lfg_init
#undef random
#define random random_is_forbidden_due_to_state_trashing_use_av_lfg_get
#undef sprintf
#define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
#undef strcat
#define strcat strcat_is_forbidden_due_to_security_issues_use_av_strlcat
#undef exit
#define exit exit_is_forbidden
#undef printf
#define printf please_use_av_log_instead_of_printf
#undef fprintf
#define fprintf please_use_av_log_instead_of_fprintf
#undef puts
#define puts please_use_av_log_instead_of_puts
#undef perror
#define perror please_use_av_log_instead_of_perror
#undef strcasecmp
#define strcasecmp please_use_av_strcasecmp
#undef strncasecmp
#define strncasecmp please_use_av_strncasecmp
#define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\
{\ {\
p = av_malloc(size);\ p = av_malloc(size);\
......
...@@ -99,7 +99,6 @@ static const uint32_t color[16 + AV_CLASS_CATEGORY_NB] = { ...@@ -99,7 +99,6 @@ static const uint32_t color[16 + AV_CLASS_CATEGORY_NB] = {
#endif #endif
static int use_color = -1; static int use_color = -1;
#undef fprintf
static void colored_fputs(int level, const char *str) static void colored_fputs(int level, const char *str)
{ {
if (use_color < 0) { if (use_color < 0) {
...@@ -220,7 +219,6 @@ void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) ...@@ -220,7 +219,6 @@ void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl)
is_atty = isatty(2) ? 1 : -1; is_atty = isatty(2) ? 1 : -1;
#endif #endif
#undef fprintf
if (print_prefix && (flags & AV_LOG_SKIP_REPEATED) && !strcmp(line, prev)){ if (print_prefix && (flags & AV_LOG_SKIP_REPEATED) && !strcmp(line, prev)){
count++; count++;
if (is_atty == 1) if (is_atty == 1)
......
...@@ -180,7 +180,6 @@ void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len) ...@@ -180,7 +180,6 @@ void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len)
} }
#ifdef TEST #ifdef TEST
#undef printf
#include <stdio.h> #include <stdio.h>
static void print_md5(uint8_t *md5) static void print_md5(uint8_t *md5)
......
...@@ -40,11 +40,6 @@ ...@@ -40,11 +40,6 @@
#include "intreadwrite.h" #include "intreadwrite.h"
#include "mem.h" #include "mem.h"
/* here we can use OS-dependent allocation functions */
#undef free
#undef malloc
#undef realloc
#ifdef MALLOC_PREFIX #ifdef MALLOC_PREFIX
#define malloc AV_JOIN(MALLOC_PREFIX, malloc) #define malloc AV_JOIN(MALLOC_PREFIX, malloc)
......
...@@ -1163,8 +1163,6 @@ void *av_opt_ptr(const AVClass *class, void *obj, const char *name) ...@@ -1163,8 +1163,6 @@ void *av_opt_ptr(const AVClass *class, void *obj, const char *name)
#ifdef TEST #ifdef TEST
#undef printf
typedef struct TestContext typedef struct TestContext
{ {
const AVClass *class; const AVClass *class;
......
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include "random_seed.h" #include "random_seed.h"
#include "parseutils.h" #include "parseutils.h"
#undef time
#ifdef TEST #ifdef TEST
#define av_get_random_seed av_get_random_seed_deterministic #define av_get_random_seed av_get_random_seed_deterministic
...@@ -676,15 +674,13 @@ int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info ...@@ -676,15 +674,13 @@ int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info
#ifdef TEST #ifdef TEST
static uint32_t random = MKTAG('L','A','V','U'); static uint32_t randomv = MKTAG('L','A','V','U');
static uint32_t av_get_random_seed_deterministic(void) static uint32_t av_get_random_seed_deterministic(void)
{ {
return random = random * 1664525 + 1013904223; return randomv = randomv * 1664525 + 1013904223;
} }
#undef printf
int main(void) int main(void)
{ {
printf("Testing av_parse_video_rate()\n"); printf("Testing av_parse_video_rate()\n");
......
...@@ -332,7 +332,6 @@ void av_sha_final(AVSHA* ctx, uint8_t *digest) ...@@ -332,7 +332,6 @@ void av_sha_final(AVSHA* ctx, uint8_t *digest)
#ifdef TEST #ifdef TEST
#include <stdio.h> #include <stdio.h>
#undef printf
int main(void) int main(void)
{ {
......
...@@ -183,7 +183,6 @@ void av_xtea_crypt(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, int count, ...@@ -183,7 +183,6 @@ void av_xtea_crypt(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, int count,
#ifdef TEST #ifdef TEST
#include <stdio.h> #include <stdio.h>
#undef printf
#define XTEA_NUM_TESTS 6 #define XTEA_NUM_TESTS 6
...@@ -220,7 +219,6 @@ static const uint8_t xtea_test_ct[XTEA_NUM_TESTS][8] = { ...@@ -220,7 +219,6 @@ static const uint8_t xtea_test_ct[XTEA_NUM_TESTS][8] = {
{ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 } { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }
}; };
#undef exit
static void test_xtea(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, static void test_xtea(AVXTEA *ctx, uint8_t *dst, const uint8_t *src,
const uint8_t *ref, int len, uint8_t *iv, int dir, const uint8_t *ref, int len, uint8_t *iv, int dir,
const char *test) const char *test)
......
...@@ -37,5 +37,7 @@ fate-bmp-rle4: CMD = framecrc -i $(SAMPLES)/bmp/testcompress4.bmp -pix_fmt rgb24 ...@@ -37,5 +37,7 @@ fate-bmp-rle4: CMD = framecrc -i $(SAMPLES)/bmp/testcompress4.bmp -pix_fmt rgb24
FATE_BMP += fate-bmp-rle8 FATE_BMP += fate-bmp-rle8
fate-bmp-rle8: CMD = framecrc -i $(SAMPLES)/bmp/testcompress8.bmp -pix_fmt rgb24 fate-bmp-rle8: CMD = framecrc -i $(SAMPLES)/bmp/testcompress8.bmp -pix_fmt rgb24
FATE_SAMPLES_AVCONV += $(FATE_BMP) FATE_BMP-$(call DEMDEC, IMAGE2, BMP) += $(FATE_BMP)
fate-bmp: $(FATE_BMP)
FATE_SAMPLES_AVCONV += $(FATE_BMP-yes)
fate-bmp: $(FATE_BMP-yes)
...@@ -13,5 +13,7 @@ fate-cdxl-pal8-small: CMD = framecrc -i $(SAMPLES)/cdxl/fruit.cdxl -an -pix_fmt ...@@ -13,5 +13,7 @@ fate-cdxl-pal8-small: CMD = framecrc -i $(SAMPLES)/cdxl/fruit.cdxl -an -pix_fmt
FATE_CDXL += fate-cdxl-bitline-ham6 FATE_CDXL += fate-cdxl-bitline-ham6
fate-cdxl-bitline-ham6: CMD = framecrc -i $(SAMPLES)/cdxl/bitline.cdxl -frames:v 10 fate-cdxl-bitline-ham6: CMD = framecrc -i $(SAMPLES)/cdxl/bitline.cdxl -frames:v 10
FATE_SAMPLES_AVCONV += $(FATE_CDXL) FATE_CDXL-$(call DEMDEC, CDXL, CDXL) += $(FATE_CDXL)
fate-cdxl: $(FATE_CDXL)
FATE_SAMPLES_AVCONV += $(FATE_CDXL-yes)
fate-cdxl: $(FATE_CDXL-yes)
...@@ -31,5 +31,7 @@ fate-dfa10: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0009.dfa -pix_fmt rgb2 ...@@ -31,5 +31,7 @@ fate-dfa10: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0009.dfa -pix_fmt rgb2
FATE_DFA += fate-dfa11 FATE_DFA += fate-dfa11
fate-dfa11: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0010.dfa -pix_fmt rgb24 fate-dfa11: CMD = framecrc -i $(SAMPLES)/chronomaster-dfa/0010.dfa -pix_fmt rgb24
FATE_SAMPLES_AVCONV += $(FATE_DFA) FATE_DFA-$(call DEMDEC, DFA, DFA) += $(FATE_DFA)
fate-dfa: $(FATE_DFA)
FATE_SAMPLES_AVCONV += $(FATE_DFA-yes)
fate-dfa: $(FATE_DFA-yes)
...@@ -30,11 +30,14 @@ FATE_MP3 += fate-mp3-float-extra_overread ...@@ -30,11 +30,14 @@ FATE_MP3 += fate-mp3-float-extra_overread
fate-mp3-float-extra_overread: CMD = pcm -c:a mp3float -i $(SAMPLES)/mpegaudio/extra_overread.mp3 fate-mp3-float-extra_overread: CMD = pcm -c:a mp3float -i $(SAMPLES)/mpegaudio/extra_overread.mp3
fate-mp3-float-extra_overread: REF = $(SAMPLES)/mpegaudio/extra_overread.pcm fate-mp3-float-extra_overread: REF = $(SAMPLES)/mpegaudio/extra_overread.pcm
FATE_SAMPLES_AVCONV += $(FATE_MP3)
fate-mp3: $(FATE_MP3)
$(FATE_MP3): CMP = stddev $(FATE_MP3): CMP = stddev
$(FATE_MP3): FUZZ = 0.07 $(FATE_MP3): FUZZ = 0.07
ifdef HAVE_NEON ifdef HAVE_NEON
fate-mp3-float-conf-hecommon: FUZZ = 0.70 fate-mp3-float-conf-hecommon: FUZZ = 0.70
endif endif
FATE_MP3-$(call DEMDEC, MP3, MP3FLOAT) += $(FATE_MP3)
FATE_SAMPLES_AVCONV += $(FATE_MP3-yes)
fate-mp3: $(FATE_MP3-yes)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment