00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "libavutil/mathematics.h"
00023 #include "libavutil/tree.h"
00024 #include "nut.h"
00025 #include "riff.h"
00026 #include "internal.h"
00027
00028 const AVCodecTag ff_nut_subtitle_tags[] = {
00029 { AV_CODEC_ID_TEXT , MKTAG('U', 'T', 'F', '8') },
00030 { AV_CODEC_ID_SSA , MKTAG('S', 'S', 'A', 0 ) },
00031 { AV_CODEC_ID_DVD_SUBTITLE, MKTAG('D', 'V', 'D', 'S') },
00032 { AV_CODEC_ID_DVB_SUBTITLE, MKTAG('D', 'V', 'B', 'S') },
00033 { AV_CODEC_ID_DVB_TELETEXT, MKTAG('D', 'V', 'B', 'T') },
00034 { AV_CODEC_ID_NONE , 0 }
00035 };
00036
00037 const AVCodecTag ff_nut_data_tags[] = {
00038 { AV_CODEC_ID_TEXT , MKTAG('U', 'T', 'F', '8') },
00039 { AV_CODEC_ID_NONE , 0 }
00040 };
00041
00042 const AVCodecTag ff_nut_video_tags[] = {
00043 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 15 ) },
00044 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 15 ) },
00045 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 16 ) },
00046 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 16 ) },
00047 { AV_CODEC_ID_RAWVIDEO, MKTAG(15 , 'B', 'G', 'R') },
00048 { AV_CODEC_ID_RAWVIDEO, MKTAG(15 , 'R', 'G', 'B') },
00049 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 'B', 'G', 'R') },
00050 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 'R', 'G', 'B') },
00051 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 12 ) },
00052 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 12 ) },
00053 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 'B', 'G', 'R') },
00054 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 'R', 'G', 'B') },
00055 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 'A') },
00056 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 0 ) },
00057 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 'A') },
00058 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 0 ) },
00059 { AV_CODEC_ID_RAWVIDEO, MKTAG('A', 'B', 'G', 'R') },
00060 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 'B', 'G', 'R') },
00061 { AV_CODEC_ID_RAWVIDEO, MKTAG('A', 'R', 'G', 'B') },
00062 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 'R', 'G', 'B') },
00063 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 24 ) },
00064 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 24 ) },
00065 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '1', '1', 'P') },
00066 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '2', '2', 'P') },
00067 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '2', '2', 'P') },
00068 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '4', '0', 'P') },
00069 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '4', '0', 'P') },
00070 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '4', '4', 'P') },
00071 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '4', '4', 'P') },
00072 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', '1', 'W', '0') },
00073 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', '0', 'W', '1') },
00074 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 8 ) },
00075 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 8 ) },
00076 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 4 ) },
00077 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 4 ) },
00078 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', '4', 'B', 'Y') },
00079 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', '4', 'B', 'Y') },
00080 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 48 ) },
00081 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 48 ) },
00082 { AV_CODEC_ID_RAWVIDEO, MKTAG(48 , 'B', 'G', 'R') },
00083 { AV_CODEC_ID_RAWVIDEO, MKTAG(48 , 'R', 'G', 'B') },
00084 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'R', 'A', 64 ) },
00085 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'B', 'A', 64 ) },
00086 { AV_CODEC_ID_RAWVIDEO, MKTAG(64 , 'B', 'R', 'A') },
00087 { AV_CODEC_ID_RAWVIDEO, MKTAG(64 , 'R', 'B', 'A') },
00088 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 10 ) },
00089 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 11 , '3', 'Y') },
00090 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 10 ) },
00091 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 10 , '3', 'Y') },
00092 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 10 ) },
00093 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 0 , '3', 'Y') },
00094 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 12 ) },
00095 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 11 , '3', 'Y') },
00096 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 12 ) },
00097 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 10 , '3', 'Y') },
00098 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 12 ) },
00099 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 0 , '3', 'Y') },
00100 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 14 ) },
00101 { AV_CODEC_ID_RAWVIDEO, MKTAG(14 , 11 , '3', 'Y') },
00102 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 14 ) },
00103 { AV_CODEC_ID_RAWVIDEO, MKTAG(14 , 10 , '3', 'Y') },
00104 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 14 ) },
00105 { AV_CODEC_ID_RAWVIDEO, MKTAG(14 , 0 , '3', 'Y') },
00106 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 16 ) },
00107 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '1', 'Y') },
00108 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 16 ) },
00109 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 11 , '3', 'Y') },
00110 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 16 ) },
00111 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 10 , '3', 'Y') },
00112 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 16 ) },
00113 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '3', 'Y') },
00114 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 11 , 8 ) },
00115 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 10 , 8 ) },
00116 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 0 , 8 ) },
00117 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '2', 0 , 8 ) },
00118
00119 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 9 ) },
00120 { AV_CODEC_ID_RAWVIDEO, MKTAG( 9 , 0 , '1', 'Y') },
00121 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 11 , 9 ) },
00122 { AV_CODEC_ID_RAWVIDEO, MKTAG( 9 , 11 , '4', 'Y') },
00123 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 10 , 9 ) },
00124 { AV_CODEC_ID_RAWVIDEO, MKTAG( 9 , 10 , '4', 'Y') },
00125 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 0 , 9 ) },
00126 { AV_CODEC_ID_RAWVIDEO, MKTAG( 9 , 0 , '4', 'Y') },
00127
00128 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 10 ) },
00129 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 0 , '1', 'Y') },
00130 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 11 , 10 ) },
00131 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 11 , '4', 'Y') },
00132 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 10 , 10 ) },
00133 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 10 , '4', 'Y') },
00134 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 0 , 10 ) },
00135 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 0 , '4', 'Y') },
00136
00137 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 16 ) },
00138 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '1', 'Y') },
00139 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 11 , 16 ) },
00140 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 11 , '4', 'Y') },
00141 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 10 , 16 ) },
00142 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 10 , '4', 'Y') },
00143 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 0 , 16 ) },
00144 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '4', 'Y') },
00145
00146 { AV_CODEC_ID_NONE , 0 }
00147 };
00148
00149 static const AVCodecTag nut_audio_extra_tags[] = {
00150 { AV_CODEC_ID_PCM_ALAW, MKTAG('A', 'L', 'A', 'W') },
00151 { AV_CODEC_ID_PCM_MULAW, MKTAG('U', 'L', 'A', 'W') },
00152 { AV_CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') },
00153 { AV_CODEC_ID_NONE, 0 }
00154 };
00155
00156 const AVCodecTag ff_nut_audio_tags[] = {
00157 { AV_CODEC_ID_PCM_F32BE, MKTAG(32 , 'D', 'F', 'P') },
00158 { AV_CODEC_ID_PCM_F32LE, MKTAG('P', 'F', 'D', 32 ) },
00159 { AV_CODEC_ID_PCM_F64BE, MKTAG(64 , 'D', 'F', 'P') },
00160 { AV_CODEC_ID_PCM_F64LE, MKTAG('P', 'F', 'D', 64 ) },
00161 { AV_CODEC_ID_PCM_S16BE, MKTAG(16 , 'D', 'S', 'P') },
00162 { AV_CODEC_ID_PCM_S16LE, MKTAG('P', 'S', 'D', 16 ) },
00163 { AV_CODEC_ID_PCM_S24BE, MKTAG(24 , 'D', 'S', 'P') },
00164 { AV_CODEC_ID_PCM_S24LE, MKTAG('P', 'S', 'D', 24 ) },
00165 { AV_CODEC_ID_PCM_S32BE, MKTAG(32 , 'D', 'S', 'P') },
00166 { AV_CODEC_ID_PCM_S32LE, MKTAG('P', 'S', 'D', 32 ) },
00167 { AV_CODEC_ID_PCM_S8, MKTAG('P', 'S', 'D', 8 ) },
00168 { AV_CODEC_ID_PCM_U16BE, MKTAG(16 , 'D', 'U', 'P') },
00169 { AV_CODEC_ID_PCM_U16LE, MKTAG('P', 'U', 'D', 16 ) },
00170 { AV_CODEC_ID_PCM_U24BE, MKTAG(24 , 'D', 'U', 'P') },
00171 { AV_CODEC_ID_PCM_U24LE, MKTAG('P', 'U', 'D', 24 ) },
00172 { AV_CODEC_ID_PCM_U32BE, MKTAG(32 , 'D', 'U', 'P') },
00173 { AV_CODEC_ID_PCM_U32LE, MKTAG('P', 'U', 'D', 32 ) },
00174 { AV_CODEC_ID_PCM_U8, MKTAG('P', 'U', 'D', 8 ) },
00175 { AV_CODEC_ID_PCM_S8_PLANAR, MKTAG('P', 'S', 'P', 8 ) },
00176 { AV_CODEC_ID_PCM_S16BE_PLANAR, MKTAG(16 , 'P', 'S', 'P') },
00177 { AV_CODEC_ID_PCM_S16LE_PLANAR, MKTAG('P', 'S', 'P', 16 ) },
00178 { AV_CODEC_ID_PCM_S24LE_PLANAR, MKTAG('P', 'S', 'P', 24 ) },
00179 { AV_CODEC_ID_PCM_S32LE_PLANAR, MKTAG('P', 'S', 'P', 32 ) },
00180 { AV_CODEC_ID_NONE, 0 }
00181 };
00182
00183 const AVCodecTag * const ff_nut_codec_tags[] = {
00184 ff_nut_video_tags, ff_nut_audio_tags, ff_nut_subtitle_tags,
00185 ff_codec_bmp_tags, ff_codec_wav_tags, nut_audio_extra_tags, ff_nut_data_tags, 0
00186 };
00187
00188 void ff_nut_reset_ts(NUTContext *nut, AVRational time_base, int64_t val){
00189 int i;
00190 for(i=0; i<nut->avf->nb_streams; i++){
00191 nut->stream[i].last_pts= av_rescale_rnd(
00192 val,
00193 time_base.num * (int64_t)nut->stream[i].time_base->den,
00194 time_base.den * (int64_t)nut->stream[i].time_base->num,
00195 AV_ROUND_DOWN);
00196 }
00197 }
00198
00199 int64_t ff_lsb2full(StreamContext *stream, int64_t lsb){
00200 int64_t mask = (1ULL<<stream->msb_pts_shift)-1;
00201 int64_t delta= stream->last_pts - mask/2;
00202 return ((lsb - delta)&mask) + delta;
00203 }
00204
00205 int ff_nut_sp_pos_cmp(const Syncpoint *a, const Syncpoint *b){
00206 return ((a->pos - b->pos) >> 32) - ((b->pos - a->pos) >> 32);
00207 }
00208
00209 int ff_nut_sp_pts_cmp(const Syncpoint *a, const Syncpoint *b){
00210 return ((a->ts - b->ts) >> 32) - ((b->ts - a->ts) >> 32);
00211 }
00212
00213 void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts){
00214 Syncpoint *sp= av_mallocz(sizeof(Syncpoint));
00215 struct AVTreeNode *node = av_tree_node_alloc();
00216
00217 nut->sp_count++;
00218
00219 sp->pos= pos;
00220 sp->back_ptr= back_ptr;
00221 sp->ts= ts;
00222 av_tree_insert(&nut->syncpoints, sp, (void *) ff_nut_sp_pos_cmp, &node);
00223 if(node){
00224 av_free(sp);
00225 av_free(node);
00226 }
00227 }
00228
00229 static int enu_free(void *opaque, void *elem)
00230 {
00231 av_free(elem);
00232 return 0;
00233 }
00234
00235 void ff_nut_free_sp(NUTContext *nut)
00236 {
00237 av_tree_enumerate(nut->syncpoints, NULL, NULL, enu_free);
00238 av_tree_destroy(nut->syncpoints);
00239 }
00240
00241 const Dispositions ff_nut_dispositions[] = {
00242 {"default" , AV_DISPOSITION_DEFAULT},
00243 {"dub" , AV_DISPOSITION_DUB},
00244 {"original" , AV_DISPOSITION_ORIGINAL},
00245 {"comment" , AV_DISPOSITION_COMMENT},
00246 {"lyrics" , AV_DISPOSITION_LYRICS},
00247 {"karaoke" , AV_DISPOSITION_KARAOKE},
00248 {"" , 0}
00249 };
00250
00251 const AVMetadataConv ff_nut_metadata_conv[] = {
00252 { "Author", "artist" },
00253 { "X-CreationTime", "date" },
00254 { "CreationTime", "date" },
00255 { "SourceFilename", "filename" },
00256 { "X-Language", "language" },
00257 { "X-Disposition", "disposition" },
00258 { "X-Replaces", "replaces" },
00259 { "X-Depends", "depends" },
00260 { "X-Uses", "uses" },
00261 { "X-UsesFont", "usesfont" },
00262 { 0 },
00263 };