From c864c3968acce9cc96631ebbd362cbc207eddfbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 2 Oct 2012 23:59:35 +0200 Subject: [PATCH 1/6] segment: Add an option for omitting the first header and final trailer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows writing totally bare segments, without any header/trailer included anywhere. Signed-off-by: Martin Storsjö --- libavformat/segment.c | 52 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/libavformat/segment.c b/libavformat/segment.c index fb5a22e6bc..1e928a7ebf 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -41,6 +41,7 @@ typedef struct { int size; /**< Set by a private option. */ int wrap; /**< Set by a private option. */ int individual_header_trailer; /**< Set by a private option. */ + int write_header_trailer; /**< Set by a private option. */ int64_t offset_time; int64_t recording_time; int has_video; @@ -119,6 +120,26 @@ static int segment_end(AVFormatContext *oc, int write_trailer) return ret; } +static int open_null_ctx(AVIOContext **ctx) +{ + int buf_size = 32768; + uint8_t *buf = av_malloc(buf_size); + if (!buf) + return AVERROR(ENOMEM); + *ctx = avio_alloc_context(buf, buf_size, AVIO_FLAG_WRITE, NULL, NULL, NULL, NULL); + if (!*ctx) { + av_free(buf); + return AVERROR(ENOMEM); + } + return 0; +} + +static void close_null_ctx(AVIOContext *pb) +{ + av_free(pb->buffer); + av_free(pb); +} + static int seg_write_header(AVFormatContext *s) { SegmentContext *seg = s->priv_data; @@ -128,6 +149,8 @@ static int seg_write_header(AVFormatContext *s) seg->number = 0; seg->offset_time = 0; seg->recording_time = seg->time * 1000000; + if (!seg->write_header_trailer) + seg->individual_header_trailer = 0; if (seg->list) if ((ret = avio_open2(&seg->pb, seg->list, AVIO_FLAG_WRITE, @@ -166,15 +189,27 @@ static int seg_write_header(AVFormatContext *s) goto fail; } - if ((ret = avio_open2(&oc->pb, oc->filename, AVIO_FLAG_WRITE, - &s->interrupt_callback, NULL)) < 0) - goto fail; + if (seg->write_header_trailer) { + if ((ret = avio_open2(&oc->pb, oc->filename, AVIO_FLAG_WRITE, + &s->interrupt_callback, NULL)) < 0) + goto fail; + } else { + if ((ret = open_null_ctx(&oc->pb)) < 0) + goto fail; + } if ((ret = avformat_write_header(oc, NULL)) < 0) { avio_close(oc->pb); goto fail; } + if (!seg->write_header_trailer) { + close_null_ctx(oc->pb); + if ((ret = avio_open2(&oc->pb, oc->filename, AVIO_FLAG_WRITE, + &s->interrupt_callback, NULL)) < 0) + goto fail; + } + if (seg->list) { avio_printf(seg->pb, "%s\n", oc->filename); avio_flush(seg->pb); @@ -244,7 +279,15 @@ static int seg_write_trailer(struct AVFormatContext *s) { SegmentContext *seg = s->priv_data; AVFormatContext *oc = seg->avf; - int ret = segment_end(oc); + int ret; + if (!seg->write_header_trailer) { + ret = segment_end(oc, 0); + open_null_ctx(&oc->pb); + av_write_trailer(oc); + close_null_ctx(oc->pb); + } else { + ret = segment_end(oc, 1); + } if (seg->list) avio_close(seg->pb); avformat_free_context(oc); @@ -260,6 +303,7 @@ static const AVOption options[] = { { "segment_list_size", "maximum number of playlist entries", OFFSET(size), AV_OPT_TYPE_INT, {.i64 = 5}, 0, INT_MAX, E }, { "segment_wrap", "number after which the index wraps", OFFSET(wrap), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E }, { "individual_header_trailer", "write header/trailer to each segment", OFFSET(individual_header_trailer), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, E }, + { "write_header_trailer", "write a header to the first segment and a trailer to the last one", OFFSET(write_header_trailer), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, E }, { NULL }, }; From 91c1567beb606d20ec05d86226d869922d7e7eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 4 Oct 2012 15:28:30 +0300 Subject: [PATCH 2/6] segment: Add comments about calls that only are relevant for some muxers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/segment.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavformat/segment.c b/libavformat/segment.c index 1e928a7ebf..375df58396 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -98,7 +98,7 @@ static int segment_start(AVFormatContext *s, int write_header) return err; if (oc->oformat->priv_class && oc->priv_data) - av_opt_set(oc->priv_data, "resend_headers", "1", 0); + av_opt_set(oc->priv_data, "resend_headers", "1", 0); /* mpegts specific */ if (write_header) { if ((err = avformat_write_header(oc, NULL)) < 0) @@ -112,7 +112,7 @@ static int segment_end(AVFormatContext *oc, int write_trailer) { int ret = 0; - av_write_frame(oc, NULL); /* Flush any buffered data */ + av_write_frame(oc, NULL); /* Flush any buffered data (fragmented mp4) */ if (write_trailer) av_write_trailer(oc); avio_close(oc->pb); From 1e164c0bcc43ba01c5770b2d3977145eea6bcf98 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 14 Aug 2012 02:09:15 +0200 Subject: [PATCH 3/6] build: Factor out mpegaudio dependencies to CONFIG_MPEGAUDIO A new hidden config variable is added for the codecs that depend on the mpegaudio parts. --- configure | 22 ++++++++++++---------- libavcodec/Makefile | 34 ++++++++++++---------------------- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/configure b/configure index c74693bb22..d09684c7b0 100755 --- a/configure +++ b/configure @@ -1269,6 +1269,7 @@ CONFIG_EXTRA=" huffman lgplv3 lpc + mpegaudio mpegaudiodsp mpegvideo mpegvideoenc @@ -1399,6 +1400,7 @@ log2_deps="!msvcrt" dct_select="rdft" mdct_select="fft" rdft_select="fft" +mpegaudio_select="mpegaudiodsp" mpegaudiodsp_select="dct" mpegvideoenc_select="mpegvideo" @@ -1461,16 +1463,16 @@ loco_decoder_select="golomb" mdec_decoder_select="error_resilience mpegvideo" mjpeg_encoder_select="aandcttables mpegvideoenc" mlp_decoder_select="mlp_parser" -mp1_decoder_select="mpegaudiodsp" -mp1float_decoder_select="mpegaudiodsp" -mp2_decoder_select="mpegaudiodsp" -mp2float_decoder_select="mpegaudiodsp" -mp3_decoder_select="mpegaudiodsp" -mp3adu_decoder_select="mpegaudiodsp" -mp3adufloat_decoder_select="mpegaudiodsp" -mp3float_decoder_select="mpegaudiodsp" -mp3on4_decoder_select="mpegaudiodsp" -mp3on4float_decoder_select="mpegaudiodsp" +mp1_decoder_select="mpegaudio" +mp1float_decoder_select="mpegaudio" +mp2_decoder_select="mpegaudio" +mp2float_decoder_select="mpegaudio" +mp3_decoder_select="mpegaudio" +mp3adu_decoder_select="mpegaudio" +mp3adufloat_decoder_select="mpegaudio" +mp3float_decoder_select="mpegaudio" +mp3on4_decoder_select="mpegaudio" +mp3on4float_decoder_select="mpegaudio" mpc7_decoder_select="mpegaudiodsp" mpc8_decoder_select="mpegaudiodsp" mpeg_vdpau_decoder_select="vdpau mpegvideo_decoder" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 64c0125a64..bd6567eb52 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -49,6 +49,8 @@ OBJS-$(CONFIG_LIBXVID) += libxvid_rc.o OBJS-$(CONFIG_LPC) += lpc.o OBJS-$(CONFIG_LSP) += lsp.o OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o +OBJS-$(CONFIG_MPEGAUDIO) += mpegaudio.o mpegaudiodata.o \ + mpegaudiodecheader.o OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \ mpegaudiodsp_data.o \ mpegaudiodsp_fixed.o \ @@ -223,30 +225,18 @@ OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o mjpegdec.o mjpeg.o OBJS-$(CONFIG_MLP_DECODER) += mlpdec.o mlpdsp.o OBJS-$(CONFIG_MMVIDEO_DECODER) += mmvideo.o OBJS-$(CONFIG_MOTIONPIXELS_DECODER) += motionpixels.o -OBJS-$(CONFIG_MP1_DECODER) += mpegaudiodec.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o -OBJS-$(CONFIG_MP1FLOAT_DECODER) += mpegaudiodec_float.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o -OBJS-$(CONFIG_MP2_DECODER) += mpegaudiodec.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o +OBJS-$(CONFIG_MP1_DECODER) += mpegaudiodec.o +OBJS-$(CONFIG_MP1FLOAT_DECODER) += mpegaudiodec_float.o +OBJS-$(CONFIG_MP2_DECODER) += mpegaudiodec.o OBJS-$(CONFIG_MP2_ENCODER) += mpegaudioenc.o mpegaudio.o \ mpegaudiodata.o mpegaudiodsp_data.o -OBJS-$(CONFIG_MP2FLOAT_DECODER) += mpegaudiodec_float.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o -OBJS-$(CONFIG_MP3ADU_DECODER) += mpegaudiodec.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o -OBJS-$(CONFIG_MP3ADUFLOAT_DECODER) += mpegaudiodec_float.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o -OBJS-$(CONFIG_MP3ON4_DECODER) += mpegaudiodec.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o \ - mpeg4audio.o -OBJS-$(CONFIG_MP3ON4FLOAT_DECODER) += mpegaudiodec_float.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o \ - mpeg4audio.o -OBJS-$(CONFIG_MP3_DECODER) += mpegaudiodec.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o -OBJS-$(CONFIG_MP3FLOAT_DECODER) += mpegaudiodec_float.o mpegaudiodecheader.o \ - mpegaudio.o mpegaudiodata.o +OBJS-$(CONFIG_MP2FLOAT_DECODER) += mpegaudiodec_float.o +OBJS-$(CONFIG_MP3_DECODER) += mpegaudiodec.o +OBJS-$(CONFIG_MP3ADU_DECODER) += mpegaudiodec.o +OBJS-$(CONFIG_MP3ADUFLOAT_DECODER) += mpegaudiodec_float.o +OBJS-$(CONFIG_MP3FLOAT_DECODER) += mpegaudiodec_float.o +OBJS-$(CONFIG_MP3ON4_DECODER) += mpegaudiodec.o mpeg4audio.o +OBJS-$(CONFIG_MP3ON4FLOAT_DECODER) += mpegaudiodec_float.o mpeg4audio.o OBJS-$(CONFIG_MPC7_DECODER) += mpc7.o mpc.o OBJS-$(CONFIG_MPC8_DECODER) += mpc8.o mpc.o OBJS-$(CONFIG_MPEG_XVMC_DECODER) += mpegvideo_xvmc.o From cc5e9e5ff052fe31aa757de79f2d11fb21df3fba Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Thu, 4 Oct 2012 00:40:05 +0200 Subject: [PATCH 4/6] x86: ff_get_cpu_flags_x86(): Avoid a pointless variable indirection --- libavutil/x86/cpu.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libavutil/x86/cpu.c b/libavutil/x86/cpu.c index 9acc86755d..9cf68e4c98 100644 --- a/libavutil/x86/cpu.c +++ b/libavutil/x86/cpu.c @@ -108,10 +108,7 @@ int ff_get_cpu_flags_x86(void) return 0; /* CPUID not supported */ #endif - cpuid(0, max_std_level, ebx, ecx, edx); - vendor.i[0] = ebx; - vendor.i[1] = edx; - vendor.i[2] = ecx; + cpuid(0, max_std_level, vendor.i[0], vendor.i[2], vendor.i[1]); if (max_std_level >= 1) { cpuid(1, eax, ebx, ecx, std_caps); From 54b243141e9ded3437f055d173272caa399a216e Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Thu, 4 Oct 2012 14:01:26 +0200 Subject: [PATCH 5/6] x86: cpu: Break out test for cpuid capabilities into separate function --- libavutil/x86/cpu.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/libavutil/x86/cpu.c b/libavutil/x86/cpu.c index 9cf68e4c98..5de60147c6 100644 --- a/libavutil/x86/cpu.c +++ b/libavutil/x86/cpu.c @@ -86,6 +86,26 @@ #endif /* HAVE_INLINE_ASM */ +#if ARCH_X86_64 + +#define cpuid_test() 1 + +#elif HAVE_INLINE_ASM || HAVE_RWEFLAGS + +static int cpuid_test(void) +{ + x86_reg a, c; + + /* Check if CPUID is supported by attempting to toggle the ID bit in + * the EFLAGS register. */ + get_eflags(a); + set_eflags(a ^ 0x200000); + get_eflags(c); + + return a != c; +} +#endif + /* Function to test if multimedia instructions are supported... */ int ff_get_cpu_flags_x86(void) { @@ -95,18 +115,8 @@ int ff_get_cpu_flags_x86(void) int family = 0, model = 0; union { int i[3]; char c[12]; } vendor; -#if ARCH_X86_32 - x86_reg a, c; - - /* Check if CPUID is supported by attempting to toggle the ID bit in - * the EFLAGS register. */ - get_eflags(a); - set_eflags(a ^ 0x200000); - get_eflags(c); - - if (a == c) + if (!cpuid_test()) return 0; /* CPUID not supported */ -#endif cpuid(0, max_std_level, vendor.i[0], vendor.i[2], vendor.i[1]); From 65d12900432ac880d764edbbd36818431484a76e Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 20 Sep 2012 15:50:14 +0100 Subject: [PATCH 6/6] configure: add --enable-lto option This works with gcc. Other compilers might need to have a flag mapping added. Signed-off-by: Mans Rullgard --- configure | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/configure b/configure index d09684c7b0..4c3ebdb281 100755 --- a/configure +++ b/configure @@ -238,6 +238,7 @@ Advanced options (experts only): disable buffer boundary checking in bitreaders (faster, but may crash) --enable-memalign-hack emulate memalign, interferes with memory debuggers + --enable-lto use link-time optimization Optimization options (experts only): --disable-asm disable all assembler optimizations @@ -1290,6 +1291,7 @@ CMDLINE_SELECT=" debug extra_warnings logging + lto optimizations " @@ -3445,17 +3447,31 @@ void ff_foo(void) {} EOF fi -if [ -n "$optflags" ]; then - add_cflags $optflags -elif enabled small; then - add_cflags $cflags_size -elif enabled optimizations; then - add_cflags $cflags_speed -else - add_cflags $cflags_noopt +if [ -z "$optflags" ]; then + if enabled small; then + optflags=$cflags_size + elif enabled optimizations; then + optflags=$cflags_speed + else + optflags=$cflags_noopt + fi fi -check_cflags -fno-math-errno -check_cflags -fno-signed-zeros + +check_optflags(){ + check_cflags "$@" + enabled lto && check_ldflags "$@" +} + + +if enabled lto; then + test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker" + check_cflags -flto + check_ldflags -flto $cpuflags +fi + +check_optflags $optflags +check_optflags -fno-math-errno +check_optflags -fno-signed-zeros if enabled icc; then # Just warnings, no remarks @@ -3490,7 +3506,7 @@ elif enabled ccc; then add_cflags -msg_disable ptrmismatch1 add_cflags -msg_disable unreachcode elif enabled gcc; then - check_cflags -fno-tree-vectorize + check_optflags -fno-tree-vectorize check_cflags -Werror=implicit-function-declaration check_cflags -Werror=missing-prototypes check_cflags -Werror=declaration-after-statement