static uint64_t get_bits64(GetBitContext *gb, int bits)
{
uint64_t ret = 0;
+
+ if (get_bits_left(gb) < bits)
+ return AV_NOPTS_VALUE;
while (bits > 17) {
ret <<= 17;
ret |= get_bits(gb, 17);
int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
int dts_flag = -1, cts_flag = -1;
int64_t dts = AV_NOPTS_VALUE, cts = AV_NOPTS_VALUE;
+
init_get_bits(&gb, buf, buf_size*8);
if (sl->use_au_start)
/* we got the full header. We parse it and get the payload */
pes->state = MPEGTS_PAYLOAD;
pes->data_index = 0;
- if (pes->stream_type == 0x12) {
+ if (pes->stream_type == 0x12 && buf_size > 0) {
int sl_header_bytes = read_sl_header(pes, &pes->sl, p, buf_size);
pes->pes_header_size += sl_header_bytes;
p += sl_header_bytes;
descr->sl.au_seq_num_len = (lengths >> 7) & 0x1f;
descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
} else {
- av_log_missing_feature(d->s, "Predefined SLConfigDescriptor\n", 0);
+ av_log_missing_feature(d->s, "Predefined SLConfigDescriptor", 0);
}
return 0;
}
case 0x05: /* registration descriptor */
st->codec->codec_tag = bytestream_get_le32(pp);
av_dlog(fc, "reg_desc=%.4s\n", (char*)&st->codec->codec_tag);
- if (st->codec->codec_id == CODEC_ID_NONE &&
- stream_type == STREAM_TYPE_PRIVATE_DATA)
+ if (st->codec->codec_id == CODEC_ID_NONE)
mpegts_find_stream_type(st, st->codec->codec_tag, REGD_types);
break;
case 0x52: /* stream identifier descriptor */
return;
clear_program(ts, h->id);
- pcr_pid = get16(&p, p_end) & 0x1fff;
+ pcr_pid = get16(&p, p_end);
if (pcr_pid < 0)
return;
+ pcr_pid &= 0x1fff;
add_pid_to_pmt(ts, h->id, pcr_pid);
set_pcr_pid(ts->stream, h->id, pcr_pid);
av_dlog(ts->stream, "pcr_pid=0x%x\n", pcr_pid);
- program_info_length = get16(&p, p_end) & 0xfff;
+ program_info_length = get16(&p, p_end);
if (program_info_length < 0)
return;
+ program_info_length &= 0xfff;
while(program_info_length >= 2) {
uint8_t tag, len;
tag = get8(&p, p_end);
stream_type = get8(&p, p_end);
if (stream_type < 0)
break;
- pid = get16(&p, p_end) & 0x1fff;
+ pid = get16(&p, p_end);
if (pid < 0)
break;
+ pid &= 0x1fff;
/* now create stream */
if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
ff_program_add_stream_index(ts->stream, h->id, st->index);
- desc_list_len = get16(&p, p_end) & 0xfff;
+ desc_list_len = get16(&p, p_end);
if (desc_list_len < 0)
break;
+ desc_list_len &= 0xfff;
desc_list_end = p + desc_list_len;
if (desc_list_end > p_end)
break;
sid = get16(&p, p_end);
if (sid < 0)
break;
- pmt_pid = get16(&p, p_end) & 0x1fff;
+ pmt_pid = get16(&p, p_end);
if (pmt_pid < 0)
break;
+ pmt_pid &= 0x1fff;
av_dlog(ts->stream, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
val = get8(&p, p_end);
if (val < 0)
break;
- desc_list_len = get16(&p, p_end) & 0xfff;
+ desc_list_len = get16(&p, p_end);
if (desc_list_len < 0)
break;
+ desc_list_len &= 0xfff;
desc_list_end = p + desc_list_len;
if (desc_list_end > p_end)
break;
static int handle_packets(MpegTSContext *ts, int nb_packets)
{
AVFormatContext *s = ts->stream;
- uint8_t packet[TS_PACKET_SIZE];
+ uint8_t packet[TS_PACKET_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
int packet_num, ret = 0;
if (avio_tell(s->pb) != ts->last_pos) {
ts->stop_parse = 0;
packet_num = 0;
+ memset(packet + TS_PACKET_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
for(;;) {
packet_num++;
if (nb_packets != 0 && packet_num >= nb_packets ||