123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #ifndef AGORA_MEDIA_ENGINE_H
- #define AGORA_MEDIA_ENGINE_H
- #if defined _WIN32 || defined __CYGWIN__
- typedef __int64 int64_t;
- typedef unsigned __int64 uint64_t;
- #else
- #include <stdint.h>
- #endif
- namespace agora
- {
- namespace media
- {
- class IAudioFrameObserver
- {
- public:
- enum AUDIO_FRAME_TYPE {
- FRAME_TYPE_PCM16 = 0, //PCM 16bit little endian
- };
- struct AudioFrame {
- AUDIO_FRAME_TYPE type;
- int samples; //number of samples in this frame
- int bytesPerSample; //number of bytes per sample: 2 for PCM16
- int channels; //number of channels (data are interleaved if stereo)
- int samplesPerSec; //sampling rate
- void* buffer; //data buffer
- int64_t renderTimeMs;
- };
- public:
- virtual bool onRecordAudioFrame(AudioFrame& audioFrame) = 0;
- virtual bool onPlaybackAudioFrame(AudioFrame& audioFrame) = 0;
- virtual bool onMixedAudioFrame(AudioFrame& audioFrame) = 0;
- virtual bool onPlaybackAudioFrameBeforeMixing(unsigned int uid, AudioFrame& audioFrame) = 0;
- };
- class IVideoFrameObserver
- {
- public:
- enum VIDEO_FRAME_TYPE {
- FRAME_TYPE_YUV420 = 0, //YUV 420 format
- };
- struct VideoFrame {
- VIDEO_FRAME_TYPE type;
- int width; //width of video frame
- int height; //height of video frame
- int yStride; //stride of Y data buffer
- int uStride; //stride of U data buffer
- int vStride; //stride of V data buffer
- void* yBuffer; //Y data buffer
- void* uBuffer; //U data buffer
- void* vBuffer; //V data buffer
- int rotation; // rotation of this frame (0, 90, 180, 270)
- int64_t renderTimeMs;
- };
- public:
- virtual bool onCaptureVideoFrame(VideoFrame& videoFrame) = 0;
- virtual bool onRenderVideoFrame(unsigned int uid, VideoFrame& videoFrame) = 0;
- };
- class IVideoFrame
- {
- public:
- enum PLANE_TYPE {
- Y_PLANE = 0,
- U_PLANE = 1,
- V_PLANE = 2,
- NUM_OF_PLANES = 3
- };
- enum VIDEO_TYPE {
- VIDEO_TYPE_UNKNOWN = 0,
- VIDEO_TYPE_I420 = 1,
- VIDEO_TYPE_IYUV = 2,
- VIDEO_TYPE_RGB24 = 3,
- VIDEO_TYPE_ABGR = 4,
- VIDEO_TYPE_ARGB = 5,
- VIDEO_TYPE_ARGB4444 = 6,
- VIDEO_TYPE_RGB565 = 7,
- VIDEO_TYPE_ARGB1555 = 8,
- VIDEO_TYPE_YUY2 = 9,
- VIDEO_TYPE_YV12 = 10,
- VIDEO_TYPE_UYVY = 11,
- VIDEO_TYPE_MJPG = 12,
- VIDEO_TYPE_NV21 = 13,
- VIDEO_TYPE_NV12 = 14,
- VIDEO_TYPE_BGRA = 15,
- VIDEO_TYPE_RGBA = 16,
- };
- virtual void release() = 0;
- virtual const unsigned char* buffer(PLANE_TYPE type) const = 0;
- // Copy frame: If required size is bigger than allocated one, new buffers of
- // adequate size will be allocated.
- // Return value: 0 on success ,-1 on error.
- virtual int copyFrame(IVideoFrame** dest_frame) const = 0;
- // Convert frame
- // Input:
- // - src_frame : Reference to a source frame.
- // - dst_video_type : Type of output video.
- // - dst_sample_size : Required only for the parsing of MJPG.
- // - dst_frame : Pointer to a destination frame.
- // Return value: 0 if OK, < 0 otherwise.
- // It is assumed that source and destination have equal height.
- virtual int convertFrame(VIDEO_TYPE dst_video_type, int dst_sample_size, unsigned char* dst_frame) const = 0;
- // Get allocated size per plane.
- virtual int allocated_size(PLANE_TYPE type) const = 0;
- // Get allocated stride per plane.
- virtual int stride(PLANE_TYPE type) const = 0;
- // Get frame width.
- virtual int width() const = 0;
- // Get frame height.
- virtual int height() const = 0;
- // Get frame timestamp (90kHz).
- virtual unsigned int timestamp() const = 0;
- // Get render time in milliseconds.
- virtual int64_t render_time_ms() const = 0;
- // Return true if underlying plane buffers are of zero size, false if not.
- virtual bool IsZeroSize() const = 0;
- };
- class IExternalVideoRenderCallback
- {
- public:
- virtual void onViewSizeChanged(int width, int height) = 0;
- virtual void onViewDestroyed() = 0;
- };
- struct ExternalVideoRenerContext
- {
- IExternalVideoRenderCallback* renderCallback;
- void* view;
- int renderMode;
- int zOrder;
- float left;
- float top;
- float right;
- float bottom;
- };
- class IExternalVideoRender
- {
- public:
- virtual void release() = 0;
- virtual int initialize() = 0;
- virtual int deliverFrame(const IVideoFrame& videoFrame, int rotation, bool mirrored) = 0;
- };
- class IExternalVideoRenderFactory
- {
- public:
- virtual IExternalVideoRender* createRenderInstance(const ExternalVideoRenerContext& context) = 0;
- };
- class IMediaEngine
- {
- public:
- virtual void release() = 0;
- virtual int registerAudioFrameObserver(IAudioFrameObserver* observer) = 0;
- virtual int registerVideoFrameObserver(IVideoFrameObserver* observer) = 0;
- virtual int registerVideoRenderFactory(IExternalVideoRenderFactory* factory) = 0;
- };
- } //media
- } //agora
- #endif //AGORA_MEDIA_ENGINE_H
|