diff --git a/proprietary/drmwvmplugin/lib/libwvdrm_L1.so b/proprietary/drmwvmplugin/lib/libwvdrm_L1.so index 449c5d79..86f6321c 100644 Binary files a/proprietary/drmwvmplugin/lib/libwvdrm_L1.so and b/proprietary/drmwvmplugin/lib/libwvdrm_L1.so differ diff --git a/proprietary/drmwvmplugin/lib/libwvdrm_L3.so b/proprietary/drmwvmplugin/lib/libwvdrm_L3.so index 81097541..5ec2f710 100644 Binary files a/proprietary/drmwvmplugin/lib/libwvdrm_L3.so and b/proprietary/drmwvmplugin/lib/libwvdrm_L3.so differ diff --git a/proprietary/drmwvmplugin/lib/libwvocs_L1.a b/proprietary/drmwvmplugin/lib/libwvocs_L1.a index 407b8ef5..61255efd 100644 Binary files a/proprietary/drmwvmplugin/lib/libwvocs_L1.a and b/proprietary/drmwvmplugin/lib/libwvocs_L1.a differ diff --git a/proprietary/drmwvmplugin/lib/libwvocs_L3.a b/proprietary/drmwvmplugin/lib/libwvocs_L3.a index 5d19fee5..c10f0ea4 100644 Binary files a/proprietary/drmwvmplugin/lib/libwvocs_L3.a and b/proprietary/drmwvmplugin/lib/libwvocs_L3.a differ diff --git a/proprietary/streamcontrol/include/WVControlSettings.h b/proprietary/streamcontrol/include/WVControlSettings.h new file mode 100644 index 00000000..87e3d9e7 --- /dev/null +++ b/proprietary/streamcontrol/include/WVControlSettings.h @@ -0,0 +1,41 @@ +/**************************************************************************************************** + * WVControlSettings.h + * + * (c) Copyright 2011-2012 Google, Inc. + * + * Widevine API types + ***************************************************************************************************/ + +#ifndef __WVCONTROLSETTINGS_H__ +#define __WVCONTROLSETTINGS_H__ + +#include + +/* WVCredentials is used in both WVPlaybackAPI and WVStreamControlAPI. */ +struct WVCredentials { + std::string deviceID; // unique player device ID from CinemaNow + std::string streamID; // unique streamID from CinemaNow + std::string clientIP; // IP address of client + std::string drmServerURL; // URL for DRM server + std::string userData; // Additional optional user data, TBD + std::string portal; // Identifies the operator + std::string storefront; // Identifies store run by operator + std::string drmAckServerURL; // URL for server that receives + // entitlement confirmations + std::string heartbeatURL; // URL to receive client heartbeats + unsigned int heartbeatPeriod;// Duration between consecutive heartbeats in + // seconds. 0 indicates no heatbeats requested + unsigned int cnDeviceType; // device type identifier defined by CinemaNow +}; + +/* WVProxySettings is used in both WVPlaybackAPI and WVStreamControlAPI. */ +struct WVProxySettings { + bool enable; // If true, proxy use is enable, otherwise disabled + std::string ipAddr; // IP address of proxy server, e.g. "1.2.3.4" or host name + unsigned short ipPort; // IP port number + std::string userId; // User ID if authentication is needed, otherwise "" to disable authentication + std::string password; // Password if userID is not "" +}; + + +#endif // __WVCONTROLSETTINGS_H__ diff --git a/proprietary/streamcontrol/include/WVDictionaryKeys.h b/proprietary/streamcontrol/include/WVDictionaryKeys.h new file mode 100644 index 00000000..d08b15ff --- /dev/null +++ b/proprietary/streamcontrol/include/WVDictionaryKeys.h @@ -0,0 +1,176 @@ +/**************************************************************************************************** + * WVDictionaryKeys.h + * + * Key and value constants for dictionaries + * + * (c) Copyright 2011 Google, Inc. + ***************************************************************************************************/ + +#ifndef __WVDICTIONARYKEYS_H__ +#define __WVDICTIONARYKEYS_H__ + + +// Keys for Credentials dictionary +#define kCredentialsKey_DeviceId "CredentialsKey_DeviceId" // Device ID (WVString) +#define kCredentialsKey_ClientId "CredentialsKey_ClientId" // Client ID (WVString) +#define kCredentialsKey_StreamId "CredentialsKey_StreamId" // Stream ID (WVString) +#define kCredentialsKey_SessionId "CredentialsKey_SessionId" // Session ID (WVString) +#define kCredentialsKey_ClientIp "CredentialsKey_ClientIp" // Client IP (WVString) +#define kCredentialsKey_Portal "CredentialsKey_Portal" // Media portal (WVString) +#define kCredentialsKey_Storefront "CredentialsKey_Storefront" // Media storefront (WVString) +#define kCredentialsKey_OptionalData "CredentialsKey_OptionalData" // Optional data (WVString) +#define kCredentialsKey_AssetRegistryId "CredentialsKey_AssetRegistryId" // Asset Registry ID to store/retrieve licenses (WVString) +#define kCredentialsKey_DrmServerUrl "CredentialsKey_DrmServerUrl" // DRM server URL to retrieve entitlements (WVString) +#define kCredentialsKey_DrmAckServerUrl "CredentialsKey_DrmAckServerUrl" // DRM ACK server URL (WVString) +#define kCredentialsKey_HeartbeatUrl "CredentialsKey_HeartbeatUrl" // Heartbeat sever URL (WVString) +#define kCredentialsKey_DrmLicenseUsageUrl "CredentialsKey_DrmLicenseUsageUrl" // DRM License usage URL (WVString) +#define kCredentialsKey_SignOnUrl "CredentialsKey_SignOnUrl" // Sign-on server URL (WVString) +#define kCredentialsKey_AppSignatureUrl "CredentialsKey_AppSignatureUrl" // DCP application signature URL (WVString) +#define kCredentialsKey_DcpLogUrl "CredentialsKey_DcpLogUrl" // DCP logging URL (WVString) +#define kCredentialsKey_HeartbeatPeriod "CredentialsKey_HeartbeatPeriod" // Heartbeat period (WVUnsignedInt) +#define kCredentialsKey_UserAgent "CredentialsKey_UserAgent" // UserAgent for HTTP requests (WVString) +#define kCredentialsKey_PreloadTimeout "CredentialsKey_PreloadTimeout" // Preload timeout in microseconds (WVUnsignedInt) +#define kCredentialsKey_CacheSize "CredentialsKey_CacheSize" // Size of donwload/adaptive cache in bytes (WVUnsignedInt). +#define kCredentialsKey_DataStorePath "CredentialsKey_DataStorePath" // Optional path to license data store (WVString) +#define kCredentialsKey_PlaybackMode "CredentialsKey_PlaybackMode" // Playback mode (WVUnsignedInt), see kPlaybackMode constants +#define kCredentialsKey_CaToken "CredentialsKey_CaToken" // Conditional access token +#define kCredentialsKey_CommandChannel "CredentialsKey_CommandChannel" // Enable control back channel (WVBoolean). +#define kCredentialsKey_Pda "CredentialsKey_Pda" // Enable player-driven adaptation (WVBoolean) +#define kCredentialsKey_AssetFsRoot "CredentialsKey_AssetFsRoot" // File system root directory for assets (WVString) +#define kCredentialsKey_UseJSON "CredentialsKey_UseJSON" // Use JSON format for EMM (WVBoolean) + +// Keys for Asset Registry query results dictionary +#define kAssetRegistryKey_AssetPath "AssetRegistryKey_AssetPath" // Asset path (WVString) +#define kAssetRegistryKey_AssetStatus "AssetRegistryKey_AssetStatus" // Asset status (WVUnsignedInt) + + +// Keys for asset information containing dictionaries +#define kAssetInfoKey_SystemId "AssetInfoKey_SystemId" // CA system ID (WVUnsignedInt) +#define kAssetInfoKey_AssetId "AssetInfoKey_AssetId" // CA asset ID (WVUnsignedInt) +#define kAssetInfoKey_KeyIndex "AssetInfoKey_KeyIndex" // CA key index (WVUnsignedInt) +#define kAssetInfoKey_DistributionTimeRemaining "AssetInfoKey_DistributionTimeRemaining" // Distribution time remaining (WVUnsignedInt) +#define kAssetInfoKey_PurchaseTimeRemaining "AssetInfoKey_PurchaseTimeRemaining" // Purchase time reaminng (WVUnsignedInt) +#define kAssetInfoKey_LicenseTimeRemaining "AssetInfoKey_LicenseTimeRemaining" // License time remaining (WVUnsignedInt) +#define kAssetInfoKey_LicenseExpiryTimeRemaining "AssetInfoKey_LicenseExpiryTimeRemaining" // Overall time remaining before license expires (WVUnsignedInt) +#define kAssetInfoKey_TimeSinceFirstPlayback "AssetInfoKey_TimeSinceFirstPlayback" // Time since first playback (WVUnsignedInt) +#define kAssetInfoKey_CAError "AssetInfoKey_CAError" // License retrieval error (WVUnsignedInt) +#define kAssetInfoKey_MaxBitrate "AssetInfoKey_MaxBitrate" // Max bitrate (WVUnsignedInt) +#define kAssetInfoKey_MinBitrate "AssetInfoKey_MinBitrate" // Min bitrate (WVUnsignedInt) + +// Keys for error information containing dictionaries +#define kErrorKey_WVStatus "ErrorKey_WVStatus" // WVStatus code (WVUnsignedInt) +#define kErrorKey_AdditionalInfo "ErrorKey_AdditionalInfo" // Error additional information (WVString) + + +// Keys for track information +#define kTrackInfoKey_CypherVersion "TrackInfoKey_CypherVersion" // Cypher version (WVString) +#define kTrackInfoKey_Id "TrackInfoKey_Id" // Track ID (WVUnsignedInt) +#define kTrackInfoKey_Version "TrackInfoKey_Version" // Track version (WVUnsignedInt) INTERNAL +#define kTrackInfoKey_BitRate "TrackInfoKey_BitRate" // Required bandwidth it bits/sec (WVUnsignedInt) +#define kTrackInfoKey_Offset "TrackInfoKey_Offset" // Track byte offset (WVUnsignedLong) INTERNAL +#define kTrackInfoKey_Size "TrackInfoKey_Size" // Track size (WVUnsignedLong) INTERNAL +#define kTrackInfoKey_Duration "TrackInfoKey_Duration" // Track duration in us (WVUnsignedLong) +#define kTrackInfoKey_AdaptationInterval "TrackInfoKey_AdaptationInterval" // Nominal adaptation interval, in seconds (WVFloat) +#define kTrackInfoKey_TrickPlayRate "TrackInfoKey_TrickPlayRate" // Trick-play rate (WVSignedInt) +#define kTrackInfoKey_Flags "TrackInfoKey_Flags" // Track flags (WVUnsignedInt) +#define kTrackInfoKey_Source "TrackInfoKey_Source" // Source for media (WVString) +#define kTrackInfoKey_TimingOffset "TrackInfoKey_TimingOffset" // Track timing adjustment in seconds (WVFloat) + +// Video track information +#define kTrackInfoKey_VideoFormat "TrackInfoKey_VideoFormat" // Type of video, valid values below (WVUnsignedInt) +#define kTrackInfoKey_VideoProfile "TrackInfoKey_VideoProfile" // Video profile indicator (WVUnsignedInt) +#define kTrackInfoKey_VideoLevel "TrackInfoKey_VideoLevel" // Video leve indicator (WVUnsignedInt) +#define kTrackInfoKey_VideoWidth "TrackInfoKey_VideoWidth" // Video width, in pixels (WVUnsignedInt) +#define kTrackInfoKey_VideoHeight "TrackInfoKey_VideoHeight" // Video height, in lines (WVUnsignedInt) +#define kTrackInfoKey_VideoPixelWidth "TrackInfoKey_VideoPixelWidth" // Video pixel aspect ratio width (WVUnsignedInt) +#define kTrackInfoKey_VideoPixelHeight "TrackInfoKey_VideoPixelHeight" // Video pixel aspect ratio height (WVUnsignedInt) +#define kTrackInfoKey_VideoFrameRate "TrackInfoKey_VideoFrameRate" // Video frame rate (WVFloat) +#define kTrackInfoKey_VideoBitRate "TrackInfoKey_VideoBitRate" // Video bit rate, bits/sec (WVUnsignedInt) +#define kTrackInfoKey_VideoMpegStreamType "TrackInfoKey_VideoMpegStreamType" // Video MPEG ES stream type (WVUnsignedInt) +#define kTrackInfoKey_VideoMpegStreamId "TrackInfoKey_VideoMpegStreamId" // Video MPEG PES stream ID (WVUnsignedInt) +#define kTrackInfoKey_VideoMpegStreamPid "TrackInfoKey_VideoMpegStreamPid" // Video MPEG2-TS PID (WVUnsignedInt) +#define kTrackInfoKey_AVCDecoderConfigurationRecord "TrackInfoKey_AVCDecoderConfigurationRecord" // h.264 AVCDecoderConfigurationRecord (WVDataBlob) + +// Audio track information +#define kTrackInfoKey_AudioFormat "TrackInfoKey_AudioFormat" // Type of audio, valid values below (WVUnsignedInt) +#define kTrackInfoKey_AudioProfile "TrackInfoKey_AudioProfile" // Audio profile indicator (WVUnsignedInt) +#define kTrackInfoKey_AudioNumChannels "TrackInfoKey_AudioNumChannels" // Number of audio channels (WVUnsignedInt) +#define kTrackInfoKey_AudioSampleFrequency "TrackInfoKey_AudioSampleFrequency" // Audio sampling frequency, in hertz (WVUnsignedInt) +#define kTrackInfoKey_AudioSampleSize "TrackInfoKey_AudioSampleSize" // Audio sample size, in bits (WVUnsignedInt) +#define kTrackInfoKey_AudioBitRate "TrackInfoKey_AudioBitRate" // Audio bit rate (WVUnsignedInt) +#define kTrackInfoKey_AudioMpegStreamType "TrackInfoKey_AudioMpegStreamType" // Audio MPEG ES stream type (WVUnsignedInt) +#define kTrackInfoKey_AudioMpegStreamId "TrackInfoKey_AudioMpegStreamId" // Audio MPEG PES stream ID (WVUnsignedInt) +#define kTrackInfoKey_AudioMpegStreamPid "TrackInfoKey_AudioMpegStreamPid" // Audio MPEG2-TS PID (WVUnsignedInt) +#define kTrackInfoKey_AudioEsDescriptor "TrackInfoKey_AudioEsDescriptor" // Audio ES_Descriptor (WVDataBlob) +#define kTrackInfoKey_AudioEC3SpecificData "TrackInfoKey_AudioEC3SpecificData" // E-AC3 audio contents of dec3 box (WVDataBlob) +#define kTrackInfoKey_AudioIdentifier "TrackInfoKey_AudioIdentifier" // Audio track indentifier/language code (WVString) + +// Subtitle track information +#define kTrackInfoKey_SubtitleFormat "TrackInfoKey_SubtitleFormat" // Type of subtitle, valid values below (WVUnsignedInt) +#define kTrackInfoKey_SubtitleIdentifier "TrackInfoKey_SubtitleIdentifier" // Subtitle track identifier/language code (WVString) + +// Keys for chapter information +#define kChapterInfoKey_SeqNum "ChapterInfoKey_SeqNum" // Chapter sequence number (WVUnsignedInt, 0 start) +#define kChapterInfoKey_ChapterTimeIndex "ChapterInfoKey_StartTimeIndex" // Chapter start time index (WVUnsignedInt, milliseconds) +#define kChapterInfoKey_Title "ChapterInfoKey_Title" // Chapter title (WVString) +#define kChapterInfoKey_Thumbnail "ChapterInfoKey_Thumbnail" // Chapter thumbnail image (WVDataBlob, JPEG) + +// Keys for copy control information +#define kCopyControlInfoKey "CopyControlInfoKey" // CCI Information (WVUnsignedInt) +#define kCopyControlInfoKey_EMI "CopyControlInfoKey_EMI" // EMI restrictions (WVUnsignedInt, below) +#define kCopyControlInfoKey_APS "CopyControlInfoKey_APS" // APS restrictions (WVUnsignedInt, below) +#define kCopyControlInfoKey_CIT "CopyControlInfoKey_CIT" // Constrain Image Trigger enabled (WVBoolean) +#define kCopyControlInfoKey_HDCP "CopyControlInfoKey_HDCP" // HDCP enabled (WVBoolean) +#define kCopyControlInfoKey_Heartbeats "CopyControlInfoKey_Heartbeats" // Heartbeats enabled (WVBoolean) + +// Keys for DCP flags (please use enums and inlines in WVEmm.h to extract fields) +#define kDCPKey_DCPFlags "DCPKey_DCPFlags" // DCP Flags (WVUnsignedInt) + +// Key to indicate whether to check if the license needs to be refreshed +#define kLicenseKey_CheckLicenseRefresh "LicenseKey_CheckLicenseRefresh" // License refresh flag (WVBoolean) + +// Keys for stats query +#define kStatsKey_VideoStreamingBufferSize "StatsKey_VideoStreamingBufferSize" // Size of adaptive video streaming buffer (WVUnsignedInt) +#define kStatsKey_VideoStreamingBufferUsed "StatsKey_VideoStreamingBufferUsed" // Number of bytes in video streaming buffer (WVUnsignedInt) +#define kStatsKey_VideoTimeBuffered "StatsKey_VideoTimeBuffered" // Duration of currently buffered video, in seconds (WVFloat) +#define kStatsKey_AudioStreamingBufferSize "StatsKey_AudioStreamingBufferSize" // Size of separate audio streaming buffer (WVUnsignedInt) +#define kStatsKey_AudioStreamingBufferUsed "StatsKey_AudioStreamingBufferUsed" // Number of bytes in separate audio streaming buffer (WVUnsignedInt) +#define kStatsKey_AudioTimeBuffered "StatsKey_AudioTimeBuffered" // Duration of currently buffered separate audio, in seconds (WVFloat) +#define kStatsKey_MeasuredBandwidth "StatsKey_MeasuredBandwidth" // Last measured bandwidth, in bits/sec (WVUnsignedInt) +#define kStatsKey_VideoBitRate "StatsKey_VideoBitRate" // Current video bit rate in bits/sec (WVUnsignedInt) +#define kStatsKey_AudioBitRate "StatsKey_AudioBitRate" // Current audio bit rate in bits/sec (WVUnsignedInt) +#define kStatsKey_AudioIdentifier "StatsKey_AudioIdentifier" // Identifier of current audio track (WVString) + + +// Constant values for kCredentialsKey_PlaybackMode +#define kPlaybackModeValue_Streaming WVUnsignedInt(1) // Streaming playback +#define kPlaybackModeValue_Offline WVUnsignedInt(2) // Playback from local file +#define kPlaybackMode_OfflineAndStreaming WVUnsignedInt(3) // Streaming and local file playback + + +// Constant values for kCopyControlInfoKey_EMI +#define kCopyControlInfoValue_EMI_NoRestricions WVUnsignedInt(0) +#define kCopyControlInfoValue_EMI_NoFurtherCopying WVUnsignedInt(1) +#define kCopyControlInfoValue_EMI_OneGenerationCopyingPermitted WVUnsignedInt(2) +#define kCopyControlInfoValue_EMI_NoCopy WVUnsignedInt(3) + + +// Constant values for kCopyControlInfoKey_APS +#define kCopyControlInfoValue_APS_NoRestricions WVUnsignedInt(0) +#define kCopyControlInfoValue_APS_ACGOn WVUnsignedInt(1) +#define kCopyControlInfoValue_APS_ACGOn2 WVUnsignedInt(2) +#define kCopyControlInfoValue_APS_ACGOn4 WVUnsignedInt(3) + + +// Constant values for kTrackInfoKey_VideoFormat +#define kVideoFormatValue_H264 WVUnsignedInt(1) + + +// Constant values for kTrackInfoKey_AudioFormat +#define kAudioFormatValue_AAC WVUnsignedInt(1) +#define kAudioFormatValue_EAC3 WVUnsignedInt(2) + +// Constant values for kTrackInfoKey_SubtitleFormat +#define kSubtitleFormatValue_TTML WVUnsignedInt(1) + +#endif // __WVDICTIONARYKEYS_H__ diff --git a/proprietary/streamcontrol/include/WVStatus.h b/proprietary/streamcontrol/include/WVStatus.h new file mode 100644 index 00000000..eddab484 --- /dev/null +++ b/proprietary/streamcontrol/include/WVStatus.h @@ -0,0 +1,248 @@ +/**************************************************************************************************** + * WVStatus.h + * + * (c) Copyright 2011-2012 Google, Inc. + * + * Widevine API status (return) codes + ***************************************************************************************************/ + +#ifndef __WVSTATUS_H__ +#define __WVSTATUS_H__ + +typedef enum WVStatus { + WV_Status_Unknown = 0, // INTERNAL + + // CA CGI + WV_Status_CA_OK = 1, + WV_Status_CA_AssetNotFound = 2, + WV_Status_CA_AssetSaveFailed = 3, + WV_Status_CA_AssetDeleteFailed = 4, + WV_Status_CA_AssetAlreadyExist = 5, + WV_Status_CA_InternalError = 6, + WV_Status_CA_OperationNotAllowed = 7, + WV_Status_CA_AssetBlocked = 8, + WV_Status_CA_OutsideLicenseWindow = 9, + WV_Status_CA_OutsideRegion = 10, + WV_Status_CA_SignatureMissing = 11, + WV_Status_CA_SignatureNotValid = 12, + WV_Status_CA_ProviderUnknown = 13, + WV_Status_CA_NetworkErr = 14, + WV_Status_CA_EntitlementMessageErr = 15, + WV_Status_CA_EntitlementDecodeFailed = 16, + WV_Status_CA_ClientNetworkingErr = 17, + WV_Status_CA_RequestAborted = 18, + WV_Status_CA_ClientKeyMissing = 19, + WV_Status_CA_RegServerNotResponding = 20, + WV_Status_CA_RegServerDown = 21, + WV_Status_CA_PortalMissing = 22, + WV_Status_CA_PortalUnknown = 23, + WV_Status_CA_AssetIdMissing = 24, + WV_Status_CA_OwnerMissing = 25, + WV_Status_CA_ProviderMissing = 26, + WV_Status_CA_NameMissing = 27, + WV_Status_CA_InvalidCCI = 28, + WV_Status_CA_InvalidDCP = 29, + WV_Status_CA_InvalidLicenseWindow = 30, + WV_Status_CA_PolicyNotFound = 31, + WV_Status_CA_PolicyRejected = 32, + WV_Status_CA_PolicyServerNotResponding = 33, + WV_Status_CA_ErrorProcessingClientToken = 34, + WV_Status_CA_InvalidRegion = 35, + WV_Status_CA_InvalidNonce = 36, + WV_Status_CA_InvalidHWID = 37, + WV_Status_CA_InvalidToken = 38, + WV_Status_CA_InvalidAssetId = 39, + WV_Status_CA_InvalidName = 40, + WV_Status_CA_InvalidDiversity = 41, + WV_Status_CA_InvalidKeyId = 42, + WV_Status_CA_ModelNotSupported = 43, + WV_Status_CA_InvalidKeyboxSystemID = 44, + WV_Status_CA_NoDeviceLicenseAvailable = 45, + WV_Status_CA_UnknownCode = 46, + WV_Status_CA_InvalidAccessCriteria = 47, + WV_Status_CA_RegionMissing = 48, + WV_Status_CA_KeyVerificationFailed = 49, + WV_Status_CA_STBKeyHashFailed = 50, + WV_Status_CA_UnableToGetSharedKey = 51, + WV_Status_CA_WrongSystemID = 52, + WV_Status_CA_RevokedClientVersion = 53, + WV_Status_CA_ClientVersionTampered = 54, + WV_Status_CA_ClientVersionMissing = 55, + WV_Status_CA_AssetProviderAlreadyExist = 56, + WV_Status_CA_DiversityMissing = 57, + WV_Status_CA_TokenMissing = 58, + WV_Status_CA_ClientModelTampered = 59, + WV_Status_CA_AssetKeyTooLarge = 60, + WV_Status_CA_DecryptFailed = 61, + WV_Status_CA_TooManyAssets = 62, + WV_Status_CA_MakeNotSupported = 63, + WV_Status_CA_PolicyAlreadyExist = 64, + WV_Status_CA_InvalidXML = 65, + WV_Status_CA_ProviderViolation = 66, + WV_Status_CA_PortalVerificationFailed = 67, + WV_Status_CA_PortalOverrideNotAllowed = 68, + WV_Status_CA_PortalTimeNotSynced = 69, + WV_Status_CA_ClientSignatureMissing = 70, + WV_Status_CA_ClientSignatureNotValid = 71, + WV_Status_CA_AssetNameTooLarge = 72, + WV_Status_CA_UsageUrlMissing = 73, + WV_Status_CA_AssetIdExceedsLimit = 74, + WV_Status_CA_AssetIdInUsedRange = 75, + WV_Status_CA_DeviceServerNotResponding = 76, + WV_Status_CA_MakeMissing = 77, + WV_Status_CA_ModelMissing = 78, + WV_Status_CA_DeviceInfoAlreadyExist = 79, + WV_Status_CA_DeviceInfoNotFound = 80, + WV_Status_CA_InvalidAccess = 81, + WV_Status_CA_AccessMissing = 82, + WV_Status_CA_InvalidDate = 83, + WV_Status_CA_PortalNotSupported = 84, + WV_Status_CA_PortalDeniedByDevice = 85, + WV_Status_CA_AddDeviceNotAllowed = 86, + WV_Status_CA_PortalNotFound = 87, + WV_Status_CA_PortalAlreadyExist = 88, + WV_Status_CA_PortalServerNotResponding = 89, + WV_Status_CA_PortalFlagsMissing = 90, + WV_Status_CA_AssetDeleted = 91, + WV_Status_CA_AssetUpdated = 92, + WV_Status_CA_AssetUpdateFailed = 93, + WV_Status_CA_IPNotAllowedByPolicy = 94, + WV_Status_CA_AckUrlMissing = 95, + WV_Status_CA_HeartbeatUrlMissing = 96, + WV_Status_CA_SystemIDMissing = 97, + WV_Status_CA_PlatformMissing = 98, + WV_Status_CA_OwnerUnknown = 99, + WV_Status_CA_InvalidBitrate = 100, + WV_Status_CA_InvalidSystemID = 101, + WV_Status_CA_DeviceKeyNotFound = 102, + WV_Status_CA_DeviceKeyServerNotResponding = 103, + WV_Status_CA_AssetKeyNotFound = 104, + WV_Status_CA_MediaDigestSignatureMissing = 105, + WV_Status_CA_MediaDigestSignatureNotValid = 106, + + // Status OK (no error) + WV_Status_OK = 200, + + // HTTP Result codes + WV_Status_Bad_Request = 400, + WV_Status_Unauthorized = 401, + WV_Status_Not_Found = 404, + WV_Status_Method_Not_Allowed = 405, + WV_Status_Request_Timeout = 408, + WV_Status_Unsupported_Media_Type = 415, + WV_Status_Requested_Range_Not_Satisfiable = 416, + WV_Status_Invalid_Parameter = 451, + WV_Status_Session_Not_Found = 454, + WV_Status_Method_Not_Valid_In_This_State = 455, + WV_Status_Invalid_Range = 457, + WV_Status_Unsupported_Transport = 461, + WV_Status_Destination_Unreachable = 462, + WV_Status_Terminate_Requested = 463, + WV_Status_Internal_Server_Error = 500, + WV_Status_Not_Implemented = 501, + WV_Status_Service_Unavailable = 503, + WV_Status_Service_Response_Error = 504, + + // Range 512 - 768 Reserved for customers. License-revoking codes + WV_Status_Min_TP_Error = 512, + WV_Status_Max_TP_Error = 768, + + // Range 769 - 999 Reserved for customers. Non-license revoking codes + WV_Status_Min_TP_NoRevoke_Error = 769, + WV_Status_Max_TP_NoRevoke_Error = 999, + + // WidevineMediaKit + WV_Status_End_Of_Media = 1000, + WV_Status_Invalid_Data_Format = 1001, + WV_Status_Invalid_Data_Version = 1002, + WV_Status_Parse_Error = 1003, + WV_Status_Tamper_Detected = 1004, + WV_Status_Truncated_Media = 1005, + WV_Status_WVMK_Internal_Error = 1006, + WV_Status_Entitlement_Error = 1007, + WV_Status_Key_Error = 1008, + WV_Status_Value_Out_Of_Range = 1009, + WV_Status_System_Error = 1010, + WV_Status_Invalid_Response = 1011, + WV_Status_Unsupported_Transport_Type = 1012, + WV_Status_FileSystem_Error = 1013, + WV_Status_User_Cancel = 1014, + WV_Status_InvalidState = 1015, + WV_Status_InvalidPiggybackFile = 1016, + WV_Status_Configuration_Error = 1017, + WV_Status_Error_NoAdaptiveTracks = 1018, + WV_Status_Invalid_Credentials = 1019, + WV_Status_InitializationFailed = 1020, + WV_Status_AlreadyInitialized = 1021, + WV_Status_NotInitialized = 1022, + WV_Status_NoLicenseManagerInstance = 1023, + WV_Status_Invalid_Track = 1024, + WV_Status_Invalid_Timestamp = 1025, + WV_Status_Cannot_TrickPlay = 1026, + WV_Status_NotYetSupported = 1027, + WV_Status_Invalid_Key = 1028, + WV_Status_Invalid_Manifest = 1029, + WV_Status_Key_Mismatch = 1030, + + WV_Status_Warning_Download_Stalled = 2000, + WV_Status_Warning_Need_Key = 2001, + WV_Status_Warning_Not_Available = 2002, + WV_Status_Checking_Bandwidth = 2003, + WV_Status_Error_Download_Stalled = 2004, + WV_Status_Error_Need_Key = 2005, + WV_Status_Error_Out_Of_Memory = 2006, + WV_Status_Uninitialized = 2007, + WV_Status_Internal_Error = 2008, + WV_Status_Error_Invalid_Chapter = 2009, + WV_Status_Heartbeat_Configuration_Error = 2010, + WV_Status_Invalid_Keybox = 2011, + WV_Status_Warning_CantVerifyIntegrity = 2012, + WV_Status_Warning_ContinuityCounterError = 2014, + WV_Status_Warning_Emm_Expired = 2015, + + // PDL + WV_Status_PDL_Invalid_State = 3000, + WV_Status_PDL_Invalid_Path = 3001, + WV_Status_PDL_Already_Exists = 3002, + WV_Status_PDL_Invalid_Track = 3003, + WV_Status_PDL_DownloadIncomplete = 3004, + WV_Status_PDL_AlreadyFinalized = 3005, + + // License Manager + WV_Status_LicMgr_OutOfMemory = 4001, + WV_Status_LicMgr_LicenseAbsent = 4002, + WV_Status_LicMgr_LicenseExpired = 4003, + WV_Status_LicMgr_LicenseCorrupted = 4004, + WV_Status_LicMgr_LicenseOptionalFieldsMissing = 4005, + WV_Status_LicMgr_OutsideLicenseWindow = 4006, + WV_Status_LicMgr_OutsidePurchaseWindow = 4007, + WV_Status_LicMgr_OutsideDistributionWindow = 4008, + WV_Status_LicMgr_DataStoreCorrupted = 4009, + WV_Status_LicMgr_DataStoreReadFailed = 4010, + WV_Status_LicMgr_DataStoreWriteFailed = 4011, + WV_Status_LicMgr_DataStoreFileDoesNotExist = 4012, + WV_Status_LicMgr_ClockTamperDetected = 4013, + WV_Status_LicMgr_EMMError = 4014, + WV_Status_LicMgr_NoEMMsPresent = 4015, + WV_Status_LicMgr_CACGIError = 4016, + WV_Status_LicMgr_AssetNotRegistered = 4017, + WV_Status_LicMgr_LicenseRevoked = 4018, + WV_Status_LicMgr_CACGIStatusError = 4019, + WV_Status_LicMgr_ObserversNotFound = 4020, + WV_Status_LicMgr_PendingServerNotification = 4021, + WV_Status_LicMgr_DuplicateAsset = 4022, + WV_Status_LicMgr_PlaybackModeNotAllowed = 4023, + WV_Status_LicMgr_LicenseRefreshRequired = 4023, + + // Asset Registry API + WV_Status_AR_AssetAlreadyRegistered = 4100, + + // Media Transformer API + WV_Status_Transformer_InvalidSession = 4200, + WV_Status_Transformer_UnsupportedConfiguration = 4201 + +} WVStatus; + + + +#endif // __WVSTATUS_H__ diff --git a/proprietary/streamcontrol/include/WVStreamControlAPI.h b/proprietary/streamcontrol/include/WVStreamControlAPI.h index dfde6309..1459475e 100644 --- a/proprietary/streamcontrol/include/WVStreamControlAPI.h +++ b/proprietary/streamcontrol/include/WVStreamControlAPI.h @@ -1,14 +1,17 @@ -/* - * Copyright 2011 Widevine Technologies, Inc., All Rights Reserved - * - * Declarations for Widevine Adaptive Streaming API - */ +// +// Declarations for Widevine Adaptive Streaming API +// +// Copyright 2011 Widevine Technologies, Inc., All Rights Reserved +// #ifndef __WV_STREAM_CONTROL_API_H__ #define __WV_STREAM_CONTROL_API_H__ #include #include +#include "WVStatus.h" +#include "WVTypes.h" +#include "WVControlSettings.h" #if OS_WIN #ifdef CLIENTAPI_EXPORTS @@ -27,68 +30,12 @@ typedef enum WVLogging { WV_Logging_ParseOutput = 2, } WVLogging; -typedef enum WVStatus { - WV_Status_OK = 200, - WV_Status_Bad_Request = 400, - WV_Status_Unauthorized = 401, - WV_Status_Not_Found = 404, - WV_Status_Method_Not_Allowed = 405, - WV_Status_Request_Timeout = 408, - WV_Status_Unsupported_Media_Type = 415, - WV_Status_Requested_Range_Not_Satisfiable = 416, - WV_Status_Invalid_Parameter = 451, - WV_Status_Session_Not_Found = 454, - WV_Status_Method_Not_Valid_In_This_State = 455, - WV_Status_Invalid_Range = 457, - WV_Status_Unsupported_Transport = 461, - WV_Status_Destination_Unreachable = 462, - WV_Status_Terminate_Requested = 463, - WV_Status_Internal_Server_Error = 500, - WV_Status_Not_Implemented = 501, - WV_Status_Service_Unavailable = 503, - WV_Status_Service_Response_Error = 504, - WV_Status_Min_TP_Error = 512, // Error codes 512-768 are reserved for - WV_Status_Max_TP_Error = 768, // Third Party apps (Cinema Now) - WV_Status_End_Of_Media = 1000, - WV_Status_Invalid_Data_Format = 1001, - WV_Status_Invalid_Data_Version = 1002, - WV_Status_Parse_Error = 1003, - WV_Status_Tamper_Detected = 1004, - WV_Status_Truncated_Media = 1005, - WV_Status_WVMK_Internal_Error = 1006, - WV_Status_Entitlement_Error = 1007, - WV_Status_Key_Error = 1008, - WV_Status_Value_Out_Of_Range = 1009, - WV_Status_System_Error = 1010, - WV_Status_Invalid_Response = 1011, - WV_Status_Unsupported_Transport_Type = 1012, - WV_Status_FileSystem_Error = 1013, - WV_Status_User_Cancel = 1014, - WV_Status_InvalidState = 1015, - WV_Status_InvalidPiggybackFile = 1016, - WV_Status_Configuration_Error= 1017, - WV_Status_Warning_Download_Stalled = 2000, - WV_Status_Warning_Need_Key = 2001, - WV_Status_Warning_Not_Available = 2002, - WV_Status_Checking_Bandwidth = 2003, - WV_Status_Error_Download_Stalled = 2004, - WV_Status_Error_Need_Key = 2005, - WV_Status_Error_Out_Of_Memory = 2006, - WV_Status_Uninitialized = 2007, - WV_Status_Internal_Error = 2008, - WV_Status_Error_Invalid_Chapter = 2009, - WV_Status_Heartbeat_Configuration_Error = 2010, - WV_Status_Invalid_Keybox = 2011, - WV_Status_Error_NoAdaptiveTracks = 2012, - WV_Status_Warning_ContinuityErrorCounter = 2014, -} WVStatus; - - typedef enum WVOutputFormat { WV_OutputFormat_PS = 0, // Generic program stream WV_OutputFormat_DVD_Video = 1, // DVD-Video program stream WV_OutputFormat_TS = 2, // Transport Stream - WV_OutputFormat_ES = 3 // Elementary Streams + WV_OutputFormat_ES = 3, // Elementary Streams + WV_OutputFormat_DVD_Video_No_EAC3_Framing = 4 // DVD-Video without Dolby Digital+ audio framing } WVOutputFormat; @@ -99,46 +46,61 @@ typedef enum WVEsSelector { } WVEsSelector; -struct WVCredentials { - std::string deviceID; // unique player device ID from CinemaNow - std::string streamID; // unique streamID from CinemaNow - std::string clientIP; // IP address of client - std::string drmServerURL; // URL for DRM server - std::string userData; // Additional optional user data, TBD - std::string portal; // Identifies the operator - std::string storefront; // Identifies store run by operator - std::string drmAckServerURL; // URL for server that receives - // entitlement confirmations - std::string heartbeatURL; // URL to receive client heartbeats - unsigned int heartbeatPeriod;// Duration between consecutive heartbeats in - // seconds. 0 indicates no heatbeats requested - unsigned int cnDeviceType; // device type identifier defined by CinemaNow -}; - -struct WVProxySettings { - bool enable; // If true, proxy use is enable, otherwise disabled - std::string ipAddr; // IP address of proxy server, e.g. "1.2.3.4" or host name - unsigned short ipPort; // IP port number - std::string userId; // User ID if authentication is needed, otherwise "" to disable authentication - std::string password; // Password if userID is not "" -}; +#define UNSPECIFIED_TRACK_ID WVUnsignedInt(0) class WVSession; -// -// Callbacks used for RTSP direct function call implementation and/or -// direct function call push data model. -// Also buffer allocation routines for using an external allocator -// - -typedef void (*WVDecryptCallback)(WVEsSelector esType, void* input, void* output, size_t length, int key); // Provide info on socket open/close operations for bandwidth attribution // status: {0=open, 1=close} -typedef void (*WVSocketInfoCallback)(int fd, int status, void *context); +typedef void (*WVSocketInfoCallback)(int fd, int status, void * context); + +// +// CALLBACK: WVDecryptCallback +// +// Gets called to decrypt individual crypto units +// +// Parameters: +// [in] es_type - Type of elementary stream, indicating audio or video +// [in] input - Pointer to encrypted crypto unit +// [in] output - Pointer or handle to receive decrypted crypto unit +// [in] length - Length of crypto unit +// [in] key - ID of key to use for decryption +// [in] dts - Decode timestamp, 90 KHz clock +// [in] pts - Presentation timestamp, 90 KHz clock +// [in] au_end - Indicates end of Access Unit (last CU in frame) +// +// Returns: +// - WV_Status_OK: Decryption succeeded +// - WV_Status_Warning_Need_Key: Indicates key not yet available, will +// be retried +// - Error code indicating problem. Causes playback to halt. +// +typedef WVStatus (*WVDecryptCallback)(WVEsSelector es_type, void* input, void* output, size_t length, + int key, unsigned long long dts, unsigned long long pts, bool au_end); + +enum WVDecryptCallbackMode { + WVDecryptCallbackMode_MultiCU = 0, // WVDecryptCallback called repeatedly until buffer exhausted + WVDecryptCallbackMode_SingleCU = 1, // WVDecryptCallback called once + WVDecryptCallbackMode_WholeAU = 2, // WVDecryptCallback called repeatedly until AU complete +}; + + +class WVCallbacks { + public: + WVCallbacks() : + pushData(NULL), + response(NULL), + allocBuffer(NULL), + freeBuffer(NULL), + getDeviceID(NULL), + getKeyboxPath(NULL), + decrypt(NULL), + decryptMode(WVDecryptCallbackMode_MultiCU), + socketInfo(NULL) + {} -struct WVCallbacks { void (*pushData)(unsigned short port, void *buffer, size_t length); void (*response)(WVSession *session, const std::string &response); void *(*allocBuffer)(size_t); @@ -148,12 +110,15 @@ struct WVCallbacks { int (*getDeviceID)(char *buffer, size_t size); int (*getKeyboxPath)(char* path, size_t size); + WVDecryptCallback decrypt; + WVDecryptCallbackMode decryptMode; // publish info about descriptors used for streaming for accounting purposes WVSocketInfoCallback socketInfo; }; + // // METHOD: WV_Initialize // @@ -433,16 +398,16 @@ WV_CheckBandwidth(const std::string &url, unsigned long *bandwidth, const WVProx //This form is deprecated and may be removed in a future release CLIENT_API WVStatus WV_Setup(WVSession *&session, const std::string &url, - const std::string &transport, WVCredentials &credentials, - WVOutputFormat outputFormat = WV_OutputFormat_PS, - unsigned long bufferSize = 10 * 1024 * 1024, void *context = NULL); + const std::string &transport, WVCredentials &credentials, + WVOutputFormat outputFormat = WV_OutputFormat_PS, + unsigned long bufferSize = 10 * 1024 * 1024, void *context = NULL); // Setup using a proxy CLIENT_API WVStatus WV_Setup(WVSession *&session, const std::string &url, - const std::string &transport, WVCredentials &credentials, - WVProxySettings &proxy, WVOutputFormat outputFormat = WV_OutputFormat_PS, - unsigned long bufferSize = 10 * 1024 * 1024, void *context = NULL); + const std::string &transport, WVCredentials &credentials, + WVProxySettings &proxy, WVOutputFormat outputFormat = WV_OutputFormat_PS, + unsigned long bufferSize = 10 * 1024 * 1024, void *context = NULL); // // An alternate form of WV_Setup that receives data from a file source instead of accessing @@ -578,12 +543,20 @@ WV_Teardown(WVSession *&session); // version. This is needed since neither absolute time nor zero time // are appropriate for this case. // +// [in] audioTrack - The ID of the audio track to be used. This value can be +// from the audio track dictionaries obtained via WV_Info_GetAudioTracks. +// This value is optional. If UNSPECIFIED_TRACK_ID is used, the default +// audio track, which is the first encoded into the media package, or +// the last selected audio track is used. +// +// // Returns: // WV_Status_OK on success, otherwise one of the WVStatus values // indicating the specific error. // CLIENT_API WVStatus -WV_Play(WVSession *session, float scale_requested, float *scale_used, const std::string &range); +WV_Play(WVSession *session, float scale_requested, float *scale_used, + const std::string &range, WVUnsignedInt audioTrack = UNSPECIFIED_TRACK_ID); // // METHOD: WV_Pause @@ -715,7 +688,6 @@ WV_GetData(WVSession *session, unsigned char *buffer, size_t request_size, // This method is used when the client chooses to receive elementary stream data directly via // function call using a pull data model. This method always returns data corresponding to // at most one single access unit. - // // Parameters: // [in] session - The session from which data is requested @@ -729,8 +701,6 @@ WV_GetData(WVSession *session, unsigned char *buffer, size_t request_size, // // [out] return_size - On return, set to the number of bytes written into the buffer // -// [out] au_start - On return, indicates whether the data belongs to the next access unit. -// // [out] dts - On return, set to MPEG-2 access unit decoding timestamp (DTS) // // [out] pts - On return, set to MPEG-2 access unit presentation timestamp (PTS) @@ -738,6 +708,8 @@ WV_GetData(WVSession *session, unsigned char *buffer, size_t request_size, // [out] sync_frame - On return, indicates whether the data belongs to a sync frame // (video key frame, or audio frame). // +// [out] au_end - On return, indicates whether the data belongs to the end of the access unit. +// // Returns: // WV_Status_OK on success, otherwise one of the WVStatus values // indicating the specific error. @@ -745,7 +717,33 @@ WV_GetData(WVSession *session, unsigned char *buffer, size_t request_size, CLIENT_API WVStatus WV_GetEsData(WVSession *session, WVEsSelector es_selector, unsigned char *buffer, size_t request_size, size_t& return_size, - bool& au_start, unsigned long long& dts, unsigned long long& pts, bool& sync_frame); + unsigned long long& dts, unsigned long long& pts, bool& sync_frame, bool& au_end); + + +// +// METHOD: WV_GetNextEsDataBufferSize +// +// This method returns the optimal size of the buffer size that should be used in the next +// call to WV_GetEsData. Calculation is dependent on whether a decryption callback is used +// and if so, the decrypt callback mode (WVDecryptCallbackMode), returning the total size of +// remaining crypto units in the current access unit (no decrypt callback or +// WVDecryptCallbackMode_MultiCU specified), the size of the next crypto unit +// (decrypt callback and WVDecryptCallbackMode_SingleCU specified), or the size of the next +// access unit (decrypt callback and WVDecryptCallbackMode_WholeAU specified) +// +// Parameters: +// [in] session - The session from which data is requested +// +// [in] es_selector - Selector specifying the elementary stream targetted. +// +// [out] buffer_size - The size of the buffer +// +// Returns: +// WV_Status_OK on success, otherwise one of the WVStatus values +// indicating the specific error. +// +CLIENT_API WVStatus +WV_GetNextEsDataBufferSize(WVSession* session, WVEsSelector es_selector, size_t &buffer_size); // @@ -1067,6 +1065,28 @@ CLIENT_API WVStatus WV_Info_TimeBuffered(WVSession *session, float *secondsBuffered); +// +// METHOD: WV_Info_GetStats +// +// This method is used to query current stats from the Widevine +// adaptive client. +// +// Parameters: +// [in] session - The session to query +// +// [in,out] stats - Dictionary containing placeholders for the +// stats to be queried. On return the available +// stats will be filled in. +// +// Returns: +// WV_Status_OK on success, otherwise one of the WVStatus values +// indicating the specific error. +// + +CLIENT_API WVStatus +WV_Info_GetStats(WVSession *session, WVDictionary& stats); + + // // METHOD: WV_Info_GetAdaptiveBitrates // @@ -1297,7 +1317,7 @@ WV_SkipChapters(WVSession *session, std::string currentTime, long chapters); // -// METHOD: WV_SkipToChapter +// METHOD: WV_GoToChapter // // This method causes the stream to skip to a specified chapter. // @@ -1315,4 +1335,143 @@ WV_SkipChapters(WVSession *session, std::string currentTime, long chapters); CLIENT_API WVStatus WV_GoToChapter(WVSession *session, unsigned long chapterSeqNum); + +// +// METHOD: WV_Info_GetVideoTracks +// +// This method populates a WVTypedValueArray containing a WVDictionary entry +// for each adaptive video track in the media. These dicionaries contain all +// the information available for the video, as well as the track ID. +// +// Parameters: +// [in] session - The session to control +// +// [out] tracks - WVTypedValueArray which on return will contain an array +// of video track info WVDictionary(s). +//// +// Returns: +// WV_Status_OK on success, otherwise one of the WVStatus values +// indicating the specific error. +// + +CLIENT_API WVStatus +WV_Info_GetVideoTracks(WVSession *session, WVTypedValueArray& tracks); + + +// +// METHOD: WV_Info_GetAudioTracks +// +// This method populates a WVTypedValueArray containing a WVDictionary entry +// for each separate audio track in the media. These dicionaries contain all +// the information available for the audio, as well as the track ID. +// +// Parameters: +// [in] session - The session to control +// +// [out] tracks - WVTypedValueArray which on return will contain an array +// of audio track info WVDictionary(s). +//// +// Returns: +// WV_Status_OK on success, otherwise one of the WVStatus values +// indicating the specific error. +// + +CLIENT_API WVStatus +WV_Info_GetAudioTracks(WVSession *session, WVTypedValueArray& tracks); + + + +// +// METHOD: WV_Info_GetSubtitleTracks +// +// This method populates a WVTypedValueArray containing a WVDictionary entry +// for each separate subtitle track in the media. These dicionaries contain all +// the information available for subtitle. +// +// NOTE: Subtitle tracks cannot be selected. They are meant to be rendered by +// the device media player. +// +// Parameters: +// [in] session - The session to control +// +// [out] tracks - WVTypedValueArray which on return will contain an array +// of subtile track info WVDictionary(s). +//// +// Returns: +// WV_Status_OK on success, otherwise one of the WVStatus values +// indicating the specific error. +// + + +CLIENT_API WVStatus +WV_Info_GetSubtitleTracks(WVSession *session, WVTypedValueArray& tracks); + + +// +// METHOD: WV_Info_GetCurrentVideoTrack +// +// This method populates a WVDicionary all the information available for the +// current adaptive video track, as well as its track ID. +// +// Parameters: +// [in] session - The session to control +// +// [out] track - WVDictionary which on return will contain the information +// available for the current adaptive video track +//// +// Returns: +// WV_Status_OK on success, otherwise one of the WVStatus values +// indicating the specific error. +// + +CLIENT_API WVStatus +WV_Info_GetCurrentVideoTrack(WVSession *session, WVDictionary& track); + + +// +// METHOD: WV_Info_GetCurrentAudioTrack +// +// This method populates a WVDicionary all the information available for the +// current separate audio track, as well as its track ID. +// +// Parameters: +// [in] session - The session to control +// +// [out] track - WVDictionary which on return will contain the information +// available for the current adaptive video track +//// +// Returns: +// WV_Status_OK on success, otherwise one of the WVStatus values +// indicating the specific error. This function returns the status +// WV_Status_Warning_Not_Available if separate audio is not available. +// + +CLIENT_API WVStatus +WV_Info_GetCurrentAudioTrack(WVSession *session, WVDictionary& track); + + +// +// METHOD: WV_SelectTrack +// +// This method is used to explicitly select an adaptive video track or +// separate audio track. +// +// Parameters: +// [in] session - The session to control +// +// [out] trackId - The track ID for the track to be selected. +// If an adaptive video track ID is specified, then a +// video track change will be effected. Specifying +// UNSPECIFIED_TRACK_ID will resume normal adaptive +// video behavior. +// If a separate audio track ID is specified, then +// an audio track change will be effected. +//// +// Returns: +// WV_Status_OK on success, otherwise one of the WVStatus values +// indicating the specific error. +// +CLIENT_API WVStatus WV_SelectTrack(WVSession* session, WVUnsignedInt trackId); + + #endif // __WV_STREAM_CONTROL_API_H__ diff --git a/proprietary/streamcontrol/include/WVTypes.h b/proprietary/streamcontrol/include/WVTypes.h new file mode 100644 index 00000000..648d6dac --- /dev/null +++ b/proprietary/streamcontrol/include/WVTypes.h @@ -0,0 +1,248 @@ +/**************************************************************************************************** + * WVTypes.h + * + * (c) Copyright 2011-2012 Google, Inc. + * + * Widevine API types + ***************************************************************************************************/ + +#ifndef __WVTYPES_H__ +#define __WVTYPES_H__ + +#include +#include +#include +#include + +// Unsigned and signed integer types (32 bits) +typedef uint32_t WVUnsignedInt; +typedef int32_t WVSignedInt; +typedef uint64_t WVUnsignedLong; +typedef int64_t WVSignedLong; +typedef float WVFloat; +typedef bool WVBoolean; + +// String type +typedef std::string WVString; + +// Array of strings +typedef std::vector WVStringArray; +typedef std::vector WVDataBlob; + +// Forward declarations +class WVDictionary; +class WVTypedValueRep; +class WVTypedValueArray; + + +// Classs to hold a typed value to be stored in a WVTypedValueArray or a WVDictionary +class WVTypedValue +{ + public: + enum Type { + Type_Null = 0, + Type_UnsignedInt = 1, + Type_SignedInt = 2, + Type_UnsignedLong = 3, + Type_SignedLong = 4, + Type_Float = 5, + Type_WVBoolean = 6, + Type_String = 7, + Type_Array = 8, + Type_Dictionary = 9, + Type_DataBlob = 10 + }; + + // Constructs Type_Null value + WVTypedValue(); + + // Copy constructor and assignment operator + WVTypedValue(WVTypedValue const& original); + WVTypedValue const& operator=(WVTypedValue const& rhs); + + // Constructors for various typed values + WVTypedValue(WVUnsignedInt value); + WVTypedValue(WVSignedInt value); + WVTypedValue(WVUnsignedLong value); + WVTypedValue(WVSignedLong value); + WVTypedValue(WVFloat value); + WVTypedValue(WVBoolean value); + WVTypedValue(WVString const& value); + WVTypedValue(WVTypedValueArray const& value); + WVTypedValue(WVDictionary const& value); + WVTypedValue(WVDataBlob const& value); + + ~WVTypedValue(); + + // Returns the type of the value held in the object + Type GetType() const { return(mType); } + + // Accessors to retrieve the value. Returns false if asked for a value of the wrong type + WVBoolean GetValue(WVUnsignedInt& value) const; + WVBoolean GetValue(WVSignedInt& value) const; + WVBoolean GetValue(WVUnsignedLong& value) const; + WVBoolean GetValue(WVSignedLong& value) const; + WVBoolean GetValue(WVFloat& value) const; + WVBoolean GetValue(WVBoolean& value) const; + WVBoolean GetValue(WVString const*& value) const; + WVBoolean GetValue(WVTypedValueArray const*& value) const; + WVBoolean GetValue(WVDictionary const*& value) const; + WVBoolean GetValue(WVDataBlob const*& value) const; + + // Accessors to set the value. Can be used to change both the value and the type + void SetUnsignedIntValue(WVUnsignedInt value); + void SetSignedIntValue(WVSignedInt value); + void SetUnsignedLongValue(WVUnsignedLong value); + void SetSignedLongValue(WVSignedLong value); + void SetFloatValue(WVFloat value); + void SetBooleanValue(WVBoolean value); + void SetStringValue(WVString const& value); + void SetArrayValue(WVTypedValueArray const& value); + void SetDictionaryValue(WVDictionary const& value); + void SetDataBlobValue(WVDataBlob const& value); + + // Serialize into WVDataBlob + void Serialize(WVDataBlob& intoBlob) const; + + // Deserialize from WVDataBlob. Returns bytes used, 0 on failure + WVUnsignedInt Deserialize(WVDataBlob const& fromBlob, WVUnsignedInt fromIndex = 0); + + // Dump value in human-readable format to toString + void Dump(WVString const& prefix, WVString& toString) const; + + private: + void Reset(); + + union Representation { + WVUnsignedInt uUnsignedIntValue; + WVSignedInt uSignedIntValue; + WVUnsignedLong uUnsignedLongValue; + WVSignedLong uSignedLongValue; + WVFloat uFloatValue; + WVBoolean uBooleanValue; + WVTypedValueRep* uOtherValue; + }; + Type mType; + Representation mValue; +}; + + +// Class which holds an array of WVTypedValue. Types of values stored may vary +class WVTypedValueArray +{ + public: + // Returns the number of entries in the array + WVUnsignedInt Size() const { return mArray.size(); } + bool Empty() const { return mArray.empty(); } + + // Disposes of all entries in the array + void Clear() { mArray.clear(); } + + // Returns a pointer to an element in an array. NULL if the index is out of range + WVTypedValue const* operator[](WVUnsignedInt index) const; + + // Iterator type and boundary methods for typed value array + typedef std::vector::const_iterator Iterator; + Iterator Begin() const { return(mArray.begin()); } + Iterator End() const { return(mArray.end()); } + + // Adds a typed value to the end of the array + void Push(WVTypedValue const& entry) { mArray.push_back(entry); } + + // Accessors for typed values stored in the array. Returns false if index is out of range, + // or if trying to retrieve a value of the incorrect type. + WVBoolean GetValue(WVUnsignedInt index, WVUnsignedInt& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVSignedInt& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVUnsignedLong& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVSignedLong& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVFloat& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVBoolean& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVString const*& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVTypedValueArray const*& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVDictionary const*& value) const; + WVBoolean GetValue(WVUnsignedInt index, WVDataBlob const*& value) const; + + // Serialize into WVDataBlob + void Serialize(WVDataBlob& intoBlob) const; + + // Deserialize from WVDataBlob. Returns bytes used, 0 on failure + WVUnsignedInt Deserialize(WVDataBlob const& fromBlob, WVUnsignedInt fromIndex = 0); + + // Dump values in human-readable format to toString + void Dump(WVString const& prefix, WVString& toString) const; + + private: + std::vector mArray; +}; + + +// Object which holds named typed value pairs. Types of values stored may vary +class WVDictionary +{ + public: + // Returns the number of entries in the dictionary + WVUnsignedInt Size() const { return mMap.size(); } + bool Empty() const { return mMap.empty(); } + + // Disposes of all entries in the dictionary + void Clear() { mMap.clear(); } + + // Iterator type and bounary methods for dictionary. + typedef std::map::const_iterator Iterator; + Iterator Begin() const { return(mMap.begin()); } + Iterator End() const { return(mMap.end()); } + + // Store a typed value for the specified key. Replaces any previous value stored for the key + void SetEntry(WVString const& key, WVTypedValue const& entry = WVTypedValue()) { mMap[key] = entry; } + + // Remove the typed value for the specified key. Fails silently if value is not present + void RemoveEntry(WVString const& key); + + // Copy an entry from another dictionary + void CopyEntryFrom(WVString const& key, WVDictionary const& fromDict, bool removeIfNotFound = false); + + // Merge two dictionaries + void Merge(WVDictionary const& fromDict, bool replaceDuplicates); + + // Returns a pointer to a stored value for a specified key. Returns NULL if value not present + WVTypedValue const* GetEntry(WVString const& key) const; + + // Accessor methods for typed values stored in the dictionary. Returns false if the value + // is not present, or if trying to retrieve a value of the incorrect type + WVBoolean GetValue(WVString const& key, WVUnsignedInt& value) const; + WVBoolean GetValue(WVString const& key, WVSignedInt& value) const; + WVBoolean GetValue(WVString const& key, WVUnsignedLong& value) const; + WVBoolean GetValue(WVString const& key, WVSignedLong& value) const; + WVBoolean GetValue(WVString const& key, WVFloat& value) const; + WVBoolean GetValue(WVString const& key, WVBoolean& value) const; + WVBoolean GetValue(WVString const& key, WVString const*& value) const; + WVBoolean GetValue(WVString const& key, WVTypedValueArray const*& value) const; + WVBoolean GetValue(WVString const& key, WVDictionary const*& value) const; + WVBoolean GetValue(WVString const& key, WVDataBlob const*& value) const; + + // Convenience accessors. Return default values if not found or wrong type specified + WVUnsignedInt GetUnsignedIntValue(WVString const& key, WVUnsignedInt defaultValue = 0) const; + WVSignedInt GetSignedIntValue(WVString const& key, WVSignedInt defaultValue = 0) const; + WVUnsignedLong GetUnsignedLongValue(WVString const& key, WVUnsignedLong defaultValue = 0) const; + WVSignedLong GetSignedLongValue(WVString const& key, WVSignedLong defaultValue = 0) const; + WVFloat GetFloatValue(WVString const& key, WVFloat defaultValue = 0) const; + WVBoolean GetBooleanValue(WVString const& key, WVBoolean defaultValue = 0) const; + WVString GetStringValue(WVString const& key, WVString const& defaultValue = "") const; + + // Serialize into WVDataBlob + void Serialize(WVDataBlob& intoBlob) const; + + // Deserialize from WVDataBlob. Returns bytes used, 0 on failure + WVUnsignedInt Deserialize(WVDataBlob const& fromBlob, WVUnsignedInt fromIndex = 0); + + // Merge dictionary into current one + WVDictionary const& operator+=(WVDictionary const& rhs); + + // Dumps values in human-readable format to toString + void Dump(WVString const& prefix, WVString& toString) const; + + private: + std::map mMap; +}; + +#endif // __WVTYPES_H__ diff --git a/proprietary/streamcontrol/lib/libWVStreamControlAPI_L1.so b/proprietary/streamcontrol/lib/libWVStreamControlAPI_L1.so index a0e208d9..bb513ba9 100644 Binary files a/proprietary/streamcontrol/lib/libWVStreamControlAPI_L1.so and b/proprietary/streamcontrol/lib/libWVStreamControlAPI_L1.so differ diff --git a/proprietary/streamcontrol/lib/libWVStreamControlAPI_L3.so b/proprietary/streamcontrol/lib/libWVStreamControlAPI_L3.so index 2ee4d112..640b02f6 100644 Binary files a/proprietary/streamcontrol/lib/libWVStreamControlAPI_L3.so and b/proprietary/streamcontrol/lib/libWVStreamControlAPI_L3.so differ diff --git a/proprietary/wvm/WVMExtractorImpl.cpp b/proprietary/wvm/WVMExtractorImpl.cpp index fc1bf12b..f393601d 100644 --- a/proprietary/wvm/WVMExtractorImpl.cpp +++ b/proprietary/wvm/WVMExtractorImpl.cpp @@ -132,14 +132,19 @@ void WVMExtractorImpl::Initialize() #ifdef REQUIRE_SECURE_BUFFERS if (!mIsLiveStream) { - WVCallbacks callbacks = {NULL, NULL, NULL, NULL, NULL, NULL, WVMMediaSource::DecryptCallback, SocketInfoCallback}; + //ALOGD("WVMExtractorImpl::Initialize setting DecryptCallback\n"); + WVCallbacks callbacks; + callbacks.decrypt = WVMMediaSource::DecryptCallback; + callbacks.socketInfo = SocketInfoCallback; result = WV_Initialize(&callbacks); } else { - WVCallbacks callbacks = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, SocketInfoCallback}; + WVCallbacks callbacks; + callbacks.socketInfo = SocketInfoCallback; result = WV_Initialize(&callbacks); } #else - WVCallbacks callbacks = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, SocketInfoCallback}; + WVCallbacks callbacks; + callbacks.socketInfo = SocketInfoCallback; result = WV_Initialize(&callbacks); #endif @@ -352,7 +357,7 @@ status_t WVMExtractorImpl::readESDSMetaData(sp audioMetaData) int limit = 500; do { size_t bytesRead; - bool auStart, sync; + bool auEnd, sync; unsigned long long dts, pts; unsigned char buf[1]; size_t bufSize = 0; @@ -362,7 +367,7 @@ status_t WVMExtractorImpl::readESDSMetaData(sp audioMetaData) // pull some audio data. But we can't use it yet, so just request 0 bytes. // (void)WV_GetEsData(mSession, WV_EsSelector_Audio, buf, bufSize, - bytesRead, auStart, dts, pts, sync); + bytesRead, dts, pts, sync, auEnd); result = WV_Info_GetCodecConfig(mSession, WV_CodecConfigType_ESDS, config, size); if (result != WV_Status_OK) diff --git a/proprietary/wvm/WVMMediaSource.cpp b/proprietary/wvm/WVMMediaSource.cpp index fc6d9fca..c5858709 100644 --- a/proprietary/wvm/WVMMediaSource.cpp +++ b/proprietary/wvm/WVMMediaSource.cpp @@ -243,7 +243,7 @@ status_t WVMMediaSource::read(MediaBuffer **buffer, const ReadOptions *options) #endif size_t bytesRead; - bool auStart; + bool auEnd; size_t offset = 0; int64_t keyTime; @@ -259,7 +259,7 @@ status_t WVMMediaSource::read(MediaBuffer **buffer, const ReadOptions *options) size_t size = mediaBuf->size() - offset; WVStatus result = WV_GetEsData(mSession, mESSelector, (uint8_t *)mediaBuf->data() + offset, - size, bytesRead, auStart, mDts, mPts, syncFrame); + size, bytesRead, mDts, mPts, syncFrame, auEnd); if (result != WV_Status_OK && result != WV_Status_Warning_Need_Key && @@ -399,14 +399,15 @@ status_t WVMMediaSource::read(MediaBuffer **buffer, const ReadOptions *options) WVMMediaSource::DecryptContext WVMMediaSource::sDecryptContext[2] = {}; -void WVMMediaSource::DecryptCallback(WVEsSelector esType, void* input, void* output, - size_t length, int key) +WVStatus WVMMediaSource::DecryptCallback(WVEsSelector esType, void* input, void* output, size_t length, + int key, unsigned long long dts, unsigned long long pts, bool au_end) { //ALOGD("DecryptCallback(type=%d, in=%p, out=%p, len=%d, key=%d\n", // (int)esType, input, output, length, key); DecryptContext &context = sDecryptContext[esType]; OEMCrypto_UINT32 copied = length; OEMCryptoResult result; + WVStatus status; unsigned char *iv = NULL; if (key) @@ -422,11 +423,17 @@ void WVMMediaSource::DecryptCallback(WVEsSelector esType, void* input, void* out &copied); } - if (result != OEMCrypto_SUCCESS) { + if (result == OEMCrypto_SUCCESS) { + status = WV_Status_OK; + } + else { + status = WV_Status_Unknown; ALOGD("OEMCrypto decrypt failure: %d", result); } context.mOffset += copied; + + return status; } #endif diff --git a/proprietary/wvm/include/WVMMediaSource.h b/proprietary/wvm/include/WVMMediaSource.h index f9d36b93..c9401475 100644 --- a/proprietary/wvm/include/WVMMediaSource.h +++ b/proprietary/wvm/include/WVMMediaSource.h @@ -53,8 +53,9 @@ public: static const int kCryptoBlockSize = 16; unsigned char mIV[kCryptoBlockSize]; }; - static void DecryptCallback(WVEsSelector esType, void* input, void* output, - size_t length, int key); + static WVStatus DecryptCallback(WVEsSelector esType, void* input, void* output, size_t length, + int key, unsigned long long dts, unsigned long long pts, bool au_end); + static DecryptContext sDecryptContext[2]; // audio vs. video #endif