Ben Avison [Thu, 10 Jul 2014 23:12:31 +0000 (00:12 +0100)]
armv6: Accelerate ff_imdct_half for general case (mdct_bits != 6)
The previous implementation targeted DTS Coherent Acoustics, which only
requires mdct_bits == 6. This relatively small size lent itself to
unrolling the loops a small number of times, and encoding offsets
calculated at assembly time within the load/store instructions of each
iteration.
In the more general case (codecs such as AAC and AC3) much larger arrays
are used - mdct_bits == [8, 9, 11]. The old method does not scale for
these cases, so more integer registers are used with non-unrolled versions
of the loops (and with some stack spillage). The postrotation filter loop
is still unrolled by a factor of 2 to permit the double-buffering of some
VFP registers to facilitate overlap of neighbouring iterations.
I benchmarked the result by measuring the number of gperftools samples
that hit anywhere in the AAC decoder (starting from aac_decode_frame())
or specifically in ff_imdct_half_c / ff_imdct_half_vfp, for the same
example AAC stream:
Before After
Mean StdDev Mean StdDev Confidence Change
aac_decode_frame 2368.1 35.8 2117.2 35.3 100.0% +11.8%
ff_imdct_half_* 457.5 22.4 251.2 16.2 100.0% +82.1%
Signed-off-by: Martin Storsjö <martin@martin.st>
Diego Biurrun [Sat, 8 Feb 2014 01:59:58 +0000 (02:59 +0100)]
dsputil: Split motion estimation compare bits off into their own context
Martin Storsjö [Wed, 16 Jul 2014 16:43:12 +0000 (19:43 +0300)]
configure: Assume runtime cpu detection on arm on --target-os=android as well
Signed-off-by: Martin Storsjö <martin@martin.st>
Diego Biurrun [Sat, 4 Jan 2014 14:23:15 +0000 (15:23 +0100)]
x86: dsputil: Coalesce all init files
This makes the init files match the structure of the dsputil split.
Nidhi Makhijani [Mon, 14 Jul 2014 06:22:44 +0000 (11:52 +0530)]
avpacket: Check for and return errors in ff_interleave_add_packet()
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Luca Barbato [Wed, 16 Jul 2014 22:31:06 +0000 (18:31 -0400)]
h264: K&R formatting cosmetics
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Diego Biurrun [Wed, 16 Jul 2014 19:26:34 +0000 (12:26 -0700)]
h264: Remove some commented-out, broken cruft
Diego Biurrun [Tue, 8 Jul 2014 15:47:52 +0000 (08:47 -0700)]
arm: dsputil: Coalesce all init files
Vittorio Giovara [Tue, 15 Jul 2014 19:22:11 +0000 (15:22 -0400)]
g2meet: allow size changes within original sizes
Martin Storsjö [Sat, 12 Jul 2014 18:29:17 +0000 (21:29 +0300)]
fate: Use the correct, local path to samples for opus reference files
This fixes running fate in configs where the samples are located
in a different path on the target.
Signed-off-by: Martin Storsjö <martin@martin.st>
Diego Biurrun [Tue, 8 Jul 2014 15:59:31 +0000 (08:59 -0700)]
x86: dsputil: Avoid pointless CONFIG_ENCODERS indirection
The remaining dsputil bits are encoding-specific anyway.
Diego Biurrun [Tue, 8 Jul 2014 15:36:32 +0000 (08:36 -0700)]
ppc: dsputil: Coalesce all init files
Diego Biurrun [Fri, 11 Jul 2014 13:49:16 +0000 (06:49 -0700)]
examples/output: Remove unused variable
doc/examples/output.c:460:9: warning: unused variable ‘i’
Diego Biurrun [Tue, 8 Jul 2014 15:31:15 +0000 (08:31 -0700)]
dsputil: Drop unused bit_depth parameter from all init functions
Luca Barbato [Fri, 4 Jul 2014 14:53:31 +0000 (16:53 +0200)]
mov: Clarify tkhd flag settings
Luca Barbato [Fri, 4 Jul 2014 14:26:06 +0000 (16:26 +0200)]
mov: Do not group tracks if more than one is enabled per type
The specification requires at most 1 track enabled per alternate group.
Gildas Cocherel [Fri, 4 Jul 2014 15:21:56 +0000 (11:21 -0400)]
hevc: implement pic_output_flag handling
Sample-Id: OPFLAG_B_Qualcomm_1.bit, OPFLAG_C_Qualcomm_1.bit
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Mickaël Raulet [Fri, 4 Jul 2014 15:21:55 +0000 (11:21 -0400)]
hevc: set the keyframe flag on output frames
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Mickaël Raulet [Fri, 4 Jul 2014 15:21:54 +0000 (11:21 -0400)]
hevc: Replace nal type chek with equivalent IS_IRAP macro
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Anton Khirnov [Fri, 11 Jul 2014 08:38:51 +0000 (08:38 +0000)]
hevc_ps: remove a write-only variable
Nidhi Makhijani [Thu, 10 Jul 2014 08:14:51 +0000 (13:44 +0530)]
cdg: Forward error from avio_size() in read_header() function
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Alexander V. Lukyanov [Tue, 8 Jul 2014 07:54:15 +0000 (11:54 +0400)]
mpegts: pass MpegTSContext ptr explicitly
AVFormatContext->priv_data is not always a MpegTSContext, it can be
RTSPState when decoding a RTP stream. So it is necessary to pass
MpegTSContext pointer explicitly.
Within libav, the write_section_data function doesn't actually use
the MpegTSContext at all, so this doesn't change anything at the
moment (no memory was corrupted before), but it reduces the risk of
anybody trying to touch the MpegTSContext via AVFormatContext->priv_data
in the future.
Signed-off-by: Martin Storsjö <martin@martin.st>
Diego Biurrun [Mon, 3 Feb 2014 22:29:09 +0000 (14:29 -0800)]
dsputil: Split off pixel block routines into their own context
Vittorio Giovara [Wed, 2 Jul 2014 16:02:15 +0000 (12:02 -0400)]
hevc: parse display orientation SEI message
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Vittorio Giovara [Wed, 2 Jul 2014 15:58:19 +0000 (11:58 -0400)]
h264: parse display orientation SEI message
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Vittorio Giovara [Wed, 18 Jun 2014 22:08:20 +0000 (18:08 -0400)]
display: add matrix flip api
Andrew Kelley [Thu, 3 Jul 2014 20:22:33 +0000 (16:22 -0400)]
doc: mention option to mix shared/static libraries
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Anton Khirnov [Sat, 5 Jul 2014 07:01:07 +0000 (07:01 +0000)]
rtpdec: pass an AVFormatContext to ff_parse_fmtp()
Use it for logging, instead of NULL or the stream codec context.
Anton Khirnov [Sat, 5 Jul 2014 06:44:00 +0000 (06:44 +0000)]
yuv4mpegenc: do not access AVCodecContext.coded_frame
Its contents are meaningful only if the stream codec context is the one
actually used for encoding, which is often not the case (and is
discouraged).
Use AVCodecContext.field_order instead.
Anton Khirnov [Thu, 19 Jun 2014 07:13:19 +0000 (09:13 +0200)]
nsvdec: remove commented out cruft
Anton Khirnov [Thu, 19 Jun 2014 06:56:24 +0000 (08:56 +0200)]
mov: free the dv demux context with avformat_free_context()
Anton Khirnov [Sun, 15 Jun 2014 04:38:41 +0000 (06:38 +0200)]
mtv: do not set sample_rate for video
Anton Khirnov [Sun, 1 Jun 2014 08:19:47 +0000 (10:19 +0200)]
oggparsecelt: do not set AVCodecContext.frame_size
It is supposed to be set by decoders only.
Anton Khirnov [Thu, 3 Jul 2014 19:01:59 +0000 (19:01 +0000)]
adxdec: get rid of an avpriv function
The only thing the demuxer needs is the sample rate to set the timebase,
which can be simply read with AV_RB32.
Anton Khirnov [Sat, 5 Jul 2014 09:09:15 +0000 (09:09 +0000)]
lavc: export DV profile API used by muxer/demuxer as public
Anton Khirnov [Wed, 9 Jul 2014 10:33:03 +0000 (10:33 +0000)]
avconv: set the output stream timebase
This is required by the new API.
Anton Khirnov [Wed, 9 Jul 2014 10:26:03 +0000 (10:26 +0000)]
avformat: update muxing doxy
The callers should now set the stream timebase, not the codec one.
Anton Khirnov [Fri, 4 Jul 2014 15:52:03 +0000 (15:52 +0000)]
cdg: set the keyframe flag on the first packet
Bug-Id: 55
Martin Storsjö [Mon, 7 Jul 2014 19:07:49 +0000 (22:07 +0300)]
mov: Remove a variable that is set but never used
This silences a warning with gcc.
Signed-off-by: Martin Storsjö <martin@martin.st>
Martin Storsjö [Sun, 6 Jul 2014 20:18:27 +0000 (23:18 +0300)]
avplay: Handle pixel aspect ratio properly
This was broken (left half-implemented) in
354468fc12.
CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
Luca Barbato [Mon, 7 Jul 2014 18:48:34 +0000 (20:48 +0200)]
nut: Use nut->version in the version range check
It was wrongly left unchanged when the version field had been
introduced. (
c94e2e85cb6af8a570d8542a830556243bd32873)
Martin Storsjö [Fri, 4 Jul 2014 15:21:50 +0000 (18:21 +0300)]
arm: Avoid using the 'setend' instruction on ARMv7 and newer
This instruction is deprecated on ARMv8, and it is serializing on
some ARMv7 cores as well [1].
[1] http://article.gmane.org/gmane.linux.ports.arm.kernel/339293
CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
Roman Savchenko [Tue, 8 Jul 2014 08:24:09 +0000 (08:24 +0000)]
avformat_new_stream: make the AVCodec parameter const
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Andrew Kelley [Sun, 6 Jul 2014 05:24:43 +0000 (22:24 -0700)]
af_compand: make sure request_frame always outputs at least one frame
This fixes a segmentation fault because request_frame in fifo.c assumes
that the call to ff_request_frame will populate fifo->root.next.
Before, it was possible for request_frame in af_compand to not do this,
resulting in a null pointer access. Now, request_frame in af_compand
always will return at least one frame or an error, as per the API
specifications in avfilter.h for request_frame.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diego Biurrun [Mon, 3 Feb 2014 18:09:45 +0000 (10:09 -0800)]
dsputil: Split off FDCT bits into their own context
Omer Osman [Mon, 7 Jul 2014 08:28:12 +0000 (10:28 +0200)]
libfdk-aacdec: Decode the first AAC frame to reliably identify the bitstream
For implicit signaling cases (as possible for Spectral Band Replication
and Parametric Stereo Tools), the decoder must decode the first frame to
correctly identify the stream configuration (as called from
avformat_find_stream_info). The mechanism for this is built-in and only
requires adding CODEC_CAP_CHANNEL_CONF to the libfdk-aacdec AVCodec
struct.
Signed-off-by: Omer Osman <omer.osman@iis.fraunhofer.de>
Signed-off-by: Martin Storsjö <martin@martin.st>
Michael Niedermayer [Sun, 6 Jul 2014 03:02:38 +0000 (05:02 +0200)]
smoothstreamingenc: Fix a memory leak on errors
Signed-off-by: Martin Storsjö <martin@martin.st>
Nidhi Makhijani [Mon, 7 Jul 2014 04:11:04 +0000 (09:41 +0530)]
vmd: Split audio and video decoder
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Diego Biurrun [Mon, 3 Feb 2014 19:13:59 +0000 (11:13 -0800)]
dsputil: Move draw_edges() to mpegvideoencdsp
Diego Biurrun [Mon, 30 Dec 2013 18:56:07 +0000 (19:56 +0100)]
dsputil: Move pix_sum, pix_norm1, shrink function pointers to mpegvideoenc
Diego Biurrun [Mon, 30 Dec 2013 18:19:39 +0000 (19:19 +0100)]
dsputil: Split off *_8x8basis to a separate context
Timothy Gu [Sun, 6 Jul 2014 17:54:17 +0000 (10:54 -0700)]
audio_fifo: Split into a separate doxygen module
Signed-off-by: Timothy Gu <timothygu99@gmail.com>
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Timothy Gu [Sun, 6 Jul 2014 17:53:33 +0000 (10:53 -0700)]
samplefmt: Add doxygen categories
Categorize the enum and functions as "audio-related".
Signed-off-by: Timothy Gu <timothygu99@gmail.com>
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Nidhi Makhijani [Sun, 6 Jul 2014 13:45:52 +0000 (19:15 +0530)]
dsicin: Split audio and video decoder
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Nidhi Makhijani [Sun, 6 Jul 2014 14:03:49 +0000 (19:33 +0530)]
bmv: Split audio and video decoder
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Nidhi Makhijani [Sun, 6 Jul 2014 04:42:50 +0000 (10:12 +0530)]
paf: split audio and video decoder
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Nidhi Makhijani [Sat, 5 Jul 2014 15:34:05 +0000 (21:04 +0530)]
cljr: split decoder and encoder
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Nidhi Makhijani [Sun, 6 Jul 2014 15:22:52 +0000 (20:52 +0530)]
vc1test: Check malloc call
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Nidhi Makhijani [Sat, 5 Jul 2014 18:58:56 +0000 (00:28 +0530)]
vc1test: Return proper error codes
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Martin Storsjö [Fri, 4 Jul 2014 19:13:39 +0000 (22:13 +0300)]
librtmp: Don't free the temp url at the end of rtmp_open
librtmp can keep pointers to this string internally, and may
use them at shutdown as well.
CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
Diego Biurrun [Sat, 8 Feb 2014 10:11:14 +0000 (11:11 +0100)]
x86: build: Only compile FDCT code if MMX is enabled
All other files containing purely inline assembly are treated the same way.
Diego Biurrun [Thu, 3 Jul 2014 13:25:41 +0000 (06:25 -0700)]
x86: Unconditionally compile blockdsp and svq1enc init files
This avoids a link failure with MMX disabled as the init functions
are referenced unconditionally.
Diego Biurrun [Thu, 3 Jul 2014 13:20:53 +0000 (06:20 -0700)]
x86: huffyuvdsp: Move inline assembly to init file
This avoids a link failure with MMX disabled as now code and
initialization are compiled under the same condition.
Omer Osman [Fri, 4 Jul 2014 09:05:44 +0000 (11:05 +0200)]
libfdk-aacdec: Reduce the default decoder delay by one frame
The default error concealment method if none is set via
aacDecoder_SetParam(AAC_CONCEAL_METHOD) is set in
CConcealment_InitCommonData within the fdk-aac library
and is set to Energy Interpolation. This method requires one frame
delay to the output. To reduce the default decoder output delay and
avoid missing the last frame in file based decoding, use Noise
Substitution as the default concealment method.
Signed-off-by: Omer Osman <omer.osman@iis.fraunhofer.de>
Signed-off-by: Martin Storsjö <martin@martin.st>
Diego Biurrun [Mon, 30 Dec 2013 16:06:45 +0000 (17:06 +0100)]
x86: mpegvideoenc: Change SIMD optimization name suffixes to lowercase
Justin Ruggles [Thu, 3 Jul 2014 15:28:17 +0000 (11:28 -0400)]
webpdec: Fix decoding of the huffman group indices.
Per the specification, "The red and green components of a pixel
define the meta Huffman code used in a particular block of the ARGB
image."
Anton Khirnov [Wed, 2 Jul 2014 20:41:47 +0000 (22:41 +0200)]
id3v2enc: use a case-insensitive comparison for APIC picture type
Nidhi Makhijani [Mon, 23 Jun 2014 04:03:50 +0000 (09:33 +0530)]
daud: split muxer and demuxer
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Martin Storsjö [Wed, 2 Jul 2014 20:02:58 +0000 (23:02 +0300)]
ismindex: Add an option for outputting files elsewhere than in the current directory
Signed-off-by: Martin Storsjö <martin@martin.st>
Martin Storsjö [Wed, 2 Jul 2014 19:44:32 +0000 (22:44 +0300)]
ismindex: Allow adding a path prefix to the generated .ism file
This allows storing the .ismv/.isma/.ismc files separately from
the .ism file on a server, without having to manually edit the
.ism file after generating it with the ismindex tool.
Signed-off-by: Martin Storsjö <martin@martin.st>
Vittorio Giovara [Sun, 8 Jun 2014 15:56:34 +0000 (11:56 -0400)]
lavf: document av_dump_format()
Luca Barbato [Wed, 18 Jun 2014 02:13:20 +0000 (04:13 +0200)]
hevc: Use the local context variable when needed
Michael Niedermayer [Sat, 20 Oct 2012 14:58:33 +0000 (16:58 +0200)]
matroskadec: Fix a double negation typo
This typo has existed since this code was added in
c16582579.
Newer versions of clang pointed out that this comparison always
was true (since the result of the negation is either 0 or 1, while
AVDISCARD_ALL has the value 48).
Signed-off-by: Martin Storsjö <martin@martin.st>
Luca Barbato [Fri, 6 Jun 2014 23:38:00 +0000 (01:38 +0200)]
matroska: Factor out mkv_write_stereo_mode
Luca Barbato [Fri, 6 Jun 2014 23:21:13 +0000 (01:21 +0200)]
matroska: Factor out write_track from mkv_write_tracks
Luca Barbato [Fri, 6 Jun 2014 22:54:50 +0000 (00:54 +0200)]
matroska: K&R formatting cosmetics
Diego Biurrun [Tue, 1 Jul 2014 14:27:50 +0000 (07:27 -0700)]
vaapi: Update idct_permutation location after dsputil/idctdsp split
Yusuke Nakamura [Tue, 1 Jul 2014 05:17:56 +0000 (14:17 +0900)]
mov: Support default-base-is-moof.
default-base-is-moof shall be set to track fragments compatible with DASH
Media Segments. So, this is a fundamental support for ISOBMFF ver. DASH.
This is meaningful only when base-data-offset-present is absent and two or
more track fragments are present in a movie fragment.
Signed-off-by: Martin Storsjö <martin@martin.st>
Diego Biurrun [Tue, 1 Jul 2014 09:52:37 +0000 (11:52 +0200)]
Update Fiona's name in copyright statements.
Diego Biurrun [Fri, 24 Jan 2014 10:55:16 +0000 (11:55 +0100)]
dsputil: Split off IDCT bits into their own context
Diego Biurrun [Mon, 30 Jun 2014 12:37:59 +0000 (05:37 -0700)]
mjpeg: Split off bits shared by MJPEG and LJPEG encoders
This obviates a dependency of the LJPEG encoder on mpegvideo.
John Stebbins [Wed, 18 Jun 2014 20:38:36 +0000 (13:38 -0700)]
pgssubdec: handle more complex PGS scenarios
Add ability to handle multiple palettes and objects simultaneously.
Each simultaneous object is given its own AVSubtitleRect.
Note that there can be up to 64 currently valid objects, but only
2 at any one time can be "presented".
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Martin Storsjö [Mon, 23 Jun 2014 17:49:21 +0000 (20:49 +0300)]
arm: Detect 32 bit cpu features on ARMv8 when running on a 64 bit kernel
When running on a 64 bit kernel, /proc/cpuinfo lists different
optional features than on 32 bit kernels (because some of them
are mandatory in the 64 bit implemenations).
The kernel does list the old features properly if they are queried
via /proc/self/auxv though - however this file is not always readable
(e.g. on most android systems). The getauxval function could also
provide the same info as /proc/self/auxv even if this file isn't
readable, but this function is not always available (and thus would
need to be loaded with dlsym for compatibility with older android
versions).
The android cpufeatures library does this slightly differently,
by assuming that these are available if the "CPU architecture"
line is >= 8, see [1] for details.
It has been suggested to include the old, non-optional features in
/proc/cpuinfo as well, but that suggested patch never was merged.
See [2] for the discussion around this suggestion.
[1] https://android-review.googlesource.com/91380
[2] http://marc.info/?l=linux-arm-kernel&m=
139087240101974
Signed-off-by: Martin Storsjö <martin@martin.st>
Vittorio Giovara [Thu, 26 Jun 2014 19:29:52 +0000 (15:29 -0400)]
rtpenc_jpeg: check for color_range too
Vittorio Giovara [Mon, 23 Jun 2014 22:50:34 +0000 (18:50 -0400)]
apichanges: fill in changes for lavu 51.19 and 51.20
Diego Biurrun [Fri, 7 Feb 2014 09:05:46 +0000 (10:05 +0100)]
mpeg: Change ff_convert_matrix() to take an MpegEncContext parameter
This will come in handy during dsputil splitting.
Diego Biurrun [Fri, 7 Feb 2014 10:04:24 +0000 (11:04 +0100)]
dv: Properly split decoder and encoder initialization
Diego Biurrun [Thu, 23 Jan 2014 16:25:16 +0000 (17:25 +0100)]
dsputil: Move MMX/SSE2-optimized IDCT bits to the x86 subdirectory
Diego Biurrun [Thu, 26 Jun 2014 00:09:13 +0000 (17:09 -0700)]
fate: Add dependencies for dct/fft/mdct/rdft tests
Dirk Ausserhaus [Sun, 8 Jun 2014 11:44:17 +0000 (13:44 +0200)]
indeo4: B-frames decoding
Signed-off-by: Kostya Shishkov <kostya.shishkov@gmail.com>
Kostya Shishkov [Wed, 25 Jun 2014 18:28:22 +0000 (20:28 +0200)]
indeo2: rename stride to pitch for consistency with other Indeo decoders
Anton Khirnov [Tue, 24 Jun 2014 09:10:57 +0000 (11:10 +0200)]
output example: free the muxing format context properly
Anton Khirnov [Tue, 24 Jun 2014 08:52:26 +0000 (10:52 +0200)]
output example: rewrite encoding logic
Properly generate pts for the frames sent to the encoder, avoid
using private and deprecated AVStream.pts.
Anton Khirnov [Tue, 24 Jun 2014 08:21:07 +0000 (10:21 +0200)]
output example: store the scaling context in the stream context
Anton Khirnov [Tue, 24 Jun 2014 07:28:41 +0000 (09:28 +0200)]
output example: use a macro instead of a static variable
Anton Khirnov [Tue, 24 Jun 2014 07:02:25 +0000 (09:02 +0200)]
output example: allocate the audio frame only once
Anton Khirnov [Tue, 24 Jun 2014 06:56:27 +0000 (08:56 +0200)]
output example: use OutputStream for audio streams as well
Anton Khirnov [Tue, 24 Jun 2014 05:51:18 +0000 (07:51 +0200)]
output example: use the new AVFrame API to allocate audio frames
Anton Khirnov [Mon, 23 Jun 2014 19:38:37 +0000 (21:38 +0200)]
output example: set output channel layout
Anton Khirnov [Sat, 21 Jun 2014 15:17:40 +0000 (17:17 +0200)]
output example: use a struct to bundle the video stream variables together