Diego Biurrun [Mon, 20 Aug 2012 23:02:13 +0000 (01:02 +0200)]
silly typo fixes
Christophe Gisquet [Tue, 9 Apr 2013 21:57:10 +0000 (21:57 +0000)]
sbrdsp: Unroll and use integer operations
This patch can be controversial, by assuming floats are IEEE-754 and
particular behaviour of the FPU will get in the way.
Timing on Arrandale and Win32 (thus, x87 FPU is used in the reference).
sbr_qmf_pre_shuffle_c: 115 to 76
sbr_neg_odd_64_c: 84 to 55
sbr_qmf_post_shuffle_c: 112 to 83
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Christophe Gisquet [Tue, 9 Apr 2013 21:57:09 +0000 (21:57 +0000)]
sbrdsp: Unroll sbr_autocorrelate_c
1410 cycles to 1148 on Arrandale/Win64
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Christophe Gisquet [Tue, 9 Apr 2013 21:57:07 +0000 (21:57 +0000)]
x86: sbrdsp: Implement SSE2 qmf_deint_bfly
Sandybridge: 47 cycles
Having a loop counter is a 7 cycle gain.
Unrolling is another 7 cycle gain.
Working in reverse scan is another 6 cycles.
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Martin Storsjö [Thu, 2 May 2013 08:01:43 +0000 (11:01 +0300)]
compat: msvc: Make sure the object files are included when linking statically
If building libav with -MD in the cflags (for making the MSVC compiler
generate code for using a dynamically linked libc), the system headers
that declare strtod, snprintf and vsnprintf declare the functions as
imported from a DLL. To hook up wrappers of our own for these functions,
the function names are defined to avpriv_*, so that the calling code
within libav calls the wrappers instead. Since these functions
are declared to be imported from DLLs, the calling code expects to
load them from DLL import function pointers (creating references to
_imp__avpriv_strtod instead of directly to avpriv_strtod). If the
libav libraries are not built as DLLs, no such function pointers (as
the calling code expects) are created.
The linker can fix this up automatically in some cases (producing
warnings LNK4217 and LNK4049), if the object files are already
included. By telling the linker to try to include those symbols
(without the _imp prefix as the calling code ends up using),
we get the object files included, so that the linker can do the
automatic fixup. This is done via config.h, so that all (or at least
most) of the object files in our libraries force including the compat
files, to make sure they are included regardless of what files from our
static libraries actually are included.
Signed-off-by: Martin Storsjö <martin@martin.st>
Luca Barbato [Wed, 1 May 2013 17:01:11 +0000 (19:01 +0200)]
id3v2: check for end of file while unescaping tags
Prevent a serious out of buffer bound write.
Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC:libav-stable@libav.org
Anton Khirnov [Wed, 24 Apr 2013 06:34:44 +0000 (08:34 +0200)]
avconv: do not send non-monotonous DTS to the muxers.
Hack partially based on a commit by Michael Niedermayer <michaelni@gmx.at>
Should fix (or work around) bug 458.
Anton Khirnov [Tue, 23 Apr 2013 18:34:59 +0000 (20:34 +0200)]
avconv: improve -re implementation
Integrate the code in the packet reading function, instead of inserting
sleeps in many places.
This is simpler to follow and should work better.
Anton Khirnov [Tue, 30 Apr 2013 06:36:20 +0000 (08:36 +0200)]
matroskaenc: add an option to put the index at the start of the file
Anton Khirnov [Tue, 30 Apr 2013 05:52:50 +0000 (07:52 +0200)]
matroskaenc: cosmetics, reorder the #includes
Masaki Tanaka [Tue, 9 Apr 2013 07:44:40 +0000 (16:44 +0900)]
vc1_parser: Set field_order.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Masaki Tanaka [Tue, 9 Apr 2013 07:43:08 +0000 (16:43 +0900)]
mpegvideo_parser: Set field_order.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Masaki Tanaka [Tue, 9 Apr 2013 07:39:34 +0000 (16:39 +0900)]
avcodec: Add field order information to AVCodecParserContext.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Christophe Gisquet [Fri, 12 Apr 2013 19:07:01 +0000 (21:07 +0200)]
x86: float dsp: butterflies_float SSE
97c -> 49c
Some codecs could benefit from more unrolling, but AAC doesn't.
Anton Khirnov [Thu, 2 May 2013 07:39:18 +0000 (09:39 +0200)]
lavf-regression: use -frames instead of -t for image tests
-t 0.5 is 12.5 frames at 25 fps, which may round to either 12 or 13 on
different platforms.
Anton Khirnov [Tue, 30 Apr 2013 10:17:33 +0000 (12:17 +0200)]
lavc: schedule AVCodecContext.lowres for removal on next bump.
It has been deprecated some time ago, but was forgotten during the last
bump.
Martin Storsjö [Wed, 3 Apr 2013 12:55:14 +0000 (15:55 +0300)]
configure: Don't do enable_deep_weak on disabled variables
This avoids cases where configure tries to weakly enable an item
which actually is disabled, ending up still enabling dependencies
of the item which itself is only enabled weakly.
More concretely, the h264 decoder suggests error resilience, which
is then enabled weakly (unless manually disabled). Previously,
dsputil, which is a dependency of error resilience, was enabled
even if error resilience wasn't enabled in the end.
Signed-off-by: Martin Storsjö <martin@martin.st>
Martin Storsjö [Wed, 3 Apr 2013 12:52:45 +0000 (15:52 +0300)]
configure: Use a different variable name in push/popvar
The variable name 'var' is commonly used to iterate through arguments
in other functions. When the pushvar function internally uses the
variable 'var', it makes pushing/popping the variable 'var' not
work as intended.
Signed-off-by: Martin Storsjö <martin@martin.st>
Luca Barbato [Thu, 2 May 2013 09:42:09 +0000 (11:42 +0200)]
wav: K&R formatting cosmetics
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Diego Biurrun [Thu, 2 May 2013 14:55:59 +0000 (16:55 +0200)]
aac: Remove aacpsy.h header, unused since
78e65cd7726
Diego Biurrun [Thu, 2 May 2013 14:46:51 +0000 (16:46 +0200)]
cavs: Remove cavsdata.h header, unused since
88386feefd
Diego Biurrun [Sat, 27 Apr 2013 20:54:57 +0000 (22:54 +0200)]
x86: dsputil: Move cavs and vc1-specific functions where they belong
Diego Biurrun [Sat, 27 Apr 2013 20:52:26 +0000 (22:52 +0200)]
x86: dsputil: Move avg_pixels16_mmx() out of rnd_template.c
The function does not do any rounding, so there is no point in
keeping it in a round template file.
Diego Biurrun [Sat, 27 Apr 2013 20:01:07 +0000 (22:01 +0200)]
x86: dsputil: Move avg_pixels8_mmx() out of rnd_template.c
The function is only instantiated once, so there is no point
in keeping it in a template file.
Diego Biurrun [Tue, 23 Apr 2013 15:10:59 +0000 (17:10 +0200)]
x86: Move duplicated put_pixels{8|16}_mmx functions into their own file
Luca Barbato [Wed, 1 May 2013 17:11:54 +0000 (19:11 +0200)]
id3v2: K&R formatting cosmetics
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Diego Biurrun [Tue, 30 Apr 2013 16:02:48 +0000 (18:02 +0200)]
ppc: Only compile AltiVec FFT assembly when AltiVec is enabled
Derek Buitenhuis [Mon, 29 Apr 2013 02:23:45 +0000 (22:23 -0400)]
avutil: doxy: Small clarification for av_buffer_create()
Explicitly saying it can't hurt.
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Derek Buitenhuis [Mon, 29 Apr 2013 02:15:34 +0000 (22:15 -0400)]
avcodec: doxy: Clarify how to use buf[] when implementing get_buffer2()
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Derek Buitenhuis [Mon, 29 Apr 2013 02:13:21 +0000 (22:13 -0400)]
avcodec: doxy: Clarify what get_buffer2 must fill in buf[]
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Diego Biurrun [Sat, 20 Apr 2013 19:47:15 +0000 (21:47 +0200)]
avformat: Drop unnecessary ff_ name prefixes from static functions
Diego Biurrun [Sat, 20 Apr 2013 19:48:29 +0000 (21:48 +0200)]
ppc: Drop unnecessary ff_ name prefixes from static functions
Diego Biurrun [Sat, 20 Apr 2013 20:15:22 +0000 (22:15 +0200)]
x86: Drop unnecessary ff_ name prefixes from static functions
Diego Biurrun [Sat, 20 Apr 2013 19:49:09 +0000 (21:49 +0200)]
arm: Drop unnecessary ff_ name prefixes from static functions
Diego Biurrun [Sat, 20 Apr 2013 19:51:11 +0000 (21:51 +0200)]
avcodec: Drop unnecessary ff_ name prefixes from static functions
Diego Biurrun [Sun, 14 Apr 2013 12:47:30 +0000 (14:47 +0200)]
ppc: More consistent arch initialization
Diego Biurrun [Fri, 26 Apr 2013 10:43:11 +0000 (12:43 +0200)]
fft: Remove pointless #ifdefs around function declarations
Diego Biurrun [Fri, 26 Apr 2013 22:37:32 +0000 (00:37 +0200)]
ppc: Move AltiVec utility headers out of AltiVec ifdefs
Now that the headers themselves have ifdef protection this is no
longer necessary and more consistent with normal include handling.
Diego Biurrun [Fri, 26 Apr 2013 22:35:08 +0000 (00:35 +0200)]
ppc: util_altivec: Surround AltiVec-related code by appropriate ifdefs
This prevents non-AltiVec-enabled compilers from choking.
Diego Biurrun [Sun, 14 Apr 2013 12:42:24 +0000 (14:42 +0200)]
ppc: More consistent names for H.264 optimizations files
Diego Biurrun [Fri, 26 Apr 2013 23:03:37 +0000 (01:03 +0200)]
mpegaudiosp: More consistent names for ppc/x86 optimization files
Anton Khirnov [Wed, 10 Apr 2013 13:02:01 +0000 (15:02 +0200)]
avconv: make output -ss insert trim/atrim filters.
This makes output -ss sample-accurate for audio and will allow further
simplication in the future.
Anton Khirnov [Wed, 10 Apr 2013 13:02:01 +0000 (15:02 +0200)]
avconv: make -t insert trim/atrim filters.
This makes -t sample-accurate for audio and will allow further
simplication in the future.
Most of the FATE changes are due to audio now being sample accurate. In
some cases a video frame was incorrectly passed with the old code, while
its was over the limit.
Anton Khirnov [Wed, 10 Apr 2013 12:46:20 +0000 (14:46 +0200)]
avconv_opt: allocate an OutputFile before the streams.
This way OutputFile variables like recording time can be used when
creating the streams.
Anton Khirnov [Tue, 2 Apr 2013 17:30:11 +0000 (19:30 +0200)]
lavfi: add trim and atrim filters.
Anton Khirnov [Wed, 10 Apr 2013 14:28:38 +0000 (16:28 +0200)]
lavfi: add an asetpts filter
Anton Khirnov [Wed, 10 Apr 2013 14:13:50 +0000 (16:13 +0200)]
vf_setpts: cosmetics, reformat
Anton Khirnov [Wed, 10 Apr 2013 10:44:13 +0000 (12:44 +0200)]
graphparser: only print filter arguments if they are non-NULL
Anton Khirnov [Wed, 10 Apr 2013 10:40:04 +0000 (12:40 +0200)]
af_channelmap: ensure the output channel layout is valid.
Anton Khirnov [Wed, 10 Apr 2013 10:28:51 +0000 (12:28 +0200)]
af_channelmap: remove now unnecessary goto
Options are freed from the generic code now, there is no need to call
av_opt_free() from the filter.
Anton Khirnov [Tue, 9 Apr 2013 20:09:20 +0000 (22:09 +0200)]
vf_split: fix description
It now allows an arbitrary number of inputs, not just two.
Anton Khirnov [Wed, 24 Apr 2013 08:19:54 +0000 (10:19 +0200)]
lavc: clear AVBuffers on decoded frames if refcounted_frames is not set
Otherwise some code might mistakenly think it is allowed to unref those
buffers, which would lead to double unref.
Anton Khirnov [Sat, 27 Apr 2013 18:54:55 +0000 (20:54 +0200)]
FATE: add an additional indeo3 test
It is a part of the sample that got broken by recent indeo3 changes.
Anton Khirnov [Sat, 27 Apr 2013 18:29:09 +0000 (20:29 +0200)]
indeo3: use put_pixels instead of put_no_rnd_pixels in copy_cell()
They are the same in this case, except put_pixels also has blocksizes
smaller than 8.
Anton Khirnov [Sat, 27 Apr 2013 16:01:51 +0000 (18:01 +0200)]
indeo3: fix off by one in MV validity check
CC:libav-stable@libav.org
Diego Biurrun [Wed, 10 Apr 2013 23:31:51 +0000 (01:31 +0200)]
x86: dsputil: Remove a set of pointless #ifs around function declarations
Diego Biurrun [Sun, 28 Apr 2013 00:05:58 +0000 (02:05 +0200)]
x86: dsputil: cosmetics: Group ff_{avg|put}_pixels16_mmxext() declarations
Diego Biurrun [Tue, 23 Apr 2013 14:26:02 +0000 (16:26 +0200)]
x86: hpeldsp: Remove unused macro definitions
Luca Barbato [Sat, 27 Apr 2013 16:20:47 +0000 (18:20 +0200)]
aac: check the maximum number of channels
Broken bitstreams could report a larger than specified number of
channels and cause outbound writes.
CC:libav-stable@libav.org
Diego Biurrun [Sat, 27 Apr 2013 16:49:54 +0000 (18:49 +0200)]
h264_refs: Do not print check_opcodes() return value
The return value provides no useful information and removing the printing
avoids the following warning:
libavcodec/h264_refs.c:788:15: warning: 'i' may be used uninitialized in this function [-Wuninitialized]
Diego Biurrun [Mon, 15 Apr 2013 23:42:38 +0000 (01:42 +0200)]
fate: Invoke pixfmts lavfi tests through fate-run.sh
Diego Biurrun [Mon, 15 Apr 2013 22:15:15 +0000 (00:15 +0200)]
fate: Invoke pixdesc lavfi tests through fate-run.sh
Diego Biurrun [Mon, 15 Apr 2013 21:39:08 +0000 (23:39 +0200)]
fate: Invoke standard lavfi tests through fate-run.sh
Luca Barbato [Wed, 17 Apr 2013 09:09:36 +0000 (11:09 +0200)]
oma: K&R formatting cosmetics
Luca Barbato [Mon, 15 Apr 2013 09:10:14 +0000 (11:10 +0200)]
avplay: remove a warning
Set the data field in the flush_pkt to the pointer to the actual packet.
The field needs to contain a valid unique pointer, no read nor writes
are ever made to it.
Anton Khirnov [Fri, 26 Apr 2013 07:54:59 +0000 (09:54 +0200)]
hls, segment: fix splitting for audio-only streams.
CC:libav-stable@libav.org
Diego Biurrun [Fri, 26 Apr 2013 14:48:39 +0000 (16:48 +0200)]
x86: ac3dsp: Remove 3dnow version of ff_ac3_extract_exponents
The function requires increasing the fuzz factor for the ac3/eac3 encode
tests and even so makes fate fail. It only provides a slight encoding
speedup for legacy CPUs that do not support SS2. Thus its benefit is not
worth the trouble it creates and fixing it would be a waste of time.
Martin Storsjö [Tue, 23 Apr 2013 20:35:14 +0000 (23:35 +0300)]
x86: Rename dsputil_rnd_template.c to rnd_template.c
This makes it less confusing when this template is shared both by
dsputil and by hpeldsp.
Signed-off-by: Martin Storsjö <martin@martin.st>
Luca Barbato [Wed, 3 Apr 2013 12:11:10 +0000 (14:11 +0200)]
lavf: introduce AVFMT_TS_NEGATIVE
Most formats do not support negative timestamps, shift them to avoid
unexpected behaviour and a number of bad crashes.
CC:libav-stable@libav.org
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Vittorio Giovara [Fri, 22 Mar 2013 08:55:11 +0000 (09:55 +0100)]
fate: add CVFC1_Sony_C to h264 conformance tests
The sample is already included in the FATE suite, but is not tested
because cropping wasn't fully supported before.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Anton Khirnov [Fri, 19 Apr 2013 06:34:22 +0000 (08:34 +0200)]
doc/APIchanges: add missing hashes and dates
Martin Storsjö [Fri, 19 Apr 2013 21:14:44 +0000 (00:14 +0300)]
x86: Get rid of duplication between *_rnd_template.c
Signed-off-by: Martin Storsjö <martin@martin.st>
Hendrik Leppkes [Sat, 20 Apr 2013 09:33:56 +0000 (11:33 +0200)]
mpegvideo: unref cur/next/prev frames when flushing
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Martin Storsjö [Mon, 22 Apr 2013 09:23:47 +0000 (12:23 +0300)]
x86: Factorize duplicated inline assembly snippets
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Nicolas Bertrand [Mon, 22 Apr 2013 16:49:11 +0000 (18:49 +0200)]
jpeg2000: Add mutlti-threading support to decoder
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Diego Biurrun [Mon, 22 Apr 2013 02:57:48 +0000 (04:57 +0200)]
x86: Move some conditional code around to avoid unused variable warnings
Janne Grunau [Mon, 22 Apr 2013 14:08:03 +0000 (16:08 +0200)]
jpeg2kdec: output is native endian AV_PIX_FMT_XYZ12
Janne Grunau [Mon, 22 Apr 2013 13:31:58 +0000 (15:31 +0200)]
threads: always call thread_finish_setup for intra codecs
Intra codecs do not need an update_thread_context() function and never
call ff_thread_finish_setup(). They rely on ff_thread_get_buffer()
calling it. So call it even if the get_buffer2 function pointer is
avcodec_default_get_buffer2 and it has not been called before.
Diego Biurrun [Mon, 22 Apr 2013 13:52:00 +0000 (15:52 +0200)]
avcodec: Bump minor for JPEG 2000 decoder
Nicolas Bertrand [Mon, 22 Apr 2013 09:41:01 +0000 (11:41 +0200)]
JPEG 2000 decoder for DCinema
Based on the 2007 GSoC project from Kamil Nowosad <k.nowosad@students.mimuw.edu.pl>
Updated to current programming standards, style and many more small
fixes by Diego Biurrun <diego@biurrun.de>.
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Diego Biurrun [Thu, 18 Apr 2013 17:26:18 +0000 (19:26 +0200)]
sh4: Remove dubious aligned dsputil code
The code represents a considerable maintenance burden and it is not
clear that it gives a noticeable benefit to outweigh this after 10
years of improvements in compiler technology since its creation.
Diego Biurrun [Sat, 20 Apr 2013 20:13:01 +0000 (22:13 +0200)]
x86: cavs: Refactor duplicate dspfunc macro
Diego Biurrun [Mon, 22 Apr 2013 02:50:45 +0000 (04:50 +0200)]
mxfenc: Use correct printf format specifier for int64_t
libavformat/mxfenc.c:1861:9: warning: format '%lld' expects argument of type 'long long int', but argument 5 has type 'int64_t' [-Wformat]
Diego Biurrun [Mon, 22 Apr 2013 00:53:58 +0000 (02:53 +0200)]
h264: Drop unused variable
Diego Biurrun [Sat, 20 Apr 2013 20:03:19 +0000 (22:03 +0200)]
x86: cavs: Put mmx-specific code into its own init function
Before, this code was labeled as mmxext and enabled both for the
3dnow and the mmxext case.
Diego Biurrun [Sat, 20 Apr 2013 18:27:47 +0000 (20:27 +0200)]
x86: Remove some duplicate function declarations
Anton Khirnov [Tue, 16 Apr 2013 19:53:56 +0000 (21:53 +0200)]
afifo: fix request_samples on the last frame in certain cases
The current code can fail to return the last frame if it contains
exactly the requested number of samples.
Fixes the join filter test, which previously did not include the last
408 samples in most cases.
CC:libav-stable@libav.org
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Luca Barbato [Sat, 20 Apr 2013 11:36:48 +0000 (13:36 +0200)]
riff: Factor out WAVEFORMATEX parsing
Makes the code simpler to follow.
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Peter Ross [Sat, 20 Apr 2013 11:36:47 +0000 (13:36 +0200)]
riff: Add ACTRAC3+ guid
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Peter Ross [Sat, 20 Apr 2013 11:36:46 +0000 (13:36 +0200)]
riff: Perform full lookup on WAVEFORMATEXTENSIBLE subformat guid
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Peter Ross [Sat, 20 Apr 2013 11:36:45 +0000 (13:36 +0200)]
riff: Move guid structs and helper functions into riff
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Luca Barbato [Sat, 20 Apr 2013 11:36:44 +0000 (13:36 +0200)]
riff: check for eof if chunk size and code are 0
Prevent an infinite loop.
Inspired by a patch from Michael Niedermayer
CC: libav-stable@libav.org
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Luca Barbato [Sat, 20 Apr 2013 11:36:43 +0000 (13:36 +0200)]
riff: K&R formatting cosmetics
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Martin Storsjö [Fri, 19 Apr 2013 22:29:17 +0000 (01:29 +0300)]
ppc: hpeldsp: Include attributes.h
This fixes building in configurations where altivec is disabled.
Signed-off-by: Martin Storsjö <martin@martin.st>
Martin Storsjö [Fri, 19 Apr 2013 21:06:48 +0000 (00:06 +0300)]
x86: Remove unused inline asm instruction defines
Signed-off-by: Martin Storsjö <martin@martin.st>
Martin Storsjö [Fri, 19 Apr 2013 21:04:20 +0000 (00:04 +0300)]
vc1: Remove now unused variables
Signed-off-by: Martin Storsjö <martin@martin.st>
Martin Storsjö [Wed, 3 Apr 2013 11:11:38 +0000 (04:11 -0700)]
cosmetics: bfin: Fix indentation in the dsputil init function
Signed-off-by: Martin Storsjö <martin@martin.st>
Ronald S. Bultje [Thu, 14 Mar 2013 17:01:52 +0000 (10:01 -0700)]
dsputil: Remove non-8bpp draw_edge
It is never used.
Signed-off-by: Martin Storsjö <martin@martin.st>
Ronald S. Bultje [Tue, 26 Mar 2013 15:09:05 +0000 (17:09 +0200)]
dsputil: Merge 9-10 bpp functions for get_pixels and draw_edge
These only care about pixel storage unit size, not actual bits
used (i.e. they don't clip).
Signed-off-by: Martin Storsjö <martin@martin.st>
Ronald S. Bultje [Tue, 26 Mar 2013 15:07:22 +0000 (17:07 +0200)]
dsputil: Remove unused 32-bit functions
Previously, if dct_bits was set to 32, we used separate 32-bit
versions of these functions. Since dct_bits now is removed,
remove the unused 32-bit versions of the functions.
Signed-off-by: Martin Storsjö <martin@martin.st>