blob: fc2bab907d98353d1f8aad694f9e552a4c29fe76 [file] [log] [blame]
/*
* Copyright (C) 2020 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#if ENABLE(MEDIA_SOURCE)
#include "MediaPlayerEnums.h"
#include "SourceBufferPrivateClient.h"
#include <JavaScriptCore/Forward.h>
#include <pal/spi/cocoa/MediaToolboxSPI.h>
#include <variant>
#include <wtf/CompletionHandler.h>
#include <wtf/Expected.h>
#include <wtf/RefCounted.h>
#include <wtf/ThreadSafeRefCounted.h>
namespace WTF {
class Logger;
}
namespace WebCore {
class ContentType;
class MediaSampleAVFObjC;
class SharedBuffer;
class WEBCORE_EXPORT SourceBufferParser : public ThreadSafeRefCounted<SourceBufferParser> {
public:
static MediaPlayerEnums::SupportsType isContentTypeSupported(const ContentType&);
static RefPtr<SourceBufferParser> create(const ContentType&, bool webMParserEnabled);
virtual ~SourceBufferParser() = default;
enum class Type : uint8_t {
AVFObjC,
WebM,
};
virtual Type type() const = 0;
enum class AppendFlags : uint8_t {
None,
Discontinuity,
};
class Segment {
public:
#if HAVE(MT_PLUGIN_FORMAT_READER)
Segment(RetainPtr<MTPluginByteSourceRef>&&);
#endif
Segment(Ref<SharedBuffer>&&);
Segment(Segment&&) = default;
Ref<SharedBuffer> takeSharedBuffer();
// Will return nullptr if Segment's backend isn't a SharedBuffer.
RefPtr<SharedBuffer> getSharedBuffer() const;
size_t size() const;
enum class ReadError { EndOfFile, FatalError };
using ReadResult = Expected<size_t, ReadError>;
ReadResult read(size_t position, size_t, uint8_t* destination) const;
private:
std::variant<
#if HAVE(MT_PLUGIN_FORMAT_READER)
RetainPtr<MTPluginByteSourceRef>,
#endif
Ref<SharedBuffer>
> m_segment;
};
using CallOnClientThreadCallback = Function<void(Function<void()>&&)>;
void setCallOnClientThreadCallback(CallOnClientThreadCallback&&);
// appendData will be called on the SourceBufferPrivateAVFObjC data parser queue.
// Other methods will be called on the main thread, but only once appendData has returned.
virtual void appendData(Segment&&, CompletionHandler<void()>&& = [] { }, AppendFlags = AppendFlags::None) = 0;
virtual void flushPendingMediaData() = 0;
virtual void setShouldProvideMediaDataForTrackID(bool, uint64_t) = 0;
virtual bool shouldProvideMediadataForTrackID(uint64_t) = 0;
virtual void resetParserState() = 0;
virtual void invalidate() = 0;
virtual void setMinimumAudioSampleDuration(float);
#if !RELEASE_LOG_DISABLED
virtual void setLogger(const Logger&, const void* logIdentifier) = 0;
#endif
// Will be called on the main thread.
using InitializationSegment = SourceBufferPrivateClient::InitializationSegment;
using DidParseInitializationDataCallback = Function<void(InitializationSegment&&)>;
void setDidParseInitializationDataCallback(DidParseInitializationDataCallback&& callback)
{
m_didParseInitializationDataCallback = WTFMove(callback);
}
// Will be called on the main thread.
using DidEncounterErrorDuringParsingCallback = Function<void(uint64_t errorCode)>;
void setDidEncounterErrorDuringParsingCallback(DidEncounterErrorDuringParsingCallback&& callback)
{
m_didEncounterErrorDuringParsingCallback = WTFMove(callback);
}
// Will be called on the main thread.
using DidProvideMediaDataCallback = Function<void(Ref<MediaSampleAVFObjC>&&, uint64_t trackID, const String& mediaType)>;
void setDidProvideMediaDataCallback(DidProvideMediaDataCallback&& callback)
{
m_didProvideMediaDataCallback = WTFMove(callback);
}
// Will be called synchronously on the parser thead.
using WillProvideContentKeyRequestInitializationDataForTrackIDCallback = Function<void(uint64_t trackID)>;
void setWillProvideContentKeyRequestInitializationDataForTrackIDCallback(WillProvideContentKeyRequestInitializationDataForTrackIDCallback&& callback)
{
m_willProvideContentKeyRequestInitializationDataForTrackIDCallback = WTFMove(callback);
}
// Will be called synchronously on the parser thead.
using DidProvideContentKeyRequestInitializationDataForTrackIDCallback = Function<void(Ref<SharedBuffer>&&, uint64_t trackID)>;
void setDidProvideContentKeyRequestInitializationDataForTrackIDCallback(DidProvideContentKeyRequestInitializationDataForTrackIDCallback&& callback)
{
m_didProvideContentKeyRequestInitializationDataForTrackIDCallback = WTFMove(callback);
}
// Will be called on the main thread.
using DidProvideContentKeyRequestIdentifierForTrackIDCallback = Function<void(Ref<SharedBuffer>&&, uint64_t trackID)>;
void setDidProvideContentKeyRequestIdentifierForTrackIDCallback(DidProvideContentKeyRequestIdentifierForTrackIDCallback&& callback)
{
m_didProvideContentKeyRequestIdentifierForTrackIDCallback = WTFMove(callback);
}
protected:
SourceBufferParser();
CallOnClientThreadCallback m_callOnClientThreadCallback;
DidParseInitializationDataCallback m_didParseInitializationDataCallback;
DidEncounterErrorDuringParsingCallback m_didEncounterErrorDuringParsingCallback;
DidProvideMediaDataCallback m_didProvideMediaDataCallback;
WillProvideContentKeyRequestInitializationDataForTrackIDCallback m_willProvideContentKeyRequestInitializationDataForTrackIDCallback;
DidProvideContentKeyRequestInitializationDataForTrackIDCallback m_didProvideContentKeyRequestInitializationDataForTrackIDCallback;
DidProvideContentKeyRequestIdentifierForTrackIDCallback m_didProvideContentKeyRequestIdentifierForTrackIDCallback;
};
}
#endif // ENABLE(MEDIA_SOURCE)