From b0b2ba4d5c9f59e228e211f0ed82cbd63c8c20bd Mon Sep 17 00:00:00 2001
From: Karl Dietz <dekarl@mythtv.org>
Date: Fri, 11 Oct 2013 22:10:44 +0200
Subject: [PATCH 1/2] write video first so the first audio frame gets a proper
 timecode
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Patch by Nicolas Pöhlmann
Reviewed by Paul Gardiner

Refs #11639
Fixes #11858
---
 mythtv/programs/mythtranscode/transcode.cpp |  100 +++++++++++++--------------
 1 file changed, 50 insertions(+), 50 deletions(-)

diff --git a/mythtv/programs/mythtranscode/transcode.cpp b/mythtv/programs/mythtranscode/transcode.cpp
index 9cfa27d..d35f8b8 100644
--- a/mythtv/programs/mythtranscode/transcode.cpp
+++ b/mythtv/programs/mythtranscode/transcode.cpp
@@ -1332,6 +1332,56 @@ int Transcode::TranscodeFile(const QString &inputname,
                           imageOut.data, imageOut.linesize);
             }
 
+            if (!avfMode)
+            {
+                GetPlayer()->GetCC608Reader()->
+                    TranscodeWriteText(&TranscodeWriteText, (void *)(nvr));
+            }
+            lasttimecode = frame.timecode;
+            frame.timecode -= timecodeOffset;
+
+            if (avfMode)
+            {
+                if (halfFramerate && !skippedLastFrame)
+                {
+                    skippedLastFrame = true;
+                }
+                else
+                {
+                    skippedLastFrame = false;
+
+                    if ((hls) &&
+                        (avfw->GetFramesWritten()) &&
+                        (hlsSegmentFrames > hlsSegmentSize) &&
+                        (avfw->NextFrameIsKeyFrame()))
+                    {
+                        hls->AddSegment();
+                        avfw->ReOpen(hls->GetCurrentFilename());
+
+                        if (avfw2)
+                            avfw2->ReOpen(hls->GetCurrentFilename(true));
+
+                        hlsSegmentFrames = 0;
+                    }
+
+                    if (avfw->WriteVideoFrame(&frame) > 0)
+                    {
+                        lastWrittenTime = frame.timecode;
+                        if (hls)
+                            ++hlsSegmentFrames;
+                    }
+
+                }
+            }
+            else
+            {
+                if (forceKeyFrames)
+                    nvr->WriteVideo(&frame, true, true);
+                else
+                    nvr->WriteVideo(&frame);
+                lastWrittenTime = frame.timecode;
+            }
+
             // audio is fully decoded, so we need to reencode it
             AudioBuffer *ab = NULL;
             while ((ab = arb->GetData(lastWrittenTime)) != NULL)
@@ -1382,56 +1432,6 @@ int Transcode::TranscodeFile(const QString &inputname,
 
                 delete ab;
             }
-
-            if (!avfMode)
-            {
-                GetPlayer()->GetCC608Reader()->
-                    TranscodeWriteText(&TranscodeWriteText, (void *)(nvr));
-            }
-            lasttimecode = frame.timecode;
-            frame.timecode -= timecodeOffset;
-
-            if (avfMode)
-            {
-                if (halfFramerate && !skippedLastFrame)
-                {
-                    skippedLastFrame = true;
-                }
-                else
-                {
-                    skippedLastFrame = false;
-
-                    if ((hls) &&
-                        (avfw->GetFramesWritten()) &&
-                        (hlsSegmentFrames > hlsSegmentSize) &&
-                        (avfw->NextFrameIsKeyFrame()))
-                    {
-                        hls->AddSegment();
-                        avfw->ReOpen(hls->GetCurrentFilename());
-
-                        if (avfw2)
-                            avfw2->ReOpen(hls->GetCurrentFilename(true));
-
-                        hlsSegmentFrames = 0;
-                    }
-
-                    if (avfw->WriteVideoFrame(&frame) > 0)
-                    {
-                        lastWrittenTime = frame.timecode;
-                        if (hls)
-                            ++hlsSegmentFrames;
-                    }
-
-                }
-            }
-            else
-            {
-                if (forceKeyFrames)
-                    nvr->WriteVideo(&frame, true, true);
-                else
-                    nvr->WriteVideo(&frame);
-                lastWrittenTime = frame.timecode;
-            }
         }
         if (MythDate::current() > statustime)
         {
-- 
1.7.9.5

