X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fccaption_dec.c;h=d3f32ddde946e36f5c479035fc2af0bd4bdbff21;hb=31fe3c4d23aab8b43614b1ea825603080775677e;hp=237272c5cdf2bb0d9f2d94d9977028138d6e5f77;hpb=133aa68601d5dfd148826927b0c154605ec9f01e;p=ffmpeg diff --git a/libavcodec/ccaption_dec.c b/libavcodec/ccaption_dec.c index 237272c5cdf..d3f32ddde94 100644 --- a/libavcodec/ccaption_dec.c +++ b/libavcodec/ccaption_dec.c @@ -248,6 +248,7 @@ typedef struct CCaptionSubContext { char prev_cmd[2]; /* buffer to store pkt data */ AVBufferRef *pktbuf; + int readorder; } CCaptionSubContext; @@ -306,6 +307,8 @@ static void flush_decoder(AVCodecContext *avctx) ctx->last_real_time = 0; ctx->screen_touched = 0; ctx->buffer_changed = 0; + if (!(avctx->flags2 & AV_CODEC_FLAG2_RO_FLUSH_NOOP)) + ctx->readorder = 0; av_bprint_clear(&ctx->buffer); } @@ -752,18 +755,16 @@ static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avp if (*ctx->buffer.str || ctx->real_time) { - int64_t sub_pts = ctx->real_time ? avpkt->pts : ctx->start_time; - int start_time = av_rescale_q(sub_pts, avctx->time_base, ass_tb); - int duration = -1; - if (!ctx->real_time) { - int end_time = av_rescale_q(ctx->end_time, avctx->time_base, ass_tb); - duration = end_time - start_time; - } ff_dlog(ctx, "cdp writing data (%s)\n",ctx->buffer.str); - ret = ff_ass_add_rect_bprint(sub, &ctx->buffer, start_time, duration); + ret = ff_ass_add_rect(sub, ctx->buffer.str, ctx->readorder++, 0, NULL, NULL); if (ret < 0) return ret; - sub->pts = av_rescale_q(sub_pts, avctx->time_base, AV_TIME_BASE_Q); + sub->pts = av_rescale_q(ctx->start_time, avctx->time_base, AV_TIME_BASE_Q); + if (!ctx->real_time) + sub->end_display_time = av_rescale_q(ctx->end_time - ctx->start_time, + avctx->time_base, av_make_q(1, 1000)); + else + sub->end_display_time = -1; ctx->buffer_changed = 0; ctx->last_real_time = avpkt->pts; ctx->screen_touched = 0; @@ -772,18 +773,16 @@ static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avp if (ctx->real_time && ctx->screen_touched && avpkt->pts > ctx->last_real_time + av_rescale_q(20, ass_tb, avctx->time_base)) { - int start_time; ctx->last_real_time = avpkt->pts; ctx->screen_touched = 0; capture_screen(ctx); ctx->buffer_changed = 0; - start_time = av_rescale_q(avpkt->pts, avctx->time_base, ass_tb); - ret = ff_ass_add_rect_bprint(sub, &ctx->buffer, start_time, -1); + ret = ff_ass_add_rect(sub, ctx->buffer.str, ctx->readorder++, 0, NULL, NULL); if (ret < 0) return ret; - sub->pts = av_rescale_q(avpkt->pts, avctx->time_base, AV_TIME_BASE_Q); + sub->end_display_time = -1; } *got_sub = sub->num_rects > 0;