deps/patches/2.17/
==================

Rebased patch series for pjsip 2.17.  Selected at build time:

    ./get_dependencies.sh --version 2.17

The default (no --version flag) is 2.12 and applies the series at
deps/patches/[0-9][0-9]_*.patch.  The 2.17 path uses this folder.

See PJSIP_217_MIGRATION.md at the repository root for design notes.

Numbering convention
--------------------
Same NN_ prefixes as the 2.12 series so each patch is recognisable
across versions.  A patch dropped from the 2.17 path simply doesn't
exist here; do not renumber.  New 2.17-only patches use NN >= 40 to
avoid colliding with the 2.12 series.


Current status (June 2026)
==========================

Present in this folder
----------------------

Foundation / build:
  02_zsrtp_link.patch                  2.17-only - tweak ZSRTP linker flags
                                       so the GnuTLS / OpenSSL split in
                                       2.17 doesn't dead-strip cryptopp.

Core SIP / dialog / signalling:
  03_pjsip_signaling.patch             ported - INVITE / dialog rework
                                       around 2.14 + RFC 6026 timing.
  04_pjnath_ice_strans.patch           ported - early-candidate wiring,
                                       offset-tracker hunk split fix.
  11_transport_ice.patch               ported - drops on_ice_complete2
                                       (upstream); pjmedia_ice_cb hunk
                                       verified.
  27_pjmedia_rebind_remote_peer.patch  ported - depends on 20.
  28_pjsip_tls_route_sni_selector.patch
                                       ported - was renamed from
                                       28_pjsip_tls_lis_create_*; same
                                       feature, simplified hook point.
  30_conf_port_grp_lock_uaf.patch      ported - 2.17-only re-derivation
                                       of the conference-port UAF fix.
  31_stream_transport_grp_lock_uaf.patch
                                       ported - 2.17-only re-derivation
                                       of the stream-transport UAF fix.

Media / SDP / codecs:
  07_codecs.patch                      ported - opus mono advertisement,
                                       x264 preset/tune retune for lower
                                       latency, and PROFILE_H264_HIGH
                                       support in the SDP fmtp switch.
                                       (Only AVCODEC_HAS_ENCODE and
                                       avcodec_get_frame_defaults hunks
                                       stay out - both subsumed by
                                       2.17's FFmpeg 5+ migration.)
  08_media_core.patch                  ported - vid_tee mutex wrap, RTCP
                                       PLI, mixer_port, KEYFRAME_REQUESTED
                                       event, real EC reset, TIAS disable,
                                       MIXER signature.  Skipped:
                                       converter.c debug logging.
  15_vpx.patch                         ported - verified, no-op guard,
                                       preserves 2.12 behaviour.
  20_sylk_aead_transport.patch         ported - Makefile hunk re-targeted
                                       against vanilla 2.17.
  24_video_sdp_rtcp_fb.patch           ported - 4-space indent, clean.
  22_srtp_transport_get_info_uaf.patch ported - 2.17 already NULLs the
                                       libsrtp ctx pointers; this port
                                       adds the SSRC-zero on stop and
                                       the session_inited guards in
                                       get_info as defense-in-depth.
  25_libswscale_converter_uaf.patch    ported - clean 4-space.

Devices:
  05_audio_device.patch                ported - the ~1100 line audio
                                       device patch rebased after the 2.13
                                       whitespace sweep.
  06_video_device.patch                ported - includes the real
                                       pjmedia_vid_dev_fb_set_callback
                                       and fb_dev.c.  Was a heavy lift
                                       (~1800 lines) because the 2.15
                                       Metal renderer landed upstream.
  16_mac_audio_vpio_disable.patch      ported - disables AVAudioEngine
                                       Voice-Processing IO on macOS
                                       capture devices (renamed from
                                       16_mac_audio_device_fix; functionally
                                       the same fix as 2.12).
  21_alsa_dev_pjsip217_log.patch       ported - was deferred until 05
                                       renamed alsa_name field.

ZRTP (copy-as-is from 2.12 - the ZRTPCPP source is version-independent):
  13_zsrtp.patch                       copy-as-is - ZRTPCPP wrapper.
  18_fix_uint_zrtp.patch               copy-as-is - ZRTPCPP source,
                                       pinned commit.
  19_fix_zrtp_cstdint_include.patch    copy-as-is - ZRTPCPP source.
  29_zsrtp_hmac_ctx_lifetime.patch     copy-as-is - OpenSSL 3 HMAC_CTX
                                       lifetime fix + -DZRTP_OPENSSL on
                                       the Makefile.  Source files
                                       byte-identical to 2.12 so the
                                       same patch applies; Makefile
                                       lands with line offset from 13.

ZRTP / SRTP (2.17 needed surgery):
  12_transport_zrtp.patch              ported - the ~2100 line transport
                                       glue, intertwined with 2.17's
                                       SRTP / ZRTP changes.
  12a_zrtp_pjmedia_h_makefile.patch    ported - companion to 12, exposes
                                       transport_zrtp.h via pjmedia.h
                                       and adds the .o to the Makefile.
                                       (.obsolete sibling is dead weight
                                       and can be deleted.)

VP9 / VPX (4 patches working together):
  23_vpx_packetizer_libwebrtc_interop.patch
                                       PARKED no-op - vanilla 2.17's
                                       1-byte VP9 descriptor (B / E only)
                                       is what libwebrtc actually wants.
                                       Adding RFC-9628 fields broke Sylk
                                       Mobile decode.  Kept as a slot
                                       holder + rationale log.
  44_vpx_encoder_rate_control.patch    2.17-only - 1.5 Mbps target, VBR,
                                       dropframe_thresh=0.  Without this
                                       the encoder produced ~0.8 fps to
                                       Sylk Mobile.
  45_vpx_encoder_quality_preset.patch  2.17-only - cpu_used 9->4,
                                       rc_max_quantizer 56->48.  Removes
                                       the pixelated / blocky picture
                                       once 44 fixed framerate.

New 2.17-only support:
  40_videodev_extra_objs.patch         Makefile add-ons for the AVF /
                                       fb_dev objects landed by patch 06.
  42_pjmedia_argb_format.patch         Adds PJMEDIA_FORMAT_ARGB to the
                                       format registry + libyuv I420
                                       conversion path used by the
                                       FrameBufferVideoRenderer.


Dropped permanently
-------------------
  10_ffmpeg_util.patch                 FFmpeg 5+ migration is upstreamed.
  17_fix_ffmpeg.patch                  Same.
  30_diag_log_stream_info_from_sdp     Diagnostic-only ("do NOT ship").
  pending/02_pjlib_darwin.patch        GCD semaphores are upstream now.
  31_zrtp_detach_race_null_deref.old   Was .old in 2.12 too.


Still TODO
----------

Tier 4 (medium risk):
  32_zrtp_cb_lock_sync.patch           ZRTP callback lock sync.  Not yet
                                       evaluated against 2.17.
  33_pjsip_inv_cause_text_bound.patch  pjsip_inv cause-text bound check.
                                       Not yet evaluated.
  pending/14_pjsip_tls_log_fix.patch   TLS cert info logging.  The
                                       update_certs_info(cert_info*)
                                       signature changed in 2.17.

Tier 5+ (heavy):
  01_build_system.patch                Makefile / config_auto rebase
                                       against the 2.17 object list.
                                       The 2.17 build works without it
                                       (individual patches touch their
                                       own Makefile fragments) so this
                                       is cleanup, not a blocker.
  09_aec.patch                         AEC2 / AEC3 are split into
                                       echo_webrtc.c (AEC2) and
                                       echo_webrtc_aec3.c (AEC3) in
                                       2.17.  The 2.12 patch was a
                                       single-file drop; needs splitting.
                                       Audio quality regression vs 2.12
                                       until done.


Cython / sipsimple-side work pending
------------------------------------
Patch 08 added two C symbols that nothing in Python calls yet:

  * pjmedia_rtcp_build_rtcp_pli() - needs a cdef extern in
    _core.pxd plus a wrapper on whatever owns the RTCP session, so
    sipsimple can actually request keyframes from peers when its
    decoder loses sync.

  * pjmedia_snd_port_reset_ec_state() is now real (was a no-op stub)
    but the existing Python wrapper - if any - may still bail early
    because it predates a working impl.


Rebase / verification order
---------------------------
Patches apply in numeric order.  No special sequencing is needed for
the currently-present set; just run:

    ./get_dependencies.sh --version 2.17

and every "Applying patch ..." line should be followed by zero
"FAILED" or "rejects" lines.  Hunks landing with offset / fuzz are
fine; rejections need a manual look.


Notes for future ports
----------------------
gpatch's offset-tracker carries across hunks within a single file
section.  If a hunk further down a patch silently misapplies after
an earlier hunk added a large block, split the second hunk into its
own  --- pjsip_orig/...  / +++ pjsip/...  section so the tracker
resets.  See patch 04 for the pattern.

Blank context lines in a unified diff must start with a single space.
Most editors (including the tooling that generated some of these
patches) strip trailing whitespace, which turns blank context lines
into bare newlines and corrupts the patch.  When in doubt, run:

    awk '/^@@/{h=1;print;next} /^(---|\+\+\+) /{h=0;print;next} \
         h && /^$/{print " ";next} {print}' patch.patch > patch.fixed
