Lines Matching refs:nut

2  * nut muxer
34 #include "nut.h"
130 NUTContext *nut = s->priv_data;
135 for (i = 1; i < nut->header_count; i++) {
136 if (len == nut->header_len[i] && !memcmp(out, nut->header[i], len)) {
146 NUTContext *nut = s->priv_data;
159 nut->header_count = 7;
160 for (i = 1; i < nut->header_count; i++) {
161 nut->header_len[i] = headers[i - 1][0];
162 nut->header[i] = &headers[i - 1][1];
168 NUTContext *nut = s->priv_data;
176 ft = &nut->frame_code[start];
184 FrameCode *ft = &nut->frame_code[start];
204 AVRational f = av_div_q(av_inv_q(s->streams[stream_id]->avg_frame_rate), *nut->stream[stream_id].time_base);
213 FrameCode *ft = &nut->frame_code[start2];
239 FrameCode *ft = &nut->frame_code[start2];
250 FrameCode *ft = &nut->frame_code[start2];
283 FrameCode *ft = &nut->frame_code[index];
296 memmove(&nut->frame_code['N' + 1], &nut->frame_code['N'], sizeof(FrameCode) * (255 - 'N'));
297 nut->frame_code[0].flags =
298 nut->frame_code[255].flags =
299 nut->frame_code['N'].flags = FLAG_INVALID;
328 static void put_tt(NUTContext *nut, AVRational *time_base, AVIOContext *bc, uint64_t val)
330 val *= nut->time_base_count;
331 val += time_base - nut->time_base;
350 static void put_packet(NUTContext *nut, AVIOContext *bc, AVIOContext *dyn_bc,
371 static void write_mainheader(NUTContext *nut, AVIOContext *bc)
377 put_v(bc, nut->version);
378 if (nut->version > 3)
379 put_v(bc, nut->minor_version = 1);
380 put_v(bc, nut->avf->nb_streams);
381 put_v(bc, nut->max_distance);
382 put_v(bc, nut->time_base_count);
384 for (i = 0; i < nut->time_base_count; i++) {
385 put_v(bc, nut->time_base[i].num);
386 put_v(bc, nut->time_base[i].den);
398 if (tmp_pts != nut->frame_code[i].pts_delta ) tmp_fields = 1;
399 if (tmp_mul != nut->frame_code[i].size_mul ) tmp_fields = 2;
400 if (tmp_stream != nut->frame_code[i].stream_id ) tmp_fields = 3;
401 if (tmp_size != nut->frame_code[i].size_lsb ) tmp_fields = 4;
402 // if (tmp_res != nut->frame_code[i].res ) tmp_fields=5;
403 if (tmp_head_idx != nut->frame_code[i].header_idx) tmp_fields = 8;
405 tmp_pts = nut->frame_code[i].pts_delta;
406 tmp_flags = nut->frame_code[i].flags;
407 tmp_stream = nut->frame_code[i].stream_id;
408 tmp_mul = nut->frame_code[i].size_mul;
409 tmp_size = nut->frame_code[i].size_lsb;
410 // tmp_res = nut->frame_code[i].res;
411 tmp_head_idx = nut->frame_code[i].header_idx;
418 if (nut->frame_code[i].pts_delta != tmp_pts ||
419 nut->frame_code[i].flags != tmp_flags ||
420 nut->frame_code[i].stream_id != tmp_stream ||
421 nut->frame_code[i].size_mul != tmp_mul ||
422 nut->frame_code[i].size_lsb != tmp_size + j ||
423 // nut->frame_code[i].res != tmp_res ||
424 nut->frame_code[i].header_idx != tmp_head_idx)
441 put_v(bc, nut->header_count - 1);
442 for (i = 1; i < nut->header_count; i++) {
443 put_v(bc, nut->header_len[i]);
444 avio_write(bc, nut->header[i], nut->header_len[i]);
447 if (nut->version > 3)
448 put_v(bc, nut->flags);
454 NUTContext *nut = avctx->priv_data;
473 put_v(bc, nut->stream[i].time_base - nut->time_base);
474 put_v(bc, nut->stream[i].msb_pts_shift);
475 put_v(bc, nut->stream[i].max_pts_distance);
516 static int write_globalinfo(NUTContext *nut, AVIOContext *bc)
518 AVFormatContext *s = nut->avf;
544 static int write_streaminfo(NUTContext *nut, AVIOContext *bc, int stream_id) {
545 AVFormatContext *s= nut->avf;
586 static int write_chapter(NUTContext *nut, AVIOContext *bc, int id)
591 AVChapter *ch = nut->avf->chapters[id];
600 put_tt(nut, nut->chapter[id].time_base, bc, ch->start); // chapter_start
614 static int write_index(NUTContext *nut, AVIOContext *bc) {
621 put_tt(nut, nut->max_pts_tb, bc, nut->max_pts);
623 put_v(bc, nut->sp_count);
625 for (i=0; i<nut->sp_count; i++) {
626 av_tree_find(nut->syncpoints, &dummy, ff_nut_sp_pos_cmp, (void**)next_node);
631 for (i=0; i<nut->avf->nb_streams; i++) {
632 StreamContext *nus= &nut->stream[i];
635 for (j=0; j<nut->sp_count; j++) {
640 av_log(nut->avf, AV_LOG_WARNING, "Multiple keyframes with same PTS\n");
644 flag = (nus->keyframe_pts[j] != AV_NOPTS_VALUE) ^ (j+1 == nut->sp_count);
645 for (; j<nut->sp_count && (nus->keyframe_pts[j] != AV_NOPTS_VALUE) == flag; j++)
649 for (k= j - n; k<=j && k<nut->sp_count; k++) {
668 NUTContext *nut = avctx->priv_data;
677 write_mainheader(nut, dyn_bc);
678 put_packet(nut, bc, dyn_bc, MAIN_STARTCODE);
680 for (i = 0; i < nut->avf->nb_streams; i++) {
681 ret = write_streamheader(avctx, dyn_bc, nut->avf->streams[i], i);
685 put_packet(nut, bc, dyn_bc, STREAM_STARTCODE);
688 write_globalinfo(nut, dyn_bc);
689 put_packet(nut, bc, dyn_bc, INFO_STARTCODE);
691 for (i = 0; i < nut->avf->nb_streams; i++) {
692 ret = write_streaminfo(nut, dyn_bc, i);
694 put_packet(nut, bc, dyn_bc, INFO_STARTCODE);
700 for (i = 0; i < nut->avf->nb_chapters; i++) {
701 ret = write_chapter(nut, dyn_bc, i);
705 put_packet(nut, bc, dyn_bc, INFO_STARTCODE);
708 nut->last_syncpoint_pos = INT_MIN;
709 nut->header_count++;
720 NUTContext *nut = s->priv_data;
724 nut->avf = s;
726 nut->version = FFMAX(NUT_STABLE_VERSION, 3 + !!nut->flags);
727 if (nut->version > 3 && s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
732 nut->version);
736 nut->stream = av_calloc(s->nb_streams, sizeof(*nut->stream ));
737 nut->chapter = av_calloc(s->nb_chapters, sizeof(*nut->chapter));
738 nut->time_base= av_calloc(s->nb_streams +
739 s->nb_chapters, sizeof(*nut->time_base));
740 if (!nut->stream || !nut->chapter || !nut->time_base)
757 for (j = 0; j < nut->time_base_count; j++)
758 if (!memcmp(&time_base, &nut->time_base[j], sizeof(AVRational))) {
761 nut->time_base[j] = time_base;
762 nut->stream[i].time_base = &nut->time_base[j];
763 if (j == nut->time_base_count)
764 nut->time_base_count++;
767 nut->stream[i].msb_pts_shift = 7;
769 nut->stream[i].msb_pts_shift = 14;
770 nut->stream[i].max_pts_distance =
777 for (j = 0; j < nut->time_base_count; j++)
778 if (!memcmp(&ch->time_base, &nut->time_base[j], sizeof(AVRational)))
781 nut->time_base[j] = ch->time_base;
782 nut->chapter[i].time_base = &nut->time_base[j];
783 if (j == nut->time_base_count)
784 nut->time_base_count++;
787 nut->max_distance = MAX_DISTANCE;
790 av_assert0(nut->frame_code['N'].flags == FLAG_INVALID);
804 static int get_needed_flags(NUTContext *nut, StreamContext *nus, FrameCode *fc,
817 if (pkt->side_data_elems && nut->version > 3)
819 if (pkt->size > 2 * nut->max_distance)
824 if (pkt->size < nut->header_len[fc->header_idx] ||
826 memcmp(pkt->data, nut->header [fc->header_idx],
827 nut->header_len[fc->header_idx]))
833 static int find_best_header_idx(NUTContext *nut, AVPacket *pkt)
842 for (i = 1; i < nut->header_count; i++)
843 if (pkt->size >= nut->header_len[i]
844 && nut->header_len[i] > best_len
845 && !memcmp(pkt->data, nut->header[i], nut->header_len[i])) {
847 best_len = nut->header_len[i];
979 NUTContext *nut = s->priv_data;
980 StreamContext *nus = &nut->stream[pkt->stream_index];
1002 if (pkt->side_data_elems && nut->version > 3) {
1015 if (1LL << (20 + 3 * nut->header_count) <= avio_tell(bc))
1021 if (data_size + 30 /*FIXME check*/ + avio_tell(bc) >= nut->last_syncpoint_pos + nut->max_distance)
1027 (!(nut->flags & NUT_PIPE) || nut->last_syncpoint_pos == INT_MIN)) {
1030 ff_nut_reset_ts(nut, *nus->time_base, pkt->dts);
1035 nus->time_base->num * (int64_t)nut->stream[i].time_base->den,
1036 nus->time_base->den * (int64_t)nut->stream[i].time_base->num,
1042 if (!nut->write_index && 2*index > sti->nb_index_entries) {
1051 nut->last_syncpoint_pos = avio_tell(bc);
1055 put_tt(nut, nus->time_base, dyn_bc, pkt->dts);
1056 put_v(dyn_bc, sp_pos != INT64_MAX ? (nut->last_syncpoint_pos - sp_pos) >> 4 : 0);
1058 if (nut->flags & NUT_BROADCAST) {
1059 put_tt(nut, nus->time_base, dyn_bc,
1062 put_packet(nut, bc, dyn_bc, SYNCPOINT_STARTCODE);
1065 if (nut->write_index) {
1066 if ((ret = ff_nut_add_sp(nut, nut->last_syncpoint_pos, 0 /*unused*/, pkt->dts)) < 0)
1069 if ((1ll<<60) % nut->sp_count == 0)
1072 StreamContext *nus = &nut->stream[i];
1073 av_reallocp_array(&nus->keyframe_pts, 2*nut->sp_count, sizeof(*nus->keyframe_pts));
1078 for (j=nut->sp_count == 1 ? 0 : nut->sp_count; j<2*nut->sp_count; j++)
1089 best_header_idx = find_best_header_idx(nut, pkt);
1095 FrameCode *fc = &nut->frame_code[i];
1100 needed_flags = get_needed_flags(nut, nus, fc, pkt);
1128 && nut->header_len[best_header_idx] > nut->header_len[fc->header_idx] + 1) {
1133 length += 1 - nut->header_len[best_header_idx];
1135 length -= nut->header_len[fc->header_idx];
1149 fc = &nut->frame_code[frame_code];
1151 needed_flags = get_needed_flags(nut, nus, fc, pkt);
1171 avio_write(bc, pkt->data + nut->header_len[header_idx], pkt->size - nut->header_len[header_idx]);
1177 if (flags & FLAG_KEY && !(nut->flags & NUT_PIPE)) {
1180 nut->last_syncpoint_pos,
1185 if (nus->keyframe_pts && nus->keyframe_pts[nut->sp_count] == AV_NOPTS_VALUE)
1186 nus->keyframe_pts[nut->sp_count] = pkt->pts;
1189 if (!nut->max_pts_tb || av_compare_ts(nut->max_pts, *nut->max_pts_tb, pkt->pts, *nus->time_base) < 0) {
1190 nut->max_pts = pkt->pts;
1191 nut->max_pts_tb = nus->time_base;
1202 NUTContext *nut = s->priv_data;
1206 while (nut->header_count < 3)
1209 if (!nut->sp_count)
1214 av_assert1(nut->write_index); // sp_count should be 0 if no index is going to be written
1215 write_index(nut, dyn_bc);
1216 put_packet(nut, bc, dyn_bc, INDEX_STARTCODE);
1225 NUTContext *nut = s->priv_data;
1228 ff_nut_free_sp(nut);
1229 if (nut->stream)
1231 av_freep(&nut->stream[i].keyframe_pts);
1233 av_freep(&nut->stream);
1234 av_freep(&nut->chapter);
1235 av_freep(&nut->time_base);
1257 .name = "nut",
1259 .mime_type = "video/x-nut",
1260 .extensions = "nut",