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);