97 lines
4 KiB
C++
97 lines
4 KiB
C++
#ifndef E3F40CBC_D6F1_4B8F_B90E_6765659CF90F
|
|
#define E3F40CBC_D6F1_4B8F_B90E_6765659CF90F
|
|
/*
|
|
*******************************************************************************
|
|
* INCLUDE
|
|
*******************************************************************************
|
|
*/
|
|
#include "../core/Demuxer.h"
|
|
extern "C"
|
|
{
|
|
#include <media-server/librtmp/rtmp-client.h>
|
|
#include <media-server/libflv/flv-demuxer.h>
|
|
#include <media-server/libflv/flv-proto.h>
|
|
#include <media-server/libflv/opus-head.h>
|
|
#include <media-server/libflv/mpeg4-aac.h>
|
|
#include <media-server/libflv/amf0.h>
|
|
#include <media-server/libflv/mpeg4-avc.h>
|
|
#include <media-server/libflv/mpeg4-hevc.h>
|
|
#include <avcodec/h264/bitstream.h>
|
|
#include <avcodec/h264/h264-nal.h>
|
|
#include <avcodec/h264/h264-sps.h>
|
|
#include <avcodec/h264/h264-pps.h>
|
|
#include <avcodec/h264/h264-util.h>
|
|
#include <avcodec/h264/h264-internal.h>
|
|
#include <avcodec/h265/h265-parser.h>
|
|
#include <sdk/include/sockutil.h>
|
|
}
|
|
|
|
namespace Video
|
|
{
|
|
namespace MediaServer
|
|
{
|
|
/*
|
|
*******************************************************************************
|
|
* CLASS DECLARE
|
|
*******************************************************************************
|
|
*/
|
|
class RTMPDemuxHandler: public Core::DemuxHandler
|
|
{
|
|
public:
|
|
RTMPDemuxHandler(const std::string& url);
|
|
~RTMPDemuxHandler();
|
|
|
|
public:
|
|
void run(Core::VideoEncoder::Ptr pVideoEncoder, Core::AudioEncoder::Ptr pAudioEncoder, const Post& post,
|
|
std::atomic<bool>& isCancelled) override;
|
|
|
|
protected:
|
|
int parseFLVMetaData(const uint8_t* pData, size_t length);
|
|
int processH264Data(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
int processH265Data(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
int processASCData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
int processAACData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
int processOpusHeadData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
int processOpusData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
int processG711AData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
int processG711UData(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
|
|
void enqueueVideoPacket(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
void enqueueAudioPacket(const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags);
|
|
|
|
inline const uint8_t* annexBStartcode(const uint8_t* data, size_t bytes);
|
|
bool isH264BFrame(const void* h264, size_t bytes);
|
|
void adjustTimestamp(uint64_t& pts, uint64_t& dts);
|
|
void updateTimeline(uint64_t ts);
|
|
void seek(uint64_t) override;
|
|
|
|
private:
|
|
socket_t _socket;
|
|
rtmp_client_t* _pCient;
|
|
flv_demuxer_t* _pDemuxer;
|
|
bool _audioInfoParsed;
|
|
bool _videoInfoParsed;
|
|
uint32_t _iFrameLength;
|
|
Core::VideoEncoder::Ptr _pVideoEncoder;
|
|
Core::AudioEncoder::Ptr _pAudioEncoder;
|
|
Post _post;
|
|
union
|
|
{
|
|
struct mpeg4_avc_t avc;
|
|
struct mpeg4_hevc_t hevc;
|
|
} _v;
|
|
|
|
protected:
|
|
static int clientSend(void* param, const void* header, size_t len, const void* data, size_t bytes);
|
|
static int clientOnAudio(void* param, const void* data, size_t bytes, uint32_t timestamp);
|
|
static int clientOnVideo(void* param, const void* data, size_t bytes, uint32_t timestamp);
|
|
static int clientOnScript(void* param, const void* data, size_t bytes, uint32_t timestamp);
|
|
|
|
static int flvDemuxerHandler(void* param, int codec, const void* data, size_t bytes, uint32_t pts, uint32_t dts,
|
|
int flags);
|
|
static void h264NALhandler(void* param, const uint8_t* nalu, size_t bytes);
|
|
static void h265NALhandler(void* param, const uint8_t* nalu, size_t bytes);
|
|
};
|
|
}
|
|
}
|
|
#endif
|