Lines Matching refs:nut
34 #include "nut.h"
90 static int get_packetheader(NUTContext *nut, AVIOContext *bc,
193 static int decode_main_header(NUTContext *nut)
195 AVFormatContext *s = nut->avf;
202 length = get_packetheader(nut, bc, 1, MAIN_STARTCODE);
207 nut->version = ffio_read_varlen(bc);
208 if (nut->version < NUT_MIN_VERSION ||
209 nut->version > NUT_MAX_VERSION) {
211 nut->version);
214 if (nut->version > 3)
215 nut->minor_version = ffio_read_varlen(bc);
219 nut->max_distance = ffio_read_varlen(bc);
220 if (nut->max_distance > 65536) {
221 av_log(s, AV_LOG_DEBUG, "max_distance %d\n", nut->max_distance);
222 nut->max_distance = 65536;
225 GET_V(nut->time_base_count, tmp > 0 && tmp < INT_MAX / sizeof(AVRational) && tmp < length/2);
226 nut->time_base = av_malloc_array(nut->time_base_count, sizeof(AVRational));
227 if (!nut->time_base)
230 for (i = 0; i < nut->time_base_count; i++) {
231 GET_V(nut->time_base[i].num, tmp > 0 && tmp < (1ULL << 31));
232 GET_V(nut->time_base[i].den, tmp > 0 && tmp < (1ULL << 31));
233 if (av_gcd(nut->time_base[i].num, nut->time_base[i].den) != 1) {
235 nut->time_base[i].num,
236 nut->time_base[i].den);
305 nut->frame_code[i].flags = FLAG_INVALID;
309 nut->frame_code[i].flags = tmp_flags;
310 nut->frame_code[i].pts_delta = tmp_pts;
311 nut->frame_code[i].stream_id = tmp_stream;
312 nut->frame_code[i].size_mul = tmp_mul;
313 nut->frame_code[i].size_lsb = tmp_size + j;
314 nut->frame_code[i].reserved_count = tmp_res;
315 nut->frame_code[i].header_idx = tmp_head_idx;
318 av_assert0(nut->frame_code['N'].flags == FLAG_INVALID);
322 GET_V(nut->header_count, tmp < 128U);
323 nut->header_count++;
324 for (i = 1; i < nut->header_count; i++) {
326 GET_V(nut->header_len[i], tmp > 0 && tmp < 256);
327 if (rem < nut->header_len[i]) {
330 i, nut->header_len[i], rem);
334 rem -= nut->header_len[i];
335 hdr = av_malloc(nut->header_len[i]);
340 avio_read(bc, hdr, nut->header_len[i]);
341 nut->header[i] = hdr;
343 av_assert0(nut->header_len[0] == 0);
347 if (nut->version > 3 && end > avio_tell(bc) + 4) {
348 nut->flags = ffio_read_varlen(bc);
357 nut->stream = av_calloc(stream_count, sizeof(StreamContext));
358 if (!nut->stream) {
371 av_freep(&nut->time_base);
372 for (i = 1; i < nut->header_count; i++) {
373 av_freep(&nut->header[i]);
375 nut->header_count = 0;
379 static int decode_stream_header(NUTContext *nut)
381 AVFormatContext *s = nut->avf;
388 end = get_packetheader(nut, bc, 1, STREAM_STARTCODE);
391 GET_V(stream_id, tmp < s->nb_streams && !nut->stream[tmp].time_base);
392 stc = &nut->stream[stream_id];
438 GET_V(stc->time_base_id, tmp < nut->time_base_count);
476 stc->time_base = &nut->time_base[stc->time_base_id];
503 static int decode_info_header(NUTContext *nut)
505 AVFormatContext *s = nut->avf;
519 end = get_packetheader(nut, bc, 1, INFO_STARTCODE);
529 int64_t start = chapter_start / nut->time_base_count;
531 nut->time_base[chapter_start %
532 nut->time_base_count],
626 static int decode_syncpoint(NUTContext *nut, int64_t *ts, int64_t *back_ptr)
628 AVFormatContext *s = nut->avf;
634 nut->last_syncpoint_pos = avio_tell(bc) - 8;
636 end = get_packetheader(nut, bc, 1, SYNCPOINT_STARTCODE);
640 *back_ptr = nut->last_syncpoint_pos - 16 * ffio_read_varlen(bc);
644 ff_nut_reset_ts(nut, nut->time_base[tmp % nut->time_base_count],
645 tmp / nut->time_base_count);
647 if (nut->flags & NUT_BROADCAST) {
650 av_rescale_q(tmp / nut->time_base_count,
651 nut->time_base[tmp % nut->time_base_count],
660 *ts = tmp / nut->time_base_count *
661 av_q2d(nut->time_base[tmp % nut->time_base_count]) * AV_TIME_BASE;
663 if ((ret = ff_nut_add_sp(nut, nut->last_syncpoint_pos, *back_ptr, *ts)) < 0)
670 static int64_t find_duration(NUTContext *nut, int64_t filesize)
672 AVFormatContext *s = nut->avf;
682 static int find_and_decode_index(NUTContext *nut)
684 AVFormatContext *s = nut->avf;
703 s->duration = find_duration(nut, filesize);
707 end = get_packetheader(nut, bc, 1, INDEX_STARTCODE);
711 s->duration = av_rescale_q(max_pts / nut->time_base_count,
712 nut->time_base[max_pts % nut->time_base_count],
798 NUTContext *nut = s->priv_data;
801 av_freep(&nut->time_base);
802 av_freep(&nut->stream);
803 ff_nut_free_sp(nut);
804 for (i = 1; i < nut->header_count; i++)
805 av_freep(&nut->header[i]);
812 NUTContext *nut = s->priv_data;
817 nut->avf = s;
831 } while ((ret = decode_main_header(nut)) < 0);
841 if (decode_stream_header(nut) >= 0)
855 nut->next_startcode = startcode;
861 decode_info_header(nut);
868 find_and_decode_index(nut);
871 av_assert0(nut->next_startcode == SYNCPOINT_STARTCODE);
1005 static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id,
1008 AVFormatContext *s = nut->avf;
1014 if (!(nut->flags & NUT_PIPE) &&
1015 avio_tell(bc) > nut->last_syncpoint_pos + nut->max_distance) {
1018 avio_tell(bc), nut->last_syncpoint_pos, nut->max_distance);
1022 flags = nut->frame_code[frame_code].flags;
1023 size_mul = nut->frame_code[frame_code].size_mul;
1024 size = nut->frame_code[frame_code].size_lsb;
1025 *stream_id = nut->frame_code[frame_code].stream_id;
1026 pts_delta = nut->frame_code[frame_code].pts_delta;
1027 reserved_count = nut->frame_code[frame_code].reserved_count;
1028 *header_idx = nut->frame_code[frame_code].header_idx;
1037 stc = &nut->stream[*stream_id];
1063 if (*header_idx >= (unsigned)nut->header_count) {
1069 size -= nut->header_len[*header_idx];
1073 } else if (!(nut->flags & NUT_PIPE) &&
1074 size > 2 * nut->max_distance ||
1088 static int decode_frame(NUTContext *nut, AVPacket *pkt, int frame_code)
1090 AVFormatContext *s = nut->avf;
1097 size = decode_frame_header(nut, &pts, &stream_id, &header_idx, frame_code);
1101 stc = &nut->stream[stream_id];
1117 ret = av_new_packet(pkt, size + nut->header_len[header_idx]);
1120 if (nut->header[header_idx])
1121 memcpy(pkt->data, nut->header[header_idx], nut->header_len[header_idx]);
1138 ret = avio_read(bc, pkt->data + nut->header_len[header_idx], size);
1143 av_shrink_packet(pkt, nut->header_len[header_idx] + ret);
1158 NUTContext *nut = s->priv_data;
1165 uint64_t tmp = nut->next_startcode;
1166 nut->next_startcode = 0;
1184 skip = get_packetheader(nut, bc, 0, tmp);
1188 if (decode_info_header(nut) < 0)
1192 if (decode_syncpoint(nut, &ts, &back_ptr) < 0)
1196 ret = decode_frame(nut, pkt, frame_code);
1204 tmp = find_any_startcode(bc, FFMAX(nut->last_syncpoint_pos, nut->last_resync_pos) + 1);
1205 nut->last_resync_pos = avio_tell(bc);
1209 nut->next_startcode = tmp;
1217 NUTContext *nut = s->priv_data;
1230 } while (decode_syncpoint(nut, &pts, &back_ptr) < 0);
1232 av_assert0(nut->last_syncpoint_pos == *pos_arg);
1244 NUTContext *nut = s->priv_data;
1253 if (nut->flags & NUT_PIPE) {
1267 av_tree_find(nut->syncpoints, &dummy, ff_nut_sp_pts_cmp,
1282 av_tree_find(nut->syncpoints, &dummy, ff_nut_sp_pos_cmp,
1293 sp = av_tree_find(nut->syncpoints, &dummy, ff_nut_sp_pos_cmp,
1302 nut->last_syncpoint_pos = pos;
1307 nut->stream[i].skip_until_key_frame = 1;
1309 nut->last_resync_pos = 0;
1315 .name = "nut",
1325 .extensions = "nut",