[FFmpeg-devel] [PATCH 4/6] ffmpeg: use PTS from the AVSubtitle structure.
Nicolas George
nicolas.george at normalesup.org
Sun Sep 9 16:50:18 CEST 2012
Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
---
ffmpeg.c | 17 +++++++----------
ffmpeg.h | 1 -
2 files changed, 7 insertions(+), 11 deletions(-)
This patch fixes trac ticket #1722 in the case when ffmpeg is used to
transcode the subtitles.
diff --git a/ffmpeg.c b/ffmpeg.c
index e495da8..9d6ec40 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -688,15 +688,15 @@ static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void *
static void do_subtitle_out(AVFormatContext *s,
OutputStream *ost,
InputStream *ist,
- AVSubtitle *sub,
- int64_t pts)
+ AVSubtitle *sub)
{
int subtitle_out_max_size = 1024 * 1024;
int subtitle_out_size, nb, i;
AVCodecContext *enc;
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");
if (exit_on_error)
exit_program(1);
@@ -718,8 +718,7 @@ static void do_subtitle_out(AVFormatContext *s,
nb = 1;
/* 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)
- - output_files[ost->file_index]->start_time;
+ pts = sub->pts - output_files[ost->file_index]->start_time;
for (i = 0; i < nb; i++) {
ost->sync_opts = av_rescale_q(pts, AV_TIME_BASE_Q, enc->time_base);
if (!check_recording_time(ost))
@@ -1652,7 +1651,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
{
AVSubtitle subtitle;
- int64_t pts = pkt->pts;
int i, ret = avcodec_decode_subtitle2(ist->st->codec,
&subtitle, got_output, pkt);
if (ret < 0 || !*got_output) {
@@ -1663,8 +1661,8 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
if (ist->fix_sub_duration) {
if (ist->prev_sub.got_output) {
- int end = av_rescale_q(pts - ist->prev_sub.pts, ist->st->time_base,
- (AVRational){ 1, 1000 });
+ int end = av_rescale(subtitle.pts - ist->prev_sub.subtitle.pts,
+ 1000, AV_TIME_BASE);
if (end < ist->prev_sub.subtitle.end_display_time) {
av_log(ist->st->codec, AV_LOG_DEBUG,
"Subtitle duration reduced from %d to %d\n",
@@ -1672,7 +1670,6 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
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, ret, ist->prev_sub.ret);
FFSWAP(AVSubtitle, subtitle, ist->prev_sub.subtitle);
@@ -1691,7 +1688,7 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
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);
diff --git a/ffmpeg.h b/ffmpeg.h
index cd849c9..85a11a0 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -232,7 +232,6 @@ typedef struct InputStream {
int fix_sub_duration;
struct { /* previous decoded subtitle and related variables */
- int64_t pts;
int got_output;
int ret;
AVSubtitle subtitle;
--
1.7.10.4
More information about the ffmpeg-devel
mailing list