webrtc/api/frame_transformer_interface.h
Marina Ciocea cdc89b4d14 Add GetMetadata() to TransformableVideoFrameInterface API.
Define VideoHeaderMetadata, containing a subset of the metadata in RTP
video header, and expose it the TransformableVideoFrameInterface, to
enable web application to compute additional data according to their own
logic, and eventually remove GetAdditionalData() from the interface.

Bug: chromium:1069295
Change-Id: Id85b494a72cfd8bdd4c0614844b9f0ffae98c956
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/174822
Commit-Queue: Marina Ciocea <marinaciocea@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Magnus Flodman <mflodman@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31265}
2020-05-14 19:26:55 +00:00

106 lines
3.7 KiB
C++

/*
* Copyright 2020 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef API_FRAME_TRANSFORMER_INTERFACE_H_
#define API_FRAME_TRANSFORMER_INTERFACE_H_
#include <memory>
#include <vector>
#include "api/scoped_refptr.h"
#include "api/video/encoded_frame.h"
#include "api/video/video_frame_metadata.h"
#include "rtc_base/ref_count.h"
namespace webrtc {
// Owns the frame payload data.
class TransformableFrameInterface {
public:
virtual ~TransformableFrameInterface() = default;
// Returns the frame payload data. The data is valid until the next non-const
// method call.
virtual rtc::ArrayView<const uint8_t> GetData() const = 0;
// Copies |data| into the owned frame payload data.
virtual void SetData(rtc::ArrayView<const uint8_t> data) = 0;
virtual uint32_t GetTimestamp() const = 0;
virtual uint32_t GetSsrc() const = 0;
};
class TransformableVideoFrameInterface : public TransformableFrameInterface {
public:
virtual ~TransformableVideoFrameInterface() = default;
virtual bool IsKeyFrame() const = 0;
// Returns data needed in the frame transformation logic; for example,
// when the transformation applied to the frame is encryption/decryption, the
// additional data holds the serialized generic frame descriptor extension
// calculated in webrtc::RtpDescriptorAuthentication.
// TODO(bugs.webrtc.org/11380) remove from interface once
// webrtc::RtpDescriptorAuthentication is exposed in api/.
virtual std::vector<uint8_t> GetAdditionalData() const = 0;
// TODO(bugs.webrtc.org/11380) make pure virtual after implementating it
// downstream.
virtual const VideoFrameMetadata& GetMetadata() const { return metadata_; }
private:
// TODO(bugs.webrtc.org/11380) remove from interface once GetRtpVideoHeader is
// pure virtual.
VideoFrameMetadata metadata_;
};
// Extends the TransformableFrameInterface to expose audio-specific information.
class TransformableAudioFrameInterface : public TransformableFrameInterface {
public:
virtual ~TransformableAudioFrameInterface() = default;
// Exposes the frame header, enabling the interface clients to use the
// information in the header as needed, for example to compile the list of
// csrcs.
virtual const RTPHeader& GetHeader() const = 0;
};
// Objects implement this interface to be notified with the transformed frame.
class TransformedFrameCallback : public rtc::RefCountInterface {
public:
virtual void OnTransformedFrame(
std::unique_ptr<TransformableFrameInterface> frame) = 0;
protected:
~TransformedFrameCallback() override = default;
};
// Transforms encoded frames. The transformed frame is sent in a callback using
// the TransformedFrameCallback interface (see above).
class FrameTransformerInterface : public rtc::RefCountInterface {
public:
// Transforms |frame| using the implementing class' processing logic.
virtual void Transform(
std::unique_ptr<TransformableFrameInterface> transformable_frame) = 0;
virtual void RegisterTransformedFrameCallback(
rtc::scoped_refptr<TransformedFrameCallback>) {}
virtual void RegisterTransformedFrameSinkCallback(
rtc::scoped_refptr<TransformedFrameCallback>,
uint32_t ssrc) {}
virtual void UnregisterTransformedFrameCallback() {}
virtual void UnregisterTransformedFrameSinkCallback(uint32_t ssrc) {}
protected:
~FrameTransformerInterface() override = default;
};
} // namespace webrtc
#endif // API_FRAME_TRANSFORMER_INTERFACE_H_