mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
lavc/ccaption_dec: remove usage of avctx->time_base
lavc/utils already rescales avpkt->pts to sub->pts in AV_TIME_BASE_Q before calling the decode callback. This prevents from rescaling again into the decoder, and avoid the use of avctx->time_base which will disappear in the incoming codecpar merge. This commit also replaces the use of "20 centisecond" (ass time base) with "200 ms".
This commit is contained in:
parent
e8a9b64410
commit
d8620158c7
@ -30,7 +30,7 @@
|
|||||||
#define UNSET_FLAG(var, val) ( (var) &= ~( 1 << (val)) )
|
#define UNSET_FLAG(var, val) ( (var) &= ~( 1 << (val)) )
|
||||||
#define CHECK_FLAG(var, val) ( (var) & ( 1 << (val)) )
|
#define CHECK_FLAG(var, val) ( (var) & ( 1 << (val)) )
|
||||||
|
|
||||||
static const AVRational ass_tb = {1, 100};
|
static const AVRational ms_tb = {1, 1000};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO list
|
* TODO list
|
||||||
@ -723,6 +723,7 @@ static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avp
|
|||||||
{
|
{
|
||||||
CCaptionSubContext *ctx = avctx->priv_data;
|
CCaptionSubContext *ctx = avctx->priv_data;
|
||||||
AVSubtitle *sub = data;
|
AVSubtitle *sub = data;
|
||||||
|
const int64_t start_time = sub->pts;
|
||||||
uint8_t *bptr = NULL;
|
uint8_t *bptr = NULL;
|
||||||
int len = avpkt->size;
|
int len = avpkt->size;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -747,7 +748,7 @@ static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avp
|
|||||||
if(cc_type == 1)
|
if(cc_type == 1)
|
||||||
continue;
|
continue;
|
||||||
else
|
else
|
||||||
process_cc608(ctx, avpkt->pts, *(bptr + i + 1) & 0x7f, *(bptr + i + 2) & 0x7f);
|
process_cc608(ctx, start_time, *(bptr + i + 1) & 0x7f, *(bptr + i + 2) & 0x7f);
|
||||||
|
|
||||||
if (!ctx->buffer_changed)
|
if (!ctx->buffer_changed)
|
||||||
continue;
|
continue;
|
||||||
@ -759,21 +760,21 @@ static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avp
|
|||||||
ret = ff_ass_add_rect(sub, ctx->buffer.str, ctx->readorder++, 0, NULL, NULL);
|
ret = ff_ass_add_rect(sub, ctx->buffer.str, ctx->readorder++, 0, NULL, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
sub->pts = av_rescale_q(ctx->start_time, avctx->time_base, AV_TIME_BASE_Q);
|
sub->pts = ctx->start_time;
|
||||||
if (!ctx->real_time)
|
if (!ctx->real_time)
|
||||||
sub->end_display_time = av_rescale_q(ctx->end_time - ctx->start_time,
|
sub->end_display_time = av_rescale_q(ctx->end_time - ctx->start_time,
|
||||||
avctx->time_base, av_make_q(1, 1000));
|
AV_TIME_BASE_Q, ms_tb);
|
||||||
else
|
else
|
||||||
sub->end_display_time = -1;
|
sub->end_display_time = -1;
|
||||||
ctx->buffer_changed = 0;
|
ctx->buffer_changed = 0;
|
||||||
ctx->last_real_time = avpkt->pts;
|
ctx->last_real_time = sub->pts;
|
||||||
ctx->screen_touched = 0;
|
ctx->screen_touched = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->real_time && ctx->screen_touched &&
|
if (ctx->real_time && ctx->screen_touched &&
|
||||||
avpkt->pts > ctx->last_real_time + av_rescale_q(20, ass_tb, avctx->time_base)) {
|
sub->pts > ctx->last_real_time + av_rescale_q(200, ms_tb, AV_TIME_BASE_Q)) {
|
||||||
ctx->last_real_time = avpkt->pts;
|
ctx->last_real_time = sub->pts;
|
||||||
ctx->screen_touched = 0;
|
ctx->screen_touched = 0;
|
||||||
|
|
||||||
capture_screen(ctx);
|
capture_screen(ctx);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user