mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-07-28 21:14:03 +08:00
新增若干音视频编码类型的默认实现
部分支持VP8/VP9/AV1/JPEG/MP3/H266/ADPCM/SVAC/G722/G723/G729
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
|
||||
#include "Factory.h"
|
||||
#include "Rtmp/Rtmp.h"
|
||||
#include "CommonRtmp.h"
|
||||
#include "CommonRtp.h"
|
||||
#include "Common/config.h"
|
||||
|
||||
using namespace std;
|
||||
@@ -19,15 +21,6 @@ namespace mediakit {
|
||||
|
||||
static std::unordered_map<int, const CodecPlugin *> s_plugins;
|
||||
|
||||
extern CodecPlugin h264_plugin;
|
||||
extern CodecPlugin h265_plugin;
|
||||
extern CodecPlugin jpeg_plugin;
|
||||
extern CodecPlugin aac_plugin;
|
||||
extern CodecPlugin opus_plugin;
|
||||
extern CodecPlugin g711a_plugin;
|
||||
extern CodecPlugin g711u_plugin;
|
||||
extern CodecPlugin l16_plugin;
|
||||
|
||||
REGISTER_CODEC(h264_plugin);
|
||||
REGISTER_CODEC(h265_plugin);
|
||||
REGISTER_CODEC(jpeg_plugin);
|
||||
@@ -51,8 +44,7 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
|
||||
}
|
||||
auto it = s_plugins.find(codec);
|
||||
if (it == s_plugins.end()) {
|
||||
WarnL << "Unsupported codec: " << track->getName();
|
||||
return nullptr;
|
||||
return getTrackByCodecId(codec, track->_samplerate, track->_channel);
|
||||
}
|
||||
return it->second->getTrackBySdp(track);
|
||||
}
|
||||
@@ -69,8 +61,8 @@ Track::Ptr Factory::getTrackByAbstractTrack(const Track::Ptr &track) {
|
||||
RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec, uint8_t pt) {
|
||||
auto it = s_plugins.find(codec);
|
||||
if (it == s_plugins.end()) {
|
||||
WarnL << "Unsupported codec: " << getCodecName(codec);
|
||||
return nullptr;
|
||||
WarnL << "Unsupported codec: " << getCodecName(codec) << ", use CommonRtpEncoder";
|
||||
return std::make_shared<CommonRtpEncoder>();
|
||||
}
|
||||
return it->second->getRtpEncoderByCodecId(pt);
|
||||
}
|
||||
@@ -78,8 +70,8 @@ RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec, uint8_t pt) {
|
||||
RtpCodec::Ptr Factory::getRtpDecoderByCodecId(CodecId codec) {
|
||||
auto it = s_plugins.find(codec);
|
||||
if (it == s_plugins.end()) {
|
||||
WarnL << "Unsupported codec: " << getCodecName(codec);
|
||||
return nullptr;
|
||||
WarnL << "Unsupported codec: " << getCodecName(codec) << ", use CommonRtpDecoder";
|
||||
return std::make_shared<CommonRtpDecoder>(codec, 10 * 1024);
|
||||
}
|
||||
return it->second->getRtpDecoderByCodecId();
|
||||
}
|
||||
@@ -87,7 +79,7 @@ RtpCodec::Ptr Factory::getRtpDecoderByCodecId(CodecId codec) {
|
||||
// ///////////////////////////rtmp相关/////////////////////////////////////////// [AUTO-TRANSLATED:da9645df]
|
||||
// ///////////////////////////rtmp related///////////////////////////////////////////
|
||||
|
||||
static CodecId getVideoCodecIdByAmf(const AMFValue &val){
|
||||
static CodecId getVideoCodecIdByAmf(const AMFValue &val) {
|
||||
if (val.type() == AMF_STRING) {
|
||||
auto str = val.as_string();
|
||||
if (str == "avc1") {
|
||||
@@ -117,15 +109,25 @@ static CodecId getVideoCodecIdByAmf(const AMFValue &val){
|
||||
Track::Ptr Factory::getTrackByCodecId(CodecId codec, int sample_rate, int channels, int sample_bit) {
|
||||
auto it = s_plugins.find(codec);
|
||||
if (it == s_plugins.end()) {
|
||||
WarnL << "Unsupported codec: " << getCodecName(codec);
|
||||
return nullptr;
|
||||
auto type = mediakit::getTrackType(codec);
|
||||
switch (type) {
|
||||
case TrackAudio: {
|
||||
WarnL << "Unsupported codec: " << getCodecName(codec) << ", use default audio track";
|
||||
return std::make_shared<AudioTrackImp>(codec, sample_rate, channels, sample_bit);
|
||||
}
|
||||
case TrackVideo: {
|
||||
WarnL << "Unsupported codec: " << getCodecName(codec) << ", use default video track";
|
||||
return std::make_shared<VideoTrackImp>(codec, 0, 0, 0);
|
||||
}
|
||||
default: WarnL << "Unsupported codec: " << getCodecName(codec); return nullptr;
|
||||
}
|
||||
}
|
||||
return it->second->getTrackByCodecId(sample_rate, channels, sample_bit);
|
||||
}
|
||||
|
||||
Track::Ptr Factory::getVideoTrackByAmf(const AMFValue &amf) {
|
||||
CodecId codecId = getVideoCodecIdByAmf(amf);
|
||||
if(codecId == CodecInvalid){
|
||||
if (codecId == CodecInvalid) {
|
||||
return nullptr;
|
||||
}
|
||||
return getTrackByCodecId(codecId);
|
||||
@@ -144,18 +146,19 @@ static CodecId getAudioCodecIdByAmf(const AMFValue &val) {
|
||||
if (val.type() != AMF_NULL) {
|
||||
auto type_id = (RtmpAudioCodec)val.as_integer();
|
||||
switch (type_id) {
|
||||
case RtmpAudioCodec::aac : return CodecAAC;
|
||||
case RtmpAudioCodec::g711a : return CodecG711A;
|
||||
case RtmpAudioCodec::g711u : return CodecG711U;
|
||||
case RtmpAudioCodec::opus : return CodecOpus;
|
||||
default : WarnL << "Unsupported codec: " << (int)type_id; return CodecInvalid;
|
||||
case RtmpAudioCodec::aac: return CodecAAC;
|
||||
case RtmpAudioCodec::mp3: return CodecMP3;
|
||||
case RtmpAudioCodec::adpcm: return CodecADPCM;
|
||||
case RtmpAudioCodec::g711a: return CodecG711A;
|
||||
case RtmpAudioCodec::g711u: return CodecG711U;
|
||||
case RtmpAudioCodec::opus: return CodecOpus;
|
||||
default: WarnL << "Unsupported codec: " << (int)type_id; return CodecInvalid;
|
||||
}
|
||||
}
|
||||
|
||||
return CodecInvalid;
|
||||
}
|
||||
|
||||
Track::Ptr Factory::getAudioTrackByAmf(const AMFValue& amf, int sample_rate, int channels, int sample_bit){
|
||||
Track::Ptr Factory::getAudioTrackByAmf(const AMFValue &amf, int sample_rate, int channels, int sample_bit) {
|
||||
CodecId codecId = getAudioCodecIdByAmf(amf);
|
||||
if (codecId == CodecInvalid) {
|
||||
return nullptr;
|
||||
@@ -166,8 +169,8 @@ Track::Ptr Factory::getAudioTrackByAmf(const AMFValue& amf, int sample_rate, int
|
||||
RtmpCodec::Ptr Factory::getRtmpDecoderByTrack(const Track::Ptr &track) {
|
||||
auto it = s_plugins.find(track->getCodecId());
|
||||
if (it == s_plugins.end()) {
|
||||
WarnL << "Unsupported codec: " << track->getCodecName();
|
||||
return nullptr;
|
||||
WarnL << "Unsupported codec: " << track->getCodecName() << ", use CommonRtmpDecoder";
|
||||
return std::make_shared<CommonRtmpDecoder>(track);
|
||||
}
|
||||
return it->second->getRtmpDecoderByTrack(track);
|
||||
}
|
||||
@@ -175,8 +178,8 @@ RtmpCodec::Ptr Factory::getRtmpDecoderByTrack(const Track::Ptr &track) {
|
||||
RtmpCodec::Ptr Factory::getRtmpEncoderByTrack(const Track::Ptr &track) {
|
||||
auto it = s_plugins.find(track->getCodecId());
|
||||
if (it == s_plugins.end()) {
|
||||
WarnL << "Unsupported codec: " << track->getCodecName();
|
||||
return nullptr;
|
||||
WarnL << "Unsupported codec: " << track->getCodecName() << ", use CommonRtmpEncoder";
|
||||
return std::make_shared<CommonRtmpEncoder>(track);
|
||||
}
|
||||
return it->second->getRtmpEncoderByTrack(track);
|
||||
}
|
||||
@@ -190,6 +193,8 @@ AMFValue Factory::getAmfByCodecId(CodecId codecId) {
|
||||
case CodecG711A: return AMFValue((int)RtmpAudioCodec::g711a);
|
||||
case CodecG711U: return AMFValue((int)RtmpAudioCodec::g711u);
|
||||
case CodecOpus: return AMFValue((int)RtmpAudioCodec::opus);
|
||||
case CodecADPCM: return AMFValue((int)RtmpAudioCodec::adpcm);
|
||||
case CodecMP3: return AMFValue((int)RtmpAudioCodec::mp3);
|
||||
case CodecAV1: return AMFValue((int)RtmpVideoCodec::fourcc_av1);
|
||||
case CodecVP9: return AMFValue((int)RtmpVideoCodec::fourcc_vp9);
|
||||
default: return AMFValue(AMF_NULL);
|
||||
@@ -208,11 +213,10 @@ Frame::Ptr Factory::getFrameFromPtr(CodecId codec, const char *data, size_t byte
|
||||
|
||||
Frame::Ptr Factory::getFrameFromBuffer(CodecId codec, Buffer::Ptr data, uint64_t dts, uint64_t pts) {
|
||||
auto frame = Factory::getFrameFromPtr(codec, data->data(), data->size(), dts, pts);
|
||||
if(!frame){
|
||||
if (!frame) {
|
||||
return nullptr;
|
||||
}
|
||||
return std::make_shared<FrameCacheAble>(frame, false, std::move(data));
|
||||
}
|
||||
|
||||
}//namespace mediakit
|
||||
|
||||
} // namespace mediakit
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#define REGISTER_STATIC_VAR(var_name, line) REGISTER_STATIC_VAR_INNER(var_name, line)
|
||||
|
||||
#define REGISTER_CODEC(plugin) \
|
||||
extern CodecPlugin plugin; \
|
||||
static toolkit::onceToken REGISTER_STATIC_VAR(s_token, __LINE__) ([]() { \
|
||||
Factory::registerPlugin(plugin); \
|
||||
});
|
||||
|
||||
@@ -43,7 +43,18 @@ typedef enum {
|
||||
XX(CodecVP8, TrackVideo, 7, "VP8", PSI_STREAM_VP8, MOV_OBJECT_VP8) \
|
||||
XX(CodecVP9, TrackVideo, 8, "VP9", PSI_STREAM_VP9, MOV_OBJECT_VP9) \
|
||||
XX(CodecAV1, TrackVideo, 9, "AV1", PSI_STREAM_AV1, MOV_OBJECT_AV1) \
|
||||
XX(CodecJPEG, TrackVideo, 10, "JPEG", PSI_STREAM_JPEG_2000, MOV_OBJECT_JPEG)
|
||||
XX(CodecJPEG, TrackVideo, 10, "JPEG", PSI_STREAM_JPEG_2000, MOV_OBJECT_JPEG) \
|
||||
XX(CodecH266, TrackVideo, 11, "H266", PSI_STREAM_H266, MOV_OBJECT_H266) \
|
||||
XX(CodecTS, TrackVideo, 12, "MP2T", PSI_STREAM_RESERVED, MOV_OBJECT_NONE) \
|
||||
XX(CodecPS, TrackVideo, 13, "MPEG", PSI_STREAM_RESERVED, MOV_OBJECT_NONE) \
|
||||
XX(CodecMP3, TrackAudio, 14, "MP3", PSI_STREAM_MP3, MOV_OBJECT_MP3) \
|
||||
XX(CodecADPCM, TrackAudio, 15, "ADPCM", PSI_STREAM_RESERVED, MOV_OBJECT_NONE) \
|
||||
XX(CodecSVACV, TrackVideo, 16, "SVACV", PSI_STREAM_VIDEO_SVAC, MOV_OBJECT_NONE) \
|
||||
XX(CodecSVACA, TrackAudio, 17, "SVACA", PSI_STREAM_AUDIO_SVAC, MOV_OBJECT_NONE) \
|
||||
XX(CodecG722, TrackAudio, 18, "G722", PSI_STREAM_AUDIO_G722, MOV_OBJECT_NONE) \
|
||||
XX(CodecG723, TrackAudio, 19, "G723", PSI_STREAM_AUDIO_G723, MOV_OBJECT_NONE) \
|
||||
XX(CodecG728, TrackAudio, 20, "G728", PSI_STREAM_RESERVED, MOV_OBJECT_NONE) \
|
||||
XX(CodecG729, TrackAudio, 21, "G729", PSI_STREAM_AUDIO_G729, MOV_OBJECT_NONE)
|
||||
|
||||
typedef enum {
|
||||
CodecInvalid = -1,
|
||||
|
||||
26
src/Extension/Track.cpp
Normal file
26
src/Extension/Track.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (c) 2016-present The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/ZLMediaKit/ZLMediaKit).
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "Track.h"
|
||||
#include "Util/util.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace toolkit;
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
Sdp::Ptr AudioTrackImp::getSdp(uint8_t payload_type) const {
|
||||
return std::make_shared<DefaultSdp>(payload_type, *this);
|
||||
}
|
||||
Sdp::Ptr VideoTrackImp::getSdp(uint8_t payload_type) const {
|
||||
return std::make_shared<DefaultSdp>(payload_type, *this);
|
||||
}
|
||||
|
||||
} // namespace mediakit
|
||||
@@ -201,7 +201,7 @@ public:
|
||||
bool ready() const override { return true; }
|
||||
|
||||
Track::Ptr clone() const override { return std::make_shared<VideoTrackImp>(*this); }
|
||||
Sdp::Ptr getSdp(uint8_t payload_type) const override { return nullptr; }
|
||||
Sdp::Ptr getSdp(uint8_t payload_type) const override;
|
||||
CodecId getCodecId() const override { return _codec_id; }
|
||||
|
||||
private:
|
||||
@@ -298,7 +298,7 @@ public:
|
||||
* [AUTO-TRANSLATED:9af5a0a4]
|
||||
*/
|
||||
int getAudioSampleRate() const override{
|
||||
return _sample_rate;
|
||||
return _sample_rate ? _sample_rate : RtpPayload::getClockRateByCodec(_codecid);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -308,7 +308,7 @@ public:
|
||||
* [AUTO-TRANSLATED:5fedc65d]
|
||||
*/
|
||||
int getAudioSampleBit() const override{
|
||||
return _sample_bit;
|
||||
return _sample_bit ? _sample_bit : 16;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -318,11 +318,11 @@ public:
|
||||
* [AUTO-TRANSLATED:2613b317]
|
||||
*/
|
||||
int getAudioChannel() const override{
|
||||
return _channels;
|
||||
return _channels ? _channels : 1;
|
||||
}
|
||||
|
||||
Track::Ptr clone() const override { return std::make_shared<AudioTrackImp>(*this); }
|
||||
Sdp::Ptr getSdp(uint8_t payload_type) const override { return nullptr; }
|
||||
Sdp::Ptr getSdp(uint8_t payload_type) const override;
|
||||
|
||||
private:
|
||||
CodecId _codecid;
|
||||
|
||||
Reference in New Issue
Block a user