void net_check_conn() { time_t now; static time_t last_ping = 0; char c = 0; int rc; if (srv_sd <= 0) return; now = time(NULL); if (last_ping == 0) last_ping = now; do { c = 0; rc = read_byte(srv_sd, &c); if (c == PING) { #if DEBUG_OUT fprintf(stderr, "[S] Received PING\n"); #endif last_ping = now; } } while (rc > 0 && c == PING); if (now - last_ping > NO_RESPONCE_INTERVAL) { fprintf(stderr, "[S] No PING received from the server in %u sec, reconnecting\n", NO_RESPONCE_INTERVAL); close(srv_sd); srv_sd = -1; connect_to_srv(srv_addr, srv_port, srv_cc_desc, srv_pwd); net_send_header(srv_header, srv_header_len); last_ping = now; } static time_t last_send_ping = 0; if (now - last_send_ping >= PING_INTERVAL) { if (write_block(srv_sd, PING, NULL, 0) < 0) { printf("Unable to send data\n"); exit(EXIT_FAILURE); } last_send_ping = now; } }
void write_subtitle_file_header(struct encoder_ctx *ctx,struct ccx_s_write *out) { int used; switch (ccx_options.write_format) { case CCX_OF_SRT: // Subrip subtitles have no header break; case CCX_OF_SAMI: // This header brought to you by McPoodle's CCASDI //fprintf_encoded (wb->fh, sami_header); REQUEST_BUFFER_CAPACITY(ctx,strlen (sami_header)*3); used=encode_line (ctx->buffer,(unsigned char *) sami_header); write (out->fh, ctx->buffer,used); break; case CCX_OF_SMPTETT: // This header brought to you by McPoodle's CCASDI //fprintf_encoded (wb->fh, sami_header); REQUEST_BUFFER_CAPACITY(ctx,strlen (smptett_header)*3); used=encode_line (ctx->buffer,(unsigned char *) smptett_header); write(out->fh, ctx->buffer, used); break; case CCX_OF_RCWT: // Write header if (ccx_options.teletext_mode == CCX_TXT_IN_USE) rcwt_header[7] = 2; // sets file format version if (ccx_options.send_to_srv) net_send_header(rcwt_header, sizeof(rcwt_header)); else write(out->fh, rcwt_header, sizeof(rcwt_header)); break; case CCX_OF_SPUPNG: write_spumux_header(out); break; case CCX_OF_TRANSCRIPT: // No header. Fall thru default: break; } }
int encode_sub(struct encoder_ctx *context, struct cc_subtitle *sub) { int wrote_something = 0; int ret = 0; if (sub->type == CC_608) { struct eia608_screen *data = NULL; for(data = sub->data; sub->nb_data ; sub->nb_data--,data++) { // Determine context based on channel. This replaces the code that was above, as this was incomplete (for cases where -12 was used for example) if (data->my_field == 2) context++; new_sentence=1; if(data->format == SFORMAT_XDS) { xds_write_transcript_line_prefix (context->out, data->start_time, data->end_time,data->cur_xds_packet_class); if(data->xds_len > 0) { ret = write (context->out->fh, data->xds_str,data->xds_len); if (ret < data->xds_len) { mprint("WARNING:Loss of data\n"); } } freep (&data->xds_str); xds_write_transcript_line_suffix (context->out); continue; } if(!data->start_time) break; switch (context->write_format) { case CCX_OF_SRT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, data->start_time); wrote_something = write_cc_buffer_as_srt(data, context); break; case CCX_OF_WEBVTT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, data->start_time); wrote_something = write_cc_buffer_as_webvtt(data, context); break; case CCX_OF_SAMI: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, data->start_time); wrote_something = write_cc_buffer_as_sami(data, context); break; case CCX_OF_SMPTETT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, data->start_time); wrote_something = write_cc_buffer_as_smptett(data, context); break; case CCX_OF_TRANSCRIPT: wrote_something = write_cc_buffer_as_transcript2(data, context); break; case CCX_OF_SPUPNG: wrote_something = write_cc_buffer_as_spupng(data, context); break; default: break; } if (wrote_something) context->last_displayed_subs_ms=get_fts() + context->subs_delay; if (context->gui_mode_reports) write_cc_buffer_to_gui(sub->data, context); } freep(&sub->data); } if(sub->type == CC_BITMAP) { switch (context->write_format) { case CCX_OF_SRT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_bitmap_as_srt(sub, context); break; case CCX_OF_WEBVTT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_bitmap_as_webvtt(sub, context); break; case CCX_OF_SAMI: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_bitmap_as_sami(sub, context); break; case CCX_OF_SMPTETT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_bitmap_as_smptett(sub, context); break; case CCX_OF_TRANSCRIPT: wrote_something = write_cc_bitmap_as_transcript(sub, context); break; case CCX_OF_SPUPNG: wrote_something = write_cc_bitmap_as_spupng(sub, context); break; default: break; } } if (sub->type == CC_RAW) { if (context->send_to_srv) net_send_header(sub->data, sub->nb_data); else { ret = write(context->out->fh, sub->data, sub->nb_data); if ( ret < sub->nb_data) { mprint("WARNING: Loss of data\n"); } } sub->nb_data = 0; } if(sub->type == CC_TEXT) { switch (context->write_format) { case CCX_OF_SRT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_subtitle_as_srt(sub, context); break; case CCX_OF_WEBVTT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_subtitle_as_webvtt(sub, context); break; case CCX_OF_SAMI: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_subtitle_as_sami(sub, context); break; case CCX_OF_SMPTETT: if (!context->startcredits_displayed && context->start_credits_text!=NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_subtitle_as_smptett(sub, context); break; case CCX_OF_TRANSCRIPT: wrote_something = write_cc_subtitle_as_transcript(sub, context); break; case CCX_OF_SPUPNG: wrote_something = write_cc_subtitle_as_spupng(sub, context); break; default: break; } sub->nb_data = 0; } if (!sub->nb_data) freep(&sub->data); return wrote_something; }
static int write_subtitle_file_header(struct encoder_ctx *ctx, struct ccx_s_write *out) { int used; int ret = 0; switch (ctx->write_format) { case CCX_OF_SRT: // Subrip subtitles have no header ret = write_bom(ctx, out); if(ret < 0) return -1; break; case CCX_OF_WEBVTT: // WEBVTT subtitles have no header ret = write_bom(ctx, out); if(ret < 0) return -1; break; case CCX_OF_SAMI: // This header brought to you by McPoodle's CCASDI //fprintf_encoded (wb->fh, sami_header); ret = write_bom(ctx, out); if(ret < 0) return -1; REQUEST_BUFFER_CAPACITY(ctx,strlen (sami_header)*3); used = encode_line (ctx->buffer,(unsigned char *) sami_header); ret = write (out->fh, ctx->buffer,used); break; case CCX_OF_SMPTETT: // This header brought to you by McPoodle's CCASDI //fprintf_encoded (wb->fh, sami_header); ret = write_bom(ctx, out); if(ret < 0) return -1; REQUEST_BUFFER_CAPACITY(ctx,strlen (smptett_header)*3); used=encode_line (ctx->buffer,(unsigned char *) smptett_header); ret = write(out->fh, ctx->buffer, used); if(ret < used) { mprint("WARNING: Unable to write complete Buffer \n"); return -1; } break; case CCX_OF_RCWT: // Write header rcwt_header[7] = ctx->in_fileformat; // sets file format version if (ctx->send_to_srv) net_send_header(rcwt_header, sizeof(rcwt_header)); else { ret = write(out->fh, rcwt_header, sizeof(rcwt_header)); if(ret < 0) { mprint("Unable to write rcwt header\n"); return -1; } } break; case CCX_OF_RAW: ret = write(out->fh,BROADCAST_HEADER, sizeof(BROADCAST_HEADER)); if(ret < sizeof(BROADCAST_HEADER)) { mprint("Unable to write Raw header\n"); return -1; } case CCX_OF_SPUPNG: ret = write_bom(ctx, out); if(ret < 0) return -1; write_spumux_header(ctx, out); break; case CCX_OF_TRANSCRIPT: // No header. Fall thru ret = write_bom(ctx, out); if(ret < 0) return -1; default: break; } return ret; }
int encode_sub(struct encoder_ctx *context, struct cc_subtitle *sub) { int wrote_something = 0; int ret = 0; if(!context) return CCX_OK; context = change_filename(context); #ifdef ENABLE_SHARING if (ccx_options.sharing_enabled) ccx_share_send(sub); #endif //ENABLE_SHARING if (context->splitbysentence) { // Write to a buffer that is later s+plit to generate split // in sentences if (sub->type == CC_BITMAP) wrote_something = write_cc_bitmap_to_sentence_buffer(sub, context); } else { // Write subtitles as they come if (sub->type == CC_608) { struct eia608_screen *data = NULL; struct ccx_s_write *out; for (data = sub->data; sub->nb_data; sub->nb_data--, data++) { // Determine context based on channel. This replaces the code that was above, as this was incomplete (for cases where -12 was used for example) out = get_output_ctx(context, data->my_field); if (data->format == SFORMAT_XDS) { data->end_time = data->end_time + context->subs_delay; xds_write_transcript_line_prefix(context, out, data->start_time, data->end_time, data->cur_xds_packet_class); if (data->xds_len > 0) { ret = write(out->fh, data->xds_str, data->xds_len); if (ret < data->xds_len) { mprint("WARNING:Loss of data\n"); } } freep(&data->xds_str); write_newline(context, 0); continue; } data->end_time = data->end_time + context->subs_delay; switch (context->write_format) { case CCX_OF_SRT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, data->start_time); wrote_something = write_cc_buffer_as_srt(data, context); break; case CCX_OF_G608: wrote_something = write_cc_buffer_as_g608(data, context); break; case CCX_OF_WEBVTT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, data->start_time); wrote_something = write_cc_buffer_as_webvtt(data, context); break; case CCX_OF_SAMI: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, data->start_time); wrote_something = write_cc_buffer_as_sami(data, context); break; case CCX_OF_SMPTETT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, data->start_time); wrote_something = write_cc_buffer_as_smptett(data, context); break; case CCX_OF_TRANSCRIPT: wrote_something = write_cc_buffer_as_transcript2(data, context); break; case CCX_OF_SPUPNG: wrote_something = write_cc_buffer_as_spupng(data, context); break; case CCX_OF_SIMPLE_XML: if (ccx_options.keep_output_closed && context->out->temporarily_closed) { temporarily_open_output(context->out); write_subtitle_file_header(context, context->out); } wrote_something = write_cc_buffer_as_simplexml(data, context); if (ccx_options.keep_output_closed) { write_subtitle_file_footer(context, context->out); temporarily_close_output(context->out); } break; default: break; } if (wrote_something) context->last_displayed_subs_ms = data->end_time; if (context->gui_mode_reports) write_cc_buffer_to_gui(sub->data, context); } freep(&sub->data); } if (sub->type == CC_BITMAP) { switch (context->write_format) { case CCX_OF_SRT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_bitmap_as_srt(sub, context); break; case CCX_OF_WEBVTT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_bitmap_as_webvtt(sub, context); break; case CCX_OF_SAMI: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_bitmap_as_sami(sub, context); break; case CCX_OF_SMPTETT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_bitmap_as_smptett(sub, context); break; case CCX_OF_TRANSCRIPT: wrote_something = write_cc_bitmap_as_transcript(sub, context); break; case CCX_OF_SPUPNG: wrote_something = write_cc_bitmap_as_spupng(sub, context); break; case CCX_OF_SIMPLE_XML: wrote_something = write_cc_bitmap_as_simplexml(sub, context); break; #ifdef WITH_LIBCURL case CCX_OF_CURL: wrote_something = write_cc_bitmap_as_libcurl(sub, context); break; #endif default: break; } } if (sub->type == CC_RAW) { if (context->send_to_srv) net_send_header(sub->data, sub->nb_data); else { ret = write(context->out->fh, sub->data, sub->nb_data); if (ret < sub->nb_data) { mprint("WARNING: Loss of data\n"); } } sub->nb_data = 0; } if (sub->type == CC_TEXT) { switch (context->write_format) { case CCX_OF_SRT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_subtitle_as_srt(sub, context); break; case CCX_OF_WEBVTT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_subtitle_as_webvtt(sub, context); break; case CCX_OF_SAMI: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_subtitle_as_sami(sub, context); break; case CCX_OF_SMPTETT: if (!context->startcredits_displayed && context->start_credits_text != NULL) try_to_add_start_credits(context, sub->start_time); wrote_something = write_cc_subtitle_as_smptett(sub, context); break; case CCX_OF_TRANSCRIPT: wrote_something = write_cc_subtitle_as_transcript(sub, context); break; case CCX_OF_SPUPNG: wrote_something = write_cc_subtitle_as_spupng(sub, context); break; case CCX_OF_SIMPLE_XML: wrote_something = write_cc_subtitle_as_simplexml(sub, context); break; default: break; } sub->nb_data = 0; } } if (!sub->nb_data) freep(&sub->data); if (wrote_something && context->force_flush) fsync(context->out->fh); // Don't buffer return wrote_something; }
static int write_subtitle_file_header(struct encoder_ctx *ctx, struct ccx_s_write *out) { int used; int ret = 0; int header_size = 0; switch (ctx->write_format) { case CCX_OF_SRT: // Subrip subtitles have no header case CCX_OF_G608: ret = write_bom(ctx, out); if(ret < 0) return -1; break; case CCX_OF_SSA: ret = write_bom(ctx, out); if(ret < 0) return -1; REQUEST_BUFFER_CAPACITY(ctx,strlen (ssa_header)*3); used = encode_line (ctx, ctx->buffer,(unsigned char *) ssa_header); ret = write (out->fh, ctx->buffer, used); if(ret < used) { mprint("WARNING: Unable to write complete Buffer \n"); return -1; } break; case CCX_OF_WEBVTT: ret = write_bom(ctx, out); if (ret < 0) return -1; for(int i = 0; webvtt_header[i]!=NULL ;i++) { header_size += strlen(webvtt_header[i]); // Find total size of the header } REQUEST_BUFFER_CAPACITY(ctx, header_size*3); for(int i = 0; webvtt_header[i]!=NULL;i++) { if(ccx_options.enc_cfg.line_terminator_lf == 1 && strcmp(webvtt_header[i],"\r\n")==0) // If -lf parameter passed, write LF instead of CRLF { used = encode_line (ctx, ctx->buffer,(unsigned char *) "\n"); } else { used = encode_line (ctx, ctx->buffer,(unsigned char *) webvtt_header[i]); } ret = write (out->fh, ctx->buffer,used); if(ret < used) { mprint("WARNING: Unable to write complete Buffer \n"); return -1; } } break; case CCX_OF_SAMI: // This header brought to you by McPoodle's CCASDI //fprintf_encoded (wb->fh, sami_header); ret = write_bom(ctx, out); if(ret < 0) return -1; REQUEST_BUFFER_CAPACITY(ctx,strlen (sami_header)*3); used = encode_line (ctx, ctx->buffer,(unsigned char *) sami_header); ret = write (out->fh, ctx->buffer, used); if(ret < used) { mprint("WARNING: Unable to write complete Buffer \n"); return -1; } break; case CCX_OF_SMPTETT: // This header brought to you by McPoodle's CCASDI //fprintf_encoded (wb->fh, sami_header); ret = write_bom(ctx, out); if(ret < 0) return -1; REQUEST_BUFFER_CAPACITY(ctx,strlen (smptett_header)*3); used=encode_line (ctx, ctx->buffer,(unsigned char *) smptett_header); ret = write(out->fh, ctx->buffer, used); if(ret < used) { mprint("WARNING: Unable to write complete Buffer \n"); return -1; } break; case CCX_OF_RCWT: // Write header rcwt_header[7] = ctx->in_fileformat; // sets file format version if (ctx->send_to_srv) net_send_header(rcwt_header, sizeof(rcwt_header)); else { ret = write(out->fh, rcwt_header, sizeof(rcwt_header)); if(ret < 0) { mprint("Unable to write rcwt header\n"); return -1; } } break; case CCX_OF_RAW: ret = write(out->fh,BROADCAST_HEADER, sizeof(BROADCAST_HEADER)); if(ret < sizeof(BROADCAST_HEADER)) { mprint("Unable to write Raw header\n"); return -1; } break; case CCX_OF_SPUPNG: ret = write_bom(ctx, out); if(ret < 0) return -1; write_spumux_header(ctx, out); break; case CCX_OF_TRANSCRIPT: // No header. Fall thru ret = write_bom(ctx, out); if(ret < 0) return -1; break; case CCX_OF_SIMPLE_XML: // No header. Fall thru ret = write_bom(ctx, out); if(ret < 0) return -1; REQUEST_BUFFER_CAPACITY(ctx,strlen (simple_xml_header)*3); used=encode_line (ctx, ctx->buffer,(unsigned char *) simple_xml_header); ret = write(out->fh, ctx->buffer, used); if(ret < used) { mprint("WARNING: Unable to write complete Buffer \n"); return -1; } break; default: break; } return ret; }