From a7879777d6aa35a61f4fe27596432adc715964dc Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Sun, 12 Jun 2011 14:56:55 +1000 Subject: [PATCH] Fix A/V sync for FIFO transcoding with passthrough audio. Allow to transcode file keeping the original audio content untouched while preserving A/V sync. Thanks to Paul Gardiner for the A/V sync fix. --- mythtv/programs/mythtranscode/transcode.cpp | 24 +++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/mythtv/programs/mythtranscode/transcode.cpp b/mythtv/programs/mythtranscode/transcode.cpp index aae986467d1..a5b144191c0 100644 --- a/mythtv/programs/mythtranscode/transcode.cpp +++ b/mythtv/programs/mythtranscode/transcode.cpp @@ -78,6 +78,7 @@ class AudioReencodeBuffer : public AudioOutput virtual void Reset(void) { audiobuffer_len = 0; + audiobuffer_frames = 0; ab_count = 0; } @@ -107,7 +108,8 @@ class AudioReencodeBuffer : public AudioOutput memcpy(audiobuffer + audiobuffer_len, buffer, len); - audiobuffer_len += len; + audiobuffer_len += len; + audiobuffer_frames += frames; // last_audiotime is at the end of the frame last_audiotime = timecode + frames * 1000 / @@ -222,7 +224,8 @@ class AudioReencodeBuffer : public AudioOutput int ab_offset[128]; long long ab_time[128]; unsigned char *audiobuffer; - int audiobuffer_len, channels, bits, bytes_per_frame, eff_audiorate; + int audiobuffer_len, audiobuffer_frames; + int channels, bits, bytes_per_frame, eff_audiorate; long long last_audiotime; private: bool m_passthru, m_initpassthru; @@ -785,8 +788,8 @@ int Transcode::TranscodeFile( long long lasttimecode = 0; long long timecodeOffset = 0; - float rateTimeConv = arb->eff_audiorate * arb->bytes_per_frame / 1000.0; - float vidFrameTime = 1000.0 / video_frame_rate; + float rateTimeConv = arb->eff_audiorate / 1000.0f; + float vidFrameTime = 1000.0f / video_frame_rate; int wait_recover = 0; VideoOutput *videoOutput = player->getVideoOutput(); bool is_key = 0; @@ -824,7 +827,7 @@ int Transcode::TranscodeFile( if (fifow) { frame.buf = lastDecode->buf; - totalAudio += arb->audiobuffer_len; + totalAudio += arb->audiobuffer_frames; int audbufTime = (int)(totalAudio / rateTimeConv); int auddelta = arb->last_audiotime - audbufTime; int vidTime = (int)(curFrameNum * vidFrameTime + 0.5); @@ -832,10 +835,13 @@ int Transcode::TranscodeFile( int delta = viddelta - auddelta; if (abs(delta) < 500 && abs(delta) >= vidFrameTime) { - QString msg = QString("Audio is %1ms %2 video at # %3") - .arg(abs(delta)) - .arg(((delta > 0) ? "ahead of" : "behind")) - .arg((int)curFrameNum); + QString msg = QString("Audio is %1ms %2 video at # %3: " + "auddelta=%4, viddelta=%5") + .arg(abs(delta)) + .arg(((delta > 0) ? "ahead of" : "behind")) + .arg((int)curFrameNum) + .arg(auddelta) + .arg(viddelta); VERBOSE(VB_GENERAL, msg); dropvideo = (delta > 0) ? 1 : -1; wait_recover = 0;