[FFmpeg-devel] libavdevice/lavfi.c: adjust subcc_packet->pts to be in 90 timebase

Submitted by Chris Landry on Oct. 1, 2016, 6:15 p.m.

Details

Message ID 1475345719-71314-1-git-send-email-topher.p.landry@gmail.comm
State New
Headers show

Commit Message

Chris Landry Oct. 1, 2016, 6:15 p.m.
From: Chris Landry <topher.p.landry@gmail.com>

When a video stream timebase is not 90k, the cc packet pts is relevant to the timebase of the video stream, but later is assumed to be 90k. Adjust it here to be 90k so timing is accurate in resulting subs.

Signed-off-by: Chris Landry <topher.p.landry@gmail.com>
---
 libavdevice/lavfi.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c
index f9b2694..ffe5e0e 100644
--- a/libavdevice/lavfi.c
+++ b/libavdevice/lavfi.c
@@ -58,6 +58,7 @@  typedef struct {
     AVFrame *decoded_frame;
     int nb_sinks;
     AVPacket subcc_packet;
+    AVRational video_time_base;
 } LavfiContext;
 
 static int *create_all_formats(int n)
@@ -317,6 +318,8 @@  av_cold static int lavfi_read_header(AVFormatContext *avctx)
         st->codecpar->codec_type = link->type;
         avpriv_set_pts_info(st, 64, link->time_base.num, link->time_base.den);
         if (link->type == AVMEDIA_TYPE_VIDEO) {
+            lavfi->video_time_base = link->time_base;
+
             st->codecpar->codec_id   = AV_CODEC_ID_RAWVIDEO;
             st->codecpar->format     = link->format;
             st->codecpar->width      = link->w;
@@ -373,8 +376,14 @@  static int create_subcc_packet(AVFormatContext *avctx, AVFrame *frame,
     if ((ret = av_new_packet(&lavfi->subcc_packet, sd->size)) < 0)
         return ret;
     memcpy(lavfi->subcc_packet.data, sd->data, sd->size);
+
+    AVRational time_base = lavfi->video_time_base;
+
+    double adjust_factor = time_base.den / (90000.0 * time_base.num);
+    double pts = frame->pts / adjust_factor;
+
     lavfi->subcc_packet.stream_index = stream_idx;
-    lavfi->subcc_packet.pts = frame->pts;
+    lavfi->subcc_packet.pts = (int64_t)pts;
     lavfi->subcc_packet.pos = av_frame_get_pkt_pos(frame);
     return 0;
 }