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
|
b
|
int Transcode::TranscodeFile(const QString &inputname,
|
| 1332 | 1332 | imageOut.data, imageOut.linesize); |
| 1333 | 1333 | } |
| 1334 | 1334 | |
| | 1335 | if (!avfMode) |
| | 1336 | { |
| | 1337 | GetPlayer()->GetCC608Reader()-> |
| | 1338 | TranscodeWriteText(&TranscodeWriteText, (void *)(nvr)); |
| | 1339 | } |
| | 1340 | lasttimecode = frame.timecode; |
| | 1341 | frame.timecode -= timecodeOffset; |
| | 1342 | |
| | 1343 | if (avfMode) |
| | 1344 | { |
| | 1345 | if (halfFramerate && !skippedLastFrame) |
| | 1346 | { |
| | 1347 | skippedLastFrame = true; |
| | 1348 | } |
| | 1349 | else |
| | 1350 | { |
| | 1351 | skippedLastFrame = false; |
| | 1352 | |
| | 1353 | if ((hls) && |
| | 1354 | (avfw->GetFramesWritten()) && |
| | 1355 | (hlsSegmentFrames > hlsSegmentSize) && |
| | 1356 | (avfw->NextFrameIsKeyFrame())) |
| | 1357 | { |
| | 1358 | hls->AddSegment(); |
| | 1359 | avfw->ReOpen(hls->GetCurrentFilename()); |
| | 1360 | |
| | 1361 | if (avfw2) |
| | 1362 | avfw2->ReOpen(hls->GetCurrentFilename(true)); |
| | 1363 | |
| | 1364 | hlsSegmentFrames = 0; |
| | 1365 | } |
| | 1366 | |
| | 1367 | if (avfw->WriteVideoFrame(&frame) > 0) |
| | 1368 | { |
| | 1369 | lastWrittenTime = frame.timecode; |
| | 1370 | if (hls) |
| | 1371 | ++hlsSegmentFrames; |
| | 1372 | } |
| | 1373 | |
| | 1374 | } |
| | 1375 | } |
| | 1376 | else |
| | 1377 | { |
| | 1378 | if (forceKeyFrames) |
| | 1379 | nvr->WriteVideo(&frame, true, true); |
| | 1380 | else |
| | 1381 | nvr->WriteVideo(&frame); |
| | 1382 | lastWrittenTime = frame.timecode; |
| | 1383 | } |
| | 1384 | |
| 1335 | 1385 | // audio is fully decoded, so we need to reencode it |
| 1336 | 1386 | AudioBuffer *ab = NULL; |
| 1337 | 1387 | while ((ab = arb->GetData(lastWrittenTime)) != NULL) |
| … |
… |
int Transcode::TranscodeFile(const QString &inputname,
|
| 1382 | 1432 | |
| 1383 | 1433 | delete ab; |
| 1384 | 1434 | } |
| 1385 | | |
| 1386 | | if (!avfMode) |
| 1387 | | { |
| 1388 | | GetPlayer()->GetCC608Reader()-> |
| 1389 | | TranscodeWriteText(&TranscodeWriteText, (void *)(nvr)); |
| 1390 | | } |
| 1391 | | lasttimecode = frame.timecode; |
| 1392 | | frame.timecode -= timecodeOffset; |
| 1393 | | |
| 1394 | | if (avfMode) |
| 1395 | | { |
| 1396 | | if (halfFramerate && !skippedLastFrame) |
| 1397 | | { |
| 1398 | | skippedLastFrame = true; |
| 1399 | | } |
| 1400 | | else |
| 1401 | | { |
| 1402 | | skippedLastFrame = false; |
| 1403 | | |
| 1404 | | if ((hls) && |
| 1405 | | (avfw->GetFramesWritten()) && |
| 1406 | | (hlsSegmentFrames > hlsSegmentSize) && |
| 1407 | | (avfw->NextFrameIsKeyFrame())) |
| 1408 | | { |
| 1409 | | hls->AddSegment(); |
| 1410 | | avfw->ReOpen(hls->GetCurrentFilename()); |
| 1411 | | |
| 1412 | | if (avfw2) |
| 1413 | | avfw2->ReOpen(hls->GetCurrentFilename(true)); |
| 1414 | | |
| 1415 | | hlsSegmentFrames = 0; |
| 1416 | | } |
| 1417 | | |
| 1418 | | if (avfw->WriteVideoFrame(&frame) > 0) |
| 1419 | | { |
| 1420 | | lastWrittenTime = frame.timecode; |
| 1421 | | if (hls) |
| 1422 | | ++hlsSegmentFrames; |
| 1423 | | } |
| 1424 | | |
| 1425 | | } |
| 1426 | | } |
| 1427 | | else |
| 1428 | | { |
| 1429 | | if (forceKeyFrames) |
| 1430 | | nvr->WriteVideo(&frame, true, true); |
| 1431 | | else |
| 1432 | | nvr->WriteVideo(&frame); |
| 1433 | | lastWrittenTime = frame.timecode; |
| 1434 | | } |
| 1435 | 1435 | } |
| 1436 | 1436 | if (MythDate::current() > statustime) |
| 1437 | 1437 | { |