#include <switch.h>#include "private/switch_core_pvt.h"Include dependency graph for switch_core_codec.c:
Go to the source code of this file.
| switch_codec_t* switch_core_session_get_effective_read_codec | ( | switch_core_session_t * | session | ) |
Definition at line 301 of file switch_core_codec.c.
00302 { 00303 switch_codec_t *codec; 00304 codec = session->read_codec; 00305 return codec; 00306 }
| switch_codec_t* switch_core_session_get_effective_write_codec | ( | switch_core_session_t * | session | ) |
Definition at line 456 of file switch_core_codec.c.
00457 { 00458 switch_codec_t *codec; 00459 codec = session->write_codec; 00460 00461 return codec; 00462 }
| switch_codec_t* switch_core_session_get_read_codec | ( | switch_core_session_t * | session | ) |
Definition at line 308 of file switch_core_codec.c.
00309 { 00310 switch_codec_t *codec; 00311 codec = session->real_read_codec ? session->real_read_codec : session->read_codec; 00312 return codec; 00313 }
| switch_codec_t* switch_core_session_get_video_read_codec | ( | switch_core_session_t * | session | ) |
Definition at line 514 of file switch_core_codec.c.
00515 { 00516 switch_codec_t *codec; 00517 codec = session->video_read_codec; 00518 00519 return codec; 00520 00521 }
| switch_codec_t* switch_core_session_get_video_write_codec | ( | switch_core_session_t * | session | ) |
Definition at line 559 of file switch_core_codec.c.
00560 { 00561 switch_codec_t *codec; 00562 codec = session->video_write_codec; 00563 00564 return codec; 00565 00566 }
| switch_codec_t* switch_core_session_get_write_codec | ( | switch_core_session_t * | session | ) |
Definition at line 464 of file switch_core_codec.c.
00465 { 00466 switch_codec_t *codec; 00467 codec = session->real_write_codec ? session->real_write_codec : session->write_codec; 00468 00469 return codec; 00470 }
| void switch_core_session_lock_codec_read | ( | switch_core_session_t * | session | ) |
Definition at line 72 of file switch_core_codec.c.
References switch_mutex_lock().
00073 { 00074 switch_mutex_lock(session->codec_read_mutex); 00075 }
| void switch_core_session_lock_codec_write | ( | switch_core_session_t * | session | ) |
Definition at line 62 of file switch_core_codec.c.
References switch_mutex_lock().
00063 { 00064 switch_mutex_lock(session->codec_write_mutex); 00065 }
| switch_status_t switch_core_session_set_read_codec | ( | switch_core_session_t * | session, | |
| switch_codec_t * | codec | |||
| ) |
Definition at line 193 of file switch_core_codec.c.
References CF_MEDIA_SET, switch_codec::next, switch_channel_event_set_data(), switch_channel_get_name(), SWITCH_CHANNEL_SESSION_LOG, switch_channel_set_flag, switch_channel_set_variable, switch_core_codec_ready(), switch_core_session_get_channel(), switch_event_add_header(), switch_event_add_header_string(), SWITCH_EVENT_CODEC, switch_event_create, switch_event_fire, SWITCH_LOG_DEBUG, switch_log_printf(), switch_mutex_lock(), switch_mutex_unlock(), switch_snprintf(), SWITCH_STACK_BOTTOM, SWITCH_STATUS_FALSE, and SWITCH_STATUS_SUCCESS.
00194 { 00195 switch_event_t *event; 00196 switch_channel_t *channel = switch_core_session_get_channel(session); 00197 char tmp[30]; 00198 switch_status_t status = SWITCH_STATUS_SUCCESS; 00199 00200 switch_mutex_lock(session->codec_read_mutex); 00201 00202 if (codec && (!codec->implementation || !switch_core_codec_ready(codec))) { 00203 codec = NULL; 00204 } 00205 00206 if (codec) { 00207 if (!session->real_read_codec) { 00208 session->read_codec = session->real_read_codec = codec; 00209 if (codec->implementation) { 00210 session->read_impl = *codec->implementation; 00211 session->real_read_impl = *codec->implementation; 00212 } else { 00213 memset(&session->read_impl, 0, sizeof(session->read_impl)); 00214 } 00215 } else { 00216 if (codec == session->read_codec) { 00217 goto end; 00218 } 00219 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Push codec %s:%d\n", 00220 switch_channel_get_name(session->channel), codec->implementation->iananame, codec->implementation->ianacode); 00221 codec->next = session->read_codec; 00222 session->read_codec = codec; 00223 if (codec->implementation) { 00224 session->read_impl = *codec->implementation; 00225 } else { 00226 memset(&session->read_impl, 0, sizeof(session->read_impl)); 00227 } 00228 } 00229 } else { 00230 if (session->read_codec == session->real_read_codec) { 00231 goto end; 00232 } 00233 00234 if (session->read_codec->next) { 00235 switch_codec_t *old = session->read_codec; 00236 session->read_codec = session->read_codec->next; 00237 if (session->read_codec->implementation) { 00238 session->read_impl = *session->read_codec->implementation; 00239 } else { 00240 memset(&session->read_impl, 0, sizeof(session->read_impl)); 00241 } 00242 old->next = NULL; 00243 00244 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Restore previous codec %s:%d.\n", 00245 switch_channel_get_name(session->channel), 00246 session->read_impl.iananame ? session->read_impl.iananame : "N/A", session->read_impl.ianacode); 00247 00248 00249 } else if (session->real_read_codec) { 00250 session->read_codec = session->real_read_codec; 00251 if (session->real_read_codec->implementation) { 00252 session->read_impl = *session->real_read_codec->implementation; 00253 } else { 00254 memset(&session->read_impl, 0, sizeof(session->read_impl)); 00255 } 00256 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Restore original codec.\n"); 00257 } else { 00258 status = SWITCH_STATUS_FALSE; 00259 goto end; 00260 } 00261 } 00262 00263 if (!session->read_codec) { 00264 status = SWITCH_STATUS_FALSE; 00265 goto end; 00266 } 00267 00268 if (session->read_codec && session->read_impl.decoded_bytes_per_packet) { 00269 if (switch_event_create(&event, SWITCH_EVENT_CODEC) == SWITCH_STATUS_SUCCESS) { 00270 switch_channel_event_set_data(session->channel, event); 00271 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-read-codec-name", session->read_impl.iananame); 00272 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-read-codec-rate", "%d", session->read_impl.actual_samples_per_second); 00273 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-read-codec-bit-rate", "%d", session->read_impl.bits_per_second); 00274 if (session->read_impl.actual_samples_per_second != session->read_impl.samples_per_second) { 00275 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-reported-read-codec-rate", "%d", session->read_impl.samples_per_second); 00276 } 00277 switch_event_fire(&event); 00278 } 00279 00280 switch_channel_set_variable(channel, "read_codec", session->read_impl.iananame); 00281 switch_snprintf(tmp, sizeof(tmp), "%d", session->read_impl.actual_samples_per_second); 00282 switch_channel_set_variable(channel, "read_rate", tmp); 00283 00284 session->raw_read_frame.codec = session->read_codec; 00285 session->raw_write_frame.codec = session->read_codec; 00286 session->enc_read_frame.codec = session->read_codec; 00287 session->enc_write_frame.codec = session->read_codec; 00288 } 00289 00290 end: 00291 00292 if (session->read_codec) { 00293 switch_channel_set_flag(channel, CF_MEDIA_SET); 00294 } 00295 00296 switch_mutex_unlock(session->codec_read_mutex); 00297 return status; 00298 00299 }
| switch_status_t switch_core_session_set_real_read_codec | ( | switch_core_session_t * | session, | |
| switch_codec_t * | codec | |||
| ) |
Definition at line 94 of file switch_core_codec.c.
References CF_MEDIA_SET, switch_codec::implementation, switch_codec::next, switch_channel_event_set_data(), switch_channel_get_name(), SWITCH_CHANNEL_SESSION_LOG, switch_channel_set_flag, switch_channel_set_variable, switch_core_codec_destroy(), switch_core_codec_ready(), switch_core_session_get_channel(), switch_event_add_header(), switch_event_add_header_string(), SWITCH_EVENT_CODEC, switch_event_create, switch_event_fire, SWITCH_LOG_DEBUG, switch_log_printf(), switch_mutex_lock(), switch_mutex_unlock(), switch_snprintf(), SWITCH_STACK_BOTTOM, SWITCH_STATUS_FALSE, SWITCH_STATUS_SUCCESS, switch_thread_rwlock_unlock(), and switch_thread_rwlock_wrlock().
00095 { 00096 switch_event_t *event; 00097 switch_channel_t *channel = switch_core_session_get_channel(session); 00098 char tmp[30]; 00099 switch_status_t status = SWITCH_STATUS_SUCCESS; 00100 int changed_read_codec = 0; 00101 00102 switch_mutex_lock(session->codec_read_mutex); 00103 00104 if (codec && (!codec->implementation || !switch_core_codec_ready(codec))) { 00105 codec = NULL; 00106 } 00107 00108 if (codec) { 00109 /* set real_read_codec and read_codec */ 00110 if (!session->real_read_codec) { 00111 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Original read codec set to %s:%d\n", 00112 switch_channel_get_name(session->channel), codec->implementation->iananame, codec->implementation->ianacode); 00113 session->read_codec = session->real_read_codec = codec; 00114 changed_read_codec = 1; 00115 if (codec->implementation) { 00116 session->read_impl = *codec->implementation; 00117 session->real_read_impl = *codec->implementation; 00118 } else { 00119 memset(&session->read_impl, 0, sizeof(session->read_impl)); 00120 } 00121 } else { /* replace real_read_codec */ 00122 switch_codec_t *cur_codec; 00123 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Original read codec replaced with %s:%d\n", 00124 switch_channel_get_name(session->channel), codec->implementation->iananame, codec->implementation->ianacode); 00125 /* Set real_read_codec to front of the list of read_codecs */ 00126 cur_codec = session->read_codec; 00127 while (cur_codec != NULL) { 00128 if (cur_codec->next == session->real_read_codec) { 00129 cur_codec->next = codec; 00130 break; 00131 } 00132 cur_codec = cur_codec->next; 00133 } 00134 session->real_read_codec = codec; 00135 /* set read_codec with real_read_codec if it no longer is ready */ 00136 if (!switch_core_codec_ready(session->read_codec)) { 00137 session->read_codec = codec; 00138 changed_read_codec = 1; 00139 if (codec->implementation) { 00140 session->read_impl = *codec->implementation; 00141 session->real_read_impl = *codec->implementation; 00142 } else { 00143 memset(&session->read_impl, 0, sizeof(session->read_impl)); 00144 } 00145 } 00146 } 00147 00148 /* force media bugs to copy the read codec from the next frame */ 00149 switch_thread_rwlock_wrlock(session->bug_rwlock); 00150 if (switch_core_codec_ready(&session->bug_codec)) { 00151 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Destroying BUG Codec %s:%d\n", 00152 session->bug_codec.implementation->iananame, session->bug_codec.implementation->ianacode); 00153 switch_core_codec_destroy(&session->bug_codec); 00154 } 00155 switch_thread_rwlock_unlock(session->bug_rwlock); 00156 } else { 00157 status = SWITCH_STATUS_FALSE; 00158 goto end; 00159 } 00160 00161 if (changed_read_codec && session->read_codec && session->read_impl.decoded_bytes_per_packet) { 00162 if (switch_event_create(&event, SWITCH_EVENT_CODEC) == SWITCH_STATUS_SUCCESS) { 00163 switch_channel_event_set_data(session->channel, event); 00164 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-read-codec-name", session->read_impl.iananame); 00165 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-read-codec-rate", "%d", session->read_impl.actual_samples_per_second); 00166 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-read-codec-bit-rate", "%d", session->read_impl.bits_per_second); 00167 if (session->read_impl.actual_samples_per_second != session->read_impl.samples_per_second) { 00168 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-reported-read-codec-rate", "%d", session->read_impl.samples_per_second); 00169 } 00170 switch_event_fire(&event); 00171 } 00172 00173 switch_channel_set_variable(channel, "read_codec", session->read_impl.iananame); 00174 switch_snprintf(tmp, sizeof(tmp), "%d", session->read_impl.actual_samples_per_second); 00175 switch_channel_set_variable(channel, "read_rate", tmp); 00176 00177 session->raw_read_frame.codec = session->read_codec; 00178 session->raw_write_frame.codec = session->read_codec; 00179 session->enc_read_frame.codec = session->read_codec; 00180 session->enc_write_frame.codec = session->read_codec; 00181 } 00182 00183 end: 00184 00185 if (session->read_codec) { 00186 switch_channel_set_flag(channel, CF_MEDIA_SET); 00187 } 00188 00189 switch_mutex_unlock(session->codec_read_mutex); 00190 return status; 00191 }
| switch_status_t switch_core_session_set_video_read_codec | ( | switch_core_session_t * | session, | |
| switch_codec_t * | codec | |||
| ) |
Definition at line 474 of file switch_core_codec.c.
References switch_channel_event_set_data(), SWITCH_CHANNEL_SESSION_LOG, switch_channel_set_variable, switch_core_codec_ready(), switch_core_session_get_channel(), switch_event_add_header(), switch_event_add_header_string(), SWITCH_EVENT_CODEC, switch_event_create, switch_event_fire, SWITCH_LOG_ERROR, switch_log_printf(), switch_snprintf(), SWITCH_STACK_BOTTOM, SWITCH_STATUS_FALSE, and SWITCH_STATUS_SUCCESS.
00475 { 00476 switch_event_t *event; 00477 switch_channel_t *channel = switch_core_session_get_channel(session); 00478 char tmp[30]; 00479 switch_status_t status = SWITCH_STATUS_SUCCESS; 00480 00481 if (!codec || !codec->implementation || !switch_core_codec_ready(codec)) { 00482 if (session->video_read_codec) { 00483 session->video_read_codec = NULL; 00484 status = SWITCH_STATUS_SUCCESS; 00485 goto end; 00486 } 00487 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot set NULL codec!\n"); 00488 status = SWITCH_STATUS_FALSE; 00489 goto end; 00490 } 00491 00492 if (switch_event_create(&event, SWITCH_EVENT_CODEC) == SWITCH_STATUS_SUCCESS) { 00493 switch_channel_event_set_data(session->channel, event); 00494 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-video-read-codec-name", codec->implementation->iananame); 00495 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-video-read-codec-rate", "%d", codec->implementation->actual_samples_per_second); 00496 switch_event_fire(&event); 00497 } 00498 00499 switch_channel_set_variable(channel, "video_read_codec", codec->implementation->iananame); 00500 switch_snprintf(tmp, sizeof(tmp), "%d", codec->implementation->actual_samples_per_second); 00501 switch_channel_set_variable(channel, "video_read_rate", tmp); 00502 00503 session->video_read_codec = codec; 00504 if (codec->implementation) { 00505 session->video_read_impl = *codec->implementation; 00506 } else { 00507 memset(&session->video_read_impl, 0, sizeof(session->video_read_impl)); 00508 } 00509 end: 00510 00511 return status; 00512 }
| switch_status_t switch_core_session_set_video_write_codec | ( | switch_core_session_t * | session, | |
| switch_codec_t * | codec | |||
| ) |
Definition at line 523 of file switch_core_codec.c.
References switch_channel_event_set_data(), SWITCH_CHANNEL_SESSION_LOG, switch_channel_set_variable, switch_core_codec_ready(), switch_core_session_get_channel(), switch_event_add_header(), switch_event_add_header_string(), SWITCH_EVENT_CODEC, switch_event_create, switch_event_fire, SWITCH_LOG_ERROR, switch_log_printf(), switch_snprintf(), SWITCH_STACK_BOTTOM, SWITCH_STATUS_FALSE, and SWITCH_STATUS_SUCCESS.
00524 { 00525 switch_event_t *event; 00526 switch_channel_t *channel = switch_core_session_get_channel(session); 00527 char tmp[30]; 00528 switch_status_t status = SWITCH_STATUS_SUCCESS; 00529 if (!codec || !codec->implementation || !switch_core_codec_ready(codec)) { 00530 if (session->video_write_codec) { 00531 session->video_write_codec = NULL; 00532 status = SWITCH_STATUS_SUCCESS; 00533 goto end; 00534 } 00535 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot set NULL codec!\n"); 00536 status = SWITCH_STATUS_FALSE; 00537 goto end; 00538 } 00539 00540 if (switch_event_create(&event, SWITCH_EVENT_CODEC) == SWITCH_STATUS_SUCCESS) { 00541 switch_channel_event_set_data(session->channel, event); 00542 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-video-write-codec-name", codec->implementation->iananame); 00543 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "channel-video-write-codec-rate", "%d", codec->implementation->actual_samples_per_second); 00544 switch_event_fire(&event); 00545 } 00546 00547 switch_channel_set_variable(channel, "video_write_codec", codec->implementation->iananame); 00548 switch_snprintf(tmp, sizeof(tmp), "%d", codec->implementation->actual_samples_per_second); 00549 switch_channel_set_variable(channel, "video_write_rate", tmp); 00550 00551 session->video_write_codec = codec; 00552 session->video_write_impl = *codec->implementation; 00553 00554 end: 00555 00556 return status; 00557 }
| switch_status_t switch_core_session_set_write_codec | ( | switch_core_session_t * | session, | |
| switch_codec_t * | codec | |||
| ) |
Definition at line 391 of file switch_core_codec.c.
References switch_channel_event_set_data(), SWITCH_CHANNEL_SESSION_LOG, switch_channel_set_variable, switch_core_codec_ready(), switch_core_session_get_channel(), switch_event_add_header(), switch_event_add_header_string(), SWITCH_EVENT_CODEC, switch_event_create, switch_event_fire, SWITCH_LOG_ERROR, switch_log_printf(), switch_mutex_lock(), switch_mutex_unlock(), switch_snprintf(), SWITCH_STACK_BOTTOM, SWITCH_STATUS_FALSE, and SWITCH_STATUS_SUCCESS.
00392 { 00393 switch_event_t *event; 00394 switch_channel_t *channel = switch_core_session_get_channel(session); 00395 char tmp[30]; 00396 switch_status_t status = SWITCH_STATUS_SUCCESS; 00397 00398 switch_mutex_lock(session->codec_write_mutex); 00399 00400 if (!codec || !codec->implementation || !switch_core_codec_ready(codec)) { 00401 if (session->real_write_codec) { 00402 session->write_codec = session->real_write_codec; 00403 session->write_impl = *session->real_write_codec->implementation; 00404 session->real_write_codec = NULL; 00405 } else { 00406 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot set NULL codec!\n"); 00407 status = SWITCH_STATUS_FALSE; 00408 goto end; 00409 } 00410 } else if (session->write_codec) { 00411 if (session->real_write_codec) { 00412 if (codec == session->real_write_codec) { 00413 session->write_codec = codec; 00414 session->write_impl = *codec->implementation; 00415 session->real_write_codec = NULL; 00416 } else { 00417 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot double-set codec!\n"); 00418 status = SWITCH_STATUS_FALSE; 00419 goto end; 00420 } 00421 } else { 00422 session->real_write_codec = session->write_codec; 00423 session->write_codec = codec; 00424 session->write_impl = *codec->implementation; 00425 } 00426 } else { 00427 session->write_codec = codec; 00428 session->write_impl = *codec->implementation; 00429 } 00430 00431 if (session->write_codec && codec && session->write_impl.codec_id) { 00432 if (switch_event_create(&event, SWITCH_EVENT_CODEC) == SWITCH_STATUS_SUCCESS) { 00433 switch_channel_event_set_data(session->channel, event); 00434 switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-Write-Codec-Name", session->write_impl.iananame); 00435 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Channel-Write-Codec-Rate", "%d", session->write_impl.actual_samples_per_second); 00436 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Channel-Write-codec-bit-rate", "%d", session->write_impl.bits_per_second); 00437 if (session->write_impl.actual_samples_per_second != session->write_impl.samples_per_second) { 00438 switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Channel-Reported-Write-Codec-Rate", "%d", 00439 session->write_impl.actual_samples_per_second); 00440 } 00441 switch_event_fire(&event); 00442 } 00443 00444 switch_channel_set_variable(channel, "write_codec", session->write_impl.iananame); 00445 switch_snprintf(tmp, sizeof(tmp), "%d", session->write_impl.actual_samples_per_second); 00446 switch_channel_set_variable(channel, "write_rate", tmp); 00447 } 00448 00449 end: 00450 switch_mutex_unlock(session->codec_write_mutex); 00451 00452 return status; 00453 }
| void switch_core_session_unlock_codec_read | ( | switch_core_session_t * | session | ) |
Definition at line 77 of file switch_core_codec.c.
References switch_mutex_unlock().
00078 { 00079 switch_mutex_unlock(session->codec_read_mutex); 00080 }
| void switch_core_session_unlock_codec_write | ( | switch_core_session_t * | session | ) |
Definition at line 67 of file switch_core_codec.c.
References switch_mutex_unlock().
00068 { 00069 switch_mutex_unlock(session->codec_write_mutex); 00070 }
| void switch_core_session_unset_read_codec | ( | switch_core_session_t * | session | ) |
Definition at line 46 of file switch_core_codec.c.
References mutex, switch_mutex_lock(), and switch_mutex_unlock().
00047 { 00048 switch_mutex_t *mutex = NULL; 00049 00050 switch_mutex_lock(session->codec_read_mutex); 00051 if (session->read_codec) mutex = session->read_codec->mutex; 00052 if (mutex) switch_mutex_lock(mutex); 00053 session->real_read_codec = session->read_codec = NULL; 00054 session->raw_read_frame.codec = session->read_codec; 00055 session->raw_write_frame.codec = session->read_codec; 00056 session->enc_read_frame.codec = session->read_codec; 00057 session->enc_write_frame.codec = session->read_codec; 00058 if (mutex) switch_mutex_unlock(mutex); 00059 switch_mutex_unlock(session->codec_read_mutex); 00060 }
| void switch_core_session_unset_write_codec | ( | switch_core_session_t * | session | ) |
Definition at line 82 of file switch_core_codec.c.
References mutex, switch_mutex_lock(), and switch_mutex_unlock().
00083 { 00084 switch_mutex_t *mutex = NULL; 00085 00086 switch_mutex_lock(session->codec_write_mutex); 00087 if (session->write_codec) mutex = session->write_codec->mutex; 00088 if (mutex) switch_mutex_lock(mutex); 00089 session->real_write_codec = session->write_codec = NULL; 00090 if (mutex) switch_mutex_unlock(mutex); 00091 switch_mutex_unlock(session->codec_write_mutex); 00092 }
uint32_t CODEC_ID = 1 [static] |
1.4.7