1# Changelog
2All notable changes to this project will be documented in this file.
3
4The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html),
6specifically the [variant used by Rust](http://doc.crates.io/manifest.html#the-version-field).
7
8## [0.17.0] - 2021-06-28
9
10### Fixed
11- Use `#[repr(transparent)]` where it is more correct and remove unneeded
12  `#[repr(C)]` annotations.
13- Don't provide direct access to the logged object in logging functions as the
14  object might currently be finalized and might be unsafe to access.
15- Moved X11/EGL/Wayland-specific GL APIs into their own crates instead of
16  having them inside gstreamer-gl and behind feature flags. This simplifies
17  conditional usage of them in applications.
18- Various nullability issues: parameters and return values that should've been
19  or shouldn't have been nullable were fixed.
20- Print source object correctly in `gst::Message` `Debug` impl.
21- `gst_rtsp_server::RTSPServer::attach()` is fallible.
22- `gst::ElementFactoryListType` is a proper bitflags type now instead of
23  generic `u64`.
24- `gst::PluginFeature::load()` returns the same type as the one passed in.
25- Value returned by `gst::PromiseFuture` can no longer be freed while still
26  in scope.
27- Only assign to `GError**`s in subclassing code if they're not `NULL`.
28
29### Added
30- Bindings for the GStreamer Controller library and the corresponding core API.
31- Subclassing support for `gst_player::PlayerVideoRenderer`.
32- `gst::PARAM_FLAG_CONTROLLABLE` and related bindings.
33- `gst_video::VideoOrientation` and `VideoOrientationMethod` bindings.
34- Support for removing pad probes from inside the pad probe callback.
35- `gst_check::Harness::pull_until_eos()` bindings.
36- `ges::TransitionClip` and `OperationClip`.
37- Bindings for `gst_gl::GLMemory` and related APIs.
38- Subclassing support for `gst_gl::GLFilter` and `gst_gl::BaseSrc`.
39- `gst::TagList::remove()`.
40- `gst::CapsFeatures` and `gst::Structure` API based on `glib::Quark`s instead
41  of strings.
42- Subclassing support for `gst_video::VideoFilter`.
43- Bindings for various new 1.20 APIs: `gst_app::LeakyType`,
44  `gst_video::VideoDecoderRequestSyncPointFlags`,
45  `gst_rtp::RTPHeaderExtension`, `gst_audio::AudioLevelMeta`,
46  `gst_webrtc::WebRTCKind` and various other new flags/enum types.
47- Subclassing support for `gst_rtsp_server::RTSPMountPoints`.
48
49### Removed
50- Deprecated APIs in 0.16.
51- Don't declare that `gst_app::AppSink` and `AppSrc` inherit from
52  `gst_base::BaseSink` and `BaseSrc` to avoid exposing API that is meant for
53  subclasses to applications.
54- `gst_app::AppSrc` and `AppSink` signals that are also covered by the
55  callbacks. The callbacks are more flexible and have lower overhead.
56- Duplicated getters/setters for `gst_base::BaseSink` and `BaseTransform`
57  properties.
58
59### Changed
60- Compatible with the 0.14 gtk-rs release.
61- Updated to the new GStreamer 1.20 APIs while still supporting up to GStreamer
62  1.8. Any new 1.20 APIs might still change until the stable 1.20 release.
63- FFI and safe high-level bindings are in the same repository now and use the
64  same version numbers.
65- The .gir files are shared with gtk-rs and the GStreamer-specific ones are in
66  a separate git submodule.
67- Update all code to the Rust 2018 edition. As part of this, most macros lost
68  their `gst_` prefix.
69- Re-export dependency crates from the different preludes.
70- Getter functions don't have a `get_` prefix anymore and GObject property
71  accessors don't include the `_property_` part in the middle of their
72  function names anymore.
73- Lots of changes to the subclassing API. Check the various elements in
74  [gst-plugins-rs](https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs)
75  for examples.
76- Major improvements to the documentation infrastructure and generated
77  documentation.
78- `gst::ClockID` bindings are refactored to use different types for
79  single-shot and periodic clock ids, which makes misuse harder.
80- `gst::ProxyPad` extension trait uses trait functions instead of associated
81  functions now for usability reasons.
82- Use `Result<gst::FlowSuccess, gst::FlowError>` for overriding flow returns
83  from pad probes.
84- `gst_video::VideoInfo::align()` returns a `Result` instead of a `bool`.
85- Use actual error types instead of `()` in `gst_sdp` APIs.
86- `Display` impl for `gst::ClockTime` provides better human-readable strings.
87- `gst::Element::link_filtered()` and `link_pads_filtered()` takes a
88  non-optional caps now. That's easier to use and for not providing caps the
89  non-filtered variants of the functions exist.
90- Replace various manual bindings with auto-generated ones.
91- `gst::Element::get_request_pad()` is replaced by `request_pad_simple()` as a
92  simpler version of `request_pad()` and in accordance with the deprecation in
93  GStreamer 1.20.
94- `gst::ClockTime` and APIs working on it were changed to make possibility of
95  using `GST_CLOCK_TIME_NONE` expressed in the type system.
96  `Option<gst::ClockTime>` can be `None` while `gst::ClockTime` is always a
97  valid time.
98
99## [0.16.7] - 2021-02-13
100### Fixed
101- Usage of the logging system with a GStreamer library with the logging system
102  compiled out does not crash any longer.
103- Double-free in `gst_video::VideoTimeCode` API when converting between
104  validated and unvalidated timecodes.
105
106### Added
107- `gst::Element::get_current_state()` and `get_pending_state()` convenience APIs.
108- `gst_audio::AudioConverterConfig` for setting the configuration on e.g. the
109  `audiomixer` element. The low-level `AudioConverter` API is still not
110  included in the bindings.
111
112## [0.16.6] - 2020-12-20
113### Fixed
114- `VideoTimeCodeInterval`'s `Ord` and `PartialEq` implementations compare
115  against the correct fields now.
116- `SDPMessage::medias_mut()` iterator does not crash any longer.
117
118### Added
119- `PartialEq` and `Eq` implementations on `VideoAlignment`.
120- Alignment API for `VideoMeta` and `get_plane_height()` / `get_plane_size()`.
121- `VideoInfo::align_full()`.
122
123## [0.16.5] - 2020-11-23
124### Fixed
125- Make sure to use `$crate` in more macros to allow them to work without
126  anything special in scope already.
127- Update documentation location.
128- Don't panic if C code stores invalid seqnums in events and the seqnum is
129  used directly or via the `Display` impl.
130- Fix docs build for some crates on docs.rs.
131- Fix `Debug` impl for `gst_video::VideoTimeCode` to print the correct type
132  name.
133- Fix plugin version to be 1.18 instead of 1.17 when compiling a plugin with
134  `v1_18`.
135
136### Added
137- Event handling support in pad probes, that is returning
138  `PadProbeReturn::Handled` for events.
139- `EventRef::get_structure_mut()` getter that allows changing the events'
140  structures.
141
142### Changed
143- Remove unnecessary `PhantomData` markers and use `repr(transparent)` instead
144  of `repr(C)` where it is more correct.
145
146## [0.16.4] - 2020-10-09
147### Fixed
148- Correctly implement `ExactSizeIterator` on the `AudioFormat` and
149  `VideoFormat` iterators. Previously they returned the overall size instead
150  of the remaining size, and they didn't implement `Iterator::size_hint()`.
151- Don't implement `ExactSizeIterator` on the buffer `gst::Meta` iterator. The
152  overall length is not known easily and the implementation would've simply
153  panicked in the past.
154
155### Added
156- `gst::ClockID::wait_async_stream()` for async integration for clock waiting.
157- `From` / `TryFrom` impls for converting between `gst::ClockTime` and
158  `std::time::Duration`.
159
160## [0.16.3] - 2020-09-08
161### Fixed
162- Reset vfuncs if calling `BaseTransformClass::configure()` multiple times.
163- Fix `gst::debug_remove_default_log_function()` to actually remove the
164  default log function.
165
166### Added
167- Some more new APIs added in 1.18.
168- API for getting an owned buffer from a readable `gst_video::VideoFrame` /
169  `VideoFrameRef`.
170
171### Changed
172- Updated bindings to 1.18.0. This stabilized GStreamer 1.18 support and any
173  API behind the "v1_18" feature is considered stable now.
174- Factor out some common code from `gst::Pad::ProbeInfo` code. This reduces
175  the code generated for each pad probe considerably.
176- Update paste dependency to 1.0 and pretty-hex to 0.2.
177
178## [0.16.2] - 2020-07-27
179### Fixed
180- Use correct pointer for the plane data in `gst_audio::AudioBuffer`.
181
182### Added
183- Add `gst::GhostPad` convenience constructors that take a target pad, similar
184  to the ones that existed in 0.15 and before.
185- Add `gst::parse_bin_from_description_with_name` that allows setting a name
186  for the created bin without having to use unsafe code in application code.
187
188## [0.16.1] - 2020-07-10
189### Fixed
190- Allow calling `gst::DebugCategory::new()` before `gst::init()` again.
191
192## [0.16.0] - 2020-07-06
193### Added
194- Updated bindings to 1.17.2, adding experimental 1.18 support. This can be
195  opted-in via the "v1_18" feature flag but there might still be API changes
196  in the newly added API.
197- `gst::MemoryRef::dump()` for dumping contents of a memory.
198- `gst::Bus::stream()` instead of a custom constructor on the `BusStream`.
199- Use more accurate types for `Seqnum`, `GroupId` and `MetaSeqnum`. These are
200  now proper wrapper types instead of plain integers, which makes mis-use
201  harder.
202- Provide `TryFrom` impls for conversion between `glib::DateTime` and
203  `gst::DateTime`.
204- Add `get_allocator()` functions to `gst_base::{Aggregator, BaseTransform,
205  BaseSrc}`, and allow overriding `BaseSrc::alloc()`.
206- Add subclassing bindings for `gst_base::PushSrc`.
207- Add new `gst::BufferCursor` API that allows to handle a buffer as `Read`,
208  `Write` and `Seek` and accesses the underlying memories of the buffer
209  individually without mapping them all together.
210- Add `gst::Plugin::get_plugin_name()`.
211- Support for `gst_video::VideoAFDMeta` and `VideoBarMeta`.
212- API for getting all / iterating over all `gst_audio::AudioFormat` and
213  `gst_video::VideoFormat`.
214- Bindings and subclassing bindings for `gst_video::VideoSink`.
215- `gst::Pad` can be constructed via the builder pattern and `gst::PadBuilder`
216  now, which allows to safely set the pad functions and various other fields
217  during construction. The `PadBuilder` works on any `gst::Pad` subclass and
218  also has special support for `GhostPad`s by allowing to set pad functions of
219  the proxy pad.
220- `gst::Message`, `gst::Event` and `gst::Query` type constructors are now on
221  the specific target type instead of various `new_XXX()` functions on the
222  basic type. E.g. `gst::message::Eos::new()`.
223- Support for overriding `gst_audio::AudioSrc/Sink::reset()`.
224- Support for overriding `gst_base::BaseParse::stop()`.
225- Support for overriding `gst::Element::post_message()`.
226- Added bindings for `gst::BufferList::foreach()` and `foreach_mut()`.
227- Added bindings for `gst::Buffer::foreach_meta()` and `foreach_meta_mut()`.
228
229### Fixed
230- Allow using any `glib::Object` as target object for logging instead of just
231  `gst::Object`.
232- Remove restriction API from `gst_pbutils::EncodingContainerProfile`. They
233  are supposed to be used only with the other encoding profiles.
234- Return `&'static str` for various `gst::StructureRef` functions where the
235  string is backed by a `glib::Quark`.
236- Fix various `gst::DateTime` functions to actually return `Option`s.
237- Add support for filling in a buffer passed to the `gst::Pad` getrange
238  function, allow passing one in into `get_range()` and `pull_range()` and
239  provide the corresponding API on `gst_base::BaseSrc` too.
240- Allocator in audio/video `Decoder` base classes is optional and can return
241  `None`.
242- `gst_video::ValidVideoTimeCode::add_interval()` always returns a valid
243  timecode again.
244- Allow resolving a `gst::Promise` with `None` and also handle that correctly
245  in the callback. This is allowed by the API.
246- Allow calling various debugging related functions before `gst::init()`.
247- Various enum/function versions were fixed to only show up if the
248  corresponding version feature is enabled.
249- `gst::Pad` function setters are marked unsafe now as changing the functions
250  is not thread-safe.
251- Remove `gst::Object::set_name()` as changing the name after construction
252  generally causes problems and is potentially unsafe.
253- Remove `gst::Pad::set_pad_template()` as changing the pad template after
254  construction is generally unsafe.
255- `gst::Pad::stream_lock()` borrows the pad now instead of taking a new
256  reference.
257- Unimplemented `Jitter` and `Buffer` queries were removed from the bindings.
258  These are not implemented in C and only have a type registered.
259- Various `LAST`, `NONE` variants of enums and flags were removed as these
260  only make sense in C.
261- Call the parent impl of various vfuncs that were omitted before to not
262  require further subclasses of them to implement them but automatically call
263  the parent ones.
264
265### Changed
266- Use `NonZeroU64/U32` for various ID types to allow further optimizations.
267- Use `thiserror` crate for deriving error types.
268- Switch from `lazy_static` to `once_cell`.
269- Change various miniobject functions like `gst::Caps::append()` from taking
270  the object by value to modifying it internally. This makes them easier to
271  use and only applies to functions that are defined on the non-reference type
272  and take ownership of the values passed in.
273- Use `mem::ManuallyDrop` instead of `mem::forget()` everywhere.
274- Replace most `mem::transmute()` calls with safer alternatives.
275- `gst:StreamCollection` API was changed to the builder pattern for
276  construction as the collection must not be changed after construction.
277- `gst::ProxyPad` default functions are plain functions on `ProxyPad` now
278  instead of trait functions to allow easier usage of them.
279- Use proper error types in various `TryFrom` impls.
280- `gst_video::VideoMeta::add()` returns a `Result` now instead of panicking.
281- Various constructors were renamed from `new_with_XXX()` and `new_from_XXX()`
282  to the more idiomatic `with_XXX()` and `from_XXX()`.
283- Miniobject bindings are simplified now and there is no `gst::GstRc` type
284  anymore, instead everything is directly implemented on the concrete types.
285  As part of this the `gst::MiniObject` trait was also removed as it was
286  unneeded now.
287
288## [0.15.7] - 2020-06-08
289### Fixed
290- Allow multiple filter types per process with `gst::Iterator::filter()`.
291- Check that `VideoInfo` is valid when creating a `VideoFrame`.
292- Don't potentially dereference a `NULL` pointer when getting the format
293  from an invalid `VideoInfo` or `AudioInfo`.
294- Don't unmap borrowed `VideoFrameRef`s.
295
296### Added
297- `gst::ProtectionMeta`, `gst_video::VideoAffineTransformationMeta`,
298  `VideoCropMeta` and `VideoRegionOfInterestMeta` bindings.
299- Various new `gst_rtp::RTPBuffer` methods.
300- `gst_audio::audio_buffer_truncate()`, `AudioMeta` and `AudioBuffer`
301  bindings.
302
303## [0.15.6] - 2020-05-28
304### Fixed
305- Assert that the data passed to `VideoCaptionMeta::add()` is not empty.
306- Don't store strong references to the object in the bus, appsink and appsrc
307  futures `Stream` / `Sink` adapters. This would keep them alive unnecessarily
308  and would prevent the `Stream` / `Sink` to ever "finish" on its own.
309- Handle receiving a `None` reply in the change function of `gst::Promise`.
310  This is apparently valid. For backwards compatibility reasons this is
311  currently replaced with an empty structure but in 0.16 the API will
312  explicitly handle `None`.
313
314### Added
315- `gst::Stream::debug()` and `gst::StreamCollection::debug()` for converting
316  into a structured string with the actual contents of each.
317- `gst::Structure::from_iter()` and `gst::Caps::from_iter()` to create
318  structures/caps from iterators.
319- `gst::Event` support for getting/setting the `gst::Stream` in the
320  `StreamStart` event.
321- `gst_video::calculate_display_ratio()` and `::guess_framerate()`.
322- Various video related `gst::CapsFeatures` in `gst_video`.
323- `TryFrom`/`From` impls for converting between `gst::Structure` and
324  `gst_video::VideoConverterConfig`.
325- Various `glib::Value` trait impls for `SDPMessage`, `StructureRef`,
326  `CapsFeatureRef` and all borrowed variants of miniobjects to be able to
327  work with the borrowed, non-owned variants when handling `glib::Value`s.
328
329## [0.15.5] - 2020-05-03
330### Fixed
331- Revert: Allow logging any `glib::Object` and not just `gst::Object`. This
332  broke API in subtile ways and needs to wait until 0.16
333- Replace `%` in log output with `%%` to prevent accidental C formatting
334- Add missing manual traits to the documentation
335
336### Added
337- `BufferRef::peek_memory_mut()` to give a mutable reference to a given memory
338- Different iterators for iterating over the memories of a buffer
339- Support for `gst_audio::AudioClippingMeta`
340- `gst::Plugin::get_plugin_name()` was added
341- `gst::Element::get_current_clock_time()` and
342  `gst::Element::get_current_running_time() helper functions
343- `gst::State` and `StateChange` API for calculating next/previous state and
344  convert from/to the components of a state change
345
346### Changed
347- Use `mem::ManuallyDrop` instead of `mem::forget` everywhere
348
349## [0.15.4] - 2020-03-09
350### Fixed
351- Allow logging any `glib::Object` and not just `gst::Object`
352- Fix floating reference handling in `RTSPMedia::take_pipeline()`
353- Hold `GMutex` guards for the remainder of the function and warn if they're
354  directly dropped
355- Work around empty/any caps handling bugs in `Caps::fixate()`
356
357### Added
358- Add `BaseTransform::prepare_output_buffer()` subclassing support
359- `RTSPServer`, `RTSPClient`, `RTSPMedia` and `RTSPMediaFactory` subclassing
360  support
361- Handle panicking in `appsrc`/`appsink` callbacks by posting an error message
362  instead of killing the process
363
364## [0.15.3] - 2020-02-15
365### Fixed
366- `UniqueFlowCombiner::clear()` should take a mutable reference.
367- `AudioStreamAlign` doesn't require mutable references for getters anymore.
368- Don't use bool return value of `gst_video_info_set_format()` and
369  `gst_video_info_align()` with GStreamer < 1.11.1 as it returned void back
370  then. We'd otherwise use some random value.
371- Make `VideoInfo::align()` is available since 1.8.
372- Fix changing/clearing of `AppSrc`, `AppSink` callbacks and `Bus` sync
373  handler. Before 1.16.3 this was not thread-safe and caused crashes. When
374  running with older versions changing them causes a panic now and unsetting
375  the bus sync handler has not effect. With newer versions it works correctly.
376
377### Added
378- Add `Clone` impls for `BufferPoolConfig` and `PlayerConfig`.
379- Add `VideoConverter` bindings.
380- Add `Future`s variant for `gst::Promise` constructor.
381- Add `Future`s variant for `gst_video::convert_sample_async()`.
382- Add `submit_input_buffer()`, `generate_output()`, `before_transform()`,
383  `copy_metadata()` and `transform_meta()` virtual method support for
384  `BaseTransform`.
385- Add `AppSink` `Stream` adapter and `AppSrc` `Sink` adapter for integrating
386  both into Rust async contexts.
387
388### Changed
389- More generic implementations of `VideoFrame` / `VideoFrameRef` functions to
390  allow usage in more generic contexts.
391
392## [0.15.2] - 2020-01-30
393### Fixed
394- Fix another race condition in the `gst::Bus` `Stream` that could cause it to
395  not wake up although a message is available.
396
397## [0.15.1] - 2020-01-23
398### Added
399- Use static inner lifetime for `VideoCodecState<Readable>` so that it can be
400  stored safely on the heap.
401- Getters/setters for `BinFlags` on `gst::Bin`.
402- `gst::Caps::builder_full()` for building caps with multiple structures
403  conveniently.
404- `gst::Element::call_async_future()` for asynchronously spawning a closure
405  and returning a `Future` for awaiting its return value.
406
407### Fixed
408- Various clippy warnings.
409- Getters/setters for `PadFlags` on `gst::Pad` now provide the correct
410  behaviour.
411- Take mutex before popping messages in the `gst::Bus` `Stream` to close a
412  small race condition that could cause it to not be woken up.
413- `gst::ChildProxy` implementers do not have to provide `child_added()` and
414  `child_removed()` functions anymore but these are optional now.
415- Manually implement `Debug` impls for various generic types where to `Debug`
416  impl should not depend on their type parameters also implementing `Debug`.
417
418## [0.15.0] - 2019-12-18
419### Added
420- `StructureRef::get_optional()` for returning `None` if the field does not
421  exist instead of `Err`
422- Bindings for `gstreamer-rtp` library, mostly `RTPBuffer`
423- Support for writing `Preset`, `TagSetter`, `Clock`, `SystemClock` subclasses
424- Bindings for `Typefind::get_length()`
425- Bindings for `BaseSrcImpl::get_times()`
426- Bindings (incl. subclassing) for `AudioSink` and `AudioSrc`
427- Missing `Send`/`Sync` impl for various types
428
429### Fixed
430- Cleanup of cargo features/dependencies to improve build times
431- Serde serialization with optional values.
432  Attention: This changes the format of the serialization!
433- `VideoEncoder`/`VideoDecoder` `proxy_getcaps()` can't return `None`
434- Use non-panicking UTF8 conversion in log handler. We don't want to panic
435  just because some C code printed a non-UTF8 string
436- Re-rexport all traits from the crate level and also ensure that all traits
437  are actually included in the preludes
438- Actually export `is_video_overlay_prepare_window_handle_message()` function
439- Use `FnMut` for the `appsink` callbacks instead of `Fn`
440- `Promise` change function returns the actual reply to the promise now
441  instead of just passing the promise itself
442- Memory leak in `Iterator::filter()`
443- `BinImpl::add()` takes ownership of floating references
444- `DeviceImpl::create_element()` preserves floating flag
445- `BinImpl::remove()` takes a strong reference of the element now as the last
446  reference might be owned by the bin and otherwise we would potentially have
447  a use-after-free afterwards
448- `BaseParseFrame` and `VideoCodecFrame` take a `&mut self` now for various
449  functions that actually change the frame
450
451### Changed
452- Minimum supported Rust version is 1.39
453- Allow passing `None` to `VideoEncoder::finish_frame()`
454- Various `to_string()` methods were moved into the `Display` trait impl and
455  for some types `to_str()` was added to return a `&'static str`
456- .gir files were updated to 1.16.2 release
457- `Sample` constructor uses the builder pattern now
458- `VideoMeta::add_full()` is simplified and requires parameters
459- `BasetransformImpl::set_caps()` returns a `Result` instead of `bool`
460- SDP data type getters for strings return an `Option` now as these can be
461  `None` in practice although not allowed by the SDP spec
462- Various functions returning `Option`s were changed to return `Results` if
463  `None` actually signalled an error instead of just a missing value
464
465### Removed
466- "subclassing" and "futures" cargo features. These are enabled by default now
467
468## [0.14.5] - 2019-09-17
469### Added
470- Support subclassing of `gst::Device`, `gst::DeviceProvider`,
471  `gst_audio::AudioDecoder` and `::AudioEncoder`
472- Support for `Element::set_clock` and `::provide_clock` virtual methods
473- `ElementClass::add_metadata` was added
474- `gst_video::VideoDecoder` and `::VideoEncoder` got support for `get_caps`,
475  `negotiate`, `src/sink_query/event` and the `drain` virtual methods
476- `Element::num_pads`, `::num_src_pads` and `::num_sink_pads` functions
477- `gst_video::VideoDecoder` and `::VideoEncoder` got `get_allocator` bindings
478- `gst::Iterator` implements `IntoIterator` now for providing
479  `std::iter::Iterator<Item=<Result<T, IteratorError>>` adapter
480- Error macros for audio/video decoder subclasses to handle decoding errors
481  more gracefully and only actually error out after many consecutive errors
482
483### Fixed
484- Macros now also work in Rust 2018 edition without `#[macro_use]` but
485  explicit imports
486- The log handler unit test runs reliable in parallel with other tests
487- Manually implement `Debug` for `gst::Iterator` to allow it for any `T`
488  instead of `T: Debug`
489- `Device::create_element` has correct reference count handling now
490- Return `NotNegotiated` in the video codec base classes if setting the output
491  state fails instead of `Error`
492
493## [0.14.4] - 2019-08-14
494### Added
495- Bindings for adding/removing custom log functions
496- Bindings for `calculate_linear_regression()`
497- Constants for base class custom flow returns
498
499### Fixed
500- Ownership of pad in `Element::release_pad()` virtual method implementations
501
502## [0.14.3] - 2019-07-16
503### Added
504- `Buffer::unset_flags()` for unsetting specific buffer flags
505- `VideoBufferFlags` flags type and `VideoBufferExt::set_video_flags()`,
506  `unset_video_flags()` and `get_video_flags()` for working with video buffer
507  flags from safe code.
508
509### Fixed
510- Setting buffer flags does not override arbitrary other flags anymore but
511  only sets the flags in question. This is necessary to not override extension
512  buffer flags like `gst_video::VideoBufferFlags`.
513
514## [0.14.2] - 2019-07-15
515### Added
516- Support for `ReferenceTimestampMeta`
517
518## [0.14.1] - 2019-07-06
519### Added
520- Various new WebRTC enum types from 1.14.1/1.16.0
521
522### Fixed
523- Correctly generate interlaced `VideoInfo` by using
524  `gst_video_info_set_interlaced_format()` instead of the generic function.
525- serde serialization unit tests for `gst::format` succeed again now.
526
527### Changed
528- `Debug` impls for `VideoFormatInfo` and `AudioFormatInfo` now print all the
529  details of the format instead of only the name, and the `Debug` impls for
530  `VideoInfo` and `AudioInfo` also print the format now.
531
532## [0.14.0] - 2019-06-24
533### Added
534- Bindings for `GLSyncMeta`.
535- Bindings for setting/getting `TagScope` on a `TagList`
536- Bindings for `GLDisplayWayland` and `GLDisplayX11` in addition to the
537  already existing `GLDisplayEGL`
538- Bindings for `Bus::pop_filtered()` and related functions
539- Bindings for getting/setting `Object`, `Element`, `Bin`, `Pipeline` and
540  `Plugin` flags
541- Bindings for `VideoCaptionMeta`
542- `Debug` impl of `Buffer` now also shows the metas of the buffers
543- Expose flow return in `PadProbeInfo` for overriding the return value
544- Bindings for `VideoDecoder` and `VideoEncoder`, including subclassing
545  support
546- Bindings for `Memory`, `Allocator` and `VideoBufferPool`
547- Bindings for `VideoFormatInfo::pack` and `::unpack` for format conversion
548- Bindings for `BaseParse`, including subclassing support
549- Various new arithmetic operation impls for fractions, formatted values and
550  `ClockTime`
551- Bindings for `VideoInfo::align()`
552
553### Changed
554- The `SDPMessage` and `SDPMedia` bindings were completely rewritten as they
555  were broken before and caused crashes in various usages. As part of this
556  there's also some more convenience API available on these types, like
557  iterators for example, and API to modify the `SDPMedia` contained in a
558  `SDPMessage`.
559- Update to GStreamer 1.16.
560- Regenerate with latest gir.
561- Run all autogenerated code through rustfmt after generation too.
562- Updated to latest versions of GLib/GIO/etc crates.
563- Updated to futures 0.3 / `std::future`
564- `ProxyPad` default functions moved to an extension trait instead of plain
565  functions on `ProxyPad`, making them more in sync with the default `Pad`
566  functions
567- GStreamer plugins are now exporting the new 1.14+ plugin symbols if they
568  were configured for GStreamer 1.14+
569- Arithmetic operations on formatted values and `ClockTime` do overflow checks
570  now and replace the result with the `NONE` value on overflow
571- `TryFrom`/`TryInto` traits are used in various places now instead of the
572  previous ad-hoc implementations of them.
573- Registering element/typefind/device monitor factories requires passing a
574  value of `gst::Rank` now instead of an arbitrary `u32`
575
576### Fixed
577- Use correct type for destroying pad task closure data. This was previously
578  using the wrong type, causing crashes at runtime.
579- `DeviceAdded`/`DeviceRemoved` message getters are transfer full so we don't
580  need to take an additional reference that would be leaked.
581- `AppSink` callbacks are correctly marked as `Send` instead of `Send+Sync`,
582  allowing a wider range of closures to be used for them.
583- Handle `PadProbeReturn::Handled` return values from pad probes more
584  correctly.
585- `ToOwned::to_owned()` on miniobjects has to create copies instead of
586  only increasing the reference count. Otherwise it was possible to create
587  multiple mutable and immutable references to the same object at the same
588  time.
589- Various functions take references to owned miniobjects instead of borrowed
590  references as it was otherwise possible to create multiple mutable or
591  immutable references to the same object at the same time.
592- `URIHandler::set_uri` does not accept `None` anymore as this is not allowed
593  by the C function.
594- Comparisons and addition of `TypeFindProbability` and `Rank` work correctly now
595- Various `Display` implementations were fixed to not cause a stack overflow
596  due to infinite recursion anymore
597- Various `::to_string()` functions don't take ownership of C strings anymore
598  that they do not own, which caused double frees before
599
600### Removed
601- MIKEY related bindings from the SDP library. The bindings were broken and
602  until someone needs them these are not available anymore.
603
604## [0.13.0] - 2019-02-22
605### Added
606- Subclassing infrastructure was moved directly into the bindings,
607  making the `gst-plugin` crate deprecated. This involves many API
608  changes but generally cleans up code and makes it more flexible.
609  Take a look at the `gst-plugins-rs` crate for various examples.
610- Bindings for GStreamer GL library
611- Bindings for `CapsFeatures` and `Meta`
612- Bindings for `ParentBufferMeta, `VideoMeta` and `VideoOverlayCompositionMeta`
613- Bindings for `VideoOverlayComposition` and `VideoOverlayRectangle`
614- Bindings for `VideoTimeCode`
615- Bindings for `NetAddressMeta`
616- Bindings for registering custom tags
617- `UniqueFlowCombiner` and `UniqueAdapter` wrappers that make use of
618  the Rust compile-time mutability checks and expose more API in a safe
619  way, and as a side-effect implement `Sync` and `Send` now
620- `Bus::add_watch_local()` and `gst_video::convert_frame_async_local()` that
621  allows to use a closure that does not implement `Send` but can only be
622  called from the thread owning the main context.
623- More complete bindings for `Allocation` `Query`
624- `pbutils` functions for codec descriptions
625- `TagList::iter()` for iterating over all tags while getting a single
626   value per tag. The old `::iter_tag_list()` function was renamed to
627   `::iter_generic()` and still provides access to each value for a tag
628- `Bus::iter()` and `Bus::iter_timed()` iterators around the
629  corresponding `::pop*()` functions
630- Getters for `VideoColorimetry` to access its fields
631- `Debug` impls for various missing types.
632- serde serialization of `Value` can also handle `Buffer` now
633- Extensive comments to all examples with explanations
634- Transmuxing example showing how to use `typefind`, `multiqueue` and
635  dynamic pads
636- basic-tutorial-12 was ported and added
637
638### Changed
639- Rust 1.31 is the minimum supported Rust version now
640- Update to latest gir code generator and glib bindings
641- Functions returning e.g. `gst::FlowReturn` or other "combined" enums
642  were changed to return split enums like `Result<gst::FlowSuccess,
643  gst::FlowError>` to allow usage of the standard Rust error handling.
644- Various functions and callbacks returning `bool` or `Option<_>` were
645  changed to return a `Result<_, glib::BoolError>` or
646  `Result<_, gst::LoggableError>` or `Result<_, gst::ErrorMessage>` for
647  better integration with Rust's error handling infrastructure.
648- Some infallible functions returning `bool` were changed to return `()`.
649- `MiniObject` subclasses are now newtype wrappers around the
650   underlying `GstRc<FooRef>` wrapper. This does not change the
651   API in any breaking way for the current usages, but allows
652   `MiniObject`s to also be implemented in other crates and
653   makes sure `rustdoc` places the documentation in the right places.
654- `BinExt` extension trait was renamed to `GstBinExt` to prevent
655  conflicts with `gtk::Bin` if both are imported
656- `Buffer::from_slice()` can't possible return `None`
657
658### Fixed
659- `gst::tag::Album` is the album tag now instead of artist sortname
660- Return `0` for the channel mask corresponding to negative
661  `AudioChannelPosition`s.
662- `PartialOrd` and related traits are implemented via pointer equality on
663  `ClockId` instead of using the compare function. Two clock ids with the same
664  timestamp are not necessarily the same.
665- Various functions that are actually fallible are now returning an
666  `Option<_>`.
667- Various `clippy` warnings
668
669## [0.12.2] - 2018-11-26
670### Fixed
671- PTP clock constructor actually creates a PTP instead of NTP clock
672
673### Added
674- Bindings for GStreamer Editing Services
675- Bindings for GStreamer Check testing library
676- Bindings for the encoding profile API (encodebin)
677- VideoFrame, VideoInfo, AudioInfo, StructureRef implements Send and Sync now
678- VideoFrame has a function to get the raw FFI pointer
679- From impls from the Error/Success enums to the combined enums like
680  FlowReturn
681- Bin-to-dot file functions were added to the Bin trait
682- gst_base::Adapter implements SendUnique now
683
684### Changed
685- All references were updated from GitHub to freedesktop.org GitLab
686- Fix various links in the README.md
687- Link to the correct location for the documentation
688- Remove GitLab badge as that only works with gitlab.com currently
689
690## [0.12.1] - 2018-09-21
691### Added
692- More complete bindings for the gst_video::VideoOverlay interface, especially
693  gst_video::is_video_overlay_prepare_window_handle_message()
694
695## [0.12.0] - 2018-09-08
696### Added
697- Bindings for the GStreamer SDP and WebRTC libraries
698- Generic API for working with tags that is based on string tag names and
699  glib::Value for the tag values
700- Bindings for Aggregator and AggregatorPad
701- Bindings for BaseTransform/BaseSrc::get_buffer_pool()
702- Optional serde implementations for the basic GStreamer data flow and metadata types
703
704### Changed
705- Use ptr::NonNull in various places
706- Updated to muldiv 0.2, num-rational 0.2
707- Bus::create_watch() can't return None
708- Remove CallbackGuard as unwinding across FFI boundaries is not undefined
709  behaviour anymore but will directly cause a panic
710- Changed from the futures to the futures-preview crate as an optional
711  dependency
712- Various Caps operations take a &CapsRef instead of &Caps
713- "deep-notify" signal takes the whole ParamSpec as parameter instead of only
714  the signal name
715- Some structs were changed from empty struct to empty enums
716- Pad probe code does not take an additional reference to the data anymore,
717  potentially passing writable events/buffers into the probe
718- ValueExt::compare() is implemented around std::cmp::Ordering now instead of
719  a custom enum that was basically the same
720
721### Fixed
722- Pad::add_probe() can return None if an IDLE probe was already called and
723  removed in the meantime
724- Various compiler and clippy warnings
725
726### Removed
727- std::Iterator impl for gst::Iterator. It was awkward to use because the
728  gst::Iterator could fail at each iteration
729
730## [0.11.6] - 2018-08-27
731### Fixed
732- Build with NLL/two-phase borrows
733- Explicitly define [bin] section for discoverer example to fix a cargo
734  warning
735
736### Added
737- Add unsafe gst::deinit() function
738- Ord/PartialOrd impls on gst::Seqnum
739- Getter for current pad mode
740- gst::Pad::sticky_events_foreach() for iterating over all sticky events
741  in a thread-safe way
742
743## [0.11.5] - 2018-07-24
744### Fixed
745- `gst::Bus`'s sync handler must unref every message if
746  `gst::BusSyncReply::Drop` is returned, otherwise they are all leaked
747
748## [0.11.4] - 2018-07-19
749### Fixed
750- `gst::Caps::subtract()` does not leak its arguments anymore
751- `gst::Caps::get_structure()` gracefully returns `None` if the index
752  is out of bounds instead of a `g_return_val_if_fail()`
753- `gst::Structure::new()` has to give away ownership of the info structure
754  but didn't. For 0.11 we internally copy, in 0.12 it will take the info
755  structure by value
756- Typefind tests don't fail anymore if the system has typefind factories
757  without caps
758
759### Added
760- An additional assertion that ensures that miniobjects are actually
761  writable before creating a mutable reference
762
763## [0.11.3] - 2018-06-08
764### Added
765- `gst::Bus::remove_watch()` is now available to remove a bus watch again
766- `fmt::Debug` impls for `AudioInfo` and `VideoInfo` were added
767- `fmt::Debug` impls for mini objects also print the pointer value now to make
768  it easier to track them in debug logs
769- `PlayerVisualization` has accessors for the name and description fields now,
770  without which there is no sensible way to use them or to set a player
771  visualization
772
773## [0.11.2] - 2018-05-09
774### Fixed
775- Work-around various floating reference handling changes between 1.12 and
776  1.14 to be able to run with both versions without memory leaks or other
777  reference count problems.
778  This affects NetTimeProvider, BufferPool, DeviceMonitor, Stream,
779  StreamCollection, and Player, NetClientClock, NetClock, PtpClock which were
780  already previously fixed.
781
782### Changed
783- Change the appsrc need-data and all appsink callbacks to not require the
784  Sync bound anymore and change from Fn to FnMut. They can only be called from
785  a single thread at a time. This change is only done for the corresponding
786  callbacks, not the signals.
787
788## [0.11.1] - 2018-04-07
789### Fixed
790- Fix Structure::to_string() to not run into an infinite recursion but call
791  the method on the contained StructureRef instead of on itself
792
793## [0.11.0] - 2018-03-20
794### Changed
795- Updated everything to GStreamer 1.14.0
796- Event, Message and Query types were refactored to improve usability.
797  Especially newly constructed queries allow to directly use the type-specific
798  functions to be used without first creating a view
799- VideoFrameRef::copy_to_ref() and ::copy_plane_to_ref() are gone now and the
800  original functions work with refs instead of full frames
801- PadProbeId and NotifyIds are not Copy/Clone anymore and are taken by value
802- GstPlayer has GstObject as parent class now
803
804### Added
805- GstPbutils, GstSdp, GstRtsp and GstRtspServer bindings
806- GstPromise, GstAudioStreamAlign and various other 1.14 API
807- GstVideoFilter and GstBufferPool bindings
808- Element::call_async()
809- Debug impl For Toc and TocEntry
810- Various new examples (RTP FEC, RTSP server, tag usage, ...)
811
812### Fixed
813- Memory leak in gst_video::convert_sample_async()
814
815## [0.10.2] - 2018-02-18
816### Fixed
817- Fix building of messages with custom fields for types that don't have a
818  GstStructure
819
820### Added
821- VideoFrameRef::copy_to_ref() and ::copy_plane_to_ref(), which work with
822  VideoFrameRefs instead of full VideoFrames
823- Getters for the BaseSrc/Sink/Transform configured segment
824- Document the gstreamer-player-1.0 dependency in the README.md
825
826## [0.10.1] - 2018-01-03
827### Fixed
828- Don't require &mut self for TagSetterExtManual::add()
829
830### Added
831- A TagSetter example application
832- Bindings for gst_video::convert_sample() and ::convert_sample_async()
833- Bindings for gst_video::VideoRectangle
834- Debug impl for Sample and ::with_buffer_list() constructor
835- A borrowing version of VideoFrame: VideoFrameRef
836- Bindings for GstVideoFilter
837
838### Changed
839- Deprecated Sample::get_info() in favour of ::get_structure()
840- Player has gst::Object as another parent class now
841
842## [0.10.0] - 2017-12-22
843### Fixed
844- Various clippy warnings
845- Memory leak of the tag list in Toc::merge_tags()
846- Property getters use Values of the correct type
847- Event::get_structure(), Message::get_structure() and
848  Query::get_structure() can return None for the structure
849- Various other nullability fixes all over the API, changing functions to
850  accept Option<> or returning Option<>, or only plain types
851- Functions taking paths/filenames now actually take Paths instead of &strs
852- Element::remove_pad() is not giving away a new reference to the pad
853  anymore, which caused a memory leak of all pads ever removed
854- Precision handling in ClockTime's Display impl
855- Video/AudioInfo are only Send, not Sync
856
857### Added
858- Various enums now also derive useful traits like Copy, Clone and Hash in
859  addition to PartialEq, Eq and Debug
860- TagList::merge() and insert() for combining tag lists
861- EventType gained many useful functions to work with event types and
862  a PartialOrd impl to check expected event order of event types where it matters
863- MessageRef/EventRef/QueryRef implement ToOwned
864- Bindings for Registry and PluginFeature
865- Event::set_running_time_offset() for adjusting the offset while events
866  pass through the pipeline
867- Event/Message GroupIds and Seqnums now have a newtype wrapper around u32
868  instead of the plain value, making usage of them slightly more typesafe.
869  Also add an "invalid" value for both, as exists in latest GStreamer now.
870- FormattedValue, GenericFormattedValue and related types were
871  implemented now, which allows more convenient and type-safe usage of
872  formatted values (time, bytes, etc)
873- Bindings for force-keyunit and still-frame events were added
874- MappedBuffer/BufferMap now implement various other useful traits, including
875  AsRef<[u8]>, AsMut, Deref, DerefMut, Debug, PartialEq and Eq
876- Add VideoMultiviewFramePacking enum, and use it in Player
877- Bindings for the GStreamer Net library, including PTP/NTP/network client
878  clocks and the GStreamer NetClock provider for network synchronization of
879  pipelines
880- IteratorError implements std::error:Error
881- Plugin::add_dependency() and ::add_dependency_simple() was added
882- Rank and TypeFindProbability implement PartialOrd/Ord now
883- Bindings for TypeFind, TypeFindFactory and the typefind helpers
884- StreamCollection::iter() for iterating over all contained streams
885- ErrorMessage type that can be used e.g. in a Result for passing an error
886  message from somewhere to upper layers to then be posted on an element the
887  same way gst_element_error!() would've done
888
889### Changed
890- Sample::new(), TagList::add(), Structure::set() and similar
891  functions take the values (ToSendValue impls) by reference instead of value.
892  They were not consumed by the function before.
893- The Debug impls of various types, including Event/Buffer/Message/Query/Structure
894  were improved to print all the fields, similar to what GST_PTR_FORMAT would
895  do in C
896- Switched to lazy_static 1.0
897- Gap event and Duration tag are using ClockTimes now, as well as various
898  Player signals
899- Segment is now based on a generic type FormattedSegment that can
900  take any format (time, bytes, etc) or a GenericFormattedValue for more
901  type-safety and convenience. Also functions for "casting" between a generic
902  segment and a segment with a specific format exist on this now
903- AppSrc and AppSink now have a builder for the callbacks, making it
904  unnecessary to always provide all callbacks even if only one is actually
905  needed
906- Various functions that returned bool for errors, are now returning a Result
907- Player configuration is now a custom type with more convenient API
908- Player VideoInfo uses a Fraction instead of (u32,u32) for the framerate and
909  pixel-aspect-ratio
910- VideoFrame API has more consistent API between writable and read-only
911  variants
912- Buffer::copy_into() was added, and ::copy_region() now takes a
913  BufferCopyFlags parameter instead of always using the default flags
914- ChildProxy::set_child_property() takes a &ToValue now to follow the API of
915  Object::set_property() and improve usability
916- Proxy/GhostPad default pad functions use the correct specific pad type now
917  instead of a generic Pad
918- Bus::add_signal_watch_full() takes a Priority for the priority instead of u32
919- Clock::(un)adjust_with_calibration() takes no clock parameter anymore
920
921### Removed
922- FormatValue was removed in favour of GenericFormattedValue and the
923  connected traits and specific format impls
924
925## [0.9.1] - 2017-11-26
926### Fixed
927- Export `FlowError`/`FlowSuccess`, `ClockError`/`ClockSuccess`,
928  `PadLinkError`/`PadLinkSuccess` too
929
930## [0.9.0] - 2017-11-26
931### Added
932- Bindings for (outputting to) the GStreamer logging system
933- Bindings for the GStreamer base library
934- Bindings for all the `Pad` functions to override pad behaviour, and pad task
935  functions
936- Bindings for `StaticCaps` and `StaticPadTemplate`
937- Bindings for `deep-notify` signal on `Object`
938- Support for directly creating `Error`/`Warning`/`Info` `Messages` and posting them
939  from an element with context information (file, line, module, etc.) similar
940  to the C `GST_ELEMENT_ERROR` macro
941- Support for setting custom fields in `Messages`/`Events` during construction
942- Support for creating Buffers out of anything that is `AsRef<[u8]>` or
943  `AsMut<[u8]>`
944- Support for using the `Read` trait on `Adapter`
945- Functions for getting all sink/src/all pads of an `Element`, and all children
946  of a `Bin`
947- Builder for `Caps` and `Structures` in addition to the existing functions
948- `AppSrc`/`AppSink` implement `BaseSrc`/`BaseSink` and `URIHandler`
949- Rust ports of the basic tutorials 1 to 8 from
950  https://gstreamer.freedesktop.org/documentation/tutorials/
951- "Getting started" and "Installation" sections to the README.md
952- "dox" feature for generating documentation for all available configurations
953
954### Fixed
955- `StackTraceFlags` are only available since 1.12
956- Worked around macOS requiring a `NSRunLoop` running on the main thread in all
957  examples and tutorials, to be able to show a window or anything else
958
959### Changed
960- `ClockTime` is now a wrapper around `Option<u64>` to handle the
961  `CLOCK_TIME_NONE` case better. This wrapper implements all the arithmetic
962  and other traits as needed and ensures that no accidential calculations with
963  `CLOCK_TIME_NONE` can happen
964- "Values with format", like in `Duration`/`Position`/`Convert` queries or
965  `Seek` events now return a `FormatValue` type. This contains the actual
966  `Format` together with the value and does any required conversions. This
967  also makes it harder to accidentially mix e.g. values in bytes and time
968- `PadProbeId` does not implement `Clone`/`Copy` anymore
969- Property notify watches return a custom type instead of ulong
970- `Error`/`Warning`/`Info` `Messages` can only be created with specific kinds of
971  `glib::Error` now. Using arbitrary ones does not work
972- `Iterator` bindings were completely rewritten and provide the item type as a
973  generic type parameter now, greatly simplifying its usage
974- All `glib::Values` are now `glib::SendValue` instead, e.g. in `Caps` and
975  `Structures`, as their content must be possible to send to different threads
976  safely
977- `Message::get_src()` can return `None`
978- Allow `None` as `Caps` in `AppSrc`/`AppSink`
979- Allow everything implementing `Into<Option<&str>>` to be used as a pad name
980- Moved `copy()` from `GstRc` directly to `MiniObject`
981- Success/Error enums (like `FlowReturn`, `PadLinkReturn`, `StateChangeReturn`) now
982  implement an `into_result()` function that splits them into a `Result` with
983  the good and bad cases. Also mark them as `#[must_use]` to make it harder to
984  accidentially ignore errors.
985- Error enums implement the `Error` trait
986- Many examples use the `failure` crate for error handling now, cleaning up the
987  error handling code quite a bit
988- Lots of other code cleanup, compiler/clippy warning cleanup, etc.
989
990## [0.8.2] - 2017-11-11
991### Fixed
992- Implement StaticType of BufferRef instead of Buffer. Buffer aka
993  GstRc<BufferRef> already implements StaticType if BufferRef does, and
994  without this it was not possible to use Buffers in GValues.
995- Free memory of the appsink/appsrc callbacks with the correct type. It was
996  crashing because of using the wrong type before.
997- Fix documentation URLs in Cargo.toml.
998
999### Added
1000- Installation instructions and links to documentation for getting started to
1001  README.md.
1002
1003## [0.8.1] - 2017-09-15
1004### Added
1005- Implement Send+Sync for Query, Message and Event, and their corresponding
1006  Ref types.
1007
1008### Fixed
1009- Constructor for gst_player::Player now works properly with GStreamer 1.12
1010  when passing a video renderer or signal dispatcher. There was a reference
1011  counting bug.
1012- Instead of returning &'static references from functions, return references
1013  with a generic, unbound lifetime instead.
1014  See https://github.com/rust-lang/rust/pull/42417#issue-233404573
1015- Various "unused external crate" warnings and clippy warnings everywhere.
1016
1017### Changed
1018- Remove Cargo.lock from GIT, it's not very useful for library crates.
1019- Run everything through latest rustfmt-nightly.
1020- Use while-let (instead of loop and if-let) and CLOCK_TIME_NONE (instead of
1021  u64::MAX) in the examples.
1022
1023## 0.8.0 - 2017-08-31
1024
1025- Initial release of the autogenerated GStreamer bindings. Older versions
1026  (< 0.8.0) of the bindings can be found [here](https://github.com/arturoc/gstreamer1.0-rs).
1027  The API of the two is incompatible.
1028
1029[Unreleased]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.17.0...HEAD
1030[0.17.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.7...0.17.0
1031[0.16.7]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.6...0.16.7
1032[0.16.6]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.5...0.16.6
1033[0.16.5]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.4...0.16.5
1034[0.16.4]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.3...0.16.4
1035[0.16.3]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.2...0.16.3
1036[0.16.2]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.1...0.16.2
1037[0.16.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.0...0.16.1
1038[0.16.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.7...0.16.0
1039[0.15.7]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.6...0.15.7
1040[0.15.6]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.5...0.15.6
1041[0.15.5]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.4...0.15.5
1042[0.15.4]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.3...0.15.4
1043[0.15.3]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.2...0.15.3
1044[0.15.2]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.1...0.15.2
1045[0.15.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.0...0.15.1
1046[0.15.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.14.2...0.15.0
1047[0.14.2]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.14.1...0.14.2
1048[0.14.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.14.0...0.14.1
1049[0.14.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.13.0...0.14.0
1050[0.13.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.12.2...0.13.0
1051[0.12.2]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.12.1...0.12.2
1052[0.12.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.12.0...0.12.1
1053[0.12.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.11.6...0.12.0
1054[0.11.6]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.11.5...0.11.6
1055[0.11.5]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.11.4...0.11.5
1056[0.11.4]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.11.3...0.11.4
1057[0.11.3]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.11.2...0.11.3
1058[0.11.2]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.11.1...0.11.2
1059[0.11.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.11.0...0.11.1
1060[0.11.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.10.2...0.11.0
1061[0.10.2]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.10.1...0.10.2
1062[0.10.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.10.0...0.10.1
1063[0.10.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.9.1...0.10.0
1064[0.9.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.9.0...0.9.1
1065[0.9.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.8.1...0.9.0
1066[0.8.2]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.8.1...0.8.2
1067[0.8.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.8.0...0.8.1
1068