File: NEWS

package info (click to toggle)
gst-python1.0 1.26.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 968 kB
  • sloc: python: 7,964; ansic: 1,854; makefile: 33
file content (1827 lines) | stat: -rw-r--r-- 91,003 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
GStreamer 1.26 Release Notes

GStreamer 1.26.0 was originally released on 11 March 2025.

The latest bug-fix release in the stable 1.26 series is 1.26.2 and was released on 29 May 2025.

See https://gstreamer.freedesktop.org/releases/1.26/ for the latest version of this document.

Last updated: Thursday 29 May 2025, 20:00 UTC (log)

## Introduction

The GStreamer team is proud to announce a new major feature release in the stable 1.x API series of your favourite
cross-platform multimedia framework!

As always, this release is again packed with many new features, bug fixes, and other improvements.

## Highlights

-   H.266 Versatile Video Coding (VVC) codec support
-   Low Complexity Enhancement Video Coding (LCEVC) support
-   Closed captions: H.264/H.265 extractor/inserter, cea708overlay, cea708mux, tttocea708 and more
-   New hlscmafsink, hlssink3, and hlsmultivariantsink; HLS/DASH client and dashsink improvements
-   New AWS and Speechmatics transcription, translation and TTS services elements, plus translationbin
-   Splitmux lazy loading and dynamic fragment addition support
-   Matroska: H.266 video and rotation tag support, defined latency muxing
-   MPEG-TS: support for H.266, JPEG XS, AV1, VP9 codecs and SMPTE ST-2038 and ID3 meta; mpegtslivesrc
-   ISO MP4: support for H.266, Hap, Lagarith lossless codecs; raw video support; rotation tags
-   SMPTE 2038 ancillary data streams support
-   JPEG XS image codec support
-   Analytics: New TensorMeta; N-to-N relationships; Mtd to carry segmentation masks
-   ONVIF metadata extractor and conversion to/from relation metas
-   New originalbuffer element that can restore buffers again after transformation steps for analytics
-   Improved Python bindings for analytics API
-   Lots of Vulkan integration and Vulkan Video decoder/encoder improvements
-   OpenGL integration improvements, esp. in glcolorconvert, gldownload, glupload
-   Qt5/Qt6 QML GL sinks now support direct DMABuf import from hardware decoders
-   CUDA: New compositor, Jetson NVMM memory support, stream-ordered allocator
-   NVCODEC AV1 video encoder element, and nvdsdewarp
-   New Direct3D12 integration support library
-   New d3d12swapchainsink and d3d12deinterlace elements and D3D12 sink/source for zero-copy IPC
-   Decklink HDR support (PQ + HLG) and frame scheduling enhancements
-   AJA capture source clock handling and signal loss recovery improvements
-   RTP and RTSP: New rtpbin sync modes, client-side MIKEY support in rtspsrc
-   New Rust rtpbin2, rtprecv, rtpsend, and many new Rust RTP payloaders and depayloaders
-   webrtcbin support for basic rollbacks and other improvements
-   webrtcsink: support for more encoders, SDP munging, and a built-in web/signalling server
-   webrtcsrc/sink: support for uncompressed audio/video and NTP & PTP clock signalling and synchronization
-   rtmp2: server authentication improvements incl. Limelight CDN (llnw) authentication
-   New Microsoft WebView2 based web browser source element
-   The GTK3 plugin has gained support for OpenGL/WGL on Windows
-   Many GTK4 paintable sink improvements
-   GstPlay: id-based stream selection and message API improvements
-   Real-time pipeline visualization in a browser using a new dots tracer and viewer
-   New tracers for tracking memory usage, pad push timings, and buffer flow as pcap files
-   VA hardware-acclerated H.266/VVC decoder, VP8 and JPEG encoders, VP9/VP8 alpha decodebins
-   Video4Linux2 elements support DMA_DRM caps negotiation now
-   V4L2 stateless decoders implement inter-frame resolution changes for AV1 and VP9
-   Editing services: support for reverse playback and audio channel reordering
-   New QUIC-based elements for working with raw QUIC streams, RTP-over-QUIC (RoQ) and WebTransport
-   Apple AAC audio encoder and multi-channel support for the Apple audio decoders
-   cerbero: Python bindings and introspection support; improved Windows installer based on WiX5
-   Lots of new plugins, features, performance improvements and bug fixes

## Major new features and changes

### H.266 Versatile Video Coding (VVC) codec support

-   The H.266 / VVC video codec is a successor to H.265 / HEVC and is standardised in ISO/IEC 23090-3.

-   A new h266parse element was added, along with parsing API, typefinding support and some codec utility functions in the
    gst-plugins-base utility library.

-   A H.266 decoder base class for hardware-accelerated decoders was added and used to implement a VA-API-based
    hardware-accelerated H.266 decoder.

-   The FFmpeg H.266 decoder is exposed now (from FFmpeg 7.0 onwards).

-   H.266 / VVC muxing and demuxing support was implemented for MP4, Matroska and MPEG-TS containers.

-   A VVdeC-based H.266 decoder element was added to the Rust plugins, based on the Fraunhofer Versatile Video Decoder library.

### JPEG XS image codec support

-   JPEG XS is a visually lossless, low-latency, intra-only video codec for video production workflows, standardised in ISO/IEC
    21122.

-   JPEG XS encoder and decoder elements based on the SVT JPEG XS library were added, including support for muxing JPEG XS into
    MPEG-TS and demuxing it. Both interlaced and progressive modes are supported.

### Low Complexity Enhancement Video Coding (LCEVC) support

-   LCEVC is a codec that provides an enhancement layer on top of another codec such as H.264 for example. It is standardised as
    MPEG-5 Part 2.

-   LCEVC encoder and decoder elements based on V-Nova’s SDK libraries were added, including support in h264parse for extracting
    the enhancement layer from H.264 and decoding it via a lcevch264decodebin element.

### Closed captions improvements

-   New H.264 and H.265 closed captions extractor and inserter elements.

    -   These extractor elements don’t actually extract captions from the bitstream, but rely on parser elements to do that and
        add them to buffers in form of caption metas. The problem is that streams might contain B-frames, in which case the
        captions in the bitstream will not be in presentation order and extracting them requires frame-reordering in the same
        way that a decoder would do. These new elements will do exactly that and allow you to extract captions in presentation
        order without having to decode the stream.

    -   The inserter elements do something similar and insert caption SEIs into the H.264 or H.265 bitstream, taking into
        account frame ordering.

    -   This is useful if one wants to extract, process and re-insert captions into an existing video bitstream without decoding
        and re-encoding it (in which case the decoder and encoder would handle the caption reordering).

-   cdpserviceinject: New element for injecting a CDP service descriptor into closed caption CDP packets

-   cea708overlay: New element for overlaying CEA608 / CEA708 closed captions over video streams.

-   The cc708overlay element has been deprecated in favour of the cea708overlay element from the Rust plugins set.

-   cea608mux gained a "force-live" property to make it always in live mode and aggregate on timeout regardless of whether any
    live sources are linked upstream.

-   cea708mux: New element that allows to mux multiple CEA708 services into a single stream.

-   cccombiner has two new properties:

    -   "input-meta-processing" controls how input closed caption metas are processed and can be used to e.g. discard closed
        captions from the input pad if the matching video buffer already has closed caption on it.

    -   "schedule-timeout" to support timing out captions without EOS

-   tttocea708: New element for converting timed-text to CEA708 closed captions

-   Miscellaneous improvements and spec compliance fixes

### Speech to Text, Translation and Speech Synthesis

-   awstranscriber2, awstranslate: New elements around the AWS transcription and translation services.

-   polly: New element around the AWS text-to-speech polly services

-   speechmatics: New transcriber / speech-to-text and translation element

-   translationbin: Helper bin around translation elements, similar to the already existing transcriberbin for transcriptions.

### HLS DASH adaptive streaming improvements

-   The adaptivedemux2 client implementation gained support for file:// URIs and as such the ability to play HLS and DASH from
    local files. It also no longer sends spurious flush events when it loses sync in live streams, as that is unexpected and
    will be handled poorly in non-playback scenarios. Lastly, support for HTTP request retries was added via the "max-retries"
    property, along with some exponential backoff logic which can be fine-tuned via properties.

-   dashsink has received period duration fixes for dynamic MPDs and some memory leak fixes.

-   hlscmafsink, hlssink3: New single-variant HLS sink elements that can output CMAF (fMP4) or MPEG-TS fragments.

-   hlsmultivariantsink: New sink element that can output an HLS stream with multiple variants

### splitmuxsrc, splitmuxsink: lazy loading and dynamic fragment addition

-   splitmuxsrc and splitmuxsink were originally designed to handle a small number of large file fragments, e.g. for situations
    where one doesn’t want to exceed a certain file size when recording to legacy file systems. It was also designed for playing
    back a static set of file fragments that have been created by an earlier recording session and no longer changes. Over time
    people have found more applications and use cases for the splitmux elements and have been deploying them in different
    scenarios, exposing the limits of the current implementation.

-   In this release, splitmuxsink and splitmuxsrc gained new abilities aimed at improving support for recordings with a large
    number of files, and for adding fragments on the fly to allow playback of ongoing recordings:

    -   You can now add fragments directly to splitmuxsrc and provide the offset and duration in the stream:

        -   Providing offset and duration means splitmuxsrc doesn’t need to scan the file to measure it and calculate it. That
            makes for much faster startup.

        -   The new "add-fragment" signal can be used to add files to the set dynamically - allowing to be playing an ongoing
            recording and adding files to the playback set as they are finished.

    -   splitmuxsrc no longer keeps all files open, but instead only keeps 100 files open by default, configurable with the
        "num-open-fragments" property.

    -   There is a new "num-lookahead" property on splitmuxsrc to trigger (re)opening files a certain distance ahead of the play
        position.

    -   splitmuxsink will report fragment offset and fragment duration via a message on the bus when closing a file. This
        information can then be used to add the new fragment to a splitmuxsrc.

### MPEG-TS container format improvements

-   The MPEG-TS muxer and demuxer gained support for

    -   H.266 / VVC video muxing and demuxing
    -   JPEG-XS video muxing and demuxing
    -   VP9 video muxing and demuxing (using a custom mapping)
    -   AV1 video muxing and demuxing (using a custom mapping, since the work-in-progress specification effort doesn’t seem to
        be going anywhere anytime soon)
    -   SMPTE ST-2038 ancillary metadata streams (see section above)

-   mpegtsmux gained support for muxing ID3 metadata into the TS stream, as well as SMPTE 302M audio.

-   It’s also possible to disable sending SCTE-35 null (heartbeat) packets now in mpegtsmux by setting the
    "scte-35-null-interval" to 0.

-   tsparse now handles 192-byte M2TS packets

-   mpegtslivesrc: New source element that can wrap a live MPEG-TS source (e.g. SRT or UDP source) and provides a clock based on
    the PCR.

### Matroska container format improvements

-   H.266 / VVC video muxing and demuxing support

-   matroskamux

    -   was ported to the GstAggregator base class, ensuring defined-latency muxing in live streaming pipelines.
    -   gained rotation tag support

-   matroskademux now also supports seeks with a stop position in push mode.

### ISO MP4 container format improvements

-   can mux and demux H.266 / VVC in MP4 now

-   can demux Hap video now, as well as Lagarith lossless video and ISO/IEC 23003-5 raw PCM audio.

-   qtdemux handles keyunit-only trick mode also in push mode now

-   support for ISO/IEC 23001-17 raw video in MP4 in qtdemux and isomp4mux.

-   support for rotation tags in the muxers and demuxers was improved to correctly handle per-media and per-track rotations, and
    support for flips was added as well.

SMPTE 2038 ancillary data streams

-   SMPTE 2038 (pdf) is a generic system to put VBI-style ancillary data into an MPEG-TS container. This could include all kinds
    of metadata such as scoreboard data or game clocks, and of course also closed captions, in this case in form of a distinct
    stream completely separate from any video bitstream.

-   A number of new elements in the GStreamer Rust closedcaption plugin add support for this, along with mappings for it in the
    MPEG-TS muxer and demuxer. The new elements are:

    -   st2038ancdemux: splits SMPTE ST-2038 ancillary metadata (as received from tsdemux) into separate streams per DID/SDID
        and line/horizontal_offset. Will add a sometimes pad with details for each ancillary stream. Also has an always source
        pad that just outputs all ancillary streams for easy forwarding or remuxing, in case none of the ancillary streams need
        to be modified or dropped.

    -   st2038ancmux: muxes SMPTE ST-2038 ancillary metadata streams into a single stream for muxing into MPEG-TS with
        mpegtsmux. Combines ancillary data on the same line if needed, as is required for MPEG-TS muxing. Can accept individual
        ancillary metadata streams as inputs and/or the combined stream from st2038ancdemux.

        If the video framerate is known, it can be signalled to the ancillary data muxer via the output caps by adding a
        capsfilter behind it, with e.g. meta/x-st-2038,framerate=30/1.

        This allows the muxer to bundle all packets belonging to the same frame (with the same timestamp), but that is not
        required. In case there are multiple streams with the same DID/SDID that have an ST-2038 packet for the same frame, it
        will prioritise the one from more recently created request pads over those from earlier created request pads (which
        might contain a combined stream for example if that’s fed first).

    -   st2038anctocc: extracts closed captions (CEA-608 and/or CEA-708) from SMPTE ST-2038 ancillary metadata streams and
        outputs them on the respective sometimes source pad (src_cea608 or src_cea708). The data is output as a closed caption
        stream with caps closedcaption/x-cea-608,format=s334-1a or closedcaption/x-cea-708,format=cdp for further processing by
        other GStreamer closed caption processing elements.

    -   cctost2038anc: takes closed captions (CEA-608 and/or CEA-708) as produced by other GStreamer closed caption processing
        elements and converts them into SMPTE ST-2038 ancillary data that can be fed to st2038ancmux and then to mpegtsmux for
        splicing/muxing into an MPEG-TS container. The line-number and horizontal-offset properties should be set to the desired
        line number and horizontal offset.

### Analytics

-   Added a GstTensorMeta: This meta is designed to carry tensors from the inference element to the model-specific tensor
    decoder. This also includes a basic GstTensor class containing a single tensor. The actual tensor data is a GstBuffer.

-   Add N_TO_N relationship to GstAnalyticsRelationMeta: This makes it possible to describe N-to-N relationships. For example,
    between classes and regions in an instance segmentation.

-   Add a new analytics Mtd to carry segmentation masks: Being part of the GstAnalyticsMeta, it can be in relationship with the
    other Mtd, such as the classification and object detection bounding boxes.

-   onvifmetadataextractor: New element that can extract ONVIF metadata from GstMetas into a separate stream

-   originalbuffer: New plugin with originalbuffersave / originalbufferrestore elements that allow saving an original buffer,
    modifying it for analytics, and then restoring the original buffer content while keeping any additional metadata that was
    added.

-   relationmeta: New plugin with elements converting between GstRelationMeta and ONVIF XML metadata.

-   Improved Python bindings for a more Pythonic interface when iterating over GstRelationMeta’s mtd

### Vulkan integration enhancements

-   Vulkan Integration Improvements:

    -   Memory Management: Non-coherent memory is now invalidated when mapping for read in vkmemory.

    -   Color Space Selection: The vkswapper component now chooses the correct color space based on the format.

    -   Vulkan Plugin Compatibility: Support added for cases where glslc is not available for building Vulkan plugins, along
        with GLSL compiler support for glslang.

    -   Fullscreen Quad Updates: Improved support for setting NULL input/output buffers and added checks for unset video info.

    -   Vulkan Buffer Pool Enhancements: Buffer pool access flags and usage configurations have been refined, offering better
        performance for video decoding and encoding.

-   Decoder/Encoder Improvements:

    -   H264 Decoder: Enhancements to the vkh264dec component for better support of extended profiles and interlaced content
        decoding.

    -   H265 Decoder fixes: vkh265dec updated for proper handling of VPS/SPS on demand, along with fixes to PicOrderCntVal.

    -   Encoder Performance: Various internal optimizations to the Vulkan encoder, including removal of redundant references and
        better management of the DPB view.

-   Vulkan Instance and Device Management:

    -   Device Handling: Added new utility functions for managing Vulkan device instances, including
        gst_vulkan_instance_create_device_with_index and gst_vulkan_ensure_element_device.

    -   Device Context Management: Updates to manage Vulkan context handling more effectively within the application.

### OpenGL integration enhancements

-   glcolorconvert gained support for more formats and conversions:

    -   Planar YUV <-> planar YUV conversions
    -   Converting to and from v210 in general
    -   v210 <-> planar YUV
    -   UYVY and YUY2 <-> planar YUV
    -   v210 <-> UYVY and YUY2
    -   Support for Y444_10, Y444_16, I422_10, I422_12 pixel formats (both little endian and big endian variants)

-   gldownload can import DMABufs from a downstream pool

-   glupload gained a DRM raw uploader

### Qt5 + Qt6 QML integration improvements

-   qmlglsink, qml6glsink now support external-oes textures, which allows direct DMABuf import from hardware decoders. Both also
    support NV12 as an input format now.

-   qmlglsink gained support for RGB16/BGR16 as input format

-   qmlgl6src can now use a downstream buffer pool when available

-   qmlgloverlay make the depth/stencil buffer optional, which reduces memory bandwidth on Windows.

### CUDA / NVCODEC integration and feature additions

-   Added AV1 video encoder nvav1enc

-   CUDA mode nvcuda{CODEC}enc encode elements are renamed to nv{CODEC}enc and old nv{CODEC}enc implementations are removed

-   Added support for CUDA Stream-Ordered allocator

-   Added cudacompositor element which is equivalent to the software compositor element but uses CUDA

-   Added support for CUDA kernel precompile at plugin build time using nvcc and NVCODEC plugin can cache/reuse compiled CUDA
    CUBIN/PTX

-   cudaupload and cudadownload elements can support Jetson platform’s NVMM memory in addition to already supported desktop NVMM
    memory

-   Introduced nvdswrapper plugin which uses NVIDIA DeepStream SDK APIs with gst-cuda in an integrated way:

    -   nvdsdewarp: NVIDIA NVWarp360 API based dewarping element

### GStreamer Direct3D12 integration

-   New gst-d3d12 public library. The following elements are integrated with the gst-d3d12 library:

    -   NVIDIA NVCODEC decoders and encoders can support D3D12 memory
    -   Intel QSV encoders can accept D3D12 memory
    -   All elements in dwrite plugin can support D3D12 memory

-   The d3d12 library and plugin can be built with MinGW toolchain now (in addition to MSVC)

-   D3D12 video decoders and d3d12videosink are promoted to have higher rank than D3D11 elements

-   Added support for multiple mip-levels D3D12 textures:

    -   Newly added d3d12mipmapping element can generate D3D12 textures with multiple mip-levels

    -   max-mip-levels property is added to d3d12convert, d3d12videosink, and d3d12swapchainsink element, so that the elements
        can generate an intermediate texture with multiple mip-levels in order to reduce downscale aliasing artifacts

-   d3d12convert, d3d12videosink, and d3d12swapchainsink support the GstColorBalanceInterface to offer color balancing functions
    such as hue, saturation, and brightness adjustment

-   Added d3d12ipcsink and d3d12ipcsrc elements for zero-copy GPU memory sharing between processes

-   d3d12upload and d3d12download support direct GPU memory copy between D3D12 and D3D12 resources

-   Added d3d12swapchainsink element to support DirectComposition or UWP/WinUI3 SwapChainPanel based applications

-   Added d3d12deinterlace element which performs deinterlacing using a GPU vendor agnostic compute shader.

-   d3d12screencapturesrc element can capture HDR enabled desktop correctly in DDA mode (DXGI Desktop Duplication API)

### Capture and playout cards support

-   ajasrc: Improve clock handling, frame counting, capture timestamping, and signal loss recovery

-   The Blackmagic Decklink plugin gained support

    -   for HDR output and input (PQ + HLG static metadata)

    -   all modes of Quad HDMI recorder

    -   scheduling frames before they need to be displayed in decklinkvideosink

### RTP and RTSP stack improvements

-   rtspsrc now supports client-managed MIKEY key management. Some RTSP servers (e.g. Axis cameras) expect the client to propose
    the encryption key(s) to be used for SRTP / SRTCP. This is required to allow re-keying. This mode can be enabled by enabling
    the "client-managed-mikey-mode" property and comes with a number of new signals ("request-rtp-key" and "request-rtcp-key"),
    action signals ("set-mikey-parameter" and "remove-key") and properties ("hard-limit" and "soft-limit").

-   rtpbin: Add new “never” and “ntp” RTCP sync modes

    -   Never is useful for some RTSP servers that report plain garbage both via RTCP SR and RTP-Info, for example.
    -   NTP is useful if synchronization should only ever happen based on RTCP SR or NTP-64 RTP header extensions.

    This is part of a bigger refactoring of the synchronization / offsetting code in rtpbin, which also makes it regularly emit
    the sync signal even if no new synchronisation information is available, controlled by the new "min-sync-interval" property.

-   rtpjitterbuffer: add RFC7273 active status to jitterbuffer stats so applications can easily check whether RFC7273 sync is
    active.

-   rtph265depay: Add "wait-for-keyframe" "request-keyframe" properties and improve request keyframe logic

-   rtppassthroughpay gained the ability to regenerate RTP timestamps from buffer timestamps via the new "retimestamp-mode"
    property. This is useful in a relay RTSP server if one wants to do full drift compensation and ensure that the stream coming
    out of gst-rtsp-server is not drifting compared to the pipeline clock and also not compared to the RTCP NTP times.

-   New Rust RTP payloaders and depayloaders for AC3, AMR, JPEG, KLV, MPEG-TS (MP2T), MPEG-4 (MP4A, MP4G), Opus, PCMU (uLaw),
    PCMA (aLaw), VP8, VP9.

-   New rtpbin2 based on separate rtprecv and rtpsend elements

### WebRTC improvements

-   webrtcbin improvements

    -   Make basic rollbacks work

    -   Add "reuse-source-pads" property: When set to FALSE, if a transceiver becomes send-only or inactive then pre-existing
        source pads will receive an EOS event and no further traffic even after further renegotiation. When TRUE, pads will
        simply not receive any output when the negotiated transceiver state doesn’t have incoming traffic. If renegotiated
        later, the pad will receive data again.

    -   Early CNAME support (RFC5576): Have CNAME available to the jitterbuffer before the the first RTCP SR is received, for
        rapid synchronization.

    -   New "post-rtp-aux-sender" signal to allow for placement of an object after rtpbin, before sendbin. This is useful for
        objects such as congestion control elements, that don’t want to be burdened by the synchronization requirements of
        rtpsession.

    -   Create and associate transceivers earlier in negotiation, and other spec compliance improvements

    -   Statistics generation improvements for bundled streams

-   webrtcsink improvements:

    -   Support for more encoders: nvv4l2av1enc, vpuenc_h264 (for imx8mp), nvav1enc, av1enc, rav1enc and nvh265enc.

    -   The new "define-encoder-bitrates" signal allows applications to fine-tune the bitrate allocation for individual streams
        in cases where there are multiple encoders. By default the bitrate is split equally between encoders.

    -   A generic mechanism was implemented to forward metas over the control channel.

    -   Added a mechanism for SDP munging to handle server-specific quirks.

    -   Can expose a built-in web server and signalling server for prototyping and debugging purposes.

-   webrtcsink and webrtcsrc enhancements:

    -   Support for raw payloads, i.e. uncompressed audio and video

    -   NTP & PTP clock signalling and synchronization support (RFC 7273)

    -   Generic data channel control mechanism for sending upstream events back to the sender (webrtcsink)

-   webrtcsrc now has support for multiple producers

## New elements and plugins

-   Many exciting new Rust elements, see Rust section below.

-   webview2src: new Microsoft WebView2 based web browser source element

-   h264ccextractor, h264ccinserter: H.264 closed caption extractor / inserter

-   h265ccextractor, h265ccinserter: H.265 closed caption extractor / inserter

-   h266parse

-   lcevch264decodebin

-   New VA elements (see below): vah266dec, vavp8enc, vajpegenc, vavp8alphadecodebin, vavp9alphadecodebin

-   svtjpegxsdec, svtjpegxsenc: SVT JPEG XS decoder/encoder

-   Many other new elements mentioned in other sections (e.g. CUDA, NVCODEC, etc.)

## New element features and additions

-   audioconvert enhancements:

    -   Add possibility to reorder input channels when audioconvert has unpositionned audio channels as input. It can now use
        reordering configurations to automatically position those channels via the new "input-channels-reorder" and
        "input-channels-reorder-mode" properties.

    -   Better handling of setting of the mix matrix at run time

    -   handles new GstRequestMixMatrix custom upstream event

-   audiorate: Take the tolerance into account when filling gaps; better accounting of the number of samples added or dropped.

-   av1enc: Add "timebase" property to allow configuring a specific time base, in line with what exists for vp8enc and vp9enc
    already.

-   av1parse can parse annexb streams now, and typefinding support has been added for annexb streams as well.

-   The GTK3 plugin has gained support for OpenGL/WGL on Windows

-   fdsrc has a new "is-live" property to make it act like a live source and timestamp the received data with the clock running
    time.

-   imagefreeze: Add support for JPEG and PNG

-   kmssink: Extended the functionality to support buffers with DRM formats along with non-linear buffers

-   pitch now supports reverse playback

-   queue can emit the notify signal on queue level changes if the "notify-levels" property has been set.

-   qroverlay: the "pixel-size" property has been removed in favour of a new "size" property with slightly different semantics,
    where the size of the square is expressed in percent of the smallest of width and height.

-   rsvgdec: Negotiate resolution with downstream and scale accordingly

-   rtmp2: server authentication improvements

    -   Mimic librtmp’s behaviour and support additional connection parameters for the connect packet, which are commonly used
        for authentication, via the new "extra-connect-args" property.

    -   Add support for Limelight CDN (llnw) authentication

-   scaletempo has gained support for a “fit-down” mode: In fit-down mode only 1.0 rates are supported, and the element will fit
    audio data in buffers to their advertised duration. This is useful in speech synthesis cases, where elements such as
    awspolly will generate audio data from text, and assign the duration of the input text buffers to their output buffers.
    Translated or synthesised audio might be longer than the original inputs, so this makes sure the audio will be sped up to
    fit the original duration, so it doesn’t go out of sync.

-   souphttpsrc: Add the notion of "retry-backoff" and retry on 503 (service unavailable) and 500 (internal server error) http
    errors.

-   taginject now modifies existing tag events of the selected scope, with the new "merge-mode" property allowing finer control.

-   timecodestamper gained a new running-time source mode that converts the buffer running time into timecodes.

-   playbin3, uridecodebin3, parsebin

    -   lots of stream-collection handling and stability/reliability fixes
    -   error/warning/info message now include the URI (if known) and stream-id
    -   missing plugin messages include the stream-id

-   videocodectestsink gained support for GBR_10LE, GRAY8 and GRAY10_LE{16,32} pixel formats

-   videoflip gained support for the Y444_16LE and Y444_16BE pixel formats

-   videoconvertscale:

    -   Handle pixel aspect ratios with large numerators or denominators
    -   Explicitly handle the overlaycomposition meta caps feature, so it doesn’t get dropped unnecessarily

-   waylandsink prefers DMABuf over system memory now

-   x264enc has a new "nal-hrd" property to make the encoder signal HRD information, which is required for Blu-ray streams,
    television broadcast and a few other specialist areas. It can also be used to force true CBR, and will cause the encoder to
    output null padding packets.

-   zbar: add support for binary mode and getting symbols as raw bytes instead of a text string.

## Plugin and library moves

-   macOS: atdec was moved from the applemedia plugin in -bad to the osxaudio plugin in -good, in order to be able to share
    audio-related helper methods.

## Plugin and element removals

-   None in this cycle

## Miscellaneous API additions

### GStreamer Core

-   gst_meta_api_type_set_params_aggregator() allows setting an GstAllocationMetaParamsAggregator function for metas, which has
    been implemented for GstVideoMeta and is used to aggregate alignment requirements of multiple tee branches.

-   gst_debug_print_object() and gst_debug_print_segment() have been made public API. The can be used to easily get string
    representations of various types of (mini)objects in custom log handlers.

-   Added gst_aggregator_push_src_event(), so subclasses don’t just push events directly onto the source pad bypassing the base
    class without giving it the chance to send out any pending serialised events that should be sent out before.

-   GstMessage has gained APIs to generically add “details” to messages:

    -   gst_message_set_details()
    -   gst_message_get_details()
    -   gst_message_writable_details()
    -   gst_message_parse_error_writable_details()
    -   gst_message_parse_warning_writable_details()
    -   gst_message_parse_info_writable_details() This is used in uridecodebin3 to add the triggering URI to any INFO, WARNING
        or ERROR messages posted on the bus, and in decodebin3 to add the stream ID to any missing plugin messages posted on the
        bus.

-   gst_util_floor_log2() returns smallest integral value not bigger than log2(v).

-   gst_util_fraction_multiply_int64() is a 64-bit variant of gst_util_fraction_multiply().

#### GstIdStr replaces GQuark in structure and caps APIs

-   GQuarks are integer identifiers for strings that are inserted into a global hash table, allowing in theory for cheap
    equality comparisons. In GStreamer they have been used to represent GstStructure names and field names. The problem is that
    these strings once added to the global string table can never be freed again, which can lead to ever-increasing memory usage
    for processes where such name identifiers are created based on external input or on locally-created random identifiers.

-   GstIdStr is a new data structure made to replace quarks in our APIs. It can hold a short string inline, a static string, or
    a reference to a heap-allocated longer string, and allows for cheap storage of short strings and cheap comparisons. It does
    not involve access to a global hash table protected by a global lock, and as most strings used in GStreamer structures are
    very short, it is actually more performant than quarks in many scenarios.

-   GQuark-using APIs in GstStructure or GstCaps have been deprecated and equivalent APIs using GstIdStr have been added
    instead. For more details about this change watch Sebastian’s GStreamer Conference presentation “GQuark in GStreamer
    structures - what nonsense!”.

-   Most applications and plugins will have been using the plain string-based APIs which are not affected by this change.

#### GstVecDeque

-   Moved GstQueueArray as GstVecDeque into core for use in GstBus, the ringbuffer logger and in GstBufferPool, where an overly
    complicated signaling mechanism using GstAtomicQueue and GstPoll was replaced with GstVecDeque and a simple mutex/cond.

-   GstQueueArray in libgstbase was deprecated in favour of GstVecDeque.

-   GstAtomicQueue will be deprecated once all users in GStreamer have been moved over to GstVecDeque.

### Audio Library

-   Added gst_audio_reorder_channels_with_reorder_map() which allows reordering the samples with a pre-calculated reorder map
    instead of re-calculating the reorder map every time.

-   Add top-surround-left and top-surround-right channel positions

-   GstAudioConverter now supports more numerical types for the mix matrix, namely double, int, int64, uint, and uint64 in
    addition to plain floats.

### Plugins Base Utils Library

-   New AV1 caps utility functions for AV1 Codec Configuration Record codec_data handling

-   The GstEncodingProfile (de)serialization functions are now public

-   GstEncodingProfile gained a way to specify a factory-name when specifying caps. In some cases you want to ensure that a
    specific element factory is used while requiring some specific caps, but this was not possible so far. You can now do
    e.g. qtmux:video/x-prores,variant=standard|factory-name=avenc_prores_ks to ensure that the avenc_prores_ks factory is used
    to produce the variant of prores video stream.

### Tag Library

-   EXIF handling now support the CAPTURING_LIGHT_SOURCE tag

-   Vorbis tag handling gained support for the LYRICS tag

### Video Library and OpenGL Library

-   gst_video_convert_sample(), gst_video_convert_sample_async() gained support for D3D12 conversion.

-   GstVideoEncoder: gst_video_encoder_release_frame() and gst_video_encoder_drop_frame() have been made available as public
    API.

-   Navigation: gained mouse double click event support

-   Video element QoS handling was improved so as to not overshoot the QoS earliest time by a factor of 2. This was fixed in the
    video decoder, encoder, aggregator and audiovisualizer base classes, as well as in the adaptivedemux, deinterlace,
    monoscope, shapewipe, and (old) videomixer elements.

-   GstVideoConverter gained fast paths for v210 to/from I420_10 / I422_10

-   New gst_video_dma_drm_format_from_gst_format() helper function that converts a video format into a dma drm fourcc / modifier
    pair, plus gst_video_dma_drm_format_to_gst_format() which will do the reverse.

-   In the same vein gst_gl_dma_buf_transform_gst_formats_to_drm_formats() and
    gst_gl_dma_buf_transform_drm_formats_to_gst_formats() have been added to the GStreamer OpenGL support library.

-   GLDisplay/EGL: Add API (gst_gl_display_egl_set_foreign()) for overriding foreign-ness of the EGLDisplay in order to control
    whether GStreamer should call eglTerminate() or not.

-   Additional DMA DRM format definitions/mappings:

    -   NV15, NV20, NV30
    -   NV12_16L32S, MT2110T, MT2110R as used on Meditek SoCs
    -   NV12_10LE40
    -   RGB15, GRAY8, GRAY16_LE, GRAY16_BE
    -   plus support for big endian DRM formats and DRM vendor modifiers

New Raw Video Formats

-   Packed 4:2:2 YUV with 16 bits per channel:
    -   Y216_LE, Y216_BE
-   Packed 4:4:4:4 YUV with alpha, with 16 bits per channel:
    -   Y416_LE, Y416_BE
-   10-bit grayscale, packed into 16-bit words with left padding:
    -   GRAY10_LE16

### GstPlay Library

-   Add stream-id based selection of streams to better match playbin3’s API:
    -   Add accessors for the stream ID and selection API based on the stream ID:
        -   gst_play_stream_info_get_stream_id()
        -   gst_play_set_audio_track_id()
        -   gst_play_set_video_track_id()
        -   gst_play_set_subtitle_track_id()
        -   gst_play_set_track_ids()
    -   Deprecate the old index-based APIs:
        -   gst_play_stream_info_get_index()
        -   gst_play_set_audio_track()
        -   gst_play_set_video_track()
        -   gst_play_set_subtitle_track()
    -   Remove old playbin support
    -   Implement the track enable API based on stream selection
-   Distinguish missing plugin errors and include more details (uri, and stream-id if available) in error/warning messages:
    -   gst_play_message_get_uri()
    -   gst_play_message_get_stream_id()
    -   GST_PLAY_ERROR_MISSING_PLUGIN
    -   gst_play_message_parse_error_missing_plugin()
    -   gst_play_message_parse_warning_missing_plugin()
-   Improve play message API inconsistencies:
    -   Consistently name parse functions according to their message type:
        -   gst_play_message_parse_duration_changed()
        -   gst_play_message_parse_buffering()
    -   Deprecate the misnamed functions:
        -   gst_play_message_parse_duration_updated()
        -   gst_play_message_parse_buffering_percent()
    -   Add missing parse functions:
        -   gst_play_message_parse_uri_loaded()
        -   gst_play_message_parse_seek_done()
-   Support disabling the selected track at startup

## Miscellaneous performance, latency and memory optimisations

-   dvdspu: use multiple minimal sized PGS overlay rectangles instead of a single large one to minimise the total blitting
    surface in case of disjointed rectangles.

-   video-frame: reduce number of memcpy() calls on frame copies if possible

-   video-converter: added fast path conversions between v210 and I420_10 / I422_10

-   As always there have been plenty of performance, latency and memory optimisations all over the place.

## Miscellaneous other changes and enhancements

-   netclientclock: now also emits the clock synced signal when corrupted to signal that sync has been lost.

-   GstValue, GstStructure: can now (de)serialize string arrays (G_TYPE_STRV)

## Tracing framework and debugging improvements

-   dot files (pipeline graph dumps) are now written to disk atomically

-   tracing: add hooks for gst_pad_send_event_unchecked() and GstMemory init/free

-   tracers: Simplify params handling using GstStructure and object properties and move tracers over to property-based
    configuration (leaks, latency).

-   textoverlay, clockoverlay, timeoverlay: new "response-time-compensation" property that makes the element render the text or
    timestamp twice: Once in the normal location and once in a different sequentially predictable location for every frame. This
    is useful when measuring video latency by taking a photo with a camera of two screens showing the test video overlayed with
    timeoverlay or clockoverlay. In these cases, you will often see ghosting if the display’s pixel response time is not great,
    which makes it difficult to discern what the current timestamp being shown is. Rendering in a different location for each
    frame makes it easy to tell what the latest timestamp is. In addition, you can also use the fade-time of the previous frame
    to measure with sub-framerate accuracy when the photo was taken, not just clamped to the framerate, giving you a higher
    precision latency value.

New tracers

-   memory-tracer: New tracer that can track memory usage over time

-   pad-push-timings: New tracer for tracing pad push timings

-   pcap-writer: New tracer that can store the buffers flowing through a pad as PCAP file

Dot tracer/viewer

-   New dots tracer that simplifies the pipeline visualization workflow:
    -   Automatically configures dot file directory and cleanup
    -   Integrates with the pipeline-snapshotS tracer to allow dumping pipeline on demand from the gst-dots-viewer web interface
    -   Uses GST_DEBUG_DUMP_DOT_DIR or falls back to $XDG_CACHE_HOME/gstreamer-dots
-   New gst-dots-viewer web tool for real-time pipeline visualization
    -   Provides interface to browse and visualize pipeline dot files
    -   Features on-demand pipeline snapshots via “Dump Pipelines” button
    -   WebSocket integration for live updates
    -   Uses GST_DEBUG_DUMP_DOT_DIR or falls back to $XDG_CACHE_HOME/gstreamer-dots
-   Simple usage:
    -   gst-dots-viewer (starts server)
    -   GST_TRACERS=dots gst-launch-1.0 videotestsrc ! autovideosink (runs with tracer)
    -   View at http://localhost:3000

Debug logging system improvements

-   Nothing major in this cycle.

## Tools

-   gst-inspect-1.0 documents tracer properties now and shows element flags

-   gst-launch-1.0 will show error messages posted during pipeline construction

## GStreamer FFmpeg wrapper

-   Add support for H.266/VVC decoder

-   Add mappings for the Hap video codec, the Quite OK Image codec (QOI) and the M101 Matrox uncompressed SD video codec.

-   Don’t register elements for which we have no caps and which were non-functional as a result (showing unknown/unknown caps).

-   The S302M audio encoder now supports up to 8 channels.

-   Various tag handling improvements in the avdemux wrappers, especially when there are both upstream tags and additional local
    tags.

-   Support for 10-bit grayscale formats

## GStreamer RTSP server

-   GstRTSPOnvifMediaFactoryClass gained a ::create_backchannel_stream() vfunc. This allows subclasses to delay creation of the
    backchannel to later in the sequence, which is useful in scenarios where the RTSP server acts as a relay and the supported
    caps depend on the upstream camera, for example.

-   The ONVIF backchannel example now features support for different codecs, including AAC.

## VA-API integration

VA plugin

-   New VA elements:

    -   H.266 / VVC video decoder
    -   VP8 video encoder
    -   JPEG encoder
    -   VP9 + VP8 alpha decodebin

    Remember that the availability of these elements depends on your platform and driver.

-   There are a lot of improvements and bug fixes, to hightlight some of them:

    -   Improved B pyramid mode for both H264 and HEVC encoding when reference frame count exceeds 2, optimizing pyramid level
        handling.
    -   Enabled ICQ and QVBR modes for several encoders, including H264, H265, VP9 and AV1.
    -   Updated rate control features by setting the quality factor parameter, while improving bitrate change handling.
    -   Improved VP9 encoder’s ability to avoid reopening or renegotiating encoder settings when parameters remain stable.
    -   Added functionality to adjust the trellis parameter in encoders.
    -   Optimize encoders throughput with the introduction of output delay.
    -   Added support for new interpolation methods for scaling and improvements for handling interlace modes.

GStreamer-VAAPI is now deprecated

-   gstreamer-vaapi has been deprecated and is no longer actively maintained. Users who rely on gstreamer-vaapi are encouraged
    to migrate to the va plugin’s elements at the earliest opportunity.

-   vaapi*enc encoders have been demoted to a rank of None, so will no longer be autoplugged in encodebin. They have also no
    longer advertise dmabuf caps or unusual pixel formats on their input pad template caps.

## GStreamer Video4Linux2 support

-   Implemented DMA_DRM caps negotiation

-   Framerate negotiation improvements

-   Support for P010 and BGR10A2_LE pixel formats

-   The V4L2 stateless decoders now support inter-frame resolution changes for AV1 and VP9

-   The V4L2 stateful encoders can now handle dynamic frame rates (0/1), and colorimetry negotiation was also improved.

## GStreamer Editing Services and NLE

-   Added support for reverse playback with a new reverse property on nlesource which is exposed child property on GESClip

-   Input channels reordering for flexible audio channel mapping

-   Added support for transition in the ges-launch-1.0 timeline description format

-   Added support for GstContext sharing in GESTimeline

-   Added basic support for duplicated children property in GESTimelineElement

-   validate: Add an action type to group clips

## GStreamer validate

-   Added new action types:

    -   start-http-server: Start a new instance of our HTTP test server
    -   http-requests: Send an HTTP request to a server, designed to work with our test http server

-   HTTP server control endpoints to allow scenarios to control the server behavior, allowing simulating server failures from
    tests

-   Improved the select-streams action type, adding support for selecting the same streams several times

-   Added support for forcing monitoring of all pipelines in validatetest files

-   Enhanced support for expected Error messages on the bus

-   Added ways to retrieve HTTP server port in .validatetest files

-   Added support for lldb in the gst-validate-launcher

## GStreamer Python Bindings

gst-python is an extension of the regular GStreamer Python bindings based on gobject-introspection information and PyGObject,
and provides “syntactic sugar” in form of overrides for various GStreamer APIs that makes them easier to use in Python and more
pythonic; as well as support for APIs that aren’t available through the regular gobject-introspection based bindings, such as
e.g. GStreamer’s fundamental GLib types such as Gst.Fraction, Gst.IntRange etc.

-   The python Meson build option has been renamed to python-exe (and will yield to the monorepo build option of the same name
    if set, in a monorepo build context).

-   Added an iterator for AnalyticsRelationMeta

-   Implement __eq__ for Mtd classes

-   Various build fixes and Windows-related fixes.

## GStreamer C# Bindings

-   The C# bindings have been updated for the latest GStreamer 1.26 API

## GStreamer Rust Bindings and Rust Plugins

The GStreamer Rust bindings and plugins are released separately with a different release cadence that’s tied to the gtk-rs
release cycle.

The latest release of the bindings (0.23) has already been updated for the new GStreamer 1.26 APIs, and works with any GStreamer
version starting at 1.14.

gst-plugins-rs, the module containing GStreamer plugins written in Rust, has also seen lots of activity with many new elements
and plugins. The GStreamer 1.26 binaries will be tracking the main branch of gst-plugins-rs for starters and then track the 0.14
branch once that has been released (around summer 2025). After that, fixes from newer versions will be backported as needed to
the 0.14 branch for future 1.26.x bugfix releases.

Rust plugins can be used from any programming language. To applications they look just like a plugin written in C or C++.

### New Rust elements

-   awstranscriber2, awstranslate: New elements around the AWS transcription and translation services.

-   cea708mux: New element that allows to mux multiple CEA708 services into a single stream.

-   cdpserviceinject: New element for injecting a CDP service descriptor into closed caption CDP packets

-   cea708overlay: New element for overlaying CEA608 / CEA708 closed captions over video streams.

-   gopbuffer: New element that can buffer a minimum duration of data delimited by discrete GOPs (Group of Picture)

-   hlscmafsink, hlssink3: New single-variant HLS sink elements that can output CMAF (fMP4) or MPEG-TS fragments.

-   hlsmultivariantsink: New sink element that can output an HLS stream with multiple variants

-   mpegtslivesrc: New source element that can wrap a live MPEG-TS source (e.g. SRT or UDP source) and provides a clock based on
    the PCR.

-   onvifmetadataextractor: New element that can extract ONVIF metadata from GstMetas into a separate stream

-   originalbuffer: New plugin with originalbuffersave / originalbufferrestore elements that allow saving an original buffer,
    modifying it for analytics, and then restoring the original buffer content while keeping any additional metadata that was
    added.

-   polly: New element around the AWS text-to-speech polly services

-   quinn: New plugin that contains various QUIC-based elements for working with raw QUIC streams, RTP-over-QUIC (RoQ) and
    WebTransport.

-   relationmeta: New plugin with elements converting between GstRelationMeta and ONVIF XML metadata.

-   New Rust RTP payloaders and depayloaders for AC3, AMR, JPEG, KLV, MPEG-TS (MP2T), MPEG-4 (MP4A, MP4G), Opus, PCMU (uLaw),
    PCMA (aLaw), VP8, VP9.

-   New rtpbin2 based on rtprecv / rtpsend elements

-   speechmatics: New transcriber / speech-to-text and translation element

-   New spotifylyricssrc element for grabbing lyrics from Spotify.

-   streamgrouper: New element that takes any number of streams as input and adjusts their stream-start events in such a way
    that they all belong to the same stream group.

-   translationbin: Helper bin around translation elements, similar to the already existing transcriberbin for transcriptions.

-   tttocea708: New element for converting timed-text to CEA708 closed captions

-   A VVdeC-based H.266 decoder element was added to the Rust plugins, based on the Fraunhofer Versatile Video Decoder library.

For a full list of changes in the Rust plugins see the gst-plugins-rs ChangeLog between versions 0.12 (shipped with GStreamer
1.24) and 0.14.x (shipped with GStreamer 1.26).

Note that at the time of GStreamer 1.26.0 gst-plugins-rs 0.14 was not released yet and the git main branch was included instead
(see above). As such, the ChangeLog also did not contain the changes between the latest 0.13 release and 0.14.0.

## Build and Dependencies

-   Meson >= 1.4 is now required for all modules

-   liborc >= 0.4.41 is strongly recommended

-   libnice >= 0.1.22 is strongly recommended, as it is required for WebRTC ICE consent freshness (RFC 7675).

-   The ASIO plugin dropped its external SDK header dependency, so it can always be built and shipped more easily.

-   Require tinyalsa >= 1.1.0 when building the tinyalsa plugin

-   The srtp plugin now requires libsrtp2, support for libsrtp1 was dropped.

Monorepo build

-   The FFmpeg subproject wrap was updated to 7.1

-   Many other wrap updates

gstreamer-full

-   No major changes

Development environment

-   Local pre-commit checks via git hooks have been moved over to pre-commit, including the code indentation check.

-   Code indentation checking no longer relies on a locally installed copy of GNU indent (which had different outcomes depending
    on the exact version installed). Instead pre-commit will automatically install the gst-indent-1.0 indentation tool through
    pip, which also works on Windows and macOS.

-   A pre-commit hook has been added to check documentation cache updates and since tags.

-   Many meson wrap updates, including to FFmpeg 7.1

-   The uninstalled development environment should work better on macOS now, also in combination with homebrew (e.g. when
    libsoup comes from homebrew).

-   New python-exe Meson build option to override the target Python installation to use. This will be picked up by the
    gst-python and gst-editing-sevices subprojects.

## Platform-specific changes and improvements

### Android

-   The recommended mechanism to build Android apps has changed from Android.mk to CMake-in-Gradle using
    FindGStreamerMobile.cmake. Android.mk support has been deprecated and will be removed in the next stable release. For more
    information, see below, in the Cerbero section.
-   More H.264/H.265 profiles and levels have been added to the androidmedia hardware-accelerated video encoder and decoder
    elements, along with mappings for a number of additional pixel formats for P010, packed 4:2:0 variants and RGBA layouts,
    which fixes problems with android decoders refusing to output raw video frames with decoders that announce support for these
    common pixel formats and only allow the ‘hardware surfaces output’ path.

### Apple macOS and iOS

-   atenc: added an Apple AAC audio encoder

-   atdec can now decode audio with more than two channels

-   vtenc has received various bug fixes as well as a number of new features:

    -   Support for HEVC with alpha encoding via the new vtenc_h265a element
    -   additional rate control options for constant bitrate encoding (only supported on macOS 13.0+ and iOS 16.0+ on Apple
        Silicon), setting data rate limits, and emulating CBR mode via data rate limits where CBR is not supported.
    -   HLG color transfer support
    -   new "max-frame-delay" property (for ProRes)

-   Better macOS support for gst-validate tools which now use gst_macos_main() and support lldb

-   The osxaudio device provider exposes more properties including a unique id

-   osxaudio will automatically set up AVAudioSession on iOS and always expose the maximum number of channels a device supports
    with an unpositioned layout.

-   The monorepo development environment should work better on macOS now

-   CMake apps that build macOS and iOS apps can consume GStreamer more easily now, using FindGStreamer.cmake or
    FindGStreamerMobile.cmake respectively.

-   In the near future, CMake in Xcode will be the preferred way of building the iOS tutorials. See below, in the Cerbero
    section.

### Windows

-   webview2src: new Microsoft WebView2 based web browser source element

-   The mediafoundation plugin can also be built with MinGW now.

-   The GTK3 plugin has gained support for OpenGL/WGL on Windows

-   qsv: Add support for d3d12 interop in encoder, via D3D11 textures

### Cerbero

Cerbero is a meta build system used to build GStreamer plus dependencies on platforms where dependencies are not readily
available, such as Windows, Android, iOS, and macOS.

General improvements

-   New features:

    -   Python bindings support has been re-introduced and now supports Linux, Windows (MSVC) and macOS. Simply downloading the
        official binaries and setting PYTHONPATH to the appropriate directory is sufficient.

        -   This should make it easier for macOS and Windows users to use Python libraries, frameworks, and projects that use
            GStreamer such as Pitivi and gst-python-ml.

    -   Introspection support has been re-introduced on Linux, Windows (MSVC), and macOS.

    -   New variants assert and checks to disable GLib assertions and runtime checks for performance reasons. Please note that
        these are not recommended because they have significant behavioural side-effects, make debugging harder, and should only
        be enabled when targeting extremely resource-constrained platforms.

-   API/ABI changes:

    -   Libsoup has been upgraded from 2.74 to 3.6, which is an API and ABI breaking change. The soup and adaptivedemux2 plugins
        are unchanged, but your applications may need updating since libsoup-2.4 and libsoup-3.0 cannot co-exist in the same
        process.

    -   OpenSSL has been updated from 1.1.1 to 3.4, which is an ABI and API breaking change. Plugins are unchanged, but your
        applications may need updating.

-   Plugins added:

    -   The svt-av1 plugin is now shipped in the binary releases for all platforms.

    -   The svt-jpeg-xs plugin is now shipped in the binary releases for all platforms.

    -   The x265 plugin is now shipped in the binary releases for all platforms.

    -   All gst-plugins-rs elements are now shipped in the binary releases for all platforms, except those that have C/C++
        system-deps like GTK4. For a full list, see the Rust section above.

-   Plugins changed:

    -   The rsvg plugin now uses librsvg written in Rust. The only side-effects of this should be better SVG rendering and
        slightly larger plugin size.

    -   The webrtc Rust plugin now also supports aws and livekit integrations .

-   Plugins removed:

    -   webrtc-audio-processing has been updated to 2.0, which means the isac plugin is no longer shipped.

-   Development improvements:

    -   Support for the shell command has been added to cross-macos-universal, since the prefix is executable despite being a
        cross-compile target

    -   More recipes have been ported away from Autotools to Meson and CMake, speeding up the build and increasing platform
        support.

#### macOS

-   Python bindings support on macOS only supports using the Xcode-provided Python 3

-   MoltenVK support in the applemedia plugin now also works on arm64 when doing a cross-universal build.

#### iOS

-   CMake inside Xcode will soon be the recommended way to consume GStreamer when building iOS apps, similar to Android apps.

    -   FindGStreamerMobile.cmake is the recommended way to consume GStreamer now

    -   Tutorials and examples still use Xcode project files, but CMake support will be the active focus going forward

#### Windows

-   The minimum supported OS version is now Windows 10.

    -   GStreamer itself can still be built for an older Windows, so if your project is majorly impacted by this, please open an
        issue with details.

-   The Windows MSI installers are now based on WiX v5, with several improvements including a much faster MSI creation process,
    improved naming in Add/Remove Programs, and more.

    -   Windows installer packages: Starting with 1.26, due to security reasons, the default installation directory has changed
        from C:\gstreamer to the Program Files folder, e.g. C:\Program Files (x86)\gstreamer for the 32-bit package on 64-bit
        Windows. If you upgrade from 1.24 or older versions, the 1.26 installers will NOT keep using the existing folder.
        Nevertheless if you were using C:\gstreamer we strongly recommend you double-check the install location.

    -   Note for MSI packagers: Starting with 1.26, the installers were ported to WiX 5.0. As part of this, the property for
        setting the installation directory has been changed to INSTALLDIR, and it now requires a full path to the desired
        directory, e.g. C:\gstreamer instead of C:\.

    -   Cross-MinGW build no longer supports the creation of MSIs. Please use tarballs.

-   MinGW:

    -   MinGW toolchain has been updated from GCC 8.2 → 14.2 and MinGW 6.0 → 12.0

    -   The mediafoundation plugin is also shipped in the MinGW packages now.

    -   The d3d12 plugin is also shipped in the MinGW packages now.

    -   Rust support has been enabled on MinGW 64-bit. Rust support cannot work on 32-bit MinGW due to differences in exception
        handling between our 32-bit MinGW toolchain and that used by the Rust project

-   The asio plugin is shipped now, since it no longer has a build-time dependency on the ASIO SDK.

-   The new plugin webview2 is shipped with MSVC. It requires the relevant component shipped with Windows.

#### Linux

-   Preliminary support for Alma Linux has been added.

-   RHEL distro support has been improved.

-   Cerbero CI now tests the build on Ubuntu 24.04 LTS.

-   curl is used for downloading sources on Fedora instead of wget, since they have moved to wget2 despite show-stopper
    regressions such as returning a success error code on download failure.

#### Android

-   CMake inside Gradle is now the recommended way to consume GStreamer when building Android apps

    -   FindGStreamerMobile.cmake is the recommended way to consume GStreamer now

    -   1.26 will support both CMake and Make inside Gradle, but the Make support will likely be removed in 1.28

    -   Documentation updates are still a work-in-progress, help is appreciated

-   Android tutorials and examples are now built with gradle + cmake instead of gradle + make on the CI

## Documentation improvements

-   Tracer objects information is now included in the documentation

## Possibly Breaking Changes

-   qroverlay: the "pixel-size" property has been removed in favour of a new "size" property with slightly different semantics,
    where the size of the square is expressed in percent of the smallest of width and height.

-   svtav1enc: The SVT-AV1 3.0.0 API exposes a different mechanism to configure the level of parallelism when encoding, which
    has been exposed as a new "level-of-parallelism" property. The old "logical-processors" property is no longer functional if
    the plugin has been compiled against the new API, which might affect encoder performance if application code setting it is
    not updated.

-   udpsrc: now disables allocated port reuse for unicast to avoid unexpected side-effects of SO_REUSEADDR where the kernel
    allocates the same listening port for multiple udpsrc.

-   uridecodebin3 remove non-functional "source" property that doesn’t make sense and always returned NULL anyway.

## Known Issues

-   GstBuffer now uses C11 atomics for 64 bit atomic operations if available, which may require linking to libatomic on some
    systems, but this is not done automatically yet, see issue #4177.

## Statistics

-   4496 commits

-   2203 Merge requests merged

-   794 Issues closed

-   215+ Contributors

-   ~33% of all commits and Merge Requests were in Rust modules/code

-   4950 files changed

-   515252 lines added

-   201503 lines deleted

-   313749 lines added (net)

Contributors

Aaron Boxer, Adrian Perez de Castro, Adrien De Coninck, Alan Coopersmith, Albert Sjolund, Alexander Slobodeniuk, Alex Ashley,
Alicia Boya García, Andoni Morales Alastruey, Andreas Wittmann, Andrew Yooeun Chun, Angelo Verlain, Aniket Hande, Antonio
Larrosa, Antonio Morales, Armin Begovic, Arnaud Vrac, Artem Martus, Arun Raghavan, Benjamin Gaignard, Benjamin Gräf, Bill
Nottingham, Brad Hards, Brad Reitmeyer, Branko Subasic, Carlo Caione, Carlos Bentzen, Carlos Falgueras García, cdelguercio, Chao
Guo, Cheah, Cheung Yik Pang, chitao1234, Chris Bainbridge, Chris Spencer, Chris Spoelstra, Christian Meissl, Christopher Degawa,
Chun-wei Fan, Colin Kinloch, Corentin Damman, Daniel Morin, Daniel Pendse, Daniel Stone, Dan Yeaw, Dave Lucia, David Rosca, Dean
Zhang (张安迪), Denis Yuji Shimizu, Detlev Casanova, Devon Sookhoo, Diego Nieto, Dongyun Seo, dukesook, Edward Hervey, eipachte,
Eli Mallon, Elizabeth Figura, Elliot Chen, Emil Ljungdahl, Emil Pettersson, eri, F. Duncanh, Fotis Xenakis, Francisco Javier
Velázquez-García, Francis Quiers, François Laignel, George Hazan, Glyn Davies, Guillaume Desmottes, Guillermo E. Martinez,
Haihua Hu, Håvard Graff, He Junyan, Hosang Lee, Hou Qi, Hugues Fruchet, Hyunwoo, iodar, jadarve, Jakub Adam, Jakub Vaněk, James
Cowgill, James Oliver, Jan Alexander Steffens (heftig), Jan Schmidt, Jeffery Wilson, Jendrik Weise, Jerome Colle, Jesper Jensen,
Jimmy Ohn, Jochen Henneberg, Johan Sternerup, Jonas K Danielsson, Jonas Rebmann, Jordan Petridis, Jordan Petridіs, Jordan
Yelloz, Jorge Zapata, Joshua Breeden, Julian Bouzas, Jurijs Satcs, Kévin Commaille, Kevin Wang, Khem Raj, kingosticks, Leonardo
Salvatore, L. E. Segovia, Liam, Lim, Loïc Le Page, Loïc Yhuel, Lyra McMillan, Maksym Khomenko, Marc-André Lureau, Marek Olejnik,
Marek Vasut, Marianna Smidth Buschle, Marijn Suijten, Mark-André Schadow, Mark Nauwelaerts, Markus Ebner, Martin Nordholts, Mart
Raudsepp, Mathieu Duponchelle, Matthew Waters, Maxim P. DEMENTYEV, Max Romanov, Mengkejiergeli Ba, Michael Grzeschik, Michael
Olbrich, Michael Scherle, Michael Tretter, Michiel Westerbeek, Mikhail Rudenko, Nacho Garcia, Nick Steel, Nicolas Dufresne,
Niklas Jang, Nirbheek Chauhan, Ognyan Tonchev, Olivier Crête, Oskar Fiedot, Pablo García, Pablo Sun, Patricia Muscalu, Paweł
Kotiuk, Peter Kjellerstedt, Peter Stensson, pgarciasancho, Philippe Normand, Philipp Zabel, Piotr Brzeziński, Qian Hu (胡骞),
Rafael Caricio, Randy Li (ayaka), Rares Branici, Ray Tiley, Robert Ayrapetyan, Robert Guziolowski, Robert Mader, Roberto Viola,
Robert Rosengren, RSWilli,Ruben González, Ruijing Dong, Sachin Gadag, Sam James, Samuel Thibault, Sanchayan Maity, Scott Moreau,
Sebastian Dröge, Sebastian Gross, Sebastien Cote, Sergey Krivohatskiy, Sergey Radionov, Seungha Yang, Seungmin Kim, Shengqi Yu,
Sid Sethupathi, Silvio Lazzeretti, Simonas Kazlauskas, Stefan Riedmüller, Stéphane Cerveau, Tamas Levai, Taruntej Kanakamalla,
Théo Maillart, Thibault Saunier, Thomas Goodwin, Thomas Klausner, Tihran Katolikian, Tim Blechmann, Tim-Philipp Müller, Tjitte
de Wert, Tomas Granath, Tomáš Polomský, tomaszmi, Tom Schuring, U. Artie Eoff, valadaptive, Víctor Manuel Jáquez Leal, Vivia
Nikolaidou, W. Bartel, Weijian Pan, William Wedler, Will Miller, Wim Taymans, Wojciech Kapsa, Xavier Claessens, Xi Ruoyao,
Xizhen, Yaakov Selkowitz, Yacine Bandou, Zach van Rijn, Zeno Endemann, Zhao, Zhong Hongcheng,

… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!

Stable 1.26 branch

After the 1.26.0 release there will be several 1.26.x bug-fix releases which will contain bug fixes which have been deemed
suitable for a stable branch, but no new features or intrusive changes will be added to a bug-fix release usually. The 1.26.x
bug-fix releases will be made from the git 1.26 branch, which is a stable release series branch.

1.26.1

The first 1.26 bug-fix release (1.26.1) was released on 24 April 2025.

This release only contains bugfixes and security fixes and it should be safe to update from 1.26.0.

Highlighted bugfixes in 1.26.1

-   awstranslate and speechmatics plugin improvements
-   decodebin3 fixes and urisourcebin/playbin3 stability improvements
-   Closed captions: CEA-708 generation and muxing fixes, and H.264/H.265 caption extractor fixes
-   dav1d AV1 decoder: RGB support, plus colorimetry, renegotiation and buffer pool handling fixes
-   Fix regression when rendering VP9 with alpha
-   H.265 decoder base class and caption inserter SPS/PPS handling fixes
-   hlssink3 and hlsmultivariantsink feature enhancements
-   Matroska v4 support in muxer, seeking fixes in demuxer
-   macOS: framerate guessing for cameras or capture devices where the OS reports silly framerates
-   MP4 demuxer uncompressed video handling improvements and sample table handling fixes
-   oggdemux: seeking improvements in streaming mode
-   unixfdsrc: fix gst_memory_resize warnings
-   Plugin loader fixes, especially for Windows
-   QML6 GL source renegotiation fixes
-   RTP and RTSP stability fixes
-   Thread-safety improvements for the Media Source Extension (MSE) library
-   v4l2videodec: fix A/V sync issues after decoding errors
-   Various improvements and fixes for the fragmented and non-fragmented MP4 muxers
-   Video encoder base class segment and buffer timestamp handling fixes
-   Video time code support for 119.88 fps and drop-frames-related conversion fixes
-   WebRTC: Retransmission entry creation fixes and better audio level header extension compatibility
-   YUV4MPEG encoder improvments
-   dots-viewer: make work locally without network access
-   gst-python: fix compatibility with PyGObject >= 3.52.0
-   Cerbero: recipe updates, compatibility fixes for Python < 3.10; Windows Android cross-build improvements
-   Various bug fixes, build fixes, memory leak fixes, and other stability and reliability improvements

gstreamer

-   Correctly handle whitespace paths when executing gst-plugin-scanner
-   Ensure properties are freed before (re)setting with g_value_dup_string() and during cleanup
-   cmake: Fix PKG_CONFIG_PATH formatting for Windows cross-builds
-   macos: Move macos function documentation to the .h so the introspection has the information
-   meson.build: test for and link against libatomic if it exists
-   pluginloader-win32: Fix helper executable path under devenv
-   pluginloader: fix pending_plugins Glist use-after-free issue
-   unixfdsrc: Complains about resize of memory area
-   tracers: dots: fix debug log

gst-plugins-base

-   Ensure properties are freed before (re)setting with g_value_dup_string() and during cleanup
-   alsadeviceprovider: Fix leak of Alsa longname
-   audioaggregator: fix error added in !8416 when chaining up
-   audiobasesink: Fix custom slaving driftsamples calculation and add custom audio clock slaving callback example
-   decodebin3: Don’t avoid parsebin even if we have a matching decoder
-   decodebin3: Doesn’t plug parsebin for AAC from tsdemux
-   gl: eglimage: warn the reason of export failure
-   glcolorconvert: fix YUVA<->RGBA conversions
-   glcolorconvert: regression when rendering alpha vp9
-   gldownload: Unref glcontext after usage
-   meson.build: test for and link against libatomic if it exists
-   oggdemux: Don’t push new packets if there is a pending seek
-   urisourcebin: Make parsebin activation more reliable
-   urisourcebin: deadlock between parsebin and typefind
-   videoencoder: Use the correct segment and buffer timestamp in the chain function
-   videotimecode: Fix conversion of timecode to datetime with drop-frame timecodes and handle 119.88 fps correctly in all
    places

gst-plugins-good

-   Ensure properties are freed before (re)setting with g_value_dup_string() and during cleanup
-   gst-plugins-good: Matroska mux v4 support
-   matroska-demux: Prevent corrupt cluster duplication
-   qml6glsrc: update buffer pool on renegotiation
-   qt6: Add a missing newline in unsupported platform message
-   qtdemux: Fix stsc size check in qtdemux_merge_sample_table()
-   qtdemux: Next Iteration Of Uncompressed MP4 Decoder
-   qtdemux: unref simple caps after use
-   rtspsrc: Do not emit signal ‘no-more-pads’ too early
-   rtspsrc: Don’t error out on not-linked too early
-   rtpsession: Do not push events while holding SESSION_LOCK
-   rtpsession: deadlock when gst_rtp_session_send_rtcp () is forwarding eos
-   v4l2: drop frame for frames that cannot be decoded
-   v4l2videodec: AV unsync for streams with many frames that cannot be decoded
-   v4l2object: fix memory leak
-   v4l2object: fix type mismatch when ioctl takes int
-   y4menc: fix Y41B format
-   y4menc: handle frames with GstVideoMeta

gst-plugins-bad

-   Add missing Requires in pkg-config
-   Ensure properties are freed before (re)setting with g_value_dup_string() and during cleanup
-   Update docs
-   aja: Use the correct location of the AJA NTV2 SDK in the docs
-   alphacombine: De-couple flush-start/stop events handling
-   alphadecodebin: use a multiqueue instead of a couple of queues
-   avfvideosrc: Guess reasonable framerate values for some 3rd party devices
-   codecalpha: name both queues
-   d3d12converter: Fix cropping when automatic mipmap is enabled
-   dashsink: Make sure to use a non-NULL pad name when requesting a pad from splitmuxsink
-   docs: Fix GstWebRTCICE* class documentation
-   h264ccextractor, h265ccextractor: Handle gap with unknown pts
-   h265decoder, h265ccinserter: Fix broken SPS/PPS link
-   h265parser: Fix num_long_term_pics bound check
-   Segmentation fault in H265 decoder
-   h266decoder: fix leak parsing SEI messages
-   meson.build: test for and link against libatomic if it exists
-   mse: Improved Thread Safety of API
-   mse: Revert ownership transfer API change in gst_source_buffer_append_buffer()
-   tensordecoders: updating element classification
-   unixfd: Fix wrong memory size when offset > 0
-   uvcsink: Respond to control requests with proper error handling
-   v4l2codecs: unref frame in all error paths of end_picture
-   va: Skip codecs that report maximum width or height lower than minimum
-   vapostproc: fix wrong video orientation after restarting the element
-   vavp9enc: fix mem leaks in _vp9_decide_profile
-   vkformat: fix build error
-   vtenc: Avoid deadlocking when changing properties on the fly
-   vulkan: fix memory leak at dynamic registering
-   webrtc: enhance rtx entry creation
-   webrtcbin: add missing warning for caps missmatch
-   ZDI-CAN-26596: New Vulnerability Report (Security)

gst-plugins-ugly

-   No changes

GStreamer Rust plugins

-   Bump MSRV to 1.83
-   Allow any windows-sys version >= 0.52 and <= 0.59
-   aws/polly: add GstScaletempoTargetDurationMeta to output buffers
-   awstranslate: improve message posted on bus
-   cdg: typefind: Division by zero fix
-   cea708mux: Improve support for overflowing input captions
-   colordetect: Change to videofilter base class
-   dav1ddec: Drain decoder on caps changes if necessary
-   dav1ddec: Only update unknown parts of the upstream colorimetry and not all of it
-   dav1ddec: Support RGB encoded AV1
-   dav1ddec: Use downstream buffer pool for copying if video meta is not supported
-   dav1ddec: Use max-frame-delay value from the decoder instead of calculating it
-   dav1ddec: Use max-frame-delay value from the decoder instead of calculating it
-   doc: Update to latest way of generating hotdoc config files
-   Fix gtk4 compile
-   Fix various clippy 1.86 warnings and update gstreamer-rs / gtk-rs dependencies
-   fmp4mux: Add a couple of minor new features
-   fmp4mux: Add manual-split mode that is triggered by serialized downstream events
-   fmp4mux: Add send-force-keyunit property
-   fmp4mux: Fix latency configuration for properties set during construction
-   fmp4mux: Improve split-at-running-time handling
-   fmp4mux/mp4mux: Handle the case of multiple tags per taglist correctly
-   fmp4mux: Write a v0 tfdt box if the decode time is small enough
-   gstwebrtc-api: Add TypeScript type definitions, build ESM for broader compatibility, improve JSDocs
-   hlsmultivariantsink: Allow users to specify playlist and segment location
-   hlssink3 - Add Support for NTP timestamp from buffer
-   livesync: Notify in/out/drop/duplicate properties on change
-   livesync: Only notify drop/duplicate properties
-   meson: Require gst 1.18 features for dav1d
-   mp4mux: Don’t write composition time offsets if they’re all zero
-   mp4mux, fmp4mux: Use correct timescales for edit lists
-   mpegtslivesrc: increase threshold for PCR <-> PTS DISCONT
-   mpegtslivesrc: Use a separate mutex for the properties
-   mux: use smaller number of samples for testing
-   net/aws: punctuation-related improvements to our span_tokenize_items function
-   pcap_writer: Mark target-factory and pad-path props as construct-only
-   speechmatics: Handle multiple stream-start event
-   tracers: buffer-lateness: don’t panic on add overflow + reduce graph legend entry font size a bit
-   tracers: Update to etherparse 0.17
-   transcriberbin: make auto passthrough work when transcriber is a bin
-   ts-jitterbuffer: improve scheduling of lost events
-   tttocea708: fix origin-row handling for roll-up in CEA-708
-   Update Cargo.lock to remove old windows-targets 0.48.5
-   Update dependencies
-   Update gtk-rs / gstreamer-rs dependencies and update for API changes
-   Update to bitstream-io 3
-   uriplaylistbin: skip cache test when offline
-   webrtc: Port to reqwest 0.12
-   webrtcsink: Fix compatibility with audio level header extension

gst-libav

-   No changes

gst-rtsp-server

-   Ensure properties are freed before (re)setting with g_value_dup_string() and during cleanup

gstreamer-vaapi

-   No changes

gstreamer-sharp

-   No changes

gst-python

-   gst-python: fix compatibility with PyGObject >= 3.52.0
-   gst-python: Segmentation Fault since PyGObject >= 3.52.0 due to missing _introspection_module attribute

gst-editing-services

-   Ensure properties are freed before (re)setting with g_value_dup_string() and during cleanup

gst-devtools, gst-validate + gst-integration-testsuites

-   Add missing Requires in pkg-config
-   devtools: dots-viewer: Bundle js dependencies using webpack
-   devtools: dots-viewer: Update dependencies and make windows dependencies conditional

gst-examples

-   examples: Update Rust dependencies
-   examples: webrtc: rust: Move from async-std to tokio

gstreamer-docs

-   Update docs

Development build environment

-   No changes

Cerbero build tool and packaging changes in 1.26.1

-   FindGStreamerMobile: Override pkg-config on Windows -> Android cross builds
-   Fix BuildTools not using recipes_remotes and recipes_commits
-   bootstrap, meson: Use pathlib.Path.glob to allow Python < 3.10
-   Use of ‘glob(…, root_dir)’ requires Python >=3.10, cerbero enforces >= 3.7
-   harfbuzz: update to 10.4.0
-   Update fontconfig to 2.16.1, pango to 1.56.2

Contributors to 1.26.1

Alexander Slobodeniuk, Alyssa Ross, Artem Martus, Arun Raghavan, Brad Hards, Carlos Bentzen, Carlos Rafael Giani, Daniel Morin,
David Smitmanis, Detlev Casanova, Dongyun Seo, Doug Nazar, dukesook, Edward Hervey, eipachte, Eli Mallon, François Laignel,
Guillaume Desmottes, Gustav Fahlen, Hou Qi, Jakub Adam, Jan Schmidt, Jan Tojnar, Jordan Petridis, Jordan Yelloz, L. E. Segovia,
Marc Leeman, Marek Olejnik, Mathieu Duponchelle, Matteo Bruni, Matthew Waters, Michael Grzeschik, Nirbheek Chauhan, Ognyan
Tonchev, Olivier Blin, Olivier Crête, Philippe Normand, Piotr Brzeziński, Razvan Grigore, Robert Mader, Sanchayan Maity,
Sebastian Dröge, Seungha Yang, Shengqi Yu (喻盛琪), Stefan Andersson, Stéphane Cerveau, Thibault Saunier, Tim-Philipp Müller,
tomaszmi, Víctor Manuel Jáquez Leal, Xavier Claessens,

… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!

List of merge requests and issues fixed in 1.26.1

-   List of Merge Requests applied in 1.26.1
-   List of Issues fixed in 1.26.1

1.26.2

The second 1.26 bug-fix release (1.26.2) was released on 29 May 2025.

This release only contains bugfixes as well as a number of security fixes and important playback fixes, and it should be safe to
update from 1.26.0.

Highlighted bugfixes in 1.26.2

-   Various security fixes and playback fixes
-   aggregator base class fixes to not produce buffers too early in live mode
-   AWS translate element improvements
-   D3D12 video decoder workarounds for crashes on NVIDIA cards on resolution changes
-   dav1d AV1-decoder performance improvements
-   fmp4mux: tfdt and composition time offset fixes, plus AC-3 / EAC-3 audio support
-   GStreamer editing services fixes for sources with non-1:1 aspect ratios
-   MIDI parser improvements for tempo changes
-   MP4 demuxer atom parsing improvements and security fixes
-   New skia-based video compositor element
-   Subtitle parser security fixes
-   Subtitle rendering and seeking fixes
-   Playbin3 and uridecodebin3 stability fixes
-   GstPlay stream selection improvements
-   WAV playback regression fix
-   GTK4 paintable sink colorimetry support and other improvements
-   WebRTC: allow webrtcsrc to wait for a webrtcsink producer to initiate the connection
-   WebRTC: new Janus Video Room WebRTC source element
-   vah264enc profile decision making logic fixes
-   Python bindings gained support for handling mini object writability (buffers, caps, etc.)
-   Various bug fixes, build fixes, memory leak fixes, and other stability and reliability improvements

gstreamer

-   aggregator: Various state related fixes
-   element: ref-sink the correct pad template when replacing an existing one
-   pipeline: Store the actual latency even if no static latency was configured
-   structure: Add gst_structure_is_writable() API to allow python bindings to be able to handle writability of MiniObjects
-   tracerutils: Do not warn on empty string as tracername
-   tracerutils: Fix leak in gst_tracer_utils_create_tracer()
-   Ensure properties are freed before (re)setting with g_value_dup_object() or g_value_dup_boxed() and during cleanup
-   Fix new warnings on Fedora 42, various meson warnings, and other small meson build/wrap fixes

gst-plugins-base

-   alsa: Avoid infinite loop in DSD rate detection
-   gl: Implement basetransform meta transform function
-   glshader: free shader on stop
-   glupload: Only add texture-target field to GL caps
-   gstaudioutilsprivate: Fix gcc 15 compiler error with function pointer
-   mikey: Avoid infinite loop while parsing MIKEY payload with unhandled payload types
-   properties: add G_PARAM_STATIC_STRINGS where missing
-   riff-media: fix MS and DVI ADPCM av_bps calculations
-   subtitleoverlay: Remove 0.10 hardware caps handling
-   subtitleoverlay: Missing support for DMABuf(?)
-   tests: opus: Update channel support and add to meson
-   textoverlay: fix shading for RGBx / RGBA pixel format variants
-   textoverlay background is wrong while cropping
-   uridecodebin3: Don’t hold play items lock while releasing pads
-   uridecodebin3: deadlock on PLAY_ITEMS_LOCK
-   Fix new warnings on Fedora 42, various meson warnings, and other small meson build/wrap fixes
-   Fix Qt detection in various places

gst-plugins-good

-   adaptivedemux2: Fixes for collection handling
-   adaptivedemux2: Fix several races
-   dash: mpdclient: Don’t pass terminating NUL to adapter
-   gl: Implement basetransform meta transform function
-   imagefreeze: Set seqnum from segment too
-   interleave: Don’t hold object lock while querying caps downstream
-   matroskamux: Write stream headers before finishing file, so that a correct file with headers is written if we finish without
    any data
-   meson: Add build_rpath for qt6 plugin on macOS
-   meson: Fix qt detection in various places
-   properties: add G_PARAM_STATIC_STRINGS where missing
-   qtdemux: Check length of JPEG2000 colr box before parsing it
-   qtdemux: Parse chan box and improve raw audio channel layout handling
-   qtdemux: Improve track parsing
-   qtdemux: Use byte reader to parse mvhd box
-   qtdemux: cmpd box is only mandatory for uncompressed video with uncC version 0
-   rtph264pay: Reject stream-format=avc without codec_data
-   rtputils: Add debug category
-   v4l2: pool: Send drop frame signal after dqbuf success
-   v4l2: pool: fix assert when mapping video frame with DMA_DRM caps
-   v4l2videoenc: report error only when buffer pool parameters are invalid
-   wavparse: Ignore EOS when parsing the headers
-   wavparse: Regression leading to unplaybable wav files that were working before
-   Ensure properties are freed before (re)setting with g_value_dup_object() or g_value_dup_boxed() and during cleanup
-   Fix new warnings on Fedora 42, various meson warnings, and other small meson build/wrap fixes
-   Fixes for big endian
-   Switch to GST_AUDIO_NE()
-   Valgrind fixes

gst-plugins-bad

-   alphacombine: Fix seeking after EOS
-   cuda: Fix runtime PTX compile, fix example code build with old CUDA SDK
-   curl: Fix build with MSVC
-   curl: small fixups p3
-   d3d12: Fix gstreamer-full subproject build with gcc
-   d3d12: Generate gir file
-   d3d12decoder: Workaround for NVIDIA crash on resolution change
-   d3d12memory: Allow set_fence() only against writable memory
-   d3d12memory: Make D3D12 map flags inspectable
-   d3d12screencapturesrc: Fix desktop handle leak
-   dash: mpdclient: Don’t pass terminating NUL to adapter
-   dvbsuboverlay: Actually make use of subtitle running time instead of using PTS
-   dvbsuboverlay: No subtitles after seek
-   h264parse: Never output stream-format=avc/avc3 caps without codec_data
-   lcevc: Use portable printf formatting macros
-   midiparse: Consider tempo changes when calculating duration
-   nvencoder: Fix GstVideoCodecFrame leak on non-flow-ok return
-   play: Improve stream selection
-   properties: add G_PARAM_STATIC_STRINGS where missing
-   rtpsender: fix ‘priority’ GValue get/set
-   va: Fix H264 profile decision logic
-   vulkan/wayland: Init debug category before usage
-   Ensure properties are freed before (re)setting with g_value_dup_object() or g_value_dup_boxed() and during cleanup
-   Fix new warnings on Fedora 42, various meson warnings, and other small meson build/wrap fixes
-   Fixes for big endian
-   Fix Qt detection in various places
-   Switch to GST_AUDIO_NE()
-   Valgrind fixes

gst-plugins-ugly

-   No changes

GStreamer Rust plugins

-   awstranslate: improve control over accumulator behavior
-   awstranslate: output buffer lists
-   cea608tott: make test text less shocking by having more cues as context
-   dav1ddec: Directly decode into downstream allocated buffers if possible
-   deny: Allow webpki-root-certs license
-   fmp4mux: Add support for AC-3 / EAC-3
-   fmp4mux: Use earliest PTS for the base media decode time (tfdt)
-   fmp4mux: Fix handling of negative DTS in composition time offset
-   fmp4mux: Write lmsg as compatible brand into the last fragment
-   mp4mux: add extra brands
-   mp4: avoid dumping test output into build directory
-   mp4: migrate to mp4-atom to check muxing
-   mp4: test the trak structure
-   gtk4: Update and adapt to texture builder API changes
-   gtk4: Initial colorimetry support
-   gtk4: Update default GTK4 target version to 4.10
-   rtp: Update to bitstream-io 4.0
-   skia: Implement a video compositor using skia
-   webrtc: addressing a few deadlocks
-   webrtc: Support for producer sessions targeted at a given consumer
-   webrtc: add new JanusVR source element
-   webrtc: janus: clean up and refactoring
-   webrtcsink: Use seq number instead of Uuid for discovery
-   webrtc: Make older peers less likely to crash when webrtcsrc is used
-   Fix or silence various new clippy warnings
-   Update Cargo.lock to fix duplicated target-lexicon

gst-libav

-   Valgrind fixes
-   libav: Only allocate extradata while decoding

gst-rtsp-server

-   properties: add G_PARAM_STATIC_STRINGS where missing
-   properties: ensure properties are freed before (re)setting with g_value_dup_object() or g_value_dup_boxed() and during
    cleanup
-   tests: Valgrind fixes

gstreamer-vaapi

-   Ensure properties are freed before (re)setting with g_value_dup_object() or g_value_dup_boxed() and during cleanup

gstreamer-sharp

-   No changes

gst-python

This release includes important fixes for the GStreamer Python bindings.

Since pygobject 3.13 around 10 years ago, it wasn’t possible anymore to modify GStreamer miniobjects, e.g. modify caps or set
buffer timestamps, as an implicit copy of the original would always be made. This should finally work again now.

-   Fix new warnings on Fedora 42, various meson warnings, and other small meson build/wrap fixes
-   python: Add overrides to be able to handle writability of MiniObjects
-   python: Convert buffer metadata API to use @property decorators
-   REGRESSION: pygobject 3.13 now copies the GstStructure when getting them from a GstCaps, making it impossible to properly
    modify structures from caps in place

gst-editing-services

-   Fix frame position for sources with par < 1
-   Fix video position for sources with pixel-aspect-ratio > 1
-   Valgrind fixes
-   properties: add G_PARAM_STATIC_STRINGS where missing
-   Switch to GST_AUDIO_NE() to make things work properly on Big Endian systems

gst-devtools, gst-validate + gst-integration-testsuites

-   Fix new warnings on Fedora 42, various meson warnings, and other small meson build/wrap fixes
-   validate: baseclasses: Reset Test timeouts between iterations
-   validate: scenario: Fix race condition when ignoring EOS

gst-examples

-   Fix new warnings on Fedora 42, various meson warnings, and other small meson build/wrap fixes
-   webrtc examples: Fix running against self-signed certs
-   webrtc/signalling: fix compatibility with python 3.13

gstreamer-docs

-   No changes

Development build environment

-   Various wrap updates
-   Add qt-method meson options to fix Qt detection in various places
-   pre-commit: Workaround broken shebang on Windows

Cerbero build tool and packaging changes in 1.26.2

-   directx-headers: Fix g-ir-scanner expecting MSVC naming convention for gst-plugins-bad introspection
-   m4: update recipe to fix hang in configure
-   pango: Fix introspection missing since 1.56.2 update

Contributors to 1.26.2

Adrian Perez de Castro, Alexander Slobodeniuk, Alicia Boya García, Andoni Morales Alastruey, Biswapriyo Nath, Brad Hards, Branko
Subasic, Christoph Reiter, Daniel Morin, Doug Nazar, Devon Sookhoo, Eva Pace, Guillaume Desmottes, Hou Qi, Jakub Adam, Jan
Schmidt, Jochen Henneberg, Jordan Petridis, L. E. Segovia, Mathieu Duponchelle, Matthew Waters, Nicolas Dufresne, Nirbheek
Chauhan, Olivier Crête, Pablo García, Piotr Brzeziński, Robert Mader, Sebastian Dröge, Seungha Yang, Thibault Saunier,
Tim-Philipp Müller, Vasiliy Doylov, Wim Taymans, Xavier Claessens, Zhao, Gang,

… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!

List of merge requests and issues fixed in 1.26.2

-   List of Merge Requests applied in 1.26.2
-   List of Issues fixed in 1.26.2

Schedule for 1.28

Our next major feature release will be 1.28, and 1.27 will be the unstable development version leading up to the stable 1.28
release. The development of 1.27/1.28 will happen in the git main branch of the GStreamer mono repository.

The schedule for 1.28 is yet to be decided.

1.28 will be backwards-compatible to the stable 1.26, 1.24, 1.22, 1.20, 1.18, 1.16, 1.14, 1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0
release series.

--------------------------------------------------------------------------------------------------------------------------------

These release notes have been prepared by Tim-Philipp Müller with contributions from Arun Raghavan, Daniel Morin, Nirbheek
Chauhan, Olivier Crête, Philippe Normand, Sebastian Dröge, Seungha Yang, Thibault Saunier, and Víctor Manuel Jáquez Leal.

License: CC BY-SA 4.0