Mercurial > libavformat.hg
comparison movenc.c @ 3446:7d73c4a64714 libavformat
cosmetics
author | bcoudurier |
---|---|
date | Mon, 09 Jun 2008 18:23:06 +0000 |
parents | 7a0230981402 |
children | 06ab88083127 |
comparison
equal
deleted
inserted
replaced
3445:4a1ecbbf5725 | 3446:7d73c4a64714 |
---|---|
79 long timescale; | 79 long timescale; |
80 MOVTrack tracks[MAX_STREAMS]; | 80 MOVTrack tracks[MAX_STREAMS]; |
81 } MOVContext; | 81 } MOVContext; |
82 | 82 |
83 //FIXME support 64 bit variant with wide placeholders | 83 //FIXME support 64 bit variant with wide placeholders |
84 static offset_t updateSize (ByteIOContext *pb, offset_t pos) | 84 static offset_t updateSize(ByteIOContext *pb, offset_t pos) |
85 { | 85 { |
86 offset_t curpos = url_ftell(pb); | 86 offset_t curpos = url_ftell(pb); |
87 url_fseek(pb, pos, SEEK_SET); | 87 url_fseek(pb, pos, SEEK_SET); |
88 put_be32(pb, curpos - pos); /* rewrite size */ | 88 put_be32(pb, curpos - pos); /* rewrite size */ |
89 url_fseek(pb, curpos, SEEK_SET); | 89 url_fseek(pb, curpos, SEEK_SET); |
90 | 90 |
91 return curpos - pos; | 91 return curpos - pos; |
92 } | 92 } |
93 | 93 |
94 /* Chunk offset atom */ | 94 /* Chunk offset atom */ |
95 static int mov_write_stco_tag(ByteIOContext *pb, MOVTrack* track) | 95 static int mov_write_stco_tag(ByteIOContext *pb, MOVTrack *track) |
96 { | 96 { |
97 int i; | 97 int i; |
98 int mode64 = 0; // use 32 bit size variant if possible | 98 int mode64 = 0; // use 32 bit size variant if possible |
99 offset_t pos = url_ftell(pb); | 99 offset_t pos = url_ftell(pb); |
100 put_be32(pb, 0); /* size */ | 100 put_be32(pb, 0); /* size */ |
113 } | 113 } |
114 return updateSize (pb, pos); | 114 return updateSize (pb, pos); |
115 } | 115 } |
116 | 116 |
117 /* Sample size atom */ | 117 /* Sample size atom */ |
118 static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack* track) | 118 static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack *track) |
119 { | 119 { |
120 int equalChunks = 1; | 120 int equalChunks = 1; |
121 int i, j, entries = 0, tst = -1, oldtst = -1; | 121 int i, j, entries = 0, tst = -1, oldtst = -1; |
122 | 122 |
123 offset_t pos = url_ftell(pb); | 123 offset_t pos = url_ftell(pb); |
150 } | 150 } |
151 return updateSize (pb, pos); | 151 return updateSize (pb, pos); |
152 } | 152 } |
153 | 153 |
154 /* Sample to chunk atom */ | 154 /* Sample to chunk atom */ |
155 static int mov_write_stsc_tag(ByteIOContext *pb, MOVTrack* track) | 155 static int mov_write_stsc_tag(ByteIOContext *pb, MOVTrack *track) |
156 { | 156 { |
157 int index = 0, oldval = -1, i; | 157 int index = 0, oldval = -1, i; |
158 offset_t entryPos, curpos; | 158 offset_t entryPos, curpos; |
159 | 159 |
160 offset_t pos = url_ftell(pb); | 160 offset_t pos = url_ftell(pb); |
180 | 180 |
181 return updateSize (pb, pos); | 181 return updateSize (pb, pos); |
182 } | 182 } |
183 | 183 |
184 /* Sync sample atom */ | 184 /* Sync sample atom */ |
185 static int mov_write_stss_tag(ByteIOContext *pb, MOVTrack* track) | 185 static int mov_write_stss_tag(ByteIOContext *pb, MOVTrack *track) |
186 { | 186 { |
187 offset_t curpos, entryPos; | 187 offset_t curpos, entryPos; |
188 int i, index = 0; | 188 int i, index = 0; |
189 offset_t pos = url_ftell(pb); | 189 offset_t pos = url_ftell(pb); |
190 put_be32(pb, 0); // size | 190 put_be32(pb, 0); // size |
251 for(; i>0; i--) | 251 for(; i>0; i--) |
252 put_byte(pb, (size>>(7*i)) | 0x80); | 252 put_byte(pb, (size>>(7*i)) | 0x80); |
253 put_byte(pb, size & 0x7F); | 253 put_byte(pb, size & 0x7F); |
254 } | 254 } |
255 | 255 |
256 static int mov_write_esds_tag(ByteIOContext *pb, MOVTrack* track) // Basic | 256 static int mov_write_esds_tag(ByteIOContext *pb, MOVTrack *track) // Basic |
257 { | 257 { |
258 offset_t pos = url_ftell(pb); | 258 offset_t pos = url_ftell(pb); |
259 int decoderSpecificInfoLen = track->vosLen ? descrLength(track->vosLen):0; | 259 int decoderSpecificInfoLen = track->vosLen ? descrLength(track->vosLen):0; |
260 | 260 |
261 put_be32(pb, 0); // size | 261 put_be32(pb, 0); // size |
300 putDescr(pb, 0x06, 1); | 300 putDescr(pb, 0x06, 1); |
301 put_byte(pb, 0x02); | 301 put_byte(pb, 0x02); |
302 return updateSize (pb, pos); | 302 return updateSize (pb, pos); |
303 } | 303 } |
304 | 304 |
305 static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack* track) | 305 static int mov_write_wave_tag(ByteIOContext *pb, MOVTrack *track) |
306 { | 306 { |
307 offset_t pos = url_ftell(pb); | 307 offset_t pos = url_ftell(pb); |
308 | 308 |
309 put_be32(pb, 0); /* size */ | 309 put_be32(pb, 0); /* size */ |
310 put_tag(pb, "wave"); | 310 put_tag(pb, "wave"); |
332 put_be32(pb, 0); /* null tag */ | 332 put_be32(pb, 0); /* null tag */ |
333 | 333 |
334 return updateSize (pb, pos); | 334 return updateSize (pb, pos); |
335 } | 335 } |
336 | 336 |
337 static int mov_write_glbl_tag(ByteIOContext *pb, MOVTrack* track) | 337 static int mov_write_glbl_tag(ByteIOContext *pb, MOVTrack *track) |
338 { | 338 { |
339 put_be32(pb, track->vosLen+8); | 339 put_be32(pb, track->vosLen+8); |
340 put_tag(pb, "glbl"); | 340 put_tag(pb, "glbl"); |
341 put_buffer(pb, track->vosData, track->vosLen); | 341 put_buffer(pb, track->vosData, track->vosLen); |
342 return 8+track->vosLen; | 342 return 8+track->vosLen; |
343 } | 343 } |
344 | 344 |
345 static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack* track) | 345 static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack *track) |
346 { | 346 { |
347 offset_t pos = url_ftell(pb); | 347 offset_t pos = url_ftell(pb); |
348 int version = track->mode == MODE_MOV && | 348 int version = track->mode == MODE_MOV && |
349 (track->audio_vbr || | 349 (track->audio_vbr || |
350 track->enc->codec_id == CODEC_ID_PCM_S32LE || | 350 track->enc->codec_id == CODEC_ID_PCM_S32LE || |
567 put_be32(pb, 0xcf0323f3); | 567 put_be32(pb, 0xcf0323f3); |
568 put_be32(pb, 0x0); | 568 put_be32(pb, 0x0); |
569 return 28; | 569 return 28; |
570 } | 570 } |
571 | 571 |
572 static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track) | 572 static int mov_write_video_tag(ByteIOContext *pb, MOVTrack *track) |
573 { | 573 { |
574 offset_t pos = url_ftell(pb); | 574 offset_t pos = url_ftell(pb); |
575 char compressor_name[32]; | 575 char compressor_name[32]; |
576 | 576 |
577 put_be32(pb, 0); /* size */ | 577 put_be32(pb, 0); /* size */ |
631 mov_write_glbl_tag(pb, track); | 631 mov_write_glbl_tag(pb, track); |
632 | 632 |
633 return updateSize (pb, pos); | 633 return updateSize (pb, pos); |
634 } | 634 } |
635 | 635 |
636 static int mov_write_stsd_tag(ByteIOContext *pb, MOVTrack* track) | 636 static int mov_write_stsd_tag(ByteIOContext *pb, MOVTrack *track) |
637 { | 637 { |
638 offset_t pos = url_ftell(pb); | 638 offset_t pos = url_ftell(pb); |
639 put_be32(pb, 0); /* size */ | 639 put_be32(pb, 0); /* size */ |
640 put_tag(pb, "stsd"); | 640 put_tag(pb, "stsd"); |
641 put_be32(pb, 0); /* version & flags */ | 641 put_be32(pb, 0); /* version & flags */ |
645 else if (track->enc->codec_type == CODEC_TYPE_AUDIO) | 645 else if (track->enc->codec_type == CODEC_TYPE_AUDIO) |
646 mov_write_audio_tag(pb, track); | 646 mov_write_audio_tag(pb, track); |
647 return updateSize(pb, pos); | 647 return updateSize(pb, pos); |
648 } | 648 } |
649 | 649 |
650 static int mov_write_ctts_tag(ByteIOContext *pb, MOVTrack* track) | 650 static int mov_write_ctts_tag(ByteIOContext *pb, MOVTrack *track) |
651 { | 651 { |
652 MOV_stts_t *ctts_entries; | 652 MOV_stts_t *ctts_entries; |
653 uint32_t entries = 0; | 653 uint32_t entries = 0; |
654 uint32_t atom_size; | 654 uint32_t atom_size; |
655 int i; | 655 int i; |
679 av_free(ctts_entries); | 679 av_free(ctts_entries); |
680 return atom_size; | 680 return atom_size; |
681 } | 681 } |
682 | 682 |
683 /* Time to sample atom */ | 683 /* Time to sample atom */ |
684 static int mov_write_stts_tag(ByteIOContext *pb, MOVTrack* track) | 684 static int mov_write_stts_tag(ByteIOContext *pb, MOVTrack *track) |
685 { | 685 { |
686 MOV_stts_t *stts_entries; | 686 MOV_stts_t *stts_entries; |
687 uint32_t entries = -1; | 687 uint32_t entries = -1; |
688 uint32_t atom_size; | 688 uint32_t atom_size; |
689 int i; | 689 int i; |
734 put_be32(pb, 1); /* version & flags */ | 734 put_be32(pb, 1); /* version & flags */ |
735 | 735 |
736 return 28; | 736 return 28; |
737 } | 737 } |
738 | 738 |
739 static int mov_write_stbl_tag(ByteIOContext *pb, MOVTrack* track) | 739 static int mov_write_stbl_tag(ByteIOContext *pb, MOVTrack *track) |
740 { | 740 { |
741 offset_t pos = url_ftell(pb); | 741 offset_t pos = url_ftell(pb); |
742 put_be32(pb, 0); /* size */ | 742 put_be32(pb, 0); /* size */ |
743 put_tag(pb, "stbl"); | 743 put_tag(pb, "stbl"); |
744 mov_write_stsd_tag(pb, track); | 744 mov_write_stsd_tag(pb, track); |
781 put_be32(pb, 0x01); /* version & flags */ | 781 put_be32(pb, 0x01); /* version & flags */ |
782 put_be64(pb, 0); /* reserved (graphics mode = copy) */ | 782 put_be64(pb, 0); /* reserved (graphics mode = copy) */ |
783 return 0x14; | 783 return 0x14; |
784 } | 784 } |
785 | 785 |
786 static int mov_write_hdlr_tag(ByteIOContext *pb, MOVTrack* track) | 786 static int mov_write_hdlr_tag(ByteIOContext *pb, MOVTrack *track) |
787 { | 787 { |
788 const char *descr, *hdlr, *hdlr_type; | 788 const char *descr, *hdlr, *hdlr_type; |
789 offset_t pos = url_ftell(pb); | 789 offset_t pos = url_ftell(pb); |
790 | 790 |
791 if (!track) { /* no media --> data handler */ | 791 if (!track) { /* no media --> data handler */ |
814 put_byte(pb, strlen(descr)); /* string counter */ | 814 put_byte(pb, strlen(descr)); /* string counter */ |
815 put_buffer(pb, descr, strlen(descr)); /* handler description */ | 815 put_buffer(pb, descr, strlen(descr)); /* handler description */ |
816 return updateSize(pb, pos); | 816 return updateSize(pb, pos); |
817 } | 817 } |
818 | 818 |
819 static int mov_write_minf_tag(ByteIOContext *pb, MOVTrack* track) | 819 static int mov_write_minf_tag(ByteIOContext *pb, MOVTrack *track) |
820 { | 820 { |
821 offset_t pos = url_ftell(pb); | 821 offset_t pos = url_ftell(pb); |
822 put_be32(pb, 0); /* size */ | 822 put_be32(pb, 0); /* size */ |
823 put_tag(pb, "minf"); | 823 put_tag(pb, "minf"); |
824 if(track->enc->codec_type == CODEC_TYPE_VIDEO) | 824 if(track->enc->codec_type == CODEC_TYPE_VIDEO) |
830 mov_write_dinf_tag(pb); | 830 mov_write_dinf_tag(pb); |
831 mov_write_stbl_tag(pb, track); | 831 mov_write_stbl_tag(pb, track); |
832 return updateSize(pb, pos); | 832 return updateSize(pb, pos); |
833 } | 833 } |
834 | 834 |
835 static int mov_write_mdhd_tag(ByteIOContext *pb, MOVTrack* track) | 835 static int mov_write_mdhd_tag(ByteIOContext *pb, MOVTrack *track) |
836 { | 836 { |
837 int version = track->trackDuration < INT32_MAX ? 0 : 1; | 837 int version = track->trackDuration < INT32_MAX ? 0 : 1; |
838 | 838 |
839 (version == 1) ? put_be32(pb, 44) : put_be32(pb, 32); /* size */ | 839 (version == 1) ? put_be32(pb, 44) : put_be32(pb, 32); /* size */ |
840 put_tag(pb, "mdhd"); | 840 put_tag(pb, "mdhd"); |
860 } | 860 } |
861 | 861 |
862 return 32; | 862 return 32; |
863 } | 863 } |
864 | 864 |
865 static int mov_write_mdia_tag(ByteIOContext *pb, MOVTrack* track) | 865 static int mov_write_mdia_tag(ByteIOContext *pb, MOVTrack *track) |
866 { | 866 { |
867 offset_t pos = url_ftell(pb); | 867 offset_t pos = url_ftell(pb); |
868 put_be32(pb, 0); /* size */ | 868 put_be32(pb, 0); /* size */ |
869 put_tag(pb, "mdia"); | 869 put_tag(pb, "mdia"); |
870 mov_write_mdhd_tag(pb, track); | 870 mov_write_mdhd_tag(pb, track); |
871 mov_write_hdlr_tag(pb, track); | 871 mov_write_hdlr_tag(pb, track); |
872 mov_write_minf_tag(pb, track); | 872 mov_write_minf_tag(pb, track); |
873 return updateSize(pb, pos); | 873 return updateSize(pb, pos); |
874 } | 874 } |
875 | 875 |
876 static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack* track) | 876 static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track) |
877 { | 877 { |
878 int64_t duration = av_rescale_rnd(track->trackDuration, globalTimescale, track->timescale, AV_ROUND_UP); | 878 int64_t duration = av_rescale_rnd(track->trackDuration, globalTimescale, track->timescale, AV_ROUND_UP); |
879 int version = duration < INT32_MAX ? 0 : 1; | 879 int version = duration < INT32_MAX ? 0 : 1; |
880 | 880 |
881 (version == 1) ? put_be32(pb, 104) : put_be32(pb, 92); /* size */ | 881 (version == 1) ? put_be32(pb, 104) : put_be32(pb, 92); /* size */ |
962 put_be32(pb, 0x1); | 962 put_be32(pb, 0x1); |
963 put_be32(pb, 0x0); | 963 put_be32(pb, 0x0); |
964 return 0x34; | 964 return 0x34; |
965 } | 965 } |
966 | 966 |
967 static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack* track) | 967 static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack *track) |
968 { | 968 { |
969 offset_t pos = url_ftell(pb); | 969 offset_t pos = url_ftell(pb); |
970 put_be32(pb, 0); /* size */ | 970 put_be32(pb, 0); /* size */ |
971 put_tag(pb, "trak"); | 971 put_tag(pb, "trak"); |
972 mov_write_tkhd_tag(pb, track); | 972 mov_write_tkhd_tag(pb, track); |
1050 put_be32(pb, 0); /* reserved (current time) */ | 1050 put_be32(pb, 0); /* reserved (current time) */ |
1051 put_be32(pb, maxTrackID+1); /* Next track id */ | 1051 put_be32(pb, maxTrackID+1); /* Next track id */ |
1052 return 0x6c; | 1052 return 0x6c; |
1053 } | 1053 } |
1054 | 1054 |
1055 static int mov_write_itunes_hdlr_tag(ByteIOContext *pb, MOVContext* mov, | 1055 static int mov_write_itunes_hdlr_tag(ByteIOContext *pb, MOVContext *mov, |
1056 AVFormatContext *s) | 1056 AVFormatContext *s) |
1057 { | 1057 { |
1058 offset_t pos = url_ftell(pb); | 1058 offset_t pos = url_ftell(pb); |
1059 put_be32(pb, 0); /* size */ | 1059 put_be32(pb, 0); /* size */ |
1060 put_tag(pb, "hdlr"); | 1060 put_tag(pb, "hdlr"); |
1109 }else | 1109 }else |
1110 return 0; | 1110 return 0; |
1111 } | 1111 } |
1112 | 1112 |
1113 /* iTunes track number */ | 1113 /* iTunes track number */ |
1114 static int mov_write_trkn_tag(ByteIOContext *pb, MOVContext* mov, | 1114 static int mov_write_trkn_tag(ByteIOContext *pb, MOVContext *mov, |
1115 AVFormatContext *s) | 1115 AVFormatContext *s) |
1116 { | 1116 { |
1117 int size = 0; | 1117 int size = 0; |
1118 if (s->track) { | 1118 if (s->track) { |
1119 offset_t pos = url_ftell(pb); | 1119 offset_t pos = url_ftell(pb); |
1135 } | 1135 } |
1136 return size; | 1136 return size; |
1137 } | 1137 } |
1138 | 1138 |
1139 /* iTunes meta data list */ | 1139 /* iTunes meta data list */ |
1140 static int mov_write_ilst_tag(ByteIOContext *pb, MOVContext* mov, | 1140 static int mov_write_ilst_tag(ByteIOContext *pb, MOVContext *mov, |
1141 AVFormatContext *s) | 1141 AVFormatContext *s) |
1142 { | 1142 { |
1143 offset_t pos = url_ftell(pb); | 1143 offset_t pos = url_ftell(pb); |
1144 put_be32(pb, 0); /* size */ | 1144 put_be32(pb, 0); /* size */ |
1145 put_tag(pb, "ilst"); | 1145 put_tag(pb, "ilst"); |
1155 mov_write_trkn_tag(pb, mov, s); | 1155 mov_write_trkn_tag(pb, mov, s); |
1156 return updateSize(pb, pos); | 1156 return updateSize(pb, pos); |
1157 } | 1157 } |
1158 | 1158 |
1159 /* iTunes meta data tag */ | 1159 /* iTunes meta data tag */ |
1160 static int mov_write_meta_tag(ByteIOContext *pb, MOVContext* mov, | 1160 static int mov_write_meta_tag(ByteIOContext *pb, MOVContext *mov, |
1161 AVFormatContext *s) | 1161 AVFormatContext *s) |
1162 { | 1162 { |
1163 int size = 0; | 1163 int size = 0; |
1164 | 1164 |
1165 // only save meta tag if required | 1165 // only save meta tag if required |
1174 size = updateSize(pb, pos); | 1174 size = updateSize(pb, pos); |
1175 } | 1175 } |
1176 return size; | 1176 return size; |
1177 } | 1177 } |
1178 | 1178 |
1179 static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov, | 1179 static int mov_write_udta_tag(ByteIOContext *pb, MOVContext *mov, |
1180 AVFormatContext *s) | 1180 AVFormatContext *s) |
1181 { | 1181 { |
1182 int i, req = 0; | 1182 int i, req = 0; |
1183 | 1183 |
1184 /* Requirements */ | 1184 /* Requirements */ |
1222 } | 1222 } |
1223 | 1223 |
1224 return 0; | 1224 return 0; |
1225 } | 1225 } |
1226 | 1226 |
1227 static int utf8len(const uint8_t *b){ | 1227 static int utf8len(const uint8_t *b) |
1228 { | |
1228 int len=0; | 1229 int len=0; |
1229 int val; | 1230 int val; |
1230 while(*b){ | 1231 while(*b){ |
1231 GET_UTF8(val, *b++, return -1;) | 1232 GET_UTF8(val, *b++, return -1;) |
1232 len++; | 1233 len++; |
1233 } | 1234 } |
1234 return len; | 1235 return len; |
1235 } | 1236 } |
1236 | 1237 |
1237 static int ascii_to_wc (ByteIOContext *pb, const uint8_t *b) | 1238 static int ascii_to_wc(ByteIOContext *pb, const uint8_t *b) |
1238 { | 1239 { |
1239 int val; | 1240 int val; |
1240 while(*b){ | 1241 while(*b){ |
1241 GET_UTF8(val, *b++, return -1;) | 1242 GET_UTF8(val, *b++, return -1;) |
1242 put_be16(pb, val); | 1243 put_be16(pb, val); |
1243 } | 1244 } |
1244 put_be16(pb, 0x00); | 1245 put_be16(pb, 0x00); |
1245 return 0; | 1246 return 0; |
1246 } | 1247 } |
1247 | 1248 |
1248 static uint16_t language_code (const char *str) | 1249 static uint16_t language_code(const char *str) |
1249 { | 1250 { |
1250 return (((str[0]-0x60) & 0x1F) << 10) + (((str[1]-0x60) & 0x1F) << 5) + ((str[2]-0x60) & 0x1F); | 1251 return (((str[0]-0x60) & 0x1F) << 10) + (((str[1]-0x60) & 0x1F) << 5) + ((str[2]-0x60) & 0x1F); |
1251 } | 1252 } |
1252 | 1253 |
1253 static int mov_write_uuidusmt_tag (ByteIOContext *pb, AVFormatContext *s) | 1254 static int mov_write_uuidusmt_tag(ByteIOContext *pb, AVFormatContext *s) |
1254 { | 1255 { |
1255 size_t len, size; | 1256 size_t len, size; |
1256 offset_t pos, curpos; | 1257 offset_t pos, curpos; |
1257 | 1258 |
1258 size = 0; | 1259 size = 0; |
1358 mov_write_udta_tag(pb, mov, s); | 1359 mov_write_udta_tag(pb, mov, s); |
1359 | 1360 |
1360 return updateSize(pb, pos); | 1361 return updateSize(pb, pos); |
1361 } | 1362 } |
1362 | 1363 |
1363 static int mov_write_mdat_tag(ByteIOContext *pb, MOVContext* mov) | 1364 static int mov_write_mdat_tag(ByteIOContext *pb, MOVContext *mov) |
1364 { | 1365 { |
1365 put_be32(pb, 8); // placeholder for extended size field (64 bit) | 1366 put_be32(pb, 8); // placeholder for extended size field (64 bit) |
1366 put_tag(pb, mov->mode == MODE_MOV ? "wide" : "free"); | 1367 put_tag(pb, mov->mode == MODE_MOV ? "wide" : "free"); |
1367 | 1368 |
1368 mov->mdat_pos = url_ftell(pb); | 1369 mov->mdat_pos = url_ftell(pb); |