From 6995ea35060753a59bfa07aa089b00d1169cd86d Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sat, 13 Jun 2020 11:41:53 +0200 Subject: [PATCH] avcodec/ccaption_dec: check for error codes --- libavcodec/ccaption_dec.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/libavcodec/ccaption_dec.c b/libavcodec/ccaption_dec.c index bf3563a0bc..9b1dbc053b 100644 --- a/libavcodec/ccaption_dec.c +++ b/libavcodec/ccaption_dec.c @@ -579,29 +579,34 @@ static void handle_pac(CCaptionSubContext *ctx, uint8_t hi, uint8_t lo) /** * @param pts it is required to set end time */ -static void handle_edm(CCaptionSubContext *ctx, int64_t pts) +static int handle_edm(CCaptionSubContext *ctx, int64_t pts) { struct Screen *screen = ctx->screen + ctx->active_screen; + int ret; // In buffered mode, keep writing to screen until it is wiped. // Before wiping the display, capture contents to emit subtitle. if (!ctx->real_time) - reap_screen(ctx, pts); + ret = reap_screen(ctx, pts); screen->row_used = 0; // In realtime mode, emit an empty caption so the last one doesn't // stay on the screen. if (ctx->real_time) - reap_screen(ctx, pts); + ret = reap_screen(ctx, pts); + + return ret; } -static void handle_eoc(CCaptionSubContext *ctx, int64_t pts) +static int handle_eoc(CCaptionSubContext *ctx, int64_t pts) { + int ret; + // In buffered mode, we wait til the *next* EOC and // reap what was already on the screen since the last EOC. if (!ctx->real_time) - handle_edm(ctx,pts); + ret = handle_edm(ctx,pts); ctx->active_screen = !ctx->active_screen; ctx->cursor_column = 0; @@ -609,7 +614,9 @@ static void handle_eoc(CCaptionSubContext *ctx, int64_t pts) // In realtime mode, we display the buffered contents (after // flipping the buffer to active above) as soon as EOC arrives. if (ctx->real_time) - reap_screen(ctx, pts); + ret = reap_screen(ctx, pts); + + return ret; } static void handle_delete_end_of_row(CCaptionSubContext *ctx, char hi, char lo) @@ -658,11 +665,12 @@ static void handle_char(CCaptionSubContext *ctx, char hi, char lo, int64_t pts) ff_dlog(ctx, "(%c)\n", hi); } -static void process_cc608(CCaptionSubContext *ctx, int64_t pts, uint8_t hi, uint8_t lo) +static int process_cc608(CCaptionSubContext *ctx, int64_t pts, uint8_t hi, uint8_t lo) { + int ret = 0; + if (hi == ctx->prev_cmd[0] && lo == ctx->prev_cmd[1]) { - /* ignore redundant command */ - return; + return 0; } /* set prev command */ @@ -706,7 +714,7 @@ static void process_cc608(CCaptionSubContext *ctx, int64_t pts, uint8_t hi, uint /* carriage return */ ff_dlog(ctx, "carriage return\n"); if (!ctx->real_time) - reap_screen(ctx, pts); + ret = reap_screen(ctx, pts); roll_up(ctx); ctx->cursor_column = 0; break; @@ -722,7 +730,7 @@ static void process_cc608(CCaptionSubContext *ctx, int64_t pts, uint8_t hi, uint case 0x2f: /* end of caption */ ff_dlog(ctx, "handle_eoc\n"); - handle_eoc(ctx, pts); + ret = handle_eoc(ctx, pts); break; default: ff_dlog(ctx, "Unknown command 0x%hhx 0x%hhx\n", hi, lo); @@ -745,6 +753,8 @@ static void process_cc608(CCaptionSubContext *ctx, int64_t pts, uint8_t hi, uint /* Ignoring all other non data code */ ff_dlog(ctx, "Unknown command 0x%hhx 0x%hhx\n", hi, lo); } + + return ret; } static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt) @@ -773,7 +783,10 @@ static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avp if(cc_type == 1) continue; else - process_cc608(ctx, start_time, *(bptr + i + 1) & 0x7f, *(bptr + i + 2) & 0x7f); + ret = process_cc608(ctx, start_time, *(bptr + i + 1) & 0x7f, *(bptr + i + 2) & 0x7f); + + if (ret < 0) + return ret; if (!ctx->buffer_changed) continue;