comparison movenc.c @ 909:69e06b6f91a3 libavformat

>4gb fixes by (Dirk Musfeldt | d.musfeldt meilenstein de)
author michael
date Mon, 23 Jan 2006 14:12:03 +0000
parents edbe5c3717f9
children d92e6d673ef5
comparison
equal deleted inserted replaced
908:5b0ff52e008e 909:69e06b6f91a3
33 #define MODE_PSP 3 // example working PSP command line: 33 #define MODE_PSP 3 // example working PSP command line:
34 // ffmpeg -i testinput.avi -f psp -r 14.985 -s 320x240 -b 768 -ar 24000 -ab 32 M4V00001.MP4 34 // ffmpeg -i testinput.avi -f psp -r 14.985 -s 320x240 -b 768 -ar 24000 -ab 32 M4V00001.MP4
35 #define MODE_3G2 4 35 #define MODE_3G2 4
36 36
37 typedef struct MOVIentry { 37 typedef struct MOVIentry {
38 unsigned int flags, pos, size; 38 unsigned int flags, size;
39 uint64_t pos;
39 unsigned int samplesInChunk; 40 unsigned int samplesInChunk;
40 char key_frame; 41 char key_frame;
41 unsigned int entries; 42 unsigned int entries;
42 } MOVIentry; 43 } MOVIentry;
43 44
44 typedef struct MOVIndex { 45 typedef struct MOVIndex {
45 int mode; 46 int mode;
46 int entry; 47 int entry;
47 int mdat_size; 48 uint64_t mdat_size;
48 int ents_allocated; 49 int ents_allocated;
49 long timescale; 50 long timescale;
50 long time; 51 long time;
51 long trackDuration; 52 long trackDuration;
52 long sampleCount; 53 long sampleCount;
95 { CODEC_ID_PCM_S16BE , 230 }, 96 { CODEC_ID_PCM_S16BE , 230 },
96 { 0,0 }, 97 { 0,0 },
97 }; 98 };
98 99
99 //FIXME supprt 64bit varaint with wide placeholders 100 //FIXME supprt 64bit varaint with wide placeholders
100 static int updateSize (ByteIOContext *pb, int pos) 101 static offset_t updateSize (ByteIOContext *pb, offset_t pos)
101 { 102 {
102 long curpos = url_ftell(pb); 103 offset_t curpos = url_ftell(pb);
103 url_fseek(pb, pos, SEEK_SET); 104 url_fseek(pb, pos, SEEK_SET);
104 put_be32(pb, curpos - pos); /* rewrite size */ 105 put_be32(pb, curpos - pos); /* rewrite size */
105 url_fseek(pb, curpos, SEEK_SET); 106 url_fseek(pb, curpos, SEEK_SET);
106 107
107 return curpos - pos; 108 return curpos - pos;
109 110
110 /* Chunk offset atom */ 111 /* Chunk offset atom */
111 static int mov_write_stco_tag(ByteIOContext *pb, MOVTrack* track) 112 static int mov_write_stco_tag(ByteIOContext *pb, MOVTrack* track)
112 { 113 {
113 int i; 114 int i;
114 int pos = url_ftell(pb); 115 offset_t pos = url_ftell(pb);
115 put_be32(pb, 0); /* size */ 116 put_be32(pb, 0); /* size */
116 put_tag(pb, "stco"); 117 int mode64 = 0; // use 32 bit size variant if possible
118 if (pos > UINT32_MAX) {
119 mode64 = 1;
120 put_tag(pb, "co64");
121 } else
122 put_tag(pb, "stco");
117 put_be32(pb, 0); /* version & flags */ 123 put_be32(pb, 0); /* version & flags */
118 put_be32(pb, track->entry); /* entry count */ 124 put_be32(pb, track->entry); /* entry count */
119 for (i=0; i<track->entry; i++) { 125 for (i=0; i<track->entry; i++) {
120 int cl = i / MOV_INDEX_CLUSTER_SIZE; 126 int cl = i / MOV_INDEX_CLUSTER_SIZE;
121 int id = i % MOV_INDEX_CLUSTER_SIZE; 127 int id = i % MOV_INDEX_CLUSTER_SIZE;
122 put_be32(pb, track->cluster[cl][id].pos); 128 if(mode64 == 1)
129 put_be64(pb, track->cluster[cl][id].pos);
130 else
131 put_be32(pb, track->cluster[cl][id].pos);
123 } 132 }
124 return updateSize (pb, pos); 133 return updateSize (pb, pos);
125 } 134 }
126 135
127 /* Sample size atom */ 136 /* Sample size atom */
128 static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack* track) 137 static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack* track)
129 { 138 {
130 int equalChunks = 1; 139 int equalChunks = 1;
131 int i, j, entries = 0, tst = -1, oldtst = -1; 140 int i, j, entries = 0, tst = -1, oldtst = -1;
132 141
133 int pos = url_ftell(pb); 142 offset_t pos = url_ftell(pb);
134 put_be32(pb, 0); /* size */ 143 put_be32(pb, 0); /* size */
135 put_tag(pb, "stsz"); 144 put_tag(pb, "stsz");
136 put_be32(pb, 0); /* version & flags */ 145 put_be32(pb, 0); /* version & flags */
137 146
138 for (i=0; i<track->entry; i++) { 147 for (i=0; i<track->entry; i++) {
166 } 175 }
167 176
168 /* Sample to chunk atom */ 177 /* Sample to chunk atom */
169 static int mov_write_stsc_tag(ByteIOContext *pb, MOVTrack* track) 178 static int mov_write_stsc_tag(ByteIOContext *pb, MOVTrack* track)
170 { 179 {
171 int index = 0, oldval = -1, i, entryPos, curpos; 180 int index = 0, oldval = -1, i;
172 181 offset_t entryPos, curpos;
173 int pos = url_ftell(pb); 182
183 offset_t pos = url_ftell(pb);
174 put_be32(pb, 0); /* size */ 184 put_be32(pb, 0); /* size */
175 put_tag(pb, "stsc"); 185 put_tag(pb, "stsc");
176 put_be32(pb, 0); // version & flags 186 put_be32(pb, 0); // version & flags
177 entryPos = url_ftell(pb); 187 entryPos = url_ftell(pb);
178 put_be32(pb, track->entry); // entry count 188 put_be32(pb, track->entry); // entry count
197 } 207 }
198 208
199 /* Sync sample atom */ 209 /* Sync sample atom */
200 static int mov_write_stss_tag(ByteIOContext *pb, MOVTrack* track) 210 static int mov_write_stss_tag(ByteIOContext *pb, MOVTrack* track)
201 { 211 {
202 long curpos; 212 offset_t curpos, entryPos;
203 int i, index = 0, entryPos; 213 int i, index = 0;
204 int pos = url_ftell(pb); 214 offset_t pos = url_ftell(pb);
205 put_be32(pb, 0); // size 215 put_be32(pb, 0); // size
206 put_tag(pb, "stss"); 216 put_tag(pb, "stss");
207 put_be32(pb, 0); // version & flags 217 put_be32(pb, 0); // version & flags
208 entryPos = url_ftell(pb); 218 entryPos = url_ftell(pb);
209 put_be32(pb, track->entry); // entry count 219 put_be32(pb, track->entry); // entry count
236 return 0x11; 246 return 0x11;
237 } 247 }
238 248
239 static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack* track) 249 static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack* track)
240 { 250 {
241 int pos = url_ftell(pb); 251 offset_t pos = url_ftell(pb);
242 252
243 put_be32(pb, 0); /* size */ 253 put_be32(pb, 0); /* size */
244 put_tag(pb, "wave"); 254 put_tag(pb, "wave");
245 255
246 put_be32(pb, 12); /* size */ 256 put_be32(pb, 12); /* size */
278 { 0, 0 }, 288 { 0, 0 },
279 }; 289 };
280 290
281 static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack* track) 291 static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack* track)
282 { 292 {
283 int pos = url_ftell(pb); 293 offset_t pos = url_ftell(pb);
284 int tag; 294 int tag;
285 295
286 put_be32(pb, 0); /* size */ 296 put_be32(pb, 0); /* size */
287 297
288 tag = track->enc->codec_tag; 298 tag = track->enc->codec_tag;
420 } 430 }
421 431
422 static int mov_write_esds_tag(ByteIOContext *pb, MOVTrack* track) // Basic 432 static int mov_write_esds_tag(ByteIOContext *pb, MOVTrack* track) // Basic
423 { 433 {
424 int decoderSpecificInfoLen; 434 int decoderSpecificInfoLen;
425 int pos = url_ftell(pb); 435 offset_t pos = url_ftell(pb);
426 void *vosDataBackup=track->vosData; 436 void *vosDataBackup=track->vosData;
427 int vosLenBackup=track->vosLen; 437 int vosLenBackup=track->vosLen;
428 438
429 // we should be able to have these passed in, via vosData, then we wouldn't need to attack this routine at all 439 // we should be able to have these passed in, via vosData, then we wouldn't need to attack this routine at all
430 static const char PSPAACData[]={0x13,0x10}; 440 static const char PSPAACData[]={0x13,0x10};
506 { 0, 0 }, 516 { 0, 0 },
507 }; 517 };
508 518
509 static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track) 519 static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track)
510 { 520 {
511 int pos = url_ftell(pb); 521 offset_t pos = url_ftell(pb);
512 char compressor_name[32]; 522 char compressor_name[32];
513 int tag; 523 int tag;
514 524
515 put_be32(pb, 0); /* size */ 525 put_be32(pb, 0); /* size */
516 526
561 return updateSize (pb, pos); 571 return updateSize (pb, pos);
562 } 572 }
563 573
564 static int mov_write_stsd_tag(ByteIOContext *pb, MOVTrack* track) 574 static int mov_write_stsd_tag(ByteIOContext *pb, MOVTrack* track)
565 { 575 {
566 int pos = url_ftell(pb); 576 offset_t pos = url_ftell(pb);
567 put_be32(pb, 0); /* size */ 577 put_be32(pb, 0); /* size */
568 put_tag(pb, "stsd"); 578 put_tag(pb, "stsd");
569 put_be32(pb, 0); /* version & flags */ 579 put_be32(pb, 0); /* version & flags */
570 put_be32(pb, 1); /* entry count */ 580 put_be32(pb, 1); /* entry count */
571 if (track->enc->codec_type == CODEC_TYPE_VIDEO) 581 if (track->enc->codec_type == CODEC_TYPE_VIDEO)
603 return 28; 613 return 28;
604 } 614 }
605 615
606 static int mov_write_stbl_tag(ByteIOContext *pb, MOVTrack* track) 616 static int mov_write_stbl_tag(ByteIOContext *pb, MOVTrack* track)
607 { 617 {
608 int pos = url_ftell(pb); 618 offset_t pos = url_ftell(pb);
609 put_be32(pb, 0); /* size */ 619 put_be32(pb, 0); /* size */
610 put_tag(pb, "stbl"); 620 put_tag(pb, "stbl");
611 mov_write_stsd_tag(pb, track); 621 mov_write_stsd_tag(pb, track);
612 mov_write_stts_tag(pb, track); 622 mov_write_stts_tag(pb, track);
613 if (track->enc->codec_type == CODEC_TYPE_VIDEO && 623 if (track->enc->codec_type == CODEC_TYPE_VIDEO &&
619 return updateSize(pb, pos); 629 return updateSize(pb, pos);
620 } 630 }
621 631
622 static int mov_write_dinf_tag(ByteIOContext *pb) 632 static int mov_write_dinf_tag(ByteIOContext *pb)
623 { 633 {
624 int pos = url_ftell(pb); 634 offset_t pos = url_ftell(pb);
625 put_be32(pb, 0); /* size */ 635 put_be32(pb, 0); /* size */
626 put_tag(pb, "dinf"); 636 put_tag(pb, "dinf");
627 mov_write_dref_tag(pb); 637 mov_write_dref_tag(pb);
628 return updateSize(pb, pos); 638 return updateSize(pb, pos);
629 } 639 }
648 } 658 }
649 659
650 static int mov_write_hdlr_tag(ByteIOContext *pb, MOVTrack* track) 660 static int mov_write_hdlr_tag(ByteIOContext *pb, MOVTrack* track)
651 { 661 {
652 char *descr, *hdlr, *hdlr_type; 662 char *descr, *hdlr, *hdlr_type;
653 int pos = url_ftell(pb); 663 offset_t pos = url_ftell(pb);
654 664
655 if (!track) { /* no media --> data handler */ 665 if (!track) { /* no media --> data handler */
656 hdlr = "dhlr"; 666 hdlr = "dhlr";
657 hdlr_type = "url "; 667 hdlr_type = "url ";
658 descr = "DataHandler"; 668 descr = "DataHandler";
680 return updateSize(pb, pos); 690 return updateSize(pb, pos);
681 } 691 }
682 692
683 static int mov_write_minf_tag(ByteIOContext *pb, MOVTrack* track) 693 static int mov_write_minf_tag(ByteIOContext *pb, MOVTrack* track)
684 { 694 {
685 int pos = url_ftell(pb); 695 offset_t pos = url_ftell(pb);
686 put_be32(pb, 0); /* size */ 696 put_be32(pb, 0); /* size */
687 put_tag(pb, "minf"); 697 put_tag(pb, "minf");
688 if(track->enc->codec_type == CODEC_TYPE_VIDEO) 698 if(track->enc->codec_type == CODEC_TYPE_VIDEO)
689 mov_write_vmhd_tag(pb); 699 mov_write_vmhd_tag(pb);
690 else 700 else
710 return 32; 720 return 32;
711 } 721 }
712 722
713 static int mov_write_mdia_tag(ByteIOContext *pb, MOVTrack* track) 723 static int mov_write_mdia_tag(ByteIOContext *pb, MOVTrack* track)
714 { 724 {
715 int pos = url_ftell(pb); 725 offset_t pos = url_ftell(pb);
716 put_be32(pb, 0); /* size */ 726 put_be32(pb, 0); /* size */
717 put_tag(pb, "mdia"); 727 put_tag(pb, "mdia");
718 mov_write_mdhd_tag(pb, track); 728 mov_write_mdhd_tag(pb, track);
719 mov_write_hdlr_tag(pb, track); 729 mov_write_hdlr_tag(pb, track);
720 mov_write_minf_tag(pb, track); 730 mov_write_minf_tag(pb, track);
803 return 0x34; 813 return 0x34;
804 } 814 }
805 815
806 static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack* track) 816 static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack* track)
807 { 817 {
808 int pos = url_ftell(pb); 818 offset_t pos = url_ftell(pb);
809 put_be32(pb, 0); /* size */ 819 put_be32(pb, 0); /* size */
810 put_tag(pb, "trak"); 820 put_tag(pb, "trak");
811 mov_write_tkhd_tag(pb, track); 821 mov_write_tkhd_tag(pb, track);
812 if (track->mode == MODE_PSP) 822 if (track->mode == MODE_PSP)
813 mov_write_edts_tag(pb, track); // PSP Movies require edts box 823 mov_write_edts_tag(pb, track); // PSP Movies require edts box
833 } 843 }
834 #endif 844 #endif
835 845
836 static int mov_write_mvhd_tag(ByteIOContext *pb, MOVContext *mov) 846 static int mov_write_mvhd_tag(ByteIOContext *pb, MOVContext *mov)
837 { 847 {
838 int maxTrackID = 1, maxTrackLen = 0, i; 848 int maxTrackID = 1, i;
839 int64_t maxTrackLenTemp; 849 int64_t maxTrackLenTemp, maxTrackLen = 0;
840 850
841 put_be32(pb, 0x6c); /* size (always 0x6c) */ 851 put_be32(pb, 0x6c); /* size (always 0x6c) */
842 put_tag(pb, "mvhd"); 852 put_tag(pb, "mvhd");
843 put_be32(pb, 0); /* version & flags */ 853 put_be32(pb, 0); /* version & flags */
844 put_be32(pb, mov->time); /* creation time */ 854 put_be32(pb, mov->time); /* creation time */
883 } 893 }
884 894
885 static int mov_write_itunes_hdlr_tag(ByteIOContext *pb, MOVContext* mov, 895 static int mov_write_itunes_hdlr_tag(ByteIOContext *pb, MOVContext* mov,
886 AVFormatContext *s) 896 AVFormatContext *s)
887 { 897 {
888 int pos = url_ftell(pb); 898 offset_t pos = url_ftell(pb);
889 put_be32(pb, 0); /* size */ 899 put_be32(pb, 0); /* size */
890 put_tag(pb, "hdlr"); 900 put_tag(pb, "hdlr");
891 put_be32(pb, 0); 901 put_be32(pb, 0);
892 put_be32(pb, 0); 902 put_be32(pb, 0);
893 put_tag(pb, "mdir"); 903 put_tag(pb, "mdir");
900 910
901 /* helper function to write a data tag with the specified string as data */ 911 /* helper function to write a data tag with the specified string as data */
902 static int mov_write_string_data_tag(ByteIOContext *pb, MOVContext* mov, 912 static int mov_write_string_data_tag(ByteIOContext *pb, MOVContext* mov,
903 AVFormatContext *s, const char *data) 913 AVFormatContext *s, const char *data)
904 { 914 {
905 int pos = url_ftell(pb); 915 offset_t pos = url_ftell(pb);
906 put_be32(pb, 0); /* size */ 916 put_be32(pb, 0); /* size */
907 put_tag(pb, "data"); 917 put_tag(pb, "data");
908 put_be32(pb, 1); 918 put_be32(pb, 1);
909 put_be32(pb, 0); 919 put_be32(pb, 0);
910 put_buffer(pb, data, strlen(data)); 920 put_buffer(pb, data, strlen(data));
915 static int mov_write_nam_tag(ByteIOContext *pb, MOVContext* mov, 925 static int mov_write_nam_tag(ByteIOContext *pb, MOVContext* mov,
916 AVFormatContext *s) 926 AVFormatContext *s)
917 { 927 {
918 int size = 0; 928 int size = 0;
919 if ( s->title[0] ) { 929 if ( s->title[0] ) {
920 int pos = url_ftell(pb); 930 offset_t pos = url_ftell(pb);
921 put_be32(pb, 0); /* size */ 931 put_be32(pb, 0); /* size */
922 put_tag(pb, "\251nam"); 932 put_tag(pb, "\251nam");
923 mov_write_string_data_tag(pb, mov, s, s->title); 933 mov_write_string_data_tag(pb, mov, s, s->title);
924 size = updateSize(pb, pos); 934 size = updateSize(pb, pos);
925 } 935 }
930 static int mov_write_ART_tag(ByteIOContext *pb, MOVContext* mov, 940 static int mov_write_ART_tag(ByteIOContext *pb, MOVContext* mov,
931 AVFormatContext *s) 941 AVFormatContext *s)
932 { 942 {
933 int size = 0; 943 int size = 0;
934 if ( s->author[0] ) { 944 if ( s->author[0] ) {
935 int pos = url_ftell(pb); 945 offset_t pos = url_ftell(pb);
936 put_be32(pb, 0); /* size */ 946 put_be32(pb, 0); /* size */
937 put_tag(pb, "\251ART"); 947 put_tag(pb, "\251ART");
938 // we use the author here as this is the only thing that we have... 948 // we use the author here as this is the only thing that we have...
939 mov_write_string_data_tag(pb, mov, s, s->author); 949 mov_write_string_data_tag(pb, mov, s, s->author);
940 size = updateSize(pb, pos); 950 size = updateSize(pb, pos);
946 static int mov_write_wrt_tag(ByteIOContext *pb, MOVContext* mov, 956 static int mov_write_wrt_tag(ByteIOContext *pb, MOVContext* mov,
947 AVFormatContext *s) 957 AVFormatContext *s)
948 { 958 {
949 int size = 0; 959 int size = 0;
950 if ( s->author[0] ) { 960 if ( s->author[0] ) {
951 int pos = url_ftell(pb); 961 offset_t pos = url_ftell(pb);
952 put_be32(pb, 0); /* size */ 962 put_be32(pb, 0); /* size */
953 put_tag(pb, "\251wrt"); 963 put_tag(pb, "\251wrt");
954 mov_write_string_data_tag(pb, mov, s, s->author); 964 mov_write_string_data_tag(pb, mov, s, s->author);
955 size = updateSize(pb, pos); 965 size = updateSize(pb, pos);
956 } 966 }
961 static int mov_write_alb_tag(ByteIOContext *pb, MOVContext* mov, 971 static int mov_write_alb_tag(ByteIOContext *pb, MOVContext* mov,
962 AVFormatContext *s) 972 AVFormatContext *s)
963 { 973 {
964 int size = 0; 974 int size = 0;
965 if ( s->album[0] ) { 975 if ( s->album[0] ) {
966 int pos = url_ftell(pb); 976 offset_t pos = url_ftell(pb);
967 put_be32(pb, 0); /* size */ 977 put_be32(pb, 0); /* size */
968 put_tag(pb, "\251alb"); 978 put_tag(pb, "\251alb");
969 mov_write_string_data_tag(pb, mov, s, s->album); 979 mov_write_string_data_tag(pb, mov, s, s->album);
970 size = updateSize(pb, pos); 980 size = updateSize(pb, pos);
971 } 981 }
977 AVFormatContext *s) 987 AVFormatContext *s)
978 { 988 {
979 char year[5]; 989 char year[5];
980 int size = 0; 990 int size = 0;
981 if ( s->year ) { 991 if ( s->year ) {
982 int pos = url_ftell(pb); 992 offset_t pos = url_ftell(pb);
983 put_be32(pb, 0); /* size */ 993 put_be32(pb, 0); /* size */
984 put_tag(pb, "\251day"); 994 put_tag(pb, "\251day");
985 snprintf(year, 5, "%04d", s->year); 995 snprintf(year, 5, "%04d", s->year);
986 mov_write_string_data_tag(pb, mov, s, year); 996 mov_write_string_data_tag(pb, mov, s, year);
987 size = updateSize(pb, pos); 997 size = updateSize(pb, pos);
991 1001
992 /* iTunes tool used to create the file */ 1002 /* iTunes tool used to create the file */
993 static int mov_write_too_tag(ByteIOContext *pb, MOVContext* mov, 1003 static int mov_write_too_tag(ByteIOContext *pb, MOVContext* mov,
994 AVFormatContext *s) 1004 AVFormatContext *s)
995 { 1005 {
996 int pos = url_ftell(pb); 1006 offset_t pos = url_ftell(pb);
997 put_be32(pb, 0); /* size */ 1007 put_be32(pb, 0); /* size */
998 put_tag(pb, "\251too"); 1008 put_tag(pb, "\251too");
999 mov_write_string_data_tag(pb, mov, s, LIBAVFORMAT_IDENT); 1009 mov_write_string_data_tag(pb, mov, s, LIBAVFORMAT_IDENT);
1000 return updateSize(pb, pos); 1010 return updateSize(pb, pos);
1001 } 1011 }
1004 static int mov_write_cmt_tag(ByteIOContext *pb, MOVContext* mov, 1014 static int mov_write_cmt_tag(ByteIOContext *pb, MOVContext* mov,
1005 AVFormatContext *s) 1015 AVFormatContext *s)
1006 { 1016 {
1007 int size = 0; 1017 int size = 0;
1008 if ( s->comment[0] ) { 1018 if ( s->comment[0] ) {
1009 int pos = url_ftell(pb); 1019 offset_t pos = url_ftell(pb);
1010 put_be32(pb, 0); /* size */ 1020 put_be32(pb, 0); /* size */
1011 put_tag(pb, "\251cmt"); 1021 put_tag(pb, "\251cmt");
1012 mov_write_string_data_tag(pb, mov, s, s->comment); 1022 mov_write_string_data_tag(pb, mov, s, s->comment);
1013 size = updateSize(pb, pos); 1023 size = updateSize(pb, pos);
1014 } 1024 }
1019 static int mov_write_gen_tag(ByteIOContext *pb, MOVContext* mov, 1029 static int mov_write_gen_tag(ByteIOContext *pb, MOVContext* mov,
1020 AVFormatContext *s) 1030 AVFormatContext *s)
1021 { 1031 {
1022 int size = 0; 1032 int size = 0;
1023 if ( s->genre[0] ) { 1033 if ( s->genre[0] ) {
1024 int pos = url_ftell(pb); 1034 offset_t pos = url_ftell(pb);
1025 put_be32(pb, 0); /* size */ 1035 put_be32(pb, 0); /* size */
1026 put_tag(pb, "\251gen"); 1036 put_tag(pb, "\251gen");
1027 mov_write_string_data_tag(pb, mov, s, s->genre); 1037 mov_write_string_data_tag(pb, mov, s, s->genre);
1028 size = updateSize(pb, pos); 1038 size = updateSize(pb, pos);
1029 } 1039 }
1034 static int mov_write_trkn_tag(ByteIOContext *pb, MOVContext* mov, 1044 static int mov_write_trkn_tag(ByteIOContext *pb, MOVContext* mov,
1035 AVFormatContext *s) 1045 AVFormatContext *s)
1036 { 1046 {
1037 int size = 0; 1047 int size = 0;
1038 if ( s->track ) { 1048 if ( s->track ) {
1039 int pos = url_ftell(pb); 1049 offset_t pos = url_ftell(pb);
1040 put_be32(pb, 0); /* size */ 1050 put_be32(pb, 0); /* size */
1041 put_tag(pb, "trkn"); 1051 put_tag(pb, "trkn");
1042 { 1052 {
1043 int pos = url_ftell(pb); 1053 offset_t pos = url_ftell(pb);
1044 put_be32(pb, 0); /* size */ 1054 put_be32(pb, 0); /* size */
1045 put_tag(pb, "data"); 1055 put_tag(pb, "data");
1046 put_be32(pb, 0); // 8 bytes empty 1056 put_be32(pb, 0); // 8 bytes empty
1047 put_be32(pb, 0); 1057 put_be32(pb, 0);
1048 put_be16(pb, 0); // empty 1058 put_be16(pb, 0); // empty
1058 1068
1059 /* iTunes meta data list */ 1069 /* iTunes meta data list */
1060 static int mov_write_ilst_tag(ByteIOContext *pb, MOVContext* mov, 1070 static int mov_write_ilst_tag(ByteIOContext *pb, MOVContext* mov,
1061 AVFormatContext *s) 1071 AVFormatContext *s)
1062 { 1072 {
1063 int pos = url_ftell(pb); 1073 offset_t pos = url_ftell(pb);
1064 put_be32(pb, 0); /* size */ 1074 put_be32(pb, 0); /* size */
1065 put_tag(pb, "ilst"); 1075 put_tag(pb, "ilst");
1066 mov_write_nam_tag(pb, mov, s); 1076 mov_write_nam_tag(pb, mov, s);
1067 mov_write_ART_tag(pb, mov, s); 1077 mov_write_ART_tag(pb, mov, s);
1068 mov_write_wrt_tag(pb, mov, s); 1078 mov_write_wrt_tag(pb, mov, s);
1082 int size = 0; 1092 int size = 0;
1083 1093
1084 // only save meta tag if required 1094 // only save meta tag if required
1085 if ( s->title[0] || s->author[0] || s->album[0] || s->year || 1095 if ( s->title[0] || s->author[0] || s->album[0] || s->year ||
1086 s->comment[0] || s->genre[0] || s->track ) { 1096 s->comment[0] || s->genre[0] || s->track ) {
1087 int pos = url_ftell(pb); 1097 offset_t pos = url_ftell(pb);
1088 put_be32(pb, 0); /* size */ 1098 put_be32(pb, 0); /* size */
1089 put_tag(pb, "meta"); 1099 put_tag(pb, "meta");
1090 put_be32(pb, 0); 1100 put_be32(pb, 0);
1091 mov_write_itunes_hdlr_tag(pb, mov, s); 1101 mov_write_itunes_hdlr_tag(pb, mov, s);
1092 mov_write_ilst_tag(pb, mov, s); 1102 mov_write_ilst_tag(pb, mov, s);
1096 } 1106 }
1097 1107
1098 static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov, 1108 static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov,
1099 AVFormatContext *s) 1109 AVFormatContext *s)
1100 { 1110 {
1101 int pos = url_ftell(pb); 1111 offset_t pos = url_ftell(pb);
1102 int i; 1112 int i;
1103 1113
1104 put_be32(pb, 0); /* size */ 1114 put_be32(pb, 0); /* size */
1105 put_tag(pb, "udta"); 1115 put_tag(pb, "udta");
1106 1116
1110 /* Requirements */ 1120 /* Requirements */
1111 for (i=0; i<MAX_STREAMS; i++) { 1121 for (i=0; i<MAX_STREAMS; i++) {
1112 if(mov->tracks[i].entry <= 0) continue; 1122 if(mov->tracks[i].entry <= 0) continue;
1113 if (mov->tracks[i].enc->codec_id == CODEC_ID_AAC || 1123 if (mov->tracks[i].enc->codec_id == CODEC_ID_AAC ||
1114 mov->tracks[i].enc->codec_id == CODEC_ID_MPEG4) { 1124 mov->tracks[i].enc->codec_id == CODEC_ID_MPEG4) {
1115 int pos = url_ftell(pb); 1125 offset_t pos = url_ftell(pb);
1116 put_be32(pb, 0); /* size */ 1126 put_be32(pb, 0); /* size */
1117 put_tag(pb, "\251req"); 1127 put_tag(pb, "\251req");
1118 put_be16(pb, sizeof("QuickTime 6.0 or greater") - 1); 1128 put_be16(pb, sizeof("QuickTime 6.0 or greater") - 1);
1119 put_be16(pb, 0); 1129 put_be16(pb, 0);
1120 put_buffer(pb, "QuickTime 6.0 or greater", 1130 put_buffer(pb, "QuickTime 6.0 or greater",
1125 } 1135 }
1126 1136
1127 /* Encoder */ 1137 /* Encoder */
1128 if(mov->tracks[0].enc && !(mov->tracks[0].enc->flags & CODEC_FLAG_BITEXACT)) 1138 if(mov->tracks[0].enc && !(mov->tracks[0].enc->flags & CODEC_FLAG_BITEXACT))
1129 { 1139 {
1130 int pos = url_ftell(pb); 1140 offset_t pos = url_ftell(pb);
1131 put_be32(pb, 0); /* size */ 1141 put_be32(pb, 0); /* size */
1132 put_tag(pb, "\251enc"); 1142 put_tag(pb, "\251enc");
1133 put_be16(pb, sizeof(LIBAVFORMAT_IDENT) - 1); /* string length */ 1143 put_be16(pb, sizeof(LIBAVFORMAT_IDENT) - 1); /* string length */
1134 put_be16(pb, 0); 1144 put_be16(pb, 0);
1135 put_buffer(pb, LIBAVFORMAT_IDENT, sizeof(LIBAVFORMAT_IDENT) - 1); 1145 put_buffer(pb, LIBAVFORMAT_IDENT, sizeof(LIBAVFORMAT_IDENT) - 1);
1136 updateSize(pb, pos); 1146 updateSize(pb, pos);
1137 } 1147 }
1138 1148
1139 if( s->title[0] ) 1149 if( s->title[0] )
1140 { 1150 {
1141 int pos = url_ftell(pb); 1151 offset_t pos = url_ftell(pb);
1142 put_be32(pb, 0); /* size */ 1152 put_be32(pb, 0); /* size */
1143 put_tag(pb, "\251nam"); 1153 put_tag(pb, "\251nam");
1144 put_be16(pb, strlen(s->title)); /* string length */ 1154 put_be16(pb, strlen(s->title)); /* string length */
1145 put_be16(pb, 0); 1155 put_be16(pb, 0);
1146 put_buffer(pb, s->title, strlen(s->title)); 1156 put_buffer(pb, s->title, strlen(s->title));
1147 updateSize(pb, pos); 1157 updateSize(pb, pos);
1148 } 1158 }
1149 1159
1150 if( s->author[0] ) 1160 if( s->author[0] )
1151 { 1161 {
1152 int pos = url_ftell(pb); 1162 offset_t pos = url_ftell(pb);
1153 put_be32(pb, 0); /* size */ 1163 put_be32(pb, 0); /* size */
1154 put_tag(pb, /*"\251aut"*/ "\251day" ); 1164 put_tag(pb, /*"\251aut"*/ "\251day" );
1155 put_be16(pb, strlen(s->author)); /* string length */ 1165 put_be16(pb, strlen(s->author)); /* string length */
1156 put_be16(pb, 0); 1166 put_be16(pb, 0);
1157 put_buffer(pb, s->author, strlen(s->author)); 1167 put_buffer(pb, s->author, strlen(s->author));
1158 updateSize(pb, pos); 1168 updateSize(pb, pos);
1159 } 1169 }
1160 1170
1161 if( s->comment[0] ) 1171 if( s->comment[0] )
1162 { 1172 {
1163 int pos = url_ftell(pb); 1173 offset_t pos = url_ftell(pb);
1164 put_be32(pb, 0); /* size */ 1174 put_be32(pb, 0); /* size */
1165 put_tag(pb, "\251des"); 1175 put_tag(pb, "\251des");
1166 put_be16(pb, strlen(s->comment)); /* string length */ 1176 put_be16(pb, strlen(s->comment)); /* string length */
1167 put_be16(pb, 0); 1177 put_be16(pb, 0);
1168 put_buffer(pb, s->comment, strlen(s->comment)); 1178 put_buffer(pb, s->comment, strlen(s->comment));
1173 } 1183 }
1174 1184
1175 static int mov_write_moov_tag(ByteIOContext *pb, MOVContext *mov, 1185 static int mov_write_moov_tag(ByteIOContext *pb, MOVContext *mov,
1176 AVFormatContext *s) 1186 AVFormatContext *s)
1177 { 1187 {
1178 int pos, i; 1188 int i;
1179 pos = url_ftell(pb); 1189 offset_t pos = url_ftell(pb);
1180 put_be32(pb, 0); /* size placeholder*/ 1190 put_be32(pb, 0); /* size placeholder*/
1181 put_tag(pb, "moov"); 1191 put_tag(pb, "moov");
1182 mov->timescale = globalTimescale; 1192 mov->timescale = globalTimescale;
1183 1193
1184 for (i=0; i<MAX_STREAMS; i++) { 1194 for (i=0; i<MAX_STREAMS; i++) {
1219 return updateSize(pb, pos); 1229 return updateSize(pb, pos);
1220 } 1230 }
1221 1231
1222 int mov_write_mdat_tag(ByteIOContext *pb, MOVContext* mov) 1232 int mov_write_mdat_tag(ByteIOContext *pb, MOVContext* mov)
1223 { 1233 {
1234 put_be32(pb, 8); // placeholder for extended size field (64 bit)
1235 put_tag(pb, "wide");
1236
1224 mov->mdat_pos = url_ftell(pb); 1237 mov->mdat_pos = url_ftell(pb);
1225 put_be32(pb, 0); /* size placeholder*/ 1238 put_be32(pb, 0); /* size placeholder*/
1226 put_tag(pb, "mdat"); 1239 put_tag(pb, "mdat");
1227 return 0; 1240 return 0;
1228 } 1241 }
1458 static int mov_write_trailer(AVFormatContext *s) 1471 static int mov_write_trailer(AVFormatContext *s)
1459 { 1472 {
1460 MOVContext *mov = s->priv_data; 1473 MOVContext *mov = s->priv_data;
1461 ByteIOContext *pb = &s->pb; 1474 ByteIOContext *pb = &s->pb;
1462 int res = 0; 1475 int res = 0;
1463 int i, j; 1476 int i;
1477 uint64_t j;
1464 1478
1465 offset_t moov_pos = url_ftell(pb); 1479 offset_t moov_pos = url_ftell(pb);
1466 1480
1467 /* Write size of mdat tag */ 1481 /* Write size of mdat tag */
1468 for (i=0, j=0; i<MAX_STREAMS; i++) { 1482 for (i=0, j=0; i<MAX_STREAMS; i++) {
1469 if(mov->tracks[i].ents_allocated > 0) { 1483 if(mov->tracks[i].ents_allocated > 0) {
1470 j += mov->tracks[i].mdat_size; 1484 j += mov->tracks[i].mdat_size;
1471 } 1485 }
1472 } 1486 }
1473 url_fseek(pb, mov->mdat_pos, SEEK_SET); 1487 if (j+8 <= UINT32_MAX) {
1474 put_be32(pb, j+8); 1488 url_fseek(pb, mov->mdat_pos, SEEK_SET);
1489 put_be32(pb, j+8);
1490 } else {
1491 /* overwrite 'wide' placeholder atom */
1492 url_fseek(pb, mov->mdat_pos - 8, SEEK_SET);
1493 put_be32(pb, 1); /* special value: real atom size will be 64 bit value after tag field */
1494 put_tag(pb, "mdat");
1495 put_be64(pb, j+16);
1496 }
1475 url_fseek(pb, moov_pos, SEEK_SET); 1497 url_fseek(pb, moov_pos, SEEK_SET);
1476 1498
1477 mov_write_moov_tag(pb, mov, s); 1499 mov_write_moov_tag(pb, mov, s);
1478 1500
1479 for (i=0; i<MAX_STREAMS; i++) { 1501 for (i=0; i<MAX_STREAMS; i++) {