+
+int64_t ff_lsb2full(StreamContext *stream, int64_t lsb){
+ int64_t mask = (1<<stream->msb_pts_shift)-1;
+ int64_t delta= stream->last_pts - mask/2;
+ return ((lsb - delta)&mask) + delta;
+}
+
+int ff_nut_sp_pos_cmp(Syncpoint *a, Syncpoint *b){
+ return ((a->pos - b->pos) >> 32) - ((b->pos - a->pos) >> 32);
+}
+
+int ff_nut_sp_pts_cmp(Syncpoint *a, Syncpoint *b){
+ return ((a->ts - b->ts) >> 32) - ((b->ts - a->ts) >> 32);
+}
+
+void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts){
+ Syncpoint *sp= av_mallocz(sizeof(Syncpoint));
+ struct AVTreeNode *node= av_mallocz(av_tree_node_size);
+
+ sp->pos= pos;
+ sp->back_ptr= back_ptr;
+ sp->ts= ts;
+ av_tree_insert(&nut->syncpoints, sp, ff_nut_sp_pos_cmp, &node);
+ if(node){
+ av_free(sp);
+ av_free(node);
+ }
+}
+
+static void enu_free(void *opaque, void *elem)
+{
+ av_free(elem);
+}
+
+void ff_nut_free_sp(NUTContext *nut)
+{
+ av_tree_enumerate(nut->syncpoints, NULL, NULL, enu_free);
+ av_tree_destroy(nut->syncpoints);
+}
+
+const Dispositions ff_nut_dispositions[] = {
+ {"default" , AV_DISPOSITION_DEFAULT},
+ {"dub" , AV_DISPOSITION_DUB},
+ {"original" , AV_DISPOSITION_ORIGINAL},
+ {"comment" , AV_DISPOSITION_COMMENT},
+ {"lyrics" , AV_DISPOSITION_LYRICS},
+ {"karaoke" , AV_DISPOSITION_KARAOKE},
+ {"" , 0}
+};
+
+const AVMetadataConv ff_nut_metadata_conv[] = {
+ { "Author", "artist" },
+ { "X-CreationTime", "date" },
+ { "CreationTime", "date" },
+ { "SourceFilename", "filename" },
+ { "X-Language", "language" },
+ { "X-Disposition", "disposition" },
+ { "X-Replaces", "replaces" },
+ { "X-Depends", "depends" },
+ { "X-Uses", "uses" },
+ { "X-UsesFont", "usesfont" },
+ { 0 },
+};