annotate ffmpeg/libavformat/nut.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * nut
yading@11 3 * Copyright (c) 2004-2007 Michael Niedermayer
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 #include "libavutil/mathematics.h"
yading@11 23 #include "libavutil/tree.h"
yading@11 24 #include "nut.h"
yading@11 25 #include "riff.h"
yading@11 26 #include "internal.h"
yading@11 27
yading@11 28 const AVCodecTag ff_nut_subtitle_tags[] = {
yading@11 29 { AV_CODEC_ID_TEXT , MKTAG('U', 'T', 'F', '8') },
yading@11 30 { AV_CODEC_ID_SSA , MKTAG('S', 'S', 'A', 0 ) },
yading@11 31 { AV_CODEC_ID_DVD_SUBTITLE, MKTAG('D', 'V', 'D', 'S') },
yading@11 32 { AV_CODEC_ID_DVB_SUBTITLE, MKTAG('D', 'V', 'B', 'S') },
yading@11 33 { AV_CODEC_ID_DVB_TELETEXT, MKTAG('D', 'V', 'B', 'T') },
yading@11 34 { AV_CODEC_ID_NONE , 0 }
yading@11 35 };
yading@11 36
yading@11 37 const AVCodecTag ff_nut_data_tags[] = {
yading@11 38 { AV_CODEC_ID_TEXT , MKTAG('U', 'T', 'F', '8') },
yading@11 39 { AV_CODEC_ID_NONE , 0 }
yading@11 40 };
yading@11 41
yading@11 42 const AVCodecTag ff_nut_video_tags[] = {
yading@11 43 { AV_CODEC_ID_VP9, MKTAG('V', 'P', '9', '0') },
yading@11 44 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 15 ) },
yading@11 45 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 15 ) },
yading@11 46 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 16 ) },
yading@11 47 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 16 ) },
yading@11 48 { AV_CODEC_ID_RAWVIDEO, MKTAG(15 , 'B', 'G', 'R') },
yading@11 49 { AV_CODEC_ID_RAWVIDEO, MKTAG(15 , 'R', 'G', 'B') },
yading@11 50 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 'B', 'G', 'R') },
yading@11 51 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 'R', 'G', 'B') },
yading@11 52 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 12 ) },
yading@11 53 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 12 ) },
yading@11 54 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 'B', 'G', 'R') },
yading@11 55 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 'R', 'G', 'B') },
yading@11 56 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 'A') },
yading@11 57 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 0 ) },
yading@11 58 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 'A') },
yading@11 59 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 0 ) },
yading@11 60 { AV_CODEC_ID_RAWVIDEO, MKTAG('A', 'B', 'G', 'R') },
yading@11 61 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 'B', 'G', 'R') },
yading@11 62 { AV_CODEC_ID_RAWVIDEO, MKTAG('A', 'R', 'G', 'B') },
yading@11 63 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 'R', 'G', 'B') },
yading@11 64 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 24 ) },
yading@11 65 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 24 ) },
yading@11 66 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '1', '1', 'P') },
yading@11 67 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '2', '2', 'P') },
yading@11 68 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '2', '2', 'P') },
yading@11 69 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '4', '0', 'P') },
yading@11 70 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '4', '0', 'P') },
yading@11 71 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '4', '4', 'P') },
yading@11 72 { AV_CODEC_ID_RAWVIDEO, MKTAG('4', '4', '4', 'P') },
yading@11 73 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', '1', 'W', '0') },
yading@11 74 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', '0', 'W', '1') },
yading@11 75 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 8 ) },
yading@11 76 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 8 ) },
yading@11 77 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 4 ) },
yading@11 78 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 4 ) },
yading@11 79 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', '4', 'B', 'Y') },
yading@11 80 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', '4', 'B', 'Y') },
yading@11 81 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 48 ) },
yading@11 82 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 48 ) },
yading@11 83 { AV_CODEC_ID_RAWVIDEO, MKTAG(48 , 'B', 'G', 'R') },
yading@11 84 { AV_CODEC_ID_RAWVIDEO, MKTAG(48 , 'R', 'G', 'B') },
yading@11 85 { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'R', 'A', 64 ) },
yading@11 86 { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'B', 'A', 64 ) },
yading@11 87 { AV_CODEC_ID_RAWVIDEO, MKTAG(64 , 'B', 'R', 'A') },
yading@11 88 { AV_CODEC_ID_RAWVIDEO, MKTAG(64 , 'R', 'B', 'A') },
yading@11 89 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 10 ) },
yading@11 90 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 11 , '3', 'Y') },
yading@11 91 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 10 ) },
yading@11 92 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 10 , '3', 'Y') },
yading@11 93 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 10 ) },
yading@11 94 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 0 , '3', 'Y') },
yading@11 95 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 12 ) },
yading@11 96 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 11 , '3', 'Y') },
yading@11 97 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 12 ) },
yading@11 98 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 10 , '3', 'Y') },
yading@11 99 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 12 ) },
yading@11 100 { AV_CODEC_ID_RAWVIDEO, MKTAG(12 , 0 , '3', 'Y') },
yading@11 101 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 14 ) },
yading@11 102 { AV_CODEC_ID_RAWVIDEO, MKTAG(14 , 11 , '3', 'Y') },
yading@11 103 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 14 ) },
yading@11 104 { AV_CODEC_ID_RAWVIDEO, MKTAG(14 , 10 , '3', 'Y') },
yading@11 105 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 14 ) },
yading@11 106 { AV_CODEC_ID_RAWVIDEO, MKTAG(14 , 0 , '3', 'Y') },
yading@11 107 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 16 ) },
yading@11 108 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '1', 'Y') },
yading@11 109 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 11 , 16 ) },
yading@11 110 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 11 , '3', 'Y') },
yading@11 111 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 10 , 16 ) },
yading@11 112 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 10 , '3', 'Y') },
yading@11 113 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '3', 0 , 16 ) },
yading@11 114 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '3', 'Y') },
yading@11 115 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 11 , 8 ) },
yading@11 116 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 10 , 8 ) },
yading@11 117 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 0 , 8 ) },
yading@11 118 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '2', 0 , 8 ) },
yading@11 119
yading@11 120 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 9 ) },
yading@11 121 { AV_CODEC_ID_RAWVIDEO, MKTAG( 9 , 0 , '1', 'Y') },
yading@11 122 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 11 , 9 ) },
yading@11 123 { AV_CODEC_ID_RAWVIDEO, MKTAG( 9 , 11 , '4', 'Y') },
yading@11 124 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 10 , 9 ) },
yading@11 125 { AV_CODEC_ID_RAWVIDEO, MKTAG( 9 , 10 , '4', 'Y') },
yading@11 126 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 0 , 9 ) },
yading@11 127 { AV_CODEC_ID_RAWVIDEO, MKTAG( 9 , 0 , '4', 'Y') },
yading@11 128
yading@11 129 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 10 ) },
yading@11 130 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 0 , '1', 'Y') },
yading@11 131 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 11 , 10 ) },
yading@11 132 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 11 , '4', 'Y') },
yading@11 133 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 10 , 10 ) },
yading@11 134 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 10 , '4', 'Y') },
yading@11 135 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 0 , 10 ) },
yading@11 136 { AV_CODEC_ID_RAWVIDEO, MKTAG(10 , 0 , '4', 'Y') },
yading@11 137
yading@11 138 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '1', 0 , 16 ) },
yading@11 139 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '1', 'Y') },
yading@11 140 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 11 , 16 ) },
yading@11 141 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 11 , '4', 'Y') },
yading@11 142 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 10 , 16 ) },
yading@11 143 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 10 , '4', 'Y') },
yading@11 144 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', 0 , 16 ) },
yading@11 145 { AV_CODEC_ID_RAWVIDEO, MKTAG(16 , 0 , '4', 'Y') },
yading@11 146
yading@11 147 { AV_CODEC_ID_NONE , 0 }
yading@11 148 };
yading@11 149
yading@11 150 static const AVCodecTag nut_audio_extra_tags[] = {
yading@11 151 { AV_CODEC_ID_PCM_ALAW, MKTAG('A', 'L', 'A', 'W') },
yading@11 152 { AV_CODEC_ID_PCM_MULAW, MKTAG('U', 'L', 'A', 'W') },
yading@11 153 { AV_CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') },
yading@11 154 { AV_CODEC_ID_NONE, 0 }
yading@11 155 };
yading@11 156
yading@11 157 const AVCodecTag ff_nut_audio_tags[] = {
yading@11 158 { AV_CODEC_ID_PCM_F32BE, MKTAG(32 , 'D', 'F', 'P') },
yading@11 159 { AV_CODEC_ID_PCM_F32LE, MKTAG('P', 'F', 'D', 32 ) },
yading@11 160 { AV_CODEC_ID_PCM_F64BE, MKTAG(64 , 'D', 'F', 'P') },
yading@11 161 { AV_CODEC_ID_PCM_F64LE, MKTAG('P', 'F', 'D', 64 ) },
yading@11 162 { AV_CODEC_ID_PCM_S16BE, MKTAG(16 , 'D', 'S', 'P') },
yading@11 163 { AV_CODEC_ID_PCM_S16LE, MKTAG('P', 'S', 'D', 16 ) },
yading@11 164 { AV_CODEC_ID_PCM_S24BE, MKTAG(24 , 'D', 'S', 'P') },
yading@11 165 { AV_CODEC_ID_PCM_S24LE, MKTAG('P', 'S', 'D', 24 ) },
yading@11 166 { AV_CODEC_ID_PCM_S32BE, MKTAG(32 , 'D', 'S', 'P') },
yading@11 167 { AV_CODEC_ID_PCM_S32LE, MKTAG('P', 'S', 'D', 32 ) },
yading@11 168 { AV_CODEC_ID_PCM_S8, MKTAG('P', 'S', 'D', 8 ) },
yading@11 169 { AV_CODEC_ID_PCM_U16BE, MKTAG(16 , 'D', 'U', 'P') },
yading@11 170 { AV_CODEC_ID_PCM_U16LE, MKTAG('P', 'U', 'D', 16 ) },
yading@11 171 { AV_CODEC_ID_PCM_U24BE, MKTAG(24 , 'D', 'U', 'P') },
yading@11 172 { AV_CODEC_ID_PCM_U24LE, MKTAG('P', 'U', 'D', 24 ) },
yading@11 173 { AV_CODEC_ID_PCM_U32BE, MKTAG(32 , 'D', 'U', 'P') },
yading@11 174 { AV_CODEC_ID_PCM_U32LE, MKTAG('P', 'U', 'D', 32 ) },
yading@11 175 { AV_CODEC_ID_PCM_U8, MKTAG('P', 'U', 'D', 8 ) },
yading@11 176 { AV_CODEC_ID_PCM_S8_PLANAR, MKTAG('P', 'S', 'P', 8 ) },
yading@11 177 { AV_CODEC_ID_PCM_S16BE_PLANAR, MKTAG(16 , 'P', 'S', 'P') },
yading@11 178 { AV_CODEC_ID_PCM_S16LE_PLANAR, MKTAG('P', 'S', 'P', 16 ) },
yading@11 179 { AV_CODEC_ID_PCM_S24LE_PLANAR, MKTAG('P', 'S', 'P', 24 ) },
yading@11 180 { AV_CODEC_ID_PCM_S32LE_PLANAR, MKTAG('P', 'S', 'P', 32 ) },
yading@11 181 { AV_CODEC_ID_NONE, 0 }
yading@11 182 };
yading@11 183
yading@11 184 const AVCodecTag * const ff_nut_codec_tags[] = {
yading@11 185 ff_nut_video_tags, ff_nut_audio_tags, ff_nut_subtitle_tags,
yading@11 186 ff_codec_bmp_tags, ff_codec_wav_tags, nut_audio_extra_tags, ff_nut_data_tags, 0
yading@11 187 };
yading@11 188
yading@11 189 void ff_nut_reset_ts(NUTContext *nut, AVRational time_base, int64_t val){
yading@11 190 int i;
yading@11 191 for(i=0; i<nut->avf->nb_streams; i++){
yading@11 192 nut->stream[i].last_pts= av_rescale_rnd(
yading@11 193 val,
yading@11 194 time_base.num * (int64_t)nut->stream[i].time_base->den,
yading@11 195 time_base.den * (int64_t)nut->stream[i].time_base->num,
yading@11 196 AV_ROUND_DOWN);
yading@11 197 }
yading@11 198 }
yading@11 199
yading@11 200 int64_t ff_lsb2full(StreamContext *stream, int64_t lsb){
yading@11 201 int64_t mask = (1ULL<<stream->msb_pts_shift)-1;
yading@11 202 int64_t delta= stream->last_pts - mask/2;
yading@11 203 return ((lsb - delta)&mask) + delta;
yading@11 204 }
yading@11 205
yading@11 206 int ff_nut_sp_pos_cmp(const Syncpoint *a, const Syncpoint *b){
yading@11 207 return ((a->pos - b->pos) >> 32) - ((b->pos - a->pos) >> 32);
yading@11 208 }
yading@11 209
yading@11 210 int ff_nut_sp_pts_cmp(const Syncpoint *a, const Syncpoint *b){
yading@11 211 return ((a->ts - b->ts) >> 32) - ((b->ts - a->ts) >> 32);
yading@11 212 }
yading@11 213
yading@11 214 void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts){
yading@11 215 Syncpoint *sp= av_mallocz(sizeof(Syncpoint));
yading@11 216 struct AVTreeNode *node = av_tree_node_alloc();
yading@11 217
yading@11 218 nut->sp_count++;
yading@11 219
yading@11 220 sp->pos= pos;
yading@11 221 sp->back_ptr= back_ptr;
yading@11 222 sp->ts= ts;
yading@11 223 av_tree_insert(&nut->syncpoints, sp, (void *) ff_nut_sp_pos_cmp, &node);
yading@11 224 if(node){
yading@11 225 av_free(sp);
yading@11 226 av_free(node);
yading@11 227 }
yading@11 228 }
yading@11 229
yading@11 230 static int enu_free(void *opaque, void *elem)
yading@11 231 {
yading@11 232 av_free(elem);
yading@11 233 return 0;
yading@11 234 }
yading@11 235
yading@11 236 void ff_nut_free_sp(NUTContext *nut)
yading@11 237 {
yading@11 238 av_tree_enumerate(nut->syncpoints, NULL, NULL, enu_free);
yading@11 239 av_tree_destroy(nut->syncpoints);
yading@11 240 }
yading@11 241
yading@11 242 const Dispositions ff_nut_dispositions[] = {
yading@11 243 {"default" , AV_DISPOSITION_DEFAULT},
yading@11 244 {"dub" , AV_DISPOSITION_DUB},
yading@11 245 {"original" , AV_DISPOSITION_ORIGINAL},
yading@11 246 {"comment" , AV_DISPOSITION_COMMENT},
yading@11 247 {"lyrics" , AV_DISPOSITION_LYRICS},
yading@11 248 {"karaoke" , AV_DISPOSITION_KARAOKE},
yading@11 249 {"" , 0}
yading@11 250 };
yading@11 251
yading@11 252 const AVMetadataConv ff_nut_metadata_conv[] = {
yading@11 253 { "Author", "artist" },
yading@11 254 { "X-CreationTime", "date" },
yading@11 255 { "CreationTime", "date" },
yading@11 256 { "SourceFilename", "filename" },
yading@11 257 { "X-Language", "language" },
yading@11 258 { "X-Disposition", "disposition" },
yading@11 259 { "X-Replaces", "replaces" },
yading@11 260 { "X-Depends", "depends" },
yading@11 261 { "X-Uses", "uses" },
yading@11 262 { "X-UsesFont", "usesfont" },
yading@11 263 { 0 },
yading@11 264 };