* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+
+#include "libavutil/crc.h"
#include "avformat.h"
-#include "crc.h"
#include "mpegts.h"
//#define DEBUG_SI
int section_index;
int section_h_size;
uint8_t *section_buf;
- int check_crc:1;
- int end_of_section_reached:1;
+ unsigned int check_crc:1;
+ unsigned int end_of_section_reached:1;
SectionCallback *section_cb;
void *opaque;
} MpegTSSectionFilter;
AVFormatContext *stream;
/** raw packet size, including FEC if present */
int raw_packet_size;
+
+ int pos47;
+
/** if true, all pids are analyzed to find streams */
int auto_guess;
}
}
- return (!used && discarded);
+ return !used && discarded;
}
/**
pid = filter->pid;
if (filter->type == MPEGTS_SECTION)
av_freep(&filter->u.section_filter.section_buf);
- else if (filter->type == MPEGTS_PES)
- av_freep(&filter->u.pes_filter.opaque);
av_free(filter);
ts->pids[pid] = NULL;
memset(stat, 0, packet_size*sizeof(int));
- for(x=i=0; i<size; i++){
- if(buf[i] == 0x47){
+ for(x=i=0; i<size-3; i++){
+ if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && (buf[i+3] & 0x30)){
stat[x]++;
if(stat[x] > best_score){
best_score= stat[x];
if(program)
av_set_program_name(program, provider_name, name);
}
+ av_free(name);
+ av_free(provider_name);
break;
default:
break;
codec_id = CODEC_ID_AC3;
} else {
codec_type = CODEC_TYPE_VIDEO;
- codec_id = CODEC_ID_MPEG1VIDEO;
+ codec_id = CODEC_ID_PROBE;
}
break;
}
if (p >= p_end)
return;
+ ts->pos47= url_ftell(ts->stream->pb) % ts->raw_packet_size;
+
if (tss->type == MPEGTS_SECTION) {
if (is_start) {
/* pointer field present */
{
MpegTSContext *ts = s->priv_data;
int i;
+
+ clear_programs(ts);
+
for(i=0;i<NB_PID_MAX;i++)
if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]);
uint8_t buf[TS_PACKET_SIZE];
int pcr_l, pcr_pid = ((PESContext*)s->streams[stream_index]->priv_data)->pcr_pid;
const int find_next= 1;
- pos = ((*ppos + ts->raw_packet_size - 1) / ts->raw_packet_size) * ts->raw_packet_size;
+ pos = ((*ppos + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
if (find_next) {
for(;;) {
url_fseek(s->pb, pos, SEEK_SET);
AVInputFormat mpegts_demuxer = {
"mpegts",
- "MPEG2 transport stream format",
+ NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"),
sizeof(MpegTSContext),
mpegts_probe,
mpegts_read_header,
AVInputFormat mpegtsraw_demuxer = {
"mpegtsraw",
- "MPEG2 raw transport stream format",
+ NULL_IF_CONFIG_SMALL("MPEG-2 raw transport stream format"),
sizeof(MpegTSContext),
NULL,
mpegts_read_header,