]> git.sesse.net Git - ffmpeg/blob - libavformat/nutenc.c
vp9: fix memory corruption if header decoding fails after size change.
[ffmpeg] / libavformat / nutenc.c
1 /*
2  * nut muxer
3  * Copyright (c) 2004-2007 Michael Niedermayer
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #include <stdint.h>
23
24 #include "libavutil/intreadwrite.h"
25 #include "libavutil/mathematics.h"
26 #include "libavutil/tree.h"
27 #include "libavutil/dict.h"
28 #include "libavutil/avassert.h"
29 #include "libavcodec/bytestream.h"
30 #include "libavcodec/mpegaudiodata.h"
31 #include "nut.h"
32 #include "internal.h"
33 #include "avio_internal.h"
34 #include "riff.h"
35
36 static int find_expected_header(AVCodecContext *c, int size, int key_frame,
37                                 uint8_t out[64])
38 {
39     int sample_rate = c->sample_rate;
40
41     if (size > 4096)
42         return 0;
43
44     AV_WB24(out, 1);
45
46     if (c->codec_id == AV_CODEC_ID_MPEG4) {
47         if (key_frame) {
48             return 3;
49         } else {
50             out[3] = 0xB6;
51             return 4;
52         }
53     } else if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
54                c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
55         return 3;
56     } else if (c->codec_id == AV_CODEC_ID_H264) {
57         return 3;
58     } else if (c->codec_id == AV_CODEC_ID_MP3 ||
59                c->codec_id == AV_CODEC_ID_MP2) {
60         int lsf, mpeg25, sample_rate_index, bitrate_index, frame_size;
61         int layer           = c->codec_id == AV_CODEC_ID_MP3 ? 3 : 2;
62         unsigned int header = 0xFFF00000;
63
64         lsf           = sample_rate < (24000 + 32000) / 2;
65         mpeg25        = sample_rate < (12000 + 16000) / 2;
66         sample_rate <<= lsf + mpeg25;
67         if      (sample_rate < (32000 + 44100) / 2) sample_rate_index = 2;
68         else if (sample_rate < (44100 + 48000) / 2) sample_rate_index = 0;
69         else                                        sample_rate_index = 1;
70
71         sample_rate = avpriv_mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25);
72
73         for (bitrate_index = 2; bitrate_index < 30; bitrate_index++) {
74             frame_size =
75                 avpriv_mpa_bitrate_tab[lsf][layer - 1][bitrate_index >> 1];
76             frame_size = (frame_size * 144000) / (sample_rate << lsf) +
77                 (bitrate_index & 1);
78
79             if (frame_size == size)
80                 break;
81         }
82
83         header |= (!lsf) << 19;
84         header |= (4 - layer) << 17;
85         header |= 1 << 16; //no crc
86         AV_WB32(out, header);
87         if (size <= 0)
88             return 2;  //we guess there is no crc, if there is one the user clearly does not care about overhead
89         if (bitrate_index == 30)
90             return -1;  //something is wrong ...
91
92         header |= (bitrate_index >> 1) << 12;
93         header |= sample_rate_index << 10;
94         header |= (bitrate_index & 1) << 9;
95
96         return 2; //FIXME actually put the needed ones in build_elision_headers()
97         //return 3; //we guess that the private bit is not set
98 //FIXME the above assumptions should be checked, if these turn out false too often something should be done
99     }
100     return 0;
101 }
102
103 static int find_header_idx(AVFormatContext *s, AVCodecContext *c, int size, int frame_type)
104 {
105     NUTContext *nut = s->priv_data;
106     uint8_t out[64];
107     int i;
108     int len = find_expected_header(c, size, frame_type, out);
109
110     for (i = 1; i < nut->header_count; i++) {
111         if (len == nut->header_len[i] && !memcmp(out, nut->header[i], len)) {
112             return i;
113         }
114     }
115
116     return 0;
117 }
118
119 static void build_elision_headers(AVFormatContext *s)
120 {
121     NUTContext *nut = s->priv_data;
122     int i;
123     //FIXME this is lame
124     //FIXME write a 2pass mode to find the maximal headers
125     static const uint8_t headers[][5] = {
126         { 3, 0x00, 0x00, 0x01 },
127         { 4, 0x00, 0x00, 0x01, 0xB6},
128         { 2, 0xFF, 0xFA }, //mp3+crc
129         { 2, 0xFF, 0xFB }, //mp3
130         { 2, 0xFF, 0xFC }, //mp2+crc
131         { 2, 0xFF, 0xFD }, //mp2
132     };
133
134     nut->header_count = 7;
135     for (i = 1; i < nut->header_count; i++) {
136         nut->header_len[i] = headers[i - 1][0];
137         nut->header[i]     = &headers[i - 1][1];
138     }
139 }
140
141 static void build_frame_code(AVFormatContext *s)
142 {
143     NUTContext *nut = s->priv_data;
144     int key_frame, index, pred, stream_id;
145     int start = 1;
146     int end   = 254;
147     int keyframe_0_esc = s->nb_streams > 2;
148     int pred_table[10];
149     FrameCode *ft;
150
151     ft            = &nut->frame_code[start];
152     ft->flags     = FLAG_CODED;
153     ft->size_mul  = 1;
154     ft->pts_delta = 1;
155     start++;
156
157     if (keyframe_0_esc) {
158         /* keyframe = 0 escape */
159         FrameCode *ft = &nut->frame_code[start];
160         ft->flags    = FLAG_STREAM_ID | FLAG_SIZE_MSB | FLAG_CODED_PTS;
161         ft->size_mul = 1;
162         start++;
163     }
164
165     for (stream_id = 0; stream_id < s->nb_streams; stream_id++) {
166         int start2 = start + (end - start) * stream_id       / s->nb_streams;
167         int end2   = start + (end - start) * (stream_id + 1) / s->nb_streams;
168         AVCodecContext *codec = s->streams[stream_id]->codec;
169         int is_audio          = codec->codec_type == AVMEDIA_TYPE_AUDIO;
170         int intra_only        = /*codec->intra_only || */ is_audio;
171         int pred_count;
172         int frame_size = 0;
173
174         if (codec->codec_type == AVMEDIA_TYPE_AUDIO) {
175             frame_size = av_get_audio_frame_duration(codec, 0);
176             if (codec->codec_id == AV_CODEC_ID_VORBIS && !frame_size)
177                 frame_size = 64;
178         } else {
179             AVRational f = av_div_q(codec->time_base, *nut->stream[stream_id].time_base);
180             if (f.den == 1 && f.num>0)
181                 frame_size = f.num;
182         }
183         if (!frame_size)
184             frame_size = 1;
185
186         for (key_frame = 0; key_frame < 2; key_frame++) {
187             if (!intra_only || !keyframe_0_esc || key_frame != 0) {
188                 FrameCode *ft = &nut->frame_code[start2];
189                 ft->flags     = FLAG_KEY * key_frame;
190                 ft->flags    |= FLAG_SIZE_MSB | FLAG_CODED_PTS;
191                 ft->stream_id = stream_id;
192                 ft->size_mul  = 1;
193                 if (is_audio)
194                     ft->header_idx = find_header_idx(s, codec, -1, key_frame);
195                 start2++;
196             }
197         }
198
199         key_frame = intra_only;
200 #if 1
201         if (is_audio) {
202             int frame_bytes = codec->frame_size * (int64_t)codec->bit_rate /
203                               (8 * codec->sample_rate);
204             int pts;
205             for (pts = 0; pts < 2; pts++) {
206                 for (pred = 0; pred < 2; pred++) {
207                     FrameCode *ft  = &nut->frame_code[start2];
208                     ft->flags      = FLAG_KEY * key_frame;
209                     ft->stream_id  = stream_id;
210                     ft->size_mul   = frame_bytes + 2;
211                     ft->size_lsb   = frame_bytes + pred;
212                     ft->pts_delta  = pts * frame_size;
213                     ft->header_idx = find_header_idx(s, codec, frame_bytes + pred, key_frame);
214                     start2++;
215                 }
216             }
217         } else {
218             FrameCode *ft = &nut->frame_code[start2];
219             ft->flags     = FLAG_KEY | FLAG_SIZE_MSB;
220             ft->stream_id = stream_id;
221             ft->size_mul  = 1;
222             ft->pts_delta = frame_size;
223             start2++;
224         }
225 #endif
226
227         if (codec->has_b_frames) {
228             pred_count    = 5;
229             pred_table[0] = -2;
230             pred_table[1] = -1;
231             pred_table[2] = 1;
232             pred_table[3] = 3;
233             pred_table[4] = 4;
234         } else if (codec->codec_id == AV_CODEC_ID_VORBIS) {
235             pred_count    = 3;
236             pred_table[0] = 2;
237             pred_table[1] = 9;
238             pred_table[2] = 16;
239         } else {
240             pred_count    = 1;
241             pred_table[0] = 1;
242         }
243
244         for (pred = 0; pred < pred_count; pred++) {
245             int start3 = start2 + (end2 - start2) * pred / pred_count;
246             int end3   = start2 + (end2 - start2) * (pred + 1) / pred_count;
247
248             pred_table[pred] *= frame_size;
249
250             for (index = start3; index < end3; index++) {
251                 FrameCode *ft = &nut->frame_code[index];
252                 ft->flags     = FLAG_KEY * key_frame;
253                 ft->flags    |= FLAG_SIZE_MSB;
254                 ft->stream_id = stream_id;
255 //FIXME use single byte size and pred from last
256                 ft->size_mul  = end3 - start3;
257                 ft->size_lsb  = index - start3;
258                 ft->pts_delta = pred_table[pred];
259                 if (is_audio)
260                     ft->header_idx = find_header_idx(s, codec, -1, key_frame);
261             }
262         }
263     }
264     memmove(&nut->frame_code['N' + 1], &nut->frame_code['N'], sizeof(FrameCode) * (255 - 'N'));
265     nut->frame_code[0].flags       =
266         nut->frame_code[255].flags =
267         nut->frame_code['N'].flags = FLAG_INVALID;
268 }
269
270 static void put_tt(NUTContext *nut, AVRational *time_base, AVIOContext *bc, uint64_t val)
271 {
272     val *= nut->time_base_count;
273     val += time_base - nut->time_base;
274     ff_put_v(bc, val);
275 }
276 /**
277  * Store a string as vb.
278  */
279 static void put_str(AVIOContext *bc, const char *string)
280 {
281     int len = strlen(string);
282
283     ff_put_v(bc, len);
284     avio_write(bc, string, len);
285 }
286
287 static void put_s(AVIOContext *bc, int64_t val)
288 {
289     ff_put_v(bc, 2 * FFABS(val) - (val > 0));
290 }
291
292 #ifdef TRACE
293 static inline void ff_put_v_trace(AVIOContext *bc, uint64_t v, const char *file,
294                                   const char *func, int line)
295 {
296     av_log(NULL, AV_LOG_DEBUG, "ff_put_v %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
297
298     ff_put_v(bc, v);
299 }
300
301 static inline void put_s_trace(AVIOContext *bc, int64_t v, const char *file, const char *func, int line)
302 {
303     av_log(NULL, AV_LOG_DEBUG, "put_s %5"PRId64" / %"PRIX64" in %s %s:%d\n", v, v, file, func, line);
304
305     put_s(bc, v);
306 }
307 #define ff_put_v(bc, v)  ff_put_v_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__)
308 #define put_s(bc, v)  put_s_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__)
309 #endif
310
311 //FIXME remove calculate_checksum
312 static void put_packet(NUTContext *nut, AVIOContext *bc, AVIOContext *dyn_bc,
313                        int calculate_checksum, uint64_t startcode)
314 {
315     uint8_t *dyn_buf = NULL;
316     int dyn_size     = avio_close_dyn_buf(dyn_bc, &dyn_buf);
317     int forw_ptr     = dyn_size + 4 * calculate_checksum;
318
319     if (forw_ptr > 4096)
320         ffio_init_checksum(bc, ff_crc04C11DB7_update, 0);
321     avio_wb64(bc, startcode);
322     ff_put_v(bc, forw_ptr);
323     if (forw_ptr > 4096)
324         avio_wl32(bc, ffio_get_checksum(bc));
325
326     if (calculate_checksum)
327         ffio_init_checksum(bc, ff_crc04C11DB7_update, 0);
328     avio_write(bc, dyn_buf, dyn_size);
329     if (calculate_checksum)
330         avio_wl32(bc, ffio_get_checksum(bc));
331
332     av_free(dyn_buf);
333 }
334
335 static void write_mainheader(NUTContext *nut, AVIOContext *bc)
336 {
337     int i, j, tmp_pts, tmp_flags, tmp_stream, tmp_mul, tmp_size, tmp_fields,
338         tmp_head_idx;
339     int64_t tmp_match;
340
341     ff_put_v(bc, nut->version = NUT_VERSION);
342     if (nut->version > 3)
343         ff_put_v(bc, nut->minor_version);
344     ff_put_v(bc, nut->avf->nb_streams);
345     ff_put_v(bc, nut->max_distance);
346     ff_put_v(bc, nut->time_base_count);
347
348     for (i = 0; i < nut->time_base_count; i++) {
349         ff_put_v(bc, nut->time_base[i].num);
350         ff_put_v(bc, nut->time_base[i].den);
351     }
352
353     tmp_pts      = 0;
354     tmp_mul      = 1;
355     tmp_stream   = 0;
356     tmp_match    = 1 - (1LL << 62);
357     tmp_head_idx = 0;
358     for (i = 0; i < 256; ) {
359         tmp_fields = 0;
360         tmp_size   = 0;
361 //        tmp_res=0;
362         if (tmp_pts      != nut->frame_code[i].pts_delta ) tmp_fields = 1;
363         if (tmp_mul      != nut->frame_code[i].size_mul  ) tmp_fields = 2;
364         if (tmp_stream   != nut->frame_code[i].stream_id ) tmp_fields = 3;
365         if (tmp_size     != nut->frame_code[i].size_lsb  ) tmp_fields = 4;
366 //        if (tmp_res    != nut->frame_code[i].res            ) tmp_fields=5;
367         if (tmp_head_idx != nut->frame_code[i].header_idx) tmp_fields = 8;
368
369         tmp_pts    = nut->frame_code[i].pts_delta;
370         tmp_flags  = nut->frame_code[i].flags;
371         tmp_stream = nut->frame_code[i].stream_id;
372         tmp_mul    = nut->frame_code[i].size_mul;
373         tmp_size   = nut->frame_code[i].size_lsb;
374 //        tmp_res   = nut->frame_code[i].res;
375         tmp_head_idx = nut->frame_code[i].header_idx;
376
377         for (j = 0; i < 256; j++, i++) {
378             if (i == 'N') {
379                 j--;
380                 continue;
381             }
382             if (nut->frame_code[i].pts_delta  != tmp_pts      ||
383                 nut->frame_code[i].flags      != tmp_flags    ||
384                 nut->frame_code[i].stream_id  != tmp_stream   ||
385                 nut->frame_code[i].size_mul   != tmp_mul      ||
386                 nut->frame_code[i].size_lsb   != tmp_size + j ||
387 //              nut->frame_code[i].res        != tmp_res      ||
388                 nut->frame_code[i].header_idx != tmp_head_idx)
389                 break;
390         }
391         if (j != tmp_mul - tmp_size)
392             tmp_fields = 6;
393
394         ff_put_v(bc, tmp_flags);
395         ff_put_v(bc, tmp_fields);
396         if (tmp_fields > 0) put_s(bc, tmp_pts);
397         if (tmp_fields > 1) ff_put_v(bc, tmp_mul);
398         if (tmp_fields > 2) ff_put_v(bc, tmp_stream);
399         if (tmp_fields > 3) ff_put_v(bc, tmp_size);
400         if (tmp_fields > 4) ff_put_v(bc, 0 /*tmp_res*/);
401         if (tmp_fields > 5) ff_put_v(bc, j);
402         if (tmp_fields > 6) ff_put_v(bc, tmp_match);
403         if (tmp_fields > 7) ff_put_v(bc, tmp_head_idx);
404     }
405     ff_put_v(bc, nut->header_count - 1);
406     for (i = 1; i < nut->header_count; i++) {
407         ff_put_v(bc, nut->header_len[i]);
408         avio_write(bc, nut->header[i], nut->header_len[i]);
409     }
410 }
411
412 static int write_streamheader(AVFormatContext *avctx, AVIOContext *bc,
413                               AVStream *st, int i)
414 {
415     NUTContext *nut       = avctx->priv_data;
416     AVCodecContext *codec = st->codec;
417
418     ff_put_v(bc, i);
419     switch (codec->codec_type) {
420     case AVMEDIA_TYPE_VIDEO:    ff_put_v(bc, 0); break;
421     case AVMEDIA_TYPE_AUDIO:    ff_put_v(bc, 1); break;
422     case AVMEDIA_TYPE_SUBTITLE: ff_put_v(bc, 2); break;
423     default:                    ff_put_v(bc, 3); break;
424     }
425     ff_put_v(bc, 4);
426     if (codec->codec_tag) {
427         avio_wl32(bc, codec->codec_tag);
428     } else {
429         av_log(avctx, AV_LOG_ERROR, "No codec tag defined for stream %d\n", i);
430         return AVERROR(EINVAL);
431     }
432
433     ff_put_v(bc, nut->stream[i].time_base - nut->time_base);
434     ff_put_v(bc, nut->stream[i].msb_pts_shift);
435     ff_put_v(bc, nut->stream[i].max_pts_distance);
436     ff_put_v(bc, codec->has_b_frames);
437     avio_w8(bc, 0); /* flags: 0x1 - fixed_fps, 0x2 - index_present */
438
439     ff_put_v(bc, codec->extradata_size);
440     avio_write(bc, codec->extradata, codec->extradata_size);
441
442     switch (codec->codec_type) {
443     case AVMEDIA_TYPE_AUDIO:
444         ff_put_v(bc, codec->sample_rate);
445         ff_put_v(bc, 1);
446         ff_put_v(bc, codec->channels);
447         break;
448     case AVMEDIA_TYPE_VIDEO:
449         ff_put_v(bc, codec->width);
450         ff_put_v(bc, codec->height);
451
452         if (st->sample_aspect_ratio.num <= 0 ||
453             st->sample_aspect_ratio.den <= 0) {
454             ff_put_v(bc, 0);
455             ff_put_v(bc, 0);
456         } else {
457             ff_put_v(bc, st->sample_aspect_ratio.num);
458             ff_put_v(bc, st->sample_aspect_ratio.den);
459         }
460         ff_put_v(bc, 0); /* csp type -- unknown */
461         break;
462     default:
463         break;
464     }
465     return 0;
466 }
467
468 static int add_info(AVIOContext *bc, const char *type, const char *value)
469 {
470     put_str(bc, type);
471     put_s(bc, -1);
472     put_str(bc, value);
473     return 1;
474 }
475
476 static int write_globalinfo(NUTContext *nut, AVIOContext *bc)
477 {
478     AVFormatContext *s   = nut->avf;
479     AVDictionaryEntry *t = NULL;
480     AVIOContext *dyn_bc;
481     uint8_t *dyn_buf = NULL;
482     int count        = 0, dyn_size;
483     int ret          = avio_open_dyn_buf(&dyn_bc);
484     if (ret < 0)
485         return ret;
486
487     while ((t = av_dict_get(s->metadata, "", t, AV_DICT_IGNORE_SUFFIX)))
488         count += add_info(dyn_bc, t->key, t->value);
489
490     ff_put_v(bc, 0); //stream_if_plus1
491     ff_put_v(bc, 0); //chapter_id
492     ff_put_v(bc, 0); //timestamp_start
493     ff_put_v(bc, 0); //length
494
495     ff_put_v(bc, count);
496
497     dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
498     avio_write(bc, dyn_buf, dyn_size);
499     av_free(dyn_buf);
500     return 0;
501 }
502
503 static int write_streaminfo(NUTContext *nut, AVIOContext *bc, int stream_id) {
504     AVFormatContext *s= nut->avf;
505     AVStream* st = s->streams[stream_id];
506     AVDictionaryEntry *t = NULL;
507     AVIOContext *dyn_bc;
508     uint8_t *dyn_buf=NULL;
509     int count=0, dyn_size, i;
510     int ret = avio_open_dyn_buf(&dyn_bc);
511     if (ret < 0)
512         return ret;
513
514     while ((t = av_dict_get(st->metadata, "", t, AV_DICT_IGNORE_SUFFIX)))
515         count += add_info(dyn_bc, t->key, t->value);
516     for (i=0; ff_nut_dispositions[i].flag; ++i) {
517         if (st->disposition & ff_nut_dispositions[i].flag)
518             count += add_info(dyn_bc, "Disposition", ff_nut_dispositions[i].str);
519     }
520     if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
521         uint8_t buf[256];
522         snprintf(buf, sizeof(buf), "%d/%d", st->codec->time_base.den, st->codec->time_base.num);
523         count += add_info(dyn_bc, "r_frame_rate", buf);
524     }
525     dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
526
527     if (count) {
528         ff_put_v(bc, stream_id + 1); //stream_id_plus1
529         ff_put_v(bc, 0); //chapter_id
530         ff_put_v(bc, 0); //timestamp_start
531         ff_put_v(bc, 0); //length
532
533         ff_put_v(bc, count);
534
535         avio_write(bc, dyn_buf, dyn_size);
536     }
537
538     av_free(dyn_buf);
539     return count;
540 }
541
542 static int write_chapter(NUTContext *nut, AVIOContext *bc, int id)
543 {
544     AVIOContext *dyn_bc;
545     uint8_t *dyn_buf     = NULL;
546     AVDictionaryEntry *t = NULL;
547     AVChapter *ch        = nut->avf->chapters[id];
548     int ret, dyn_size, count = 0;
549
550     ret = avio_open_dyn_buf(&dyn_bc);
551     if (ret < 0)
552         return ret;
553
554     ff_put_v(bc, 0);                                        // stream_id_plus1
555     put_s(bc, id + 1);                                      // chapter_id
556     put_tt(nut, nut->chapter[id].time_base, bc, ch->start); // chapter_start
557     ff_put_v(bc, ch->end - ch->start);                      // chapter_len
558
559     while ((t = av_dict_get(ch->metadata, "", t, AV_DICT_IGNORE_SUFFIX)))
560         count += add_info(dyn_bc, t->key, t->value);
561
562     ff_put_v(bc, count);
563
564     dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
565     avio_write(bc, dyn_buf, dyn_size);
566     av_freep(&dyn_buf);
567     return 0;
568 }
569
570 static int write_index(NUTContext *nut, AVIOContext *bc) {
571     int i;
572     Syncpoint dummy= { .pos= 0 };
573     Syncpoint *next_node[2] = { NULL };
574     int64_t startpos = avio_tell(bc);
575     int64_t payload_size;
576
577     put_tt(nut, nut->max_pts_tb, bc, nut->max_pts);
578
579     ff_put_v(bc, nut->sp_count);
580
581     for (i=0; i<nut->sp_count; i++) {
582         av_tree_find(nut->syncpoints, &dummy, (void *) ff_nut_sp_pos_cmp, (void**)next_node);
583         ff_put_v(bc, (next_node[1]->pos >> 4) - (dummy.pos>>4));
584         dummy.pos = next_node[1]->pos;
585     }
586
587     for (i=0; i<nut->avf->nb_streams; i++) {
588         StreamContext *nus= &nut->stream[i];
589         int64_t last_pts= -1;
590         int j, k;
591         for (j=0; j<nut->sp_count; j++) {
592             int flag;
593             int n = 0;
594
595             if (j && nus->keyframe_pts[j] == nus->keyframe_pts[j-1]) {
596                 av_log(nut->avf, AV_LOG_WARNING, "Multiple keyframes with same PTS\n");
597                 nus->keyframe_pts[j] = AV_NOPTS_VALUE;
598             }
599
600             flag = (nus->keyframe_pts[j] != AV_NOPTS_VALUE) ^ (j+1 == nut->sp_count);
601             for (; j<nut->sp_count && (nus->keyframe_pts[j] != AV_NOPTS_VALUE) == flag; j++)
602                 n++;
603
604             ff_put_v(bc, 1 + 2*flag + 4*n);
605             for (k= j - n; k<=j && k<nut->sp_count; k++) {
606                 if (nus->keyframe_pts[k] == AV_NOPTS_VALUE)
607                     continue;
608                 av_assert0(nus->keyframe_pts[k] > last_pts);
609                 ff_put_v(bc, nus->keyframe_pts[k] - last_pts);
610                 last_pts = nus->keyframe_pts[k];
611             }
612         }
613     }
614
615     payload_size = avio_tell(bc) - startpos + 8 + 4;
616
617     avio_wb64(bc, 8 + payload_size + av_log2(payload_size) / 7 + 1 + 4*(payload_size > 4096));
618
619     return 0;
620 }
621
622 static int write_headers(AVFormatContext *avctx, AVIOContext *bc)
623 {
624     NUTContext *nut = avctx->priv_data;
625     AVIOContext *dyn_bc;
626     int i, ret;
627
628     ff_metadata_conv_ctx(avctx, ff_nut_metadata_conv, NULL);
629
630     ret = avio_open_dyn_buf(&dyn_bc);
631     if (ret < 0)
632         return ret;
633     write_mainheader(nut, dyn_bc);
634     put_packet(nut, bc, dyn_bc, 1, MAIN_STARTCODE);
635
636     for (i = 0; i < nut->avf->nb_streams; i++) {
637         ret = avio_open_dyn_buf(&dyn_bc);
638         if (ret < 0)
639             return ret;
640         ret = write_streamheader(avctx, dyn_bc, nut->avf->streams[i], i);
641         if (ret < 0)
642             return ret;
643         put_packet(nut, bc, dyn_bc, 1, STREAM_STARTCODE);
644     }
645
646     ret = avio_open_dyn_buf(&dyn_bc);
647     if (ret < 0)
648         return ret;
649     write_globalinfo(nut, dyn_bc);
650     put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
651
652     for (i = 0; i < nut->avf->nb_streams; i++) {
653         ret = avio_open_dyn_buf(&dyn_bc);
654         if (ret < 0)
655             return ret;
656         ret = write_streaminfo(nut, dyn_bc, i);
657         if (ret < 0)
658             return ret;
659         if (ret > 0)
660             put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
661         else {
662             uint8_t *buf;
663             avio_close_dyn_buf(dyn_bc, &buf);
664             av_free(buf);
665         }
666     }
667
668     for (i = 0; i < nut->avf->nb_chapters; i++) {
669         ret = avio_open_dyn_buf(&dyn_bc);
670         if (ret < 0)
671             return ret;
672         ret = write_chapter(nut, dyn_bc, i);
673         if (ret < 0) {
674             uint8_t *buf;
675             avio_close_dyn_buf(dyn_bc, &buf);
676             av_freep(&buf);
677             return ret;
678         }
679         put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
680     }
681
682     nut->last_syncpoint_pos = INT_MIN;
683     nut->header_count++;
684     return 0;
685 }
686
687 static int nut_write_header(AVFormatContext *s)
688 {
689     NUTContext *nut = s->priv_data;
690     AVIOContext *bc = s->pb;
691     int i, j, ret;
692
693     nut->avf = s;
694
695     nut->stream   = av_calloc(s->nb_streams,  sizeof(*nut->stream ));
696     nut->chapter  = av_calloc(s->nb_chapters, sizeof(*nut->chapter));
697     nut->time_base= av_calloc(s->nb_streams +
698                               s->nb_chapters, sizeof(*nut->time_base));
699     if (!nut->stream || !nut->chapter || !nut->time_base) {
700         av_freep(&nut->stream);
701         av_freep(&nut->chapter);
702         av_freep(&nut->time_base);
703         return AVERROR(ENOMEM);
704     }
705
706     for (i = 0; i < s->nb_streams; i++) {
707         AVStream *st = s->streams[i];
708         int ssize;
709         AVRational time_base;
710         ff_parse_specific_params(st->codec, &time_base.den, &ssize, &time_base.num);
711
712         if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->codec->sample_rate) {
713             time_base = (AVRational) {1, st->codec->sample_rate};
714         } else {
715             time_base = ff_choose_timebase(s, st, 48000);
716         }
717
718         avpriv_set_pts_info(st, 64, time_base.num, time_base.den);
719
720         for (j = 0; j < nut->time_base_count; j++)
721             if (!memcmp(&time_base, &nut->time_base[j], sizeof(AVRational))) {
722                 break;
723             }
724         nut->time_base[j]        = time_base;
725         nut->stream[i].time_base = &nut->time_base[j];
726         if (j == nut->time_base_count)
727             nut->time_base_count++;
728
729         if (INT64_C(1000) * time_base.num >= time_base.den)
730             nut->stream[i].msb_pts_shift = 7;
731         else
732             nut->stream[i].msb_pts_shift = 14;
733         nut->stream[i].max_pts_distance =
734             FFMAX(time_base.den, time_base.num) / time_base.num;
735     }
736
737     for (i = 0; i < s->nb_chapters; i++) {
738         AVChapter *ch = s->chapters[i];
739
740         for (j = 0; j < nut->time_base_count; j++)
741             if (!memcmp(&ch->time_base, &nut->time_base[j], sizeof(AVRational)))
742                 break;
743
744         nut->time_base[j]         = ch->time_base;
745         nut->chapter[i].time_base = &nut->time_base[j];
746         if (j == nut->time_base_count)
747             nut->time_base_count++;
748     }
749
750     nut->max_distance = MAX_DISTANCE;
751     build_elision_headers(s);
752     build_frame_code(s);
753     av_assert0(nut->frame_code['N'].flags == FLAG_INVALID);
754
755     avio_write(bc, ID_STRING, strlen(ID_STRING));
756     avio_w8(bc, 0);
757
758     if ((ret = write_headers(s, bc)) < 0)
759         return ret;
760
761     if (s->avoid_negative_ts < 0)
762         s->avoid_negative_ts = 1;
763
764     avio_flush(bc);
765
766     return 0;
767 }
768
769 static int get_needed_flags(NUTContext *nut, StreamContext *nus, FrameCode *fc,
770                             AVPacket *pkt)
771 {
772     int flags = 0;
773
774     if (pkt->flags & AV_PKT_FLAG_KEY)
775         flags |= FLAG_KEY;
776     if (pkt->stream_index != fc->stream_id)
777         flags |= FLAG_STREAM_ID;
778     if (pkt->size / fc->size_mul)
779         flags |= FLAG_SIZE_MSB;
780     if (pkt->pts - nus->last_pts != fc->pts_delta)
781         flags |= FLAG_CODED_PTS;
782     if (pkt->side_data_elems && nut->version > 3)
783         flags |= FLAG_SM_DATA;
784     if (pkt->size > 2 * nut->max_distance)
785         flags |= FLAG_CHECKSUM;
786     if (FFABS(pkt->pts - nus->last_pts) > nus->max_pts_distance)
787         flags |= FLAG_CHECKSUM;
788     if (pkt->size < nut->header_len[fc->header_idx] ||
789         (pkt->size > 4096 && fc->header_idx)        ||
790         memcmp(pkt->data, nut->header[fc->header_idx],
791                nut->header_len[fc->header_idx]))
792         flags |= FLAG_HEADER_IDX;
793
794     return flags | (fc->flags & FLAG_CODED);
795 }
796
797 static int find_best_header_idx(NUTContext *nut, AVPacket *pkt)
798 {
799     int i;
800     int best_i   = 0;
801     int best_len = 0;
802
803     if (pkt->size > 4096)
804         return 0;
805
806     for (i = 1; i < nut->header_count; i++)
807         if (pkt->size >= nut->header_len[i]
808             && nut->header_len[i] > best_len
809             && !memcmp(pkt->data, nut->header[i], nut->header_len[i])) {
810             best_i   = i;
811             best_len = nut->header_len[i];
812         }
813     return best_i;
814 }
815
816 static int write_sm_data(AVFormatContext *s, AVIOContext *bc, AVPacket *pkt, int is_meta)
817 {
818     AVStream *st = s->streams[pkt->stream_index];
819     int ret, i, dyn_size;
820     unsigned flags;
821     AVIOContext *dyn_bc;
822     int sm_data_count = 0;
823     uint8_t tmp[256];
824     uint8_t *dyn_buf;
825
826     ret = avio_open_dyn_buf(&dyn_bc);
827     if (ret < 0)
828         return ret;
829
830     for (i = 0; i<pkt->side_data_elems; i++) {
831         const uint8_t *data = pkt->side_data[i].data;
832         int size = pkt->side_data[i].size;
833         const uint8_t *data_end = data + size;
834
835         if (is_meta) {
836             if (   pkt->side_data[i].type == AV_PKT_DATA_METADATA_UPDATE
837                 || pkt->side_data[i].type == AV_PKT_DATA_STRINGS_METADATA) {
838                 if (!size || data[size-1])
839                     return AVERROR(EINVAL);
840                 while (data < data_end) {
841                     const uint8_t *key = data;
842                     const uint8_t *val = data + strlen(key) + 1;
843
844                     if(val >= data_end)
845                         return AVERROR(EINVAL);
846                     put_str(dyn_bc, key);
847                     put_s(dyn_bc, -1);
848                     put_str(dyn_bc, val);
849                     data = val + strlen(val) + 1;
850                     sm_data_count++;
851                 }
852             }
853         } else {
854             switch (pkt->side_data[i].type) {
855             case AV_PKT_DATA_PALETTE:
856             case AV_PKT_DATA_NEW_EXTRADATA:
857             case AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL:
858             default:
859                 if (pkt->side_data[i].type == AV_PKT_DATA_PALETTE) {
860                     put_str(dyn_bc, "Palette");
861                 } else if(pkt->side_data[i].type == AV_PKT_DATA_NEW_EXTRADATA) {
862                     put_str(dyn_bc, "Extradata");
863                 } else if(pkt->side_data[i].type == AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL) {
864                     snprintf(tmp, sizeof(tmp), "CodecSpecificSide%"PRId64"", AV_RB64(data));
865                     put_str(dyn_bc, tmp);
866                 } else {
867                     snprintf(tmp, sizeof(tmp), "UserData%s-SD-%d",
868                             (st->codec->flags & CODEC_FLAG_BITEXACT) ? "Lavf" : LIBAVFORMAT_IDENT,
869                             pkt->side_data[i].type);
870                     put_str(dyn_bc, tmp);
871                 }
872                 put_s(dyn_bc, -2);
873                 put_str(dyn_bc, "bin");
874                 ff_put_v(dyn_bc, pkt->side_data[i].size);
875                 avio_write(dyn_bc, data, pkt->side_data[i].size);
876                 sm_data_count++;
877                 break;
878             case AV_PKT_DATA_PARAM_CHANGE:
879                 flags = bytestream_get_le32(&data);
880                 if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) {
881                     put_str(dyn_bc, "Channels");
882                     put_s(dyn_bc, bytestream_get_le32(&data));
883                     sm_data_count++;
884                 }
885                 if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) {
886                     put_str(dyn_bc, "ChannelLayout");
887                     put_s(dyn_bc, -2);
888                     put_str(dyn_bc, "u64");
889                     ff_put_v(bc, 8);
890                     avio_write(dyn_bc, data, 8); data+=8;
891                     sm_data_count++;
892                 }
893                 if (flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) {
894                     put_str(dyn_bc, "SampleRate");
895                     put_s(dyn_bc, bytestream_get_le32(&data));
896                     sm_data_count++;
897                 }
898                 if (flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) {
899                     put_str(dyn_bc, "Width");
900                     put_s(dyn_bc, bytestream_get_le32(&data));
901                     put_str(dyn_bc, "Height");
902                     put_s(dyn_bc, bytestream_get_le32(&data));
903                     sm_data_count+=2;
904                 }
905                 break;
906             case AV_PKT_DATA_SKIP_SAMPLES:
907                 if (AV_RL32(data)) {
908                     put_str(dyn_bc, "SkipStart");
909                     put_s(dyn_bc, (unsigned)AV_RL32(data));
910                     sm_data_count++;
911                 }
912                 if (AV_RL32(data+4)) {
913                     put_str(dyn_bc, "SkipEnd");
914                     put_s(dyn_bc, (unsigned)AV_RL32(data+4));
915                     sm_data_count++;
916                 }
917                 break;
918             case AV_PKT_DATA_METADATA_UPDATE:
919             case AV_PKT_DATA_STRINGS_METADATA:
920                 // belongs into meta, not side data
921                 break;
922             }
923         }
924     }
925
926     ff_put_v(bc, sm_data_count);
927     dyn_size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
928     avio_write(bc, dyn_buf, dyn_size);
929     av_freep(&dyn_buf);
930
931     return 0;
932 }
933
934 static int nut_write_packet(AVFormatContext *s, AVPacket *pkt)
935 {
936     NUTContext *nut    = s->priv_data;
937     StreamContext *nus = &nut->stream[pkt->stream_index];
938     AVIOContext *bc    = s->pb, *dyn_bc, *sm_bc = NULL;
939     FrameCode *fc;
940     int64_t coded_pts;
941     int best_length, frame_code, flags, needed_flags, i, header_idx;
942     int best_header_idx;
943     int key_frame = !!(pkt->flags & AV_PKT_FLAG_KEY);
944     int store_sp  = 0;
945     int ret;
946     int sm_size = 0;
947     int data_size = pkt->size;
948     uint8_t *sm_buf;
949
950     if (pkt->pts < 0) {
951         av_log(s, AV_LOG_ERROR,
952                "Negative pts not supported stream %d, pts %"PRId64"\n",
953                pkt->stream_index, pkt->pts);
954         return AVERROR(EINVAL);
955     }
956
957     if (pkt->side_data_elems && nut->version > 3) {
958         ret = avio_open_dyn_buf(&sm_bc);
959         if (ret < 0)
960             return ret;
961         write_sm_data(s, sm_bc, pkt, 0);
962         write_sm_data(s, sm_bc, pkt, 1);
963         sm_size = avio_close_dyn_buf(sm_bc, &sm_buf);
964         data_size += sm_size;
965     }
966
967     if (1LL << (20 + 3 * nut->header_count) <= avio_tell(bc))
968         write_headers(s, bc);
969
970     if (key_frame && !(nus->last_flags & FLAG_KEY))
971         store_sp = 1;
972
973     if (data_size + 30 /*FIXME check*/ + avio_tell(bc) >= nut->last_syncpoint_pos + nut->max_distance)
974         store_sp = 1;
975
976 //FIXME: Ensure store_sp is 1 in the first place.
977
978     if (store_sp) {
979         Syncpoint *sp, dummy = { .pos = INT64_MAX };
980
981         ff_nut_reset_ts(nut, *nus->time_base, pkt->dts);
982         for (i = 0; i < s->nb_streams; i++) {
983             AVStream *st   = s->streams[i];
984             int64_t dts_tb = av_rescale_rnd(pkt->dts,
985                 nus->time_base->num * (int64_t)nut->stream[i].time_base->den,
986                 nus->time_base->den * (int64_t)nut->stream[i].time_base->num,
987                 AV_ROUND_DOWN);
988             int index = av_index_search_timestamp(st, dts_tb,
989                                                   AVSEEK_FLAG_BACKWARD);
990             if (index >= 0)
991                 dummy.pos = FFMIN(dummy.pos, st->index_entries[index].pos);
992         }
993         if (dummy.pos == INT64_MAX)
994             dummy.pos = 0;
995         sp = av_tree_find(nut->syncpoints, &dummy, (void *)ff_nut_sp_pos_cmp,
996                           NULL);
997
998         nut->last_syncpoint_pos = avio_tell(bc);
999         ret                     = avio_open_dyn_buf(&dyn_bc);
1000         if (ret < 0)
1001             return ret;
1002         put_tt(nut, nus->time_base, dyn_bc, pkt->dts);
1003         ff_put_v(dyn_bc, sp ? (nut->last_syncpoint_pos - sp->pos) >> 4 : 0);
1004         put_packet(nut, bc, dyn_bc, 1, SYNCPOINT_STARTCODE);
1005
1006         if ((ret = ff_nut_add_sp(nut, nut->last_syncpoint_pos, 0 /*unused*/, pkt->dts)) < 0)
1007             return ret;
1008
1009         if ((1ll<<60) % nut->sp_count == 0)
1010             for (i=0; i<s->nb_streams; i++) {
1011                 int j;
1012                 StreamContext *nus = &nut->stream[i];
1013                 av_reallocp_array(&nus->keyframe_pts, 2*nut->sp_count, sizeof(*nus->keyframe_pts));
1014                 if (!nus->keyframe_pts)
1015                     return AVERROR(ENOMEM);
1016                 for (j=nut->sp_count == 1 ? 0 : nut->sp_count; j<2*nut->sp_count; j++)
1017                     nus->keyframe_pts[j] = AV_NOPTS_VALUE;
1018         }
1019     }
1020     av_assert0(nus->last_pts != AV_NOPTS_VALUE);
1021
1022     coded_pts = pkt->pts & ((1 << nus->msb_pts_shift) - 1);
1023     if (ff_lsb2full(nus, coded_pts) != pkt->pts)
1024         coded_pts = pkt->pts + (1 << nus->msb_pts_shift);
1025
1026     best_header_idx = find_best_header_idx(nut, pkt);
1027
1028     best_length = INT_MAX;
1029     frame_code  = -1;
1030     for (i = 0; i < 256; i++) {
1031         int length    = 0;
1032         FrameCode *fc = &nut->frame_code[i];
1033         int flags     = fc->flags;
1034
1035         if (flags & FLAG_INVALID)
1036             continue;
1037         needed_flags = get_needed_flags(nut, nus, fc, pkt);
1038
1039         if (flags & FLAG_CODED) {
1040             length++;
1041             flags = needed_flags;
1042         }
1043
1044         if ((flags & needed_flags) != needed_flags)
1045             continue;
1046
1047         if ((flags ^ needed_flags) & FLAG_KEY)
1048             continue;
1049
1050         if (flags & FLAG_STREAM_ID)
1051             length += ff_get_v_length(pkt->stream_index);
1052
1053         if (data_size % fc->size_mul != fc->size_lsb)
1054             continue;
1055         if (flags & FLAG_SIZE_MSB)
1056             length += ff_get_v_length(data_size / fc->size_mul);
1057
1058         if (flags & FLAG_CHECKSUM)
1059             length += 4;
1060
1061         if (flags & FLAG_CODED_PTS)
1062             length += ff_get_v_length(coded_pts);
1063
1064         if (   (flags & FLAG_CODED)
1065             && nut->header_len[best_header_idx] > nut->header_len[fc->header_idx] + 1) {
1066             flags |= FLAG_HEADER_IDX;
1067         }
1068
1069         if (flags & FLAG_HEADER_IDX) {
1070             length += 1 - nut->header_len[best_header_idx];
1071         } else {
1072             length -= nut->header_len[fc->header_idx];
1073         }
1074
1075         length *= 4;
1076         length += !(flags & FLAG_CODED_PTS);
1077         length += !(flags & FLAG_CHECKSUM);
1078
1079         if (length < best_length) {
1080             best_length = length;
1081             frame_code  = i;
1082         }
1083     }
1084     av_assert0(frame_code != -1);
1085     fc           = &nut->frame_code[frame_code];
1086     flags        = fc->flags;
1087     needed_flags = get_needed_flags(nut, nus, fc, pkt);
1088     header_idx   = fc->header_idx;
1089
1090     ffio_init_checksum(bc, ff_crc04C11DB7_update, 0);
1091     avio_w8(bc, frame_code);
1092     if (flags & FLAG_CODED) {
1093         ff_put_v(bc, (flags ^ needed_flags) & ~(FLAG_CODED));
1094         flags = needed_flags;
1095     }
1096     if (flags & FLAG_STREAM_ID)  ff_put_v(bc, pkt->stream_index);
1097     if (flags & FLAG_CODED_PTS)  ff_put_v(bc, coded_pts);
1098     if (flags & FLAG_SIZE_MSB )  ff_put_v(bc, data_size / fc->size_mul);
1099     if (flags & FLAG_HEADER_IDX) ff_put_v(bc, header_idx = best_header_idx);
1100
1101     if (flags & FLAG_CHECKSUM)   avio_wl32(bc, ffio_get_checksum(bc));
1102     else                         ffio_get_checksum(bc);
1103
1104     if (flags & FLAG_SM_DATA) {
1105         avio_write(bc, sm_buf, sm_size);
1106         av_freep(&sm_buf);
1107     }
1108     avio_write(bc, pkt->data + nut->header_len[header_idx], pkt->size - nut->header_len[header_idx]);
1109
1110     nus->last_flags = flags;
1111     nus->last_pts   = pkt->pts;
1112
1113     //FIXME just store one per syncpoint
1114     if (flags & FLAG_KEY) {
1115         av_add_index_entry(
1116             s->streams[pkt->stream_index],
1117             nut->last_syncpoint_pos,
1118             pkt->pts,
1119             0,
1120             0,
1121             AVINDEX_KEYFRAME);
1122         if (nus->keyframe_pts && nus->keyframe_pts[nut->sp_count] == AV_NOPTS_VALUE)
1123             nus->keyframe_pts[nut->sp_count] = pkt->pts;
1124     }
1125
1126     if (!nut->max_pts_tb || av_compare_ts(nut->max_pts, *nut->max_pts_tb, pkt->pts, *nus->time_base) < 0) {
1127         nut->max_pts = pkt->pts;
1128         nut->max_pts_tb = nus->time_base;
1129     }
1130
1131     return 0;
1132 }
1133
1134 static int nut_write_trailer(AVFormatContext *s)
1135 {
1136     NUTContext *nut = s->priv_data;
1137     AVIOContext *bc = s->pb, *dyn_bc;
1138     int i, ret;
1139
1140     while (nut->header_count < 3)
1141         write_headers(s, bc);
1142
1143     ret = avio_open_dyn_buf(&dyn_bc);
1144     if (ret >= 0 && nut->sp_count) {
1145         write_index(nut, dyn_bc);
1146         put_packet(nut, bc, dyn_bc, 1, INDEX_STARTCODE);
1147     }
1148
1149     ff_nut_free_sp(nut);
1150     for (i=0; i<s->nb_streams; i++)
1151         av_freep(&nut->stream[i].keyframe_pts);
1152
1153     av_freep(&nut->stream);
1154     av_freep(&nut->chapter);
1155     av_freep(&nut->time_base);
1156
1157     return 0;
1158 }
1159
1160 AVOutputFormat ff_nut_muxer = {
1161     .name           = "nut",
1162     .long_name      = NULL_IF_CONFIG_SMALL("NUT"),
1163     .mime_type      = "video/x-nut",
1164     .extensions     = "nut",
1165     .priv_data_size = sizeof(NUTContext),
1166     .audio_codec    = CONFIG_LIBVORBIS ? AV_CODEC_ID_VORBIS :
1167                       CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_MP2,
1168     .video_codec    = AV_CODEC_ID_MPEG4,
1169     .write_header   = nut_write_header,
1170     .write_packet   = nut_write_packet,
1171     .write_trailer  = nut_write_trailer,
1172     .flags          = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS,
1173     .codec_tag      = ff_nut_codec_tags,
1174 };