-
- if(flags & FLAG_INVALID)
- return -1;
- if(flags & FLAG_CODED)
- flags ^= get_v(bc);
- if(flags & FLAG_STREAM_ID){
- GET_V(*stream_id, tmp < s->nb_streams)
- }
- stc= &nut->stream[*stream_id];
- if(flags&FLAG_CODED_PTS){
- int coded_pts= get_v(bc);
-//FIXME check last_pts validity?
- if(coded_pts < (1<<stc->msb_pts_shift)){
- *pts=ff_lsb2full(stc, coded_pts);
- }else
- *pts=coded_pts - (1<<stc->msb_pts_shift);
- }else
- *pts= stc->last_pts + pts_delta;
- if(flags&FLAG_SIZE_MSB){
- size += size_mul*get_v(bc);
- }
- if(flags&FLAG_RESERVED)
- reserved_count= get_v(bc);
- for(i=0; i<reserved_count; i++)
- get_v(bc);
- if(flags&FLAG_CHECKSUM){
- get_be32(bc); //FIXME check this
- }else if(size > 2*nut->max_distance || FFABS(stc->last_pts - *pts) > stc->max_pts_distance){
+ *header_idx = nut->frame_code[frame_code].header_idx;
+
+ if (flags & FLAG_INVALID)
+ return AVERROR_INVALIDDATA;
+ if (flags & FLAG_CODED)
+ flags ^= ffio_read_varlen(bc);
+ if (flags & FLAG_STREAM_ID) {
+ GET_V(*stream_id, tmp < s->nb_streams);
+ }
+ stc = &nut->stream[*stream_id];
+ if (flags & FLAG_CODED_PTS) {
+ int coded_pts = ffio_read_varlen(bc);
+ // FIXME check last_pts validity?
+ if (coded_pts < (1 << stc->msb_pts_shift)) {
+ *pts = ff_lsb2full(stc, coded_pts);
+ } else
+ *pts = coded_pts - (1 << stc->msb_pts_shift);
+ } else
+ *pts = stc->last_pts + pts_delta;
+ if (flags & FLAG_SIZE_MSB)
+ size += size_mul * ffio_read_varlen(bc);
+ if (flags & FLAG_MATCH_TIME)
+ get_s(bc);
+ if (flags & FLAG_HEADER_IDX)
+ *header_idx = ffio_read_varlen(bc);
+ if (flags & FLAG_RESERVED)
+ reserved_count = ffio_read_varlen(bc);
+ for (i = 0; i < reserved_count; i++)
+ ffio_read_varlen(bc);
+
+ if (*header_idx >= (unsigned)nut->header_count) {
+ av_log(s, AV_LOG_ERROR, "header_idx invalid\n");
+ return AVERROR_INVALIDDATA;
+ }
+ if (size > 4096)
+ *header_idx = 0;
+ size -= nut->header_len[*header_idx];
+
+ if (flags & FLAG_CHECKSUM) {
+ avio_rb32(bc); // FIXME check this
+ } else if (size > 2 * nut->max_distance || FFABS(stc->last_pts - *pts) >
+ stc->max_pts_distance) {