| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -533,8 +533,7 @@ static void mpegts_find_stream_type(AVStream *st, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static AVStream *new_pes_av_stream(PESContext *pes, uint32_t code, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                   uint32_t prog_reg_desc, uint32_t reg_desc) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static AVStream *new_pes_av_stream(PESContext *pes, uint32_t prog_reg_desc) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    AVStream *st = av_new_stream(pes->stream, pes->pid); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -548,19 +547,15 @@ static AVStream *new_pes_av_stream(PESContext *pes, uint32_t code, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    st->need_parsing = AVSTREAM_PARSE_FULL; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    pes->st = st; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    dprintf(pes->stream, "stream_type=%x prog_reg_desc=%.4s reg_desc=%.4s\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pes->stream_type, (char*)&prog_reg_desc, (char*)®_desc); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    dprintf(pes->stream, "stream_type=%x pid=%x prog_reg_desc=%.4s\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pes->stream_type, pes->pid, (char*)&prog_reg_desc); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (pes->stream_type == 0x06) { // private data carrying pes data | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        mpegts_find_stream_type(st, reg_desc, REGD_types); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        mpegts_find_stream_type(st, pes->stream_type, ISO_types); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (prog_reg_desc == AV_RL32("HDMV") && | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            st->codec->codec_id == CODEC_ID_PROBE) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            mpegts_find_stream_type(st, pes->stream_type, HDMV_types); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (st->codec->codec_id == CODEC_ID_PROBE) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            mpegts_find_stream_type(st, pes->stream_type, MISC_types); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return st; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -624,8 +619,6 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (p >= p_end) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    for(;;) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        reg_desc = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        language[0] = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        st = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        stream_type = get8(&p, p_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (stream_type < 0) | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -633,6 +626,25 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        pid = get16(&p, p_end) & 0x1fff; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (pid < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /* now create ffmpeg stream */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pes = ts->pids[pid]->u.pes_filter.opaque; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            st = pes->st; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pes = add_pes_stream(ts, pid, pcr_pid, stream_type); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (pes) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                st = new_pes_av_stream(pes, prog_reg_desc); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!st) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        add_pid_to_pmt(ts, h->id, pid); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        av_program_add_stream_index(ts->stream, h->id, st->index); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        desc_list_len = get16(&p, p_end) & 0xfff; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (desc_list_len < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            break; | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -643,15 +655,6 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            desc_tag = get8(&p, desc_list_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (desc_tag < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (stream_type == STREAM_TYPE_PRIVATE_DATA) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if((desc_tag == 0x6A) || (desc_tag == 0x7A)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    /*assume DVB AC-3 Audio*/ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    stream_type = STREAM_TYPE_AUDIO_AC3; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                } else if(desc_tag == 0x7B) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    /* DVB DTS audio */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    stream_type = STREAM_TYPE_AUDIO_DTS; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            desc_len = get8(&p, desc_list_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (desc_len < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                break; | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -663,10 +666,20 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                   desc_tag, desc_len); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            switch(desc_tag) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            case 0x6a: /* AC-3 descriptor */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            case 0x7a: /* AC-3 descriptor */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                st->codec->codec_type = CODEC_TYPE_AUDIO; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                st->codec->codec_id   = CODEC_ID_AC3; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            case 0x7b: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                st->codec->codec_type = CODEC_TYPE_AUDIO; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                st->codec->codec_id   = CODEC_ID_DTS; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            case 0x59: /* subtitling descriptor */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if (stream_type == STREAM_TYPE_PRIVATE_DATA) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    stream_type = 0x100; // demuxer internal | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if (stream_type == STREAM_TYPE_PRIVATE_DATA) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    st->codec->codec_type = CODEC_TYPE_SUBTITLE; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    st->codec->codec_id   = CODEC_ID_DVB_SUBTITLE; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                language[0] = get8(&p, desc_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                language[1] = get8(&p, desc_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                language[2] = get8(&p, desc_end); | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -674,16 +687,21 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                get8(&p, desc_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                comp_page = get16(&p, desc_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                anc_page = get16(&p, desc_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                st->codec->sub_id = (anc_page << 16) | comp_page; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                av_metadata_set(&st->metadata, "language", language); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            case 0x0a: /* ISO 639 language descriptor */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                language[0] = get8(&p, desc_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                language[1] = get8(&p, desc_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                language[2] = get8(&p, desc_end); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                language[3] = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                av_metadata_set(&st->metadata, "language", language); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            case 0x05: /* registration descriptor */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                reg_desc = bytestream_get_le32(&p); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if (st->codec->codec_id == CODEC_ID_PROBE && | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    stream_type == STREAM_TYPE_PRIVATE_DATA) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    mpegts_find_stream_type(st, reg_desc, REGD_types); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            default: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                break; | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -691,32 +709,6 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            p = desc_end; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        p = desc_list_end; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dprintf(ts->stream, "stream_type=%x pid=0x%x\n", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			               stream_type, pid); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /* now create ffmpeg stream */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pes= ts->pids[pid]->u.pes_filter.opaque; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            st= pes->st; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pes = add_pes_stream(ts, pid, pcr_pid, stream_type); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (pes) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                st = new_pes_av_stream(pes, 0, prog_reg_desc, reg_desc); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        add_pid_to_pmt(ts, h->id, pid); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(st) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            av_program_add_stream_index(ts->stream, h->id, st->index); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (language[0] != 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                av_metadata_set(&st->metadata, "language", language); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (stream_type == 0x100) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                st->codec->sub_id = (anc_page << 16) | comp_page; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    /* all parameters are there */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ts->stop_parse++; | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |