mirror of https://git.ffmpeg.org/ffmpeg.git
ffmpeg: use PTS from the AVSubtitle structure.
This commit is contained in:
parent
37bbc9eb8b
commit
6d8b32633e
17
ffmpeg.c
17
ffmpeg.c
|
@ -693,15 +693,15 @@ static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void *
|
||||||
static void do_subtitle_out(AVFormatContext *s,
|
static void do_subtitle_out(AVFormatContext *s,
|
||||||
OutputStream *ost,
|
OutputStream *ost,
|
||||||
InputStream *ist,
|
InputStream *ist,
|
||||||
AVSubtitle *sub,
|
AVSubtitle *sub)
|
||||||
int64_t pts)
|
|
||||||
{
|
{
|
||||||
int subtitle_out_max_size = 1024 * 1024;
|
int subtitle_out_max_size = 1024 * 1024;
|
||||||
int subtitle_out_size, nb, i;
|
int subtitle_out_size, nb, i;
|
||||||
AVCodecContext *enc;
|
AVCodecContext *enc;
|
||||||
AVPacket pkt;
|
AVPacket pkt;
|
||||||
|
int64_t pts;
|
||||||
|
|
||||||
if (pts == AV_NOPTS_VALUE) {
|
if (sub->pts == AV_NOPTS_VALUE) {
|
||||||
av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
|
av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
|
||||||
if (exit_on_error)
|
if (exit_on_error)
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
|
@ -723,8 +723,7 @@ static void do_subtitle_out(AVFormatContext *s,
|
||||||
nb = 1;
|
nb = 1;
|
||||||
|
|
||||||
/* shift timestamp to honor -ss and make check_recording_time() work with -t */
|
/* shift timestamp to honor -ss and make check_recording_time() work with -t */
|
||||||
pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q)
|
pts = sub->pts - output_files[ost->file_index]->start_time;
|
||||||
- output_files[ost->file_index]->start_time;
|
|
||||||
for (i = 0; i < nb; i++) {
|
for (i = 0; i < nb; i++) {
|
||||||
ost->sync_opts = av_rescale_q(pts, AV_TIME_BASE_Q, enc->time_base);
|
ost->sync_opts = av_rescale_q(pts, AV_TIME_BASE_Q, enc->time_base);
|
||||||
if (!check_recording_time(ost))
|
if (!check_recording_time(ost))
|
||||||
|
@ -1657,7 +1656,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||||
static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
|
static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||||
{
|
{
|
||||||
AVSubtitle subtitle;
|
AVSubtitle subtitle;
|
||||||
int64_t pts = pkt->pts;
|
|
||||||
int i, ret = avcodec_decode_subtitle2(ist->st->codec,
|
int i, ret = avcodec_decode_subtitle2(ist->st->codec,
|
||||||
&subtitle, got_output, pkt);
|
&subtitle, got_output, pkt);
|
||||||
if (ret < 0 || !*got_output) {
|
if (ret < 0 || !*got_output) {
|
||||||
|
@ -1668,8 +1666,8 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||||
|
|
||||||
if (ist->fix_sub_duration) {
|
if (ist->fix_sub_duration) {
|
||||||
if (ist->prev_sub.got_output) {
|
if (ist->prev_sub.got_output) {
|
||||||
int end = av_rescale_q(pts - ist->prev_sub.pts, ist->st->time_base,
|
int end = av_rescale(subtitle.pts - ist->prev_sub.subtitle.pts,
|
||||||
(AVRational){ 1, 1000 });
|
1000, AV_TIME_BASE);
|
||||||
if (end < ist->prev_sub.subtitle.end_display_time) {
|
if (end < ist->prev_sub.subtitle.end_display_time) {
|
||||||
av_log(ist->st->codec, AV_LOG_DEBUG,
|
av_log(ist->st->codec, AV_LOG_DEBUG,
|
||||||
"Subtitle duration reduced from %d to %d\n",
|
"Subtitle duration reduced from %d to %d\n",
|
||||||
|
@ -1677,7 +1675,6 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||||
ist->prev_sub.subtitle.end_display_time = end;
|
ist->prev_sub.subtitle.end_display_time = end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FFSWAP(int64_t, pts, ist->prev_sub.pts);
|
|
||||||
FFSWAP(int, *got_output, ist->prev_sub.got_output);
|
FFSWAP(int, *got_output, ist->prev_sub.got_output);
|
||||||
FFSWAP(int, ret, ist->prev_sub.ret);
|
FFSWAP(int, ret, ist->prev_sub.ret);
|
||||||
FFSWAP(AVSubtitle, subtitle, ist->prev_sub.subtitle);
|
FFSWAP(AVSubtitle, subtitle, ist->prev_sub.subtitle);
|
||||||
|
@ -1696,7 +1693,7 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||||
if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
|
if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pts);
|
do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle);
|
||||||
}
|
}
|
||||||
|
|
||||||
avsubtitle_free(&subtitle);
|
avsubtitle_free(&subtitle);
|
||||||
|
|
1
ffmpeg.h
1
ffmpeg.h
|
@ -232,7 +232,6 @@ typedef struct InputStream {
|
||||||
|
|
||||||
int fix_sub_duration;
|
int fix_sub_duration;
|
||||||
struct { /* previous decoded subtitle and related variables */
|
struct { /* previous decoded subtitle and related variables */
|
||||||
int64_t pts;
|
|
||||||
int got_output;
|
int got_output;
|
||||||
int ret;
|
int ret;
|
||||||
AVSubtitle subtitle;
|
AVSubtitle subtitle;
|
||||||
|
|
Loading…
Reference in New Issue