static int fax_releaseGW(fax_params_t *f_params) { session_t *session = f_params->session; app_trace(TRACE_INFO, "Fax %04x. Release T.38-fax gateway", session->ses_id); if(f_params->pvt.t38_gw_state) { t38_gateway_release(f_params->pvt.t38_gw_state); } if(f_params->pvt.udptl_state) { udptl_release(f_params->pvt.udptl_state); } return 0; }
int main(int argc, char *argv[]) { t30_state_t *t30; logging_state_t *logging; const char *input_file_name; int t38_version; int caller; int use_ecm; int use_tep; int options; int supported_modems; int fill_removal; int opt; int t38_terminal_operation; uint32_t src_addr; uint16_t src_port; uint32_t dest_addr; uint16_t dest_port; caller = false; use_ecm = false; t38_version = 0; options = 0; input_file_name = INPUT_FILE_NAME; fill_removal = false; use_tep = false; use_transmit_on_idle = true; supported_modems = T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17; t38_terminal_operation = true; log_audio = false; src_addr = 0; src_port = 0; dest_addr = 0; dest_port = 0; while ((opt = getopt(argc, argv, "cD:d:eFGi:lm:oS:s:tv:")) != -1) { switch (opt) { case 'c': caller = true; break; case 'D': dest_addr = parse_inet_addr(optarg); break; case 'd': dest_port = atoi(optarg); break; case 'e': use_ecm = true; break; case 'F': fill_removal = true; break; case 'G': t38_terminal_operation = false; break; case 'i': input_file_name = optarg; break; case 'l': log_audio = true; break; case 'm': supported_modems = atoi(optarg); break; case 'o': options = atoi(optarg); break; case 'S': src_addr = parse_inet_addr(optarg); break; case 's': src_port = atoi(optarg); break; case 't': use_tep = true; break; case 'v': t38_version = atoi(optarg); break; default: //usage(); exit(2); break; } } printf("Using T.38 version %d\n", t38_version); if (t38_terminal_operation) { if ((t38_terminal_state = t38_terminal_init(NULL, caller, tx_packet_handler, NULL)) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t30 = t38_terminal_get_t30_state(t38_terminal_state); t38_core = t38_terminal_get_t38_core_state(t38_terminal_state); t38_set_t38_version(t38_core, t38_version); t38_terminal_set_config(t38_terminal_state, options); t38_terminal_set_tep_mode(t38_terminal_state, use_tep); t38_terminal_set_fill_bit_removal(t38_terminal_state, fill_removal); logging = t38_terminal_get_logging_state(t38_terminal_state); span_log_set_level(logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(logging, "T.38"); logging = t38_core_get_logging_state(t38_core); span_log_set_level(logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(logging, "T.38"); logging = t30_get_logging_state(t30); span_log_set_level(logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(logging, "T.38"); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "11111111"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); if (caller) t30_set_tx_file(t30, INPUT_TIFF_FILE_NAME, -1, -1); else t30_set_rx_file(t30, OUTPUT_TIFF_FILE_NAME, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'A'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'A'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'A'); t30_set_ecm_capability(t30, use_ecm); t30_set_supported_compressions(t30, T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6 | T4_COMPRESSION_T85); if (pcap_scan_pkts(input_file_name, src_addr, src_port, dest_addr, dest_port, t38_terminal_timing_update, process_packet, NULL)) exit(2); /* Push the time along, to flush out any remaining activity from the application. */ now.tv_sec += 60; t38_terminal_timing_update(NULL, &now); } else { wave_handle = NULL; if (log_audio) { if ((wave_handle = sf_open_telephony_write(OUTPUT_WAVE_FILE_NAME, 2)) == NULL) { fprintf(stderr, " Cannot create audio file '%s'\n", OUTPUT_WAVE_FILE_NAME); exit(2); } } if ((t38_gateway_state = t38_gateway_init(NULL, tx_packet_handler, NULL)) == NULL) { fprintf(stderr, "Cannot start the T.38 channel\n"); exit(2); } t38_core = t38_gateway_get_t38_core_state(t38_gateway_state); t38_gateway_set_transmit_on_idle(t38_gateway_state, use_transmit_on_idle); t38_set_t38_version(t38_core, t38_version); t38_gateway_set_ecm_capability(t38_gateway_state, use_ecm); logging = t38_gateway_get_logging_state(t38_gateway_state); span_log_set_level(logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(logging, "T.38"); logging = t38_core_get_logging_state(t38_core); span_log_set_level(logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(logging, "T.38"); if ((fax_state = fax_init(NULL, caller)) == NULL) { fprintf(stderr, "Cannot start FAX\n"); exit(2); } t30 = fax_get_t30_state(fax_state); fax_set_transmit_on_idle(fax_state, use_transmit_on_idle); fax_set_tep_mode(fax_state, use_tep); t30_set_supported_modems(t30, supported_modems); t30_set_tx_ident(t30, "22222222"); t30_set_tx_nsf(t30, (const uint8_t *) "\x50\x00\x00\x00Spandsp\x00", 12); if (caller) t30_set_tx_file(t30, INPUT_TIFF_FILE_NAME, -1, -1); else t30_set_rx_file(t30, OUTPUT_TIFF_FILE_NAME, -1); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'B'); t30_set_phase_d_handler(t30, phase_d_handler, (void *) (intptr_t) 'B'); t30_set_phase_e_handler(t30, phase_e_handler, (void *) (intptr_t) 'B'); t30_set_ecm_capability(t30, use_ecm); t30_set_supported_compressions(t30, T4_COMPRESSION_T4_1D | T4_COMPRESSION_T4_2D | T4_COMPRESSION_T6); logging = fax_get_logging_state(fax_state); span_log_set_level(logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(logging, "FAX "); logging = t30_get_logging_state(t30); span_log_set_level(logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_tag(logging, "FAX "); if (pcap_scan_pkts(input_file_name, src_addr, src_port, dest_addr, dest_port, t38_gateway_timing_update, process_packet, NULL)) exit(2); /* Push the time along, to flush out any remaining activity from the application. */ now.tv_sec += 60; t38_gateway_timing_update(NULL, &now); fax_release(fax_state); t38_gateway_release(t38_gateway_state); if (log_audio) { if (sf_close_telephony(wave_handle)) { fprintf(stderr, " Cannot close audio file '%s'\n", OUTPUT_WAVE_FILE_NAME); exit(2); } } } }