|  |  | @@ -359,6 +359,54 @@ static int get_dvb_stream_type(AVFormatContext *s, AVStream *st) | 
		
	
		
			
			|  |  |  | return stream_type; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int stream_type; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 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(s, AV_LOG_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 mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | MpegTSWrite *ts = s->priv_data; | 
		
	
	
		
			
				|  |  | @@ -372,6 +420,14 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) | 
		
	
		
			
			|  |  |  | q += 2; /* patched after */ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* put program info here */ | 
		
	
		
			
			|  |  |  | if (ts->m2ts_mode) { | 
		
	
		
			
			|  |  |  | put_registration_descriptor(&q, MKTAG('H', 'D', 'M', 'V')); | 
		
	
		
			
			|  |  |  | *q++ = 0x88;        // descriptor_tag - hdmv_copy_control_descriptor | 
		
	
		
			
			|  |  |  | *q++ = 0x04;        // descriptor_length | 
		
	
		
			
			|  |  |  | put16(&q, 0x0fff);  // CA_System_ID | 
		
	
		
			
			|  |  |  | *q++ = 0xfc;        // private_data_byte | 
		
	
		
			
			|  |  |  | *q++ = 0xfc;        // private_data_byte | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | val = 0xf000 | (q - program_info_length_ptr - 2); | 
		
	
		
			
			|  |  |  | program_info_length_ptr[0] = val >> 8; | 
		
	
	
		
			
				|  |  | @@ -401,7 +457,7 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | stream_type = get_dvb_stream_type(s, st); | 
		
	
		
			
			|  |  |  | stream_type = ts->m2ts_mode ? get_m2ts_stream_type(s, st) : get_dvb_stream_type(s, st); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | *q++ = stream_type; | 
		
	
		
			
			|  |  |  | put16(&q, 0xe000 | ts_st->pid); | 
		
	
	
		
			
				|  |  | 
 |