Asterisk - The Open Source Telephony Project GIT-master-5782b03
Data Structures | Macros | Functions | Variables
res_format_attr_h264.c File Reference

H.264 Format Attribute Module. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/format.h"
Include dependency graph for res_format_attr_h264.c:

Go to the source code of this file.

Data Structures

struct  h264_attr
 

Macros

#define APPEND_IF_NONZERO(field, str, name)
 
#define APPEND_IF_NOT_H264_UNSET(field, str, name)
 
#define DETERMINE_JOINT(joint, attr1, attr2, field)   (joint->field = (attr1 && attr1->field) ? attr1->field : (attr2 && attr2->field) ? attr2->field : 0)
 
#define H264_ATTR_KEY_UNSET   UINT8_MAX
 Value that indicates an attribute is actually unset. More...
 
#define H264_MAX_SPS_PPS_SIZE   16
 Maximum size for SPS / PPS values in sprop-parameter-sets attribute if you change this value then you must change H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT as well. More...
 
#define H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT   "15"
 This is used when executing sscanf on buffers of H264_MAX_SPS_PPS_SIZE length. It must ALWAYS be a string literal representation of one less than H264_MAX_SPS_PPS_SIZE. More...
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int h264_clone (const struct ast_format *src, struct ast_format *dst)
 
static enum ast_format_cmp_res h264_cmp (const struct ast_format *format1, const struct ast_format *format2)
 
static void h264_destroy (struct ast_format *format)
 
static void h264_generate_sdp_fmtp (const struct ast_format *format, unsigned int payload, struct ast_str **str)
 
static struct ast_formath264_getjoint (const struct ast_format *format1, const struct ast_format *format2)
 
static struct ast_formath264_parse_sdp_fmtp (const struct ast_format *format, const char *attributes)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "H.264 Format Attribute Module" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_format_interface h264_interface
 

Detailed Description

H.264 Format Attribute Module.

Author
Joshua Colp <jcolp@digium.com> 

This is a format attribute module for the H.264 codec.

Definition in file res_format_attr_h264.c.

Macro Definition Documentation

◆ APPEND_IF_NONZERO

#define APPEND_IF_NONZERO (   field,
  str,
  name 
)

Definition at line 246 of file res_format_attr_h264.c.

◆ APPEND_IF_NOT_H264_UNSET

#define APPEND_IF_NOT_H264_UNSET (   field,
  str,
  name 
)

Definition at line 235 of file res_format_attr_h264.c.

◆ DETERMINE_JOINT

#define DETERMINE_JOINT (   joint,
  attr1,
  attr2,
  field 
)    (joint->field = (attr1 && attr1->field) ? attr1->field : (attr2 && attr2->field) ? attr2->field : 0)

Definition at line 114 of file res_format_attr_h264.c.

◆ H264_ATTR_KEY_UNSET

#define H264_ATTR_KEY_UNSET   UINT8_MAX

Value that indicates an attribute is actually unset.

Definition at line 40 of file res_format_attr_h264.c.

◆ H264_MAX_SPS_PPS_SIZE

#define H264_MAX_SPS_PPS_SIZE   16

Maximum size for SPS / PPS values in sprop-parameter-sets attribute if you change this value then you must change H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT as well.

Definition at line 45 of file res_format_attr_h264.c.

◆ H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT

#define H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT   "15"

This is used when executing sscanf on buffers of H264_MAX_SPS_PPS_SIZE length. It must ALWAYS be a string literal representation of one less than H264_MAX_SPS_PPS_SIZE.

Definition at line 49 of file res_format_attr_h264.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 337 of file res_format_attr_h264.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 337 of file res_format_attr_h264.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 337 of file res_format_attr_h264.c.

◆ h264_clone()

static int h264_clone ( const struct ast_format src,
struct ast_format dst 
)
static

Definition at line 83 of file res_format_attr_h264.c.

84{
85 struct h264_attr *original = ast_format_get_attribute_data(src);
86 struct h264_attr *attr = ast_calloc(1, sizeof(*attr));
87
88 if (!attr) {
89 return -1;
90 }
91
92 if (original) {
93 *attr = *original;
94 }
95
97
98 return 0;
99}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
void * ast_format_get_attribute_data(const struct ast_format *format)
Get the attribute data on a format.
Definition: format.c:125
void ast_format_set_attribute_data(struct ast_format *format, void *attribute_data)
Set the attribute data on a format.
Definition: format.c:130

References ast_calloc, ast_format_get_attribute_data(), and ast_format_set_attribute_data().

◆ h264_cmp()

static enum ast_format_cmp_res h264_cmp ( const struct ast_format format1,
const struct ast_format format2 
)
static

Definition at line 101 of file res_format_attr_h264.c.

102{
103 struct h264_attr *attr1 = ast_format_get_attribute_data(format1);
104 struct h264_attr *attr2 = ast_format_get_attribute_data(format2);
105
106 if (!attr1 || !attr1->PROFILE_IDC || !attr2 || !attr2->PROFILE_IDC ||
107 (attr1->PROFILE_IDC == attr2->PROFILE_IDC)) {
109 }
110
112}
@ AST_FORMAT_CMP_EQUAL
Definition: format.h:36
@ AST_FORMAT_CMP_NOT_EQUAL
Definition: format.h:38
unsigned int PROFILE_IDC

References AST_FORMAT_CMP_EQUAL, AST_FORMAT_CMP_NOT_EQUAL, ast_format_get_attribute_data(), and h264_attr::PROFILE_IDC.

◆ h264_destroy()

static void h264_destroy ( struct ast_format format)
static

Definition at line 76 of file res_format_attr_h264.c.

77{
78 struct h264_attr *attr = ast_format_get_attribute_data(format);
79
80 ast_free(attr);
81}
#define ast_free(a)
Definition: astmm.h:180

References ast_format_get_attribute_data(), and ast_free.

◆ h264_generate_sdp_fmtp()

static void h264_generate_sdp_fmtp ( const struct ast_format format,
unsigned int  payload,
struct ast_str **  str 
)
static

Definition at line 257 of file res_format_attr_h264.c.

258{
259 struct h264_attr *attr = ast_format_get_attribute_data(format);
260 int added = 0;
261
262 if (!attr) {
263 return;
264 }
265
266 APPEND_IF_NONZERO(attr->MAX_MBPS, str, "max-mbps");
267 APPEND_IF_NONZERO(attr->MAX_FS, str, "max-fs");
268 APPEND_IF_NONZERO(attr->MAX_CPB, str, "max-cpb");
269 APPEND_IF_NONZERO(attr->MAX_DPB, str, "max-dpb");
270 APPEND_IF_NONZERO(attr->MAX_BR, str, "max-br");
271 APPEND_IF_NONZERO(attr->MAX_SMBPS, str, "max-smbps");
272 APPEND_IF_NONZERO(attr->MAX_FPS, str, "max-fps");
273 APPEND_IF_NONZERO(attr->SPROP_INTERLEAVING_DEPTH, str, "sprop-interleaving-depth");
274 APPEND_IF_NONZERO(attr->SPROP_DEINT_BUF_REQ, str, "sprop-deint-buf-req");
275 APPEND_IF_NONZERO(attr->DEINT_BUF_CAP, str, "deint-buf-cap");
276 APPEND_IF_NONZERO(attr->SPROP_INIT_BUF_TIME, str, "sprop-init-buf-time");
277 APPEND_IF_NONZERO(attr->SPROP_MAX_DON_DIFF, str, "sprop-max-don-diff");
278 APPEND_IF_NONZERO(attr->MAX_RCMD_NALU_SIZE, str, "max-rcmd-nalu-size");
279
280 APPEND_IF_NOT_H264_UNSET(attr->REDUNDANT_PIC_CAP, str, "redundant-pic-cap");
281 APPEND_IF_NOT_H264_UNSET(attr->PARAMETER_ADD, str, "parameter-add");
282 APPEND_IF_NOT_H264_UNSET(attr->PACKETIZATION_MODE, str, "packetization-mode");
283 APPEND_IF_NOT_H264_UNSET(attr->LEVEL_ASYMMETRY_ALLOWED, str, "level-asymmetry-allowed");
284
285 if (attr->PROFILE_IDC && attr->LEVEL) {
286 if (added) {
287 ast_str_append(str, 0, ";");
288 } else if (0 < ast_str_append(str, 0, "a=fmtp:%u ", payload)) {
289 added = 1;
290 }
291 ast_str_append(str, 0, "profile-level-id=%02X%02X%02X", attr->PROFILE_IDC, attr->PROFILE_IOP, attr->LEVEL);
292 }
293
294 if (!ast_strlen_zero(attr->SPS) && !ast_strlen_zero(attr->PPS)) {
295 if (added) {
296 ast_str_append(str, 0, ";");
297 } else if (0 < ast_str_append(str, 0, "a=fmtp:%u ", payload)) {
298 added = 1;
299 }
300 ast_str_append(str, 0, "sprop-parameter-sets=%s,%s", attr->SPS, attr->PPS);
301 }
302
303 if (added) {
304 ast_str_append(str, 0, "\r\n");
305 }
306
307 return;
308}
const char * str
Definition: app_jack.c:147
#define APPEND_IF_NONZERO(field, str, name)
#define APPEND_IF_NOT_H264_UNSET(field, str, name)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1139
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
unsigned int PROFILE_IOP
unsigned int MAX_FS
unsigned int MAX_MBPS
unsigned int MAX_CPB
unsigned int MAX_RCMD_NALU_SIZE
unsigned int SPROP_INTERLEAVING_DEPTH
unsigned int SPROP_DEINT_BUF_REQ
unsigned int LEVEL
unsigned int LEVEL_ASYMMETRY_ALLOWED
unsigned int REDUNDANT_PIC_CAP
unsigned int MAX_DPB
unsigned int MAX_FPS
unsigned int MAX_BR
unsigned int DEINT_BUF_CAP
unsigned int MAX_SMBPS
unsigned int PACKETIZATION_MODE
char SPS[H264_MAX_SPS_PPS_SIZE]
unsigned int PARAMETER_ADD
char PPS[H264_MAX_SPS_PPS_SIZE]
unsigned int SPROP_INIT_BUF_TIME
unsigned int SPROP_MAX_DON_DIFF

References APPEND_IF_NONZERO, APPEND_IF_NOT_H264_UNSET, ast_format_get_attribute_data(), ast_str_append(), ast_strlen_zero(), h264_attr::DEINT_BUF_CAP, h264_attr::LEVEL, h264_attr::LEVEL_ASYMMETRY_ALLOWED, h264_attr::MAX_BR, h264_attr::MAX_CPB, h264_attr::MAX_DPB, h264_attr::MAX_FPS, h264_attr::MAX_FS, h264_attr::MAX_MBPS, h264_attr::MAX_RCMD_NALU_SIZE, h264_attr::MAX_SMBPS, h264_attr::PACKETIZATION_MODE, h264_attr::PARAMETER_ADD, h264_attr::PPS, h264_attr::PROFILE_IDC, h264_attr::PROFILE_IOP, h264_attr::REDUNDANT_PIC_CAP, h264_attr::SPROP_DEINT_BUF_REQ, h264_attr::SPROP_INIT_BUF_TIME, h264_attr::SPROP_INTERLEAVING_DEPTH, h264_attr::SPROP_MAX_DON_DIFF, h264_attr::SPS, and str.

◆ h264_getjoint()

static struct ast_format * h264_getjoint ( const struct ast_format format1,
const struct ast_format format2 
)
static

Definition at line 116 of file res_format_attr_h264.c.

117{
118 struct ast_format *cloned;
119 struct h264_attr *attr, *attr1, *attr2;
120
121 cloned = ast_format_clone(format1);
122 if (!cloned) {
123 return NULL;
124 }
125 attr = ast_format_get_attribute_data(cloned);
126
127 attr1 = ast_format_get_attribute_data(format1);
128 attr2 = ast_format_get_attribute_data(format2);
129
130 DETERMINE_JOINT(attr, attr1, attr2, PROFILE_IDC);
131 DETERMINE_JOINT(attr, attr1, attr2, PROFILE_IOP);
132 DETERMINE_JOINT(attr, attr1, attr2, LEVEL);
133 DETERMINE_JOINT(attr, attr1, attr2, MAX_MBPS);
134 DETERMINE_JOINT(attr, attr1, attr2, MAX_FS);
135 DETERMINE_JOINT(attr, attr1, attr2, MAX_CPB);
136 DETERMINE_JOINT(attr, attr1, attr2, MAX_DPB);
137 DETERMINE_JOINT(attr, attr1, attr2, MAX_BR);
138 DETERMINE_JOINT(attr, attr1, attr2, MAX_SMBPS);
139 DETERMINE_JOINT(attr, attr1, attr2, MAX_FPS);
140 DETERMINE_JOINT(attr, attr1, attr2, REDUNDANT_PIC_CAP);
141 DETERMINE_JOINT(attr, attr1, attr2, PARAMETER_ADD);
142 DETERMINE_JOINT(attr, attr1, attr2, SPROP_INTERLEAVING_DEPTH);
143 DETERMINE_JOINT(attr, attr1, attr2, SPROP_DEINT_BUF_REQ);
144 DETERMINE_JOINT(attr, attr1, attr2, DEINT_BUF_CAP);
145 DETERMINE_JOINT(attr, attr1, attr2, SPROP_INIT_BUF_TIME);
146 DETERMINE_JOINT(attr, attr1, attr2, SPROP_MAX_DON_DIFF);
147 DETERMINE_JOINT(attr, attr1, attr2, MAX_RCMD_NALU_SIZE);
148 DETERMINE_JOINT(attr, attr1, attr2, LEVEL_ASYMMETRY_ALLOWED);
149 DETERMINE_JOINT(attr, attr1, attr2, PACKETIZATION_MODE);
150
151 if (attr1 && !ast_strlen_zero(attr1->SPS)) {
152 ast_copy_string(attr->SPS, attr1->SPS, sizeof(attr->SPS));
153 } else if (attr2 && !ast_strlen_zero(attr2->SPS)) {
154 ast_copy_string(attr->SPS, attr2->SPS, sizeof(attr->SPS));
155 }
156
157 if (attr1 && !ast_strlen_zero(attr1->PPS)) {
158 ast_copy_string(attr->PPS, attr1->PPS, sizeof(attr->PPS));
159 } else if (attr2 && !ast_strlen_zero(attr2->PPS)) {
160 ast_copy_string(attr->PPS, attr2->PPS, sizeof(attr->PPS));
161 }
162
163 return cloned;
164}
struct ast_format * ast_format_clone(const struct ast_format *format)
Clone an existing media format so it can be modified.
Definition: format.c:180
#define DETERMINE_JOINT(joint, attr1, attr2, field)
#define NULL
Definition: resample.c:96
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
Definition of a media format.
Definition: format.c:43

References ast_copy_string(), ast_format_clone(), ast_format_get_attribute_data(), ast_strlen_zero(), h264_attr::DEINT_BUF_CAP, DETERMINE_JOINT, h264_attr::LEVEL, h264_attr::LEVEL_ASYMMETRY_ALLOWED, h264_attr::MAX_BR, h264_attr::MAX_CPB, h264_attr::MAX_DPB, h264_attr::MAX_FPS, h264_attr::MAX_FS, h264_attr::MAX_MBPS, h264_attr::MAX_RCMD_NALU_SIZE, h264_attr::MAX_SMBPS, NULL, h264_attr::PACKETIZATION_MODE, h264_attr::PARAMETER_ADD, h264_attr::PPS, h264_attr::PROFILE_IDC, h264_attr::PROFILE_IOP, h264_attr::REDUNDANT_PIC_CAP, h264_attr::SPROP_DEINT_BUF_REQ, h264_attr::SPROP_INIT_BUF_TIME, h264_attr::SPROP_INTERLEAVING_DEPTH, h264_attr::SPROP_MAX_DON_DIFF, and h264_attr::SPS.

◆ h264_parse_sdp_fmtp()

static struct ast_format * h264_parse_sdp_fmtp ( const struct ast_format format,
const char *  attributes 
)
static

Definition at line 166 of file res_format_attr_h264.c.

167{
168 char *attribs = ast_strdupa(attributes), *attrib;
169 struct ast_format *cloned;
170 struct h264_attr *attr;
171
172 cloned = ast_format_clone(format);
173 if (!cloned) {
174 return NULL;
175 }
176 attr = ast_format_get_attribute_data(cloned);
177
182
183 while ((attrib = strsep(&attribs, ";"))) {
184 unsigned int val;
185 unsigned long int val2;
186
187 attrib = ast_strip(attrib);
188
189 if (sscanf(attrib, "profile-level-id=%lx", &val2) == 1) {
190 attr->PROFILE_IDC = ((val2 >> 16) & 0xFF);
191 attr->PROFILE_IOP = ((val2 >> 8) & 0xFF);
192 attr->LEVEL = (val2 & 0xFF);
193 } else if (sscanf(attrib, "sprop-parameter-sets=%" H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT "[^','],%" H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT "s", attr->SPS, attr->PPS) == 2) {
194 /* XXX sprop-parameter-sets can actually be of unlimited length. This may need to be addressed later. */
195 } else if (sscanf(attrib, "max-mbps=%30u", &val) == 1) {
196 attr->MAX_MBPS = val;
197 } else if (sscanf(attrib, "max-fs=%30u", &val) == 1) {
198 attr->MAX_FS = val;
199 } else if (sscanf(attrib, "max-cpb=%30u", &val) == 1) {
200 attr->MAX_CPB = val;
201 } else if (sscanf(attrib, "max-dpb=%30u", &val) == 1) {
202 attr->MAX_DPB = val;
203 } else if (sscanf(attrib, "max-br=%30u", &val) == 1) {
204 attr->MAX_BR = val;
205 } else if (sscanf(attrib, "max-smbps=%30u", &val) == 1) {
206 attr->MAX_SMBPS = val;
207 } else if (sscanf(attrib, "max-fps=%30u", &val) == 1) {
208 attr->MAX_FPS = val;
209 } else if (sscanf(attrib, "redundant-pic-cap=%30u", &val) == 1) {
210 attr->REDUNDANT_PIC_CAP = val;
211 } else if (sscanf(attrib, "parameter-add=%30u", &val) == 1) {
212 attr->PARAMETER_ADD = val;
213 } else if (sscanf(attrib, "packetization-mode=%30u", &val) == 1) {
214 attr->PACKETIZATION_MODE = val;
215 } else if (sscanf(attrib, "sprop-interleaving-depth=%30u", &val) == 1) {
217 } else if (sscanf(attrib, "sprop-deint-buf-req=%30u", &val) == 1) {
218 attr->SPROP_DEINT_BUF_REQ = val;
219 } else if (sscanf(attrib, "deint-buf-cap=%30u", &val) == 1) {
220 attr->DEINT_BUF_CAP = val;
221 } else if (sscanf(attrib, "sprop-init-buf-time=%30u", &val) == 1) {
222 attr->SPROP_INIT_BUF_TIME = val;
223 } else if (sscanf(attrib, "sprop-max-don-diff=%30u", &val) == 1) {
224 attr->SPROP_MAX_DON_DIFF = val;
225 } else if (sscanf(attrib, "max-rcmd-nalu-size=%30u", &val) == 1) {
226 attr->MAX_RCMD_NALU_SIZE = val;
227 } else if (sscanf(attrib, "level-asymmetry-allowed=%30u", &val) == 1) {
229 }
230 }
231
232 return cloned;
233}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
char * strsep(char **str, const char *delims)
#define H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT
This is used when executing sscanf on buffers of H264_MAX_SPS_PPS_SIZE length. It must ALWAYS be a st...
#define H264_ATTR_KEY_UNSET
Value that indicates an attribute is actually unset.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:223
Definition: ast_expr2.c:325

References ast_format_clone(), ast_format_get_attribute_data(), ast_strdupa, ast_strip(), h264_attr::DEINT_BUF_CAP, H264_ATTR_KEY_UNSET, H264_MAX_SPS_PPS_SIZE_SCAN_LIMIT, h264_attr::LEVEL, h264_attr::LEVEL_ASYMMETRY_ALLOWED, h264_attr::MAX_BR, h264_attr::MAX_CPB, h264_attr::MAX_DPB, h264_attr::MAX_FPS, h264_attr::MAX_FS, h264_attr::MAX_MBPS, h264_attr::MAX_RCMD_NALU_SIZE, h264_attr::MAX_SMBPS, NULL, h264_attr::PACKETIZATION_MODE, h264_attr::PARAMETER_ADD, h264_attr::PPS, h264_attr::PROFILE_IDC, h264_attr::PROFILE_IOP, h264_attr::REDUNDANT_PIC_CAP, h264_attr::SPROP_DEINT_BUF_REQ, h264_attr::SPROP_INIT_BUF_TIME, h264_attr::SPROP_INTERLEAVING_DEPTH, h264_attr::SPROP_MAX_DON_DIFF, h264_attr::SPS, and strsep().

◆ load_module()

static int load_module ( void  )
static

Definition at line 324 of file res_format_attr_h264.c.

325{
328 }
329
331}
#define ast_format_interface_register(codec, interface)
Register a format interface for use with the provided codec.
Definition: format.h:273
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
static struct ast_format_interface h264_interface

References ast_format_interface_register, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, and h264_interface.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 319 of file res_format_attr_h264.c.

320{
321 return 0;
322}

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "H.264 Format Attribute Module" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, }
static

Definition at line 337 of file res_format_attr_h264.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 337 of file res_format_attr_h264.c.

◆ h264_interface

struct ast_format_interface h264_interface
static

Definition at line 310 of file res_format_attr_h264.c.

Referenced by load_module().