mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-14 20:15:58 +08:00
release 8.0
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
* Copyright (c) 2016-present The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
* This file is part of ZLMediaKit(https://github.com/ZLMediaKit/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* Use of this source code is governed by MIT-like license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
@@ -15,6 +15,14 @@
|
||||
#include "Common/Stamp.h"
|
||||
#include "Common/MediaSource.h"
|
||||
|
||||
#if defined(ENABLE_MP4)
|
||||
#include "mov-format.h"
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_HLS) || defined(ENABLE_RTPPROXY)
|
||||
#include "mpeg-proto.h"
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
using namespace toolkit;
|
||||
|
||||
@@ -41,24 +49,73 @@ FrameStamp::FrameStamp(Frame::Ptr frame, Stamp &stamp, int modify_stamp)
|
||||
|
||||
TrackType getTrackType(CodecId codecId) {
|
||||
switch (codecId) {
|
||||
#define XX(name, type, value, str, mpeg_id) case name : return type;
|
||||
#define XX(name, type, value, str, mpeg_id, mp4_id) case name : return type;
|
||||
CODEC_MAP(XX)
|
||||
#undef XX
|
||||
default : return TrackInvalid;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(ENABLE_MP4)
|
||||
int getMovIdByCodec(CodecId codecId) {
|
||||
switch (codecId) {
|
||||
#define XX(name, type, value, str, mpeg_id, mp4_id) case name : return mp4_id;
|
||||
CODEC_MAP(XX)
|
||||
#undef XX
|
||||
default : return MOV_OBJECT_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
CodecId getCodecByMovId(int object_id) {
|
||||
if (object_id == MOV_OBJECT_NONE) {
|
||||
return CodecInvalid;
|
||||
}
|
||||
switch (object_id) {
|
||||
#define XX(name, type, value, str, mpeg_id, mp4_id) case mp4_id : return name;
|
||||
CODEC_MAP(XX)
|
||||
#undef XX
|
||||
default : WarnL << "Unsupported mov: " << object_id; return CodecInvalid;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_HLS) || defined(ENABLE_RTPPROXY)
|
||||
int getMpegIdByCodec(CodecId codec) {
|
||||
switch (codec) {
|
||||
#define XX(name, type, value, str, mpeg_id, mp4_id) case name : return mpeg_id;
|
||||
CODEC_MAP(XX)
|
||||
#undef XX
|
||||
default : return PSI_STREAM_RESERVED;
|
||||
}
|
||||
}
|
||||
|
||||
CodecId getCodecByMpegId(int mpeg_id) {
|
||||
if (mpeg_id == PSI_STREAM_RESERVED) {
|
||||
return CodecInvalid;
|
||||
}
|
||||
switch (mpeg_id) {
|
||||
#define XX(name, type, value, str, mpeg_id, mp4_id) case mpeg_id : return name;
|
||||
CODEC_MAP(XX)
|
||||
#undef XX
|
||||
// 海康的 PS 流中会有0xBD 的包
|
||||
case 0xBD: return CodecInvalid;
|
||||
default : WarnL << "Unsupported mpeg: " << mpeg_id; return CodecInvalid;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
const char *getCodecName(CodecId codec) {
|
||||
switch (codec) {
|
||||
#define XX(name, type, value, str, mpeg_id) case name : return str;
|
||||
#define XX(name, type, value, str, mpeg_id, mp4_id) case name : return str;
|
||||
CODEC_MAP(XX)
|
||||
#undef XX
|
||||
default : return "invalid";
|
||||
}
|
||||
}
|
||||
|
||||
#define XX(name, type, value, str, mpeg_id) {str, name},
|
||||
static map<string, CodecId, StrCaseCompare> codec_map = {CODEC_MAP(XX)};
|
||||
#define XX(name, type, value, str, mpeg_id, mp4_id) {str, name},
|
||||
static map<string, CodecId, StrCaseCompare> codec_map = { CODEC_MAP(XX) };
|
||||
#undef XX
|
||||
|
||||
CodecId getCodecId(const string &str){
|
||||
@@ -94,6 +151,10 @@ TrackType CodecInfo::getTrackType() const {
|
||||
return mediakit::getTrackType(getCodecId());
|
||||
}
|
||||
|
||||
std::string CodecInfo::getTrackTypeStr() const {
|
||||
return getTrackString(getTrackType());
|
||||
}
|
||||
|
||||
static size_t constexpr kMaxFrameCacheSize = 100;
|
||||
|
||||
bool FrameMerger::willFlush(const Frame::Ptr &frame) const{
|
||||
@@ -165,7 +226,19 @@ void FrameMerger::doMerge(BufferLikeString &merged, const Frame::Ptr &frame) con
|
||||
}
|
||||
}
|
||||
|
||||
static bool isNeedMerge(CodecId codec){
|
||||
switch (codec) {
|
||||
case CodecH264:
|
||||
case CodecH265: return true;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool FrameMerger::inputFrame(const Frame::Ptr &frame, onOutput cb, BufferLikeString *buffer) {
|
||||
if (frame && !isNeedMerge(frame->getCodecId())) {
|
||||
cb(frame->dts(), frame->pts(), frame, true);
|
||||
return true;
|
||||
}
|
||||
if (willFlush(frame)) {
|
||||
Frame::Ptr back = _frame_cache.back();
|
||||
Buffer::Ptr merged_frame = back;
|
||||
@@ -233,8 +306,6 @@ public:
|
||||
*/
|
||||
FrameWriterInterfaceHelper(onWriteFrame cb) { _callback = std::move(cb); }
|
||||
|
||||
virtual ~FrameWriterInterfaceHelper() = default;
|
||||
|
||||
/**
|
||||
* 写入帧数据
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user