aboutsummaryrefslogtreecommitdiff
path: root/nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp
diff options
context:
space:
mode:
authorPacketVideo CM <engbuild@pv.com>2009-12-10 12:40:30 -0800
committerPacketVideo CM <engbuild@pv.com>2009-12-10 12:40:30 -0800
commit9e59d70345c05c4741950fc5dc5a789eca65bb01 (patch)
treec5b8521bf37184c4c0e1de070bcdba63ad71428c /nodes/pvmp4ffparsernode/src/pvmf_mp4ffparser_node.cpp
parentfe28f2b21995e578b9d7f2bb8d35026c8a6dc804 (diff)
downloadopencore-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.cpp135
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;
- }
- }
-}
+
+
+
+
+
+
+