blob: cc5356097409c75d0923e998dd2000ba80fe9222 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
/**
* @file pvmf_sync_util.h
* @brief Utility class to synchronize processing of media data to a specified clock.
*/
#ifndef PVMF_SYNC_UTIL_H_INCLUDED
#define PVMF_SYNC_UTIL_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
#include "pvmf_media_clock.h"
#endif
#ifndef PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif
#ifndef PVMF_TIMESTAMP_H_INCLUDED
#include "pvmf_timestamp.h"
#endif
#ifndef PVMF_RETURN_CODES_H_INCLUDED
#include "pvmf_return_codes.h"
#endif
const int32 DEFAULT_EARLY_MARGIN = 10;
const int32 DEFAULT_LATE_MARGIN = 50;
typedef enum
{
PVMF_SYNC_EARLY = 0, /**< Timestamp is earlier than the current clock by more than the early margin.*/
PVMF_SYNC_ON_TIME, /**< Timestamp is on time with regards to current clock. */
PVMF_SYNC_LATE, /**< Timestamp is later than the current clock by more than the late margin. */
PVMF_SYNC_SKIPPED, /**< Timestamp falls within the range of skipped media data timestamps. */
PVMF_SYNC_SKIPPED_RENDER,/**< same as PVMF_SYNC_SKIPPED, but we want to render skipped data */
PVMF_SYNC_SKIP_COMPLETE /**< Timestamp is the first media data timestamp after the skipped range. */
} PvmfSyncStatus;
/**
* Utility class to synchronize media data to a specified clock. PvmfSyncUtil checks the timestamp
* of incoming data against the specified clock, and decide whether to drop the data if it arrived
* too late, or schedule the data to be processed at a later time that is synchronized to the
* specified clock.
*/
class PvmfSyncUtil
{
public:
/** Constructor */
OSCL_IMPORT_REF PvmfSyncUtil();
/** Destructor */
~PvmfSyncUtil() {}
/**
* Configure the criteria to determine whether media data is early or late.
*
* Media data is considered early if it has a timestamp earlier than the current time of the clock by
* the early margin. The media data will be scheduled to be processed at the later time that is
* synchronized to the clock. Media data is considered late if it has a timestamp later than the
* current time of the clock by the late margin and will be dropped.
*
* @param aEarlyMargin Early margin in milliseconds.
* @param aLateMargin Late margin in milliseconds.
* @return Completion status
*/
OSCL_IMPORT_REF PVMFStatus SetMargins(int32 aEarlyMargin, int32 aLateMargin);
/**
* Synchronize the timestamp of media data with the clock.
*
* The provided timestamp is checked against the clock and the utility determines whether the timestamp
* is considered early, on-time or late. If the timestamp is earlier than the current time on the clock
* by more than the early margin, it is considered early, and this API will return the number of
* milliseconds to the time to process the data. If the timestamp is later than the current time on the
* clock by more than the late margin, it is considered late and this API will return -1 to indicate
* the data should be dropped. Otherwise the timestamp is considered on-time and this API will return 0.
*
* @param aDataTimestamp Timestamp of media data in milliseconds.
* @param aDuration Duration of the media data in milliseconds.
* @param aMillisecondsEarly If return status is PVMF_SYNC_EARLY, the number of milliseconds to the
* time to process the data is saved to this parameter
* If return is PVMF_SYNC_LATE, the amount by which the frame was late is returned.
* If return is PVMF_SYNC_SKIPPED, the delta from the frame TS to the skip mark is returned.
* @return Synchronization status.
*/
OSCL_IMPORT_REF PvmfSyncStatus SyncMediaData(PVMFTimestamp aDataTimestamp, uint32 aDuration, uint32& aMillisecondsEarly);
/**
* Skip processing media data until a specified timestamp
*
* Media data with timestamp before the specified resume timestamp will be skipped. Default
* behaviour is to drop all skipped data, where SyncMediaData API will return -1 for all timestamps
* before the resume time. If aRenderSkippedData is set to true, SyncMediaData API will return
* 0 for all timestamps before the resume time to indicate forced rendering of all skipped data.
*
* @param aResumeTimestamp Timestamp at which normal evaluation of timestamp against the clock will resume.
* @param aRenderSkippedData When set to true, SyncMediaData API will return 0 for all timestamps
* before the resume time.
* @return Completion status.
*/
OSCL_IMPORT_REF PVMFStatus SkipMediaData(PVMFTimestamp aResumeTimestamp, bool aRenderSkippedData = false);
/**
* Cancel a SkipMediaData that is in progress. If no SkipMediaData
* is in progress, ignore the command.
*
*/
OSCL_IMPORT_REF void CancelSkipMediaData();
/**
* A query for whether a skip is in progress
*/
bool IsSkipping()
{
return iSkipMediaData;
}
private:
friend class PvmfSyncUtilDataQueue;
/**
* Sets the clock to which media data is synchronized.
*
* @param aClock Clock object to which media data is synchronized.
* @return Completion status.
*/
OSCL_IMPORT_REF PVMFStatus SetClock(PVMFMediaClock* aClock);
OSCL_IMPORT_REF PVMFStatus SetFrameStepClock(PVMFMediaClock* aClock);
private:
PVMFMediaClock* iClock;
PVMFMediaClock* iFrameStepClock;
int32 iEarlyMargin;
int32 iLateMargin;
// Repositioning
bool iSkipMediaData;
PVMFTimestamp iResumeTimestamp;
bool iRenderSkippedData;
PVLogger* iLogger;
};
#endif // PVMF_SYNC_UTIL_H_INCLUDED