# Summary of S4-260193: WebRTC Injectable Codecs

## Document Overview

This pCR proposes adding detailed technical clauses to 3GPP TR 26.858 regarding support for injectable codecs in libwebrtc. The contribution addresses the need for greater flexibility in codec selection beyond the traditionally fixed set of audio and video codecs supported by libwebrtc.

## Main Technical Contributions

### 5.3.2.4 Injectable Codec Support in libwebrtc

#### 5.3.2.4.1 Introduction

- **Feature Origin**: Injectable codec mechanism introduced in Chromium M63
- **Purpose**: Enables integration of additional or custom audio codecs into WebRTC media pipeline without core source code modification
- **Key Benefit**: Provides flexibility for diverse communication scenarios and evolving service requirements
- **3GPP Relevance**: Identified as suitable mechanism to extend libwebrtc with 3GPP codecs

#### 5.3.2.4.2 Architecture and Principles of Operation

##### High-Level Architecture

- **Implementation Approach**: Utilizes customizable encoder and decoder factory interfaces
- **Key Interfaces**: 
  - `AudioEncoderFactory` class
  - `AudioDecoderFactory` class
- **Integration Point**: Factories supplied to `CreatePeerConnectionFactory()` API during initialization
- **Design Principle**: Decouples codec implementation from core library
- **Media Engine Role**: Utilizes provided factories for codec negotiation, instantiation, and media processing

##### Codec Registration and Negotiation Flow

**Three-Step Workflow**:
1. Implementation or selection of encoder and decoder factories for desired codecs
2. Registration of factories with `PeerConnectionFactory`
3. Negotiation of codec capabilities during session establishment via SDP offer/answer exchange

**Technical Requirements**:
- Factories must support SDP mapping functions (e.g., `SdpToConfig()`)
- Must correctly advertise codec capabilities and parameters
- Runtime codec selection based on negotiated SDP attributes and payload types
- Provides fine-grained control over codec selection and interoperability

#### 5.3.2.4.3 Usage Examples

##### Built-in Codecs

**Basic Approach**: Demonstrates usage of built-in codecs (Opus, G.711) through:
- `CreateBuiltinAudioEncoderFactory()`
- `CreateBuiltinAudioDecoderFactory()`

**Selective Approach**: Shows how to specify codec subset using template-based factory creation:
- `CreateAudioEncoderFactory<AudioEncoderOpus, AudioEncoderPCM>()`
- `CreateAudioDecoderFactory<AudioDecoderOpus, AudioDecoderPCM>()`

##### External (Injectable) Codecs

**Implementation Steps**:
1. Load external codec module via dynamic linking (e.g., `libamr_codec_module.so`)
2. Lookup factory entry points using `dlsym()`
3. Create codec factories from external module
4. Optionally combine with built-in codecs
5. Pass combined factories into `PeerConnectionFactory`

**Key Capability**: Enables runtime integration of external codecs with flexible combination of built-in codecs for advanced interoperability scenarios

#### 5.3.2.4.4 Build and Deployment Options

**Integration Approaches**:
- Built-in only
- External module only
- Hybrid approaches

**Configuration**: Controlled via GN flags and build scripts in libwebrtc's build system, supporting both static and dynamic linking of codec modules

## Proposal

The document proposes adding these clauses to TR 26.858, either as:
- A separate clause, or
- Under existing clause 5.3.2.3 ("Libwebrtc")