VirtualBox

Changeset 68372 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Aug 10, 2017 2:00:06 PM (7 years ago)
Author:
vboxsync
Message:

Main/EbmlWriter.cpp: Only write cues element if any cue points are available. Needed for making mkvalidator happy. Additional logging.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/EbmlWriter.cpp

    r68370 r68372  
    583583
    584584        pTrack->Audio.uHz     = uHz;
    585         pTrack->Audio.csFrame = pTrack->Audio.uHz / (1000 /* s in ms */ / 20); /** @todo 20 ms of audio data. Make this configurable? */
     585        pTrack->Audio.csFrame = pTrack->Audio.uHz / (1000 /* s in ms */ / 20 /* ms */); /** @todo 20 ms of audio data. Make this configurable? */
    586586
    587587        OpusPrivData opusPrivData(uHz, cChannels);
     
    681681                                 const void *a_pvData, size_t a_cbData, uint8_t a_fFlags)
    682682    {
    683         LogFunc(("SimpleBlock @ %RU64 (T%RU8, TS=%RU64, %zu bytes)\n",
    684                  RTFileTell(m_Ebml.getFile()), a_pTrack->uTrack, a_uTimecode, a_cbData));
     683        Log3Func(("SimpleBlock @ %RU64 (T%RU8, TS=%RU64, %zu bytes)\n",
     684                  RTFileTell(m_Ebml.getFile()), a_pTrack->uTrack, a_uTimecode, a_cbData));
    685685
    686686        /** @todo Mask out non-valid timecode bits, e.g. the upper 48 bits for a (default) 16-bit timecode. */
     
    809809            Cluster.tcStart = tcPTS;
    810810
    811         LogFunc(("tcPTSRaw=%RU64, tcPTS=%RU64, cbData=%RU64, uTimeStampMs=%RU64\n",
    812                  tcPTSRaw, tcPTS, Cluster.cbData, uTimeStampMs));
    813 
    814811        Cluster.tcLast = tcPTS;
    815812
     
    844841
    845842            Cluster.fOpen      = true;
     843            Cluster.uID        = a_pTrack->cTotalClusters;
    846844            Cluster.tcStart    = tcPTS;
     845            Cluster.tcLast     = Cluster.tcStart;
    847846            Cluster.offCluster = RTFileTell(m_Ebml.getFile());
    848847            Cluster.cBlocks    = 0;
    849848            Cluster.cbData     = 0;
    850849
    851             LogFunc(("[C%RU64] Start @ tc=%RU64 off=%RU64\n", a_pTrack->cTotalClusters, Cluster.tcStart, Cluster.offCluster));
     850            LogFunc(("[C%RU64] Start @ tc=%RU64 off=%RU64\n", Cluster.uID, Cluster.tcStart, Cluster.offCluster));
    852851
    853852            m_Ebml.subStart(MkvElem_Cluster)
     
    857856        }
    858857
    859         LogFunc(("tcPTS=%RU64, s=%RU64, e=%RU64\n", tcPTS, CurSeg.CurCluster.tcStart, CurSeg.CurCluster.tcLast));
    860 
    861858        Cluster.cBlocks += 1;
    862859        Cluster.cbData  += cbData;
     860
     861        Log2Func(("[C%RU64] tcBlock=%RU64, tcClusterStart=%RU64, tcClusterLast=%RU64, cbData=%zu\n",
     862                  Cluster.uID, tcBlock, CurSeg.CurCluster.tcStart, CurSeg.CurCluster.tcLast, CurSeg.CurCluster.cbData));
    863863
    864864        return writeSimpleBlockInternal(a_pTrack, tcBlock, pvData, cbData, VBOX_WEBM_BLOCK_FLAG_KEY_FRAME);
     
    943943         * Write Cues element.
    944944         */
    945         LogFunc(("Cues @ %RU64\n", RTFileTell(m_Ebml.getFile())));
    946 
    947         CurSeg.offCues = RTFileTell(m_Ebml.getFile());
    948 
    949         m_Ebml.subStart(MkvElem_Cues);
    950 
    951         std::list<WebMCueEntry>::iterator itCuePoint = CurSeg.lstCues.begin();
    952         while (itCuePoint != CurSeg.lstCues.end())
    953         {
    954             m_Ebml.subStart(MkvElem_CuePoint)
    955                   .serializeUnsignedInteger(MkvElem_CueTime, itCuePoint->time)
    956                   .subStart(MkvElem_CueTrackPositions)
    957                   .serializeUnsignedInteger(MkvElem_CueTrack, 1)
    958                   .serializeUnsignedInteger(MkvElem_CueClusterPosition, itCuePoint->loc - CurSeg.offStart, 8)
    959                   .subEnd(MkvElem_CueTrackPositions)
    960                   .subEnd(MkvElem_CuePoint);
    961 
    962             itCuePoint++;
    963         }
    964 
    965         m_Ebml.subEnd(MkvElem_Cues)
    966               .subEnd(MkvElem_Segment);
     945        if (CurSeg.lstCues.size())
     946        {
     947            LogFunc(("Cues @ %RU64\n", RTFileTell(m_Ebml.getFile())));
     948
     949            CurSeg.offCues = RTFileTell(m_Ebml.getFile());
     950
     951            m_Ebml.subStart(MkvElem_Cues);
     952
     953            std::list<WebMCueEntry>::iterator itCuePoint = CurSeg.lstCues.begin();
     954            while (itCuePoint != CurSeg.lstCues.end())
     955            {
     956                LogFunc(("CuePoint @ %RU64\n", RTFileTell(m_Ebml.getFile())));
     957
     958                m_Ebml.subStart(MkvElem_CuePoint)
     959                      .serializeUnsignedInteger(MkvElem_CueTime, itCuePoint->time)
     960                      .subStart(MkvElem_CueTrackPositions)
     961                      .serializeUnsignedInteger(MkvElem_CueTrack, 1)
     962                      .serializeUnsignedInteger(MkvElem_CueClusterPosition, itCuePoint->loc - CurSeg.offStart, 8)
     963                      .subEnd(MkvElem_CueTrackPositions)
     964                      .subEnd(MkvElem_CuePoint);
     965
     966                itCuePoint++;
     967            }
     968
     969            m_Ebml.subEnd(MkvElem_Cues);
     970        }
     971
     972        m_Ebml.subEnd(MkvElem_Segment);
    967973
    968974        /*
     
    10101016        LogFunc(("SeekHead @ %RU64\n", CurSeg.offSeekInfo));
    10111017
    1012         m_Ebml.subStart(MkvElem_SeekHead)
    1013 
    1014               .subStart(MkvElem_Seek)
     1018        m_Ebml.subStart(MkvElem_SeekHead);
     1019
     1020        m_Ebml.subStart(MkvElem_Seek)
    10151021              .serializeUnsignedInteger(MkvElem_SeekID, MkvElem_Tracks)
    10161022              .serializeUnsignedInteger(MkvElem_SeekPosition, CurSeg.offTracks - CurSeg.offStart, 8)
    1017               .subEnd(MkvElem_Seek)
    1018 
    1019               .subStart(MkvElem_Seek)
    1020               .serializeUnsignedInteger(MkvElem_SeekID, MkvElem_Cues)
    1021               .serializeUnsignedInteger(MkvElem_SeekPosition, CurSeg.offCues - CurSeg.offStart, 8)
    1022               .subEnd(MkvElem_Seek)
    1023 
    1024               .subStart(MkvElem_Seek)
     1023              .subEnd(MkvElem_Seek);
     1024
     1025        if (CurSeg.lstCues.size())
     1026        {
     1027            Assert(CurSeg.offCues - CurSeg.offStart > 0); /* Sanity. */
     1028
     1029            m_Ebml.subStart(MkvElem_Seek)
     1030                  .serializeUnsignedInteger(MkvElem_SeekID, MkvElem_Cues)
     1031                  .serializeUnsignedInteger(MkvElem_SeekPosition, CurSeg.offCues - CurSeg.offStart, 8)
     1032                  .subEnd(MkvElem_Seek);
     1033        }
     1034
     1035        m_Ebml.subStart(MkvElem_Seek)
    10251036              .serializeUnsignedInteger(MkvElem_SeekID, MkvElem_Info)
    10261037              .serializeUnsignedInteger(MkvElem_SeekPosition, CurSeg.offInfo - CurSeg.offStart, 8)
    1027               .subEnd(MkvElem_Seek)
    1028 
    1029         .subEnd(MkvElem_SeekHead);
     1038              .subEnd(MkvElem_Seek);
     1039
     1040        m_Ebml.subEnd(MkvElem_SeekHead);
    10301041
    10311042        //int64_t iFrameTime = (int64_t)1000 * 1 / 25; //m_Framerate.den / m_Framerate.num; /** @todo Fix this! */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette