stream-deploy/ZLM/3rdpart/media-server/librtsp/include/rtsp-payloads.h

163 lines
7.6 KiB
C++

#ifndef _rtsp_payloads_h_
#define _rtsp_payloads_h_
#include "flv-proto.h"
#include "mov-format.h"
#include "mkv-format.h"
#include "rtp-profile.h"
#include "mpeg-proto.h"
#include <stdlib.h>
#include <string.h>
#if defined(OS_WINDOWS)
#if !defined(strcasecmp)
#define strcasecmp _stricmp
#endif
#endif
#ifdef _avcodecid_h_
#define CODEC(avcodec, mov, mkv, flv, mpeg2, rtp, rate, encoding, name) { avcodec, flv, mov, mpeg2, rtp, encoding, mkv, rate, name }
#else
#define CODEC(avcodec, mov, mkv, flv, mpeg2, rtp, rate, encoding, name) { flv, mov, mpeg2, rtp, encoding, mkv, rate, name }
#endif
static struct
{
#ifdef _avcodecid_h_
AVPACKET_CODEC_ID codecid;
#endif
uint16_t flv; // flv codec id
uint8_t mov; // mov object id
uint8_t mpeg2; // mpeg2 codecid
uint8_t payload; // rtp payload id
const char* encoding; // rtp encoding
enum mkv_codec_t mkv; // mkv codec id
int frequency;
const char* name; // describe
} s_payloads[] = {
// video
CODEC(AVCODEC_VIDEO_H264, MOV_OBJECT_H264, MKV_CODEC_VIDEO_H264, FLV_VIDEO_H264, PSI_STREAM_H264, RTP_PAYLOAD_H264, 90000, "H264", "H264"),
CODEC(AVCODEC_VIDEO_H265, MOV_OBJECT_H265, MKV_CODEC_VIDEO_H265, FLV_VIDEO_H265, PSI_STREAM_H265, RTP_PAYLOAD_H265, 90000, "H265", "H265"),
CODEC(AVCODEC_VIDEO_H265, MOV_OBJECT_H265, MKV_CODEC_VIDEO_H265, FLV_VIDEO_H265, PSI_STREAM_H265, RTP_PAYLOAD_H265, 90000, "HEVC", "H265"),
CODEC(AVCODEC_VIDEO_H266, MOV_OBJECT_H266, MKV_CODEC_VIDEO_H266, FLV_VIDEO_H266, PSI_STREAM_H266, RTP_PAYLOAD_H266, 90000, "H266", "H266"),
CODEC(AVCODEC_VIDEO_MPEG4, MOV_OBJECT_MP4V, MKV_CODEC_VIDEO_MPEG4, 0, PSI_STREAM_MPEG4, RTP_PAYLOAD_MP4V, 90000, "MP4V-ES", "MPEG4"),
CODEC(AVCODEC_VIDEO_MPEG4, MOV_OBJECT_MP4V, MKV_CODEC_VIDEO_MPEG4, 0, PSI_STREAM_MPEG4, RTP_PAYLOAD_MP4V, 90000, "MPEG4", "MPEG4"),
CODEC(AVCODEC_VIDEO_VP8, MOV_OBJECT_VP8, MKV_CODEC_VIDEO_VP8, 0, PSI_STREAM_VP8, RTP_PAYLOAD_VP8, 90000, "VP8", "VP8"),
CODEC(AVCODEC_VIDEO_VP9, MOV_OBJECT_VP9, MKV_CODEC_VIDEO_VP9, 0, PSI_STREAM_VP9, RTP_PAYLOAD_VP9, 90000, "VP9", "VP9"),
CODEC(AVCODEC_VIDEO_AV1, MOV_OBJECT_AV1, MKV_CODEC_VIDEO_AV1, FLV_VIDEO_AV1, PSI_STREAM_AV1, RTP_PAYLOAD_AV1, 90000, "AV1", "AV1"),
CODEC(AVCODEC_VIDEO_AV1, MOV_OBJECT_AV1, MKV_CODEC_VIDEO_AV1, FLV_VIDEO_AV1, PSI_STREAM_AV1, RTP_PAYLOAD_AV1X, 90000, "AV1X", "AV1"), // https://bugs.chromium.org/p/webrtc/issues/detail?id=11042
CODEC(AVCODEC_VIDEO_SVAC, MOV_OBJECT_NONE, MKV_CODEC_UNKNOWN, 0, PSI_STREAM_VIDEO_SVAC, RTP_PAYLOAD_SVAC, 90000, "SVAC", "SVAC"), // GB/T 28181-2022
// audio
CODEC(AVCODEC_AUDIO_AAC, MOV_OBJECT_AAC, MKV_CODEC_AUDIO_AAC, FLV_AUDIO_AAC, PSI_STREAM_AAC, RTP_PAYLOAD_LATM, 44100, "MP4A-LATM","AAC"),
CODEC(AVCODEC_AUDIO_AAC, MOV_OBJECT_AAC, MKV_CODEC_AUDIO_AAC, FLV_AUDIO_AAC, PSI_STREAM_AAC, RTP_PAYLOAD_MP4A, 44100, "mpeg4-generic", "AAC"),
CODEC(AVCODEC_AUDIO_AAC, MOV_OBJECT_AAC, MKV_CODEC_AUDIO_AAC, FLV_AUDIO_AAC, PSI_STREAM_AAC, RTP_PAYLOAD_MP4A, 8000, "AAC", "AAC"), // GB/T 28181-2022 rtpmap:102 AAC/8000/1 RFC3640
CODEC(AVCODEC_AUDIO_AAC, MOV_OBJECT_AAC, MKV_CODEC_AUDIO_AAC, FLV_AUDIO_AAC, PSI_STREAM_MPEG4_AAC_LATM, RTP_PAYLOAD_MP4A, 44100, "MP4A-LATM","AAC"),
CODEC(AVCODEC_AUDIO_OPUS, MOV_OBJECT_OPUS, MKV_CODEC_AUDIO_OPUS, FLV_AUDIO_OPUS, PSI_STREAM_AUDIO_OPUS, RTP_PAYLOAD_OPUS, 48000, "opus", "opus"),
CODEC(AVCODEC_AUDIO_MP3, MOV_OBJECT_MP3, MKV_CODEC_AUDIO_MP3, FLV_AUDIO_MP3, PSI_STREAM_MP3, RTP_PAYLOAD_MP3, 16000, "mp3", "mp3"), // rtp standard payload id
CODEC(AVCODEC_AUDIO_G711A, MOV_OBJECT_G711a, MKV_CODEC_UNKNOWN, FLV_AUDIO_G711A, PSI_STREAM_AUDIO_G711A, RTP_PAYLOAD_PCMA, 8000, "pcma", "g711a"), // rtp standard payload id
CODEC(AVCODEC_AUDIO_G711U, MOV_OBJECT_G711u, MKV_CODEC_UNKNOWN, FLV_AUDIO_G711U, PSI_STREAM_AUDIO_G711U, RTP_PAYLOAD_PCMU, 8000, "pcmu", "g711u"), // rtp standard payload id
CODEC(AVCODEC_AUDIO_SVAC, MOV_OBJECT_NONE, MKV_CODEC_UNKNOWN, 0, PSI_STREAM_AUDIO_SVAC, RTP_PAYLOAD_SVACA, 8000, "SVACA", "SVACA"), // GB/T 28181-2016
// data
CODEC(AVCODEC_DATA_RAW, MOV_OBJECT_NONE, MKV_CODEC_UNKNOWN, FLV_SCRIPT_METADATA, PSI_STREAM_RESERVED, RTP_PAYLOAD_DYNAMIC,0, "raw", "raw"),
CODEC(AVCODEC_DATA_MP2P, MOV_OBJECT_NONE, MKV_CODEC_UNKNOWN, 0, PSI_STREAM_RESERVED, RTP_PAYLOAD_MP2P, 90000, "MP2P", "PS"),
// PS/TS
CODEC(AVCODEC_NONE, MOV_OBJECT_NONE, MKV_CODEC_UNKNOWN, 0, PSI_STREAM_RESERVED, RTP_PAYLOAD_MP2T, 90000, "TS", "TS"), // rtp standard payload id
CODEC(AVCODEC_NONE, MOV_OBJECT_NONE, MKV_CODEC_UNKNOWN, 0, PSI_STREAM_RESERVED, RTP_PAYLOAD_MP2P, 90000, "MP2P", "PS"),
CODEC(AVCODEC_NONE, MOV_OBJECT_NONE, MKV_CODEC_UNKNOWN, 0, PSI_STREAM_RESERVED, RTP_PAYLOAD_MP2P, 90000, "PS", "PS"), // GB28181
};
#ifdef _avcodecid_h_
static inline int avcodecid_find_by_codecid(AVPACKET_CODEC_ID codecid)
{
size_t i;
for (i = 0; i < sizeof(s_payloads) / sizeof(s_payloads[0]); i++)
{
if (s_payloads[i].codecid == codecid && AVCODEC_NONE != s_payloads[i].codecid)
return (int)i;
}
return -1;
}
#endif
static inline int avpayload_find_by_flv(int flv)
{
size_t i;
for (i = 0; i < sizeof(s_payloads) / sizeof(s_payloads[0]); i++)
{
if ((int)s_payloads[i].flv == flv && flv != 0)
return (int)i;
}
return -1;
}
static inline int avpayload_find_by_mov(uint8_t object)
{
size_t i;
for (i = 0; i < sizeof(s_payloads) / sizeof(s_payloads[0]); i++)
{
if (s_payloads[i].mov == object && MOV_OBJECT_NONE != object)
return (int)i;
}
return -1;
}
static inline int avpayload_find_by_mkv(enum mkv_codec_t codec)
{
size_t i;
for (i = 0; i < sizeof(s_payloads) / sizeof(s_payloads[0]); i++)
{
if (s_payloads[i].mkv == codec && MKV_CODEC_UNKNOWN != codec)
return (int)i;
}
return -1;
}
static inline int avpayload_find_by_mpeg2(uint8_t mpeg2)
{
size_t i;
for (i = 0; i < sizeof(s_payloads) / sizeof(s_payloads[0]); i++)
{
if (s_payloads[i].mpeg2 == mpeg2 && PSI_STREAM_RESERVED != mpeg2)
return (int)i;
}
return -1;
}
// for rtp encoding
static inline int avpayload_find_by_payload(uint8_t payload)
{
size_t i;
for (i = 0; i < sizeof(s_payloads) / sizeof(s_payloads[0]); i++)
{
if (s_payloads[i].payload == payload)
return (int)i;
}
return -1;
}
// for rtp decoding
static inline int avpayload_find_by_rtp(uint8_t payload, const char* encoding)
{
size_t i;
for (i = 0; i < sizeof(s_payloads) / sizeof(s_payloads[0]); i++)
{
if ( (payload < RTP_PAYLOAD_DYNAMIC || !encoding || !*encoding) && s_payloads[i].payload == payload)
return (int)i;
else if (payload >= RTP_PAYLOAD_DYNAMIC && encoding && 0 == strcasecmp(encoding, s_payloads[i].encoding))
return (int)i;
}
return -1;
}
#endif /* !_rtsp_payloads_h_ */