Sebastian Dröge [Fri, 13 May 2016 07:27:38 +0000 (10:27 +0300)]
avcodecmap: Add mapping for G729 caps
https://bugzilla.gnome.org/show_bug.cgi?id=766333
Sebastian Dröge [Tue, 3 May 2016 16:04:06 +0000 (19:04 +0300)]
libav: Update to ffmpeg n3.0.2
Sebastian Dröge [Fri, 29 Apr 2016 10:06:07 +0000 (13:06 +0300)]
avauddec: Finish frames if they are header buffers only and don't produce any output
Otherwise we will consider them as one frame of raw audio that is still
pending, and shift all timestamps by the amount of time spent with header
buffers.
https://bugzilla.gnome.org/show_bug.cgi?id=765797
Sebastian Dröge [Fri, 29 Apr 2016 09:55:19 +0000 (12:55 +0300)]
avauddec: If decoding a frame failed, skip it
Otherwise the next successfully decoded frame will get its timestamp and we
will slowly let a/v sync drift apart.
https://bugzilla.gnome.org/show_bug.cgi?id=765797
Sebastian Dröge [Thu, 28 Apr 2016 15:43:37 +0000 (18:43 +0300)]
avaudenc: Set all required fields in the AVFrame
Various functions in libavcodec need them, like the format, sample rate, etc.
and just having them in the context is not enough.
This fixes draining for codecs like MP2 that require a fixed frame size and
require libav to pad the last frame if required.
Sebastian Dröge [Mon, 25 Apr 2016 15:39:54 +0000 (18:39 +0300)]
avcfg: Use av_strdup() instead of g_strdup() for strings owned by ffmpeg
It has its own allocator that depending on the configuration is incompatible
with GLib's and just causes a segmentation fault. Like on Windows.
https://bugzilla.gnome.org/show_bug.cgi?id=760266
Sebastian Dröge [Wed, 20 Apr 2016 12:27:45 +0000 (15:27 +0300)]
avdeinterlace: Register all filters and only disable all except for yadif during compilation
Otherwise avdeinterlace won't find any filters, and we only use yadif in
there.
https://bugzilla.gnome.org/show_bug.cgi?id=765319
Sebastian Dröge [Fri, 15 Apr 2016 09:51:07 +0000 (12:51 +0300)]
libav: Update to n3.0.1
Julien Isorce [Thu, 14 Apr 2016 09:04:23 +0000 (10:04 +0100)]
Automatic update of common submodule
From 6f2d209 to ac2f647
Víctor Manuel Jáquez Leal [Thu, 24 Mar 2016 17:31:27 +0000 (18:31 +0100)]
avvid{dec,enc}: remove dead gobject macros
The GObject macros either for GstFFMpegVidDec and GstFFMpegVidEnc can
break the compilation because they are not GTypes, since each av video
elements are registered in runtime.
https://bugzilla.gnome.org/show_bug.cgi?id=764162
Vineeth TM [Fri, 4 Mar 2016 07:42:03 +0000 (16:42 +0900)]
libav: use new gst_element_class_add_static_pad_template()
https://bugzilla.gnome.org/show_bug.cgi?id=763084
Sebastian Dröge [Thu, 24 Mar 2016 11:33:33 +0000 (13:33 +0200)]
Back to development
Sebastian Dröge [Thu, 24 Mar 2016 10:55:15 +0000 (12:55 +0200)]
Release 1.8.0
Egor Zaharov [Sun, 20 Mar 2016 13:43:00 +0000 (13:43 +0000)]
configure: Restore CPPFLAGS after the last check
The next checks can also set CPPFLAGS.
https://bugzilla.gnome.org/show_bug.cgi?id=763940
Sebastian Dröge [Tue, 15 Mar 2016 10:23:48 +0000 (12:23 +0200)]
Release 1.7.91
Sebastian Dröge [Fri, 11 Mar 2016 13:44:16 +0000 (15:44 +0200)]
avcodecmap: Only set the bitrate if we actually got it from the caps
Otherwise we set a random value from the stack as bitrate. The default (0)
is a better choice and doesn't upset valgrind.
Sebastian Dröge [Tue, 1 Mar 2016 16:51:22 +0000 (18:51 +0200)]
Release 1.7.90
Sebastian Dröge [Fri, 26 Feb 2016 10:42:36 +0000 (12:42 +0200)]
Automatic update of common submodule
From b64f03f to 6f2d209
Sebastian Dröge [Tue, 23 Feb 2016 16:19:18 +0000 (18:19 +0200)]
avdeinterlace: Don't assume that get_current_caps() returns non-NULL caps after has_current_caps()
Remove calls to gst_pad_has_current_caps() which then go on to call
gst_pad_get_current_caps() as the caps can go to NULL in between. Instead just
use gst_pad_get_current_caps() and check for NULL.
https://bugzilla.gnome.org/show_bug.cgi?id=759539
Tim-Philipp Müller [Sun, 21 Feb 2016 10:40:02 +0000 (10:40 +0000)]
win32: remove outdated build cruft
This hasn't been touched for generations, doesn't work,
and is just causing confusion. We also don't want to
maintain these files manually.
Tim-Philipp Müller [Sat, 20 Feb 2016 12:59:38 +0000 (12:59 +0000)]
Don't use exported but undeclared core debug category symbols
It's not right and won't work on Windows with MSVC.
Sebastian Dröge [Fri, 19 Feb 2016 10:38:37 +0000 (12:38 +0200)]
Back to development
Sebastian Dröge [Fri, 19 Feb 2016 10:00:24 +0000 (12:00 +0200)]
Release 1.7.2
Edward Hervey [Tue, 16 Feb 2016 15:32:38 +0000 (16:32 +0100)]
avcfg: rc-min-rate and rc-max-rate are now 64bit integers
Switch the gobject properties and internal handling to support that
Sebastian Dröge [Tue, 16 Feb 2016 07:11:08 +0000 (09:11 +0200)]
avvidenc: Set width/height and format in the AVFrame we pass to the encoder API
Sebastian Dröge [Tue, 16 Feb 2016 07:02:21 +0000 (09:02 +0200)]
docs: Update docs to not have unstaged changes after build again
There are some new codec IDs that we probably would like to map too, e.g.
Dirac/VC2 and Cineform HD.
Sebastian Dröge [Mon, 15 Feb 2016 15:06:05 +0000 (17:06 +0200)]
libav: Update to n3.0
Thiago Santos [Fri, 5 Feb 2016 21:10:53 +0000 (18:10 -0300)]
Automatic update of common submodule
From 86e4663 to b64f03f
Sebastian Dröge [Mon, 25 Jan 2016 19:13:10 +0000 (20:13 +0100)]
avaudenc: Also use av_free() instead of g_free()
Sebastian Dröge [Mon, 25 Jan 2016 19:08:11 +0000 (20:08 +0100)]
avaudenc: Use av_malloc() instead of GLib malloc() wrappers for memory freed by ffmpeg
It has its own allocator that is not necessarily doing the same as malloc and
will then usually crash. E.g. on Windows or when memalign() is available.
Edward Hervey [Thu, 21 Jan 2016 16:35:51 +0000 (17:35 +0100)]
avvidec: Bring mpeg video decoders up to PRIMARY rank
We should have done that ages ago ...
https://bugzilla.gnome.org/show_bug.cgi?id=574461
Sebastian Dröge [Thu, 21 Jan 2016 09:41:45 +0000 (11:41 +0200)]
libav: Ensure to link with -lavfilter
Sebastian Dröge [Wed, 20 Jan 2016 08:31:40 +0000 (10:31 +0200)]
avviddec: Use AVFrame API instead of deprecated AVPicture API
Sebastian Dröge [Tue, 19 Jan 2016 07:42:47 +0000 (09:42 +0200)]
av: Use av_image_get_buffer_size() instead of deprecated avpicture_get_size()
Sebastian Dröge [Tue, 19 Jan 2016 07:39:00 +0000 (09:39 +0200)]
avdemux: Use av_packet_unref() instead of deprecated av_free_packet()
Sebastian Dröge [Tue, 19 Jan 2016 07:36:01 +0000 (09:36 +0200)]
avvidenc: Use AVPacket.flags for detecting keyframes
AVCodec.coded_frame is deprecated and will disappear at some point
in the future.
Sebastian Dröge [Sat, 16 Jan 2016 14:43:16 +0000 (16:43 +0200)]
avdeinterlace: Chain up to parent class' dispose()
https://bugzilla.gnome.org/show_bug.cgi?id=757498
Sebastian Dröge [Sat, 16 Jan 2016 14:40:52 +0000 (16:40 +0200)]
libav: Bitrate field changed from int to int64_t, fix compiler warnings
Cast it to a gint64 for now though, as otherwise we will fail compilation
with ffmpeg 2.8.
https://bugzilla.gnome.org/show_bug.cgi?id=757498
Andreas Cadhalpun [Wed, 4 Nov 2015 20:18:56 +0000 (21:18 +0100)]
libav: Remove usage of deprecated API
https://bugzilla.gnome.org/show_bug.cgi?id=757498
Andreas Cadhalpun [Wed, 4 Nov 2015 20:16:18 +0000 (21:16 +0100)]
avdeinterlace: Port non-deprecated AVFilter API
https://bugzilla.gnome.org/show_bug.cgi?id=757498
Sebastian Dröge [Sat, 16 Jan 2016 10:09:31 +0000 (11:09 +0100)]
libav: Update to ffmpeg n2.8.5
Tim-Philipp Müller [Thu, 7 Jan 2016 17:13:29 +0000 (17:13 +0000)]
av: canonicalise av plugin name more consistently in more places
Use g_strdelimit(), make sure to include comma as well, which
isn't included in G_STR_DELIMITERS.
https://bugzilla.gnome.org/show_bug.cgi?id=734451
Sebastian Dröge [Thu, 24 Dec 2015 14:29:11 +0000 (15:29 +0100)]
Back to development
Sebastian Dröge [Thu, 24 Dec 2015 13:49:39 +0000 (14:49 +0100)]
Release 1.7.1
Sebastian Dröge [Thu, 24 Dec 2015 12:06:13 +0000 (13:06 +0100)]
avcodecmap: Add special mapping for mono channel layouts
In ffmpeg this is the same as FRONT_CENTER, but we distinguish between
FRONT_CENTER and MONO in GStreamer. Add an explicit mapping for this special
case in the translations functions.
https://bugzilla.gnome.org/show_bug.cgi?id=759846
Vineeth TM [Fri, 27 Nov 2015 02:16:07 +0000 (11:16 +0900)]
avviddec: remove realvideo slice_offset handling
Handling slice_offset in avviddec is resulting in invalid memory read.
Since rv decoders anyways handle slice_offset, removing the same to fix
memory mishandlings
https://bugzilla.gnome.org/show_bug.cgi?id=758726
Sebastian Dröge [Mon, 21 Dec 2015 11:41:02 +0000 (12:41 +0100)]
libav: Update to ffmpeg n2.8.4
Sebastian Dröge [Mon, 21 Dec 2015 11:34:11 +0000 (12:34 +0100)]
configure: Use -Bsymbolic-functions if available
While this is more useful for libraries, some of our plugins with multiple
files and some internal API can also benefit from this.
Sebastian Dröge [Wed, 16 Dec 2015 08:36:25 +0000 (09:36 +0100)]
docs: update to git
Nicolas Dufresne [Mon, 7 Dec 2015 14:11:30 +0000 (09:11 -0500)]
Automatic update of common submodule
From b319909 to 86e4663
Reynaldo H. Verdejo Pinochet [Wed, 2 Dec 2015 20:27:08 +0000 (12:27 -0800)]
Require libav provided by FFmpeg at run-time
Error out if system's libav* libraries are not
provided by FFmpeg. Libav-incompatible changes
were introduced to support the latter so we
can no longer support both.
https://bugzilla.gnome.org/show_bug.cgi?id=758183
Reynaldo H. Verdejo Pinochet [Tue, 24 Nov 2015 07:45:38 +0000 (23:45 -0800)]
Require libav provided by FFmpeg at build-time
Libav-incompatible changes were introduced to support
FFmpeg and we can no longer properly support Libav.
FFmpeg micro versions for libav* start at 100 (this was
done to differentiate from Libav builds). We use this
to bail at configure time if the system libav* libraries
are not provided by FFmpeg.
https://bugzilla.gnome.org/show_bug.cgi?id=758183
Sebastian Dröge [Tue, 1 Dec 2015 13:12:22 +0000 (15:12 +0200)]
libav: Update to n2.8.3
Sebastian Dröge [Mon, 30 Nov 2015 17:01:41 +0000 (19:01 +0200)]
avviddec: Make sure to use a buffer pool with the correct width/height configured on it for pushing buffers downstream
If downstream does not provide a (usable) pool, we would use our internal
pool. But the internal pool might be configured with a different width/height
because of padding, which then will cause problems if we push buffers from it
directly downstream.
Instead create a new pool if the width/height is different.
This prevents crashes with vaapisink and d3dvideosink for example.
Based on the debugging results and discussions with
Nicolas Dufresne <nicolas.dufresne@collabora.com>
https://bugzilla.gnome.org/show_bug.cgi?id=758344
Vineeth T M [Mon, 23 Nov 2015 01:31:39 +0000 (10:31 +0900)]
avviddec: Fix structure memory leak
gst_structure_copy already takes a reference for config_copy.
No need to take another reference while setting it to buffer pool
https://bugzilla.gnome.org/show_bug.cgi?id=758512
Reynaldo H. Verdejo Pinochet [Fri, 20 Nov 2015 18:48:47 +0000 (10:48 -0800)]
Remove unnecessary NULL checks before g_free()
g_free() is NULL-safe
(Includes unrelated formatting change to go through
indent checker commit hook)
Sebastian Dröge [Thu, 12 Nov 2015 09:44:25 +0000 (10:44 +0100)]
libav: Update to n2.8.2
Nicolas Dufresne [Sat, 7 Nov 2015 17:11:57 +0000 (12:11 -0500)]
avviddec: Don't fallback on allocation failure
Allocation should keep working, falling back causes the stride to
change which is not supported in direct rendering.
https://bugzilla.gnome.org/show_bug.cgi?id=756028
Vineeth TM [Mon, 2 Nov 2015 01:00:55 +0000 (10:00 +0900)]
avvidenc: Fix frame memory leak
The frame being passed to handle_frame should be unref'ed in all cases
https://bugzilla.gnome.org/show_bug.cgi?id=757453
Vineeth TM [Mon, 2 Nov 2015 01:20:02 +0000 (10:20 +0900)]
avdemux: Fix string memory leaks
https://bugzilla.gnome.org/show_bug.cgi?id=757454
Mark Nauwelaerts [Mon, 26 Oct 2015 18:54:10 +0000 (19:54 +0100)]
avviddec: _drain and _finish need slightly different handling
... since they handle separate cases in video decoder with different requirements.
Consider e.g. x264enc ! rtph264pay ! identity drop-probability=0.1 ! rtph264depay
to illustrate a need for such separation.
Tim-Philipp Müller [Wed, 21 Oct 2015 13:37:05 +0000 (14:37 +0100)]
Automatic update of common submodule
From b99800a to b319909
Sebastian Dröge [Tue, 20 Oct 2015 14:29:42 +0000 (17:29 +0300)]
Use new GST_ENABLE_EXTRA_CHECKS #define
https://bugzilla.gnome.org/show_bug.cgi?id=756870
Sebastian Dröge [Wed, 21 Oct 2015 11:28:34 +0000 (14:28 +0300)]
Automatic update of common submodule
From 9aed1d7 to b99800a
Sebastian Dröge [Fri, 16 Oct 2015 15:52:57 +0000 (18:52 +0300)]
avviddec: Fix bufferpool config double free by taking a copy as needed
Also free the config in two code paths where we leaked it before.
Sebastian Dröge [Wed, 14 Oct 2015 07:18:01 +0000 (10:18 +0300)]
libav: Update to n2.8.1
Thiago Santos [Sat, 10 Oct 2015 00:22:12 +0000 (21:22 -0300)]
avcodecmap: add jpeg2000 decoder mapping
Map the 3 possible jpeg2000 caps to JPEG2000 codec id
Sebastian Dröge [Sat, 3 Oct 2015 17:25:35 +0000 (18:25 +0100)]
avcodecmap: Don't allocate dummy codec data anymore, it causes crashes nowadays
Multithreaded encoders are going to free this dummy codec data twice, e.g.
with this pipeline
gst-launch-1.0 videotestsrc num-buffers=40 ! \
videoconvert ! avenc_mjpeg ! fakesink
Sebastian Dröge [Sat, 3 Oct 2015 17:14:05 +0000 (18:14 +0100)]
avvidenc: Pass the correct user_data to gst_buffer_new_wrapped_full()
Fixes crash with e.g.
gst-launch-1.0 videotestsrc num-buffers=40 ! \
videoconvert ! avenc_huffyuv ! fakesink
Sebastian Dröge [Fri, 2 Oct 2015 20:02:01 +0000 (23:02 +0300)]
libav: G_CONST_RETURN is deprecated since GLib 2.30
Sebastian Dröge [Fri, 2 Oct 2015 19:26:36 +0000 (22:26 +0300)]
Add configure check for GLib for consistency with other modules
Luis de Bethencourt [Fri, 2 Oct 2015 10:49:35 +0000 (11:49 +0100)]
avviddec: only free config when pool doesn't take ownership
Since gst_buffer_pool_set_config() takes ownership of the config structure,
it is only necessary to free the structure before using it when the true
branch of if (gst_buffer_pool_config_validate_params) hasn't run.
gst_buffer_pool_set_config() always takes ownership of the structure
regardless of success or failure. Which means the return, checked with
if (!working_pool), has no relation to the state of the structure.
Luis de Bethencourt [Fri, 28 Aug 2015 14:15:39 +0000 (15:15 +0100)]
avviddec: fix memory leak
Free config before overwriting.
CID #1320708
Sebastian Dröge [Fri, 25 Sep 2015 21:51:15 +0000 (23:51 +0200)]
Back to development
Sebastian Dröge [Fri, 25 Sep 2015 21:32:21 +0000 (23:32 +0200)]
Release 1.6.0
Sebastian Dröge [Fri, 18 Sep 2015 18:10:32 +0000 (20:10 +0200)]
Release 1.5.91
Tim-Philipp Müller [Fri, 28 Aug 2015 08:38:53 +0000 (09:38 +0100)]
avvidec: increase default alignment to 32 bytes
Change default alignment from 16 to 32 bytes, which fixes crashes
when decoding H.265 using AVX2-based decoder code paths and when
using ximagesink/glimagesink.
https://bugzilla.gnome.org/show_bug.cgi?id=754120
Tim-Philipp Müller [Fri, 11 Sep 2015 22:19:21 +0000 (23:19 +0100)]
avvideodec: ensure required mem alignment fixing avdec_h265 crashes with ximagesink/glimagesink
Make sure the alignment requirement in GstAllocationParams
matches the GstVideoAlignment requirements. This fixes
issues with avdec_h265 crashing in the avx2 code path when
used with playbin and ximagesink/glimagesink as videosink.
The internal video pool would allocate buffers with an
alignment of 15 even though GstVideoAlignment specified
a stride_align requirement of 31 (which comes from ffmpeg).
https://bugzilla.gnome.org/show_bug.cgi?id=754120
Sebastian Dröge [Sat, 12 Sep 2015 12:06:10 +0000 (14:06 +0200)]
libav: Update to ffmpeg n2.8
https://bugzilla.gnome.org/show_bug.cgi?id=754920
Jan Schmidt [Wed, 29 Jul 2015 15:24:54 +0000 (01:24 +1000)]
avvid/audenc: Set some tags in the output for downstream's info
Add the codec name and bitrate into the output for informational
purposes. Bitrate in particular is now used by flvmux to set
videodatarate and audiodatarate in the resulting stream
Nicolas Dufresne [Thu, 20 Aug 2015 15:02:11 +0000 (08:02 -0700)]
avviddec: Fix pool reallocation logic
Some check where incorect and also unsafe. The only reliable information
in get_buffer2 is the picture width/height really. The side effect is
that the width/height of the internal pool endup padded, so when we
switch we also need to switch to the a new width/height, hence we save
the pool info.
https://bugzilla.gnome.org/show_bug.cgi?id=753869
Sebastian Dröge [Wed, 19 Aug 2015 11:12:35 +0000 (14:12 +0300)]
Release 1.5.90
Nicolas Dufresne [Sun, 16 Aug 2015 17:08:16 +0000 (19:08 +0200)]
aviddec: Re-enable direct rendering
This is achieved by using a tempory internal pool. We can then switch to a
downstream pool if the downstream pool buffer have matching strides.
https://bugzilla.gnome.org/show_bug.cgi?id=752802
Thiago Santos [Mon, 17 Aug 2015 07:36:39 +0000 (04:36 -0300)]
avvidenc: use template subset check for accept-caps
It is faster than doing a query that propagates downstream and
should be enough
Thiago Santos [Mon, 17 Aug 2015 07:35:41 +0000 (04:35 -0300)]
avaudenc: use pad template caps for accept-caps
use template subset check for accept-caps
It is faster than doing a query that propagates downstream and
should be enough
Thiago Santos [Sun, 16 Aug 2015 17:14:27 +0000 (14:14 -0300)]
avaudenc: remove useless getcaps method
It just calls the exact same function as the default handler
Thiago Santos [Sun, 16 Aug 2015 17:13:05 +0000 (14:13 -0300)]
avvidenc: remove useless getcaps method
It just calls the exact same function as the default handler
Thiago Santos [Sat, 15 Aug 2015 10:30:26 +0000 (07:30 -0300)]
avauddec: let audiodecoder call the default pad query handler
Avoids repeating the same handling in many decoders
Thiago Santos [Sat, 15 Aug 2015 10:18:07 +0000 (07:18 -0300)]
avviddec: let videodecoder call the default pad query handler
Avoids repeating the same handling in many decoders
Sebastian Dröge [Sat, 15 Aug 2015 10:51:19 +0000 (12:51 +0200)]
libav: Update to n2.7.2
Thiago Santos [Fri, 14 Aug 2015 11:22:39 +0000 (08:22 -0300)]
avviddec: use template caps intersection for accept-caps
Avoid doing downstream caps queries when accept-caps should just
do a shallow caps check on the element itself
https://bugzilla.gnome.org/show_bug.cgi?id=753623
Thiago Santos [Fri, 14 Aug 2015 11:21:51 +0000 (08:21 -0300)]
avauddec: use template caps intersection for accept-caps
Avoid doing downstream caps queries when accept-caps should just
do a shallow caps check on the element itself
https://bugzilla.gnome.org/show_bug.cgi?id=753623
Jan Schmidt [Thu, 30 Jul 2015 13:07:39 +0000 (23:07 +1000)]
Map ffmpeg metadata to GStreamer tags
Update to the metadata API ffmpeg has had in
place for a long time now, and reenable output
of GStreamer tags from the demuxer.
https://bugzilla.gnome.org/show_bug.cgi?id=566605
Olivier Crête [Tue, 28 Jul 2015 21:54:23 +0000 (17:54 -0400)]
avviddec: Remove unused force parameter
This parameter has been always false for a long time.
Olivier Crête [Tue, 4 Aug 2015 01:40:12 +0000 (21:40 -0400)]
avviddec: Use caps-like size in get_buffer2()
The size in the AVFrame in get_buffer2 don't match the output size,
instead they match ffmpeg's memory requirements, so we can't compare
them from the values of the output AVFrame. Those are comparable to
the values in the passed AVCodecContext.
Olivier Crête [Tue, 4 Aug 2015 01:02:37 +0000 (21:02 -0400)]
avviddec: Reset current_dr on close and when not chosing it
https://bugzilla.gnome.org/show_bug.cgi?id=753189
Olivier Crête [Tue, 28 Jul 2015 20:16:10 +0000 (16:16 -0400)]
avviddec: Disable direct rendering before a frame has been produces
ffmpeg doesn't provide the final's image width & height in the get_buffer2()
callback, so it's not possible to create an output state for GstVideoDecoder
at this stage. So only try to do direct rendering if the buffer pool has already
been negotiated based on the final decoded size.
This partially reverts the effects of
2e621f8db
https://bugzilla.gnome.org/show_bug.cgi?id=752802
Sebastian Dröge [Tue, 28 Jul 2015 08:19:52 +0000 (11:19 +0300)]
Revert "For static builds, add the ffmpeg library directories to the linker flags"
This reverts commit
ac3437153dc6cb3d82cdda0d1f60ffc5600fdf67.
Doesn't actually make sense as it will put the (uninstalled) library paths
into the installed .la files. How does this all work?
Sebastian Dröge [Tue, 28 Jul 2015 08:02:47 +0000 (11:02 +0300)]
For static builds, add the ffmpeg library directories to the linker flags
Olivier Crête [Mon, 27 Jul 2015 22:49:49 +0000 (18:49 -0400)]
avviddec: Get code out of loop
Code was executed only on the first iteration, so just pull it out
of the loop entirely. This makes it clear it has nothing to do with the loop.