From f347bec3cb91001ed47910814eec2f0a8b54dd97 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Wed, 13 Dec 2017 14:18:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0win=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin_lib/windows/ZLMediaKit.dll | Bin 0 -> 68096 bytes .../include/ZLMediaKit/Codec/AACEncoder.h | 37 ++ .../include/ZLMediaKit/Codec/H264Encoder.h | 46 ++ .../include/ZLMediaKit/Common/MediaSender.h | 25 + .../include/ZLMediaKit/Common/config.h | 164 ++++++ .../include/ZLMediaKit/Device/Device.h | 107 ++++ .../include/ZLMediaKit/Device/PlayerProxy.h | 51 ++ .../include/ZLMediaKit/Device/base64.h | 55 ++ .../include/ZLMediaKit/H264/H264Parser.h | 58 ++ .../include/ZLMediaKit/H264/SPSParser.h | 192 +++++++ .../include/ZLMediaKit/H264/h264_bit_reader.h | 81 +++ .../include/ZLMediaKit/H264/h264_parser.h | 491 ++++++++++++++++ .../include/ZLMediaKit/H264/h264_poc.h | 45 ++ .../include/ZLMediaKit/H264/macros.h | 100 ++++ .../include/ZLMediaKit/H264/ranges.h | 154 ++++++ .../include/ZLMediaKit/Http/HttpClient.h | 130 +++++ .../include/ZLMediaKit/Http/HttpClientImp.h | 47 ++ .../include/ZLMediaKit/Http/HttpDownloader.h | 47 ++ .../include/ZLMediaKit/Http/HttpRequester.h | 40 ++ .../include/ZLMediaKit/Http/HttpSession.h | 68 +++ .../include/ZLMediaKit/Http/HttpsSession.h | 71 +++ .../include/ZLMediaKit/Http/strCoding.h | 33 ++ .../include/ZLMediaKit/MediaFile/HLSMaker.h | 63 +++ .../ZLMediaKit/MediaFile/MediaReader.h | 85 +++ .../ZLMediaKit/MediaFile/MediaRecorder.h | 58 ++ .../include/ZLMediaKit/MediaFile/Mp4Maker.h | 82 +++ .../include/ZLMediaKit/MediaFile/TSMaker.h | 249 +++++++++ .../include/ZLMediaKit/MediaFile/crc32.h | 16 + .../include/ZLMediaKit/Player/MediaPlayer.h | 42 ++ .../include/ZLMediaKit/Player/Player.h | 53 ++ .../include/ZLMediaKit/Player/PlayerBase.h | 221 ++++++++ .../include/ZLMediaKit/RTP/RtpMaker.h | 85 +++ .../include/ZLMediaKit/RTP/RtpMakerAAC.h | 43 ++ .../include/ZLMediaKit/RTP/RtpMakerH264.h | 43 ++ .../ZLMediaKit/include/ZLMediaKit/Rtmp/Rtmp.h | 236 ++++++++ .../include/ZLMediaKit/Rtmp/RtmpMediaSource.h | 161 ++++++ .../include/ZLMediaKit/Rtmp/RtmpParser.h | 132 +++++ .../include/ZLMediaKit/Rtmp/RtmpPlayer.h | 143 +++++ .../include/ZLMediaKit/Rtmp/RtmpPlayerImp.h | 62 +++ .../include/ZLMediaKit/Rtmp/RtmpProtocol.h | 103 ++++ .../include/ZLMediaKit/Rtmp/RtmpPusher.h | 108 ++++ .../include/ZLMediaKit/Rtmp/RtmpSession.h | 81 +++ .../ZLMediaKit/Rtmp/RtmpToRtspMediaSource.h | 96 ++++ .../ZLMediaKit/include/ZLMediaKit/Rtmp/amf.h | 224 ++++++++ .../include/ZLMediaKit/Rtmp/utils.h | 17 + .../include/ZLMediaKit/Rtsp/RtpBroadCaster.h | 81 +++ .../include/ZLMediaKit/Rtsp/RtpParser.h | 132 +++++ .../ZLMediaKit/include/ZLMediaKit/Rtsp/Rtsp.h | 169 ++++++ .../include/ZLMediaKit/Rtsp/RtspMediaSource.h | 163 ++++++ .../include/ZLMediaKit/Rtsp/RtspPlayer.h | 165 ++++++ .../include/ZLMediaKit/Rtsp/RtspPlayerImp.h | 65 +++ .../include/ZLMediaKit/Rtsp/RtspSession.h | 141 +++++ .../ZLMediaKit/Rtsp/RtspToRtmpMediaSource.h | 102 ++++ .../include/ZLMediaKit/Rtsp/UDPServer.h | 54 ++ .../ZLMediaKit/include/ZLMediaKit/Shell/CMD.h | 253 +++++++++ .../include/ZLMediaKit/Shell/ShellSession.h | 64 +++ .../include/ZLMediaKit/win32/getopt.h | 128 +++++ .../include/ZLMediaKit/win32/tailor.h | 329 +++++++++++ bin_lib/windows/ZLMediaKit/lib/ZLMediaKit.dll | Bin 0 -> 68096 bytes bin_lib/windows/ZLToolKit.dll | Bin 0 -> 17408 bytes .../include/ZLToolKit/Network/Socket.h | 246 +++++++++ .../include/ZLToolKit/Network/TcpClient.h | 106 ++++ .../ZLToolKit/Network/TcpLimitedSession.h | 64 +++ .../include/ZLToolKit/Network/TcpServer.h | 134 +++++ .../include/ZLToolKit/Network/TcpSession.h | 91 +++ .../include/ZLToolKit/Network/sockutil.h | 86 +++ .../include/ZLToolKit/Poller/EventPoller.h | 123 +++++ .../ZLToolKit/include/ZLToolKit/Poller/Pipe.h | 36 ++ .../include/ZLToolKit/Poller/PipeWrap.h | 32 ++ .../include/ZLToolKit/Poller/SelectWrap.h | 34 ++ .../include/ZLToolKit/Poller/Timer.h | 32 ++ .../ZLToolKit/Thread/AsyncTaskThread.h | 77 +++ .../include/ZLToolKit/Thread/TaskQueue.h | 72 +++ .../include/ZLToolKit/Thread/ThreadPool.h | 173 ++++++ .../include/ZLToolKit/Thread/WorkThreadPool.h | 46 ++ .../include/ZLToolKit/Thread/rwmutex.h | 71 +++ .../include/ZLToolKit/Thread/semaphore.h | 78 +++ .../include/ZLToolKit/Thread/spin_mutex.h | 41 ++ .../include/ZLToolKit/Thread/threadgroup.h | 93 ++++ .../ZLToolKit/include/ZLToolKit/Util/File.h | 75 +++ .../ZLToolKit/include/ZLToolKit/Util/MD5.h | 74 +++ .../include/ZLToolKit/Util/NoticeCenter.h | 104 ++++ .../include/ZLToolKit/Util/ResourcePool.h | 133 +++++ .../include/ZLToolKit/Util/RingBuffer.h | 244 ++++++++ .../ZLToolKit/include/ZLToolKit/Util/SSLBox.h | 112 ++++ .../include/ZLToolKit/Util/SqlConnection.h | 145 +++++ .../include/ZLToolKit/Util/SqlPool.h | 230 ++++++++ .../include/ZLToolKit/Util/TimeTicker.h | 116 ++++ .../include/ZLToolKit/Util/function_traits.h | 64 +++ .../ZLToolKit/include/ZLToolKit/Util/logger.h | 400 ++++++++++++++ .../ZLToolKit/include/ZLToolKit/Util/mini.h | 149 +++++ .../include/ZLToolKit/Util/onceToken.h | 44 ++ .../ZLToolKit/include/ZLToolKit/Util/util.h | 79 +++ .../include/ZLToolKit/Util/uv_errno.h | 522 ++++++++++++++++++ bin_lib/windows/ZLToolKit/lib/ZLToolKit.dll | Bin 0 -> 17408 bytes bin_lib/windows/libcrypto-1_1.dll | Bin 0 -> 2091008 bytes bin_lib/windows/libmysql.dll | Bin 0 -> 4630016 bytes bin_lib/windows/libssl-1_1.dll | Bin 0 -> 373760 bytes bin_lib/windows/test_server.exe.pem | 30 + bin_lib/windows/test_ssl.exe.pem | 30 + 100 files changed, 10477 insertions(+) create mode 100755 bin_lib/windows/ZLMediaKit.dll create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Codec/AACEncoder.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Codec/H264Encoder.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Common/MediaSender.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Common/config.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/Device.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/PlayerProxy.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/base64.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/H264Parser.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/SPSParser.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_bit_reader.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_parser.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_poc.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/macros.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/ranges.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Http/HttpClient.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Http/HttpClientImp.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Http/HttpDownloader.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Http/HttpRequester.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Http/HttpSession.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Http/HttpsSession.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Http/strCoding.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/MediaFile/HLSMaker.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/MediaFile/MediaReader.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/MediaFile/MediaRecorder.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/MediaFile/Mp4Maker.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/MediaFile/TSMaker.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/MediaFile/crc32.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Player/MediaPlayer.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Player/Player.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Player/PlayerBase.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/RTP/RtpMaker.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/RTP/RtpMakerAAC.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/RTP/RtpMakerH264.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/Rtmp.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/RtmpMediaSource.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/RtmpParser.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/RtmpPlayer.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/RtmpPlayerImp.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/RtmpProtocol.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/RtmpPusher.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/RtmpSession.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/RtmpToRtspMediaSource.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/amf.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtmp/utils.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/RtpBroadCaster.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/RtpParser.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/Rtsp.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/RtspMediaSource.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/RtspPlayer.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/RtspPlayerImp.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/RtspSession.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/RtspToRtmpMediaSource.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Rtsp/UDPServer.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Shell/CMD.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Shell/ShellSession.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/win32/getopt.h create mode 100755 bin_lib/windows/ZLMediaKit/include/ZLMediaKit/win32/tailor.h create mode 100755 bin_lib/windows/ZLMediaKit/lib/ZLMediaKit.dll create mode 100755 bin_lib/windows/ZLToolKit.dll create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Network/Socket.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Network/TcpClient.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Network/TcpLimitedSession.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Network/TcpServer.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Network/TcpSession.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Network/sockutil.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Poller/EventPoller.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Poller/Pipe.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Poller/PipeWrap.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Poller/SelectWrap.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Poller/Timer.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Thread/AsyncTaskThread.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Thread/TaskQueue.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Thread/ThreadPool.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Thread/WorkThreadPool.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Thread/rwmutex.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Thread/semaphore.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Thread/spin_mutex.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Thread/threadgroup.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/File.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/MD5.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/NoticeCenter.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/ResourcePool.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/RingBuffer.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/SSLBox.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/SqlConnection.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/SqlPool.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/TimeTicker.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/function_traits.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/logger.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/mini.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/onceToken.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/util.h create mode 100755 bin_lib/windows/ZLToolKit/include/ZLToolKit/Util/uv_errno.h create mode 100755 bin_lib/windows/ZLToolKit/lib/ZLToolKit.dll create mode 100755 bin_lib/windows/libcrypto-1_1.dll create mode 100755 bin_lib/windows/libmysql.dll create mode 100755 bin_lib/windows/libssl-1_1.dll create mode 100755 bin_lib/windows/test_server.exe.pem create mode 100755 bin_lib/windows/test_ssl.exe.pem diff --git a/bin_lib/windows/ZLMediaKit.dll b/bin_lib/windows/ZLMediaKit.dll new file mode 100755 index 0000000000000000000000000000000000000000..25fbf3a274a741537831633c1f10d720412f5798 GIT binary patch literal 68096 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%0DX}71E;Tv7kjyL50W^)L{gF_67LUd9}5N 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 + +#ifdef __cplusplus +extern "C" { +#endif //__cplusplus +#include +#ifdef __cplusplus +} +#endif //__cplusplus + +namespace ZL { +namespace Codec { + +class H264Encoder { +public: + typedef struct { + int iType; + int iLength; + uint8_t *pucData; + } H264Frame; + + H264Encoder(void); + virtual ~H264Encoder(void); + bool init(int iWidth, int iHeight, int iFps); + int inputData(char *apcYuv[3], int aiYuvLen[3], int64_t i64Pts, H264Frame **ppFrame); +private: + x264_t* m_pX264Handle = nullptr; + x264_picture_t* m_pPicIn = nullptr; + x264_picture_t* m_pPicOut = nullptr; + H264Frame m_aFrames[10]; +}; + +} /* namespace Codec */ +} /* namespace ZL */ + +#endif /* CODEC_H264ENCODER_H_ */ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Common/MediaSender.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Common/MediaSender.h new file mode 100755 index 00000000..ea3cacd3 --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Common/MediaSender.h @@ -0,0 +1,25 @@ +/* + * MediaSender.h + * + * Created on: 2016年9月1日 + * Author: xzl + */ + +#ifndef SRC_MEDIASENDER_H_ +#define SRC_MEDIASENDER_H_ + +#include "Thread/ThreadPool.h" +using namespace ZL::Thread; + +class MediaSender { +public: + static ThreadPool & sendThread() { + static ThreadPool pool(1); + return pool; + } +private: + MediaSender(); + virtual ~MediaSender(); +}; + +#endif /* SRC_MEDIASENDER_H_ */ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Common/config.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Common/config.h new file mode 100755 index 00000000..030b6f8b --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Common/config.h @@ -0,0 +1,164 @@ +// +// appConfig.h +// ZLMedia +// +// Created by lyl on 16/10/22. +// Copyright © 2016年 jizan. All rights reserved. +// + +#ifndef appConfig_h +#define appConfig_h + +#include "Util/mini.h" +using namespace ZL::Util; + +namespace Config { + +void loaIniConfig(); +////////////TCP最大连接数/////////// +#ifdef __x86_64__ +#define MAX_TCP_SESSION 100000 +#else +#define MAX_TCP_SESSION 128 +#endif + +////////////其他宏定义/////////// +#ifndef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b) ) +#endif //MAX + +#ifndef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b) ) +#endif //MIN + +#ifndef CLEAR_ARR +#define CLEAR_ARR(arr) for(auto &item : arr){ item = 0;} +#endif //CLEAR_ARR + + +////////////广播名称/////////// +namespace Broadcast { +extern const char kBroadcastRtspSessionPlay[]; +#define BroadcastRtspSessionPlayArgs const char *app,const char *stream + +extern const char kBroadcastRtspSrcRegisted[]; +#define BroadcastRtspSrcRegistedArgs const char *app,const char *stream + +extern const char kBroadcastRtmpSrcRegisted[]; +#define BroadcastRtmpSrcRegistedArgs const char *app,const char *stream + +extern const char kBroadcastRecordMP4[]; +#define BroadcastRecordMP4Args const Mp4Info &info + +extern const char kBroadcastHttpRequest[]; +#define BroadcastHttpRequestArgs const Parser &parser,HttpSession::HttpResponseInvoker &invoker + +} //namespace Broadcast + +//代理失败最大重试次数 +namespace Proxy { +extern const char kReplayCount[]; +}//namespace Proxy + + +////////////HTTP配置/////////// +namespace Http { +extern const char kPort[]; +extern const char kSSLPort[]; +//http 文件发送缓存大小 +extern const char kSendBufSize[]; +//http 最大请求字节数 +extern const char kMaxReqSize[]; +//http keep-alive秒数 +extern const char kKeepAliveSecond[]; +//http keep-alive最大请求数 +extern const char kMaxReqCount[]; +//http 字符编码 +extern const char kCharSet[]; +//http 服务器名称 +extern const char kServerName[]; +//http 服务器根目录 +extern const char kRootPath[]; +//http 404错误提示内容 +extern const char kNotFound[]; +//HTTP访问url前缀 +extern const char kHttpPrefix[]; +}//namespace Http + +////////////SHELL配置/////////// +namespace Shell { +extern const char kServerName[]; +extern const char kMaxReqSize[]; +extern const char kPort[]; +} //namespace Shell + +////////////RTSP服务器配置/////////// +namespace Rtsp { +#define RTSP_VERSION 1.30 +#define RTSP_BUILDTIME __DATE__" CST" + +extern const char kServerName[]; +extern const char kPort[]; +} //namespace Rtsp + +////////////RTMP服务器配置/////////// +namespace Rtmp { +extern const char kPort[]; +} //namespace RTMP + + +////////////RTP配置/////////// +namespace Rtp { +//RTP打包最大MTU,公网情况下更小 +extern const char kVideoMtuSize[]; +//RTP打包最大MTU,公网情况下更小 +extern const char kAudioMtuSize[]; +//udp方式接受RTP包的最大缓存 +extern const char kUdpBufSize[]; +//RTP排序缓存最大个数 +extern const char kMaxRtpCount[]; +//如果RTP序列正确次数累计达到该数字就启动清空排序缓存 +extern const char kClearCount[]; +//最大RTP时间为13个小时,每13小时回环一次 +extern const char kCycleMS[]; +} //namespace Rtsp + +////////////组播配置/////////// +namespace MultiCast { +//组播分配起始地址 +extern const char kAddrMin[]; +//组播分配截止地址 +extern const char kAddrMax[]; +//组播TTL +extern const char kUdpTTL[]; +} //namespace MultiCast + +////////////录像配置/////////// +namespace Record { +//查看录像的应用名称 +extern const char kAppName[]; +//每次流化MP4文件的时长,单位毫秒 +extern const char kSampleMS[]; +//MP4文件录制大小,不能太大,否则MP4Close函数执行事件太长 +extern const char kFileSecond[]; +//Rtsp访问url前缀 +extern const char kRtspPrefix[]; +//录制文件路径 +extern const char kFilePath[]; +} //namespace Record + +////////////HLS相关配置/////////// +namespace Hls { +//HLS切片时长,单位秒 +extern const char kSegmentDuration[]; +//HLS切片个数 +extern const char kSegmentNum[]; +//HLS文件写缓存大小 +extern const char kFileBufSize[]; +//录制文件路径 +extern const char kFilePath[]; +} //namespace Hls + +} // namespace Config + +#endif /* appConfig_h */ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/Device.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/Device.h new file mode 100755 index 00000000..3c4582d2 --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/Device.h @@ -0,0 +1,107 @@ +/* + * Device.h + * + * Created on: 2016年8月10日 + * Author: xzl + */ + +#ifndef DEVICE_DEVICE_H_ +#define DEVICE_DEVICE_H_ + +#include +#include +#include +#include "Util/util.h" +#include "RTP/RtpMakerAAC.h" +#include "RTP/RtpMakerH264.h" +#include "Rtsp/RtspToRtmpMediaSource.h" + +using namespace std; +using namespace ZL::Rtsp; +using namespace ZL::Util; + +#ifdef ENABLE_FAAC +#include "Codec/AACEncoder.h" +using namespace ZL::Codec; +#endif //ENABLE_FAAC + +#ifdef ENABLE_X264 +#include "Codec/H264Encoder.h" +using namespace ZL::Codec; +#endif //ENABLE_X264 + +namespace ZL { +namespace DEV { + +class VideoInfo { +public: + int iWidth; + int iHeight; + float iFrameRate; +}; +class AudioInfo { +public: + int iChannel; + int iSampleBit; + int iSampleRate; +}; + +class DevChannel { +public: + typedef std::shared_ptr Ptr; + DevChannel(const char *strApp, const char *strId,float fDuration = 0,bool bLiveStream = true); + virtual ~DevChannel(); + + void initVideo(const VideoInfo &info); + void initAudio(const AudioInfo &info); + + void inputYUV(char *apcYuv[3], int aiYuvLen[3], uint32_t uiStamp); + void inputPCM(char *pcData, int iDataLen, uint32_t uiStamp); + + void inputH264(char *pcData, int iDataLen, uint32_t uiStamp); + void inputAAC(char *pcData, int iDataLen, uint32_t uiStamp); +#ifdef ENABLE_RTSP2RTMP + int readerCount() { + return m_mediaSrc ? m_mediaSrc->readerCount() : 0; + } + void updateTimeStamp(uint32_t uiStamp){ + m_mediaSrc->updateTimeStamp(uiStamp); + } +#endif //ENABLE_RTSP2RTMP + void setOnSeek(const function &onSeek){ + m_mediaSrc->setOnSeek(onSeek); + } + void setOnStamp(const function &cb) { + m_mediaSrc->setOnStamp(cb); + } +private: + inline void makeSDP_264(unsigned char *pucData, int iDataLen); + inline void makeSDP_AAC(unsigned char *pucData, int iDataLen); + inline void makeSDP(const string& strSdp); +#ifdef ENABLE_X264 + std::shared_ptr m_pH264Enc; +#endif //ENABLE_X264 + +#ifdef ENABLE_FAAC + std::shared_ptr m_pAacEnc; +#endif //ENABLE_FAAC + RtpMaker_AAC::Ptr m_pRtpMaker_aac; + RtpMaker_H264::Ptr m_pRtpMaker_h264; + RtspToRtmpMediaSource::Ptr m_mediaSrc; + string m_strSDP; + bool m_bSdp_gotH264 = false; + bool m_bSdp_gotAAC = false; + + unsigned char m_aucSPS[256]; + unsigned int m_uiSPSLen = 0; + unsigned char m_aucPPS[256]; + unsigned int m_uiPPSLen = 0; + std::shared_ptr m_video; + std::shared_ptr m_audio; +}; + + +} /* namespace DEV */ +} /* namespace ZL */ + +#endif /* DEVICE_DEVICE_H_ */ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/PlayerProxy.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/PlayerProxy.h new file mode 100755 index 00000000..a05b3faa --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/PlayerProxy.h @@ -0,0 +1,51 @@ +/* + * PlyerProxy.h + * + * Created on: 2016年12月6日 + * Author: xzl + */ + +#ifndef SRC_DEVICE_PLAYERPROXY_H_ +#define SRC_DEVICE_PLAYERPROXY_H_ + +#include +#include "Device.h" +#include "Player/MediaPlayer.h" +#include "Util/TimeTicker.h" + +using namespace std; +using namespace ZL::Player; + +namespace ZL { +namespace DEV { + +class PlayerProxy :public MediaPlayer, public std::enable_shared_from_this{ +public: + typedef std::shared_ptr Ptr; + //设置代理时间,0为永久,其他为代理秒数 + //设置方法:proxy[PlayerProxy::kAliveSecond] = 100; + static const char kAliveSecond[]; + + PlayerProxy(const char *strApp, const char *strSrc); + virtual ~PlayerProxy(); + void play(const char* strUrl) override; + void setOnExpired(const function &cb){ + onExpired = cb; + } +private : + DevChannel::Ptr m_pChn; + Ticker m_aliveTicker; + uint32_t m_aliveSecond = 0; + function onExpired; + string m_strApp; + string m_strSrc; + void initMedia(); + void rePlay(const string &strUrl,uint64_t iFailedCnt); + void checkExpired(); + void expired(); +}; + +} /* namespace Player */ +} /* namespace ZL */ + +#endif /* SRC_DEVICE_PLAYERPROXY_H_ */ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/base64.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/base64.h new file mode 100755 index 00000000..6da4f28f --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/Device/base64.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) +#ifndef AVUTIL_BASE64_H +#define AVUTIL_BASE64_H + +#include + +/** + * Decode a base64-encoded string. + * + * @param out buffer for decoded data + * @param in null-terminated input string + * @param out_size size in bytes of the out buffer, must be at + * least 3/4 of the length of in + * @return number of bytes written, or a negative value in case of + * invalid input + */ +int av_base64_decode(uint8_t *out, const char *in, int out_size); + +/** + * Encode data to base64 and null-terminate. + * + * @param out buffer for encoded data + * @param out_size size in bytes of the output buffer, must be at + * least AV_BASE64_SIZE(in_size) + * @param in_size size in bytes of the 'in' buffer + * @return 'out' or NULL in case of error + */ +char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size); + +/** + * Calculate the output size needed to base64-encode x bytes. + */ +#define AV_BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) + +#endif /* AVUTIL_BASE64_H */ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/H264Parser.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/H264Parser.h new file mode 100755 index 00000000..849ecf3a --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/H264Parser.h @@ -0,0 +1,58 @@ +// +// H264Parser.h +// MediaPlayer +// +// Created by xzl on 2017/1/16. +// Copyright © 2017年 jizan. All rights reserved. +// + +#ifndef H264Parser_h +#define H264Parser_h + +#include +#include +#include "h264_poc.h" +#include "h264_parser.h" +using namespace std; + +#ifndef INT32_MAX +#define INT32_MAX 0x7FFFFFFF +#endif//INT32_MAX + +class H264Parser{ +public: + H264Parser(); + virtual ~H264Parser(); + void inputH264(const string &h264,uint32_t dts); + + int32_t getPOC() const{ + return m_iNowPOC; + } + int getSliceType() const{ + return m_shdr.slice_type; + } + int getNaluType() const{ + return m_nalu.nal_unit_type; + } + uint32_t getPts() const{ + return m_iNowPTS; + } +private: + media::H264Parser m_parser; + media::H264POC m_poc; + media::H264NALU m_nalu; + media::H264SliceHeader m_shdr; + + int32_t m_iNowPOC = INT32_MAX; + int32_t m_iLastPOC = INT32_MAX; + + uint32_t m_iNowPTS = INT32_MAX; + uint32_t m_iLastPTS = INT32_MAX; + int32_t m_iMsPerPOC = 30; + + void computePts(uint32_t dts); + + +}; + +#endif /* H264Parser_hpp */ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/SPSParser.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/SPSParser.h new file mode 100755 index 00000000..29972f2b --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/SPSParser.h @@ -0,0 +1,192 @@ +/*************************************************************************************** + ***************************************************************************************/ +#ifndef _JZAN_SPS_PPS_H_ +#define _JZAN_SPS_PPS_H_ + +#if defined (__cplusplus) + extern "C" { +#endif + +#define QP_MAX_NUM (51 + 6*6) // The maximum supported qp + +/** + * Chromaticity coordinates of the source primaries. + */ +enum T_AVColorPrimaries { + AVCOL_PRI_RESERVED0 = 0, + AVCOL_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B + AVCOL_PRI_UNSPECIFIED = 2, + AVCOL_PRI_RESERVED = 3, + AVCOL_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + + AVCOL_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM + AVCOL_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + AVCOL_PRI_SMPTE240M = 7, ///< functionally identical to above + AVCOL_PRI_FILM = 8, ///< colour filters using Illuminant C + AVCOL_PRI_BT2020 = 9, ///< ITU-R BT2020 + AVCOL_PRI_NB, ///< Not part of ABI +}; + +/** + * Color Transfer Characteristic. + */ +enum T_AVColorTransferCharacteristic { + AVCOL_TRC_RESERVED0 = 0, + AVCOL_TRC_BT709 = 1, ///< also ITU-R BT1361 + AVCOL_TRC_UNSPECIFIED = 2, + AVCOL_TRC_RESERVED = 3, + AVCOL_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM + AVCOL_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG + AVCOL_TRC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC + AVCOL_TRC_SMPTE240M = 7, + AVCOL_TRC_LINEAR = 8, ///< "Linear transfer characteristics" + AVCOL_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)" + AVCOL_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)" + AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 + AVCOL_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut + AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) + AVCOL_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10 bit system + AVCOL_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system + AVCOL_TRC_NB, ///< Not part of ABI +}; + +/** + * YUV tColorspace type. + */ +enum T_AVColorSpace { + AVCOL_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) + AVCOL_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B + AVCOL_SPC_UNSPECIFIED = 2, + AVCOL_SPC_RESERVED = 3, + AVCOL_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + AVCOL_SPC_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 + AVCOL_SPC_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above + AVCOL_SPC_SMPTE240M = 7, + AVCOL_SPC_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + AVCOL_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system + AVCOL_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system + AVCOL_SPC_NB, ///< Not part of ABI +}; + + +/** + * rational number numerator/denominator + */ +typedef struct T_AVRational{ + int num; ///< numerator + int den; ///< denominator +} T_AVRational; + + +/*** + * Sequence parameter set + * ¿É²Î¿¼H264±ê×¼µÚ7½ÚºÍ¸½Â¼D E + */ +#define Extended_SAR 255 + +/** + * Sequence parameter set + */ +typedef struct T_SPS { + unsigned int uiSpsId; + int iProfileIdc; + int iLevelIdc; + int iChromaFormatIdc; + int iTransformBypass; ///< qpprime_y_zero_transform_bypass_flag + int iLog2MaxFrameNum; ///< log2_max_frame_num_minus4 + 4 + int iPocType; ///< pic_order_cnt_type + int iLog2MaxPocLsb; ///< log2_max_pic_order_cnt_lsb_minus4 + int iDeltaPicOrderAlwaysZeroFlag; + int iOffsetForNonRefPic; + int iOffsetForTopToBottomField; + int iPocCycleLength; ///< num_ref_frames_in_pic_order_cnt_cycle + int iRefFrameCount; ///< num_ref_frames + int iGapsInFrameNumAllowedFlag; + int iMbWidth; ///< pic_width_in_mbs_minus1 + 1 + int iMbHeight; ///< pic_height_in_map_units_minus1 + 1 + int iFrameMbsOnlyFlag; + int iMbAff; ///< mb_adaptive_frame_field_flag + int iDirect8x8InferenceFlag; + int iCrop; ///< frame_cropping_flag + + /* those 4 are already in luma samples */ + unsigned int uiCropLeft; ///< frame_cropping_rect_left_offset + unsigned int uiCropRight; ///< frame_cropping_rect_right_offset + unsigned int uiCropTop; ///< frame_cropping_rect_top_offset + unsigned int uiCropBottom; ///< frame_cropping_rect_bottom_offset + int iVuiParametersPresentFlag; + T_AVRational tSar; + int iVideoSignalTypePresentFlag; + int iFullRange; + int iColourDescriptionPresentFlag; + enum T_AVColorPrimaries tColorPrimaries; + enum T_AVColorTransferCharacteristic tColorTrc; + enum T_AVColorSpace tColorspace; + int iTimingInfoPresentFlag; + uint32_t u32NumUnitsInTick; + uint32_t u32TimeScale; + int iFixedFrameRateFlag; + short asOffsetForRefFrame[256]; // FIXME dyn aloc? + int iBitstreamRestrictionFlag; + int iNumReorderFrames; + int iScalingMatrixPresent; + uint8_t aau8ScalingMatrix4[6][16]; + uint8_t aau8ScalingMatrix8[6][64]; + int iNalHrdParametersPresentFlag; + int iVclHrdParametersPresentFlag; + int iPicStructPresentFlag; + int iTimeOffsetLength; + int iCpbCnt; ///< See H.264 E.1.2 + int iInitialCpbRemovalDelayLength; ///< initial_cpb_removal_delay_length_minus1 + 1 + int iCpbRemovalDelayLength; ///< cpb_removal_delay_length_minus1 + 1 + int iDpbOutputDelayLength; ///< dpb_output_delay_length_minus1 + 1 + int iBitDepthLuma; ///< bit_depth_luma_minus8 + 8 + int iBitDepthChroma; ///< bit_depth_chroma_minus8 + 8 + int iResidualColorTransformFlag; ///< residual_colour_transform_flag + int iConstraintSetFlags; ///< constraint_set[0-3]_flag + int iNew; ///< flag to keep track if the decoder context needs re-init due to changed SPS +} T_SPS; + +/** + * Picture parameter set + */ +typedef struct T_PPS { + unsigned int uiSpsId; + int iCabac; ///< entropy_coding_mode_flag + int iPicOrderPresent; ///< pic_order_present_flag + int iSliceGroupCount; ///< num_slice_groups_minus1 + 1 + int iMbSliceGroupMapType; + unsigned int auiRefCount[2]; ///< num_ref_idx_l0/1_active_minus1 + 1 + int iWeightedPred; ///< weighted_pred_flag + int iWeightedBipredIdc; + int iInitQp; ///< pic_init_qp_minus26 + 26 + int iInitQs; ///< pic_init_qs_minus26 + 26 + int aiChromaQpIndexOffset[2]; + int iDeblockingFilterParametersPresent; ///< deblocking_filter_parameters_present_flag + int iConstrainedIntraPred; ///< constrained_intra_pred_flag + int iRedundantPicCntPresent; ///< redundant_pic_cnt_present_flag + int iTransform8x8Mode; ///< transform_8x8_mode_flag + uint8_t aau8ScalingMatrix4[6][16]; + uint8_t aau8ScalingMatrix8[6][64]; + uint8_t u8ChromaQpTable[2][QP_MAX_NUM+1]; ///< pre-scaled (with aiChromaQpIndexOffset) version of qp_table + int iChromaQpDiff; +} T_PPS; + +typedef struct T_GetBitContext{ + uint8_t *pu8Buf; /*Ö¸ÏòSPS start*/ + int iBufSize; /*SPS ³¤¶È*/ + int iBitPos; /*bitÒѶÁȡλÖÃ*/ + int iTotalBit; /*bit×ܳ¤¶È*/ + int iCurBitPos; /*µ±Ç°¶ÁȡλÖÃ*/ +}T_GetBitContext; + + +int h264DecSeqParameterSet(void *pvBuf, T_SPS *ptSps); +void h264GetWidthHeight(T_SPS *ptSps, int *piWidth, int *piHeight); +void h264GeFramerate(T_SPS *ptSps, float *pfFramerate); + +#if defined (__cplusplus) +} +#endif + +#endif diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_bit_reader.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_bit_reader.h new file mode 100755 index 00000000..75569e48 --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_bit_reader.h @@ -0,0 +1,81 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// This file contains an implementation of an H264 Annex-B video stream parser. + +#ifndef MEDIA_FILTERS_H264_BIT_READER_H_ +#define MEDIA_FILTERS_H264_BIT_READER_H_ + +#include +#include +#include +#include "macros.h" + +using namespace std; + +namespace media { + + // A class to provide bit-granularity reading of H.264 streams. + // This is not a generic bit reader class, as it takes into account + // H.264 stream-specific constraints, such as skipping emulation-prevention + // bytes and stop bits. See spec for more details. + class MEDIA_EXPORT H264BitReader { + public: + H264BitReader(); + ~H264BitReader(); + + // Initialize the reader to start reading at |data|, |size| being size + // of |data| in bytes. + // Return false on insufficient size of stream.. + // TODO(posciak,fischman): consider replacing Initialize() with + // heap-allocating and creating bit readers on demand instead. + bool Initialize(const uint8_t* data, off_t size); + + // Read |num_bits| next bits from stream and return in |*out|, first bit + // from the stream starting at |num_bits| position in |*out|. + // |num_bits| may be 1-32, inclusive. + // Return false if the given number of bits cannot be read (not enough + // bits in the stream), true otherwise. + bool ReadBits(int num_bits, int* out); + + // Return the number of bits left in the stream. + off_t NumBitsLeft(); + + // See the definition of more_rbsp_data() in spec. + bool HasMoreRBSPData(); + + // Return the number of emulation prevention bytes already read. + size_t NumEmulationPreventionBytesRead(); + + private: + // Advance to the next byte, loading it into curr_byte_. + // Return false on end of stream. + bool UpdateCurrByte(); + + // Pointer to the next unread (not in curr_byte_) byte in the stream. + const uint8_t* data_; + + // Bytes left in the stream (without the curr_byte_). + off_t bytes_left_; + + // Contents of the current byte; first unread bit starting at position + // 8 - num_remaining_bits_in_curr_byte_ from MSB. + int curr_byte_; + + // Number of bits remaining in curr_byte_ + int num_remaining_bits_in_curr_byte_; + + // Used in emulation prevention three byte detection (see spec). + // Initially set to 0xffff to accept all initial two-byte sequences. + int prev_two_bytes_; + + // Number of emulation preventation bytes (0x000003) we met. + size_t emulation_prevention_bytes_; + + DISALLOW_COPY_AND_ASSIGN(H264BitReader); + }; + +} // namespace media + +#endif // MEDIA_FILTERS_H264_BIT_READER_H_ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_parser.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_parser.h new file mode 100755 index 00000000..b2298257 --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_parser.h @@ -0,0 +1,491 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// This file contains an implementation of an H264 Annex-B video stream parser. + +#ifndef MEDIA_FILTERS_H264_PARSER_H_ +#define MEDIA_FILTERS_H264_PARSER_H_ + +#include +#include +#include + +#include +#include + +#include "macros.h" +#include "h264_bit_reader.h" +#include "ranges.h" + +using namespace std; + +namespace media { + + struct SubsampleEntry { + uint32_t clear_bytes; + uint32_t cypher_bytes; + }; + + // For explanations of each struct and its members, see H.264 specification + // at http://www.itu.int/rec/T-REC-H.264. + struct MEDIA_EXPORT H264NALU { + H264NALU(); + + enum Type { + kUnspecified = 0, + kNonIDRSlice = 1, + kSliceDataA = 2, + kSliceDataB = 3, + kSliceDataC = 4, + kIDRSlice = 5, + kSEIMessage = 6, + kSPS = 7, + kPPS = 8, + kAUD = 9, + kEOSeq = 10, + kEOStream = 11, + kFiller = 12, + kSPSExt = 13, + kReserved14 = 14, + kReserved15 = 15, + kReserved16 = 16, + kReserved17 = 17, + kReserved18 = 18, + kCodedSliceAux = 19, + kCodedSliceExtension = 20, + }; + + // After (without) start code; we don't own the underlying memory + // and a shallow copy should be made when copying this struct. + const uint8_t* data; + off_t size; // From after start code to start code of next NALU (or EOS). + + int nal_ref_idc; + int nal_unit_type; + }; + + enum { + kH264ScalingList4x4Length = 16, + kH264ScalingList8x8Length = 64, + }; + + struct MEDIA_EXPORT H264SPS { + H264SPS(); + + enum H264ProfileIDC { + kProfileIDCBaseline = 66, + kProfileIDCConstrainedBaseline = kProfileIDCBaseline, + kProfileIDCMain = 77, + kProfileIDScalableBaseline = 83, + kProfileIDScalableHigh = 86, + kProfileIDCHigh = 100, + kProfileIDHigh10 = 110, + kProfileIDSMultiviewHigh = 118, + kProfileIDHigh422 = 122, + kProfileIDStereoHigh = 128, + kProfileIDHigh444Predictive = 244, + }; + + enum AspectRatioIdc { + kExtendedSar = 255, + }; + + enum { + // Constants for HRD parameters (spec ch. E.2.2). + kBitRateScaleConstantTerm = 6, // Equation E-37. + kCPBSizeScaleConstantTerm = 4, // Equation E-38. + kDefaultInitialCPBRemovalDelayLength = 24, + kDefaultDPBOutputDelayLength = 24, + kDefaultTimeOffsetLength = 24, + }; + + int profile_idc; + bool constraint_set0_flag; + bool constraint_set1_flag; + bool constraint_set2_flag; + bool constraint_set3_flag; + bool constraint_set4_flag; + bool constraint_set5_flag; + int level_idc; + int seq_parameter_set_id; + + int chroma_format_idc; + bool separate_colour_plane_flag; + int bit_depth_luma_minus8; + int bit_depth_chroma_minus8; + bool qpprime_y_zero_transform_bypass_flag; + + bool seq_scaling_matrix_present_flag; + int scaling_list4x4[6][kH264ScalingList4x4Length]; + int scaling_list8x8[6][kH264ScalingList8x8Length]; + + int log2_max_frame_num_minus4; + int pic_order_cnt_type; + int log2_max_pic_order_cnt_lsb_minus4; + bool delta_pic_order_always_zero_flag; + int offset_for_non_ref_pic; + int offset_for_top_to_bottom_field; + int num_ref_frames_in_pic_order_cnt_cycle; + int expected_delta_per_pic_order_cnt_cycle; // calculated + int offset_for_ref_frame[255]; + int max_num_ref_frames; + bool gaps_in_frame_num_value_allowed_flag; + int pic_width_in_mbs_minus1; + int pic_height_in_map_units_minus1; + bool frame_mbs_only_flag; + bool mb_adaptive_frame_field_flag; + bool direct_8x8_inference_flag; + bool frame_cropping_flag; + int frame_crop_left_offset; + int frame_crop_right_offset; + int frame_crop_top_offset; + int frame_crop_bottom_offset; + + bool vui_parameters_present_flag; + int sar_width; // Set to 0 when not specified. + int sar_height; // Set to 0 when not specified. + bool bitstream_restriction_flag; + int max_num_reorder_frames; + int max_dec_frame_buffering; + bool timing_info_present_flag; + int num_units_in_tick; + int time_scale; + bool fixed_frame_rate_flag; + + // TODO(posciak): actually parse these instead of ParseAndIgnoreHRDParameters. + bool nal_hrd_parameters_present_flag; + int cpb_cnt_minus1; + int bit_rate_scale; + int cpb_size_scale; + int bit_rate_value_minus1[32]; + int cpb_size_value_minus1[32]; + bool cbr_flag[32]; + int initial_cpb_removal_delay_length_minus_1; + int cpb_removal_delay_length_minus1; + int dpb_output_delay_length_minus1; + int time_offset_length; + + bool low_delay_hrd_flag; + + int chroma_array_type; + }; + + struct MEDIA_EXPORT H264PPS { + H264PPS(); + + int pic_parameter_set_id; + int seq_parameter_set_id; + bool entropy_coding_mode_flag; + bool bottom_field_pic_order_in_frame_present_flag; + int num_slice_groups_minus1; + // TODO(posciak): Slice groups not implemented, could be added at some point. + int num_ref_idx_l0_default_active_minus1; + int num_ref_idx_l1_default_active_minus1; + bool weighted_pred_flag; + int weighted_bipred_idc; + int pic_init_qp_minus26; + int pic_init_qs_minus26; + int chroma_qp_index_offset; + bool deblocking_filter_control_present_flag; + bool constrained_intra_pred_flag; + bool redundant_pic_cnt_present_flag; + bool transform_8x8_mode_flag; + + bool pic_scaling_matrix_present_flag; + int scaling_list4x4[6][kH264ScalingList4x4Length]; + int scaling_list8x8[6][kH264ScalingList8x8Length]; + + int second_chroma_qp_index_offset; + }; + + struct MEDIA_EXPORT H264ModificationOfPicNum { + int modification_of_pic_nums_idc; + union { + int abs_diff_pic_num_minus1; + int long_term_pic_num; + }; + }; + + struct MEDIA_EXPORT H264WeightingFactors { + bool luma_weight_flag; + bool chroma_weight_flag; + int luma_weight[32]; + int luma_offset[32]; + int chroma_weight[32][2]; + int chroma_offset[32][2]; + }; + + struct MEDIA_EXPORT H264DecRefPicMarking { + int memory_mgmnt_control_operation; + int difference_of_pic_nums_minus1; + int long_term_pic_num; + int long_term_frame_idx; + int max_long_term_frame_idx_plus1; + }; + + struct MEDIA_EXPORT H264SliceHeader { + H264SliceHeader(); + + enum { + kRefListSize = 32, + kRefListModSize = kRefListSize + }; + + enum Type { + kPSlice = 0, + kBSlice = 1, + kISlice = 2, + kSPSlice = 3, + kSISlice = 4, + }; + + bool IsPSlice() const; + bool IsBSlice() const; + bool IsISlice() const; + bool IsSPSlice() const; + bool IsSISlice() const; + + bool idr_pic_flag; // from NAL header + int nal_ref_idc; // from NAL header + const uint8_t* nalu_data; // from NAL header + off_t nalu_size; // from NAL header + off_t header_bit_size; // calculated + + int first_mb_in_slice; + int slice_type; + int pic_parameter_set_id; + int colour_plane_id; // TODO(posciak): use this! http://crbug.com/139878 + int frame_num; + bool field_pic_flag; + bool bottom_field_flag; + int idr_pic_id; + int pic_order_cnt_lsb; + int delta_pic_order_cnt_bottom; + int delta_pic_order_cnt0; + int delta_pic_order_cnt1; + int redundant_pic_cnt; + bool direct_spatial_mv_pred_flag; + + bool num_ref_idx_active_override_flag; + int num_ref_idx_l0_active_minus1; + int num_ref_idx_l1_active_minus1; + bool ref_pic_list_modification_flag_l0; + bool ref_pic_list_modification_flag_l1; + H264ModificationOfPicNum ref_list_l0_modifications[kRefListModSize]; + H264ModificationOfPicNum ref_list_l1_modifications[kRefListModSize]; + + int luma_log2_weight_denom; + int chroma_log2_weight_denom; + + bool luma_weight_l0_flag; + bool chroma_weight_l0_flag; + H264WeightingFactors pred_weight_table_l0; + + bool luma_weight_l1_flag; + bool chroma_weight_l1_flag; + H264WeightingFactors pred_weight_table_l1; + + bool no_output_of_prior_pics_flag; + bool long_term_reference_flag; + + bool adaptive_ref_pic_marking_mode_flag; + H264DecRefPicMarking ref_pic_marking[kRefListSize]; + + int cabac_init_idc; + int slice_qp_delta; + bool sp_for_switch_flag; + int slice_qs_delta; + int disable_deblocking_filter_idc; + int slice_alpha_c0_offset_div2; + int slice_beta_offset_div2; + + // Calculated. + // Size in bits of dec_ref_pic_marking() syntax element. + size_t dec_ref_pic_marking_bit_size; + size_t pic_order_cnt_bit_size; + }; + + struct H264SEIRecoveryPoint { + int recovery_frame_cnt; + bool exact_match_flag; + bool broken_link_flag; + int changing_slice_group_idc; + }; + + struct MEDIA_EXPORT H264SEIMessage { + H264SEIMessage(); + + enum Type { + kSEIRecoveryPoint = 6, + }; + + int type; + int payload_size; + union { + // Placeholder; in future more supported types will contribute to more + // union members here. + H264SEIRecoveryPoint recovery_point; + }; + }; + + // Class to parse an Annex-B H.264 stream, + // as specified in chapters 7 and Annex B of the H.264 spec. + class MEDIA_EXPORT H264Parser { + public: + enum Result { + kOk, + kInvalidStream, // error in stream + kUnsupportedStream, // stream not supported by the parser + kEOStream, // end of stream + }; + + // Find offset from start of data to next NALU start code + // and size of found start code (3 or 4 bytes). + // If no start code is found, offset is pointing to the first unprocessed byte + // (i.e. the first byte that was not considered as a possible start of a start + // code) and |*start_code_size| is set to 0. + // Preconditions: + // - |data_size| >= 0 + // Postconditions: + // - |*offset| is between 0 and |data_size| included. + // It is strictly less than |data_size| if |data_size| > 0. + // - |*start_code_size| is either 0, 3 or 4. + static bool FindStartCode(const uint8_t* data, + off_t data_size, + off_t* offset, + off_t* start_code_size); + + // Wrapper for FindStartCode() that skips over start codes that + // may appear inside of |encrypted_ranges_|. + // Returns true if a start code was found. Otherwise returns false. + static bool FindStartCodeInClearRanges(const uint8_t* data, + off_t data_size, + const Ranges& ranges, + off_t* offset, + off_t* start_code_size); + H264Parser(); + ~H264Parser(); + + void Reset(); + // Set current stream pointer to |stream| of |stream_size| in bytes, + // |stream| owned by caller. + // |subsamples| contains information about what parts of |stream| are + // encrypted. + void SetStream(const uint8_t* stream, off_t stream_size); + void SetEncryptedStream(const uint8_t* stream, + off_t stream_size, + const std::vector& subsamples); + + // Read the stream to find the next NALU, identify it and return + // that information in |*nalu|. This advances the stream to the beginning + // of this NALU, but not past it, so subsequent calls to NALU-specific + // parsing functions (ParseSPS, etc.) will parse this NALU. + // If the caller wishes to skip the current NALU, it can call this function + // again, instead of any NALU-type specific parse functions below. + Result AdvanceToNextNALU(H264NALU* nalu); + + // NALU-specific parsing functions. + // These should be called after AdvanceToNextNALU(). + + // SPSes and PPSes are owned by the parser class and the memory for their + // structures is managed here, not by the caller, as they are reused + // across NALUs. + // + // Parse an SPS/PPS NALU and save their data in the parser, returning id + // of the parsed structure in |*pps_id|/|*sps_id|. + // To get a pointer to a given SPS/PPS structure, use GetSPS()/GetPPS(), + // passing the returned |*sps_id|/|*pps_id| as parameter. + // TODO(posciak,fischman): consider replacing returning Result from Parse*() + // methods with a scoped_ptr and adding an AtEOS() function to check for EOS + // if Parse*() return NULL. + Result ParseSPS(int* sps_id); + Result ParsePPS(int* pps_id); + + // Return a pointer to SPS/PPS with given |sps_id|/|pps_id| or NULL if not + // present. + const H264SPS* GetSPS(int sps_id) const; + const H264PPS* GetPPS(int pps_id) const; + + // Slice headers and SEI messages are not used across NALUs by the parser + // and can be discarded after current NALU, so the parser does not store + // them, nor does it manage their memory. + // The caller has to provide and manage it instead. + + // Parse a slice header, returning it in |*shdr|. |*nalu| must be set to + // the NALU returned from AdvanceToNextNALU() and corresponding to |*shdr|. + Result ParseSliceHeader(const H264NALU& nalu, H264SliceHeader* shdr); + + // Parse a SEI message, returning it in |*sei_msg|, provided and managed + // by the caller. + Result ParseSEI(H264SEIMessage* sei_msg); + + private: + // Move the stream pointer to the beginning of the next NALU, + // i.e. pointing at the next start code. + // Return true if a NALU has been found. + // If a NALU is found: + // - its size in bytes is returned in |*nalu_size| and includes + // the start code as well as the trailing zero bits. + // - the size in bytes of the start code is returned in |*start_code_size|. + bool LocateNALU(off_t* nalu_size, off_t* start_code_size); + + // Exp-Golomb code parsing as specified in chapter 9.1 of the spec. + // Read one unsigned exp-Golomb code from the stream and return in |*val|. + Result ReadUE(int* val); + + // Read one signed exp-Golomb code from the stream and return in |*val|. + Result ReadSE(int* val); + + // Parse scaling lists (see spec). + Result ParseScalingList(int size, int* scaling_list, bool* use_default); + Result ParseSPSScalingLists(H264SPS* sps); + Result ParsePPSScalingLists(const H264SPS& sps, H264PPS* pps); + + // Parse optional VUI parameters in SPS (see spec). + Result ParseVUIParameters(H264SPS* sps); + // Set |hrd_parameters_present| to true only if they are present. + Result ParseAndIgnoreHRDParameters(bool* hrd_parameters_present); + + // Parse reference picture lists' modifications (see spec). + Result ParseRefPicListModifications(H264SliceHeader* shdr); + Result ParseRefPicListModification(int num_ref_idx_active_minus1, + H264ModificationOfPicNum* ref_list_mods); + + // Parse prediction weight table (see spec). + Result ParsePredWeightTable(const H264SPS& sps, H264SliceHeader* shdr); + + // Parse weighting factors (see spec). + Result ParseWeightingFactors(int num_ref_idx_active_minus1, + int chroma_array_type, + int luma_log2_weight_denom, + int chroma_log2_weight_denom, + H264WeightingFactors* w_facts); + + // Parse decoded reference picture marking information (see spec). + Result ParseDecRefPicMarking(H264SliceHeader* shdr); + + // Pointer to the current NALU in the stream. + const uint8_t* stream_; + + // Bytes left in the stream after the current NALU. + off_t bytes_left_; + + H264BitReader br_; + + // PPSes and SPSes stored for future reference. + typedef std::map SPSById; + typedef std::map PPSById; + SPSById active_SPSes_; + PPSById active_PPSes_; + + // Ranges of encrypted bytes in the buffer passed to + // SetEncryptedStream(). + Ranges encrypted_ranges_; + + DISALLOW_COPY_AND_ASSIGN(H264Parser); + }; + +} // namespace media + +#endif // MEDIA_FILTERS_H264_PARSER_H_ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_poc.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_poc.h new file mode 100755 index 00000000..a83990d1 --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/h264_poc.h @@ -0,0 +1,45 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_VIDEO_H264_POC_H_ +#define MEDIA_VIDEO_H264_POC_H_ + +#include +#include "macros.h" + +using namespace std; + +namespace media { + + struct H264SPS; + struct H264SliceHeader; + + class MEDIA_EXPORT H264POC { + public: + H264POC(); + ~H264POC(); + + // Compute the picture order count for a slice, storing the result into + // |*pic_order_cnt|. + bool ComputePicOrderCnt( + const H264SPS* sps, + const H264SliceHeader& slice_hdr, + int32_t* pic_order_cnt); + + // Reset computation state. It's best (although not strictly required) to call + // this after a seek. + void Reset(); + + private: + int32_t ref_pic_order_cnt_msb_; + int32_t ref_pic_order_cnt_lsb_; + int32_t prev_frame_num_; + int32_t prev_frame_num_offset_; + + DISALLOW_COPY_AND_ASSIGN(H264POC); + }; + +} // namespace media + +#endif // MEDIA_VIDEO_H264_POC_H_ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/macros.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/macros.h new file mode 100755 index 00000000..3570ae9e --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/macros.h @@ -0,0 +1,100 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains macros and macro-like constructs (e.g., templates) that +// are commonly used throughout Chromium source. (It may also contain things +// that are closely related to things that are commonly used that belong in this +// file.) + +#ifndef BASE_MACROS_H_ +#define BASE_MACROS_H_ + +#include // For size_t. + +// Put this in the declarations for a class to be uncopyable. +#define DISALLOW_COPY(TypeName) \ +TypeName(const TypeName&) = delete + +// Put this in the declarations for a class to be unassignable. +#define DISALLOW_ASSIGN(TypeName) \ +void operator=(const TypeName&) = delete + +// A macro to disallow the copy constructor and operator= functions. +// This should be used in the private: declarations for a class. +#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ +TypeName(const TypeName&) = delete; \ +void operator=(const TypeName&) = delete + +// A macro to disallow all the implicit constructors, namely the +// default constructor, copy constructor and operator= functions. +// +// This should be used in the private: declarations for a class +// that wants to prevent anyone from instantiating it. This is +// especially useful for classes containing only static methods. +#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ +TypeName() = delete; \ +DISALLOW_COPY_AND_ASSIGN(TypeName) + +// The arraysize(arr) macro returns the # of elements in an array arr. The +// expression is a compile-time constant, and therefore can be used in defining +// new arrays, for example. If you use arraysize on a pointer by mistake, you +// will get a compile-time error. For the technical details, refer to +// http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx. + +// This template function declaration is used in defining arraysize. +// Note that the function doesn't need an implementation, as we only +// use its type. +template char (&ArraySizeHelper(T (&array)[N]))[N]; +#define arraysize(array) (sizeof(ArraySizeHelper(array))) + +// Used to explicitly mark the return value of a function as unused. If you are +// really sure you don't want to do anything with the return value of a function +// that has been marked WARN_UNUSED_RESULT, wrap it with this. Example: +// +// std::unique_ptr my_var = ...; +// if (TakeOwnership(my_var.get()) == SUCCESS) +// ignore_result(my_var.release()); +// +template +inline void ignore_result(const T&) { +} + +// The following enum should be used only as a constructor argument to indicate +// that the variable has static storage class, and that the constructor should +// do nothing to its state. It indicates to the reader that it is legal to +// declare a static instance of the class, provided the constructor is given +// the base::LINKER_INITIALIZED argument. Normally, it is unsafe to declare a +// static variable that has a constructor or a destructor because invocation +// order is undefined. However, IF the type can be initialized by filling with +// zeroes (which the loader does for static variables), AND the destructor also +// does nothing to the storage, AND there are no virtual methods, then a +// constructor declared as +// explicit MyClass(base::LinkerInitialized x) {} +// and invoked as +// static MyClass my_variable_name(base::LINKER_INITIALIZED); +namespace base { + enum LinkerInitialized { LINKER_INITIALIZED }; + + // Use these to declare and define a static local variable (static T;) so that + // it is leaked so that its destructors are not called at exit. If you need + // thread-safe initialization, use base/lazy_instance.h instead. +#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \ +static type& name = *new type arguments + +} // base + +#define MEDIA_EXPORT + +#include +#include "Util/logger.h" +using namespace ZL::Util; + +#define DCHECK(x) if(!(x)) { ErrorL << "DCHECK " << #x < (y))) { ErrorL << "DCHECK_GT:" << #x << #y << endl; } +#define DCHECK_GE(x,y) if(!((x) >= (y))) { ErrorL << "DCHECK_GE:" << #x << #y << endl; } +#define DCHECK_LT(x,y) if(!((x) < (y))) { ErrorL << "DCHECK_LT:" << #x << #y << endl; } +#define NOTREACHED() ErrorL << "NOTREACHED" << endl; + + +#endif // BASE_MACROS_H_ diff --git a/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/ranges.h b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/ranges.h new file mode 100755 index 00000000..ab89b5f4 --- /dev/null +++ b/bin_lib/windows/ZLMediaKit/include/ZLMediaKit/H264/ranges.h @@ -0,0 +1,154 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_BASE_RANGES_H_ +#define MEDIA_BASE_RANGES_H_ + +#include +#include + +#include +#include +#include + +using namespace std; + +namespace media { + + // Ranges allows holding an ordered list of ranges of [start,end) intervals. + // The canonical example use-case is holding the list of ranges of buffered + // bytes or times in a