+static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
+{
+ MpegTSWrite *ts = s->priv_data;
+ MpegTSWriteStream *ts_st = st->priv_data;
+ int stream_type;
+
+ switch (st->codecpar->codec_id) {
+ case AV_CODEC_ID_MPEG1VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
+ stream_type = STREAM_TYPE_VIDEO_MPEG2;
+ break;
+ case AV_CODEC_ID_MPEG4:
+ stream_type = STREAM_TYPE_VIDEO_MPEG4;
+ break;
+ case AV_CODEC_ID_H264:
+ stream_type = STREAM_TYPE_VIDEO_H264;
+ break;
+ case AV_CODEC_ID_HEVC:
+ stream_type = STREAM_TYPE_VIDEO_HEVC;
+ break;
+ case AV_CODEC_ID_CAVS:
+ stream_type = STREAM_TYPE_VIDEO_CAVS;
+ break;
+ case AV_CODEC_ID_DIRAC:
+ stream_type = STREAM_TYPE_VIDEO_DIRAC;
+ break;
+ case AV_CODEC_ID_VC1:
+ stream_type = STREAM_TYPE_VIDEO_VC1;
+ break;
+ case AV_CODEC_ID_MP2:
+ case AV_CODEC_ID_MP3:
+ if ( st->codecpar->sample_rate > 0
+ && st->codecpar->sample_rate < 32000) {
+ stream_type = STREAM_TYPE_AUDIO_MPEG2;
+ } else {
+ stream_type = STREAM_TYPE_AUDIO_MPEG1;
+ }
+ break;
+ case AV_CODEC_ID_AAC:
+ stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM)
+ ? STREAM_TYPE_AUDIO_AAC_LATM
+ : STREAM_TYPE_AUDIO_AAC;
+ break;
+ case AV_CODEC_ID_AAC_LATM:
+ stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
+ break;
+ case AV_CODEC_ID_AC3:
+ stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
+ ? STREAM_TYPE_PRIVATE_DATA
+ : STREAM_TYPE_AUDIO_AC3;
+ break;
+ case AV_CODEC_ID_EAC3:
+ stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
+ ? STREAM_TYPE_PRIVATE_DATA
+ : STREAM_TYPE_AUDIO_EAC3;
+ break;
+ case AV_CODEC_ID_DTS:
+ stream_type = STREAM_TYPE_AUDIO_DTS;
+ break;
+ case AV_CODEC_ID_TRUEHD:
+ stream_type = STREAM_TYPE_AUDIO_TRUEHD;
+ break;
+ case AV_CODEC_ID_OPUS:
+ stream_type = STREAM_TYPE_PRIVATE_DATA;
+ break;
+ case AV_CODEC_ID_TIMED_ID3:
+ stream_type = STREAM_TYPE_METADATA;
+ break;
+ case AV_CODEC_ID_DVB_SUBTITLE:
+ case AV_CODEC_ID_DVB_TELETEXT:
+ stream_type = STREAM_TYPE_PRIVATE_DATA;
+ break;
+ case AV_CODEC_ID_SMPTE_KLV:
+ if (st->codecpar->profile == FF_PROFILE_KLVA_SYNC) {
+ stream_type = STREAM_TYPE_METADATA;
+ } else {
+ stream_type = STREAM_TYPE_PRIVATE_DATA;
+ }
+ break;
+ default:
+ av_log_once(s, AV_LOG_WARNING, AV_LOG_DEBUG, &ts_st->data_st_warning,
+ "Stream %d, codec %s, is muxed as a private data stream "
+ "and may not be recognized upon reading.\n", st->index,
+ avcodec_get_name(st->codecpar->codec_id));
+ stream_type = STREAM_TYPE_PRIVATE_DATA;
+ break;
+ }
+
+ return stream_type;
+}
+
+static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st)
+{
+ int stream_type;
+ MpegTSWriteStream *ts_st = st->priv_data;
+
+ switch (st->codecpar->codec_id) {
+ case AV_CODEC_ID_MPEG2VIDEO:
+ stream_type = STREAM_TYPE_VIDEO_MPEG2;
+ break;
+ case AV_CODEC_ID_H264:
+ stream_type = STREAM_TYPE_VIDEO_H264;
+ break;
+ case AV_CODEC_ID_VC1:
+ stream_type = STREAM_TYPE_VIDEO_VC1;
+ break;
+ case AV_CODEC_ID_HEVC:
+ stream_type = STREAM_TYPE_VIDEO_HEVC;
+ break;
+ case AV_CODEC_ID_PCM_BLURAY:
+ stream_type = 0x80;
+ break;
+ case AV_CODEC_ID_AC3:
+ stream_type = 0x81;
+ break;
+ case AV_CODEC_ID_DTS:
+ stream_type = (st->codecpar->channels > 6) ? 0x85 : 0x82;
+ break;
+ case AV_CODEC_ID_TRUEHD:
+ stream_type = 0x83;
+ break;
+ case AV_CODEC_ID_EAC3:
+ stream_type = 0x84;
+ break;
+ case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
+ stream_type = 0x90;
+ break;
+ case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
+ stream_type = 0x92;
+ break;
+ default:
+ av_log_once(s, AV_LOG_WARNING, AV_LOG_DEBUG, &ts_st->data_st_warning,
+ "Stream %d, codec %s, is muxed as a private data stream "
+ "and may not be recognized upon reading.\n", st->index,
+ avcodec_get_name(st->codecpar->codec_id));
+ stream_type = STREAM_TYPE_PRIVATE_DATA;
+ break;
+ }
+
+ return stream_type;
+}
+