diff options
author | PacketVideo CM <engbuild@pv.com> | 2009-12-10 12:40:30 -0800 |
---|---|---|
committer | PacketVideo CM <engbuild@pv.com> | 2009-12-10 12:40:30 -0800 |
commit | 9e59d70345c05c4741950fc5dc5a789eca65bb01 (patch) | |
tree | c5b8521bf37184c4c0e1de070bcdba63ad71428c /nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp | |
parent | fe28f2b21995e578b9d7f2bb8d35026c8a6dc804 (diff) | |
download | opencore-9e59d70345c05c4741950fc5dc5a789eca65bb01.tar.gz |
RIO-7898: Add a new KVP to control audio output in trickplay mode. (minor additional change 2)
Diffstat (limited to 'nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp')
-rw-r--r-- | nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp | 135 |
1 files changed, 48 insertions, 87 deletions
diff --git a/nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp b/nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp index c16548aeb..4501e2459 100644 --- a/nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp +++ b/nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp @@ -61,12 +61,12 @@ PVMFMP4FFParserNode::PVMFMP4FFParserNode(int32 aPriority) : iBackwardReposFlag(false), /* To avoid backwardlooping :: A flag to remember backward repositioning */ iForwardReposFlag(false), iPlayBackDirection(PVMF_DATA_SOURCE_DIRECTION_FORWARD), + iParseAudioDuringFF(false), + iParseAudioDuringREW(false), + iParseVideoOnly(false), iOpenFileOncePerTrack(true), iDataRate(NORMAL_PLAYRATE), - minFileOffsetTrackID(0), - iIsAudioOnly(false), - iDisableAudioInTrickMode(false), - iParseVideoOnly(false) + minFileOffsetTrackID(0) { iClientPlayBackClock = NULL; iClockNotificationsInf = NULL; @@ -1626,17 +1626,7 @@ PVMFStatus PVMFMP4FFParserNode::DoRequestPort(PVMFPortInterface*& aPort) iNodeTrackPortList.push_back(trackportinfo); aPort = outport; - //Check if all the tracks are audio only - iIsAudioOnly = true; - int32 maxtrack = iNodeTrackPortList.size(); - for (int32 i = 0; i < maxtrack; i++) - { - if (iMP4FileHandle->getTrackMediaType(iNodeTrackPortList[i].iTrackId) != MEDIA_TYPE_AUDIO) - { - iIsAudioOnly = false; - break; - } - } + return PVMFSuccess; } @@ -2139,7 +2129,8 @@ PVMFStatus PVMFMP4FFParserNode::DoStop() // reset direction rate state variables iPlayBackDirection = PVMF_DATA_SOURCE_DIRECTION_FORWARD; - iDisableAudioInTrickMode = false; + iParseAudioDuringFF = false; + iParseAudioDuringREW = false; iParseVideoOnly = false; iDataRate = NORMAL_PLAYRATE; @@ -2220,7 +2211,8 @@ PVMFStatus PVMFMP4FFParserNode::DoReset() // reset direction rate state variables iPlayBackDirection = PVMF_DATA_SOURCE_DIRECTION_FORWARD; - iDisableAudioInTrickMode = false; + iParseAudioDuringFF = false; + iParseAudioDuringREW = false; iParseVideoOnly = false; iDataRate = NORMAL_PLAYRATE; @@ -2861,17 +2853,6 @@ PVMFStatus PVMFMP4FFParserNode::DoSetDataSourcePosition() iNodeTrackPortList[i].iTargetNPTInMediaTimeScale)); } } - if (!iIsAudioOnly) - { - if (((iDataRate == NORMAL_PLAYRATE) && (iPlayBackDirection == PVMF_DATA_SOURCE_DIRECTION_FORWARD)) || !iDisableAudioInTrickMode) - { - EnableAllNonVideotracks(); - } - else - { - DisableAllNonVideotracks(); - } - } PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_DEBUG, (0, "PVMFMP4FFParserNode::DoSetDataSourcePosition: targetNPT=%d, actualNPT=%d, actualTS=%d", @@ -3018,18 +2999,25 @@ PVMFStatus PVMFMP4FFParserNode::DoSetDataSourceRate() return PVMFErrNotSupported; } } - if (!iIsAudioOnly) + + // if we are going ff to normal or vice versa, we need to set the node to disable non-video + if (!iParseAudioDuringFF && (iDataRate != rate) && (PVMF_DATA_SOURCE_DIRECTION_FORWARD == iPlayBackDirection)) { - if (((rate == NORMAL_PLAYRATE) && (iPlayBackDirection == PVMF_DATA_SOURCE_DIRECTION_FORWARD)) || !iDisableAudioInTrickMode) + // coming to normal rate? + if (rate == NORMAL_PLAYRATE) { - EnableAllNonVideotracks(); + iParseVideoOnly = false; } + // switching to FF or rew? else { - DisableAllNonVideotracks(); + // since we know ff will not have audio, just disable audio now. + // If it is going to REW, DoSetDataSourceDirection will modify it there + iParseVideoOnly = true; } } + iDataRate = rate; PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, (0, "PVMFMP4FFParserNode::DoSetDataSourceRate() Out")); @@ -3118,6 +3106,8 @@ PVMFStatus PVMFMP4FFParserNode::DoSetDataSourceDirection() // if switching back to forward at 100000, make sure everything is set to parse // othrewise check what ff should be for non-video tracks and set it + iParseVideoOnly = ((iDataRate == NORMAL_PLAYRATE) || iParseAudioDuringFF) ? false : true; + actualNPT32 = 0x7FFFFFFF; for (i = 0; i < iNodeTrackPortList.size(); i++) { @@ -3135,6 +3125,8 @@ PVMFStatus PVMFMP4FFParserNode::DoSetDataSourceDirection() } else if (PVMF_DATA_SOURCE_DIRECTION_REVERSE == direction) { + iParseVideoOnly = iParseAudioDuringREW ? false : true; + actualNPT32 = 0; for (i = 0; i < iNodeTrackPortList.size(); i++) { @@ -3818,37 +3810,31 @@ bool PVMFMP4FFParserNode::RetrieveTrackData(PVMP4FFNodeTrackPortInfo& aTrackPort return false; } } - else if (PVMF_DATA_SOURCE_DIRECTION_REVERSE == iPlayBackDirection) + else if ((PVMF_DATA_SOURCE_DIRECTION_REVERSE == iPlayBackDirection) && + (iMP4FileHandle->getTrackMediaType(aTrackPortInfo.iTrackId) == MEDIA_TYPE_VISUAL)) { - if (iMP4FileHandle->getTrackMediaType(aTrackPortInfo.iTrackId) == MEDIA_TYPE_VISUAL) + uint32 numSamples = 1; + uint32 keySampleNumber; + if (aTrackPortInfo.iFirstFrameAfterRepositioning) { - uint32 numSamples = 1; - uint32 keySampleNumber; - if (aTrackPortInfo.iFirstFrameAfterRepositioning) + iPrevSampleTS = iMP4FileHandle->getMediaTimestampForCurrentSample(trackid); + retval = iMP4FileHandle->getPrevKeyMediaSample(iPrevSampleTS, keySampleNumber, trackid, + &numSamples, &iGau); + iStartForNextTSSearch = iMP4FileHandle->getMediaTimestampForCurrentSample(trackid) - 2 * iGau.info[0].ts_delta; + } + else + { + if (iStartForNextTSSearch <= 0) { - iPrevSampleTS = iMP4FileHandle->getMediaTimestampForCurrentSample(trackid); - retval = iMP4FileHandle->getPrevKeyMediaSample(iPrevSampleTS, keySampleNumber, trackid, - &numSamples, &iGau); - iStartForNextTSSearch = iMP4FileHandle->getMediaTimestampForCurrentSample(trackid) - 2 * iGau.info[0].ts_delta; + retval = END_OF_TRACK; } else { - if (iStartForNextTSSearch <= 0) - { - retval = END_OF_TRACK; - } - else - { - retval = iMP4FileHandle->getPrevKeyMediaSample(iStartForNextTSSearch, keySampleNumber, trackid, - &numSamples, &iGau); - iStartForNextTSSearch = iMP4FileHandle->getMediaTimestampForCurrentSample(trackid) - 2 * iGau.info[0].ts_delta; - } + retval = iMP4FileHandle->getPrevKeyMediaSample(iStartForNextTSSearch, keySampleNumber, trackid, + &numSamples, &iGau); + iStartForNextTSSearch = iMP4FileHandle->getMediaTimestampForCurrentSample(trackid) - 2 * iGau.info[0].ts_delta; } } - else - { - retval = END_OF_TRACK; - } } else @@ -8294,38 +8280,13 @@ bool PVMFMP4FFParserNode::SendBeginOfClipCommand(PVMP4FFNodeTrackPortInfo& aTrac return true; } -void PVMFMP4FFParserNode::EnableAllNonVideotracks() -{ - PVMF_MP4FFPARSERNODE_LOGERROR((0, "PVMFMP4FFParserNode::DnableAllNonVideotracks IN")); - int32 maxtrack = iNodeTrackPortList.size(); - iParseVideoOnly = false; - for (int32 i = 0; i < maxtrack; i++) - { - if ((iMP4FileHandle->getTrackMediaType(iNodeTrackPortList[i].iTrackId) != MEDIA_TYPE_VISUAL) && - ((iNodeTrackPortList[i].iState == PVMP4FFNodeTrackPortInfo::TRACKSTATE_ENDOFTRACK) || - (iNodeTrackPortList[i].iState == PVMP4FFNodeTrackPortInfo::TRACKSTATE_SEND_ENDOFTRACK))) - { - if (iNodeTrackPortList[i].iState == PVMP4FFNodeTrackPortInfo::TRACKSTATE_ENDOFTRACK) - { - iNodeTrackPortList[i].iSendBOS = true; - } - iNodeTrackPortList[i].iState = PVMP4FFNodeTrackPortInfo::TRACKSTATE_TRANSMITTING_GETDATA; - } - } -} -void PVMFMP4FFParserNode::DisableAllNonVideotracks() -{ - PVMF_MP4FFPARSERNODE_LOGERROR((0, "PVMFMP4FFParserNode::DisableAllNonVideotracks IN")); - iParseVideoOnly = true; - int32 maxtrack = iNodeTrackPortList.size(); - for (int32 i = 0; i < maxtrack; i++) - { - if (iMP4FileHandle->getTrackMediaType(iNodeTrackPortList[i].iTrackId) != MEDIA_TYPE_VISUAL) - { - iNodeTrackPortList[i].iState = PVMP4FFNodeTrackPortInfo::TRACKSTATE_SEND_ENDOFTRACK; - } - } -} + + + + + + + |