📄 movenc.c
字号:
{ put_be32(pb, 0x34); /* size ... reports as 28 in mp4box! */ put_tag(pb, "uuid"); put_tag(pb, "USMT"); put_be32(pb, 0x21d24fce); put_be32(pb, 0xbb88695c); put_be32(pb, 0xfac9c740); put_be32(pb, 0x1c); // another size here! put_tag(pb, "MTDT"); put_be32(pb, 0x00010012); put_be32(pb, 0x0a); put_be32(pb, 0x55c40000); put_be32(pb, 0x1); put_be32(pb, 0x0); return 0x34;}static int mov_write_trak_tag(ByteIOContext *pb, MOVTrack* track){ int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "trak"); mov_write_tkhd_tag(pb, track); if (track->mode == MODE_PSP) mov_write_edts_tag(pb, track); // PSP Movies require edts box mov_write_mdia_tag(pb, track); if (track->mode == MODE_PSP) mov_write_uuid_tag_psp(pb,track); // PSP Movies require this uuid box return updateSize(pb, pos);}#if 0/* TODO: Not sorted out, but not necessary either */static int mov_write_iods_tag(ByteIOContext *pb, MOVContext *mov){ put_be32(pb, 0x15); /* size */ put_tag(pb, "iods"); put_be32(pb, 0); /* version & flags */ put_be16(pb, 0x1007); put_byte(pb, 0); put_be16(pb, 0x4fff); put_be16(pb, 0xfffe); put_be16(pb, 0x01ff); return 0x15;}#endifstatic int mov_write_mvhd_tag(ByteIOContext *pb, MOVContext *mov){ int maxTrackID = 1, maxTrackLen = 0, i; int64_t maxTrackLenTemp; put_be32(pb, 0x6c); /* size (always 0x6c) */ put_tag(pb, "mvhd"); put_be32(pb, 0); /* version & flags */ put_be32(pb, mov->time); /* creation time */ put_be32(pb, mov->time); /* modification time */ put_be32(pb, mov->timescale); /* timescale */ for (i=0; i<MAX_STREAMS; i++) { if(mov->tracks[i].entry > 0) { maxTrackLenTemp = av_rescale_rnd(mov->tracks[i].trackDuration, globalTimescale, mov->tracks[i].timescale, AV_ROUND_UP); if(maxTrackLen < maxTrackLenTemp) maxTrackLen = maxTrackLenTemp; if(maxTrackID < mov->tracks[i].trackID) maxTrackID = mov->tracks[i].trackID; } } put_be32(pb, maxTrackLen); /* duration of longest track */ put_be32(pb, 0x00010000); /* reserved (preferred rate) 1.0 = normal */ put_be16(pb, 0x0100); /* reserved (preferred volume) 1.0 = normal */ put_be16(pb, 0); /* reserved */ put_be32(pb, 0); /* reserved */ put_be32(pb, 0); /* reserved */ /* Matrix structure */ put_be32(pb, 0x00010000); /* reserved */ put_be32(pb, 0x0); /* reserved */ put_be32(pb, 0x0); /* reserved */ put_be32(pb, 0x0); /* reserved */ put_be32(pb, 0x00010000); /* reserved */ put_be32(pb, 0x0); /* reserved */ put_be32(pb, 0x0); /* reserved */ put_be32(pb, 0x0); /* reserved */ put_be32(pb, 0x40000000); /* reserved */ put_be32(pb, 0); /* reserved (preview time) */ put_be32(pb, 0); /* reserved (preview duration) */ put_be32(pb, 0); /* reserved (poster time) */ put_be32(pb, 0); /* reserved (selection time) */ put_be32(pb, 0); /* reserved (selection duration) */ put_be32(pb, 0); /* reserved (current time) */ put_be32(pb, maxTrackID+1); /* Next track id */ return 0x6c;}static int mov_write_itunes_hdlr_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "hdlr"); put_be32(pb, 0); put_be32(pb, 0); put_tag(pb, "mdir"); put_tag(pb, "appl"); put_be32(pb, 0); put_be32(pb, 0); put_be16(pb, 0); return updateSize(pb, pos);}/* helper function to write a data tag with the specified string as data */static int mov_write_string_data_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s, const char *data){ int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "data"); put_be32(pb, 1); put_be32(pb, 0); put_buffer(pb, data, strlen(data)); return updateSize(pb, pos);}/* iTunes name of the song/movie */static int mov_write_nam_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int size = 0; if ( s->title[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251nam"); mov_write_string_data_tag(pb, mov, s, s->title); size = updateSize(pb, pos); } return size;}/* iTunes name of the artist/performer */static int mov_write_ART_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int size = 0; if ( s->author[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251ART"); // we use the author here as this is the only thing that we have... mov_write_string_data_tag(pb, mov, s, s->author); size = updateSize(pb, pos); } return size;}/* iTunes name of the writer */static int mov_write_wrt_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int size = 0; if ( s->author[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251wrt"); mov_write_string_data_tag(pb, mov, s, s->author); size = updateSize(pb, pos); } return size;}/* iTunes name of the album */static int mov_write_alb_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int size = 0; if ( s->album[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251alb"); mov_write_string_data_tag(pb, mov, s, s->album); size = updateSize(pb, pos); } return size;}/* iTunes year */static int mov_write_day_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ char year[5]; int size = 0; if ( s->year ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251day"); snprintf(year, 5, "%04d", s->year); mov_write_string_data_tag(pb, mov, s, year); size = updateSize(pb, pos); } return size;}/* iTunes tool used to create the file */static int mov_write_too_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251too"); mov_write_string_data_tag(pb, mov, s, LIBAVFORMAT_IDENT); return updateSize(pb, pos);}/* iTunes comment */static int mov_write_cmt_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int size = 0; if ( s->comment[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251cmt"); mov_write_string_data_tag(pb, mov, s, s->comment); size = updateSize(pb, pos); } return size;}/* iTunes custom genre */static int mov_write_gen_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int size = 0; if ( s->genre[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251gen"); mov_write_string_data_tag(pb, mov, s, s->genre); size = updateSize(pb, pos); } return size;}/* iTunes track number */static int mov_write_trkn_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int size = 0; if ( s->track ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "trkn"); { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "data"); put_be32(pb, 0); // 8 bytes empty put_be32(pb, 0); put_be16(pb, 0); // empty put_be16(pb, s->track); // track number put_be16(pb, 0); // total track number put_be16(pb, 0); // empty updateSize(pb, pos); } size = updateSize(pb, pos); } return size;}/* iTunes meta data list */static int mov_write_ilst_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "ilst"); mov_write_nam_tag(pb, mov, s); mov_write_ART_tag(pb, mov, s); mov_write_wrt_tag(pb, mov, s); mov_write_alb_tag(pb, mov, s); mov_write_day_tag(pb, mov, s); mov_write_too_tag(pb, mov, s); mov_write_cmt_tag(pb, mov, s); mov_write_gen_tag(pb, mov, s); mov_write_trkn_tag(pb, mov, s); return updateSize(pb, pos);}/* iTunes meta data tag */static int mov_write_meta_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int size = 0; // only save meta tag if required if ( s->title[0] || s->author[0] || s->album[0] || s->year || s->comment[0] || s->genre[0] || s->track ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "meta"); put_be32(pb, 0); mov_write_itunes_hdlr_tag(pb, mov, s); mov_write_ilst_tag(pb, mov, s); size = updateSize(pb, pos); } return size;} static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov, AVFormatContext *s){ int pos = url_ftell(pb); int i; put_be32(pb, 0); /* size */ put_tag(pb, "udta"); /* iTunes meta data */ mov_write_meta_tag(pb, mov, s); /* Requirements */ for (i=0; i<MAX_STREAMS; i++) { if(mov->tracks[i].entry <= 0) continue; if (mov->tracks[i].enc->codec_id == CODEC_ID_AAC || mov->tracks[i].enc->codec_id == CODEC_ID_MPEG4) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251req"); put_be16(pb, sizeof("QuickTime 6.0 or greater") - 1); put_be16(pb, 0); put_buffer(pb, "QuickTime 6.0 or greater", sizeof("QuickTime 6.0 or greater") - 1); updateSize(pb, pos); break; } } /* Encoder */ if(mov->tracks[0].enc && !(mov->tracks[0].enc->flags & CODEC_FLAG_BITEXACT)) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251enc"); put_be16(pb, sizeof(LIBAVFORMAT_IDENT) - 1); /* string length */ put_be16(pb, 0); put_buffer(pb, LIBAVFORMAT_IDENT, sizeof(LIBAVFORMAT_IDENT) - 1); updateSize(pb, pos); } if( s->title[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251nam"); put_be16(pb, strlen(s->title)); /* string length */ put_be16(pb, 0); put_buffer(pb, s->title, strlen(s->title)); updateSize(pb, pos); } if( s->author[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, /*"\251aut"*/ "\251day" ); put_be16(pb, strlen(s->author)); /* string length */ put_be16(pb, 0); put_buffer(pb, s->author, strlen(s->author)); updateSize(pb, pos); } if( s->comment[0] ) { int pos = url_ftell(pb); put_be32(pb, 0); /* size */ put_tag(pb, "\251des"); put_be16(pb, strlen(s->comment)); /* string length */ put_be16(pb, 0); put_buffer(pb, s->comment, strlen(s->comment)); updateSize(pb, pos); } return updateSize(pb, pos);}static int mov_write_moov_tag(ByteIOContext *pb, MOVContext *mov, AVFormatContext *s){ int pos, i; pos = url_ftell(pb); put_be32(pb, 0); /* size placeholder*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -