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