From d2bea3802e14994297b6d28e3093d1a667de2ef3 Mon Sep 17 00:00:00 2001 From: Amey Jain Date: Mon, 20 Mar 2017 14:03:41 +0530 Subject: [PATCH 1/4] In ref. to issue 699. 20 ms timing mis-match. modified: src/lib_ccx/general_loop.c modified: src/lib_ccx/telxcc.c --- src/lib_ccx/general_loop.c | 8 +++++--- src/lib_ccx/telxcc.c | 7 ++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lib_ccx/general_loop.c b/src/lib_ccx/general_loop.c index f77e162b..527591f1 100644 --- a/src/lib_ccx/general_loop.c +++ b/src/lib_ccx/general_loop.c @@ -1102,7 +1102,7 @@ int rcwt_loop(struct lib_ccx_ctx *ctx) int caps = 0; LLONG result; struct encoder_ctx *enc_ctx = update_encoder_list(ctx); - + struct Teletext *telctx; // As BUFSIZE is a macro this is just a reminder if (BUFSIZE < (3*0xFFFF + 10)) fatal (CCX_COMMON_EXIT_BUG_BUG, "BUFSIZE too small for RCWT caption block.\n"); @@ -1143,6 +1143,7 @@ int rcwt_loop(struct lib_ccx_ctx *ctx) dec_ctx->private_data = telxcc_init(); } dec_sub = &dec_ctx->dec_sub; + telctx =dec_ctx->private_data; /* Set minimum and current pts since rcwt has correct time */ dec_ctx->timing->min_pts = 0; @@ -1155,9 +1156,10 @@ int rcwt_loop(struct lib_ccx_ctx *ctx) { result = buffered_read(ctx->demux_ctx, buf, TELETEXT_CHUNK_LEN); ctx->demux_ctx->past += result; - if (result != TELETEXT_CHUNK_LEN) + if (result != TELETEXT_CHUNK_LEN){ + telxcc_dump_prev_page(telctx,dec_sub); break; - + } tlt_read_rcwt(dec_ctx->private_data, buf, dec_sub); if(dec_sub->got_output == CCX_TRUE) { diff --git a/src/lib_ccx/telxcc.c b/src/lib_ccx/telxcc.c index 9f3b979e..85414787 100644 --- a/src/lib_ccx/telxcc.c +++ b/src/lib_ccx/telxcc.c @@ -1002,18 +1002,19 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele ctx->transmission_mode = (transmission_mode_t) (unham_8_4(packet->data[7]) & 0x01); // FIXME: Well, this is not ETS 300 706 kosher, however we are interested in DATA_UNIT_EBU_TELETEXT_SUBTITLE only - if ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (data_unit_id != DATA_UNIT_EBU_TELETEXT_SUBTITLE)) return; + if ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (data_unit_id != DATA_UNIT_EBU_TELETEXT_SUBTITLE)/* && (ctx->page_buffer.tainted == NO)*/) return; if ((ctx->receiving_data == YES) && ( ((ctx->transmission_mode == TRANSMISSION_MODE_SERIAL) && (PAGE(page_number) != PAGE(tlt_config.page))) || ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (PAGE(page_number) != PAGE(tlt_config.page)) && (m == MAGAZINE(tlt_config.page))))) { ctx->receiving_data = NO; - return; + if(ctx->page_buffer.tainted == NO) + return; } // Page transmission is terminated, however now we are waiting for our new page - if (page_number != tlt_config.page) + if (page_number != tlt_config.page && ctx->page_buffer.tainted == NO) return; From 094a8f295a91e919ab58573cfb5e3afacd91e06c Mon Sep 17 00:00:00 2001 From: Amey Jain Date: Tue, 21 Mar 2017 01:06:00 +0530 Subject: [PATCH 2/4] Issue 699 solved. --- src/lib_ccx/telxcc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib_ccx/telxcc.c b/src/lib_ccx/telxcc.c index 85414787..632bd1b3 100644 --- a/src/lib_ccx/telxcc.c +++ b/src/lib_ccx/telxcc.c @@ -1002,7 +1002,7 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele ctx->transmission_mode = (transmission_mode_t) (unham_8_4(packet->data[7]) & 0x01); // FIXME: Well, this is not ETS 300 706 kosher, however we are interested in DATA_UNIT_EBU_TELETEXT_SUBTITLE only - if ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (data_unit_id != DATA_UNIT_EBU_TELETEXT_SUBTITLE)/* && (ctx->page_buffer.tainted == NO)*/) return; + if ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (data_unit_id != DATA_UNIT_EBU_TELETEXT_SUBTITLE) && (ctx->page_buffer.tainted == NO)) return; if ((ctx->receiving_data == YES) && ( ((ctx->transmission_mode == TRANSMISSION_MODE_SERIAL) && (PAGE(page_number) != PAGE(tlt_config.page))) || From 1b3598b2fe0cf4fca860f572900ec2d386d59d6b Mon Sep 17 00:00:00 2001 From: Amey Jain Date: Sat, 8 Apr 2017 08:34:18 +0530 Subject: [PATCH 3/4] Timing mis-match corrected. --- src/lib_ccx/lib_ccx.c | 2 +- src/lib_ccx/telxcc.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/lib_ccx/lib_ccx.c b/src/lib_ccx/lib_ccx.c index a7e8c680..192e8697 100644 --- a/src/lib_ccx/lib_ccx.c +++ b/src/lib_ccx/lib_ccx.c @@ -215,7 +215,7 @@ void dinit_libraries( struct lib_ccx_ctx **ctx) dvbsub_close_decoder(&dec_ctx->private_data); //Test memory for teletext else if (dec_ctx->codec == CCX_CODEC_TELETEXT) - telxcc_close(&dec_ctx->private_data, NULL); + telxcc_close(&dec_ctx->private_data, &dec_ctx->dec_sub); else if (dec_ctx->codec == CCX_CODEC_ISDB_CC) delete_isdb_decoder(&dec_ctx->private_data); diff --git a/src/lib_ccx/telxcc.c b/src/lib_ccx/telxcc.c index 632bd1b3..c77ce9a8 100644 --- a/src/lib_ccx/telxcc.c +++ b/src/lib_ccx/telxcc.c @@ -50,7 +50,7 @@ int _CRT_fmode = _O_BINARY; #endif long long int last_pes_pts = 0; // PTS of last PES packet (debug purposes) - +int de_ctr = 0; // a keeps count of packets with flag subtitle ON and data packets typedef struct { uint64_t show_timestamp; // show at timestamp (in ms) uint64_t hide_timestamp; // hide at timestamp (in ms) @@ -978,11 +978,13 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele ctx->seen_sub_page[thisp]=1; mprint ("\rNotice: Teletext page with possible subtitles detected: %03d\n",thisp); } + ++de_ctr; } if ((tlt_config.page == 0) && (flag_subtitle == YES) && (i < 0xff)) { tlt_config.page = (m << 8) | (unham_8_4(packet->data[1]) << 4) | unham_8_4(packet->data[0]); mprint ("- No teletext page specified, first received suitable page is %03x, not guaranteed\n", tlt_config.page); + ++de_ctr; } // Page number and control bits @@ -1002,19 +1004,19 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele ctx->transmission_mode = (transmission_mode_t) (unham_8_4(packet->data[7]) & 0x01); // FIXME: Well, this is not ETS 300 706 kosher, however we are interested in DATA_UNIT_EBU_TELETEXT_SUBTITLE only - if ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (data_unit_id != DATA_UNIT_EBU_TELETEXT_SUBTITLE) && (ctx->page_buffer.tainted == NO)) return; + if ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (data_unit_id != DATA_UNIT_EBU_TELETEXT_SUBTITLE) && !(de_ctr && flag_subtitle)) return; if ((ctx->receiving_data == YES) && ( ((ctx->transmission_mode == TRANSMISSION_MODE_SERIAL) && (PAGE(page_number) != PAGE(tlt_config.page))) || ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (PAGE(page_number) != PAGE(tlt_config.page)) && (m == MAGAZINE(tlt_config.page))))) { ctx->receiving_data = NO; - if(ctx->page_buffer.tainted == NO) + if(!(de_ctr && flag_subtitle)) return; } // Page transmission is terminated, however now we are waiting for our new page - if (page_number != tlt_config.page && ctx->page_buffer.tainted == NO) + if (page_number != tlt_config.page && !(de_ctr && flag_subtitle)) return; @@ -1037,6 +1039,7 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele ctx->page_buffer.hide_timestamp = 0; } process_page(ctx, &ctx->page_buffer, sub); + de_ctr = 0; } ctx->page_buffer.show_timestamp = timestamp; @@ -1073,6 +1076,7 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele ctx->page_buffer.text[y][i] = packet->data[i]; } ctx->page_buffer.tainted = YES; + --de_ctr; } else if ((m == MAGAZINE(tlt_config.page)) && (y == 26) && (ctx->receiving_data == YES)) { From 1513b7c42f2fe08e64a9d537c46889b81d852f8d Mon Sep 17 00:00:00 2001 From: Amey Jain Date: Tue, 11 Apr 2017 10:44:44 +0530 Subject: [PATCH 4/4] Timing for sample #70 corrected. --- src/lib_ccx/telxcc.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/lib_ccx/telxcc.c b/src/lib_ccx/telxcc.c index c77ce9a8..316530ec 100644 --- a/src/lib_ccx/telxcc.c +++ b/src/lib_ccx/telxcc.c @@ -50,7 +50,7 @@ int _CRT_fmode = _O_BINARY; #endif long long int last_pes_pts = 0; // PTS of last PES packet (debug purposes) -int de_ctr = 0; // a keeps count of packets with flag subtitle ON and data packets +static int de_ctr = 0; // a keeps count of packets with flag subtitle ON and data packets typedef struct { uint64_t show_timestamp; // show at timestamp (in ms) uint64_t hide_timestamp; // hide at timestamp (in ms) @@ -955,7 +955,7 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele if (m == 0) m = 8; y = (address >> 3) & 0x1f; designation_code = (y > 25) ? unham_8_4(packet->data[0]) : 0x00; - + uint8_t flag_subtitle; if (y == 0) { @@ -978,14 +978,12 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele ctx->seen_sub_page[thisp]=1; mprint ("\rNotice: Teletext page with possible subtitles detected: %03d\n",thisp); } - ++de_ctr; } if ((tlt_config.page == 0) && (flag_subtitle == YES) && (i < 0xff)) { tlt_config.page = (m << 8) | (unham_8_4(packet->data[1]) << 4) | unham_8_4(packet->data[0]); mprint ("- No teletext page specified, first received suitable page is %03x, not guaranteed\n", tlt_config.page); - ++de_ctr; - } + } // Page number and control bits page_number = (m << 8) | (unham_8_4(packet->data[1]) << 4) | unham_8_4(packet->data[0]); @@ -1004,7 +1002,7 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele ctx->transmission_mode = (transmission_mode_t) (unham_8_4(packet->data[7]) & 0x01); // FIXME: Well, this is not ETS 300 706 kosher, however we are interested in DATA_UNIT_EBU_TELETEXT_SUBTITLE only - if ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (data_unit_id != DATA_UNIT_EBU_TELETEXT_SUBTITLE) && !(de_ctr && flag_subtitle)) return; + if ((ctx->transmission_mode == TRANSMISSION_MODE_PARALLEL) && (data_unit_id != DATA_UNIT_EBU_TELETEXT_SUBTITLE) && !(de_ctr && flag_subtitle && ctx->receiving_data == YES)) return; if ((ctx->receiving_data == YES) && ( ((ctx->transmission_mode == TRANSMISSION_MODE_SERIAL) && (PAGE(page_number) != PAGE(tlt_config.page))) || @@ -1016,7 +1014,7 @@ void process_telx_packet(struct TeletextCtx *ctx, data_unit_t data_unit_id, tele } // Page transmission is terminated, however now we are waiting for our new page - if (page_number != tlt_config.page && !(de_ctr && flag_subtitle)) + if (page_number != tlt_config.page && !(de_ctr && flag_subtitle && ctx->receiving_data == YES)) return;