comparison movenc.c @ 2588:577c8b1dafcc libavformat

DNxHD (SMPTE VC-3) encoder
author bcoudurier
date Mon, 08 Oct 2007 11:27:18 +0000
parents 015aa98f3f12
children ccb37555090a
comparison
equal deleted inserted replaced
2587:d751acab2622 2588:577c8b1dafcc
514 } 514 }
515 } 515 }
516 return updateSize(pb, pos); 516 return updateSize(pb, pos);
517 } 517 }
518 518
519 /* also used by all avid codecs (dv, imx, meridien) and their variants */
520 static int mov_write_avid_tag(ByteIOContext *pb, MOVTrack *track)
521 {
522 int i;
523 put_be32(pb, 24); /* size */
524 put_tag(pb, "ACLR");
525 put_tag(pb, "ACLR");
526 put_tag(pb, "0001");
527 put_be32(pb, 1); /* yuv 1 / rgb 2 ? */
528 put_be32(pb, 0); /* unknown */
529
530 put_be32(pb, 24); /* size */
531 put_tag(pb, "APRG");
532 put_tag(pb, "APRG");
533 put_tag(pb, "0001");
534 put_be32(pb, 1); /* unknown */
535 put_be32(pb, 0); /* unknown */
536
537 put_be32(pb, 120); /* size */
538 put_tag(pb, "ARES");
539 put_tag(pb, "ARES");
540 put_tag(pb, "0001");
541 put_be32(pb, AV_RB32(track->vosData + 0x28)); /* dnxhd cid, some id ? */
542 put_be32(pb, track->enc->width);
543 /* values below are based on samples created with quicktime and avid codecs */
544 if (track->vosData[5] & 2) { // interlaced
545 put_be32(pb, track->enc->height/2);
546 put_be32(pb, 2); /* unknown */
547 put_be32(pb, 0); /* unknown */
548 put_be32(pb, 4); /* unknown */
549 } else {
550 put_be32(pb, track->enc->height);
551 put_be32(pb, 1); /* unknown */
552 put_be32(pb, 0); /* unknown */
553 put_be32(pb, 5); /* unknown */
554 }
555 /* padding */
556 for (i = 0; i < 10; i++)
557 put_be64(pb, 0);
558
559 /* extra padding for stsd needed */
560 put_be32(pb, 0);
561 return 0;
562 }
563
519 static int mov_find_video_codec_tag(AVFormatContext *s, MOVTrack *track) 564 static int mov_find_video_codec_tag(AVFormatContext *s, MOVTrack *track)
520 { 565 {
521 int tag = track->enc->codec_tag; 566 int tag = track->enc->codec_tag;
522 if (!tag) { 567 if (!tag) {
523 if (track->enc->codec_id == CODEC_ID_DVVIDEO) { 568 if (track->enc->codec_id == CODEC_ID_DVVIDEO) {
621 mov_write_d263_tag(pb); 666 mov_write_d263_tag(pb);
622 else if(track->enc->codec_id == CODEC_ID_SVQ3) 667 else if(track->enc->codec_id == CODEC_ID_SVQ3)
623 mov_write_svq3_tag(pb); 668 mov_write_svq3_tag(pb);
624 else if(track->enc->codec_id == CODEC_ID_H264) 669 else if(track->enc->codec_id == CODEC_ID_H264)
625 mov_write_avcc_tag(pb, track); 670 mov_write_avcc_tag(pb, track);
671 else if(track->enc->codec_id == CODEC_ID_DNXHD)
672 mov_write_avid_tag(pb, track);
626 673
627 return updateSize (pb, pos); 674 return updateSize (pb, pos);
628 } 675 }
629 676
630 static int mov_write_stsd_tag(ByteIOContext *pb, MOVTrack* track) 677 static int mov_write_stsd_tag(ByteIOContext *pb, MOVTrack* track)
1559 /* from x264 or from bytestream h264 */ 1606 /* from x264 or from bytestream h264 */
1560 /* nal reformating needed */ 1607 /* nal reformating needed */
1561 avc_parse_nal_units(&pkt->data, &pkt->size); 1608 avc_parse_nal_units(&pkt->data, &pkt->size);
1562 assert(pkt->size); 1609 assert(pkt->size);
1563 size = pkt->size; 1610 size = pkt->size;
1611 } else if (enc->codec_id == CODEC_ID_DNXHD && !trk->vosLen) {
1612 /* copy frame header to create needed atoms */
1613 if (size < 640)
1614 return -1;
1615 trk->vosLen = 640;
1616 trk->vosData = av_malloc(trk->vosLen);
1617 memcpy(trk->vosData, pkt->data, 640);
1564 } 1618 }
1565 1619
1566 if (!(trk->entry % MOV_INDEX_CLUSTER_SIZE)) { 1620 if (!(trk->entry % MOV_INDEX_CLUSTER_SIZE)) {
1567 trk->cluster = av_realloc(trk->cluster, (trk->entry + MOV_INDEX_CLUSTER_SIZE) * sizeof(*trk->cluster)); 1621 trk->cluster = av_realloc(trk->cluster, (trk->entry + MOV_INDEX_CLUSTER_SIZE) * sizeof(*trk->cluster));
1568 if (!trk->cluster) 1622 if (!trk->cluster)