int ocr_rect(void* arg, struct cc_bitmap *rect, char **str) { int ret = 0; png_color *palette = NULL; png_byte *alpha = NULL; palette = (png_color*) malloc(rect->nb_colors * sizeof(png_color)); if(!palette) { ret = -1; goto end; } alpha = (png_byte*) malloc(rect->nb_colors * sizeof(png_byte)); if(!alpha) { ret = -1; goto end; } mapclut_paletee(palette, alpha, (uint32_t *)rect->data[1],rect->nb_colors); quantize_map(alpha, palette, rect->data[0], rect->w * rect->h, 3, rect->nb_colors); *str = ocr_bitmap(arg, palette, alpha, rect->data[0], rect->w, rect->h); end: freep(&palette); freep(&alpha); return ret; }
int write_cc_bitmap_as_transcript(struct cc_subtitle *sub, struct encoder_ctx *context) { struct spupng_t *sp = (struct spupng_t *)context->out->spupng_data; int x_pos, y_pos, width, height, i; int x, y, y_off, x_off, ret; uint8_t *pbuf; //char *filename; struct cc_bitmap* rect; png_color *palette = NULL; png_byte *alpha = NULL; #ifdef ENABLE_OCR char*str = NULL; #endif //int used; #ifdef ENABLE_OCR unsigned h1,m1,s1,ms1; unsigned h2,m2,s2,ms2; #endif LLONG start_time, end_time; //char timeline[128]; int len = 0; x_pos = -1; y_pos = -1; width = 0; height = 0; if (context->prev_start != -1 && (sub->flags & SUB_EOD_MARKER)) { start_time = context->prev_start + context->subs_delay; end_time = sub->start_time - 1; } else if ( !(sub->flags & SUB_EOD_MARKER)) { start_time = sub->start_time + context->subs_delay; end_time = sub->end_time - 1; } if(sub->nb_data == 0 ) return 0; rect = sub->data; for(i = 0;i < sub->nb_data;i++) { if(x_pos == -1) { x_pos = rect[i].x; y_pos = rect[i].y; width = rect[i].w; height = rect[i].h; } else { if(x_pos > rect[i].x) { width += (x_pos - rect[i].x); x_pos = rect[i].x; } if (rect[i].y < y_pos) { height += (y_pos - rect[i].y); y_pos = rect[i].y; } if (rect[i].x + rect[i].w > x_pos + width) { width = rect[i].x + rect[i].w - x_pos; } if (rect[i].y + rect[i].h > y_pos + height) { height = rect[i].y + rect[i].h - y_pos; } } } if ( sub->flags & SUB_EOD_MARKER ) context->prev_start = sub->start_time; pbuf = (uint8_t*) malloc(width * height); memset(pbuf, 0x0, width * height); for(i = 0;i < sub->nb_data;i++) { x_off = rect[i].x - x_pos; y_off = rect[i].y - y_pos; for (y = 0; y < rect[i].h; y++) { for (x = 0; x < rect[i].w; x++) pbuf[((y + y_off) * width) + x_off + x] = rect[i].data[0][y * rect[i].w + x]; } } palette = (png_color*) malloc(rect[0].nb_colors * sizeof(png_color)); if(!palette) { ret = -1; goto end; } alpha = (png_byte*) malloc(rect[0].nb_colors * sizeof(png_byte)); if(!alpha) { ret = -1; goto end; } /* TODO do rectangle, wise one color table should not be used for all rectangle */ mapclut_paletee(palette, alpha, (uint32_t *)rect[0].data[1],rect[0].nb_colors); quantize_map(alpha, palette, pbuf, width*height, 3, rect[0].nb_colors); #ifdef ENABLE_OCR str = ocr_bitmap(palette,alpha,pbuf,width,height); if(str && str[0]) { if (context->prev_start != -1 || !(sub->flags & SUB_EOD_MARKER)) { char *token = NULL; token = strtok(str,"\r\n"); while (token) { if (ccx_options.transcript_settings.showStartTime) { char buf1[80]; if (ccx_options.transcript_settings.relativeTimestamp) { millis_to_date(start_time + context->subs_delay, buf1); fdprintf(context->out->fh, "%s|", buf1); } else { mstotime(start_time + context->subs_delay, &h1, &m1, &s1, &ms1); time_t start_time_int = (start_time + context->subs_delay) / 1000; int start_time_dec = (start_time + context->subs_delay) % 1000; struct tm *start_time_struct = gmtime(&start_time_int); strftime(buf1, sizeof(buf1), "%Y%m%d%H%M%S", start_time_struct); fdprintf(context->out->fh, "%s%c%03d|", buf1,ccx_options.millis_separator,start_time_dec); } } if (ccx_options.transcript_settings.showEndTime) { char buf2[80]; if (ccx_options.transcript_settings.relativeTimestamp) { millis_to_date(end_time, buf2); fdprintf(context->out->fh, "%s|", buf2); } else { mstotime(get_fts() + context->subs_delay, &h2, &m2, &s2, &ms2); time_t end_time_int = end_time / 1000; int end_time_dec = end_time % 1000; struct tm *end_time_struct = gmtime(&end_time_int); strftime(buf2, sizeof(buf2), "%Y%m%d%H%M%S", end_time_struct); fdprintf(context->out->fh, "%s%c%03d|", buf2,ccx_options.millis_separator,end_time_dec); } } if (ccx_options.transcript_settings.showCC) { fdprintf(context->out->fh,"%s|",language[sub->lang_index]); } if (ccx_options.transcript_settings.showMode) { fdprintf(context->out->fh,"DVB|"); } fdprintf(context->out->fh,"%s\n",token); token = strtok(NULL,"\r\n"); } } } #endif end: sub->nb_data = 0; freep(&sub->data); freep(&palette); freep(&alpha); return ret; }