Commit 6d8b3263 authored by Nicolas George's avatar Nicolas George

ffmpeg: use PTS from the AVSubtitle structure.

parent 37bbc9eb
...@@ -693,15 +693,15 @@ static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void * ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
...@@ -232,7 +232,6 @@ typedef struct InputStream { ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment