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
32
35 {
37
38 if (size > 4096)
39 return 0;
40
42
44 if (key_frame) {
45 return 3;
46 } else {
47 out[3] = 0xB6;
48 return 4;
49 }
52 return 3;
54 return 3;
57 int lsf, mpeg25, sample_rate_index, bitrate_index,
frame_size;
59 unsigned int header = 0xFFF00000;
60
61 lsf = sample_rate < (24000 + 32000) / 2;
62 mpeg25 = sample_rate < (12000 + 16000) / 2;
63 sample_rate <<= lsf + mpeg25;
64 if (sample_rate < (32000 + 44100) / 2) sample_rate_index = 2;
65 else if (sample_rate < (44100 + 48000) / 2) sample_rate_index = 0;
66 else sample_rate_index = 1;
67
69
70 for (bitrate_index = 2; bitrate_index < 30; bitrate_index++) {
71 frame_size =
73 frame_size = (frame_size * 144000) / (sample_rate << lsf) +
74 (bitrate_index & 1);
75
76 if (frame_size == size)
77 break;
78 }
79
80 header |= (!lsf) << 19;
81 header |= (4 - layer) << 17;
82 header |= 1 << 16; //no crc
84 if (size <= 0)
85 return 2; //we guess there is no crc, if there is one the user clearly does not care about overhead
86 if (bitrate_index == 30)
87 return -1; //something is wrong ...
88
89 header |= (bitrate_index >> 1) << 12;
90 header |= sample_rate_index << 10;
91 header |= (bitrate_index & 1) << 9;
92
93 return 2; //FIXME actually put the needed ones in build_elision_headers()
94 return 3; //we guess that the private bit is not set
95 //FIXME the above assumptions should be checked, if these turn out false too often something should be done
96 }
97 return 0;
98 }
99
101 {
104 int i;
106
109 return i;
110 }
111 }
112
113 return 0;
114 }
115
117 {
119 int i;
120 //FIXME this is lame
121 //FIXME write a 2pass mode to find the maximal headers
122 static const uint8_t headers[][5] = {
123 { 3, 0x00, 0x00, 0x01 },
124 { 4, 0x00, 0x00, 0x01, 0xB6},
125 { 2, 0xFF, 0xFA }, //mp3+crc
126 { 2, 0xFF, 0xFB }, //mp3
127 { 2, 0xFF, 0xFC }, //mp2+crc
128 { 2, 0xFF, 0xFD }, //mp2
129 };
130
134 nut->
header[i] = &headers[i - 1][1];
135 }
136 }
137
139 {
142 int start = 1;
145 int pred_table[10];
147
152 start++;
153
154 if (keyframe_0_esc) {
155 /* keyframe = 0 escape */
159 start++;
160 }
161
162 for (stream_id = 0; stream_id < s->
nb_streams; stream_id++) {
163 int start2 = start + (end - start) * stream_id / s->
nb_streams;
164 int end2 = start + (end - start) * (stream_id + 1) / s->
nb_streams;
167 int intra_only =
/*codec->intra_only || */ is_audio;
168 int pred_count;
170
175 } else {
177 if (f.
den == 1 && f.
num>0)
179 }
182
183 for (key_frame = 0; key_frame < 2; key_frame++) {
184 if (!
intra_only || !keyframe_0_esc || key_frame != 0) {
190 if (is_audio)
192 start2++;
193 }
194 }
195
197 #if 1
198 if (is_audio) {
199 int frame_bytes = codec->frame_size * (int64_t)codec->bit_rate /
200 (8 * codec->sample_rate);
201 int pts;
202 for (pts = 0; pts < 2; pts++) {
203 for (pred = 0; pred < 2; pred++) {
211 start2++;
212 }
213 }
214 } else {
220 start2++;
221 }
222 #endif
223
224 if (codec->has_b_frames) {
225 pred_count = 5;
226 pred_table[0] = -2;
227 pred_table[1] = -1;
228 pred_table[2] = 1;
229 pred_table[3] = 3;
230 pred_table[4] = 4;
232 pred_count = 3;
233 pred_table[0] = 2;
234 pred_table[1] = 9;
235 pred_table[2] = 16;
236 } else {
237 pred_count = 1;
238 pred_table[0] = 1;
239 }
240
241 for (pred = 0; pred < pred_count; pred++) {
242 int start3 = start2 + (end2 - start2) * pred / pred_count;
243 int end3 = start2 + (end2 - start2) * (pred + 1) / pred_count;
244
246
247 for (index = start3; index < end3; index++) {
252 //FIXME use single byte size and pred from last
256 if (is_audio)
258 }
259 }
260 }
265 }
266
268 {
272 }
273 /**
274 * Store a string as vb.
275 */
277 {
278 int len = strlen(
string);
279
282 }
283
285 {
287 }
288
289 #ifdef TRACE
290 static inline void ff_put_v_trace(
AVIOContext *bc, uint64_t v,
const char *file,
292 {
294
296 }
297
298 static inline void put_s_trace(
AVIOContext *bc, int64_t v,
const char *file,
const char *
func,
int line)
299 {
301
303 }
304 #define ff_put_v(bc, v) ff_put_v_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__)
305 #define put_s(bc, v) put_s_trace(bc, v, __FILE__, __PRETTY_FUNCTION__, __LINE__)
306 #endif
307
308 //FIXME remove calculate_checksum
310 int calculate_checksum, uint64_t startcode)
311 {
314 int forw_ptr = dyn_size + 4 * calculate_checksum;
315
316 if (forw_ptr > 4096)
320 if (forw_ptr > 4096)
322
323 if (calculate_checksum)
326 if (calculate_checksum)
328
330 }
331
333 {
334 int i, j, tmp_pts, tmp_flags, tmp_stream, tmp_mul, tmp_size, tmp_fields,
335 tmp_head_idx;
336 int64_t tmp_match;
337
342
346 }
347
348 tmp_pts = 0;
349 tmp_mul = 1;
350 tmp_stream = 0;
351 tmp_match = 1 - (1LL << 62);
352 tmp_head_idx = 0;
353 for (i = 0; i < 256; ) {
354 tmp_fields = 0;
355 tmp_size = 0;
356 // tmp_res=0;
361 // if (tmp_res != nut->frame_code[i].res ) tmp_fields=5;
363
369 // tmp_res = nut->frame_code[i].res;
371
372 for (j = 0; i < 256; j++, i++) {
373 if (i == 'N') {
374 j--;
375 continue;
376 }
382 // nut->frame_code[i].res != tmp_res ||
384 break;
385 }
386 if (j != tmp_mul - tmp_size)
387 tmp_fields = 6;
388
391 if (tmp_fields > 0)
put_s(bc, tmp_pts);
392 if (tmp_fields > 1)
ff_put_v(bc, tmp_mul);
393 if (tmp_fields > 2)
ff_put_v(bc, tmp_stream);
394 if (tmp_fields > 3)
ff_put_v(bc, tmp_size);
395 if (tmp_fields > 4)
ff_put_v(bc, 0
/*tmp_res*/);
396 if (tmp_fields > 5)
ff_put_v(bc, j);
397 if (tmp_fields > 6)
ff_put_v(bc, tmp_match);
398 if (tmp_fields > 7)
ff_put_v(bc, tmp_head_idx);
399 }
404 }
405 }
406
409 {
412
419 }
423 } else {
426 }
427
432 avio_w8(bc, 0);
/* flags: 0x1 - fixed_fps, 0x2 - index_present */
433
436
442 break;
446
451 } else {
454 }
455 ff_put_v(bc, 0);
/* csp type -- unknown */
456 break;
457 default:
458 break;
459 }
460 return 0;
461 }
462
464 {
468 return 1;
469 }
470
472 {
477 int count = 0, dyn_size;
479 if (ret < 0)
480 return ret;
481
484
489
491
495 return 0;
496 }
497
504 int count=0, dyn_size, i;
506 if (ret < 0)
507 return ret;
508
514 }
518 count +=
add_info(dyn_bc,
"r_frame_rate", buf);
519 }
521
522 if (count) {
523 ff_put_v(bc, stream_id + 1);
//stream_id_plus1
527
529
531 }
532
534 return count;
535 }
536
538 {
543 int ret, dyn_size, count = 0;
544
546 if (ret < 0)
547 return ret;
548
550 put_s(bc,
id + 1);
// chapter_id
553
556
558
562 return 0;
563 }
564
566 int i;
570 int64_t payload_size;
571
573
575
578 ff_put_v(bc, (next_node[1]->pos >> 4) - (dummy.
pos>>4));
579 dummy.
pos = next_node[1]->
pos;
580 }
581
585 int j, k;
588 int n = 0;
590 n++;
591
593 for (k= j - n; k<=j && k<nut->
sp_count; k++) {
595 continue;
599 }
600 }
601 }
602
603 payload_size =
avio_tell(bc) - startpos + 8 + 4;
604
605 avio_wb64(bc, 8 + payload_size +
av_log2(payload_size) / 7 + 1 + 4*(payload_size > 4096));
606
607 return 0;
608 }
609
611 {
614 int i, ret;
615
617
619 if (ret < 0)
620 return ret;
623
626 if (ret < 0)
627 return ret;
629 if (ret < 0)
630 return ret;
632 }
633
635 if (ret < 0)
636 return ret;
639
642 if (ret < 0)
643 return ret;
645 if (ret < 0)
646 return ret;
647 if (ret > 0)
649 else {
653 }
654 }
655
658 if (ret < 0)
659 return ret;
661 if (ret < 0) {
665 return ret;
666 }
668 }
669
672 return 0;
673 }
674
676 {
679 int i, j, ret;
680
682
692 }
693
696 int ssize;
699
702 } else {
704 }
705
707
710 break;
711 }
716
717 if (INT64_C(1000) * time_base.
num >= time_base.
den)
719 else
723 }
724
727
730 break;
731
736 }
737
742
745
747 return ret;
748
751
753
754 return 0;
755 }
756
759 {
761
779
781 }
782
784 {
785 int i;
786 int best_i = 0;
787 int best_len = 0;
788
789 if (pkt->
size > 4096)
790 return 0;
791
796 best_i = i;
798 }
799 return best_i;
800 }
801
803 {
808 int64_t coded_pts;
809 int best_length, frame_code,
flags, needed_flags, i, header_idx;
810 int best_header_idx;
812 int store_sp = 0;
813 int ret;
814
817 "Negative pts not supported stream %d, pts %"PRId64"\n",
820 }
821
824
826 store_sp = 1;
827
829 store_sp = 1;
830
831 //FIXME: Ensure store_sp is 1 in the first place.
832
833 if (store_sp) {
835
845 if (index >= 0)
847 }
848 if (dummy.
pos == INT64_MAX)
852
855 if (ret < 0)
856 return ret;
860
862
865 int j;
872 }
873 }
875
879
881
882 best_length = INT_MAX;
883 frame_code = -1;
884 for (i = 0; i < 256; i++) {
885 int length = 0;
887 int flags = fc->
flags;
888
890 continue;
892
894 length++;
895 flags = needed_flags;
896 }
897
898 if ((flags & needed_flags) != needed_flags)
899 continue;
900
901 if ((flags ^ needed_flags) &
FLAG_KEY)
902 continue;
903
906
908 continue;
911
913 length += 4;
914
917
918 if ( (flags & FLAG_CODED)
921 }
922
924 length += 1 - nut->
header_len[best_header_idx];
925 } else {
927 }
928
929 length *= 4;
932
933 if (length < best_length) {
934 best_length = length;
935 frame_code = i;
936 }
937 }
943
947 ff_put_v(bc, (flags ^ needed_flags) & ~(FLAG_CODED));
948 flags = needed_flags;
949 }
954
957
961
962 //FIXME just store one per syncpoint
968 0,
969 0,
973 }
974
978 }
979
980 return 0;
981 }
982
984 {
987 int i, ret;
988
991
993 if (ret >= 0) {
996 }
997
1001
1005
1006 return 0;
1007 }
1008
1012 .mime_type = "video/x-nut",
1013 .extensions = "nut",
1023 };