322
334
return updateSize (pb, pos);
325
static const AVCodecTag codec_movaudio_tags[] = {
326
{ CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') },
327
{ CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') },
328
{ CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') },
329
{ CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') },
330
{ CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') },
331
{ CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') },
332
{ CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') },
333
{ CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') },
334
{ CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') },
335
{ CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') },
336
{ CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') },
337
{ CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') },
338
{ CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') },
339
{ CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') },
340
{ CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') },
341
{ CODEC_ID_NONE, 0 },
337
static int mov_write_glbl_tag(ByteIOContext *pb, MOVTrack* track)
339
put_be32(pb, track->vosLen+8);
341
put_buffer(pb, track->vosData, track->vosLen);
342
return 8+track->vosLen;
344
345
static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack* track)
418
static uint8_t *avc_find_startcode( uint8_t *p, uint8_t *end )
420
uint8_t *a = p + 4 - ((int)p & 3);
422
for( end -= 3; p < a && p < end; p++ ) {
423
if( p[0] == 0 && p[1] == 0 && p[2] == 1 )
427
for( end -= 3; p < end; p += 4 ) {
428
uint32_t x = *(uint32_t*)p;
429
// if( (x - 0x01000100) & (~x) & 0x80008000 ) // little endian
430
// if( (x - 0x00010001) & (~x) & 0x00800080 ) // big endian
431
if( (x - 0x01010101) & (~x) & 0x80808080 ) { // generic
433
if( p[0] == 0 && p[2] == 1 )
435
if( p[2] == 0 && p[3] == 1 )
439
if( p[2] == 0 && p[4] == 1 )
441
if( p[4] == 0 && p[5] == 1 )
447
for( end += 3; p < end; p++ ) {
448
if( p[0] == 0 && p[1] == 0 && p[2] == 1 )
455
static void avc_parse_nal_units(uint8_t **buf, int *size)
459
uint8_t *end = p + *size;
460
uint8_t *nal_start, *nal_end;
462
url_open_dyn_buf(&pb);
463
nal_start = avc_find_startcode(p, end);
464
while (nal_start < end) {
465
while(!*(nal_start++));
466
nal_end = avc_find_startcode(nal_start, end);
467
put_be32(&pb, nal_end - nal_start);
468
put_buffer(&pb, nal_start, nal_end - nal_start);
472
*size = url_close_dyn_buf(&pb, buf);
475
431
static int mov_write_avcc_tag(ByteIOContext *pb, MOVTrack *track)
477
433
offset_t pos = url_ftell(pb);
480
436
put_tag(pb, "avcC");
481
if (track->vosLen > 6) {
482
/* check for h264 start code */
483
if (AV_RB32(track->vosData) == 0x00000001) {
485
uint32_t sps_size=0, pps_size=0;
486
uint8_t *sps=0, *pps=0;
488
avc_parse_nal_units(&track->vosData, &track->vosLen);
489
buf = track->vosData;
490
end = track->vosData + track->vosLen;
492
/* look for sps and pps */
497
nal_type = buf[4] & 0x1f;
498
if (nal_type == 7) { /* SPS */
501
} else if (nal_type == 8) { /* PPS */
510
put_byte(pb, 1); /* version */
511
put_byte(pb, sps[1]); /* profile */
512
put_byte(pb, sps[2]); /* profile compat */
513
put_byte(pb, sps[3]); /* level */
514
put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */
515
put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */
517
put_be16(pb, sps_size);
518
put_buffer(pb, sps, sps_size);
519
put_byte(pb, 1); /* number of pps */
520
put_be16(pb, pps_size);
521
put_buffer(pb, pps, pps_size);
523
put_buffer(pb, track->vosData, track->vosLen);
437
ff_isom_write_avcc(pb, track->vosData, track->vosLen);
438
return updateSize(pb, pos);
441
/* also used by all avid codecs (dv, imx, meridien) and their variants */
442
static int mov_write_avid_tag(ByteIOContext *pb, MOVTrack *track)
445
put_be32(pb, 24); /* size */
449
put_be32(pb, 1); /* yuv 1 / rgb 2 ? */
450
put_be32(pb, 0); /* unknown */
452
put_be32(pb, 24); /* size */
456
put_be32(pb, 1); /* unknown */
457
put_be32(pb, 0); /* unknown */
459
put_be32(pb, 120); /* size */
463
put_be32(pb, AV_RB32(track->vosData + 0x28)); /* dnxhd cid, some id ? */
464
put_be32(pb, track->enc->width);
465
/* values below are based on samples created with quicktime and avid codecs */
466
if (track->vosData[5] & 2) { // interlaced
467
put_be32(pb, track->enc->height/2);
468
put_be32(pb, 2); /* unknown */
469
put_be32(pb, 0); /* unknown */
470
put_be32(pb, 4); /* unknown */
472
put_be32(pb, track->enc->height);
473
put_be32(pb, 1); /* unknown */
474
put_be32(pb, 0); /* unknown */
475
if (track->enc->height == 1080)
476
put_be32(pb, 5); /* unknown */
478
put_be32(pb, 6); /* unknown */
526
return updateSize(pb, pos);
481
for (i = 0; i < 10; i++)
484
/* extra padding for stsd needed */
529
static const AVCodecTag codec_movvideo_tags[] = {
530
{ CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') },
531
{ CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') },
532
{ CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
533
{ CODEC_ID_H263, MKTAG('h', '2', '6', '3') },
534
{ CODEC_ID_H263, MKTAG('s', '2', '6', '3') },
535
{ CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
536
/* special handling in mov_find_video_codec_tag */
537
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, /* DV NTSC */
538
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') }, /* DV PAL */
539
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'p', 'p') }, /* DVCPRO PAL */
540
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'n') }, /* DVCPRO50 NTSC */
541
{ CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'p') }, /* DVCPRO50 PAL */
542
{ CODEC_ID_NONE, 0 },
545
static int mov_find_video_codec_tag(AVFormatContext *s, MOVTrack *track)
489
static const AVCodecTag codec_3gp_tags[] = {
490
{ CODEC_ID_H263, MKTAG('s','2','6','3') },
491
{ CODEC_ID_H264, MKTAG('a','v','c','1') },
492
{ CODEC_ID_MPEG4, MKTAG('m','p','4','v') },
493
{ CODEC_ID_AAC, MKTAG('m','p','4','a') },
494
{ CODEC_ID_AMR_NB, MKTAG('s','a','m','r') },
495
{ CODEC_ID_AMR_WB, MKTAG('s','a','w','b') },
498
static const AVCodecTag mov_pix_fmt_tags[] = {
499
{ PIX_FMT_YUYV422, MKTAG('y','u','v','s') },
500
{ PIX_FMT_UYVY422, MKTAG('2','v','u','y') },
501
{ PIX_FMT_BGR555, MKTAG('r','a','w',' ') },
502
{ PIX_FMT_RGB24, MKTAG('r','a','w',' ') },
503
{ PIX_FMT_BGR32_1, MKTAG('r','a','w',' ') },
506
static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
547
508
int tag = track->enc->codec_tag;
509
if (track->mode == MODE_MP4 || track->mode == MODE_PSP || track->mode == MODE_IPOD) {
510
if (!codec_get_tag(ff_mp4_obj_type, track->enc->codec_id))
512
if (track->enc->codec_id == CODEC_ID_H264) tag = MKTAG('a','v','c','1');
513
else if (track->enc->codec_type == CODEC_TYPE_VIDEO) tag = MKTAG('m','p','4','v');
514
else if (track->enc->codec_type == CODEC_TYPE_AUDIO) tag = MKTAG('m','p','4','a');
515
} else if (track->mode == MODE_3GP || track->mode == MODE_3G2) {
516
tag = codec_get_tag(codec_3gp_tags, track->enc->codec_id);
517
} else if (!tag || (track->enc->strict_std_compliance >= FF_COMPLIANCE_NORMAL &&
518
(tag == MKTAG('d','v','c','p') ||
519
track->enc->codec_id == CODEC_ID_RAWVIDEO))) {
549
520
if (track->enc->codec_id == CODEC_ID_DVVIDEO) {
550
if (track->enc->height == 480) { /* NTSC */
551
if (track->enc->pix_fmt == PIX_FMT_YUV422P)
552
tag = MKTAG('d', 'v', '5', 'n');
554
tag = MKTAG('d', 'v', 'c', ' ');
555
} else { /* assume PAL */
556
if (track->enc->pix_fmt == PIX_FMT_YUV422P)
557
tag = MKTAG('d', 'v', '5', 'p');
558
else if (track->enc->pix_fmt == PIX_FMT_YUV420P)
559
tag = MKTAG('d', 'v', 'c', 'p');
561
tag = MKTAG('d', 'v', 'p', 'p');
521
if (track->enc->height == 480) /* NTSC */
522
if (track->enc->pix_fmt == PIX_FMT_YUV422P) tag = MKTAG('d','v','5','n');
523
else tag = MKTAG('d','v','c',' ');
524
else if (track->enc->pix_fmt == PIX_FMT_YUV422P) tag = MKTAG('d','v','5','p');
525
else if (track->enc->pix_fmt == PIX_FMT_YUV420P) tag = MKTAG('d','v','c','p');
526
else tag = MKTAG('d','v','p','p');
527
} else if (track->enc->codec_id == CODEC_ID_RAWVIDEO) {
528
tag = codec_get_tag(mov_pix_fmt_tags, track->enc->pix_fmt);
529
if (!tag) // restore tag
530
tag = track->enc->codec_tag;
532
if (track->enc->codec_type == CODEC_TYPE_VIDEO) {
533
tag = codec_get_tag(codec_movvideo_tags, track->enc->codec_id);
534
if (!tag) { // if no mac fcc found, try with Microsoft tags
535
tag = codec_get_tag(codec_bmp_tags, track->enc->codec_id);
537
av_log(s, AV_LOG_INFO, "Warning, using MS style video codec tag, "
538
"the file may be unplayable!\n");
540
} else if (track->enc->codec_type == CODEC_TYPE_AUDIO) {
541
tag = codec_get_tag(codec_movaudio_tags, track->enc->codec_id);
542
if (!tag) { // if no mac fcc found, try with Microsoft tags
543
int ms_tag = codec_get_tag(codec_wav_tags, track->enc->codec_id);
545
tag = MKTAG('m', 's', ((ms_tag >> 8) & 0xff), (ms_tag & 0xff));
546
av_log(s, AV_LOG_INFO, "Warning, using MS style audio codec tag, "
547
"the file may be unplayable!\n");
563
} else if (track->enc->codec_id == CODEC_ID_H263) {
564
if (track->mode == MODE_MOV)
565
tag = MKTAG('h', '2', '6', '3');
567
tag = MKTAG('s', '2', '6', '3');
569
tag = codec_get_tag(codec_movvideo_tags, track->enc->codec_id);
572
// if no mac fcc found, try with Microsoft tags
574
tag = codec_get_tag(codec_bmp_tags, track->enc->codec_id);
576
av_log(s, AV_LOG_INFO, "Warning, using MS style video codec tag, the file may be unplayable!\n");
583
static int mov_find_audio_codec_tag(AVFormatContext *s, MOVTrack *track)
557
* Needed to make file play in iPods running newest firmware
558
* goes after avcC atom in moov.trak.mdia.minf.stbl.stsd.avc1
560
static int mov_write_uuid_tag_ipod(ByteIOContext *pb)
585
int tag = track->enc->codec_tag;
587
tag = codec_get_tag(codec_movaudio_tags, track->enc->codec_id);
589
// if no mac fcc found, try with Microsoft tags
591
int ms_tag = codec_get_tag(codec_wav_tags, track->enc->codec_id);
593
tag = MKTAG('m', 's', ((ms_tag >> 8) & 0xff), (ms_tag & 0xff));
594
av_log(s, AV_LOG_INFO, "Warning, using MS style audio codec tag, the file may be unplayable!\n");
564
put_be32(pb, 0x6b6840f2);
565
put_be32(pb, 0x5f244fc5);
566
put_be32(pb, 0xba39a51b);
567
put_be32(pb, 0xcf0323f3);
601
572
static int mov_write_video_tag(ByteIOContext *pb, MOVTrack* track)
1191
1179
static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov,
1192
1180
AVFormatContext *s)
1194
offset_t pos = url_ftell(pb);
1197
put_be32(pb, 0); /* size */
1198
put_tag(pb, "udta");
1200
/* iTunes meta data */
1201
mov_write_meta_tag(pb, mov, s);
1203
if(mov->mode == MODE_MOV){ // the title field breaks gtkpod with mp4 and my suspicion is that stuff isnt valid in mp4
1204
1184
/* Requirements */
1205
1185
for (i=0; i<mov->nb_streams; i++) {
1206
1186
if(mov->tracks[i].entry <= 0) continue;
1207
1187
if (mov->tracks[i].enc->codec_id == CODEC_ID_AAC ||
1208
1188
mov->tracks[i].enc->codec_id == CODEC_ID_MPEG4) {
1209
mov_write_string_tag(pb, "\251req", "QuickTime 6.0 or greater", 0);
1214
mov_write_string_tag(pb, "\251nam", s->title , 0);
1215
mov_write_string_tag(pb, "\251aut", s->author , 0);
1216
mov_write_string_tag(pb, "\251alb", s->album , 0);
1217
mov_write_day_tag(pb, s->year, 0);
1218
if(mov->tracks[0].enc && !(mov->tracks[0].enc->flags & CODEC_FLAG_BITEXACT))
1219
mov_write_string_tag(pb, "\251enc", LIBAVFORMAT_IDENT, 0);
1220
mov_write_string_tag(pb, "\251des", s->comment , 0);
1221
mov_write_string_tag(pb, "\251gen", s->genre , 0);
1224
return updateSize(pb, pos);
1194
if (s->title[0] || s->author[0] || s->album[0] || s->year ||
1195
s->comment[0] || s->genre[0] || s->track ||
1196
(mov->mode == MODE_MOV &&
1197
((mov->tracks[0].enc && !mov->tracks[0].enc->flags & CODEC_FLAG_BITEXACT) || req))) {
1198
offset_t pos = url_ftell(pb);
1200
put_be32(pb, 0); /* size */
1201
put_tag(pb, "udta");
1203
/* iTunes meta data */
1204
mov_write_meta_tag(pb, mov, s);
1206
if(mov->mode == MODE_MOV){ // the title field breaks gtkpod with mp4 and my suspicion is that stuff is not valid in mp4
1209
mov_write_string_tag(pb, "\251req", "QuickTime 6.0 or greater", 0);
1211
mov_write_string_tag(pb, "\251nam", s->title , 0);
1212
mov_write_string_tag(pb, "\251aut", s->author , 0);
1213
mov_write_string_tag(pb, "\251alb", s->album , 0);
1214
mov_write_day_tag(pb, s->year, 0);
1215
if(mov->tracks[0].enc && !(mov->tracks[0].enc->flags & CODEC_FLAG_BITEXACT))
1216
mov_write_string_tag(pb, "\251enc", LIBAVFORMAT_IDENT, 0);
1217
mov_write_string_tag(pb, "\251des", s->comment , 0);
1218
mov_write_string_tag(pb, "\251gen", s->genre , 0);
1221
return updateSize(pb, pos);
1227
static int utf8len(uint8_t *b){
1227
static int utf8len(const uint8_t *b){
1413
1413
int audio_kbitrate= AudioCodec->bit_rate / 1000;
1414
1414
int video_kbitrate= FFMIN(VideoCodec->bit_rate / 1000, 800 - audio_kbitrate);
1416
put_be32(pb, 0x94 ); /* size */
1416
put_be32(pb, 0x94); /* size */
1417
1417
put_tag(pb, "uuid");
1418
1418
put_tag(pb, "PROF");
1420
put_be32(pb, 0x21d24fce ); /* 96 bit UUID */
1421
put_be32(pb, 0xbb88695c );
1422
put_be32(pb, 0xfac9c740 );
1424
put_be32(pb, 0x0 ); /* ? */
1425
put_be32(pb, 0x3 ); /* 3 sections ? */
1427
put_be32(pb, 0x14 ); /* size */
1420
put_be32(pb, 0x21d24fce); /* 96 bit UUID */
1421
put_be32(pb, 0xbb88695c);
1422
put_be32(pb, 0xfac9c740);
1424
put_be32(pb, 0x0); /* ? */
1425
put_be32(pb, 0x3); /* 3 sections ? */
1427
put_be32(pb, 0x14); /* size */
1428
1428
put_tag(pb, "FPRF");
1429
put_be32(pb, 0x0 ); /* ? */
1430
put_be32(pb, 0x0 ); /* ? */
1431
put_be32(pb, 0x0 ); /* ? */
1429
put_be32(pb, 0x0); /* ? */
1430
put_be32(pb, 0x0); /* ? */
1431
put_be32(pb, 0x0); /* ? */
1433
put_be32(pb, 0x2c ); /* size */
1433
put_be32(pb, 0x2c); /* size */
1434
1434
put_tag(pb, "APRF"); /* audio */
1436
put_be32(pb, 0x2 ); /* TrackID */
1436
put_be32(pb, 0x2); /* TrackID */
1437
1437
put_tag(pb, "mp4a");
1438
put_be32(pb, 0x20f );
1440
put_be32(pb, audio_kbitrate);
1441
put_be32(pb, audio_kbitrate);
1442
put_be32(pb, AudioRate );
1443
put_be32(pb, AudioCodec->channels );
1438
put_be32(pb, 0x20f);
1440
put_be32(pb, audio_kbitrate);
1441
put_be32(pb, audio_kbitrate);
1442
put_be32(pb, AudioRate);
1443
put_be32(pb, AudioCodec->channels);
1445
put_be32(pb, 0x34 ); /* size */
1445
put_be32(pb, 0x34); /* size */
1446
1446
put_tag(pb, "VPRF"); /* video */
1448
put_be32(pb, 0x1 ); /* TrackID */
1448
put_be32(pb, 0x1); /* TrackID */
1449
1449
if (VideoCodec->codec_id == CODEC_ID_H264) {
1450
1450
put_tag(pb, "avc1");
1451
put_be16(pb, 0x014D );
1452
put_be16(pb, 0x0015 );
1451
put_be16(pb, 0x014D);
1452
put_be16(pb, 0x0015);
1454
1454
put_tag(pb, "mp4v");
1455
put_be16(pb, 0x0000 );
1456
put_be16(pb, 0x0103 );
1455
put_be16(pb, 0x0000);
1456
put_be16(pb, 0x0103);
1459
1459
put_be32(pb, video_kbitrate);
1460
1460
put_be32(pb, video_kbitrate);
1461
1461
put_be32(pb, FrameRate);