int init_encoder(struct encoder_ctx *ctx, struct ccx_s_write *out, struct ccx_s_options *opt) { ctx->buffer = (unsigned char *) malloc (INITIAL_ENC_BUFFER_CAPACITY); if (ctx->buffer==NULL) return -1; ctx->capacity=INITIAL_ENC_BUFFER_CAPACITY; ctx->srt_counter = 0; ctx->out = out; /** used in case of SUB_EOD_MARKER */ ctx->prev_start = -1; if (ctx->write_format != CCX_OF_WEBVTT) ctx->encoding = opt->encoding; else { // WEBVTT only support UTF8 ctx->encoding = CCX_ENC_UTF_8; } ctx->date_format = opt->date_format; ctx->millis_separator = opt->millis_separator; ctx->sentence_cap = opt->sentence_cap; ctx->autodash = opt->autodash; ctx->trim_subs = opt->trim_subs; ctx->write_format = opt->write_format; ctx->start_credits_text = opt->start_credits_text; ctx->end_credits_text = opt->end_credits_text; ctx->transcript_settings = &opt->transcript_settings; ctx->startcreditsnotbefore = opt->startcreditsnotbefore; ctx->startcreditsnotafter = opt->startcreditsnotafter; ctx->startcreditsforatleast = opt->startcreditsforatleast; ctx->startcreditsforatmost = opt->startcreditsforatmost; ctx->endcreditsforatleast = opt->endcreditsforatleast; ctx->endcreditsforatmost = opt->endcreditsforatmost; ctx->in_fileformat = 1; ctx->send_to_srv = opt->send_to_srv; ctx->gui_mode_reports = opt->gui_mode_reports; ctx->no_bom = opt->no_bom; if (opt->num_input_files > 0) { ctx->multiple_files = 1; ctx->first_input_file = opt->inputfile[0]; } ctx->subline = (unsigned char *) malloc (SUBLINESIZE); if(!ctx->subline) { freep(&ctx->buffer); return -1; } write_subtitle_file_header(ctx,out); return 0; }
int init_encoder(struct encoder_ctx *ctx,struct ccx_s_write *out) { ctx->buffer = (unsigned char *) malloc (INITIAL_ENC_BUFFER_CAPACITY); if (ctx->buffer==NULL) return -1; ctx->capacity=INITIAL_ENC_BUFFER_CAPACITY; ctx->srt_counter = 0; ctx->out = out; /** used in case of SUB_EOD_MARKER */ ctx->prev_start = -1; write_subtitle_file_header(ctx,out); return 0; }
struct encoder_ctx *init_encoder(struct encoder_cfg *opt) { int ret; int i; struct encoder_ctx *ctx = malloc(sizeof(struct encoder_ctx)); if(!ctx) return NULL; ctx->buffer = (unsigned char *) malloc (INITIAL_ENC_BUFFER_CAPACITY); if (!ctx->buffer) { free(ctx); return NULL; } ctx->capacity=INITIAL_ENC_BUFFER_CAPACITY; ctx->srt_counter = 0; ctx->program_number = opt->program_number; ctx->send_to_srv = opt->send_to_srv; ctx->multiple_files = opt->multiple_files; ctx->first_input_file = opt->first_input_file; ret = init_output_ctx(ctx, opt); if (ret != EXIT_OK) { freep(&ctx->buffer); free(ctx); return NULL; } ctx->in_fileformat = opt->in_format; /** used in case of SUB_EOD_MARKER */ ctx->prev_start = -1; ctx->subs_delay = opt->subs_delay; ctx->last_displayed_subs_ms = 0; ctx->date_format = opt->date_format; ctx->millis_separator = opt->millis_separator; ctx->startcredits_displayed = 0; ctx->encoding = opt->encoding; ctx->write_format = opt->write_format; ctx->transcript_settings = &opt->transcript_settings; ctx->no_bom = opt->no_bom; ctx->sentence_cap = opt->sentence_cap; ctx->trim_subs = opt->trim_subs; ctx->autodash = opt->autodash; ctx->no_font_color = opt->no_font_color; ctx->no_type_setting = opt->no_type_setting; ctx->gui_mode_reports = opt->gui_mode_reports; ctx->extract = opt->extract; ctx->subline = (unsigned char *) malloc (SUBLINESIZE); if(!ctx->subline) { freep(&ctx->out); freep(&ctx->buffer); free(ctx); return NULL; } ctx->start_credits_text = opt->start_credits_text; ctx->end_credits_text = opt->end_credits_text; ctx->startcreditsnotbefore = opt->startcreditsnotbefore; ctx->startcreditsnotafter = opt->startcreditsnotafter; ctx->startcreditsforatleast = opt->startcreditsforatleast; ctx->startcreditsforatmost = opt->startcreditsforatmost; ctx->endcreditsforatleast = opt->endcreditsforatleast; ctx->endcreditsforatmost = opt->endcreditsforatmost; ctx->new_sentence = 1; // Capitalize next letter? if (opt->line_terminator_lf) ctx->encoded_crlf_length = encode_line(ctx, ctx->encoded_crlf, (unsigned char *) "\n"); else ctx->encoded_crlf_length = encode_line(ctx, ctx->encoded_crlf, (unsigned char *) "\r\n"); ctx->encoded_br_length = encode_line(ctx, ctx->encoded_br, (unsigned char *) "<br>"); for (i = 0; i < ctx->nb_out; i++) write_subtitle_file_header(ctx,ctx->out+i); ctx->dtvcc_extract = opt->dtvcc_extract; return ctx; }
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; }